124dd2d2fSChristopher Di Bella //===----------------------------------------------------------------------===//
224dd2d2fSChristopher Di Bella //
324dd2d2fSChristopher Di Bella // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
424dd2d2fSChristopher Di Bella // See https://llvm.org/LICENSE.txt for license information.
524dd2d2fSChristopher Di Bella // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
624dd2d2fSChristopher Di Bella //
724dd2d2fSChristopher Di Bella //===----------------------------------------------------------------------===//
824dd2d2fSChristopher Di Bella 
924dd2d2fSChristopher Di Bella // UNSUPPORTED: c++03, c++11, c++14, c++17
1024dd2d2fSChristopher Di Bella 
1124dd2d2fSChristopher Di Bella // template<class T>
1224dd2d2fSChristopher Di Bella // concept equality_comparable = // see below
1324dd2d2fSChristopher Di Bella 
1424dd2d2fSChristopher Di Bella #include <concepts>
1524dd2d2fSChristopher Di Bella 
1624dd2d2fSChristopher Di Bella #include <array>
17*e99c4906SNikolas Klauser #include <cstddef>
1824dd2d2fSChristopher Di Bella #include <deque>
1924dd2d2fSChristopher Di Bella #include <forward_list>
2024dd2d2fSChristopher Di Bella #include <list>
2124dd2d2fSChristopher Di Bella #include <map>
2224dd2d2fSChristopher Di Bella #include <optional>
2324dd2d2fSChristopher Di Bella #include <set>
2424dd2d2fSChristopher Di Bella #include <unordered_map>
2524dd2d2fSChristopher Di Bella #include <unordered_set>
2624dd2d2fSChristopher Di Bella #include <vector>
2724dd2d2fSChristopher Di Bella 
28879cbac0Szoecarver #include "compare_types.h"
2924dd2d2fSChristopher Di Bella 
3024dd2d2fSChristopher Di Bella namespace fundamentals {
3124dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<int>);
3224dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<double>);
3324dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<void*>);
3424dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<char*>);
3524dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<char const*>);
3624dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<char volatile*>);
3724dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<char const volatile*>);
3824dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<wchar_t&>);
3924dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<char8_t const&>);
4024dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<char16_t volatile&>);
4124dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<char32_t const volatile&>);
4224dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<unsigned char&&>);
4324dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<unsigned short const&&>);
4424dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<unsigned int volatile&&>);
4524dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<unsigned long const volatile&&>);
4624dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<int[5]>);
4724dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<int (*)(int)>);
4824dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<int (&)(int)>);
4924dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<int (*)(int) noexcept>);
5024dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<int (&)(int) noexcept>);
5124dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<std::nullptr_t>);
5224dd2d2fSChristopher Di Bella 
5324dd2d2fSChristopher Di Bella struct S {};
5424dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<int S::*>);
5524dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<int (S::*)()>);
5624dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<int (S::*)() noexcept>);
5724dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<int (S::*)() &>);
5824dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<int (S::*)() & noexcept>);
5924dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<int (S::*)() &&>);
6024dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<int (S::*)() && noexcept>);
6124dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<int (S::*)() const>);
6224dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<int (S::*)() const noexcept>);
6324dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<int (S::*)() const&>);
6424dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<int (S::*)() const & noexcept>);
6524dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<int (S::*)() const&&>);
6624dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<int (S::*)() const && noexcept>);
6724dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<int (S::*)() volatile>);
6824dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<int (S::*)() volatile noexcept>);
6924dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<int (S::*)() volatile&>);
7024dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<int (S::*)() volatile & noexcept>);
7124dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<int (S::*)() volatile&&>);
7224dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<int (S::*)() volatile && noexcept>);
7324dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<int (S::*)() const volatile>);
7424dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<int (S::*)() const volatile noexcept>);
7524dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<int (S::*)() const volatile&>);
7624dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<int (S::*)() const volatile & noexcept>);
7724dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<int (S::*)() const volatile&&>);
7824dd2d2fSChristopher Di Bella static_assert(
7924dd2d2fSChristopher Di Bella     std::equality_comparable<int (S::*)() const volatile && noexcept>);
8024dd2d2fSChristopher Di Bella 
8124dd2d2fSChristopher Di Bella static_assert(!std::equality_comparable<void>);
8224dd2d2fSChristopher Di Bella } // namespace fundamentals
8324dd2d2fSChristopher Di Bella 
8424dd2d2fSChristopher Di Bella namespace standard_types {
8524dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<std::array<int, 10>>);
8624dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<std::deque<int>>);
8724dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<std::forward_list<int>>);
8824dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<std::list<int>>);
8924dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<std::map<int, void*>>);
9024dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<std::optional<int>>);
9124dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<std::set<int>>);
9224dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<std::unordered_map<int, void*>>);
9324dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<std::unordered_set<int>>);
9424dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<std::vector<bool>>);
9524dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<std::vector<int>>);
9624dd2d2fSChristopher Di Bella } // namespace standard_types
9724dd2d2fSChristopher Di Bella 
9824dd2d2fSChristopher Di Bella namespace types_fit_for_purpose {
9924dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<cxx20_member_eq>);
10024dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<cxx20_friend_eq>);
10124dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<member_three_way_comparable>);
10224dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<friend_three_way_comparable>);
10324dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<explicit_operators>);
1047959d590SChristopher Di Bella static_assert(std::equality_comparable<different_return_types>);
10524dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<one_member_one_friend>);
10624dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<equality_comparable_with_ec1>);
10724dd2d2fSChristopher Di Bella 
10824dd2d2fSChristopher Di Bella static_assert(!std::equality_comparable<no_eq>);
10924dd2d2fSChristopher Di Bella static_assert(!std::equality_comparable<no_neq>);
1107959d590SChristopher Di Bella static_assert(std::equality_comparable<no_lt>);
1117959d590SChristopher Di Bella static_assert(std::equality_comparable<no_gt>);
1127959d590SChristopher Di Bella static_assert(std::equality_comparable<no_le>);
1137959d590SChristopher Di Bella static_assert(std::equality_comparable<no_ge>);
1147959d590SChristopher Di Bella 
11524dd2d2fSChristopher Di Bella static_assert(!std::equality_comparable<wrong_return_type_eq>);
11624dd2d2fSChristopher Di Bella static_assert(!std::equality_comparable<wrong_return_type_ne>);
1177959d590SChristopher Di Bella static_assert(std::equality_comparable<wrong_return_type_lt>);
1187959d590SChristopher Di Bella static_assert(std::equality_comparable<wrong_return_type_gt>);
1197959d590SChristopher Di Bella static_assert(std::equality_comparable<wrong_return_type_le>);
1207959d590SChristopher Di Bella static_assert(std::equality_comparable<wrong_return_type_ge>);
12124dd2d2fSChristopher Di Bella static_assert(!std::equality_comparable<wrong_return_type>);
12224dd2d2fSChristopher Di Bella static_assert(
12324dd2d2fSChristopher Di Bella     !std::equality_comparable<cxx20_member_eq_operator_with_deleted_ne>);
12424dd2d2fSChristopher Di Bella static_assert(
12524dd2d2fSChristopher Di Bella     !std::equality_comparable<cxx20_friend_eq_operator_with_deleted_ne>);
12624dd2d2fSChristopher Di Bella static_assert(
12724dd2d2fSChristopher Di Bella     !std::equality_comparable<member_three_way_comparable_with_deleted_eq>);
12824dd2d2fSChristopher Di Bella static_assert(
12924dd2d2fSChristopher Di Bella     !std::equality_comparable<member_three_way_comparable_with_deleted_ne>);
13024dd2d2fSChristopher Di Bella static_assert(
13124dd2d2fSChristopher Di Bella     !std::equality_comparable<friend_three_way_comparable_with_deleted_eq>);
13224dd2d2fSChristopher Di Bella static_assert(
13324dd2d2fSChristopher Di Bella     !std::equality_comparable<friend_three_way_comparable_with_deleted_ne>);
13424dd2d2fSChristopher Di Bella 
1357959d590SChristopher Di Bella static_assert(!std::equality_comparable<eq_returns_explicit_bool>);
1367959d590SChristopher Di Bella static_assert(!std::equality_comparable<ne_returns_explicit_bool>);
1377959d590SChristopher Di Bella static_assert(std::equality_comparable<lt_returns_explicit_bool>);
1387959d590SChristopher Di Bella static_assert(std::equality_comparable<gt_returns_explicit_bool>);
1397959d590SChristopher Di Bella static_assert(std::equality_comparable<le_returns_explicit_bool>);
1407959d590SChristopher Di Bella static_assert(std::equality_comparable<ge_returns_explicit_bool>);
14124dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<returns_true_type>);
14224dd2d2fSChristopher Di Bella static_assert(std::equality_comparable<returns_int_ptr>);
14324dd2d2fSChristopher Di Bella } // namespace types_fit_for_purpose
144