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