1 // Copyright (C) 2014 Andrzej Krzemienski.
3 // Use, modification, and distribution is subject to the Boost Software
4 // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
5 // http://www.boost.org/LICENSE_1_0.txt)
7 // See http://www.boost.org/lib/optional for documentation.
9 // You are welcome to contact the author at:
12 #include "boost/static_assert.hpp"
13 #include "boost/optional/optional.hpp"
20 using boost::optional
;
23 #ifndef BOOST_OPTIONAL_DETAIL_NO_RVALUE_REFERENCES
24 #ifndef BOOST_NO_CXX11_NOEXCEPT
26 // these 4 classes have different noexcept signatures in move operations
28 NothrowBoth(NothrowBoth
&&) BOOST_NOEXCEPT_IF(true) {};
29 void operator=(NothrowBoth
&&) BOOST_NOEXCEPT_IF(true) {};
32 NothrowCtor(NothrowCtor
&&) BOOST_NOEXCEPT_IF(true) {};
33 void operator=(NothrowCtor
&&) BOOST_NOEXCEPT_IF(false) {};
35 struct NothrowAssign
{
36 NothrowAssign(NothrowAssign
&&) BOOST_NOEXCEPT_IF(false) {};
37 void operator=(NothrowAssign
&&) BOOST_NOEXCEPT_IF(true) {};
40 NothrowNone(NothrowNone
&&) BOOST_NOEXCEPT_IF(false) {};
41 void operator=(NothrowNone
&&) BOOST_NOEXCEPT_IF(false) {};
44 #if 0 // these also test type_traits, which are wrong
45 void test_noexcept_as_defined() // this is a compile-time test
47 BOOST_STATIC_ASSERT(::boost::is_nothrow_move_constructible
<NothrowBoth
>::value
);
48 BOOST_STATIC_ASSERT(::boost::is_nothrow_move_assignable
<NothrowBoth
>::value
);
50 BOOST_STATIC_ASSERT(::boost::is_nothrow_move_constructible
<NothrowCtor
>::value
);
51 BOOST_STATIC_ASSERT(!::boost::is_nothrow_move_assignable
<NothrowCtor
>::value
);
53 BOOST_STATIC_ASSERT(!::boost::is_nothrow_move_constructible
<NothrowAssign
>::value
);
54 BOOST_STATIC_ASSERT(::boost::is_nothrow_move_assignable
<NothrowAssign
>::value
);
56 BOOST_STATIC_ASSERT(!::boost::is_nothrow_move_constructible
<NothrowNone
>::value
);
57 BOOST_STATIC_ASSERT(!::boost::is_nothrow_move_assignable
<NothrowNone
>::value
);
60 void test_noexcept_on_optional_with_type_traits() // this is a compile-time test
62 BOOST_STATIC_ASSERT(::boost::is_nothrow_move_constructible
<optional
<NothrowBoth
> >::value
);
63 BOOST_STATIC_ASSERT(::boost::is_nothrow_move_assignable
<optional
<NothrowBoth
> >::value
);
64 BOOST_STATIC_ASSERT(BOOST_NOEXCEPT_EXPR(optional
<NothrowBoth
>()));
66 BOOST_STATIC_ASSERT(::boost::is_nothrow_move_constructible
<optional
<NothrowCtor
> >::value
);
67 BOOST_STATIC_ASSERT(!::boost::is_nothrow_move_assignable
<optional
<NothrowCtor
> >::value
);
68 BOOST_STATIC_ASSERT(BOOST_NOEXCEPT_EXPR(optional
<NothrowCtor
>()));
70 BOOST_STATIC_ASSERT(!::boost::is_nothrow_move_constructible
<optional
<NothrowAssign
> >::value
);
71 BOOST_STATIC_ASSERT(!::boost::is_nothrow_move_assignable
<optional
<NothrowAssign
> >::value
);
72 BOOST_STATIC_ASSERT(BOOST_NOEXCEPT_EXPR(optional
<NothrowAssign
>()));
74 BOOST_STATIC_ASSERT(!::boost::is_nothrow_move_constructible
<optional
<NothrowNone
> >::value
);
75 BOOST_STATIC_ASSERT(!::boost::is_nothrow_move_assignable
<optional
<NothrowNone
> >::value
);
76 BOOST_STATIC_ASSERT(BOOST_NOEXCEPT_EXPR(optional
<NothrowNone
>()));
80 void test_noexcept_optional_with_operator() // compile-time test
82 typedef optional
<NothrowBoth
> ONx2
;
83 typedef optional
<NothrowCtor
> ONxC
;
84 typedef optional
<NothrowAssign
> ONxA
;
85 typedef optional
<NothrowNone
> ONx0
;
91 BOOST_STATIC_ASSERT( BOOST_NOEXCEPT_EXPR( ONx2() ));
92 BOOST_STATIC_ASSERT( BOOST_NOEXCEPT_EXPR( ONx2(boost::move(onx2
)) ));
93 BOOST_STATIC_ASSERT( BOOST_NOEXCEPT_EXPR( onx2
= ONx2() ));
95 BOOST_STATIC_ASSERT( BOOST_NOEXCEPT_EXPR( ONxC() ));
96 BOOST_STATIC_ASSERT( BOOST_NOEXCEPT_EXPR( ONxC(boost::move(onxC
)) ));
97 BOOST_STATIC_ASSERT(!BOOST_NOEXCEPT_EXPR( onxC
= ONxC() ));
99 BOOST_STATIC_ASSERT( BOOST_NOEXCEPT_EXPR( ONxA() ));
100 BOOST_STATIC_ASSERT(!BOOST_NOEXCEPT_EXPR( ONxA(boost::move(onxA
)) ));
101 BOOST_STATIC_ASSERT(!BOOST_NOEXCEPT_EXPR( onxA
= ONxA() ));
103 BOOST_STATIC_ASSERT( BOOST_NOEXCEPT_EXPR( ONx0() ));
104 BOOST_STATIC_ASSERT(!BOOST_NOEXCEPT_EXPR( ONx0(boost::move(onx0
)) ));
105 BOOST_STATIC_ASSERT(!BOOST_NOEXCEPT_EXPR( onx0
= ONx0() ));
108 #endif // !defned BOOST_NO_CXX11_NOEXCEPT
109 #endif // !defined BOOST_OPTIONAL_DETAIL_NO_RVALUE_REFERENCES