Skip to content

[libc++][NFC] Refactored equality comparisons tests for pair and expected #145668

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
61e16a8
[libc++] P2944R3: Constrained comparisions - the `optional` and `refe…
H-G-Hristov Apr 30, 2025
37b9041
NFC refactoring of `std::expected` tests
H-G-Hristov May 9, 2025
47b9765
Tests + fixes
H-G-Hristov May 10, 2025
58149a6
Cleanup
H-G-Hristov May 10, 2025
4e3c8c6
Refactorings
H-G-Hristov May 10, 2025
e94dd67
Fixed formatting
H-G-Hristov May 10, 2025
ab801b4
Include generator script results
H-G-Hristov May 10, 2025
77fb360
Try to fix CI
H-G-Hristov May 10, 2025
f0bfc2b
Update libcxx/test/std/utilities/utility/pairs/pairs.spec/comparison.…
H-G-Hristov May 10, 2025
35c0631
Try to fix CI
H-G-Hristov May 10, 2025
4f009b5
Fix `<optional>`
H-G-Hristov May 10, 2025
f81457f
Try to fix CI
H-G-Hristov May 10, 2025
7181c8c
More fixes
H-G-Hristov May 10, 2025
3a63752
Merge branch 'main' into hgh/libcxx/P2944R3-optional-constrained-equa…
H-G-Hristov Jun 4, 2025
4e1e312
Removed `optional` changes
H-G-Hristov Jun 4, 2025
e17ef64
Update libcxx/docs/Status/Cxx2cPapers.csv
H-G-Hristov Jun 4, 2025
02e41b1
Merge branch 'main' into hgh/libcxx/P2944R3-optional-constrained-equa…
H-G-Hristov Jun 4, 2025
99ccb38
Merge branch 'main' into hgh/libcxx/P2944R3-optional-constrained-equa…
Zingam Jun 4, 2025
5c79e4f
Update libcxx/docs/Status/Cxx2cPapers.csv
Zingam Jun 11, 2025
8a047e6
Merge branch 'main' into hgh/libcxx/P2944R3-optional-constrained-equa…
H-G-Hristov Jun 12, 2025
431fdf3
Cleanup
H-G-Hristov Jun 17, 2025
a0ab737
Merge branch 'main' into hgh/libcxx/P2944R3-constrained-equality-Part3
H-G-Hristov Jun 25, 2025
6b0ed95
Merge branch 'main' into hgh/libcxx/P2944R3-constrained-equality-Part3
H-G-Hristov Jun 25, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,14 @@
#include <type_traits>
#include <utility>

#include "test_comparisons.h"
#include "test_macros.h"
#include "../../types.h"

#if TEST_STD_VER >= 26
// https://wg21.link/P3379R0
static_assert(CanCompare<std::expected<int, int>, int>);
static_assert(CanCompare<std::expected<int, int>, EqualityComparable>);
static_assert(!CanCompare<std::expected<int, int>, NonComparable>);
static_assert(HasOperatorEqual<std::expected<int, int>, int>);
static_assert(HasOperatorEqual<std::expected<int, int>, EqualityComparable>);
static_assert(!HasOperatorEqual<std::expected<int, int>, NonComparable>);
#endif

constexpr bool test() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,26 +17,26 @@
#include <type_traits>
#include <utility>

#include "test_comparisons.h"
#include "test_macros.h"
#include "../../types.h"

// Test constraint
static_assert(!CanCompare<NonComparable, NonComparable>);
static_assert(!HasOperatorEqual<NonComparable, NonComparable>);

static_assert(CanCompare<std::expected<int, int>, std::expected<int, int>>);
static_assert(CanCompare<std::expected<int, int>, std::expected<short, short>>);
static_assert(HasOperatorEqual<std::expected<int, int>, std::expected<int, int>>);
static_assert(HasOperatorEqual<std::expected<int, int>, std::expected<short, short>>);

#if TEST_STD_VER >= 26
// https://wg21.link/P3379R0
static_assert(!CanCompare<std::expected<int, int>, std::expected<void, int>>);
static_assert(CanCompare<std::expected<int, int>, std::expected<int, int>>);
static_assert(!CanCompare<std::expected<NonComparable, int>, std::expected<NonComparable, int>>);
static_assert(!CanCompare<std::expected<int, NonComparable>, std::expected<int, NonComparable>>);
static_assert(!CanCompare<std::expected<NonComparable, int>, std::expected<int, NonComparable>>);
static_assert(!CanCompare<std::expected<int, NonComparable>, std::expected<NonComparable, int>>);
static_assert(!HasOperatorEqual<std::expected<int, int>, std::expected<void, int>>);
static_assert(HasOperatorEqual<std::expected<int, int>, std::expected<int, int>>);
static_assert(!HasOperatorEqual<std::expected<NonComparable, int>, std::expected<NonComparable, int>>);
static_assert(!HasOperatorEqual<std::expected<int, NonComparable>, std::expected<int, NonComparable>>);
static_assert(!HasOperatorEqual<std::expected<NonComparable, int>, std::expected<int, NonComparable>>);
static_assert(!HasOperatorEqual<std::expected<int, NonComparable>, std::expected<NonComparable, int>>);
#else
// Note this is true because other overloads in expected<non-void> are unconstrained
static_assert(CanCompare<std::expected<void, int>, std::expected<int, int>>);
static_assert(HasOperatorEqual<std::expected<void, int>, std::expected<int, int>>);
#endif
constexpr bool test() {
// x.has_value() && y.has_value()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,14 @@
#include <type_traits>
#include <utility>

#include "test_comparisons.h"
#include "test_macros.h"
#include "../../types.h"

#if TEST_STD_VER >= 26
// https://wg21.link/P3379R0
static_assert(CanCompare<std::expected<EqualityComparable, EqualityComparable>, std::unexpected<int>>);
static_assert(CanCompare<std::expected<EqualityComparable, int>, std::unexpected<EqualityComparable>>);
static_assert(!CanCompare<std::expected<EqualityComparable, NonComparable>, std::unexpected<int>>);
static_assert(HasOperatorEqual<std::expected<EqualityComparable, EqualityComparable>, std::unexpected<int>>);
static_assert(HasOperatorEqual<std::expected<EqualityComparable, int>, std::unexpected<EqualityComparable>>);
static_assert(!HasOperatorEqual<std::expected<EqualityComparable, NonComparable>, std::unexpected<int>>);
#endif

constexpr bool test() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,26 +17,26 @@
#include <type_traits>
#include <utility>

#include "test_comparisons.h"
#include "test_macros.h"
#include "../../types.h"

struct Foo{};
static_assert(!CanCompare<Foo, Foo>);
static_assert(!HasOperatorEqual<Foo, Foo>);

static_assert(CanCompare<std::expected<void, int>, std::expected<void, int>>);
static_assert(CanCompare<std::expected<void, int>, std::expected<void, short>>);
static_assert(HasOperatorEqual<std::expected<void, int>, std::expected<void, int>>);
static_assert(HasOperatorEqual<std::expected<void, int>, std::expected<void, short>>);

#if TEST_STD_VER >= 26
// https://wg21.link/P3379R0
static_assert(!CanCompare<std::expected<void, int>, std::expected<int, int>>);
static_assert(CanCompare<std::expected<void, int>, std::expected<void, int>>);
static_assert(CanCompare<std::expected<void, int>, std::expected<void, int>>);
static_assert(!CanCompare<std::expected<void, NonComparable>, std::expected<void, NonComparable>>);
static_assert(!CanCompare<std::expected<void, int>, std::expected<void, NonComparable>>);
static_assert(!CanCompare<std::expected<void, NonComparable>, std::expected<void, int>>);
static_assert(!HasOperatorEqual<std::expected<void, int>, std::expected<int, int>>);
static_assert(HasOperatorEqual<std::expected<void, int>, std::expected<void, int>>);
static_assert(HasOperatorEqual<std::expected<void, int>, std::expected<void, int>>);
static_assert(!HasOperatorEqual<std::expected<void, NonComparable>, std::expected<void, NonComparable>>);
static_assert(!HasOperatorEqual<std::expected<void, int>, std::expected<void, NonComparable>>);
static_assert(!HasOperatorEqual<std::expected<void, NonComparable>, std::expected<void, int>>);
#else
// Note this is true because other overloads in expected<non-void> are unconstrained
static_assert(CanCompare<std::expected<void, int>, std::expected<int, int>>);
static_assert(HasOperatorEqual<std::expected<void, int>, std::expected<int, int>>);
#endif

constexpr bool test() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,14 @@
#include <type_traits>
#include <utility>

#include "test_comparisons.h"
#include "test_macros.h"
#include "../../types.h"

#if TEST_STD_VER >= 26
// https://wg21.link/P3379R0
static_assert(CanCompare<std::expected<void, EqualityComparable>, std::unexpected<int>>);
static_assert(CanCompare<std::expected<void, int>, std::unexpected<EqualityComparable>>);
static_assert(!CanCompare<std::expected<void, NonComparable>, std::unexpected<int>>);
static_assert(HasOperatorEqual<std::expected<void, EqualityComparable>, std::unexpected<int>>);
static_assert(HasOperatorEqual<std::expected<void, int>, std::unexpected<EqualityComparable>>);
static_assert(!HasOperatorEqual<std::expected<void, NonComparable>, std::unexpected<int>>);
#endif

constexpr bool test() {
Expand Down
13 changes: 0 additions & 13 deletions libcxx/test/std/utilities/expected/types.h
Original file line number Diff line number Diff line change
Expand Up @@ -336,17 +336,4 @@ struct CheckForInvalidWrites : public CheckForInvalidWritesBase<WithPaddedExpect
}
};

struct NonComparable {};

struct EqualityComparable {
int i;
constexpr EqualityComparable(int ii) : i(ii) {}

friend constexpr bool operator==(const EqualityComparable& data, int ii) { return data.i == ii; }
};

// Test constraint
template <class T1, class T2>
concept CanCompare = requires(T1 t1, T2 t2) { t1 == t2; };

#endif // TEST_STD_UTILITIES_EXPECTED_TYPES_H
Original file line number Diff line number Diff line change
Expand Up @@ -21,28 +21,15 @@
#include <cassert>
#include <concepts>

#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<EqualityComparable>);

static_assert(std::equality_comparable<std::pair<EqualityComparable, EqualityComparable>>);

struct NonComparable {};

static_assert(!std::equality_comparable<NonComparable>);

static_assert(!std::equality_comparable<std::pair<EqualityComparable, NonComparable>>);
static_assert(!std::equality_comparable<std::pair<NonComparable, EqualityComparable>>);

Expand Down
Loading