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