1 // -*- C++ -*- 2 //===----------------------------------------------------------------------===// 3 // 4 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5 // See https://llvm.org/LICENSE.txt for license information. 6 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7 // 8 //===----------------------------------------------------------------------===// 9 10 // UNSUPPORTED: c++03, c++11, c++14 11 12 // Throwing bad_variant_access is supported starting in macosx10.13 13 // XFAIL: use_system_cxx_lib && x86_64-apple-macosx10.12 && !no-exceptions 14 // XFAIL: use_system_cxx_lib && x86_64-apple-macosx10.11 && !no-exceptions 15 // XFAIL: use_system_cxx_lib && x86_64-apple-macosx10.10 && !no-exceptions 16 // XFAIL: use_system_cxx_lib && x86_64-apple-macosx10.9 && !no-exceptions 17 18 // <variant> 19 20 // template <class ...Types> class variant; 21 22 // constexpr variant() noexcept(see below); 23 24 #include <cassert> 25 #include <type_traits> 26 #include <variant> 27 28 #include "test_macros.h" 29 #include "variant_test_helpers.h" 30 31 struct NonDefaultConstructible { 32 constexpr NonDefaultConstructible(int) {} 33 }; 34 35 struct NotNoexcept { 36 NotNoexcept() noexcept(false) {} 37 }; 38 39 #ifndef TEST_HAS_NO_EXCEPTIONS 40 struct DefaultCtorThrows { 41 DefaultCtorThrows() { throw 42; } 42 }; 43 #endif 44 45 void test_default_ctor_sfinae() { 46 { 47 using V = std::variant<std::monostate, int>; 48 static_assert(std::is_default_constructible<V>::value, ""); 49 } 50 { 51 using V = std::variant<NonDefaultConstructible, int>; 52 static_assert(!std::is_default_constructible<V>::value, ""); 53 } 54 #if !defined(TEST_VARIANT_HAS_NO_REFERENCES) 55 { 56 using V = std::variant<int &, int>; 57 static_assert(!std::is_default_constructible<V>::value, ""); 58 } 59 #endif 60 } 61 62 void test_default_ctor_noexcept() { 63 { 64 using V = std::variant<int>; 65 static_assert(std::is_nothrow_default_constructible<V>::value, ""); 66 } 67 { 68 using V = std::variant<NotNoexcept>; 69 static_assert(!std::is_nothrow_default_constructible<V>::value, ""); 70 } 71 } 72 73 void test_default_ctor_throws() { 74 #ifndef TEST_HAS_NO_EXCEPTIONS 75 using V = std::variant<DefaultCtorThrows, int>; 76 try { 77 V v; 78 assert(false); 79 } catch (const int &ex) { 80 assert(ex == 42); 81 } catch (...) { 82 assert(false); 83 } 84 #endif 85 } 86 87 void test_default_ctor_basic() { 88 { 89 std::variant<int> v; 90 assert(v.index() == 0); 91 assert(std::get<0>(v) == 0); 92 } 93 { 94 std::variant<int, long> v; 95 assert(v.index() == 0); 96 assert(std::get<0>(v) == 0); 97 } 98 { 99 std::variant<int, NonDefaultConstructible> v; 100 assert(v.index() == 0); 101 assert(std::get<0>(v) == 0); 102 } 103 { 104 using V = std::variant<int, long>; 105 constexpr V v; 106 static_assert(v.index() == 0, ""); 107 static_assert(std::get<0>(v) == 0, ""); 108 } 109 { 110 using V = std::variant<int, long>; 111 constexpr V v; 112 static_assert(v.index() == 0, ""); 113 static_assert(std::get<0>(v) == 0, ""); 114 } 115 { 116 using V = std::variant<int, NonDefaultConstructible>; 117 constexpr V v; 118 static_assert(v.index() == 0, ""); 119 static_assert(std::get<0>(v) == 0, ""); 120 } 121 } 122 123 int main(int, char**) { 124 test_default_ctor_basic(); 125 test_default_ctor_sfinae(); 126 test_default_ctor_noexcept(); 127 test_default_ctor_throws(); 128 129 return 0; 130 } 131