Home | History | Annotate | Download | only in optional.object.observe
      1 //===----------------------------------------------------------------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is dual licensed under the MIT and the University of Illinois Open
      6 // Source Licenses. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 // UNSUPPORTED: c++98, c++03, c++11, c++14
     11 
     12 // XFAIL: with_system_cxx_lib=macosx10.12
     13 // XFAIL: with_system_cxx_lib=macosx10.11
     14 // XFAIL: with_system_cxx_lib=macosx10.10
     15 // XFAIL: with_system_cxx_lib=macosx10.9
     16 // XFAIL: with_system_cxx_lib=macosx10.7
     17 // XFAIL: with_system_cxx_lib=macosx10.8
     18 
     19 // <optional>
     20 
     21 // constexpr T& optional<T>::value() &;
     22 
     23 #include <optional>
     24 #include <type_traits>
     25 #include <cassert>
     26 
     27 #include "test_macros.h"
     28 
     29 using std::optional;
     30 using std::bad_optional_access;
     31 
     32 struct X
     33 {
     34     X() = default;
     35     X(const X&) = delete;
     36     constexpr int test() const & {return 3;}
     37     int test() & {return 4;}
     38     constexpr int test() const && {return 5;}
     39     int test() && {return 6;}
     40 };
     41 
     42 struct Y
     43 {
     44     constexpr int test() & {return 7;}
     45 };
     46 
     47 constexpr int
     48 test()
     49 {
     50     optional<Y> opt{Y{}};
     51     return opt.value().test();
     52 }
     53 
     54 
     55 int main()
     56 {
     57     {
     58         optional<X> opt; ((void)opt);
     59         ASSERT_NOT_NOEXCEPT(opt.value());
     60         ASSERT_SAME_TYPE(decltype(opt.value()), X&);
     61     }
     62     {
     63         optional<X> opt;
     64         opt.emplace();
     65         assert(opt.value().test() == 4);
     66     }
     67 #ifndef TEST_HAS_NO_EXCEPTIONS
     68     {
     69         optional<X> opt;
     70         try
     71         {
     72             (void)opt.value();
     73             assert(false);
     74         }
     75         catch (const bad_optional_access&)
     76         {
     77         }
     78     }
     79 #endif
     80     static_assert(test() == 7, "");
     81 }
     82