diff options
Diffstat (limited to 'test/std/experimental/optional/optional.object/optional.object.assign/move.pass.cpp')
-rw-r--r-- | test/std/experimental/optional/optional.object/optional.object.assign/move.pass.cpp | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/test/std/experimental/optional/optional.object/optional.object.assign/move.pass.cpp b/test/std/experimental/optional/optional.object/optional.object.assign/move.pass.cpp index fa00f5602c7f..4e2aca978865 100644 --- a/test/std/experimental/optional/optional.object/optional.object.assign/move.pass.cpp +++ b/test/std/experimental/optional/optional.object/optional.object.assign/move.pass.cpp @@ -8,7 +8,6 @@ //===----------------------------------------------------------------------===// // UNSUPPORTED: c++98, c++03, c++11 -// XFAIL: libcpp-no-exceptions // <optional> // optional<T>& operator=(optional<T>&& rhs) @@ -19,8 +18,17 @@ #include <type_traits> #include <cassert> +#include "test_macros.h" + using std::experimental::optional; +struct AllowConstAssign { + AllowConstAssign(AllowConstAssign const&) {} + AllowConstAssign const& operator=(AllowConstAssign const&) const { + return *this; + } +}; + struct X { static bool throw_now; @@ -29,7 +37,7 @@ struct X X(X&&) { if (throw_now) - throw 6; + TEST_THROW(6); } X& operator=(X&&) noexcept { @@ -37,10 +45,10 @@ struct X } }; -struct Y {}; - bool X::throw_now = false; +struct Y {}; + int main() { { @@ -77,6 +85,12 @@ int main() assert(*opt == *opt2); } { + optional<const AllowConstAssign> opt; + optional<const AllowConstAssign> opt2; + opt = std::move(opt2); + } +#ifndef TEST_HAS_NO_EXCEPTIONS + { static_assert(!std::is_nothrow_move_assignable<optional<X>>::value, ""); optional<X> opt; optional<X> opt2(X{}); @@ -93,6 +107,7 @@ int main() assert(static_cast<bool>(opt) == false); } } +#endif { static_assert(std::is_nothrow_move_assignable<optional<Y>>::value, ""); } |