1*8afa6cf5SHristo Hristov //===----------------------------------------------------------------------===//
2*8afa6cf5SHristo Hristov //
3*8afa6cf5SHristo Hristov // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*8afa6cf5SHristo Hristov // See https://llvm.org/LICENSE.txt for license information.
5*8afa6cf5SHristo Hristov // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*8afa6cf5SHristo Hristov //
7*8afa6cf5SHristo Hristov //===----------------------------------------------------------------------===//
8*8afa6cf5SHristo Hristov 
9*8afa6cf5SHristo Hristov // UNSUPPORTED: c++03, c++11, c++14, c++17, c++20, c++23
10*8afa6cf5SHristo Hristov 
11*8afa6cf5SHristo Hristov // <functional>
12*8afa6cf5SHristo Hristov 
13*8afa6cf5SHristo Hristov // class reference_wrapper
14*8afa6cf5SHristo Hristov 
15*8afa6cf5SHristo Hristov // [refwrap.comparisons], comparisons
16*8afa6cf5SHristo Hristov 
17*8afa6cf5SHristo Hristov // friend constexpr bool operator==(reference_wrapper, const T&);                                         // Since C++26
18*8afa6cf5SHristo Hristov 
19*8afa6cf5SHristo Hristov #include <cassert>
20*8afa6cf5SHristo Hristov #include <concepts>
21*8afa6cf5SHristo Hristov #include <functional>
22*8afa6cf5SHristo Hristov 
23*8afa6cf5SHristo Hristov #include "test_comparisons.h"
24*8afa6cf5SHristo Hristov #include "test_macros.h"
25*8afa6cf5SHristo Hristov 
26*8afa6cf5SHristo Hristov #include "helper_concepts.h"
27*8afa6cf5SHristo Hristov #include "helper_types.h"
28*8afa6cf5SHristo Hristov 
29*8afa6cf5SHristo Hristov // Test SFINAE.
30*8afa6cf5SHristo Hristov 
31*8afa6cf5SHristo Hristov static_assert(HasEqualityOperatorWithInt<std::reference_wrapper<EqualityComparable>>);
32*8afa6cf5SHristo Hristov 
33*8afa6cf5SHristo Hristov static_assert(!HasEqualityOperatorWithInt<std::reference_wrapper<NonComparable>>);
34*8afa6cf5SHristo Hristov 
35*8afa6cf5SHristo Hristov // Test equality.
36*8afa6cf5SHristo Hristov 
37*8afa6cf5SHristo Hristov template <typename T>
test()38*8afa6cf5SHristo Hristov constexpr void test() {
39*8afa6cf5SHristo Hristov   T i{92};
40*8afa6cf5SHristo Hristov   T j{84};
41*8afa6cf5SHristo Hristov 
42*8afa6cf5SHristo Hristov   std::reference_wrapper<T> rw1{i};
43*8afa6cf5SHristo Hristov 
44*8afa6cf5SHristo Hristov   // refwrap, const&
45*8afa6cf5SHristo Hristov   AssertEqualityReturnBool<decltype(rw1), decltype(i)>();
46*8afa6cf5SHristo Hristov   assert(testEquality(rw1, i, true));
47*8afa6cf5SHristo Hristov   assert(testEquality(rw1, j, false));
48*8afa6cf5SHristo Hristov }
49*8afa6cf5SHristo Hristov 
test()50*8afa6cf5SHristo Hristov constexpr bool test() {
51*8afa6cf5SHristo Hristov   test<int>();
52*8afa6cf5SHristo Hristov   test<EqualityComparable>();
53*8afa6cf5SHristo Hristov 
54*8afa6cf5SHristo Hristov   return true;
55*8afa6cf5SHristo Hristov }
56*8afa6cf5SHristo Hristov 
main(int,char **)57*8afa6cf5SHristo Hristov int main(int, char**) {
58*8afa6cf5SHristo Hristov   test();
59*8afa6cf5SHristo Hristov   static_assert(test());
60*8afa6cf5SHristo Hristov 
61*8afa6cf5SHristo Hristov   return 0;
62*8afa6cf5SHristo Hristov }
63