15a83710eSEric Fiselier //===----------------------------------------------------------------------===//
25a83710eSEric Fiselier //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65a83710eSEric Fiselier //
75a83710eSEric Fiselier //===----------------------------------------------------------------------===//
85a83710eSEric Fiselier
95a83710eSEric Fiselier // <tuple>
105a83710eSEric Fiselier
115a83710eSEric Fiselier // template <class... Types> class tuple;
125a83710eSEric Fiselier
135a83710eSEric Fiselier // template <class... UTypes> tuple(const tuple<UTypes...>& u);
145a83710eSEric Fiselier
15*31cbe0f2SLouis Dionne // UNSUPPORTED: c++03
160a52cd79SEric Fiselier
175a83710eSEric Fiselier #include <tuple>
18e21582e7SMarshall Clow #include <utility>
195a83710eSEric Fiselier #include <string>
205a83710eSEric Fiselier #include <cassert>
215a83710eSEric Fiselier
220f901c7eSStephan T. Lavavej #include "test_macros.h"
230f901c7eSStephan T. Lavavej
249795699aSEric Fiselier struct Explicit {
259795699aSEric Fiselier int value;
ExplicitExplicit269795699aSEric Fiselier explicit Explicit(int x) : value(x) {}
279795699aSEric Fiselier };
289795699aSEric Fiselier
299795699aSEric Fiselier struct Implicit {
309795699aSEric Fiselier int value;
ImplicitImplicit319795699aSEric Fiselier Implicit(int x) : value(x) {}
329795699aSEric Fiselier };
339795699aSEric Fiselier
34882fdf68SEric Fiselier struct ExplicitTwo {
ExplicitTwoExplicitTwo35882fdf68SEric Fiselier ExplicitTwo() {}
ExplicitTwoExplicitTwo36882fdf68SEric Fiselier ExplicitTwo(ExplicitTwo const&) {}
ExplicitTwoExplicitTwo37882fdf68SEric Fiselier ExplicitTwo(ExplicitTwo &&) {}
38882fdf68SEric Fiselier
39882fdf68SEric Fiselier template <class T, class = typename std::enable_if<!std::is_same<T, ExplicitTwo>::value>::type>
ExplicitTwoExplicitTwo40882fdf68SEric Fiselier explicit ExplicitTwo(T) {}
41882fdf68SEric Fiselier };
42882fdf68SEric Fiselier
435a83710eSEric Fiselier struct B
445a83710eSEric Fiselier {
455a83710eSEric Fiselier int id_;
465a83710eSEric Fiselier
BB475a83710eSEric Fiselier explicit B(int i) : id_(i) {}
485a83710eSEric Fiselier };
495a83710eSEric Fiselier
505a83710eSEric Fiselier struct D
515a83710eSEric Fiselier : B
525a83710eSEric Fiselier {
DD535a83710eSEric Fiselier explicit D(int i) : B(i) {}
545a83710eSEric Fiselier };
555a83710eSEric Fiselier
560f901c7eSStephan T. Lavavej #if TEST_STD_VER > 11
575a83710eSEric Fiselier
585a83710eSEric Fiselier struct A
595a83710eSEric Fiselier {
605a83710eSEric Fiselier int id_;
615a83710eSEric Fiselier
AA625a83710eSEric Fiselier constexpr A(int i) : id_(i) {}
operator ==(const A & x,const A & y)635a83710eSEric Fiselier friend constexpr bool operator==(const A& x, const A& y) {return x.id_ == y.id_;}
645a83710eSEric Fiselier };
655a83710eSEric Fiselier
665a83710eSEric Fiselier struct C
675a83710eSEric Fiselier {
685a83710eSEric Fiselier int id_;
695a83710eSEric Fiselier
CC705a83710eSEric Fiselier constexpr explicit C(int i) : id_(i) {}
operator ==(const C & x,const C & y)715a83710eSEric Fiselier friend constexpr bool operator==(const C& x, const C& y) {return x.id_ == y.id_;}
725a83710eSEric Fiselier };
735a83710eSEric Fiselier
745a83710eSEric Fiselier #endif
755a83710eSEric Fiselier
main(int,char **)762df59c50SJF Bastien int main(int, char**)
775a83710eSEric Fiselier {
785a83710eSEric Fiselier {
79a0d87857SStephan T. Lavavej typedef std::tuple<long> T0;
80a0d87857SStephan T. Lavavej typedef std::tuple<long long> T1;
81a0d87857SStephan T. Lavavej T0 t0(2);
825a83710eSEric Fiselier T1 t1 = t0;
835a83710eSEric Fiselier assert(std::get<0>(t1) == 2);
845a83710eSEric Fiselier }
850f901c7eSStephan T. Lavavej #if TEST_STD_VER > 11
865a83710eSEric Fiselier {
87a0d87857SStephan T. Lavavej typedef std::tuple<int> T0;
885a83710eSEric Fiselier typedef std::tuple<A> T1;
89a0d87857SStephan T. Lavavej constexpr T0 t0(2);
905a83710eSEric Fiselier constexpr T1 t1 = t0;
915a83710eSEric Fiselier static_assert(std::get<0>(t1) == 2, "");
925a83710eSEric Fiselier }
935a83710eSEric Fiselier {
945a83710eSEric Fiselier typedef std::tuple<int> T0;
955a83710eSEric Fiselier typedef std::tuple<C> T1;
965a83710eSEric Fiselier constexpr T0 t0(2);
975a83710eSEric Fiselier constexpr T1 t1{t0};
985a83710eSEric Fiselier static_assert(std::get<0>(t1) == C(2), "");
995a83710eSEric Fiselier }
1005a83710eSEric Fiselier #endif
1015a83710eSEric Fiselier {
102a0d87857SStephan T. Lavavej typedef std::tuple<long, char> T0;
103a0d87857SStephan T. Lavavej typedef std::tuple<long long, int> T1;
104a0d87857SStephan T. Lavavej T0 t0(2, 'a');
1055a83710eSEric Fiselier T1 t1 = t0;
1065a83710eSEric Fiselier assert(std::get<0>(t1) == 2);
1075a83710eSEric Fiselier assert(std::get<1>(t1) == int('a'));
1085a83710eSEric Fiselier }
1095a83710eSEric Fiselier {
110a0d87857SStephan T. Lavavej typedef std::tuple<long, char, D> T0;
111a0d87857SStephan T. Lavavej typedef std::tuple<long long, int, B> T1;
112a0d87857SStephan T. Lavavej T0 t0(2, 'a', D(3));
1135a83710eSEric Fiselier T1 t1 = t0;
1145a83710eSEric Fiselier assert(std::get<0>(t1) == 2);
1155a83710eSEric Fiselier assert(std::get<1>(t1) == int('a'));
1165a83710eSEric Fiselier assert(std::get<2>(t1).id_ == 3);
1175a83710eSEric Fiselier }
1185a83710eSEric Fiselier {
1195a83710eSEric Fiselier D d(3);
120a0d87857SStephan T. Lavavej typedef std::tuple<long, char, D&> T0;
121a0d87857SStephan T. Lavavej typedef std::tuple<long long, int, B&> T1;
122a0d87857SStephan T. Lavavej T0 t0(2, 'a', d);
1235a83710eSEric Fiselier T1 t1 = t0;
1245a83710eSEric Fiselier d.id_ = 2;
1255a83710eSEric Fiselier assert(std::get<0>(t1) == 2);
1265a83710eSEric Fiselier assert(std::get<1>(t1) == int('a'));
1275a83710eSEric Fiselier assert(std::get<2>(t1).id_ == 2);
1285a83710eSEric Fiselier }
1295a83710eSEric Fiselier {
130a0d87857SStephan T. Lavavej typedef std::tuple<long, char, int> T0;
131a0d87857SStephan T. Lavavej typedef std::tuple<long long, int, B> T1;
132a0d87857SStephan T. Lavavej T0 t0(2, 'a', 3);
1335a83710eSEric Fiselier T1 t1(t0);
1345a83710eSEric Fiselier assert(std::get<0>(t1) == 2);
1355a83710eSEric Fiselier assert(std::get<1>(t1) == int('a'));
1365a83710eSEric Fiselier assert(std::get<2>(t1).id_ == 3);
1375a83710eSEric Fiselier }
1389795699aSEric Fiselier {
1399795699aSEric Fiselier const std::tuple<int> t1(42);
1409795699aSEric Fiselier std::tuple<Explicit> t2(t1);
1419795699aSEric Fiselier assert(std::get<0>(t2).value == 42);
1429795699aSEric Fiselier }
1439795699aSEric Fiselier {
1449795699aSEric Fiselier const std::tuple<int> t1(42);
1459795699aSEric Fiselier std::tuple<Implicit> t2 = t1;
1469795699aSEric Fiselier assert(std::get<0>(t2).value == 42);
1479795699aSEric Fiselier }
148882fdf68SEric Fiselier {
149882fdf68SEric Fiselier static_assert(std::is_convertible<ExplicitTwo&&, ExplicitTwo>::value, "");
150882fdf68SEric Fiselier static_assert(std::is_convertible<std::tuple<ExplicitTwo&&>&&, const std::tuple<ExplicitTwo>&>::value, "");
1512df59c50SJF Bastien
152882fdf68SEric Fiselier ExplicitTwo e;
153882fdf68SEric Fiselier std::tuple<ExplicitTwo> t = std::tuple<ExplicitTwo&&>(std::move(e));
154882fdf68SEric Fiselier ((void)t);
155882fdf68SEric Fiselier }
1562df59c50SJF Bastien return 0;
1575a83710eSEric Fiselier }
158