2 //===----------------------------------------------------------------------===//
4 // The LLVM Compiler Infrastructure
6 // This file is dual licensed under the MIT and the University of Illinois Open
7 // Source Licenses. See LICENSE.TXT for details.
9 //===----------------------------------------------------------------------===//
11 // UNSUPPORTED: c++98, c++03, c++11, c++14
15 // template <class ...Types> class variant;
17 // template <size_t I, class Up, class ...Args>
19 // variant(in_place_index_t<I>, initializer_list<Up>, Args&&...);
23 #include <type_traits>
26 #include "test_convertible.hpp"
27 #include "test_macros.h"
31 constexpr InitList(std::initializer_list<int> il) : size(il.size()) {}
37 constexpr InitListArg(std::initializer_list<int> il, int v)
38 : size(il.size()), value(v) {}
41 void test_ctor_sfinae() {
42 using IL = std::initializer_list<int>;
44 using V = std::variant<InitList, InitListArg, int>;
45 static_assert(std::is_constructible<V, std::in_place_index_t<0>, IL>::value,
47 static_assert(!test_convertible<V, std::in_place_index_t<0>, IL>(), "");
49 { // too many arguments
50 using V = std::variant<InitList, InitListArg, int>;
52 !std::is_constructible<V, std::in_place_index_t<0>, IL, int>::value,
54 static_assert(!test_convertible<V, std::in_place_index_t<0>, IL, int>(),
57 { // too few arguments
58 using V = std::variant<InitList, InitListArg, int>;
60 !std::is_constructible<V, std::in_place_index_t<1>, IL>::value, "");
61 static_assert(!test_convertible<V, std::in_place_index_t<1>, IL>(), "");
63 { // init list and arguments
64 using V = std::variant<InitList, InitListArg, int>;
66 std::is_constructible<V, std::in_place_index_t<1>, IL, int>::value, "");
67 static_assert(!test_convertible<V, std::in_place_index_t<1>, IL, int>(),
70 { // not constructible from arguments
71 using V = std::variant<InitList, InitListArg, int>;
73 !std::is_constructible<V, std::in_place_index_t<2>, IL>::value, "");
74 static_assert(!test_convertible<V, std::in_place_index_t<2>, IL>(), "");
78 void test_ctor_basic() {
80 constexpr std::variant<InitList, InitListArg, InitList> v(
81 std::in_place_index<0>, {1, 2, 3});
82 static_assert(v.index() == 0, "");
83 static_assert(std::get<0>(v).size == 3, "");
86 constexpr std::variant<InitList, InitListArg, InitList> v(
87 std::in_place_index<2>, {1, 2, 3});
88 static_assert(v.index() == 2, "");
89 static_assert(std::get<2>(v).size == 3, "");
92 constexpr std::variant<InitList, InitListArg, InitListArg> v(
93 std::in_place_index<1>, {1, 2, 3, 4}, 42);
94 static_assert(v.index() == 1, "");
95 static_assert(std::get<1>(v).size == 4, "");
96 static_assert(std::get<1>(v).value == 42, "");