diff --git a/libcxx/docs/Status/Cxx2cPapers.csv b/libcxx/docs/Status/Cxx2cPapers.csv index 63e19f097e301..0ff1e257ce7f7 100644 --- a/libcxx/docs/Status/Cxx2cPapers.csv +++ b/libcxx/docs/Status/Cxx2cPapers.csv @@ -59,7 +59,7 @@ "`P2248R8 `__","Enabling list-initialization for algorithms","2024-03 (Tokyo)","","","" "`P2810R4 `__","``is_debugger_present`` ``is_replaceable``","2024-03 (Tokyo)","","","" "`P1068R11 `__","Vector API for random number generation","2024-03 (Tokyo)","","","" -"`P2944R3 `__","Comparisons for ``reference_wrapper``","2024-03 (Tokyo)","|Partial|","19","Implemented comparisons for ``reference_wrapper`` only" +"`P2944R3 `__","Comparisons for ``reference_wrapper``","2024-03 (Tokyo)","|Partial|","","Implemented changes to ``reference_wrapper`` and ``pair``" "`P2642R6 `__","Padded ``mdspan`` layouts","2024-03 (Tokyo)","","","" "`P3029R1 `__","Better ``mdspan``'s CTAD","2024-03 (Tokyo)","|Complete|","19","" "","","","","","" diff --git a/libcxx/include/__utility/pair.h b/libcxx/include/__utility/pair.h index 9beff24b149bb..4296caac1040a 100644 --- a/libcxx/include/__utility/pair.h +++ b/libcxx/include/__utility/pair.h @@ -11,6 +11,7 @@ #include <__compare/common_comparison_category.h> #include <__compare/synth_three_way.h> +#include <__concepts/boolean_testable.h> #include <__concepts/different_from.h> #include <__config> #include <__cstddef/size_t.h> @@ -461,7 +462,14 @@ pair(_T1, _T2) -> pair<_T1, _T2>; template inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 bool -operator==(const pair<_T1, _T2>& __x, const pair<_U1, _U2>& __y) { +operator==(const pair<_T1, _T2>& __x, const pair<_U1, _U2>& __y) +#if _LIBCPP_STD_VER >= 26 + requires requires { + { __x.first == __y.first } -> __boolean_testable; + { __x.second == __y.second } -> __boolean_testable; + } +#endif +{ return __x.first == __y.first && __x.second == __y.second; } diff --git a/libcxx/test/std/utilities/utility/pairs/pairs.spec/comparison.pass.cpp b/libcxx/test/std/utilities/utility/pairs/pairs.spec/comparison.pass.cpp index 76f9771f2b99b..c472906c5ed7f 100644 --- a/libcxx/test/std/utilities/utility/pairs/pairs.spec/comparison.pass.cpp +++ b/libcxx/test/std/utilities/utility/pairs/pairs.spec/comparison.pass.cpp @@ -19,9 +19,35 @@ #include #include +#include #include "test_macros.h" +#if TEST_STD_VER >= 26 + +// Test SFINAE. + +struct EqualityComparable { + constexpr EqualityComparable(int value) : value_{value} {}; + + friend constexpr bool operator==(const EqualityComparable&, const EqualityComparable&) noexcept = default; + + int value_; +}; + +static_assert(std::equality_comparable); + +static_assert(std::equality_comparable>); + +struct NonComparable {}; + +static_assert(!std::equality_comparable); + +static_assert(!std::equality_comparable>); +static_assert(!std::equality_comparable>); + +#endif // TEST_STD_VER >= 26 + int main(int, char**) { {