diff --git a/libcxx/docs/Status/Cxx2cPapers.csv b/libcxx/docs/Status/Cxx2cPapers.csv index 00fad3ff802a8..dc18127525a3e 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|","","The changes to ``optional`` and ``tuple`` are not yet implemented" +"`P2944R3 `__","Comparisons for ``reference_wrapper``","2024-03 (Tokyo)","|Partial|","","The changes to ``optional`` and ``tuple``'s equality overload from P2165R4 are not yet implemented" "`P2642R6 `__","Padded ``mdspan`` layouts","2024-03 (Tokyo)","","","" "`P3029R1 `__","Better ``mdspan``'s CTAD","2024-03 (Tokyo)","|Complete|","19","" "","","","","","" diff --git a/libcxx/include/tuple b/libcxx/include/tuple index 6e7a430d219ea..75021f0ea51f6 100644 --- a/libcxx/include/tuple +++ b/libcxx/include/tuple @@ -216,6 +216,7 @@ template # include <__compare/common_comparison_category.h> # include <__compare/ordering.h> # include <__compare/synth_three_way.h> +# include <__concepts/boolean_testable.h> # include <__config> # include <__cstddef/size_t.h> # include <__fwd/array.h> @@ -1153,6 +1154,11 @@ struct __tuple_equal<0> { }; template +# if _LIBCPP_STD_VER >= 26 + requires(__all __boolean_testable; + }...>::value && (sizeof...(_Tp) == sizeof...(_Up))) +# endif inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 bool operator==(const tuple<_Tp...>& __x, const tuple<_Up...>& __y) { static_assert(sizeof...(_Tp) == sizeof...(_Up), "Can't compare tuples of different sizes"); diff --git a/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.rel/eq.pass.cpp b/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.rel/eq.pass.cpp index a8de656313d45..779a89b163f04 100644 --- a/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.rel/eq.pass.cpp +++ b/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.rel/eq.pass.cpp @@ -16,12 +16,33 @@ // UNSUPPORTED: c++03 -#include -#include +#include #include +#include +#include "test_comparisons.h" #include "test_macros.h" +#if TEST_STD_VER >= 26 + +// Test SFINAE. + +static_assert(std::equality_comparable>); +static_assert(std::equality_comparable>); + +static_assert(!std::equality_comparable>); +static_assert(!std::equality_comparable>); +static_assert(!std::equality_comparable>); +static_assert(!std::equality_comparable_with, std::tuple>); +static_assert(!std::equality_comparable_with, std::tuple>); +// Size mismatch. +static_assert( + !std::equality_comparable_with, std::tuple>); +static_assert( + !std::equality_comparable_with, std::tuple>); + +#endif + int main(int, char**) { { diff --git a/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.rel/size_incompatible_comparison.verify.cpp b/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.rel/size_incompatible_comparison.verify.cpp index 851f6fcd1fbac..c05438f838f17 100644 --- a/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.rel/size_incompatible_comparison.verify.cpp +++ b/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.rel/size_incompatible_comparison.verify.cpp @@ -6,6 +6,9 @@ // //===----------------------------------------------------------------------===// +// Disabled in C++26 and later because tuple comparison between different sizes is constrained since P2944R3. +// UNSUPPORTED: std-at-least-cxx26 + // // template class tuple;