From a19d37044b35766d216d77c3fb5e5275e48438ea Mon Sep 17 00:00:00 2001 From: Hristo Hristov Date: Fri, 27 Jun 2025 20:12:18 +0300 Subject: [PATCH] [libc++] P2944R3: Constrained comparisions - `tuple` (#145677) Implements P2944R3 partially, which adds constrained comparisons `std::tuple`. The missing overloads introduced in [P2165R4](https://wg21.link/P2165R4) are not implemented. Uses [`__all`](https://github.com/llvm/llvm-project/blob/f7af33a9eb5b3876f219075023dc9c565d75849b/libcxx/include/__type_traits/conjunction.h#L45) instead of a fold expression, see comment: https://github.com/llvm/llvm-project/pull/141396#discussion_r2161166077 Relates to #136765 # References [tuple.rel](https://wg21.link//tuple.rel) --- libcxx/docs/Status/Cxx2cPapers.csv | 2 +- libcxx/include/tuple | 6 +++++ .../tuple/tuple.tuple/tuple.rel/eq.pass.cpp | 25 +++++++++++++++++-- .../size_incompatible_comparison.verify.cpp | 3 +++ 4 files changed, 33 insertions(+), 3 deletions(-) diff --git a/libcxx/docs/Status/Cxx2cPapers.csv b/libcxx/docs/Status/Cxx2cPapers.csv index 00fad3ff802a..dc18127525a3 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 6e7a430d219e..75021f0ea51f 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 a8de656313d4..779a89b163f0 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 851f6fcd1fba..c05438f838f1 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;