From 267945b665cf197fa26cf2ae89b0c29baf4db031 Mon Sep 17 00:00:00 2001 From: Hristo Hristov Date: Sun, 29 Jun 2025 16:34:49 +0300 Subject: [PATCH] [libc++][NFC] Refactored equality comparisons tests for `pair` and `expected` (#145668) Refactored `std::expected` and `std::pair` tests to use the canonicalized names from `test_comparisions.h`, which are shared between tests. This was split from https://github.com/llvm/llvm-project/pull/139368 as per comment https://github.com/llvm/llvm-project/pull/139368#pullrequestreview-2916040573 Towards implementing [P2944R3: Comparisons for reference_wrapper](https://github.com/llvm/llvm-project/issues/105424) --------- Co-authored-by: Hristo Hristov Co-authored-by: Nikolas Klauser --- .../equality/equality.T2.pass.cpp | 8 +++---- .../equality/equality.other_expected.pass.cpp | 22 +++++++++---------- .../equality/equality.unexpected.pass.cpp | 8 +++---- .../equality/equality.other_expected.pass.cpp | 22 +++++++++---------- .../equality/equality.unexpected.pass.cpp | 8 +++---- libcxx/test/std/utilities/expected/types.h | 13 ----------- .../pairs/pairs.spec/comparison.pass.cpp | 15 +------------ 7 files changed, 35 insertions(+), 61 deletions(-) diff --git a/libcxx/test/std/utilities/expected/expected.expected/equality/equality.T2.pass.cpp b/libcxx/test/std/utilities/expected/expected.expected/equality/equality.T2.pass.cpp index 25eb97a2df4d..16c6986ae670 100644 --- a/libcxx/test/std/utilities/expected/expected.expected/equality/equality.T2.pass.cpp +++ b/libcxx/test/std/utilities/expected/expected.expected/equality/equality.T2.pass.cpp @@ -16,14 +16,14 @@ #include #include +#include "test_comparisons.h" #include "test_macros.h" -#include "../../types.h" #if TEST_STD_VER >= 26 // https://wg21.link/P3379R0 -static_assert(CanCompare, int>); -static_assert(CanCompare, EqualityComparable>); -static_assert(!CanCompare, NonComparable>); +static_assert(HasOperatorEqual, int>); +static_assert(HasOperatorEqual, EqualityComparable>); +static_assert(!HasOperatorEqual, NonComparable>); #endif constexpr bool test() { diff --git a/libcxx/test/std/utilities/expected/expected.expected/equality/equality.other_expected.pass.cpp b/libcxx/test/std/utilities/expected/expected.expected/equality/equality.other_expected.pass.cpp index f0f549b6b777..218f0c39740e 100644 --- a/libcxx/test/std/utilities/expected/expected.expected/equality/equality.other_expected.pass.cpp +++ b/libcxx/test/std/utilities/expected/expected.expected/equality/equality.other_expected.pass.cpp @@ -17,26 +17,26 @@ #include #include +#include "test_comparisons.h" #include "test_macros.h" -#include "../../types.h" // Test constraint -static_assert(!CanCompare); +static_assert(!HasOperatorEqual); -static_assert(CanCompare, std::expected>); -static_assert(CanCompare, std::expected>); +static_assert(HasOperatorEqual, std::expected>); +static_assert(HasOperatorEqual, std::expected>); #if TEST_STD_VER >= 26 // https://wg21.link/P3379R0 -static_assert(!CanCompare, std::expected>); -static_assert(CanCompare, std::expected>); -static_assert(!CanCompare, std::expected>); -static_assert(!CanCompare, std::expected>); -static_assert(!CanCompare, std::expected>); -static_assert(!CanCompare, std::expected>); +static_assert(!HasOperatorEqual, std::expected>); +static_assert(HasOperatorEqual, std::expected>); +static_assert(!HasOperatorEqual, std::expected>); +static_assert(!HasOperatorEqual, std::expected>); +static_assert(!HasOperatorEqual, std::expected>); +static_assert(!HasOperatorEqual, std::expected>); #else // Note this is true because other overloads in expected are unconstrained -static_assert(CanCompare, std::expected>); +static_assert(HasOperatorEqual, std::expected>); #endif constexpr bool test() { // x.has_value() && y.has_value() diff --git a/libcxx/test/std/utilities/expected/expected.expected/equality/equality.unexpected.pass.cpp b/libcxx/test/std/utilities/expected/expected.expected/equality/equality.unexpected.pass.cpp index 6c7d2f39514e..153cbbddf306 100644 --- a/libcxx/test/std/utilities/expected/expected.expected/equality/equality.unexpected.pass.cpp +++ b/libcxx/test/std/utilities/expected/expected.expected/equality/equality.unexpected.pass.cpp @@ -16,14 +16,14 @@ #include #include +#include "test_comparisons.h" #include "test_macros.h" -#include "../../types.h" #if TEST_STD_VER >= 26 // https://wg21.link/P3379R0 -static_assert(CanCompare, std::unexpected>); -static_assert(CanCompare, std::unexpected>); -static_assert(!CanCompare, std::unexpected>); +static_assert(HasOperatorEqual, std::unexpected>); +static_assert(HasOperatorEqual, std::unexpected>); +static_assert(!HasOperatorEqual, std::unexpected>); #endif constexpr bool test() { diff --git a/libcxx/test/std/utilities/expected/expected.void/equality/equality.other_expected.pass.cpp b/libcxx/test/std/utilities/expected/expected.void/equality/equality.other_expected.pass.cpp index b6c3d8deee64..af53d0c00f57 100644 --- a/libcxx/test/std/utilities/expected/expected.void/equality/equality.other_expected.pass.cpp +++ b/libcxx/test/std/utilities/expected/expected.void/equality/equality.other_expected.pass.cpp @@ -17,26 +17,26 @@ #include #include +#include "test_comparisons.h" #include "test_macros.h" -#include "../../types.h" struct Foo{}; -static_assert(!CanCompare); +static_assert(!HasOperatorEqual); -static_assert(CanCompare, std::expected>); -static_assert(CanCompare, std::expected>); +static_assert(HasOperatorEqual, std::expected>); +static_assert(HasOperatorEqual, std::expected>); #if TEST_STD_VER >= 26 // https://wg21.link/P3379R0 -static_assert(!CanCompare, std::expected>); -static_assert(CanCompare, std::expected>); -static_assert(CanCompare, std::expected>); -static_assert(!CanCompare, std::expected>); -static_assert(!CanCompare, std::expected>); -static_assert(!CanCompare, std::expected>); +static_assert(!HasOperatorEqual, std::expected>); +static_assert(HasOperatorEqual, std::expected>); +static_assert(HasOperatorEqual, std::expected>); +static_assert(!HasOperatorEqual, std::expected>); +static_assert(!HasOperatorEqual, std::expected>); +static_assert(!HasOperatorEqual, std::expected>); #else // Note this is true because other overloads in expected are unconstrained -static_assert(CanCompare, std::expected>); +static_assert(HasOperatorEqual, std::expected>); #endif constexpr bool test() { diff --git a/libcxx/test/std/utilities/expected/expected.void/equality/equality.unexpected.pass.cpp b/libcxx/test/std/utilities/expected/expected.void/equality/equality.unexpected.pass.cpp index f37f38bb7151..8d040d2ab7c0 100644 --- a/libcxx/test/std/utilities/expected/expected.void/equality/equality.unexpected.pass.cpp +++ b/libcxx/test/std/utilities/expected/expected.void/equality/equality.unexpected.pass.cpp @@ -16,14 +16,14 @@ #include #include +#include "test_comparisons.h" #include "test_macros.h" -#include "../../types.h" #if TEST_STD_VER >= 26 // https://wg21.link/P3379R0 -static_assert(CanCompare, std::unexpected>); -static_assert(CanCompare, std::unexpected>); -static_assert(!CanCompare, std::unexpected>); +static_assert(HasOperatorEqual, std::unexpected>); +static_assert(HasOperatorEqual, std::unexpected>); +static_assert(!HasOperatorEqual, std::unexpected>); #endif constexpr bool test() { diff --git a/libcxx/test/std/utilities/expected/types.h b/libcxx/test/std/utilities/expected/types.h index 11473ca3d97d..df73ebdfe495 100644 --- a/libcxx/test/std/utilities/expected/types.h +++ b/libcxx/test/std/utilities/expected/types.h @@ -336,17 +336,4 @@ struct CheckForInvalidWrites : public CheckForInvalidWritesBase -concept CanCompare = requires(T1 t1, T2 t2) { t1 == t2; }; - #endif // TEST_STD_UTILITIES_EXPECTED_TYPES_H 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 c472906c5ed7..226a3587a47f 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 @@ -21,28 +21,15 @@ #include #include +#include "test_comparisons.h" #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>);