1//===----------------------------------------------------------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10// <tuple>
11
12// template <class... Types> class tuple;
13
14// template<class... TTypes, class... UTypes>
15//   bool
16//   operator==(const tuple<TTypes...>& t, const tuple<UTypes...>& u);
17
18// UNSUPPORTED: c++98, c++03
19
20#include <tuple>
21#include <string>
22#include <cassert>
23
24#include "test_macros.h"
25
26int main()
27{
28    {
29        typedef std::tuple<> T1;
30        typedef std::tuple<> T2;
31        const T1 t1;
32        const T2 t2;
33        assert(t1 == t2);
34        assert(!(t1 != t2));
35    }
36    {
37        typedef std::tuple<int> T1;
38        typedef std::tuple<double> T2;
39        const T1 t1(1);
40        const T2 t2(1.1);
41        assert(!(t1 == t2));
42        assert(t1 != t2);
43    }
44    {
45        typedef std::tuple<int> T1;
46        typedef std::tuple<double> T2;
47        const T1 t1(1);
48        const T2 t2(1);
49        assert(t1 == t2);
50        assert(!(t1 != t2));
51    }
52    {
53        typedef std::tuple<int, double> T1;
54        typedef std::tuple<double, long> T2;
55        const T1 t1(1, 2);
56        const T2 t2(1, 2);
57        assert(t1 == t2);
58        assert(!(t1 != t2));
59    }
60    {
61        typedef std::tuple<int, double> T1;
62        typedef std::tuple<double, long> T2;
63        const T1 t1(1, 2);
64        const T2 t2(1, 3);
65        assert(!(t1 == t2));
66        assert(t1 != t2);
67    }
68    {
69        typedef std::tuple<int, double> T1;
70        typedef std::tuple<double, long> T2;
71        const T1 t1(1, 2);
72        const T2 t2(1.1, 2);
73        assert(!(t1 == t2));
74        assert(t1 != t2);
75    }
76    {
77        typedef std::tuple<int, double> T1;
78        typedef std::tuple<double, long> T2;
79        const T1 t1(1, 2);
80        const T2 t2(1.1, 3);
81        assert(!(t1 == t2));
82        assert(t1 != t2);
83    }
84    {
85        typedef std::tuple<long, int, double> T1;
86        typedef std::tuple<double, long, int> T2;
87        const T1 t1(1, 2, 3);
88        const T2 t2(1, 2, 3);
89        assert(t1 == t2);
90        assert(!(t1 != t2));
91    }
92    {
93        typedef std::tuple<long, int, double> T1;
94        typedef std::tuple<double, long, int> T2;
95        const T1 t1(1, 2, 3);
96        const T2 t2(1.1, 2, 3);
97        assert(!(t1 == t2));
98        assert(t1 != t2);
99    }
100    {
101        typedef std::tuple<long, int, double> T1;
102        typedef std::tuple<double, long, int> T2;
103        const T1 t1(1, 2, 3);
104        const T2 t2(1, 3, 3);
105        assert(!(t1 == t2));
106        assert(t1 != t2);
107    }
108    {
109        typedef std::tuple<long, int, double> T1;
110        typedef std::tuple<double, long, int> T2;
111        const T1 t1(1, 2, 3);
112        const T2 t2(1, 2, 4);
113        assert(!(t1 == t2));
114        assert(t1 != t2);
115    }
116    {
117        typedef std::tuple<long, int, double> T1;
118        typedef std::tuple<double, long, int> T2;
119        const T1 t1(1, 2, 3);
120        const T2 t2(1, 3, 2);
121        assert(!(t1 == t2));
122        assert(t1 != t2);
123    }
124    {
125        typedef std::tuple<long, int, double> T1;
126        typedef std::tuple<double, long, int> T2;
127        const T1 t1(1, 2, 3);
128        const T2 t2(1.1, 2, 2);
129        assert(!(t1 == t2));
130        assert(t1 != t2);
131    }
132    {
133        typedef std::tuple<long, int, double> T1;
134        typedef std::tuple<double, long, int> T2;
135        const T1 t1(1, 2, 3);
136        const T2 t2(1.1, 3, 3);
137        assert(!(t1 == t2));
138        assert(t1 != t2);
139    }
140    {
141        typedef std::tuple<long, int, double> T1;
142        typedef std::tuple<double, long, int> T2;
143        const T1 t1(1, 2, 3);
144        const T2 t2(1.1, 3, 2);
145        assert(!(t1 == t2));
146        assert(t1 != t2);
147    }
148#if TEST_STD_VER > 11
149    {
150        typedef std::tuple<long, int, double> T1;
151        typedef std::tuple<double, long, int> T2;
152        constexpr T1 t1(1, 2, 3);
153        constexpr T2 t2(1.1, 3, 2);
154        static_assert(!(t1 == t2), "");
155        static_assert(t1 != t2, "");
156    }
157#endif
158}
159