1 //===----------------------------------------------------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // UNSUPPORTED: c++98, c++03, c++11
13 // void swap(optional&)
14 // noexcept(is_nothrow_move_constructible<T>::value &&
15 // noexcept(swap(declval<T&>(), declval<T&>())));
17 #include <experimental/optional>
18 #include <type_traits>
21 #include "test_macros.h"
23 using std::experimental::optional;
29 static unsigned dtor_called;
32 X& operator=(X&&) = default;
35 friend bool operator==(const X& x, const X& y) {return x.i_ == y.i_;}
38 unsigned X::dtor_called = 0;
44 static unsigned dtor_called;
49 friend constexpr bool operator==(const Y& x, const Y& y) {return x.i_ == y.i_;}
50 friend void swap(Y& x, Y& y) {std::swap(x.i_, y.i_);}
53 unsigned Y::dtor_called = 0;
60 Z(Z&&) {TEST_THROW(7);}
62 friend constexpr bool operator==(const Z& x, const Z& y) {return x.i_ == y.i_;}
63 friend void swap(Z&, Z&) {TEST_THROW(6);}
66 struct ConstSwappable {
68 void swap(ConstSwappable const&, ConstSwappable const&) {}
75 static_assert(noexcept(opt1.swap(opt2)) == true, "");
76 assert(static_cast<bool>(opt1) == false);
77 assert(static_cast<bool>(opt2) == false);
79 assert(static_cast<bool>(opt1) == false);
80 assert(static_cast<bool>(opt2) == false);
83 optional<int> opt1(1);
85 static_assert(noexcept(opt1.swap(opt2)) == true, "");
86 assert(static_cast<bool>(opt1) == true);
88 assert(static_cast<bool>(opt2) == false);
90 assert(static_cast<bool>(opt1) == false);
91 assert(static_cast<bool>(opt2) == true);
96 optional<int> opt2(2);
97 static_assert(noexcept(opt1.swap(opt2)) == true, "");
98 assert(static_cast<bool>(opt1) == false);
99 assert(static_cast<bool>(opt2) == true);
102 assert(static_cast<bool>(opt1) == true);
104 assert(static_cast<bool>(opt2) == false);
107 optional<int> opt1(1);
108 optional<int> opt2(2);
109 static_assert(noexcept(opt1.swap(opt2)) == true, "");
110 assert(static_cast<bool>(opt1) == true);
112 assert(static_cast<bool>(opt2) == true);
115 assert(static_cast<bool>(opt1) == true);
117 assert(static_cast<bool>(opt2) == true);
121 optional<const ConstSwappable> opt;
122 optional<const ConstSwappable> opt2;
128 static_assert(noexcept(opt1.swap(opt2)) == true, "");
129 assert(static_cast<bool>(opt1) == false);
130 assert(static_cast<bool>(opt2) == false);
132 assert(static_cast<bool>(opt1) == false);
133 assert(static_cast<bool>(opt2) == false);
134 assert(X::dtor_called == 0);
139 static_assert(noexcept(opt1.swap(opt2)) == true, "");
140 assert(static_cast<bool>(opt1) == true);
142 assert(static_cast<bool>(opt2) == false);
145 assert(X::dtor_called == 1);
146 assert(static_cast<bool>(opt1) == false);
147 assert(static_cast<bool>(opt2) == true);
153 static_assert(noexcept(opt1.swap(opt2)) == true, "");
154 assert(static_cast<bool>(opt1) == false);
155 assert(static_cast<bool>(opt2) == true);
159 assert(X::dtor_called == 1);
160 assert(static_cast<bool>(opt1) == true);
162 assert(static_cast<bool>(opt2) == false);
167 static_assert(noexcept(opt1.swap(opt2)) == true, "");
168 assert(static_cast<bool>(opt1) == true);
170 assert(static_cast<bool>(opt2) == true);
174 assert(X::dtor_called == 1); // from inside std::swap
175 assert(static_cast<bool>(opt1) == true);
177 assert(static_cast<bool>(opt2) == true);
183 static_assert(noexcept(opt1.swap(opt2)) == false, "");
184 assert(static_cast<bool>(opt1) == false);
185 assert(static_cast<bool>(opt2) == false);
187 assert(static_cast<bool>(opt1) == false);
188 assert(static_cast<bool>(opt2) == false);
189 assert(Y::dtor_called == 0);
194 static_assert(noexcept(opt1.swap(opt2)) == false, "");
195 assert(static_cast<bool>(opt1) == true);
197 assert(static_cast<bool>(opt2) == false);
200 assert(Y::dtor_called == 1);
201 assert(static_cast<bool>(opt1) == false);
202 assert(static_cast<bool>(opt2) == true);
208 static_assert(noexcept(opt1.swap(opt2)) == false, "");
209 assert(static_cast<bool>(opt1) == false);
210 assert(static_cast<bool>(opt2) == true);
214 assert(Y::dtor_called == 1);
215 assert(static_cast<bool>(opt1) == true);
217 assert(static_cast<bool>(opt2) == false);
222 static_assert(noexcept(opt1.swap(opt2)) == false, "");
223 assert(static_cast<bool>(opt1) == true);
225 assert(static_cast<bool>(opt2) == true);
229 assert(Y::dtor_called == 0);
230 assert(static_cast<bool>(opt1) == true);
232 assert(static_cast<bool>(opt2) == true);
235 #ifndef TEST_HAS_NO_EXCEPTIONS
239 static_assert(noexcept(opt1.swap(opt2)) == false, "");
240 assert(static_cast<bool>(opt1) == false);
241 assert(static_cast<bool>(opt2) == false);
243 assert(static_cast<bool>(opt1) == false);
244 assert(static_cast<bool>(opt2) == false);
250 static_assert(noexcept(opt1.swap(opt2)) == false, "");
251 assert(static_cast<bool>(opt1) == true);
253 assert(static_cast<bool>(opt2) == false);
263 assert(static_cast<bool>(opt1) == true);
265 assert(static_cast<bool>(opt2) == false);
271 static_assert(noexcept(opt1.swap(opt2)) == false, "");
272 assert(static_cast<bool>(opt1) == false);
273 assert(static_cast<bool>(opt2) == true);
284 assert(static_cast<bool>(opt1) == false);
285 assert(static_cast<bool>(opt2) == true);
293 static_assert(noexcept(opt1.swap(opt2)) == false, "");
294 assert(static_cast<bool>(opt1) == true);
296 assert(static_cast<bool>(opt2) == true);
307 assert(static_cast<bool>(opt1) == true);
309 assert(static_cast<bool>(opt2) == true);