diff --git a/.travis.yml b/.travis.yml index f469d33..af6417c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -491,7 +491,7 @@ matrix: - os: osx env: TOOLSET=clang COMPILER=clang++ CXXSTD=c++1z - osx_image: xcode8.1 + osx_image: xcode8.2 - os: osx env: TOOLSET=clang COMPILER=clang++ CXXSTD=c++03 @@ -584,7 +584,7 @@ script: - |- echo "using $TOOLSET : : $COMPILER : -std=$CXXSTD ;" > ~/user-config.jam - (cd libs/config/test && ../../../b2 config_info_travis_install toolset=$TOOLSET && ./config_info_travis) - - ./b2 -j3 libs/type_traits/test toolset=$TOOLSET + - ./b2 -j3 libs/type_traits/test toolset=$TOOLSET define=CI_SUPPRESS_KNOWN_ISSUES notifications: email: diff --git a/doc/is_list_constructible.qbk b/doc/is_list_constructible.qbk new file mode 100644 index 0000000..733d2e8 --- /dev/null +++ b/doc/is_list_constructible.qbk @@ -0,0 +1,23 @@ +[/ + Copyright 2017 Peter Dimov + + Distributed under the Boost Software License, Version 1.0. + + (See accompanying file LICENSE_1_0.txt or copy at + http://www.boost.org/LICENSE_1_0.txt). +] + +[section:is_list_constructible is_list_constructible] + + template + struct is_list_constructible : public __tof {}; + +__inherit If `T` can be constructed from `Args` using list initialization +(`T{declval()...}`), then inherits from __true_type, otherwise inherits from +__false_type. `T` must be a complete type. + +__compat This trait requires C++11. + +__header ` #include ` or ` #include ` + +[endsect] diff --git a/doc/is_nothrow_swappable.qbk b/doc/is_nothrow_swappable.qbk new file mode 100644 index 0000000..8e5886e --- /dev/null +++ b/doc/is_nothrow_swappable.qbk @@ -0,0 +1,23 @@ +[/ + Copyright 2017 Peter Dimov + + Distributed under the Boost Software License, Version 1.0. + + (See accompanying file LICENSE_1_0.txt or copy at + http://www.boost.org/LICENSE_1_0.txt). +] + +[section:is_nothrow_swappable is_nothrow_swappable] + + template + struct is_nothrow_swappable : public __tof {}; + +__inherit If the expression `swap(declval(), declval())` (in a context +where `std::swap` is visible) is valid and non-throwing, inherits from +__true_type, otherwise from __false_type. + +__compat This trait requires C++11. + +__header ` #include ` or ` #include ` + +[endsect] diff --git a/doc/type_traits.qbk b/doc/type_traits.qbk index 1a1fa5b..9bd3d31 100644 --- a/doc/type_traits.qbk +++ b/doc/type_traits.qbk @@ -72,6 +72,7 @@ [def __is_copy_constructible [link boost_typetraits.reference.is_copy_constructible is_copy_constructible]] [def __is_copy_assignable [link boost_typetraits.reference.is_copy_assignable is_copy_assignable]] [def __is_constructible [link boost_typetraits.reference.is_constructible is_constructible]] +[def __is_list_constructible [link boost_typetraits.reference.is_list_constructible is_list_constructible]] [def __is_default_constructible [link boost_typetraits.reference.is_default_constructible is_default_constructible]] [def __is_destructible [link boost_typetraits.reference.is_destructible is_destructible]] [def __is_volatile [link boost_typetraits.reference.is_volatile is_volatile]] @@ -100,6 +101,7 @@ [def __is_nothrow_move_constructible [link boost_typetraits.reference.is_nothrow_move_constructible is_nothrow_move_constructible]] [def __has_nothrow_assign [link boost_typetraits.reference.has_nothrow_assign has_nothrow_assign]] [def __is_nothrow_move_assignable [link boost_typetraits.reference.is_nothrow_move_assignable is_nothrow_move_assignable]] +[def __is_nothrow_swappable [link boost_typetraits.reference.is_nothrow_swappable is_nothrow_swappable]] [def __is_base_of [link boost_typetraits.reference.is_base_of is_base_of]] [def __is_virtual_base_of [link boost_typetraits.reference.is_virtual_base_of is_virtual_base_of]] @@ -294,12 +296,14 @@ See __has_trivial_constructor. [include is_function.qbk] [include is_fundamental.qbk] [include is_integral.qbk] +[include is_list_constructible.qbk] [include is_lvalue_reference.qbk] [include is_member_function_pointer.qbk] [include is_member_object_pointer.qbk] [include is_member_pointer.qbk] [include is_nothrow_move_assignable.qbk] [include is_nothrow_move_constructible.qbk] +[include is_nothrow_swappable.qbk] [include is_object.qbk] [include is_pod.qbk] [include is_pointer.qbk] diff --git a/doc/value_traits.qbk b/doc/value_traits.qbk index 5f667aa..f8ff399 100644 --- a/doc/value_traits.qbk +++ b/doc/value_traits.qbk @@ -168,6 +168,9 @@ The following templates describe the general properties of a type. template struct __is_default_constructible; + template + struct __is_list_constructible; + template struct __is_destructible; diff --git a/include/boost/type_traits.hpp b/include/boost/type_traits.hpp index dbc8c95..9f024b1 100644 --- a/include/boost/type_traits.hpp +++ b/include/boost/type_traits.hpp @@ -107,12 +107,14 @@ #include #include #include +#include #include #include #include #include #include #include +#include #include #include #include diff --git a/include/boost/type_traits/is_list_constructible.hpp b/include/boost/type_traits/is_list_constructible.hpp new file mode 100644 index 0000000..518a75b --- /dev/null +++ b/include/boost/type_traits/is_list_constructible.hpp @@ -0,0 +1,41 @@ +#ifndef BOOST_TYPE_TRAITS_IS_LIST_CONSTRUCTIBLE_HPP_INCLUDED +#define BOOST_TYPE_TRAITS_IS_LIST_CONSTRUCTIBLE_HPP_INCLUDED + +// Copyright 2017 Peter Dimov +// +// Distributed under the Boost Software License, Version 1.0. +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt + +#include +#include +#include + +namespace boost +{ + +#if defined(BOOST_NO_SFINAE_EXPR) || defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) || defined(BOOST_NO_CXX11_DECLTYPE) || defined(BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX) || defined(BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS) + +template struct is_list_constructible: false_type +{ +}; + +#else + +namespace type_traits_detail +{ + +template()...} )> true_type is_list_constructible_impl( int ); +template false_type is_list_constructible_impl( ... ); + +} // namespace type_traits_detail + +template struct is_list_constructible: decltype( type_traits_detail::is_list_constructible_impl(0) ) +{ +}; + +#endif + +} // namespace boost + +#endif // #ifndef BOOST_TYPE_TRAITS_IS_LIST_CONSTRUCTIBLE_HPP_INCLUDED diff --git a/include/boost/type_traits/is_nothrow_swappable.hpp b/include/boost/type_traits/is_nothrow_swappable.hpp new file mode 100644 index 0000000..b355664 --- /dev/null +++ b/include/boost/type_traits/is_nothrow_swappable.hpp @@ -0,0 +1,47 @@ +#ifndef BOOST_TYPE_TRAITS_IS_NOTHROW_SWAPPABLE_HPP_INCLUDED +#define BOOST_TYPE_TRAITS_IS_NOTHROW_SWAPPABLE_HPP_INCLUDED + +// Copyright 2017 Peter Dimov +// +// Distributed under the Boost Software License, Version 1.0. +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt + +#include + +#if defined(BOOST_NO_SFINAE_EXPR) || defined(BOOST_NO_CXX11_NOEXCEPT) || defined(BOOST_NO_CXX11_DECLTYPE) || defined(BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS) +#else + +#include +#include +#include + +namespace boost +{ + +namespace type_traits_swappable_detail +{ + +using std::swap; + +template(), declval()))> integral_constant is_nothrow_swappable_with_impl( int ); +template false_type is_nothrow_swappable_with_impl( ... ); + +template(), declval()))> integral_constant is_nothrow_swappable_impl( int ); +template false_type is_nothrow_swappable_impl( ... ); + +} // namespace type_traits_swappable_detail + +template struct is_nothrow_swappable_with: decltype( type_traits_swappable_detail::is_nothrow_swappable_with_impl(0) ) +{ +}; + +template struct is_nothrow_swappable: decltype( type_traits_swappable_detail::is_nothrow_swappable_impl(0) ) +{ +}; + +} // namespace boost + +#endif + +#endif // #ifndef BOOST_TYPE_TRAITS_IS_NOTHROW_SWAPPABLE_HPP_INCLUDED diff --git a/test/has_complement_test.cpp b/test/has_complement_test.cpp index f761ac4..394ecca 100644 --- a/test/has_complement_test.cpp +++ b/test/has_complement_test.cpp @@ -3,6 +3,10 @@ // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +#if defined(__GNUC__) && (__GNUC__ >= 7) +#pragma GCC diagnostic ignored "-Wbool-operation" +#endif + #ifdef TEST_STD # include #else diff --git a/test/has_left_shift_test.cpp b/test/has_left_shift_test.cpp index 8dc6979..9339764 100644 --- a/test/has_left_shift_test.cpp +++ b/test/has_left_shift_test.cpp @@ -3,6 +3,10 @@ // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +#if defined(__GNUC__) && (__GNUC__ >= 7) +#pragma GCC diagnostic ignored "-Wint-in-bool-context" +#endif + #ifdef TEST_STD # include #else diff --git a/test/has_multiplies_test.cpp b/test/has_multiplies_test.cpp index a3565eb..7569b3f 100644 --- a/test/has_multiplies_test.cpp +++ b/test/has_multiplies_test.cpp @@ -3,6 +3,10 @@ // Boost Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +#if defined(__GNUC__) && (__GNUC__ >= 7) +#pragma GCC diagnostic ignored "-Wint-in-bool-context" +#endif + #ifdef TEST_STD # include #else diff --git a/test/is_list_constructible_test.cpp b/test/is_list_constructible_test.cpp new file mode 100644 index 0000000..bbf1d59 --- /dev/null +++ b/test/is_list_constructible_test.cpp @@ -0,0 +1,120 @@ + +// Copyright 2017 Peter Dimov +// +// Distributed under the Boost Software License, Version 1.0. +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt + +#if defined( __GNUC__ ) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 407) +#pragma GCC diagnostic ignored "-Wnarrowing" +#pragma GCC diagnostic ignored "-Wmissing-field-initializers" +#endif + +#ifdef TEST_STD +# include +#else +# include +#endif +#include "test.hpp" +#include "check_integral_constant.hpp" + +#if defined(BOOST_NO_SFINAE_EXPR) || defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) || defined(BOOST_NO_CXX11_DECLTYPE) \ + || defined(BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX) || defined(BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS) + +int main() {} + +#else + +#include + +struct X +{ + int a; + int b; +}; + +struct Y +{ + Y( int = 0, int = 0 ); +}; + +struct Z +{ + explicit Z( int = 0, int = 0 ); +}; + +struct V +{ + V( int&, int& ); +}; + +TT_TEST_BEGIN(is_list_constructible) + +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_list_constructible::value), true); +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_list_constructible::value), true); +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_list_constructible::value), true); +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_list_constructible::value), false); +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_list_constructible::value), true); + +#if defined(CI_SUPPRESS_KNOWN_ISSUES) && defined(__GNUC__) && (__GNUC__ == 4) +// g++ 4.x doesn't seem to disallow narrowing +#else +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_list_constructible::value), false); +#endif + +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_list_constructible::value), true); +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_list_constructible::value), true); +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_list_constructible::value), true); +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_list_constructible::value), true); +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_list_constructible::value), true); +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_list_constructible::value), false); + +#if defined(CI_SUPPRESS_KNOWN_ISSUES) && defined(__GNUC__) && (__GNUC__ == 4) +// g++ 4.x doesn't seem to disallow narrowing +#else +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_list_constructible::value), false); +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_list_constructible::value), false); +#endif + +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_list_constructible::value), true); +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_list_constructible::value), true); +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_list_constructible::value), true); +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_list_constructible::value), true); +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_list_constructible::value), true); +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_list_constructible::value), false); + +#if defined(CI_SUPPRESS_KNOWN_ISSUES) && defined(__GNUC__) && (__GNUC__ == 4) +// g++ 4.x doesn't seem to disallow narrowing +#elif defined(CI_SUPPRESS_KNOWN_ISSUES) && defined(__GNUC__) && (__GNUC__ == 7) && (__cplusplus >= 201500) +// g++ 7.1 in -std=c++1z, c++17 has a bug +#else +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_list_constructible::value), false); +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_list_constructible::value), false); +#endif + +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_list_constructible::value), true); +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_list_constructible::value), true); +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_list_constructible::value), true); +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_list_constructible::value), true); +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_list_constructible::value), true); +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_list_constructible::value), false); + +#if defined(CI_SUPPRESS_KNOWN_ISSUES) && defined(__GNUC__) && (__GNUC__ == 4) +// g++ 4.x doesn't seem to disallow narrowing +#elif defined(CI_SUPPRESS_KNOWN_ISSUES) && defined(__GNUC__) && (__GNUC__ == 7) && (__cplusplus >= 201500) +// g++ 7.1 in -std=c++1z, c++17 has a bug +#else +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_list_constructible::value), false); +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_list_constructible::value), false); +#endif + +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_list_constructible::value), false); +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_list_constructible::value), false); +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_list_constructible::value), false); +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_list_constructible::value), false); +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_list_constructible::value), true); +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_list_constructible::value), false); + +TT_TEST_END + +#endif diff --git a/test/is_nothrow_swappable_test.cpp b/test/is_nothrow_swappable_test.cpp new file mode 100644 index 0000000..1377c8a --- /dev/null +++ b/test/is_nothrow_swappable_test.cpp @@ -0,0 +1,125 @@ + +// Copyright 2017 Peter Dimov +// +// Distributed under the Boost Software License, Version 1.0. +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt + +#ifdef TEST_STD +# include +#else +# include +#endif + +#include + +#if defined(BOOST_NO_SFINAE_EXPR) || defined(BOOST_NO_CXX11_NOEXCEPT) || defined(BOOST_NO_CXX11_DECLTYPE) || defined(BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS) \ + || (defined(__GLIBCXX__) && __GLIBCXX__ <= 20120301) // built-in clang++ -std=c++11 on Travis, w/ libstdc++ 4.6 + +int main() +{ +} + +#else + +#include "test.hpp" +#include "check_integral_constant.hpp" +#include + +struct X +{ +}; + +struct Y +{ + Y( Y const& ) {} +}; + +struct Z +{ + Z& operator=( Z const& ) { return *this; } +}; + +struct V +{ + V( V const& ) {} + V& operator=( V const& ) { return *this; } +}; + +void swap( V&, V& ) noexcept {} + +TT_TEST_BEGIN(is_nothrow_swappable) + +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_nothrow_swappable::value, true); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_nothrow_swappable::value, false); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_nothrow_swappable::value, true); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_nothrow_swappable::value, false); + +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_nothrow_swappable::value, true); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_nothrow_swappable::value, false); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_nothrow_swappable::value, true); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_nothrow_swappable::value, false); + +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_nothrow_swappable::value, false); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_nothrow_swappable::value, false); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_nothrow_swappable::value, false); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_nothrow_swappable::value, false); + +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_nothrow_swappable::value, true); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_nothrow_swappable::value, false); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_nothrow_swappable::value, false); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_nothrow_swappable::value, false); + +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_nothrow_swappable::value, true); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_nothrow_swappable::value, false); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_nothrow_swappable::value, false); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_nothrow_swappable::value, false); + +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_nothrow_swappable::value, false); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_nothrow_swappable::value, false); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_nothrow_swappable::value, false); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_nothrow_swappable::value, false); + +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_nothrow_swappable::value, false); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_nothrow_swappable::value, false); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_nothrow_swappable::value, false); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_nothrow_swappable::value, false); + +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_nothrow_swappable::value, false); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_nothrow_swappable::value, false); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_nothrow_swappable::value, false); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_nothrow_swappable::value, false); + +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_nothrow_swappable::value, false); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_nothrow_swappable::value, false); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_nothrow_swappable::value, false); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_nothrow_swappable::value, false); + +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_nothrow_swappable::value, true); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_nothrow_swappable::value, false); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_nothrow_swappable::value, false); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_nothrow_swappable::value, false); + +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_nothrow_swappable::value, true); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_nothrow_swappable::value, false); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_nothrow_swappable::value, false); +BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_nothrow_swappable::value, false); + +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_nothrow_swappable >::value), true); +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_nothrow_swappable const>::value), false); +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_nothrow_swappable volatile>::value), false); +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_nothrow_swappable const volatile>::value), false); + +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_nothrow_swappable >::value), false); +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_nothrow_swappable const>::value), false); +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_nothrow_swappable volatile>::value), false); +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_nothrow_swappable const volatile>::value), false); + +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_nothrow_swappable >::value), true); +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_nothrow_swappable const>::value), false); +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_nothrow_swappable volatile>::value), false); +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_nothrow_swappable const volatile>::value), false); + +TT_TEST_END + +#endif