1// -*- C++ -*-
2//===----------------------------------------------------------------------===//
3//
4//                     The LLVM Compiler Infrastructure
5//
6// This file is dual licensed under the MIT and the University of Illinois Open
7// Source Licenses. See LICENSE.TXT for details.
8//
9//===----------------------------------------------------------------------===//
10
11// UNSUPPORTED: c++98, c++03, c++11, c++14
12
13// <variant>
14
15// template <class ...Types> class variant;
16
17// constexpr variant() noexcept(see below);
18
19#include <cassert>
20#include <type_traits>
21#include <variant>
22
23#include "test_macros.h"
24#include "variant_test_helpers.hpp"
25
26struct NonDefaultConstructible {
27  NonDefaultConstructible(int) {}
28};
29
30struct NotNoexcept {
31  NotNoexcept() noexcept(false) {}
32};
33
34#ifndef TEST_HAS_NO_EXCEPTIONS
35struct DefaultCtorThrows {
36  DefaultCtorThrows() { throw 42; }
37};
38#endif
39
40void test_default_ctor_sfinae() {
41  {
42    using V = std::variant<std::monostate, int>;
43    static_assert(std::is_default_constructible<V>::value, "");
44  }
45  {
46    using V = std::variant<NonDefaultConstructible, int>;
47    static_assert(!std::is_default_constructible<V>::value, "");
48  }
49#if !defined(TEST_VARIANT_HAS_NO_REFERENCES)
50  {
51    using V = std::variant<int &, int>;
52    static_assert(!std::is_default_constructible<V>::value, "");
53  }
54#endif
55}
56
57void test_default_ctor_noexcept() {
58  {
59    using V = std::variant<int>;
60    static_assert(std::is_nothrow_default_constructible<V>::value, "");
61  }
62  {
63    using V = std::variant<NotNoexcept>;
64    static_assert(!std::is_nothrow_default_constructible<V>::value, "");
65  }
66}
67
68void test_default_ctor_throws() {
69#ifndef TEST_HAS_NO_EXCEPTIONS
70  using V = std::variant<DefaultCtorThrows, int>;
71  try {
72    V v;
73    assert(false);
74  } catch (const int &ex) {
75    assert(ex == 42);
76  } catch (...) {
77    assert(false);
78  }
79#endif
80}
81
82void test_default_ctor_basic() {
83  {
84    std::variant<int> v;
85    assert(v.index() == 0);
86    assert(std::get<0>(v) == 0);
87  }
88  {
89    std::variant<int, long> v;
90    assert(v.index() == 0);
91    assert(std::get<0>(v) == 0);
92  }
93  {
94    using V = std::variant<int, long>;
95    constexpr V v;
96    static_assert(v.index() == 0, "");
97    static_assert(std::get<0>(v) == 0, "");
98  }
99  {
100    using V = std::variant<int, long>;
101    constexpr V v;
102    static_assert(v.index() == 0, "");
103    static_assert(std::get<0>(v) == 0, "");
104  }
105}
106
107int main() {
108  test_default_ctor_basic();
109  test_default_ctor_sfinae();
110  test_default_ctor_noexcept();
111  test_default_ctor_throws();
112}
113