Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / libcxx / test / std / utilities / optional / optional.object / optional.object.observe / value.pass.cpp
blobd4c0e8fc62da3a626149d5efccdb9ed850215dd5
1 //===----------------------------------------------------------------------===//
2 //
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
6 //
7 //===----------------------------------------------------------------------===//
9 // UNSUPPORTED: c++03, c++11, c++14
11 // XFAIL: availability-bad_optional_access-missing && !no-exceptions
13 // <optional>
15 // constexpr T& optional<T>::value() &;
17 #include <optional>
18 #include <type_traits>
19 #include <cassert>
21 #include "test_macros.h"
23 using std::optional;
24 using std::bad_optional_access;
26 struct X
28 X() = default;
29 X(const X&) = delete;
30 constexpr int test() const & {return 3;}
31 int test() & {return 4;}
32 constexpr int test() const && {return 5;}
33 int test() && {return 6;}
36 struct Y
38 constexpr int test() & {return 7;}
41 constexpr int
42 test()
44 optional<Y> opt{Y{}};
45 return opt.value().test();
49 int main(int, char**)
52 optional<X> opt; ((void)opt);
53 ASSERT_NOT_NOEXCEPT(opt.value());
54 ASSERT_SAME_TYPE(decltype(opt.value()), X&);
57 optional<X> opt;
58 opt.emplace();
59 assert(opt.value().test() == 4);
61 #ifndef TEST_HAS_NO_EXCEPTIONS
63 optional<X> opt;
64 try
66 (void)opt.value();
67 assert(false);
69 catch (const bad_optional_access&)
73 #endif
74 static_assert(test() == 7, "");
76 return 0;