xref: /llvm-project/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.cnstr/convert_copy.pass.cpp (revision 31cbe0f240f660f15602c96b787c58a26f17e179)
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