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 // <array>
11 
12 // bool operator==(array<T, N> const&, array<T, N> const&);
13 // bool operator!=(array<T, N> const&, array<T, N> const&);
14 // bool operator<(array<T, N> const&, array<T, N> const&);
15 // bool operator<=(array<T, N> const&, array<T, N> const&);
16 // bool operator>(array<T, N> const&, array<T, N> const&);
17 // bool operator>=(array<T, N> const&, array<T, N> const&);
18 
19 
20 #include <array>
21 #include <vector>
22 #include <cassert>
23 
24 #include "test_macros.h"
25 
26 // std::array is explicitly allowed to be initialized with A a = { init-list };.
27 // Disable the missing braces warning for this reason.
28 #include "disable_missing_braces_warning.h"
29 
30 template <class Array>
test_compare(const Array & LHS,const Array & RHS)31 void test_compare(const Array& LHS, const Array& RHS) {
32   typedef std::vector<typename Array::value_type> Vector;
33   const Vector LHSV(LHS.begin(), LHS.end());
34   const Vector RHSV(RHS.begin(), RHS.end());
35   assert((LHS == RHS) == (LHSV == RHSV));
36   assert((LHS != RHS) == (LHSV != RHSV));
37   assert((LHS < RHS) == (LHSV < RHSV));
38   assert((LHS <= RHS) == (LHSV <= RHSV));
39   assert((LHS > RHS) == (LHSV > RHSV));
40   assert((LHS >= RHS) == (LHSV >= RHSV));
41 }
42 
43 template <int Dummy> struct NoCompare {};
44 
main()45 int main()
46 {
47   {
48     typedef NoCompare<0> T;
49     typedef std::array<T, 3> C;
50     C c1 = {{}};
51     // expected-error@algorithm:* 2 {{invalid operands to binary expression}}
52     TEST_IGNORE_NODISCARD (c1 == c1);
53     TEST_IGNORE_NODISCARD (c1 < c1);
54   }
55   {
56     typedef NoCompare<1> T;
57     typedef std::array<T, 3> C;
58     C c1 = {{}};
59     // expected-error@algorithm:* 2 {{invalid operands to binary expression}}
60     TEST_IGNORE_NODISCARD (c1 != c1);
61     TEST_IGNORE_NODISCARD (c1 > c1);
62   }
63   {
64     typedef NoCompare<2> T;
65     typedef std::array<T, 0> C;
66     C c1 = {{}};
67     // expected-error@algorithm:* 2 {{invalid operands to binary expression}}
68     TEST_IGNORE_NODISCARD (c1 == c1);
69     TEST_IGNORE_NODISCARD (c1 < c1);
70   }
71 }
72