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 // constexpr optional<T>& operator=(const optional<T>& rhs);
15 #include <type_traits>
18 #include "test_macros.h"
19 #include "archetypes.h"
25 static bool throw_now
;
33 X
& operator=(X
const&) = default;
36 bool X::throw_now
= false;
39 constexpr bool assign_empty(optional
<Tp
>&& lhs
) {
40 const optional
<Tp
> rhs
;
42 return !lhs
.has_value() && !rhs
.has_value();
46 constexpr bool assign_value(optional
<Tp
>&& lhs
) {
47 const optional
<Tp
> rhs(101);
49 return lhs
.has_value() && rhs
.has_value() && *lhs
== *rhs
;
55 using O
= optional
<int>;
56 static_assert(assign_empty(O
{42}));
57 static_assert(assign_value(O
{42}));
58 assert(assign_empty(O
{42}));
59 assert(assign_value(O
{42}));
62 using O
= optional
<TrivialTestTypes::TestType
>;
63 static_assert(assign_empty(O
{42}));
64 static_assert(assign_value(O
{42}));
65 assert(assign_empty(O
{42}));
66 assert(assign_value(O
{42}));
69 using O
= optional
<TestTypes::TestType
>;
70 assert(assign_empty(O
{42}));
71 assert(assign_value(O
{42}));
74 using T
= TestTypes::TestType
;
77 const optional
<T
> opt2
;
78 assert(T::alive
== 1);
80 assert(T::alive
== 0);
81 assert(!opt2
.has_value());
82 assert(!opt
.has_value());
84 #ifndef TEST_HAS_NO_EXCEPTIONS
87 optional
<X
> opt2(X
{});
88 assert(static_cast<bool>(opt2
) == true);
98 assert(static_cast<bool>(opt
) == false);