1a9e65961SEric Fiselier //===----------------------------------------------------------------------===// 2a9e65961SEric Fiselier // 357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6a9e65961SEric Fiselier // 7a9e65961SEric Fiselier //===----------------------------------------------------------------------===// 8a9e65961SEric Fiselier 931cbe0f2SLouis Dionne // UNSUPPORTED: c++03, c++11, c++14 10e9c66ad9SMehdi Amini 112659663eSLouis Dionne // Throwing bad_optional_access is supported starting in macosx10.13 12*c360553cSLouis Dionne // XFAIL: use_system_cxx_lib && target={{.+}}-apple-macosx10.{{9|10|11|12}} && !no-exceptions 13e9c66ad9SMehdi Amini 14a9e65961SEric Fiselier // <optional> 15a9e65961SEric Fiselier 16a9e65961SEric Fiselier // constexpr T& optional<T>::value() &; 17a9e65961SEric Fiselier 18a9e65961SEric Fiselier #include <optional> 19a9e65961SEric Fiselier #include <type_traits> 20a9e65961SEric Fiselier #include <cassert> 21a9e65961SEric Fiselier 22a9e65961SEric Fiselier #include "test_macros.h" 23a9e65961SEric Fiselier 24a9e65961SEric Fiselier using std::optional; 25a9e65961SEric Fiselier using std::bad_optional_access; 26a9e65961SEric Fiselier 27a9e65961SEric Fiselier struct X 28a9e65961SEric Fiselier { 29a9e65961SEric Fiselier X() = default; 30a9e65961SEric Fiselier X(const X&) = delete; testX31a9e65961SEric Fiselier constexpr int test() const & {return 3;} testX32a9e65961SEric Fiselier int test() & {return 4;} testX33a9e65961SEric Fiselier constexpr int test() const && {return 5;} testX34a9e65961SEric Fiselier int test() && {return 6;} 35a9e65961SEric Fiselier }; 36a9e65961SEric Fiselier 37a9e65961SEric Fiselier struct Y 38a9e65961SEric Fiselier { testY39a9e65961SEric Fiselier constexpr int test() & {return 7;} 40a9e65961SEric Fiselier }; 41a9e65961SEric Fiselier 42a9e65961SEric Fiselier constexpr int test()43a9e65961SEric Fiseliertest() 44a9e65961SEric Fiselier { 45a9e65961SEric Fiselier optional<Y> opt{Y{}}; 46a9e65961SEric Fiselier return opt.value().test(); 47a9e65961SEric Fiselier } 48a9e65961SEric Fiselier 49a9e65961SEric Fiselier main(int,char **)502df59c50SJF Bastienint main(int, char**) 51a9e65961SEric Fiselier { 52a9e65961SEric Fiselier { 53a9e65961SEric Fiselier optional<X> opt; ((void)opt); 54a9e65961SEric Fiselier ASSERT_NOT_NOEXCEPT(opt.value()); 55a9e65961SEric Fiselier ASSERT_SAME_TYPE(decltype(opt.value()), X&); 56a9e65961SEric Fiselier } 57a9e65961SEric Fiselier { 58a9e65961SEric Fiselier optional<X> opt; 59a9e65961SEric Fiselier opt.emplace(); 60a9e65961SEric Fiselier assert(opt.value().test() == 4); 61a9e65961SEric Fiselier } 62a9e65961SEric Fiselier #ifndef TEST_HAS_NO_EXCEPTIONS 63a9e65961SEric Fiselier { 64a9e65961SEric Fiselier optional<X> opt; 65a9e65961SEric Fiselier try 66a9e65961SEric Fiselier { 6783252766SBilly Robert O'Neal III (void)opt.value(); 68a9e65961SEric Fiselier assert(false); 69a9e65961SEric Fiselier } 70a9e65961SEric Fiselier catch (const bad_optional_access&) 71a9e65961SEric Fiselier { 72a9e65961SEric Fiselier } 73a9e65961SEric Fiselier } 74a9e65961SEric Fiselier #endif 75a9e65961SEric Fiselier static_assert(test() == 7, ""); 762df59c50SJF Bastien 772df59c50SJF Bastien return 0; 78a9e65961SEric Fiselier } 79