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... TTypes, class... UTypes>
145a83710eSEric Fiselier // bool
155a83710eSEric Fiselier // operator==(const tuple<TTypes...>& t, const tuple<UTypes...>& u);
165a83710eSEric Fiselier
17*31cbe0f2SLouis Dionne // UNSUPPORTED: c++03
180a52cd79SEric Fiselier
195a83710eSEric Fiselier #include <tuple>
205a83710eSEric Fiselier #include <string>
215a83710eSEric Fiselier #include <cassert>
225a83710eSEric Fiselier
230f901c7eSStephan T. Lavavej #include "test_macros.h"
240f901c7eSStephan T. Lavavej
main(int,char **)252df59c50SJF Bastien int main(int, char**)
265a83710eSEric Fiselier {
275a83710eSEric Fiselier {
285a83710eSEric Fiselier typedef std::tuple<> T1;
295a83710eSEric Fiselier typedef std::tuple<> T2;
305a83710eSEric Fiselier const T1 t1;
315a83710eSEric Fiselier const T2 t2;
325a83710eSEric Fiselier assert(t1 == t2);
335a83710eSEric Fiselier assert(!(t1 != t2));
345a83710eSEric Fiselier }
355a83710eSEric Fiselier {
365a83710eSEric Fiselier typedef std::tuple<int> T1;
375a83710eSEric Fiselier typedef std::tuple<double> T2;
385a83710eSEric Fiselier const T1 t1(1);
395a83710eSEric Fiselier const T2 t2(1.1);
405a83710eSEric Fiselier assert(!(t1 == t2));
415a83710eSEric Fiselier assert(t1 != t2);
425a83710eSEric Fiselier }
435a83710eSEric Fiselier {
445a83710eSEric Fiselier typedef std::tuple<int> T1;
455a83710eSEric Fiselier typedef std::tuple<double> T2;
465a83710eSEric Fiselier const T1 t1(1);
475a83710eSEric Fiselier const T2 t2(1);
485a83710eSEric Fiselier assert(t1 == t2);
495a83710eSEric Fiselier assert(!(t1 != t2));
505a83710eSEric Fiselier }
515a83710eSEric Fiselier {
525a83710eSEric Fiselier typedef std::tuple<int, double> T1;
5384ade982SStephan T. Lavavej typedef std::tuple<double, long> T2;
545a83710eSEric Fiselier const T1 t1(1, 2);
5584ade982SStephan T. Lavavej const T2 t2(1, 2);
565a83710eSEric Fiselier assert(t1 == t2);
575a83710eSEric Fiselier assert(!(t1 != t2));
585a83710eSEric Fiselier }
595a83710eSEric Fiselier {
605a83710eSEric Fiselier typedef std::tuple<int, double> T1;
6184ade982SStephan T. Lavavej typedef std::tuple<double, long> T2;
625a83710eSEric Fiselier const T1 t1(1, 2);
6384ade982SStephan T. Lavavej const T2 t2(1, 3);
645a83710eSEric Fiselier assert(!(t1 == t2));
655a83710eSEric Fiselier assert(t1 != t2);
665a83710eSEric Fiselier }
675a83710eSEric Fiselier {
685a83710eSEric Fiselier typedef std::tuple<int, double> T1;
6984ade982SStephan T. Lavavej typedef std::tuple<double, long> T2;
705a83710eSEric Fiselier const T1 t1(1, 2);
7184ade982SStephan T. Lavavej const T2 t2(1.1, 2);
725a83710eSEric Fiselier assert(!(t1 == t2));
735a83710eSEric Fiselier assert(t1 != t2);
745a83710eSEric Fiselier }
755a83710eSEric Fiselier {
765a83710eSEric Fiselier typedef std::tuple<int, double> T1;
7784ade982SStephan T. Lavavej typedef std::tuple<double, long> T2;
785a83710eSEric Fiselier const T1 t1(1, 2);
7984ade982SStephan T. Lavavej const T2 t2(1.1, 3);
805a83710eSEric Fiselier assert(!(t1 == t2));
815a83710eSEric Fiselier assert(t1 != t2);
825a83710eSEric Fiselier }
835a83710eSEric Fiselier {
8484ade982SStephan T. Lavavej typedef std::tuple<long, int, double> T1;
8584ade982SStephan T. Lavavej typedef std::tuple<double, long, int> T2;
865a83710eSEric Fiselier const T1 t1(1, 2, 3);
875a83710eSEric Fiselier const T2 t2(1, 2, 3);
885a83710eSEric Fiselier assert(t1 == t2);
895a83710eSEric Fiselier assert(!(t1 != t2));
905a83710eSEric Fiselier }
915a83710eSEric Fiselier {
9284ade982SStephan T. Lavavej typedef std::tuple<long, int, double> T1;
9384ade982SStephan T. Lavavej typedef std::tuple<double, long, int> T2;
945a83710eSEric Fiselier const T1 t1(1, 2, 3);
955a83710eSEric Fiselier const T2 t2(1.1, 2, 3);
965a83710eSEric Fiselier assert(!(t1 == t2));
975a83710eSEric Fiselier assert(t1 != t2);
985a83710eSEric Fiselier }
995a83710eSEric Fiselier {
10084ade982SStephan T. Lavavej typedef std::tuple<long, int, double> T1;
10184ade982SStephan T. Lavavej typedef std::tuple<double, long, int> T2;
1025a83710eSEric Fiselier const T1 t1(1, 2, 3);
1035a83710eSEric Fiselier const T2 t2(1, 3, 3);
1045a83710eSEric Fiselier assert(!(t1 == t2));
1055a83710eSEric Fiselier assert(t1 != t2);
1065a83710eSEric Fiselier }
1075a83710eSEric Fiselier {
10884ade982SStephan T. Lavavej typedef std::tuple<long, int, double> T1;
10984ade982SStephan T. Lavavej typedef std::tuple<double, long, int> T2;
1105a83710eSEric Fiselier const T1 t1(1, 2, 3);
1115a83710eSEric Fiselier const T2 t2(1, 2, 4);
1125a83710eSEric Fiselier assert(!(t1 == t2));
1135a83710eSEric Fiselier assert(t1 != t2);
1145a83710eSEric Fiselier }
1155a83710eSEric Fiselier {
11684ade982SStephan T. Lavavej typedef std::tuple<long, int, double> T1;
11784ade982SStephan T. Lavavej typedef std::tuple<double, long, int> T2;
1185a83710eSEric Fiselier const T1 t1(1, 2, 3);
1195a83710eSEric Fiselier const T2 t2(1, 3, 2);
1205a83710eSEric Fiselier assert(!(t1 == t2));
1215a83710eSEric Fiselier assert(t1 != t2);
1225a83710eSEric Fiselier }
1235a83710eSEric Fiselier {
12484ade982SStephan T. Lavavej typedef std::tuple<long, int, double> T1;
12584ade982SStephan T. Lavavej typedef std::tuple<double, long, int> T2;
1265a83710eSEric Fiselier const T1 t1(1, 2, 3);
1275a83710eSEric Fiselier const T2 t2(1.1, 2, 2);
1285a83710eSEric Fiselier assert(!(t1 == t2));
1295a83710eSEric Fiselier assert(t1 != t2);
1305a83710eSEric Fiselier }
1315a83710eSEric Fiselier {
13284ade982SStephan T. Lavavej typedef std::tuple<long, int, double> T1;
13384ade982SStephan T. Lavavej typedef std::tuple<double, long, int> T2;
1345a83710eSEric Fiselier const T1 t1(1, 2, 3);
1355a83710eSEric Fiselier const T2 t2(1.1, 3, 3);
1365a83710eSEric Fiselier assert(!(t1 == t2));
1375a83710eSEric Fiselier assert(t1 != t2);
1385a83710eSEric Fiselier }
1395a83710eSEric Fiselier {
14084ade982SStephan T. Lavavej typedef std::tuple<long, int, double> T1;
14184ade982SStephan T. Lavavej typedef std::tuple<double, long, int> T2;
1425a83710eSEric Fiselier const T1 t1(1, 2, 3);
1435a83710eSEric Fiselier const T2 t2(1.1, 3, 2);
1445a83710eSEric Fiselier assert(!(t1 == t2));
1455a83710eSEric Fiselier assert(t1 != t2);
1465a83710eSEric Fiselier }
1470f901c7eSStephan T. Lavavej #if TEST_STD_VER > 11
1485a83710eSEric Fiselier {
14984ade982SStephan T. Lavavej typedef std::tuple<long, int, double> T1;
15084ade982SStephan T. Lavavej typedef std::tuple<double, long, int> T2;
1515a83710eSEric Fiselier constexpr T1 t1(1, 2, 3);
1525a83710eSEric Fiselier constexpr T2 t2(1.1, 3, 2);
1535a83710eSEric Fiselier static_assert(!(t1 == t2), "");
1545a83710eSEric Fiselier static_assert(t1 != t2, "");
1555a83710eSEric Fiselier }
1565a83710eSEric Fiselier #endif
1572df59c50SJF Bastien
1582df59c50SJF Bastien return 0;
1595a83710eSEric Fiselier }
160