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, c++14
13 // void swap(optional&)
14 // noexcept(is_nothrow_move_constructible<T>::value &&
15 // is_nothrow_swappable<T>::value)
18 #include <type_traits>
21 #include "test_macros.h"
22 #include "archetypes.hpp"
30 static unsigned dtor_called;
33 X& operator=(X&&) = default;
36 friend bool operator==(const X& x, const X& y) {return x.i_ == y.i_;}
39 unsigned X::dtor_called = 0;
45 static unsigned dtor_called;
50 friend constexpr bool operator==(const Y& x, const Y& y) {return x.i_ == y.i_;}
51 friend void swap(Y& x, Y& y) {std::swap(x.i_, y.i_);}
54 unsigned Y::dtor_called = 0;
61 Z(Z&&) {TEST_THROW(7);}
63 friend constexpr bool operator==(const Z& x, const Z& y) {return x.i_ == y.i_;}
64 friend void swap(Z&, Z&) {TEST_THROW(6);}
73 static_assert(noexcept(opt1.swap(opt2)) == true, "");
74 assert(static_cast<bool>(opt1) == false);
75 assert(static_cast<bool>(opt2) == false);
77 assert(static_cast<bool>(opt1) == false);
78 assert(static_cast<bool>(opt2) == false);
81 optional<int> opt1(1);
83 static_assert(noexcept(opt1.swap(opt2)) == true, "");
84 assert(static_cast<bool>(opt1) == true);
86 assert(static_cast<bool>(opt2) == false);
88 assert(static_cast<bool>(opt1) == false);
89 assert(static_cast<bool>(opt2) == true);
94 optional<int> opt2(2);
95 static_assert(noexcept(opt1.swap(opt2)) == true, "");
96 assert(static_cast<bool>(opt1) == false);
97 assert(static_cast<bool>(opt2) == true);
100 assert(static_cast<bool>(opt1) == true);
102 assert(static_cast<bool>(opt2) == false);
105 optional<int> opt1(1);
106 optional<int> opt2(2);
107 static_assert(noexcept(opt1.swap(opt2)) == true, "");
108 assert(static_cast<bool>(opt1) == true);
110 assert(static_cast<bool>(opt2) == true);
113 assert(static_cast<bool>(opt1) == true);
115 assert(static_cast<bool>(opt2) == true);
121 static_assert(noexcept(opt1.swap(opt2)) == true, "");
122 assert(static_cast<bool>(opt1) == false);
123 assert(static_cast<bool>(opt2) == false);
125 assert(static_cast<bool>(opt1) == false);
126 assert(static_cast<bool>(opt2) == false);
127 assert(X::dtor_called == 0);
132 static_assert(noexcept(opt1.swap(opt2)) == true, "");
133 assert(static_cast<bool>(opt1) == true);
135 assert(static_cast<bool>(opt2) == false);
138 assert(X::dtor_called == 1);
139 assert(static_cast<bool>(opt1) == false);
140 assert(static_cast<bool>(opt2) == true);
146 static_assert(noexcept(opt1.swap(opt2)) == true, "");
147 assert(static_cast<bool>(opt1) == false);
148 assert(static_cast<bool>(opt2) == true);
152 assert(X::dtor_called == 1);
153 assert(static_cast<bool>(opt1) == true);
155 assert(static_cast<bool>(opt2) == false);
160 static_assert(noexcept(opt1.swap(opt2)) == true, "");
161 assert(static_cast<bool>(opt1) == true);
163 assert(static_cast<bool>(opt2) == true);
167 assert(X::dtor_called == 1); // from inside std::swap
168 assert(static_cast<bool>(opt1) == true);
170 assert(static_cast<bool>(opt2) == true);
176 static_assert(noexcept(opt1.swap(opt2)) == false, "");
177 assert(static_cast<bool>(opt1) == false);
178 assert(static_cast<bool>(opt2) == false);
180 assert(static_cast<bool>(opt1) == false);
181 assert(static_cast<bool>(opt2) == false);
182 assert(Y::dtor_called == 0);
187 static_assert(noexcept(opt1.swap(opt2)) == false, "");
188 assert(static_cast<bool>(opt1) == true);
190 assert(static_cast<bool>(opt2) == false);
193 assert(Y::dtor_called == 1);
194 assert(static_cast<bool>(opt1) == false);
195 assert(static_cast<bool>(opt2) == true);
201 static_assert(noexcept(opt1.swap(opt2)) == false, "");
202 assert(static_cast<bool>(opt1) == false);
203 assert(static_cast<bool>(opt2) == true);
207 assert(Y::dtor_called == 1);
208 assert(static_cast<bool>(opt1) == true);
210 assert(static_cast<bool>(opt2) == false);
215 static_assert(noexcept(opt1.swap(opt2)) == false, "");
216 assert(static_cast<bool>(opt1) == true);
218 assert(static_cast<bool>(opt2) == true);
222 assert(Y::dtor_called == 0);
223 assert(static_cast<bool>(opt1) == true);
225 assert(static_cast<bool>(opt2) == true);
231 static_assert(noexcept(opt1.swap(opt2)) == false, "");
232 assert(static_cast<bool>(opt1) == false);
233 assert(static_cast<bool>(opt2) == false);
235 assert(static_cast<bool>(opt1) == false);
236 assert(static_cast<bool>(opt2) == false);
238 #ifndef TEST_HAS_NO_EXCEPTIONS
243 static_assert(noexcept(opt1.swap(opt2)) == false, "");
244 assert(static_cast<bool>(opt1) == true);
246 assert(static_cast<bool>(opt2) == false);
256 assert(static_cast<bool>(opt1) == true);
258 assert(static_cast<bool>(opt2) == false);
264 static_assert(noexcept(opt1.swap(opt2)) == false, "");
265 assert(static_cast<bool>(opt1) == false);
266 assert(static_cast<bool>(opt2) == true);
277 assert(static_cast<bool>(opt1) == false);
278 assert(static_cast<bool>(opt2) == true);
286 static_assert(noexcept(opt1.swap(opt2)) == false, "");
287 assert(static_cast<bool>(opt1) == true);
289 assert(static_cast<bool>(opt2) == true);
300 assert(static_cast<bool>(opt1) == true);
302 assert(static_cast<bool>(opt2) == true);