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 // optional<T>& operator=(optional<T>&& rhs)
14 // noexcept(is_nothrow_move_assignable<T>::value &&
15 // is_nothrow_move_constructible<T>::value);
17 #include <experimental/optional>
18 #include <type_traits>
21 #include "test_macros.h"
23 using std::experimental::optional;
25 struct AllowConstAssign {
26 AllowConstAssign(AllowConstAssign const&) {}
27 AllowConstAssign const& operator=(AllowConstAssign const&) const {
34 static bool throw_now;
42 X& operator=(X&&) noexcept
48 bool X::throw_now = false;
55 static_assert(std::is_nothrow_move_assignable<optional<int>>::value, "");
57 constexpr optional<int> opt2;
58 opt = std::move(opt2);
59 static_assert(static_cast<bool>(opt2) == false, "");
60 assert(static_cast<bool>(opt) == static_cast<bool>(opt2));
64 constexpr optional<int> opt2(2);
65 opt = std::move(opt2);
66 static_assert(static_cast<bool>(opt2) == true, "");
67 static_assert(*opt2 == 2, "");
68 assert(static_cast<bool>(opt) == static_cast<bool>(opt2));
69 assert(*opt == *opt2);
73 constexpr optional<int> opt2;
74 opt = std::move(opt2);
75 static_assert(static_cast<bool>(opt2) == false, "");
76 assert(static_cast<bool>(opt) == static_cast<bool>(opt2));
80 constexpr optional<int> opt2(2);
81 opt = std::move(opt2);
82 static_assert(static_cast<bool>(opt2) == true, "");
83 static_assert(*opt2 == 2, "");
84 assert(static_cast<bool>(opt) == static_cast<bool>(opt2));
85 assert(*opt == *opt2);
88 optional<const AllowConstAssign> opt;
89 optional<const AllowConstAssign> opt2;
90 opt = std::move(opt2);
92 #ifndef TEST_HAS_NO_EXCEPTIONS
94 static_assert(!std::is_nothrow_move_assignable<optional<X>>::value, "");
96 optional<X> opt2(X{});
97 assert(static_cast<bool>(opt2) == true);
101 opt = std::move(opt2);
107 assert(static_cast<bool>(opt) == false);
112 static_assert(std::is_nothrow_move_assignable<optional<Y>>::value, "");