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 11*2659663eSLouis Dionne // Throwing bad_optional_access is supported starting in macosx10.13 12*2659663eSLouis Dionne // XFAIL: with_system_cxx_lib=macosx10.12 && !no-exceptions 13*2659663eSLouis Dionne // XFAIL: with_system_cxx_lib=macosx10.11 && !no-exceptions 14*2659663eSLouis Dionne // XFAIL: with_system_cxx_lib=macosx10.10 && !no-exceptions 15*2659663eSLouis Dionne // XFAIL: with_system_cxx_lib=macosx10.9 && !no-exceptions 16e9c66ad9SMehdi Amini 17a9e65961SEric Fiselier // <optional> 18a9e65961SEric Fiselier 19a9e65961SEric Fiselier // constexpr T& optional<T>::value() &; 20a9e65961SEric Fiselier 21a9e65961SEric Fiselier #include <optional> 22a9e65961SEric Fiselier #include <type_traits> 23a9e65961SEric Fiselier #include <cassert> 24a9e65961SEric Fiselier 25a9e65961SEric Fiselier #include "test_macros.h" 26a9e65961SEric Fiselier 27a9e65961SEric Fiselier using std::optional; 28a9e65961SEric Fiselier using std::bad_optional_access; 29a9e65961SEric Fiselier 30a9e65961SEric Fiselier struct X 31a9e65961SEric Fiselier { 32a9e65961SEric Fiselier X() = default; 33a9e65961SEric Fiselier X(const X&) = delete; 34a9e65961SEric Fiselier constexpr int test() const & {return 3;} 35a9e65961SEric Fiselier int test() & {return 4;} 36a9e65961SEric Fiselier constexpr int test() const && {return 5;} 37a9e65961SEric Fiselier int test() && {return 6;} 38a9e65961SEric Fiselier }; 39a9e65961SEric Fiselier 40a9e65961SEric Fiselier struct Y 41a9e65961SEric Fiselier { 42a9e65961SEric Fiselier constexpr int test() & {return 7;} 43a9e65961SEric Fiselier }; 44a9e65961SEric Fiselier 45a9e65961SEric Fiselier constexpr int 46a9e65961SEric Fiselier test() 47a9e65961SEric Fiselier { 48a9e65961SEric Fiselier optional<Y> opt{Y{}}; 49a9e65961SEric Fiselier return opt.value().test(); 50a9e65961SEric Fiselier } 51a9e65961SEric Fiselier 52a9e65961SEric Fiselier 532df59c50SJF Bastien int main(int, char**) 54a9e65961SEric Fiselier { 55a9e65961SEric Fiselier { 56a9e65961SEric Fiselier optional<X> opt; ((void)opt); 57a9e65961SEric Fiselier ASSERT_NOT_NOEXCEPT(opt.value()); 58a9e65961SEric Fiselier ASSERT_SAME_TYPE(decltype(opt.value()), X&); 59a9e65961SEric Fiselier } 60a9e65961SEric Fiselier { 61a9e65961SEric Fiselier optional<X> opt; 62a9e65961SEric Fiselier opt.emplace(); 63a9e65961SEric Fiselier assert(opt.value().test() == 4); 64a9e65961SEric Fiselier } 65a9e65961SEric Fiselier #ifndef TEST_HAS_NO_EXCEPTIONS 66a9e65961SEric Fiselier { 67a9e65961SEric Fiselier optional<X> opt; 68a9e65961SEric Fiselier try 69a9e65961SEric Fiselier { 7083252766SBilly Robert O'Neal III (void)opt.value(); 71a9e65961SEric Fiselier assert(false); 72a9e65961SEric Fiselier } 73a9e65961SEric Fiselier catch (const bad_optional_access&) 74a9e65961SEric Fiselier { 75a9e65961SEric Fiselier } 76a9e65961SEric Fiselier } 77a9e65961SEric Fiselier #endif 78a9e65961SEric Fiselier static_assert(test() == 7, ""); 792df59c50SJF Bastien 802df59c50SJF Bastien return 0; 81a9e65961SEric Fiselier } 82