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