1*b82dcb62SLouis Dionne //===----------------------------------------------------------------------===//
2*b82dcb62SLouis Dionne //
3*b82dcb62SLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*b82dcb62SLouis Dionne // See https://llvm.org/LICENSE.txt for license information.
5*b82dcb62SLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*b82dcb62SLouis Dionne //
7*b82dcb62SLouis Dionne //===----------------------------------------------------------------------===//
8*b82dcb62SLouis Dionne
9*b82dcb62SLouis Dionne // UNSUPPORTED: c++03, c++11, c++14, c++17
10*b82dcb62SLouis Dionne
11*b82dcb62SLouis Dionne // <utility>
12*b82dcb62SLouis Dionne
13*b82dcb62SLouis Dionne // template<class T, class U>
14*b82dcb62SLouis Dionne // constexpr bool cmp_equal(T t, U u) noexcept; // C++20
15*b82dcb62SLouis Dionne
16*b82dcb62SLouis Dionne // template<class T, class U>
17*b82dcb62SLouis Dionne // constexpr bool cmp_not_equal(T t, U u) noexcept; // C++20
18*b82dcb62SLouis Dionne
19*b82dcb62SLouis Dionne // template<class T, class U>
20*b82dcb62SLouis Dionne // constexpr bool cmp_less(T t, U u) noexcept; // C++20
21*b82dcb62SLouis Dionne
22*b82dcb62SLouis Dionne // template<class T, class U>
23*b82dcb62SLouis Dionne // constexpr bool cmp_less_equal(T t, U u) noexcept; // C++20
24*b82dcb62SLouis Dionne
25*b82dcb62SLouis Dionne // template<class T, class U>
26*b82dcb62SLouis Dionne // constexpr bool cmp_greater(T t, U u) noexcept; // C++20
27*b82dcb62SLouis Dionne
28*b82dcb62SLouis Dionne // template<class T, class U>
29*b82dcb62SLouis Dionne // constexpr bool cmp_greater_equal(T t, U u) noexcept; // C++20
30*b82dcb62SLouis Dionne
31*b82dcb62SLouis Dionne // template<class R, class T>
32*b82dcb62SLouis Dionne // constexpr bool in_range(T t) noexcept; // C++20
33*b82dcb62SLouis Dionne
34*b82dcb62SLouis Dionne #include <utility>
35*b82dcb62SLouis Dionne #include <cstddef>
36*b82dcb62SLouis Dionne
37*b82dcb62SLouis Dionne #include "test_macros.h"
38*b82dcb62SLouis Dionne
39*b82dcb62SLouis Dionne struct NonEmptyT {
40*b82dcb62SLouis Dionne int val;
NonEmptyTNonEmptyT41*b82dcb62SLouis Dionne NonEmptyT() : val(0) {}
NonEmptyTNonEmptyT42*b82dcb62SLouis Dionne NonEmptyT(int val) : val(val) {}
operator int&NonEmptyT43*b82dcb62SLouis Dionne operator int&() { return val; }
operator intNonEmptyT44*b82dcb62SLouis Dionne operator int() const { return val; }
45*b82dcb62SLouis Dionne };
46*b82dcb62SLouis Dionne
47*b82dcb62SLouis Dionne enum ColorT { red, green, blue };
48*b82dcb62SLouis Dionne
49*b82dcb62SLouis Dionne struct EmptyT {};
50*b82dcb62SLouis Dionne
51*b82dcb62SLouis Dionne template <class T>
test()52*b82dcb62SLouis Dionne constexpr void test() {
53*b82dcb62SLouis Dionne std::cmp_equal(T(), T()); // expected-error 10-11 {{no matching function for call to 'cmp_equal'}}
54*b82dcb62SLouis Dionne std::cmp_equal(T(), int()); // expected-error 10-11 {{no matching function for call to 'cmp_equal'}}
55*b82dcb62SLouis Dionne std::cmp_equal(int(), T()); // expected-error 10-11 {{no matching function for call to 'cmp_equal'}}
56*b82dcb62SLouis Dionne std::cmp_not_equal(T(), T()); // expected-error 10-11 {{no matching function for call to 'cmp_not_equal'}}
57*b82dcb62SLouis Dionne std::cmp_not_equal(T(), int()); // expected-error 10-11 {{no matching function for call to 'cmp_not_equal'}}
58*b82dcb62SLouis Dionne std::cmp_not_equal(int(), T()); // expected-error 10-11 {{no matching function for call to 'cmp_not_equal'}}
59*b82dcb62SLouis Dionne std::cmp_less(T(), T()); // expected-error 10-11 {{no matching function for call to 'cmp_less'}}
60*b82dcb62SLouis Dionne std::cmp_less(T(), int()); // expected-error 10-11 {{no matching function for call to 'cmp_less'}}
61*b82dcb62SLouis Dionne std::cmp_less(int(), T()); // expected-error 10-11 {{no matching function for call to 'cmp_less'}}
62*b82dcb62SLouis Dionne std::cmp_less_equal(T(), T()); // expected-error 10-11 {{no matching function for call to 'cmp_less_equal'}}
63*b82dcb62SLouis Dionne std::cmp_less_equal(T(), int()); // expected-error 10-11 {{no matching function for call to 'cmp_less_equal'}}
64*b82dcb62SLouis Dionne std::cmp_less_equal(int(), T()); // expected-error 10-11 {{no matching function for call to 'cmp_less_equal'}}
65*b82dcb62SLouis Dionne std::cmp_greater(T(), T()); // expected-error 10-11 {{no matching function for call to 'cmp_greater'}}
66*b82dcb62SLouis Dionne std::cmp_greater(T(), int()); // expected-error 10-11 {{no matching function for call to 'cmp_greater'}}
67*b82dcb62SLouis Dionne std::cmp_greater(int(), T()); // expected-error 10-11 {{no matching function for call to 'cmp_greater'}}
68*b82dcb62SLouis Dionne std::cmp_greater_equal(T(), T()); // expected-error 10-11 {{no matching function for call to 'cmp_greater_equal'}}
69*b82dcb62SLouis Dionne std::cmp_greater_equal(T(), int()); // expected-error 10-11 {{no matching function for call to 'cmp_greater_equal'}}
70*b82dcb62SLouis Dionne std::cmp_greater_equal(int(), T()); // expected-error 10-11 {{no matching function for call to 'cmp_greater_equal'}}
71*b82dcb62SLouis Dionne std::in_range<T>(int()); // expected-error 10-11 {{no matching function for call to 'in_range'}}
72*b82dcb62SLouis Dionne std::in_range<int>(T()); // expected-error 10-11 {{no matching function for call to 'in_range'}}
73*b82dcb62SLouis Dionne }
74*b82dcb62SLouis Dionne #ifndef TEST_HAS_NO_CHAR8_T
75*b82dcb62SLouis Dionne template <class T>
test_char8t()76*b82dcb62SLouis Dionne constexpr void test_char8t() {
77*b82dcb62SLouis Dionne std::cmp_equal(T(), T()); // expected-error 1 {{no matching function for call to 'cmp_equal'}}
78*b82dcb62SLouis Dionne std::cmp_equal(T(), int()); // expected-error 1 {{no matching function for call to 'cmp_equal'}}
79*b82dcb62SLouis Dionne std::cmp_equal(int(), T()); // expected-error 1 {{no matching function for call to 'cmp_equal'}}
80*b82dcb62SLouis Dionne std::cmp_not_equal(T(), T()); // expected-error 1 {{no matching function for call to 'cmp_not_equal'}}
81*b82dcb62SLouis Dionne std::cmp_not_equal(T(), int()); // expected-error 1 {{no matching function for call to 'cmp_not_equal'}}
82*b82dcb62SLouis Dionne std::cmp_not_equal(int(), T()); // expected-error 1 {{no matching function for call to 'cmp_not_equal'}}
83*b82dcb62SLouis Dionne std::cmp_less(T(), T()); // expected-error 1 {{no matching function for call to 'cmp_less'}}
84*b82dcb62SLouis Dionne std::cmp_less(T(), int()); // expected-error 1 {{no matching function for call to 'cmp_less'}}
85*b82dcb62SLouis Dionne std::cmp_less(int(), T()); // expected-error 1 {{no matching function for call to 'cmp_less'}}
86*b82dcb62SLouis Dionne std::cmp_less_equal(T(), T()); // expected-error 1 {{no matching function for call to 'cmp_less_equal'}}
87*b82dcb62SLouis Dionne std::cmp_less_equal(T(), int()); // expected-error 1 {{no matching function for call to 'cmp_less_equal'}}
88*b82dcb62SLouis Dionne std::cmp_less_equal(int(), T()); // expected-error 1 {{no matching function for call to 'cmp_less_equal'}}
89*b82dcb62SLouis Dionne std::cmp_greater(T(), T()); // expected-error 1 {{no matching function for call to 'cmp_greater'}}
90*b82dcb62SLouis Dionne std::cmp_greater(T(), int()); // expected-error 1 {{no matching function for call to 'cmp_greater'}}
91*b82dcb62SLouis Dionne std::cmp_greater(int(), T()); // expected-error 1 {{no matching function for call to 'cmp_greater'}}
92*b82dcb62SLouis Dionne std::cmp_greater_equal(T(), T()); // expected-error 1 {{no matching function for call to 'cmp_greater_equal'}}
93*b82dcb62SLouis Dionne std::cmp_greater_equal(T(), int()); // expected-error 1 {{no matching function for call to 'cmp_greater_equal'}}
94*b82dcb62SLouis Dionne std::cmp_greater_equal(int(), T()); // expected-error 1 {{no matching function for call to 'cmp_greater_equal'}}
95*b82dcb62SLouis Dionne std::in_range<T>(int()); // expected-error 1 {{no matching function for call to 'in_range'}}
96*b82dcb62SLouis Dionne std::in_range<int>(T()); // expected-error 1 {{no matching function for call to 'in_range'}}
97*b82dcb62SLouis Dionne }
98*b82dcb62SLouis Dionne #endif // TEST_HAS_NO_CHAR8_T
99*b82dcb62SLouis Dionne
100*b82dcb62SLouis Dionne template <class T>
test_uchars()101*b82dcb62SLouis Dionne constexpr void test_uchars() {
102*b82dcb62SLouis Dionne std::cmp_equal(T(), T()); // expected-error 2 {{no matching function for call to 'cmp_equal'}}
103*b82dcb62SLouis Dionne std::cmp_equal(T(), int()); // expected-error 2 {{no matching function for call to 'cmp_equal'}}
104*b82dcb62SLouis Dionne std::cmp_equal(int(), T()); // expected-error 2 {{no matching function for call to 'cmp_equal'}}
105*b82dcb62SLouis Dionne std::cmp_not_equal(T(), T()); // expected-error 2 {{no matching function for call to 'cmp_not_equal'}}
106*b82dcb62SLouis Dionne std::cmp_not_equal(T(), int()); // expected-error 2 {{no matching function for call to 'cmp_not_equal'}}
107*b82dcb62SLouis Dionne std::cmp_not_equal(int(), T()); // expected-error 2 {{no matching function for call to 'cmp_not_equal'}}
108*b82dcb62SLouis Dionne std::cmp_less(T(), T()); // expected-error 2 {{no matching function for call to 'cmp_less'}}
109*b82dcb62SLouis Dionne std::cmp_less(T(), int()); // expected-error 2 {{no matching function for call to 'cmp_less'}}
110*b82dcb62SLouis Dionne std::cmp_less(int(), T()); // expected-error 2 {{no matching function for call to 'cmp_less'}}
111*b82dcb62SLouis Dionne std::cmp_less_equal(T(), T()); // expected-error 2 {{no matching function for call to 'cmp_less_equal'}}
112*b82dcb62SLouis Dionne std::cmp_less_equal(T(), int()); // expected-error 2 {{no matching function for call to 'cmp_less_equal'}}
113*b82dcb62SLouis Dionne std::cmp_less_equal(int(), T()); // expected-error 2 {{no matching function for call to 'cmp_less_equal'}}
114*b82dcb62SLouis Dionne std::cmp_greater(T(), T()); // expected-error 2 {{no matching function for call to 'cmp_greater'}}
115*b82dcb62SLouis Dionne std::cmp_greater(T(), int()); // expected-error 2 {{no matching function for call to 'cmp_greater'}}
116*b82dcb62SLouis Dionne std::cmp_greater(int(), T()); // expected-error 2 {{no matching function for call to 'cmp_greater'}}
117*b82dcb62SLouis Dionne std::cmp_greater_equal(T(), T()); // expected-error 2 {{no matching function for call to 'cmp_greater_equal'}}
118*b82dcb62SLouis Dionne std::cmp_greater_equal(T(), int()); // expected-error 2 {{no matching function for call to 'cmp_greater_equal'}}
119*b82dcb62SLouis Dionne std::cmp_greater_equal(int(), T()); // expected-error 2 {{no matching function for call to 'cmp_greater_equal'}}
120*b82dcb62SLouis Dionne std::in_range<T>(int()); // expected-error 2 {{no matching function for call to 'in_range'}}
121*b82dcb62SLouis Dionne std::in_range<int>(T()); // expected-error 2 {{no matching function for call to 'in_range'}}
122*b82dcb62SLouis Dionne }
123*b82dcb62SLouis Dionne
main(int,char **)124*b82dcb62SLouis Dionne int main(int, char**) {
125*b82dcb62SLouis Dionne test<bool>();
126*b82dcb62SLouis Dionne test<char>();
127*b82dcb62SLouis Dionne #ifndef TEST_HAS_NO_WIDE_CHARACTERS
128*b82dcb62SLouis Dionne test<wchar_t>();
129*b82dcb62SLouis Dionne #endif
130*b82dcb62SLouis Dionne test<float>();
131*b82dcb62SLouis Dionne test<double>();
132*b82dcb62SLouis Dionne test<long double>();
133*b82dcb62SLouis Dionne test<std::byte>();
134*b82dcb62SLouis Dionne test<NonEmptyT>();
135*b82dcb62SLouis Dionne test<ColorT>();
136*b82dcb62SLouis Dionne test<std::nullptr_t>();
137*b82dcb62SLouis Dionne test<EmptyT>();
138*b82dcb62SLouis Dionne
139*b82dcb62SLouis Dionne #ifndef TEST_HAS_NO_CHAR8_T
140*b82dcb62SLouis Dionne test_char8t<char8_t>();
141*b82dcb62SLouis Dionne #endif // TEST_HAS_NO_CHAR8_T
142*b82dcb62SLouis Dionne
143*b82dcb62SLouis Dionne test_uchars<char16_t>();
144*b82dcb62SLouis Dionne test_uchars<char32_t>();
145*b82dcb62SLouis Dionne
146*b82dcb62SLouis Dionne return 0;
147*b82dcb62SLouis Dionne }
148