thrust / dependencies /libcudacxx /libcxx /test /std /utilities /optional /optional.object /optional.object.assign /copy.pass.cpp
| //===----------------------------------------------------------------------===// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| // UNSUPPORTED: c++98, c++03, c++11, c++14 | |
| // <optional> | |
| // optional<T>& operator=(const optional<T>& rhs); // constexpr in C++20 | |
| using std::optional; | |
| struct X | |
| { | |
| static bool throw_now; | |
| X() = default; | |
| X(const X&) | |
| { | |
| if (throw_now) | |
| TEST_THROW(6); | |
| } | |
| X& operator=(X const&) = default; | |
| }; | |
| bool X::throw_now = false; | |
| template <class Tp> | |
| constexpr bool assign_empty(optional<Tp>&& lhs) { | |
| const optional<Tp> rhs; | |
| lhs = rhs; | |
| return !lhs.has_value() && !rhs.has_value(); | |
| } | |
| template <class Tp> | |
| constexpr bool assign_value(optional<Tp>&& lhs) { | |
| const optional<Tp> rhs(101); | |
| lhs = rhs; | |
| return lhs.has_value() && rhs.has_value() && *lhs == *rhs; | |
| } | |
| int main(int, char**) | |
| { | |
| { | |
| using O = optional<int>; | |
| LIBCPP_STATIC_ASSERT(assign_empty(O{42}), ""); | |
| LIBCPP_STATIC_ASSERT(assign_value(O{42}), ""); | |
| assert(assign_empty(O{42})); | |
| assert(assign_value(O{42})); | |
| } | |
| { | |
| using O = optional<TrivialTestTypes::TestType>; | |
| LIBCPP_STATIC_ASSERT(assign_empty(O{42}), ""); | |
| LIBCPP_STATIC_ASSERT(assign_value(O{42}), ""); | |
| assert(assign_empty(O{42})); | |
| assert(assign_value(O{42})); | |
| } | |
| { | |
| using O = optional<TestTypes::TestType>; | |
| assert(assign_empty(O{42})); | |
| assert(assign_value(O{42})); | |
| } | |
| { | |
| using T = TestTypes::TestType; | |
| T::reset(); | |
| optional<T> opt(3); | |
| const optional<T> opt2; | |
| assert(T::alive == 1); | |
| opt = opt2; | |
| assert(T::alive == 0); | |
| assert(!opt2.has_value()); | |
| assert(!opt.has_value()); | |
| } | |
| { | |
| optional<X> opt; | |
| optional<X> opt2(X{}); | |
| assert(static_cast<bool>(opt2) == true); | |
| try | |
| { | |
| X::throw_now = true; | |
| opt = opt2; | |
| assert(false); | |
| } | |
| catch (int i) | |
| { | |
| assert(i == 6); | |
| assert(static_cast<bool>(opt) == false); | |
| } | |
| } | |
| return 0; | |
| } | |