// (C) Copyright John Maddock 2000. // (C) Copyright Ion Gaztanaga 2014. // Use, modification and distribution are subject to 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) //#define TEST_STD #ifdef TEST_STD # include #else # include #endif #include "test.hpp" #include "check_integral_constant.hpp" #include struct has { has(){} has &operator=(const has&){ return *this; } }; // MSVC can not generate neither default constructor, nor assignment operator, // nor copy constructor for `has2` type. Suppressing those warnings is essential, // because we treat warnings as errors in those tests #if (defined _MSC_VER) # pragma warning( push ) # pragma warning( disable : 4510 4512 4610) #endif struct has2 { int i; has2 &operator=(const int& val) { i = val; return *this; } }; #if (defined _MSC_VER) # pragma warning( pop ) #endif struct has3 { // Copy assignment must be generated by compiler has3(has3*){} }; struct has_not: public boost::noncopyable { typedef boost::noncopyable base_t; has_not() : base_t() {} }; #if defined(BOOST_TT_CXX11_IS_COPY_ASSIGNABLE) struct has_not2 { has_not2() {} has_not2& operator=(has_not2&) = delete; }; struct has_not3 { has_not3() {} has_not3& operator=(const has_not3&) = delete; }; #endif // BOOST_TT_CXX11_IS_COPY_ASSIGNABLE struct has_not4: private boost::noncopyable { typedef boost::noncopyable base_t; has_not4() : base_t() {} private: has_not4& operator=(const has_not4&); }; struct has_not5 { private: BOOST_MOVABLE_BUT_NOT_COPYABLE(has_not5) }; struct has_not6 { has_not6& operator=(has_not6&){ return *this; } }; TT_TEST_BEGIN(is_copy_assignable) // Main part of the test BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, true); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, true); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, true); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, false); #if defined(BOOST_TT_CXX11_IS_COPY_ASSIGNABLE) BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, false); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, false); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, false); #endif BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, false); // Requires some basic support from Boost.Move in C++03 BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, false); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, true); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, false); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, true); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, false); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, true); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, false); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, true); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, false); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, true); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, false); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, true); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, false); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, true); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, false); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, true); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, false); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, true); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, false); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, true); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, false); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, true); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, false); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, true); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, false); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, true); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, false); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, true); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, false); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, true); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, false); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, true); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, false); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, true); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, false); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, true); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, false); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, true); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, false); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, true); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, false); #ifdef BOOST_HAS_LONG_LONG BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable< ::boost::ulong_long_type>::value, true); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable< ::boost::ulong_long_type const>::value, false); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable< ::boost::long_long_type>::value, true); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable< ::boost::long_long_type const>::value, false); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable< ::boost::ulong_long_type volatile>::value, true); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable< ::boost::ulong_long_type const volatile>::value, false); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable< ::boost::long_long_type volatile>::value, true); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable< ::boost::long_long_type const volatile>::value, false); #endif BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, true); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, false); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, true); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, false); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, true); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, false); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, true); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, false); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, true); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, false); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, true); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, false); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, true); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, true); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, false); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, true); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, true); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, true); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, true); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, true); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, true); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, true); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, true); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, true); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, true); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, false); #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, true); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, false); #endif // Following three tests may give different results because of compiler and C++03/C++11. // On C++11 compiler following code: // int c[2][4][5][6][3]; // int b[2][4][5][6][3] = std::move(c); // does not compile, so we expect `false` to be the result of those three tests. BOOST_CHECK_SOFT_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, false, true); BOOST_CHECK_SOFT_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, false, true); BOOST_CHECK_SOFT_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, false, true); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, true); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, false); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, true); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, true); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, true); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, true); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, true); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, true); BOOST_CHECK_INTEGRAL_CONSTANT(::tt::is_copy_assignable::value, true); TT_TEST_END