1 //===----------------------------------------------------------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is dual licensed under the MIT and the University of Illinois Open 6 // Source Licenses. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 // UNSUPPORTED: c++98, c++03, c++11, c++14 11 // <optional> 12 13 // constexpr optional() noexcept; 14 15 #include <optional> 16 #include <type_traits> 17 #include <cassert> 18 19 #include "test_macros.h" 20 #include "archetypes.hpp" 21 22 using std::optional; 23 24 template <class Opt> 25 void 26 test_constexpr() 27 { 28 static_assert(std::is_nothrow_default_constructible<Opt>::value, ""); 29 static_assert(std::is_trivially_destructible<Opt>::value, ""); 30 static_assert(std::is_trivially_destructible<typename Opt::value_type>::value, ""); 31 32 constexpr Opt opt; 33 static_assert(static_cast<bool>(opt) == false, ""); 34 35 struct test_constexpr_ctor 36 : public Opt 37 { 38 constexpr test_constexpr_ctor() {} 39 }; 40 } 41 42 template <class Opt> 43 void 44 test() 45 { 46 static_assert(std::is_nothrow_default_constructible<Opt>::value, ""); 47 static_assert(!std::is_trivially_destructible<Opt>::value, ""); 48 static_assert(!std::is_trivially_destructible<typename Opt::value_type>::value, ""); 49 { 50 Opt opt; 51 assert(static_cast<bool>(opt) == false); 52 } 53 { 54 const Opt opt; 55 assert(static_cast<bool>(opt) == false); 56 } 57 58 struct test_constexpr_ctor 59 : public Opt 60 { 61 constexpr test_constexpr_ctor() {} 62 }; 63 } 64 65 int main() 66 { 67 test_constexpr<optional<int>>(); 68 test_constexpr<optional<int*>>(); 69 test_constexpr<optional<ImplicitTypes::NoCtors>>(); 70 test_constexpr<optional<NonTrivialTypes::NoCtors>>(); 71 test_constexpr<optional<NonConstexprTypes::NoCtors>>(); 72 test<optional<NonLiteralTypes::NoCtors>>(); 73 // EXTENSIONS 74 #if defined(_LIBCPP_VERSION) && 0 // FIXME these extensions are currently disabled. 75 test_constexpr<optional<int&>>(); 76 test_constexpr<optional<const int&>>(); 77 test_constexpr<optional<int&>>(); 78 test_constexpr<optional<NonLiteralTypes::NoCtors&>>(); 79 test_constexpr<optional<NonLiteralTypes::NoCtors&&>>(); 80 #endif 81 } 82