[libcxx-commits] [libcxx] [libc++][NFC] Centralize test for support of == and != in ranges (PR #78481)
Will Hawkins via libcxx-commits
libcxx-commits at lists.llvm.org
Mon Apr 1 18:03:27 PDT 2024
https://github.com/hawkinsw updated https://github.com/llvm/llvm-project/pull/78481
>From 43acfb1690199eeb4f0da6b3d575b75ae26c85aa Mon Sep 17 00:00:00 2001
From: Will Hawkins <hawkinsw at obs.cr>
Date: Wed, 17 Jan 2024 12:44:19 -0500
Subject: [PATCH 1/6] [libc++][NFC] Centralize test for support of == and != in
ranges
Previously, tests for whether comparison using == was supported by
iterators derived from ranges adaptors was spread throughout the testing
codebase. This PR centralizes the implementation of those tests.
---
.../range.elements/iterator/compare.pass.cpp | 4 +--
.../range.elements/sentinel/equality.pass.cpp | 21 ++++++-------
.../range.filter/iterator/compare.pass.cpp | 7 +++--
.../range.join.sentinel/eq.pass.cpp | 8 ++---
.../range.lazy.split.inner/equal.pass.cpp | 9 ++----
.../range.lazy.split.outer/equal.pass.cpp | 9 ++----
.../sentinel/equality.pass.cpp | 20 +++++--------
.../range.zip/iterator/compare.pass.cpp | 4 ++-
.../range.zip/sentinel/eq.pass.cpp | 30 ++++++++-----------
libcxx/test/support/test_range.h | 10 +++++++
10 files changed, 58 insertions(+), 64 deletions(-)
diff --git a/libcxx/test/std/ranges/range.adaptors/range.elements/iterator/compare.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.elements/iterator/compare.pass.cpp
index 16df3e40bd77a0..8d946d4f5d6e8b 100644
--- a/libcxx/test/std/ranges/range.adaptors/range.elements/iterator/compare.pass.cpp
+++ b/libcxx/test/std/ranges/range.adaptors/range.elements/iterator/compare.pass.cpp
@@ -27,6 +27,7 @@
#include <tuple>
#include "test_iterators.h"
+#include "test_range.h"
constexpr void compareOperatorTest(const auto& iter1, const auto& iter2) {
assert(!(iter1 < iter1));
@@ -139,8 +140,7 @@ constexpr bool test() {
auto it = ev.begin();
using ElemIter = decltype(it);
- static_assert(!std::invocable<std::equal_to<>, ElemIter, ElemIter>);
- static_assert(!std::invocable<std::not_equal_to<>, ElemIter, ElemIter>);
+ static_assert(!weakly_equality_comparable_with<ElemIter>);
inequalityOperatorsDoNotExistTest(it, it);
}
diff --git a/libcxx/test/std/ranges/range.adaptors/range.elements/sentinel/equality.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.elements/sentinel/equality.pass.cpp
index df95e07c97d972..e2ae7c6539c527 100644
--- a/libcxx/test/std/ranges/range.adaptors/range.elements/sentinel/equality.pass.cpp
+++ b/libcxx/test/std/ranges/range.adaptors/range.elements/sentinel/equality.pass.cpp
@@ -17,6 +17,7 @@
#include <ranges>
#include "../types.h"
+#include "test_range.h"
template <bool Const>
struct Iter {
@@ -63,36 +64,32 @@ struct Range : TupleBufferView {
using R = Range<Sent>;
using CrossComparableR = Range<CrossComparableSent>;
-// Test Constraint
-template <class I, class S>
-concept HasEqual = requires(const I i, const S s) { i == s; };
-
using std::ranges::elements_view;
using std::ranges::iterator_t;
using std::ranges::sentinel_t;
-static_assert(HasEqual<iterator_t<elements_view<R, 0>>, //
+static_assert(weakly_equality_comparable_with<iterator_t<elements_view<R, 0>>, //
sentinel_t<elements_view<R, 0>>>);
-static_assert(!HasEqual<iterator_t<const elements_view<R, 0>>, //
+static_assert(!weakly_equality_comparable_with<iterator_t<const elements_view<R, 0>>, //
sentinel_t<elements_view<R, 0>>>);
-static_assert(!HasEqual<iterator_t<elements_view<R, 0>>, //
+static_assert(!weakly_equality_comparable_with<iterator_t<elements_view<R, 0>>, //
sentinel_t<const elements_view<R, 0>>>);
-static_assert(HasEqual<iterator_t<const elements_view<R, 0>>, //
+static_assert(weakly_equality_comparable_with<iterator_t<const elements_view<R, 0>>, //
sentinel_t<const elements_view<R, 0>>>);
-static_assert(HasEqual<iterator_t<elements_view<R, 0>>, //
+static_assert(weakly_equality_comparable_with<iterator_t<elements_view<R, 0>>, //
sentinel_t<elements_view<R, 0>>>);
-static_assert(HasEqual<iterator_t<const elements_view<CrossComparableR, 0>>, //
+static_assert(weakly_equality_comparable_with<iterator_t<const elements_view<CrossComparableR, 0>>, //
sentinel_t<elements_view<CrossComparableR, 0>>>);
-static_assert(HasEqual<iterator_t<elements_view<CrossComparableR, 0>>, //
+static_assert(weakly_equality_comparable_with<iterator_t<elements_view<CrossComparableR, 0>>, //
sentinel_t<const elements_view<CrossComparableR, 0>>>);
-static_assert(HasEqual<iterator_t<const elements_view<CrossComparableR, 0>>, //
+static_assert(weakly_equality_comparable_with<iterator_t<const elements_view<CrossComparableR, 0>>, //
sentinel_t<const elements_view<CrossComparableR, 0>>>);
template <class R, bool ConstIter, bool ConstSent>
diff --git a/libcxx/test/std/ranges/range.adaptors/range.filter/iterator/compare.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.filter/iterator/compare.pass.cpp
index 78881e8ac6df19..9dec5d81ddc2ed 100644
--- a/libcxx/test/std/ranges/range.adaptors/range.filter/iterator/compare.pass.cpp
+++ b/libcxx/test/std/ranges/range.adaptors/range.filter/iterator/compare.pass.cpp
@@ -17,12 +17,13 @@
#include <cassert>
#include <concepts>
#include <utility>
+
#include "test_iterators.h"
#include "test_macros.h"
+#include "test_range.h"
+
#include "../types.h"
-template <class T>
-concept has_equal = requires (T const& x, T const& y) { { x == y }; };
template <class Iterator>
constexpr void test() {
@@ -76,7 +77,7 @@ constexpr bool tests() {
using Sentinel = sentinel_wrapper<Iterator>;
using FilterView = std::ranges::filter_view<minimal_view<Iterator, Sentinel>, AlwaysTrue>;
using FilterIterator = std::ranges::iterator_t<FilterView>;
- static_assert(!has_equal<FilterIterator>);
+ static_assert(!weakly_equality_comparable_with<FilterIterator>);
}
return true;
diff --git a/libcxx/test/std/ranges/range.adaptors/range.join/range.join.sentinel/eq.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.join/range.join.sentinel/eq.pass.cpp
index bc7d4bec94d3e6..823f112cbc956c 100644
--- a/libcxx/test/std/ranges/range.adaptors/range.join/range.join.sentinel/eq.pass.cpp
+++ b/libcxx/test/std/ranges/range.adaptors/range.join/range.join.sentinel/eq.pass.cpp
@@ -19,9 +19,7 @@
#include <type_traits>
#include "../types.h"
-
-template <class Iter, class Sent>
-concept EqualityComparable = std::invocable<std::equal_to<>, const Iter&, const Sent&> ;
+#include "test_range.h"
using Iterator = random_access_iterator<BufferView<int*>*>;
using ConstIterator = random_access_iterator<const BufferView<int*>*>;
@@ -53,9 +51,9 @@ struct ConstComparableView : BufferView<BufferView<int*>*> {
constexpr auto end() const { return ConstComparableSentinel<true>(ConstIterator(data_ + size_)); }
};
-static_assert(EqualityComparable<std::ranges::iterator_t<ConstComparableView>,
+static_assert(weakly_equality_comparable_with<std::ranges::iterator_t<ConstComparableView>,
std::ranges::sentinel_t<const ConstComparableView>>);
-static_assert(EqualityComparable<std::ranges::iterator_t<const ConstComparableView>,
+static_assert(weakly_equality_comparable_with<std::ranges::iterator_t<const ConstComparableView>,
std::ranges::sentinel_t<ConstComparableView>>);
constexpr bool test() {
diff --git a/libcxx/test/std/ranges/range.adaptors/range.lazy.split/range.lazy.split.inner/equal.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.lazy.split/range.lazy.split.inner/equal.pass.cpp
index 5a83a05ead9198..ae0fd164ae2dc0 100644
--- a/libcxx/test/std/ranges/range.adaptors/range.lazy.split/range.lazy.split.inner/equal.pass.cpp
+++ b/libcxx/test/std/ranges/range.adaptors/range.lazy.split/range.lazy.split.inner/equal.pass.cpp
@@ -17,13 +17,10 @@
#include <concepts>
#include <string_view>
+
#include "../types.h"
-template <class Iter>
-concept CanCallEquals = requires(const Iter& i) {
- i == i;
- i != i;
-};
+#include "test_range.h"
constexpr bool test() {
// When `View` is a forward range, `inner-iterator` supports both overloads of `operator==`.
@@ -56,7 +53,7 @@ constexpr bool test() {
auto b = val.begin();
std::same_as<std::default_sentinel_t> decltype(auto) e = val.end();
- static_assert(!CanCallEquals<decltype(b)>);
+ static_assert(!weakly_equality_comparable_with<decltype(b)>);
assert(!(b == std::default_sentinel));
assert(b != std::default_sentinel);
diff --git a/libcxx/test/std/ranges/range.adaptors/range.lazy.split/range.lazy.split.outer/equal.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.lazy.split/range.lazy.split.outer/equal.pass.cpp
index 49cac708947325..89193f566d528f 100644
--- a/libcxx/test/std/ranges/range.adaptors/range.lazy.split/range.lazy.split.outer/equal.pass.cpp
+++ b/libcxx/test/std/ranges/range.adaptors/range.lazy.split/range.lazy.split.outer/equal.pass.cpp
@@ -17,13 +17,10 @@
#include <concepts>
#include <string_view>
+
#include "../types.h"
-template <class Iter>
-concept CanCallEquals = requires(const Iter& i) {
- i == i;
- i != i;
-};
+#include "test_range.h"
constexpr bool test() {
// Forward range supports both overloads of `operator==`.
@@ -69,7 +66,7 @@ constexpr bool test() {
auto b = v.begin();
std::same_as<std::default_sentinel_t> decltype(auto) e = v.end();
- static_assert(!CanCallEquals<decltype(b)>);
+ static_assert(!weakly_equality_comparable_with<decltype(b)>);
assert(!(b == std::default_sentinel));
assert(b != std::default_sentinel);
diff --git a/libcxx/test/std/ranges/range.adaptors/range.take.while/sentinel/equality.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.take.while/sentinel/equality.pass.cpp
index db3e5764421af7..2533b5128cc9e6 100644
--- a/libcxx/test/std/ranges/range.adaptors/range.take.while/sentinel/equality.pass.cpp
+++ b/libcxx/test/std/ranges/range.adaptors/range.take.while/sentinel/equality.pass.cpp
@@ -70,36 +70,32 @@ struct LessThan3 {
constexpr bool operator()(int i) const { return i < 3; }
};
-// Test Constraint
-template <class I, class S>
-concept HasEqual = requires(const I i, const S s) { i == s; };
-
using std::ranges::iterator_t;
using std::ranges::sentinel_t;
using std::ranges::take_while_view;
-static_assert(HasEqual<iterator_t<take_while_view<R, LessThan3>>, //
+static_assert(weakly_equality_comparable_with<iterator_t<take_while_view<R, LessThan3>>, //
sentinel_t<take_while_view<R, LessThan3>>>);
-static_assert(!HasEqual<iterator_t<const take_while_view<R, LessThan3>>, //
+static_assert(!weakly_equality_comparable_with<iterator_t<const take_while_view<R, LessThan3>>, //
sentinel_t<take_while_view<R, LessThan3>>>);
-static_assert(!HasEqual<iterator_t<take_while_view<R, LessThan3>>, //
+static_assert(!weakly_equality_comparable_with<iterator_t<take_while_view<R, LessThan3>>, //
sentinel_t<const take_while_view<R, LessThan3>>>);
-static_assert(HasEqual<iterator_t<const take_while_view<R, LessThan3>>, //
+static_assert(weakly_equality_comparable_with<iterator_t<const take_while_view<R, LessThan3>>, //
sentinel_t<const take_while_view<R, LessThan3>>>);
-static_assert(HasEqual<iterator_t<take_while_view<R, LessThan3>>, //
+static_assert(weakly_equality_comparable_with<iterator_t<take_while_view<R, LessThan3>>, //
sentinel_t<take_while_view<R, LessThan3>>>);
-static_assert(HasEqual<iterator_t<const take_while_view<CrossComparableR, LessThan3>>, //
+static_assert(weakly_equality_comparable_with<iterator_t<const take_while_view<CrossComparableR, LessThan3>>, //
sentinel_t<take_while_view<CrossComparableR, LessThan3>>>);
-static_assert(HasEqual<iterator_t<take_while_view<CrossComparableR, LessThan3>>, //
+static_assert(weakly_equality_comparable_with<iterator_t<take_while_view<CrossComparableR, LessThan3>>, //
sentinel_t<const take_while_view<CrossComparableR, LessThan3>>>);
-static_assert(HasEqual<iterator_t<const take_while_view<CrossComparableR, LessThan3>>, //
+static_assert(weakly_equality_comparable_with<iterator_t<const take_while_view<CrossComparableR, LessThan3>>, //
sentinel_t<const take_while_view<CrossComparableR, LessThan3>>>);
template <class R, bool ConstIter, bool ConstSent>
diff --git a/libcxx/test/std/ranges/range.adaptors/range.zip/iterator/compare.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.zip/iterator/compare.pass.cpp
index fcbff722c39b3c..cf345300649836 100644
--- a/libcxx/test/std/ranges/range.adaptors/range.zip/iterator/compare.pass.cpp
+++ b/libcxx/test/std/ranges/range.adaptors/range.zip/iterator/compare.pass.cpp
@@ -26,6 +26,8 @@
#include <compare>
#include "test_iterators.h"
+#include "test_range.h"
+
#include "../types.h"
// This is for testing that zip iterator never calls underlying iterator's >, >=, <=, !=.
@@ -240,7 +242,7 @@ constexpr bool test() {
std::ranges::zip_view r(IterNoEqualView{buffer});
auto it = r.begin();
using Iter = decltype(it);
- static_assert(!std::invocable<std::equal_to<>, Iter, Iter>);
+ static_assert(!weakly_equality_comparable_with<Iter>);
inequalityOperatorsDoNotExistTest(it, it);
}
return true;
diff --git a/libcxx/test/std/ranges/range.adaptors/range.zip/sentinel/eq.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.zip/sentinel/eq.pass.cpp
index 5db73721108141..04542c3ae4d14d 100644
--- a/libcxx/test/std/ranges/range.adaptors/range.zip/sentinel/eq.pass.cpp
+++ b/libcxx/test/std/ranges/range.adaptors/range.zip/sentinel/eq.pass.cpp
@@ -18,6 +18,7 @@
#include <tuple>
#include "../types.h"
+#include "test_range.h"
using Iterator = random_access_iterator<int*>;
using ConstIterator = random_access_iterator<const int*>;
@@ -54,11 +55,6 @@ struct ConstIncompatibleView : std::ranges::view_base {
sentinel_wrapper<forward_iterator<const int*>> end() const;
};
-// clang-format off
-template <class Iter, class Sent>
-concept EqualComparable = std::invocable<std::equal_to<>, const Iter&, const Sent&>;
-// clang-format on
-
constexpr bool test() {
int buffer1[4] = {1, 2, 3, 4};
int buffer2[5] = {1, 2, 3, 4, 5};
@@ -95,10 +91,10 @@ constexpr bool test() {
using ConstSentinel = std::ranges::sentinel_t<const decltype(v)>;
static_assert(!std::is_same_v<Sentinel, ConstSentinel>);
- static_assert(EqualComparable<Iter, Sentinel>);
- static_assert(!EqualComparable<ConstIter, Sentinel>);
- static_assert(EqualComparable<Iter, ConstSentinel>);
- static_assert(EqualComparable<ConstIter, ConstSentinel>);
+ static_assert(weakly_equality_comparable_with<Iter, Sentinel>);
+ static_assert(!weakly_equality_comparable_with<ConstIter, Sentinel>);
+ static_assert(weakly_equality_comparable_with<Iter, ConstSentinel>);
+ static_assert(weakly_equality_comparable_with<ConstIter, ConstSentinel>);
}
{
@@ -120,10 +116,10 @@ constexpr bool test() {
using ConstSentinel = std::ranges::sentinel_t<const decltype(v)>;
static_assert(!std::is_same_v<Sentinel, ConstSentinel>);
- static_assert(EqualComparable<Iter, Sentinel>);
- static_assert(EqualComparable<ConstIter, Sentinel>);
- static_assert(EqualComparable<Iter, ConstSentinel>);
- static_assert(EqualComparable<ConstIter, ConstSentinel>);
+ static_assert(weakly_equality_comparable_with<Iter, Sentinel>);
+ static_assert(weakly_equality_comparable_with<ConstIter, Sentinel>);
+ static_assert(weakly_equality_comparable_with<Iter, ConstSentinel>);
+ static_assert(weakly_equality_comparable_with<ConstIter, ConstSentinel>);
}
{
@@ -139,10 +135,10 @@ constexpr bool test() {
using ConstSentinel = std::ranges::sentinel_t<const decltype(v)>;
static_assert(!std::is_same_v<Sentinel, ConstSentinel>);
- static_assert(EqualComparable<Iter, Sentinel>);
- static_assert(!EqualComparable<ConstIter, Sentinel>);
- static_assert(!EqualComparable<Iter, ConstSentinel>);
- static_assert(EqualComparable<ConstIter, ConstSentinel>);
+ static_assert(weakly_equality_comparable_with<Iter, Sentinel>);
+ static_assert(!weakly_equality_comparable_with<ConstIter, Sentinel>);
+ static_assert(!weakly_equality_comparable_with<Iter, ConstSentinel>);
+ static_assert(weakly_equality_comparable_with<ConstIter, ConstSentinel>);
}
return true;
}
diff --git a/libcxx/test/support/test_range.h b/libcxx/test/support/test_range.h
index c5eeb25bb59eba..6a0aada917d797 100644
--- a/libcxx/test/support/test_range.h
+++ b/libcxx/test/support/test_range.h
@@ -10,9 +10,11 @@
#define LIBCXX_TEST_SUPPORT_TEST_RANGE_H
#include <concepts>
+#include <functional>
#include <iterator>
#include <ranges>
+#include "__concepts/invocable.h"
#include "test_iterators.h"
#if TEST_STD_VER < 17
@@ -94,4 +96,12 @@ concept CanBePiped = requires(View&& view, T&& t) {
{ std::forward<View>(view) | std::forward<T>(t) };
};
+template <class T, class U = T>
+concept weakly_equality_comparable_with = requires(const T& t, const U& u) {
+ { t == u } -> std::same_as<bool>;
+ { t != u } -> std::same_as<bool>;
+ { u == t } -> std::same_as<bool>;
+ { u != t } -> std::same_as<bool>;
+};
+
#endif // LIBCXX_TEST_SUPPORT_TEST_RANGE_H
>From b98517ba5b21defae2b2f0bed53634c59b09220b Mon Sep 17 00:00:00 2001
From: Will Hawkins <hawkinsw at obs.cr>
Date: Wed, 17 Jan 2024 17:19:17 -0500
Subject: [PATCH 2/6] fixup! [libc++][NFC] Centralize test for support of ==
and != in ranges
Fix formatting.
---
.../range.elements/sentinel/equality.pass.cpp | 16 ++++++++--------
.../range.filter/iterator/compare.pass.cpp | 1 -
.../range.join/range.join.sentinel/eq.pass.cpp | 4 ++--
.../range.take.while/sentinel/equality.pass.cpp | 16 ++++++++--------
4 files changed, 18 insertions(+), 19 deletions(-)
diff --git a/libcxx/test/std/ranges/range.adaptors/range.elements/sentinel/equality.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.elements/sentinel/equality.pass.cpp
index e2ae7c6539c527..3db607b55444bc 100644
--- a/libcxx/test/std/ranges/range.adaptors/range.elements/sentinel/equality.pass.cpp
+++ b/libcxx/test/std/ranges/range.adaptors/range.elements/sentinel/equality.pass.cpp
@@ -69,28 +69,28 @@ using std::ranges::iterator_t;
using std::ranges::sentinel_t;
static_assert(weakly_equality_comparable_with<iterator_t<elements_view<R, 0>>, //
- sentinel_t<elements_view<R, 0>>>);
+ sentinel_t<elements_view<R, 0>>>);
static_assert(!weakly_equality_comparable_with<iterator_t<const elements_view<R, 0>>, //
- sentinel_t<elements_view<R, 0>>>);
+ sentinel_t<elements_view<R, 0>>>);
static_assert(!weakly_equality_comparable_with<iterator_t<elements_view<R, 0>>, //
- sentinel_t<const elements_view<R, 0>>>);
+ sentinel_t<const elements_view<R, 0>>>);
static_assert(weakly_equality_comparable_with<iterator_t<const elements_view<R, 0>>, //
- sentinel_t<const elements_view<R, 0>>>);
+ sentinel_t<const elements_view<R, 0>>>);
static_assert(weakly_equality_comparable_with<iterator_t<elements_view<R, 0>>, //
- sentinel_t<elements_view<R, 0>>>);
+ sentinel_t<elements_view<R, 0>>>);
static_assert(weakly_equality_comparable_with<iterator_t<const elements_view<CrossComparableR, 0>>, //
- sentinel_t<elements_view<CrossComparableR, 0>>>);
+ sentinel_t<elements_view<CrossComparableR, 0>>>);
static_assert(weakly_equality_comparable_with<iterator_t<elements_view<CrossComparableR, 0>>, //
- sentinel_t<const elements_view<CrossComparableR, 0>>>);
+ sentinel_t<const elements_view<CrossComparableR, 0>>>);
static_assert(weakly_equality_comparable_with<iterator_t<const elements_view<CrossComparableR, 0>>, //
- sentinel_t<const elements_view<CrossComparableR, 0>>>);
+ sentinel_t<const elements_view<CrossComparableR, 0>>>);
template <class R, bool ConstIter, bool ConstSent>
constexpr void testOne() {
diff --git a/libcxx/test/std/ranges/range.adaptors/range.filter/iterator/compare.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.filter/iterator/compare.pass.cpp
index 9dec5d81ddc2ed..fcbc503aab23d7 100644
--- a/libcxx/test/std/ranges/range.adaptors/range.filter/iterator/compare.pass.cpp
+++ b/libcxx/test/std/ranges/range.adaptors/range.filter/iterator/compare.pass.cpp
@@ -24,7 +24,6 @@
#include "../types.h"
-
template <class Iterator>
constexpr void test() {
using Sentinel = sentinel_wrapper<Iterator>;
diff --git a/libcxx/test/std/ranges/range.adaptors/range.join/range.join.sentinel/eq.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.join/range.join.sentinel/eq.pass.cpp
index 823f112cbc956c..9d6cb769026229 100644
--- a/libcxx/test/std/ranges/range.adaptors/range.join/range.join.sentinel/eq.pass.cpp
+++ b/libcxx/test/std/ranges/range.adaptors/range.join/range.join.sentinel/eq.pass.cpp
@@ -52,9 +52,9 @@ struct ConstComparableView : BufferView<BufferView<int*>*> {
};
static_assert(weakly_equality_comparable_with<std::ranges::iterator_t<ConstComparableView>,
- std::ranges::sentinel_t<const ConstComparableView>>);
+ std::ranges::sentinel_t<const ConstComparableView>>);
static_assert(weakly_equality_comparable_with<std::ranges::iterator_t<const ConstComparableView>,
- std::ranges::sentinel_t<ConstComparableView>>);
+ std::ranges::sentinel_t<ConstComparableView>>);
constexpr bool test() {
int buffer[4][4] = {{1111, 2222, 3333, 4444}, {555, 666, 777, 888}, {99, 1010, 1111, 1212}, {13, 14, 15, 16}};
diff --git a/libcxx/test/std/ranges/range.adaptors/range.take.while/sentinel/equality.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.take.while/sentinel/equality.pass.cpp
index 2533b5128cc9e6..76e337ded52c6d 100644
--- a/libcxx/test/std/ranges/range.adaptors/range.take.while/sentinel/equality.pass.cpp
+++ b/libcxx/test/std/ranges/range.adaptors/range.take.while/sentinel/equality.pass.cpp
@@ -75,28 +75,28 @@ using std::ranges::sentinel_t;
using std::ranges::take_while_view;
static_assert(weakly_equality_comparable_with<iterator_t<take_while_view<R, LessThan3>>, //
- sentinel_t<take_while_view<R, LessThan3>>>);
+ sentinel_t<take_while_view<R, LessThan3>>>);
static_assert(!weakly_equality_comparable_with<iterator_t<const take_while_view<R, LessThan3>>, //
- sentinel_t<take_while_view<R, LessThan3>>>);
+ sentinel_t<take_while_view<R, LessThan3>>>);
static_assert(!weakly_equality_comparable_with<iterator_t<take_while_view<R, LessThan3>>, //
- sentinel_t<const take_while_view<R, LessThan3>>>);
+ sentinel_t<const take_while_view<R, LessThan3>>>);
static_assert(weakly_equality_comparable_with<iterator_t<const take_while_view<R, LessThan3>>, //
- sentinel_t<const take_while_view<R, LessThan3>>>);
+ sentinel_t<const take_while_view<R, LessThan3>>>);
static_assert(weakly_equality_comparable_with<iterator_t<take_while_view<R, LessThan3>>, //
- sentinel_t<take_while_view<R, LessThan3>>>);
+ sentinel_t<take_while_view<R, LessThan3>>>);
static_assert(weakly_equality_comparable_with<iterator_t<const take_while_view<CrossComparableR, LessThan3>>, //
- sentinel_t<take_while_view<CrossComparableR, LessThan3>>>);
+ sentinel_t<take_while_view<CrossComparableR, LessThan3>>>);
static_assert(weakly_equality_comparable_with<iterator_t<take_while_view<CrossComparableR, LessThan3>>, //
- sentinel_t<const take_while_view<CrossComparableR, LessThan3>>>);
+ sentinel_t<const take_while_view<CrossComparableR, LessThan3>>>);
static_assert(weakly_equality_comparable_with<iterator_t<const take_while_view<CrossComparableR, LessThan3>>, //
- sentinel_t<const take_while_view<CrossComparableR, LessThan3>>>);
+ sentinel_t<const take_while_view<CrossComparableR, LessThan3>>>);
template <class R, bool ConstIter, bool ConstSent>
constexpr void testOne() {
>From 811695b6f09c7d3022bf51b6468bf6aa71dc15bb Mon Sep 17 00:00:00 2001
From: Will Hawkins <hawkinsw at obs.cr>
Date: Wed, 13 Mar 2024 17:47:07 -0400
Subject: [PATCH 3/6] fixup! [libc++][NFC] Centralize test for support of ==
and != in ranges
Address feedback.
---
.../range.adaptors/range.elements/iterator/compare.pass.cpp | 2 +-
.../range.elements/sentinel/equality.pass.cpp | 4 ++--
.../range.adaptors/range.filter/iterator/compare.pass.cpp | 2 +-
.../range.lazy.split/range.lazy.split.inner/equal.pass.cpp | 2 +-
.../range.lazy.split/range.lazy.split.outer/equal.pass.cpp | 2 +-
.../range.take.while/sentinel/equality.pass.cpp | 4 ++--
.../range.adaptors/range.zip/iterator/compare.pass.cpp | 2 +-
libcxx/test/support/test_range.h | 6 +++---
libcxx/utils/libcxx/test/format.py | 1 +
9 files changed, 13 insertions(+), 12 deletions(-)
diff --git a/libcxx/test/std/ranges/range.adaptors/range.elements/iterator/compare.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.elements/iterator/compare.pass.cpp
index 8d946d4f5d6e8b..4dd52a80a0ebad 100644
--- a/libcxx/test/std/ranges/range.adaptors/range.elements/iterator/compare.pass.cpp
+++ b/libcxx/test/std/ranges/range.adaptors/range.elements/iterator/compare.pass.cpp
@@ -140,7 +140,7 @@ constexpr bool test() {
auto it = ev.begin();
using ElemIter = decltype(it);
- static_assert(!weakly_equality_comparable_with<ElemIter>);
+ static_assert(!weakly_equality_comparable_with<ElemIter, ElemIter>);
inequalityOperatorsDoNotExistTest(it, it);
}
diff --git a/libcxx/test/std/ranges/range.adaptors/range.elements/sentinel/equality.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.elements/sentinel/equality.pass.cpp
index 3db607b55444bc..d8a3149398bf75 100644
--- a/libcxx/test/std/ranges/range.adaptors/range.elements/sentinel/equality.pass.cpp
+++ b/libcxx/test/std/ranges/range.adaptors/range.elements/sentinel/equality.pass.cpp
@@ -80,8 +80,8 @@ static_assert(!weakly_equality_comparable_with<iterator_t<elements_view<R, 0>>,
static_assert(weakly_equality_comparable_with<iterator_t<const elements_view<R, 0>>, //
sentinel_t<const elements_view<R, 0>>>);
-static_assert(weakly_equality_comparable_with<iterator_t<elements_view<R, 0>>, //
- sentinel_t<elements_view<R, 0>>>);
+static_assert(weakly_equality_comparable_with<iterator_t<elements_view<CrossComparableR, 0>>, //
+ sentinel_t<elements_view<CrossComparableR, 0>>>);
static_assert(weakly_equality_comparable_with<iterator_t<const elements_view<CrossComparableR, 0>>, //
sentinel_t<elements_view<CrossComparableR, 0>>>);
diff --git a/libcxx/test/std/ranges/range.adaptors/range.filter/iterator/compare.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.filter/iterator/compare.pass.cpp
index fcbc503aab23d7..11cba3c1ba3080 100644
--- a/libcxx/test/std/ranges/range.adaptors/range.filter/iterator/compare.pass.cpp
+++ b/libcxx/test/std/ranges/range.adaptors/range.filter/iterator/compare.pass.cpp
@@ -76,7 +76,7 @@ constexpr bool tests() {
using Sentinel = sentinel_wrapper<Iterator>;
using FilterView = std::ranges::filter_view<minimal_view<Iterator, Sentinel>, AlwaysTrue>;
using FilterIterator = std::ranges::iterator_t<FilterView>;
- static_assert(!weakly_equality_comparable_with<FilterIterator>);
+ static_assert(!weakly_equality_comparable_with<FilterIterator, FilterIterator>);
}
return true;
diff --git a/libcxx/test/std/ranges/range.adaptors/range.lazy.split/range.lazy.split.inner/equal.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.lazy.split/range.lazy.split.inner/equal.pass.cpp
index ae0fd164ae2dc0..dbf3bfa126ae8a 100644
--- a/libcxx/test/std/ranges/range.adaptors/range.lazy.split/range.lazy.split.inner/equal.pass.cpp
+++ b/libcxx/test/std/ranges/range.adaptors/range.lazy.split/range.lazy.split.inner/equal.pass.cpp
@@ -53,7 +53,7 @@ constexpr bool test() {
auto b = val.begin();
std::same_as<std::default_sentinel_t> decltype(auto) e = val.end();
- static_assert(!weakly_equality_comparable_with<decltype(b)>);
+ static_assert(!weakly_equality_comparable_with<decltype(b), decltype(b)>);
assert(!(b == std::default_sentinel));
assert(b != std::default_sentinel);
diff --git a/libcxx/test/std/ranges/range.adaptors/range.lazy.split/range.lazy.split.outer/equal.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.lazy.split/range.lazy.split.outer/equal.pass.cpp
index 89193f566d528f..6cbc98a94645f5 100644
--- a/libcxx/test/std/ranges/range.adaptors/range.lazy.split/range.lazy.split.outer/equal.pass.cpp
+++ b/libcxx/test/std/ranges/range.adaptors/range.lazy.split/range.lazy.split.outer/equal.pass.cpp
@@ -66,7 +66,7 @@ constexpr bool test() {
auto b = v.begin();
std::same_as<std::default_sentinel_t> decltype(auto) e = v.end();
- static_assert(!weakly_equality_comparable_with<decltype(b)>);
+ static_assert(!weakly_equality_comparable_with<decltype(b), decltype(b)>);
assert(!(b == std::default_sentinel));
assert(b != std::default_sentinel);
diff --git a/libcxx/test/std/ranges/range.adaptors/range.take.while/sentinel/equality.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.take.while/sentinel/equality.pass.cpp
index 76e337ded52c6d..b00b3dd0bd053c 100644
--- a/libcxx/test/std/ranges/range.adaptors/range.take.while/sentinel/equality.pass.cpp
+++ b/libcxx/test/std/ranges/range.adaptors/range.take.while/sentinel/equality.pass.cpp
@@ -86,8 +86,8 @@ static_assert(!weakly_equality_comparable_with<iterator_t<take_while_view<R, Les
static_assert(weakly_equality_comparable_with<iterator_t<const take_while_view<R, LessThan3>>, //
sentinel_t<const take_while_view<R, LessThan3>>>);
-static_assert(weakly_equality_comparable_with<iterator_t<take_while_view<R, LessThan3>>, //
- sentinel_t<take_while_view<R, LessThan3>>>);
+static_assert(weakly_equality_comparable_with<iterator_t<take_while_view<CrossComparableR, LessThan3>>, //
+ sentinel_t<take_while_view<CrossComparableR, LessThan3>>>);
static_assert(weakly_equality_comparable_with<iterator_t<const take_while_view<CrossComparableR, LessThan3>>, //
sentinel_t<take_while_view<CrossComparableR, LessThan3>>>);
diff --git a/libcxx/test/std/ranges/range.adaptors/range.zip/iterator/compare.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.zip/iterator/compare.pass.cpp
index cf345300649836..ed1cb0ccebd2b5 100644
--- a/libcxx/test/std/ranges/range.adaptors/range.zip/iterator/compare.pass.cpp
+++ b/libcxx/test/std/ranges/range.adaptors/range.zip/iterator/compare.pass.cpp
@@ -242,7 +242,7 @@ constexpr bool test() {
std::ranges::zip_view r(IterNoEqualView{buffer});
auto it = r.begin();
using Iter = decltype(it);
- static_assert(!weakly_equality_comparable_with<Iter>);
+ static_assert(!weakly_equality_comparable_with<Iter, Iter>);
inequalityOperatorsDoNotExistTest(it, it);
}
return true;
diff --git a/libcxx/test/support/test_range.h b/libcxx/test/support/test_range.h
index 6a0aada917d797..dc445a69331538 100644
--- a/libcxx/test/support/test_range.h
+++ b/libcxx/test/support/test_range.h
@@ -13,8 +13,8 @@
#include <functional>
#include <iterator>
#include <ranges>
+#include <type_traits>
-#include "__concepts/invocable.h"
#include "test_iterators.h"
#if TEST_STD_VER < 17
@@ -96,8 +96,8 @@ concept CanBePiped = requires(View&& view, T&& t) {
{ std::forward<View>(view) | std::forward<T>(t) };
};
-template <class T, class U = T>
-concept weakly_equality_comparable_with = requires(const T& t, const U& u) {
+template <class T, class U>
+concept weakly_equality_comparable_with = requires(const std::remove_reference_t<T>& t, const std::remove_reference_t<U>& u) {
{ t == u } -> std::same_as<bool>;
{ t != u } -> std::same_as<bool>;
{ u == t } -> std::same_as<bool>;
diff --git a/libcxx/utils/libcxx/test/format.py b/libcxx/utils/libcxx/test/format.py
index 7e5281c0b74064..1bffd0c028622e 100644
--- a/libcxx/utils/libcxx/test/format.py
+++ b/libcxx/utils/libcxx/test/format.py
@@ -281,6 +281,7 @@ def getTestsForPath(self, testSuite, pathInSuite, litConfig, localConfig):
for test in self._generateGenTest(testSuite, pathInSuite, litConfig, localConfig):
yield test
else:
+ print(f"{localConfig.substitutions=}")
yield lit.Test.Test(testSuite, pathInSuite, localConfig)
def execute(self, test, litConfig):
>From 43ded7e349e4e2cc12c8dd167ac1c7f8eb44211f Mon Sep 17 00:00:00 2001
From: Will Hawkins <hawkinsw at obs.cr>
Date: Wed, 13 Mar 2024 22:22:49 -0400
Subject: [PATCH 4/6] fixup! [libc++][NFC] Centralize test for support of ==
and != in ranges
Fix formatting issues.
---
libcxx/test/support/test_range.h | 13 +++++++------
1 file changed, 7 insertions(+), 6 deletions(-)
diff --git a/libcxx/test/support/test_range.h b/libcxx/test/support/test_range.h
index dc445a69331538..f9ddd0e7ad6c4e 100644
--- a/libcxx/test/support/test_range.h
+++ b/libcxx/test/support/test_range.h
@@ -97,11 +97,12 @@ concept CanBePiped = requires(View&& view, T&& t) {
};
template <class T, class U>
-concept weakly_equality_comparable_with = requires(const std::remove_reference_t<T>& t, const std::remove_reference_t<U>& u) {
- { t == u } -> std::same_as<bool>;
- { t != u } -> std::same_as<bool>;
- { u == t } -> std::same_as<bool>;
- { u != t } -> std::same_as<bool>;
-};
+concept weakly_equality_comparable_with =
+ requires(const std::remove_reference_t<T>& t, const std::remove_reference_t<U>& u) {
+ { t == u } -> std::same_as<bool>;
+ { t != u } -> std::same_as<bool>;
+ { u == t } -> std::same_as<bool>;
+ { u != t } -> std::same_as<bool>;
+ };
#endif // LIBCXX_TEST_SUPPORT_TEST_RANGE_H
>From 5ced487209537f8deb37436ffa5a256390147ca5 Mon Sep 17 00:00:00 2001
From: Will Hawkins <hawkinsw at obs.cr>
Date: Thu, 28 Mar 2024 02:11:38 -0400
Subject: [PATCH 5/6] fixup! [libc++][NFC] Centralize test for support of ==
and != in ranges
Remove extraneous change from lit python.
---
libcxx/utils/libcxx/test/format.py | 1 -
1 file changed, 1 deletion(-)
diff --git a/libcxx/utils/libcxx/test/format.py b/libcxx/utils/libcxx/test/format.py
index 1bffd0c028622e..7e5281c0b74064 100644
--- a/libcxx/utils/libcxx/test/format.py
+++ b/libcxx/utils/libcxx/test/format.py
@@ -281,7 +281,6 @@ def getTestsForPath(self, testSuite, pathInSuite, litConfig, localConfig):
for test in self._generateGenTest(testSuite, pathInSuite, litConfig, localConfig):
yield test
else:
- print(f"{localConfig.substitutions=}")
yield lit.Test.Test(testSuite, pathInSuite, localConfig)
def execute(self, test, litConfig):
>From d072b602495d56acb3ea5ad7de3a50737aa70251 Mon Sep 17 00:00:00 2001
From: Will Hawkins <hawkinsw at obs.cr>
Date: Mon, 1 Apr 2024 21:02:51 -0400
Subject: [PATCH 6/6] fixup! [libc++][NFC] Centralize test for support of ==
and != in ranges
Addressing final feedback and consolidating one final spot.
---
.../range.take/range.take.sentinel/eq.pass.cpp | 9 +--------
libcxx/test/support/test_range.h | 1 +
2 files changed, 2 insertions(+), 8 deletions(-)
diff --git a/libcxx/test/std/ranges/range.adaptors/range.take/range.take.sentinel/eq.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.take/range.take.sentinel/eq.pass.cpp
index e6f433e30f60db..1e4d2a4dccfa45 100644
--- a/libcxx/test/std/ranges/range.adaptors/range.take/range.take.sentinel/eq.pass.cpp
+++ b/libcxx/test/std/ranges/range.adaptors/range.take/range.take.sentinel/eq.pass.cpp
@@ -21,6 +21,7 @@
#include "test_comparisons.h"
#include "test_iterators.h"
+#include "test_range.h"
template <bool Const>
using MaybeConstIterator = cpp20_input_iterator<std::conditional_t<Const, const int*, int*>>;
@@ -77,14 +78,6 @@ struct NonCrossConstComparableView : std::ranges::view_base {
static_assert(std::ranges::range<NonCrossConstComparableView>);
static_assert(std::ranges::range<const NonCrossConstComparableView>);
-template <class T, class U>
-concept weakly_equality_comparable_with = requires(const T& t, const U& u) {
- t == u;
- t != u;
- u == t;
- u != t;
-};
-
constexpr bool test() {
int buffer[8] = {1, 2, 3, 4, 5, 6, 7, 8};
using CrossConstComparableTakeView = std::ranges::take_view<CrossConstComparableView>;
diff --git a/libcxx/test/support/test_range.h b/libcxx/test/support/test_range.h
index f9ddd0e7ad6c4e..4efa26f2664753 100644
--- a/libcxx/test/support/test_range.h
+++ b/libcxx/test/support/test_range.h
@@ -96,6 +96,7 @@ concept CanBePiped = requires(View&& view, T&& t) {
{ std::forward<View>(view) | std::forward<T>(t) };
};
+// See [concept.equalitycomparable]
template <class T, class U>
concept weakly_equality_comparable_with =
requires(const std::remove_reference_t<T>& t, const std::remove_reference_t<U>& u) {
More information about the libcxx-commits
mailing list