1 //===----------------------------------------------------------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // UNSUPPORTED: c++03, c++11, c++14
12 // void swap(optional&)
13 // noexcept(is_nothrow_move_constructible<T>::value &&
14 // is_nothrow_swappable<T>::value)
17 #include <type_traits>
20 #include "test_macros.h"
21 #include "archetypes.h"
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);}
70 constexpr W(int i
) : i_(i
) {}
72 friend constexpr bool operator==(const W
& x
, const W
& y
) {return x
.i_
== y
.i_
;}
73 friend TEST_CONSTEXPR_CXX20
void swap(W
& x
, W
& y
) noexcept
{std::swap(x
.i_
, y
.i_
);}
77 TEST_CONSTEXPR_CXX20
bool check_swap()
82 static_assert(noexcept(opt1
.swap(opt2
)) == true);
83 assert(static_cast<bool>(opt1
) == false);
84 assert(static_cast<bool>(opt2
) == false);
86 assert(static_cast<bool>(opt1
) == false);
87 assert(static_cast<bool>(opt2
) == false);
92 static_assert(noexcept(opt1
.swap(opt2
)) == true);
93 assert(static_cast<bool>(opt1
) == true);
95 assert(static_cast<bool>(opt2
) == false);
97 assert(static_cast<bool>(opt1
) == false);
98 assert(static_cast<bool>(opt2
) == true);
104 static_assert(noexcept(opt1
.swap(opt2
)) == true, "");
105 assert(static_cast<bool>(opt1
) == false);
106 assert(static_cast<bool>(opt2
) == true);
109 assert(static_cast<bool>(opt1
) == true);
111 assert(static_cast<bool>(opt2
) == false);
116 static_assert(noexcept(opt1
.swap(opt2
)) == true, "");
117 assert(static_cast<bool>(opt1
) == true);
119 assert(static_cast<bool>(opt2
) == true);
122 assert(static_cast<bool>(opt1
) == true);
124 assert(static_cast<bool>(opt2
) == true);
130 int main(int, char**)
134 #if TEST_STD_VER > 17
135 static_assert(check_swap
<int>());
136 static_assert(check_swap
<W
>());
141 static_assert(noexcept(opt1
.swap(opt2
)) == true, "");
142 assert(static_cast<bool>(opt1
) == false);
143 assert(static_cast<bool>(opt2
) == false);
145 assert(static_cast<bool>(opt1
) == false);
146 assert(static_cast<bool>(opt2
) == false);
147 assert(X::dtor_called
== 0);
152 static_assert(noexcept(opt1
.swap(opt2
)) == true, "");
153 assert(static_cast<bool>(opt1
) == true);
155 assert(static_cast<bool>(opt2
) == false);
158 assert(X::dtor_called
== 1);
159 assert(static_cast<bool>(opt1
) == false);
160 assert(static_cast<bool>(opt2
) == true);
166 static_assert(noexcept(opt1
.swap(opt2
)) == true, "");
167 assert(static_cast<bool>(opt1
) == false);
168 assert(static_cast<bool>(opt2
) == true);
172 assert(X::dtor_called
== 1);
173 assert(static_cast<bool>(opt1
) == true);
175 assert(static_cast<bool>(opt2
) == false);
180 static_assert(noexcept(opt1
.swap(opt2
)) == true, "");
181 assert(static_cast<bool>(opt1
) == true);
183 assert(static_cast<bool>(opt2
) == true);
187 assert(X::dtor_called
== 1); // from inside std::swap
188 assert(static_cast<bool>(opt1
) == true);
190 assert(static_cast<bool>(opt2
) == true);
196 static_assert(noexcept(opt1
.swap(opt2
)) == false, "");
197 assert(static_cast<bool>(opt1
) == false);
198 assert(static_cast<bool>(opt2
) == false);
200 assert(static_cast<bool>(opt1
) == false);
201 assert(static_cast<bool>(opt2
) == false);
202 assert(Y::dtor_called
== 0);
207 static_assert(noexcept(opt1
.swap(opt2
)) == false, "");
208 assert(static_cast<bool>(opt1
) == true);
210 assert(static_cast<bool>(opt2
) == false);
213 assert(Y::dtor_called
== 1);
214 assert(static_cast<bool>(opt1
) == false);
215 assert(static_cast<bool>(opt2
) == true);
221 static_assert(noexcept(opt1
.swap(opt2
)) == false, "");
222 assert(static_cast<bool>(opt1
) == false);
223 assert(static_cast<bool>(opt2
) == true);
227 assert(Y::dtor_called
== 1);
228 assert(static_cast<bool>(opt1
) == true);
230 assert(static_cast<bool>(opt2
) == false);
235 static_assert(noexcept(opt1
.swap(opt2
)) == false, "");
236 assert(static_cast<bool>(opt1
) == true);
238 assert(static_cast<bool>(opt2
) == true);
242 assert(Y::dtor_called
== 0);
243 assert(static_cast<bool>(opt1
) == true);
245 assert(static_cast<bool>(opt2
) == true);
251 static_assert(noexcept(opt1
.swap(opt2
)) == false, "");
252 assert(static_cast<bool>(opt1
) == false);
253 assert(static_cast<bool>(opt2
) == false);
255 assert(static_cast<bool>(opt1
) == false);
256 assert(static_cast<bool>(opt2
) == false);
258 #ifndef TEST_HAS_NO_EXCEPTIONS
263 static_assert(noexcept(opt1
.swap(opt2
)) == false, "");
264 assert(static_cast<bool>(opt1
) == true);
266 assert(static_cast<bool>(opt2
) == false);
276 assert(static_cast<bool>(opt1
) == true);
278 assert(static_cast<bool>(opt2
) == false);
284 static_assert(noexcept(opt1
.swap(opt2
)) == false, "");
285 assert(static_cast<bool>(opt1
) == false);
286 assert(static_cast<bool>(opt2
) == true);
297 assert(static_cast<bool>(opt1
) == false);
298 assert(static_cast<bool>(opt2
) == true);
306 static_assert(noexcept(opt1
.swap(opt2
)) == false, "");
307 assert(static_cast<bool>(opt1
) == true);
309 assert(static_cast<bool>(opt2
) == true);
320 assert(static_cast<bool>(opt1
) == true);
322 assert(static_cast<bool>(opt2
) == true);