]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/std/utilities/variant/variant.variant/variant.ctor/T.pass.cpp
Vendor import of libc++ trunk r290819:
[FreeBSD/FreeBSD.git] / test / std / utilities / variant / variant.variant / variant.ctor / T.pass.cpp
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 // template <class T> constexpr variant(T&&) noexcept(see below);
18
19 #include <cassert>
20 #include <string>
21 #include <type_traits>
22 #include <variant>
23
24 #include "test_convertible.hpp"
25 #include "test_macros.h"
26 #include "variant_test_helpers.hpp"
27
28 struct Dummy {
29   Dummy() = default;
30 };
31
32 struct ThrowsT {
33   ThrowsT(int) noexcept(false) {}
34 };
35
36 struct NoThrowT {
37   NoThrowT(int) noexcept(true) {}
38 };
39
40 void test_T_ctor_noexcept() {
41   {
42     using V = std::variant<Dummy, NoThrowT>;
43     static_assert(std::is_nothrow_constructible<V, int>::value, "");
44   }
45   {
46     using V = std::variant<Dummy, ThrowsT>;
47     static_assert(!std::is_nothrow_constructible<V, int>::value, "");
48   }
49 }
50
51 void test_T_ctor_sfinae() {
52   {
53     using V = std::variant<long, unsigned>;
54     static_assert(!std::is_constructible<V, int>::value, "ambiguous");
55   }
56   {
57     using V = std::variant<std::string, std::string>;
58     static_assert(!std::is_constructible<V, const char *>::value, "ambiguous");
59   }
60   {
61     using V = std::variant<std::string, void *>;
62     static_assert(!std::is_constructible<V, int>::value,
63                   "no matching constructor");
64   }
65 #if !defined(TEST_VARIANT_HAS_NO_REFERENCES)
66   {
67     using V = std::variant<int, int &&>;
68     static_assert(!std::is_constructible<V, int>::value, "ambiguous");
69   }
70   {
71     using V = std::variant<int, const int &>;
72     static_assert(!std::is_constructible<V, int>::value, "ambiguous");
73   }
74 #endif
75 }
76
77 void test_T_ctor_basic() {
78   {
79     constexpr std::variant<int> v(42);
80     static_assert(v.index() == 0, "");
81     static_assert(std::get<0>(v) == 42, "");
82   }
83   {
84     constexpr std::variant<int, long> v(42l);
85     static_assert(v.index() == 1, "");
86     static_assert(std::get<1>(v) == 42, "");
87   }
88 #if !defined(TEST_VARIANT_HAS_NO_REFERENCES)
89   {
90     using V = std::variant<const int &, int &&, long>;
91     static_assert(std::is_convertible<int &, V>::value, "must be implicit");
92     int x = 42;
93     V v(x);
94     assert(v.index() == 0);
95     assert(&std::get<0>(v) == &x);
96   }
97   {
98     using V = std::variant<const int &, int &&, long>;
99     static_assert(std::is_convertible<int, V>::value, "must be implicit");
100     int x = 42;
101     V v(std::move(x));
102     assert(v.index() == 1);
103     assert(&std::get<1>(v) == &x);
104   }
105 #endif
106 }
107
108 int main() {
109   test_T_ctor_basic();
110   test_T_ctor_noexcept();
111   test_T_ctor_sfinae();
112 }