1a9e65961SEric Fiselier //===----------------------------------------------------------------------===// 2a9e65961SEric Fiselier // 3*57b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*57b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 5*57b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6a9e65961SEric Fiselier // 7a9e65961SEric Fiselier //===----------------------------------------------------------------------===// 8a9e65961SEric Fiselier 9a9e65961SEric Fiselier // UNSUPPORTED: c++98, c++03, c++11, c++14 10e9c66ad9SMehdi Amini 118a063df1SLouis Dionne // XFAIL: availability=macosx10.13 128a063df1SLouis Dionne // XFAIL: availability=macosx10.12 138a063df1SLouis Dionne // XFAIL: availability=macosx10.11 148a063df1SLouis Dionne // XFAIL: availability=macosx10.10 158a063df1SLouis Dionne // XFAIL: availability=macosx10.9 168a063df1SLouis Dionne // XFAIL: availability=macosx10.8 178a063df1SLouis Dionne // XFAIL: availability=macosx10.7 18e9c66ad9SMehdi Amini 19a9e65961SEric Fiselier // <optional> 20a9e65961SEric Fiselier 21a9e65961SEric Fiselier // constexpr T& optional<T>::value() &; 22a9e65961SEric Fiselier 23a9e65961SEric Fiselier #include <optional> 24a9e65961SEric Fiselier #include <type_traits> 25a9e65961SEric Fiselier #include <cassert> 26a9e65961SEric Fiselier 27a9e65961SEric Fiselier #include "test_macros.h" 28a9e65961SEric Fiselier 29a9e65961SEric Fiselier using std::optional; 30a9e65961SEric Fiselier using std::bad_optional_access; 31a9e65961SEric Fiselier 32a9e65961SEric Fiselier struct X 33a9e65961SEric Fiselier { 34a9e65961SEric Fiselier X() = default; 35a9e65961SEric Fiselier X(const X&) = delete; 36a9e65961SEric Fiselier constexpr int test() const & {return 3;} 37a9e65961SEric Fiselier int test() & {return 4;} 38a9e65961SEric Fiselier constexpr int test() const && {return 5;} 39a9e65961SEric Fiselier int test() && {return 6;} 40a9e65961SEric Fiselier }; 41a9e65961SEric Fiselier 42a9e65961SEric Fiselier struct Y 43a9e65961SEric Fiselier { 44a9e65961SEric Fiselier constexpr int test() & {return 7;} 45a9e65961SEric Fiselier }; 46a9e65961SEric Fiselier 47a9e65961SEric Fiselier constexpr int 48a9e65961SEric Fiselier test() 49a9e65961SEric Fiselier { 50a9e65961SEric Fiselier optional<Y> opt{Y{}}; 51a9e65961SEric Fiselier return opt.value().test(); 52a9e65961SEric Fiselier } 53a9e65961SEric Fiselier 54a9e65961SEric Fiselier 55a9e65961SEric Fiselier int main() 56a9e65961SEric Fiselier { 57a9e65961SEric Fiselier { 58a9e65961SEric Fiselier optional<X> opt; ((void)opt); 59a9e65961SEric Fiselier ASSERT_NOT_NOEXCEPT(opt.value()); 60a9e65961SEric Fiselier ASSERT_SAME_TYPE(decltype(opt.value()), X&); 61a9e65961SEric Fiselier } 62a9e65961SEric Fiselier { 63a9e65961SEric Fiselier optional<X> opt; 64a9e65961SEric Fiselier opt.emplace(); 65a9e65961SEric Fiselier assert(opt.value().test() == 4); 66a9e65961SEric Fiselier } 67a9e65961SEric Fiselier #ifndef TEST_HAS_NO_EXCEPTIONS 68a9e65961SEric Fiselier { 69a9e65961SEric Fiselier optional<X> opt; 70a9e65961SEric Fiselier try 71a9e65961SEric Fiselier { 7283252766SBilly Robert O'Neal III (void)opt.value(); 73a9e65961SEric Fiselier assert(false); 74a9e65961SEric Fiselier } 75a9e65961SEric Fiselier catch (const bad_optional_access&) 76a9e65961SEric Fiselier { 77a9e65961SEric Fiselier } 78a9e65961SEric Fiselier } 79a9e65961SEric Fiselier #endif 80a9e65961SEric Fiselier static_assert(test() == 7, ""); 81a9e65961SEric Fiselier } 82