159cdf90aSEric Fiselier //===----------------------------------------------------------------------===//
259cdf90aSEric 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
659cdf90aSEric Fiselier //
759cdf90aSEric Fiselier //===----------------------------------------------------------------------===//
859cdf90aSEric Fiselier
959cdf90aSEric Fiselier // <array>
1059cdf90aSEric Fiselier
11*254986d2SHristo Hristov // template <class T, size_t N>
12*254986d2SHristo Hristov // bool operator==(const array<T,N>& x, const array<T,N>& y); // constexpr in C++20
13*254986d2SHristo Hristov // template <class T, size_t N>
14*254986d2SHristo Hristov // bool operator!=(const array<T,N>& x, const array<T,N>& y); // removed in C++20
15*254986d2SHristo Hristov // template <class T, size_t N>
16*254986d2SHristo Hristov // bool operator<(const array<T,N>& x, const array<T,N>& y); // removed in C++20
17*254986d2SHristo Hristov // template <class T, size_t N>
18*254986d2SHristo Hristov // bool operator>(const array<T,N>& x, const array<T,N>& y); // removed in C++20
19*254986d2SHristo Hristov // template <class T, size_t N>
20*254986d2SHristo Hristov // bool operator<=(const array<T,N>& x, const array<T,N>& y); // removed in C++20
21*254986d2SHristo Hristov // template <class T, size_t N>
22*254986d2SHristo Hristov // bool operator>=(const array<T,N>& x, const array<T,N>& y); // removed in C++20
2359cdf90aSEric Fiselier
2459cdf90aSEric Fiselier #include <array>
2559cdf90aSEric Fiselier #include <cassert>
2659cdf90aSEric Fiselier
2759cdf90aSEric Fiselier #include "test_macros.h"
287c84e381SMarshall Clow #include "test_comparisons.h"
2959cdf90aSEric Fiselier
tests()30*254986d2SHristo Hristov TEST_CONSTEXPR_CXX20 bool tests() {
31*254986d2SHristo Hristov // Arrays where the elements support all comparison operators
32*254986d2SHristo Hristov AssertComparisonsReturnBool<std::array<int, 3> >();
3359cdf90aSEric Fiselier {
3477b9abfcSLouis Dionne typedef std::array<int, 3> C;
35d7ac595fSKonstantin Boyarinov const C c1 = {1, 2, 3};
36d7ac595fSKonstantin Boyarinov const C c2 = {1, 2, 3};
37d7ac595fSKonstantin Boyarinov const C c3 = {3, 2, 1};
38d7ac595fSKonstantin Boyarinov const C c4 = {1, 2, 1};
39984f5f3fSMark de Wever assert(testComparisons(c1, c2, true, false));
40984f5f3fSMark de Wever assert(testComparisons(c1, c3, false, true));
41984f5f3fSMark de Wever assert(testComparisons(c1, c4, false, false));
4259cdf90aSEric Fiselier }
43*254986d2SHristo Hristov // Empty array
4459cdf90aSEric Fiselier {
4577b9abfcSLouis Dionne typedef std::array<int, 0> C;
46d7ac595fSKonstantin Boyarinov const C c1 = {};
47d7ac595fSKonstantin Boyarinov const C c2 = {};
48984f5f3fSMark de Wever assert(testComparisons(c1, c2, true, false));
49d7ac595fSKonstantin Boyarinov }
50*254986d2SHristo Hristov // Arrays where the elements support only less and equality comparisons
51*254986d2SHristo Hristov AssertComparisonsReturnBool<std::array<LessAndEqComp, 3> >();
52d7ac595fSKonstantin Boyarinov {
53d7ac595fSKonstantin Boyarinov typedef std::array<LessAndEqComp, 3> C;
54d7ac595fSKonstantin Boyarinov const C c1 = {LessAndEqComp(1), LessAndEqComp(2), LessAndEqComp(3)};
55d7ac595fSKonstantin Boyarinov const C c2 = {LessAndEqComp(1), LessAndEqComp(2), LessAndEqComp(3)};
56d7ac595fSKonstantin Boyarinov const C c3 = {LessAndEqComp(3), LessAndEqComp(2), LessAndEqComp(1)};
57d7ac595fSKonstantin Boyarinov const C c4 = {LessAndEqComp(1), LessAndEqComp(2), LessAndEqComp(1)};
58984f5f3fSMark de Wever assert(testComparisons(c1, c2, true, false));
59984f5f3fSMark de Wever assert(testComparisons(c1, c3, false, true));
60984f5f3fSMark de Wever assert(testComparisons(c1, c4, false, false));
61d7ac595fSKonstantin Boyarinov }
62*254986d2SHristo Hristov // Empty array where the elements support only less and equality comparisons
63d7ac595fSKonstantin Boyarinov {
64d7ac595fSKonstantin Boyarinov typedef std::array<LessAndEqComp, 0> C;
65d7ac595fSKonstantin Boyarinov const C c1 = {};
66d7ac595fSKonstantin Boyarinov const C c2 = {};
67984f5f3fSMark de Wever assert(testComparisons(c1, c2, true, false));
6859cdf90aSEric Fiselier }
6907d8ac0aSMarshall Clow
7077b9abfcSLouis Dionne return true;
7107d8ac0aSMarshall Clow }
722df59c50SJF Bastien
main(int,char **)73*254986d2SHristo Hristov int main(int, char**) {
7477b9abfcSLouis Dionne tests();
7577b9abfcSLouis Dionne #if TEST_STD_VER >= 20
76*254986d2SHristo Hristov static_assert(tests());
7777b9abfcSLouis Dionne #endif
782df59c50SJF Bastien return 0;
7959cdf90aSEric Fiselier }
80