1 // Copyright (C) 2014 Andrzej Krzemienski.
2 //
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)
6 //
7 // See http://www.boost.org/lib/optional for documentation.
8 //
9 // You are welcome to contact the author at:
10 //  [email protected]
11 
12 #include "boost/static_assert.hpp"
13 #include "boost/optional/optional.hpp"
14 
15 #ifdef BOOST_BORLANDC
16 #pragma hdrstop
17 #endif
18 
19 
20 using boost::optional;
21 
22 
23 #ifndef BOOST_OPTIONAL_DETAIL_NO_RVALUE_REFERENCES
24 #ifndef BOOST_NO_CXX11_NOEXCEPT
25 
26 // these 4 classes have different noexcept signatures in move operations
27 struct NothrowBoth {
BOOST_NOEXCEPT_IFNothrowBoth28   NothrowBoth(NothrowBoth&&) BOOST_NOEXCEPT_IF(true) {};
operator =NothrowBoth29   void operator=(NothrowBoth&&) BOOST_NOEXCEPT_IF(true) {};
30 };
31 struct NothrowCtor {
BOOST_NOEXCEPT_IFNothrowCtor32   NothrowCtor(NothrowCtor&&) BOOST_NOEXCEPT_IF(true) {};
operator =NothrowCtor33   void operator=(NothrowCtor&&) BOOST_NOEXCEPT_IF(false) {};
34 };
35 struct NothrowAssign {
BOOST_NOEXCEPT_IFNothrowAssign36   NothrowAssign(NothrowAssign&&) BOOST_NOEXCEPT_IF(false) {};
operator =NothrowAssign37   void operator=(NothrowAssign&&) BOOST_NOEXCEPT_IF(true) {};
38 };
39 struct NothrowNone {
BOOST_NOEXCEPT_IFNothrowNone40   NothrowNone(NothrowNone&&) BOOST_NOEXCEPT_IF(false) {};
operator =NothrowNone41   void operator=(NothrowNone&&) BOOST_NOEXCEPT_IF(false) {};
42 };
43 
44 #if 0 // these also test type_traits, which are wrong
45 void test_noexcept_as_defined() // this is a compile-time test
46 {
47   BOOST_STATIC_ASSERT(::boost::is_nothrow_move_constructible<NothrowBoth>::value);
48   BOOST_STATIC_ASSERT(::boost::is_nothrow_move_assignable<NothrowBoth>::value);
49 
50   BOOST_STATIC_ASSERT(::boost::is_nothrow_move_constructible<NothrowCtor>::value);
51   BOOST_STATIC_ASSERT(!::boost::is_nothrow_move_assignable<NothrowCtor>::value);
52 
53   BOOST_STATIC_ASSERT(!::boost::is_nothrow_move_constructible<NothrowAssign>::value);
54   BOOST_STATIC_ASSERT(::boost::is_nothrow_move_assignable<NothrowAssign>::value);
55 
56   BOOST_STATIC_ASSERT(!::boost::is_nothrow_move_constructible<NothrowNone>::value);
57   BOOST_STATIC_ASSERT(!::boost::is_nothrow_move_assignable<NothrowNone>::value);
58 }
59 
60 void test_noexcept_on_optional_with_type_traits() // this is a compile-time test
61 {
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>()));
65 
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>()));
69 
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>()));
73 
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>()));
77 }
78 #endif
79 
test_noexcept_optional_with_operator()80 void test_noexcept_optional_with_operator() // compile-time test
81 {
82   typedef optional<NothrowBoth>   ONx2;
83   typedef optional<NothrowCtor>   ONxC;
84   typedef optional<NothrowAssign> ONxA;
85   typedef optional<NothrowNone>   ONx0;
86   ONx2 onx2;
87   ONxC onxC;
88   ONxA onxA;
89   ONx0 onx0;
90 
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() ));
94 
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() ));
98 
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() ));
102 
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() ));
106 }
107 
108 #endif // !defned BOOST_NO_CXX11_NOEXCEPT
109 #endif // !defined BOOST_OPTIONAL_DETAIL_NO_RVALUE_REFERENCES
110 
main()111 int main()
112 {
113   return 0;
114 }
115 
116 
117