• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===----------------------------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 // <tuple>
10 
11 // template <class... Types> class tuple;
12 
13 // explicit(see-below) constexpr tuple();
14 
15 // UNSUPPORTED: c++03
16 
17 #include <tuple>
18 #include <string>
19 #include <cassert>
20 #include <type_traits>
21 
22 #include "test_macros.h"
23 #include "DefaultOnly.h"
24 
25 struct NoDefault {
26     NoDefault() = delete;
NoDefaultNoDefault27     explicit NoDefault(int) { }
28 };
29 
30 struct NoExceptDefault {
31     NoExceptDefault() noexcept = default;
32 };
33 
34 struct ThrowingDefault {
ThrowingDefaultThrowingDefault35     ThrowingDefault() { }
36 };
37 
38 struct IllFormedDefault {
IllFormedDefaultIllFormedDefault39     IllFormedDefault(int x) : value(x) {}
40     template <bool Pred = false>
IllFormedDefaultIllFormedDefault41     constexpr IllFormedDefault() {
42         static_assert(Pred,
43             "The default constructor should not be instantiated");
44     }
45     int value;
46 };
47 
main(int,char **)48 int main(int, char**)
49 {
50     {
51         std::tuple<> t;
52         (void)t;
53     }
54     {
55         std::tuple<int> t;
56         assert(std::get<0>(t) == 0);
57     }
58     {
59         std::tuple<int, char*> t;
60         assert(std::get<0>(t) == 0);
61         assert(std::get<1>(t) == nullptr);
62     }
63     {
64         std::tuple<int, char*, std::string> t;
65         assert(std::get<0>(t) == 0);
66         assert(std::get<1>(t) == nullptr);
67         assert(std::get<2>(t) == "");
68     }
69     {
70         std::tuple<int, char*, std::string, DefaultOnly> t;
71         assert(std::get<0>(t) == 0);
72         assert(std::get<1>(t) == nullptr);
73         assert(std::get<2>(t) == "");
74         assert(std::get<3>(t) == DefaultOnly());
75     }
76     {
77         // See bug #21157.
78         static_assert(!std::is_default_constructible<std::tuple<NoDefault>>(), "");
79         static_assert(!std::is_default_constructible<std::tuple<DefaultOnly, NoDefault>>(), "");
80         static_assert(!std::is_default_constructible<std::tuple<NoDefault, DefaultOnly, NoDefault>>(), "");
81     }
82     {
83         static_assert(noexcept(std::tuple<NoExceptDefault>()), "");
84         static_assert(noexcept(std::tuple<NoExceptDefault, NoExceptDefault>()), "");
85 
86         static_assert(!noexcept(std::tuple<ThrowingDefault, NoExceptDefault>()), "");
87         static_assert(!noexcept(std::tuple<NoExceptDefault, ThrowingDefault>()), "");
88         static_assert(!noexcept(std::tuple<ThrowingDefault, ThrowingDefault>()), "");
89     }
90     {
91         constexpr std::tuple<> t;
92         (void)t;
93     }
94     {
95         constexpr std::tuple<int> t;
96         assert(std::get<0>(t) == 0);
97     }
98     {
99         constexpr std::tuple<int, char*> t;
100         assert(std::get<0>(t) == 0);
101         assert(std::get<1>(t) == nullptr);
102     }
103     {
104     // Check that the SFINAE on the default constructor is not evaluated when
105     // it isn't needed. If the default constructor is evaluated then this test
106     // should fail to compile.
107         IllFormedDefault v(0);
108         std::tuple<IllFormedDefault> t(v);
109     }
110     {
111         struct Base { };
112         struct Derived : Base { protected: Derived() = default; };
113         static_assert(!std::is_default_constructible<std::tuple<Derived, int> >::value, "");
114     }
115 
116     return 0;
117 }
118