[libcxx-commits] [libcxx] [libc++] LWG4012: common_view::begin/end are missing the simple-view check (PR #153674)
Nhat Nguyen via libcxx-commits
libcxx-commits at lists.llvm.org
Tue Aug 19 12:01:02 PDT 2025
https://github.com/changkhothuychung updated https://github.com/llvm/llvm-project/pull/153674
>From 06a6c6168ca510ed773346f57693a2b273451208 Mon Sep 17 00:00:00 2001
From: changkhothuychung <nhat7203 at gmail.com>
Date: Thu, 14 Aug 2025 16:35:58 -0400
Subject: [PATCH 1/8] initial commit
---
libcxx/include/__ranges/common_view.h | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/libcxx/include/__ranges/common_view.h b/libcxx/include/__ranges/common_view.h
index 133236dd1d78a..ff26a78c00052 100644
--- a/libcxx/include/__ranges/common_view.h
+++ b/libcxx/include/__ranges/common_view.h
@@ -58,7 +58,7 @@ class common_view : public view_interface<common_view<_View>> {
_LIBCPP_HIDE_FROM_ABI constexpr _View base() && { return std::move(__base_); }
- _LIBCPP_HIDE_FROM_ABI constexpr auto begin() {
+ _LIBCPP_HIDE_FROM_ABI constexpr auto begin() requires (!__simple_view<_View>) {
if constexpr (random_access_range<_View> && sized_range<_View>)
return ranges::begin(__base_);
else
@@ -74,7 +74,7 @@ class common_view : public view_interface<common_view<_View>> {
return common_iterator<iterator_t<const _View>, sentinel_t<const _View>>(ranges::begin(__base_));
}
- _LIBCPP_HIDE_FROM_ABI constexpr auto end() {
+ _LIBCPP_HIDE_FROM_ABI constexpr auto end() requires (!__simple_view<_View>) {
if constexpr (random_access_range<_View> && sized_range<_View>)
return ranges::begin(__base_) + ranges::size(__base_);
else
>From 31d0cefaf9ffe931a58d7cabd4afbb1fe7e287bf Mon Sep 17 00:00:00 2001
From: changkhothuychung <nhat7203 at gmail.com>
Date: Thu, 14 Aug 2025 16:43:57 -0400
Subject: [PATCH 2/8] clang format
---
libcxx/include/__ranges/common_view.h | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/libcxx/include/__ranges/common_view.h b/libcxx/include/__ranges/common_view.h
index ff26a78c00052..54bb8039b48af 100644
--- a/libcxx/include/__ranges/common_view.h
+++ b/libcxx/include/__ranges/common_view.h
@@ -58,7 +58,9 @@ class common_view : public view_interface<common_view<_View>> {
_LIBCPP_HIDE_FROM_ABI constexpr _View base() && { return std::move(__base_); }
- _LIBCPP_HIDE_FROM_ABI constexpr auto begin() requires (!__simple_view<_View>) {
+ _LIBCPP_HIDE_FROM_ABI constexpr auto begin()
+ requires(!__simple_view<_View>)
+ {
if constexpr (random_access_range<_View> && sized_range<_View>)
return ranges::begin(__base_);
else
@@ -74,7 +76,9 @@ class common_view : public view_interface<common_view<_View>> {
return common_iterator<iterator_t<const _View>, sentinel_t<const _View>>(ranges::begin(__base_));
}
- _LIBCPP_HIDE_FROM_ABI constexpr auto end() requires (!__simple_view<_View>) {
+ _LIBCPP_HIDE_FROM_ABI constexpr auto end()
+ requires(!__simple_view<_View>)
+ {
if constexpr (random_access_range<_View> && sized_range<_View>)
return ranges::begin(__base_) + ranges::size(__base_);
else
>From 265621cf45d58a768b83130da2fd2c071a5f21c3 Mon Sep 17 00:00:00 2001
From: changkhothuychung <nhat7203 at gmail.com>
Date: Mon, 18 Aug 2025 15:54:31 -0400
Subject: [PATCH 3/8] sfinae test
---
.../range.common.view/begin.pass.cpp | 31 ++++++++++++++++---
.../range.common.view/end.pass.cpp | 7 +++++
.../range.adaptors/range.common.view/types.h | 13 ++++++++
3 files changed, 46 insertions(+), 5 deletions(-)
diff --git a/libcxx/test/std/ranges/range.adaptors/range.common.view/begin.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.common.view/begin.pass.cpp
index 96116dc37553a..ab74e1efb930f 100644
--- a/libcxx/test/std/ranges/range.adaptors/range.common.view/begin.pass.cpp
+++ b/libcxx/test/std/ranges/range.adaptors/range.common.view/begin.pass.cpp
@@ -25,16 +25,30 @@ struct MutableView : std::ranges::view_base {
sentinel_wrapper<int*> end();
};
-template<class View>
-concept BeginEnabled = requires(View v) { v.begin(); };
+template <class T>
+concept HasConstBegin = requires(const T& ct) { ct.begin(); };
+
+template <class T>
+concept HasBegin = requires(T& t) { t.begin(); };
+
+template <class T>
+concept HasConstAndNonConstBegin = HasConstBegin<T> && requires(T& t, const T& ct) {
+ requires !std::same_as<decltype(t.begin()), decltype(ct.begin())>;
+};
+
+template <class T>
+concept HasOnlyNonConstBegin = HasBegin<T> && !HasConstBegin<T>;
+
+template <class T>
+concept HasOnlyConstBegin = HasConstBegin<T> && !HasConstAndNonConstBegin<T>;
constexpr bool test() {
int buf[8] = {1, 2, 3, 4, 5, 6, 7, 8};
{
- static_assert( BeginEnabled<std::ranges::common_view<CopyableView> const&>);
- static_assert( BeginEnabled<std::ranges::common_view<MutableView>&>);
- static_assert(!BeginEnabled<std::ranges::common_view<MutableView> const&>);
+ static_assert( HasBegin<std::ranges::common_view<CopyableView> const&>);
+ static_assert( HasBegin<std::ranges::common_view<MutableView>&>);
+ static_assert(!HasBegin<std::ranges::common_view<MutableView> const&>);
}
{
@@ -51,6 +65,13 @@ constexpr bool test() {
assert(begin == std::ranges::begin(view));
}
+ {
+ NonSimpleNonCommonView view{buf, buf + 8};
+ std::ranges::common_view<NonSimpleNonCommonView> common(view);
+ static_assert(!std::ranges::__simple_view<NonSimpleNonCommonView>);
+ static_assert(!std::is_same_v<decltype(common.begin()), decltype(std::as_const(common).begin())>);
+ }
+
return true;
}
diff --git a/libcxx/test/std/ranges/range.adaptors/range.common.view/end.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.common.view/end.pass.cpp
index 0565ed02f2716..8feb028e93893 100644
--- a/libcxx/test/std/ranges/range.adaptors/range.common.view/end.pass.cpp
+++ b/libcxx/test/std/ranges/range.adaptors/range.common.view/end.pass.cpp
@@ -39,6 +39,13 @@ constexpr bool test() {
assert(base(end) == buf + 8);
}
+ {
+ NonSimpleNonCommonView view{buf, buf + 8};
+ std::ranges::common_view<NonSimpleNonCommonView> common(view);
+ static_assert(!std::ranges::__simple_view<NonSimpleNonCommonView>);
+ static_assert(!std::is_same_v<decltype(common.end()), decltype(std::as_const(common).end())>);
+ }
+
return true;
}
diff --git a/libcxx/test/std/ranges/range.adaptors/range.common.view/types.h b/libcxx/test/std/ranges/range.adaptors/range.common.view/types.h
index 18354483fd329..dca4b7a33d348 100644
--- a/libcxx/test/std/ranges/range.adaptors/range.common.view/types.h
+++ b/libcxx/test/std/ranges/range.adaptors/range.common.view/types.h
@@ -90,4 +90,17 @@ struct NonCommonView : std::ranges::view_base {
static_assert( std::ranges::view<NonCommonView>);
static_assert(!std::ranges::common_range<NonCommonView>);
+
+template<bool Simple>
+struct NonCommonBaseView: std::ranges::view_base {
+ int* begin_;
+ int* end_;
+ constexpr explicit NonCommonBaseView(int* b, int* e) : begin_(b), end_(e) { }
+ constexpr auto begin() const { return static_cast<const int*>(begin_); }
+ constexpr auto end() const { return sentinel_wrapper<const int*>(end_); }
+ constexpr int *begin() requires (!Simple) { return begin_; }
+ constexpr auto end() requires (!Simple) { return sentinel_wrapper<int*>(end_); }
+};
+using NonSimpleNonCommonView = NonCommonBaseView<false>;
+
#endif // TEST_STD_RANGES_RANGE_ADAPTORS_RANGE_COMMON_VIEW_TYPES_H
>From 476a5f37576c5338cb159592bf9183c676fd1e26 Mon Sep 17 00:00:00 2001
From: changkhothuychung <nhat7203 at gmail.com>
Date: Mon, 18 Aug 2025 16:01:16 -0400
Subject: [PATCH 4/8] fix test
---
.../range.common.view/begin.pass.cpp | 24 ++++---------------
.../range.adaptors/range.common.view/types.h | 22 +++++++++++++++++
2 files changed, 27 insertions(+), 19 deletions(-)
diff --git a/libcxx/test/std/ranges/range.adaptors/range.common.view/begin.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.common.view/begin.pass.cpp
index ab74e1efb930f..26b26398bf88a 100644
--- a/libcxx/test/std/ranges/range.adaptors/range.common.view/begin.pass.cpp
+++ b/libcxx/test/std/ranges/range.adaptors/range.common.view/begin.pass.cpp
@@ -25,30 +25,16 @@ struct MutableView : std::ranges::view_base {
sentinel_wrapper<int*> end();
};
-template <class T>
-concept HasConstBegin = requires(const T& ct) { ct.begin(); };
-
-template <class T>
-concept HasBegin = requires(T& t) { t.begin(); };
-
-template <class T>
-concept HasConstAndNonConstBegin = HasConstBegin<T> && requires(T& t, const T& ct) {
- requires !std::same_as<decltype(t.begin()), decltype(ct.begin())>;
-};
-
-template <class T>
-concept HasOnlyNonConstBegin = HasBegin<T> && !HasConstBegin<T>;
-
-template <class T>
-concept HasOnlyConstBegin = HasConstBegin<T> && !HasConstAndNonConstBegin<T>;
+template<class View>
+concept BeginEnabled = requires(View v) { v.begin(); };
constexpr bool test() {
int buf[8] = {1, 2, 3, 4, 5, 6, 7, 8};
{
- static_assert( HasBegin<std::ranges::common_view<CopyableView> const&>);
- static_assert( HasBegin<std::ranges::common_view<MutableView>&>);
- static_assert(!HasBegin<std::ranges::common_view<MutableView> const&>);
+ static_assert( BeginEnabled<std::ranges::common_view<CopyableView> const&>);
+ static_assert( BeginEnabled<std::ranges::common_view<MutableView>&>);
+ static_assert(!BeginEnabled<std::ranges::common_view<MutableView> const&>);
}
{
diff --git a/libcxx/test/std/ranges/range.adaptors/range.common.view/types.h b/libcxx/test/std/ranges/range.adaptors/range.common.view/types.h
index dca4b7a33d348..93bc5f5283300 100644
--- a/libcxx/test/std/ranges/range.adaptors/range.common.view/types.h
+++ b/libcxx/test/std/ranges/range.adaptors/range.common.view/types.h
@@ -90,6 +90,22 @@ struct NonCommonView : std::ranges::view_base {
static_assert( std::ranges::view<NonCommonView>);
static_assert(!std::ranges::common_range<NonCommonView>);
+template <class T>
+concept HasConstBegin = requires(const T& ct) { ct.begin(); };
+
+template <class T>
+concept HasBegin = requires(T& t) { t.begin(); };
+
+template <class T>
+concept HasConstAndNonConstBegin = HasConstBegin<T> && requires(T& t, const T& ct) {
+ requires !std::same_as<decltype(t.begin()), decltype(ct.begin())>;
+};
+
+template <class T>
+concept HasOnlyNonConstBegin = HasBegin<T> && !HasConstBegin<T>;
+
+template <class T>
+concept HasOnlyConstBegin = HasConstBegin<T> && !HasConstAndNonConstBegin<T>;
template<bool Simple>
struct NonCommonBaseView: std::ranges::view_base {
@@ -103,4 +119,10 @@ struct NonCommonBaseView: std::ranges::view_base {
};
using NonSimpleNonCommonView = NonCommonBaseView<false>;
+static_assert(!HasOnlyNonConstBegin<std::ranges::common_view<const NonSimpleNonCommonView>>);
+static_assert(!HasOnlyConstBegin<std::ranges::common_view<NonSimpleNonCommonView>>);
+static_assert(HasConstAndNonConstBegin<std::ranges::common_view<NonSimpleNonCommonView>>);
+static_assert(HasConstBegin<std::ranges::common_view<const NonSimpleNonCommonView>>);
+static_assert(HasOnlyConstBegin<std::ranges::common_view<const NonSimpleNonCommonView>>);
+
#endif // TEST_STD_RANGES_RANGE_ADAPTORS_RANGE_COMMON_VIEW_TYPES_H
>From 3576d9de80a481e5b0886ba1d07dcf0589e82e73 Mon Sep 17 00:00:00 2001
From: changkhothuychung <nhat7203 at gmail.com>
Date: Mon, 18 Aug 2025 16:08:12 -0400
Subject: [PATCH 5/8] fix test and clang format
---
.../range.adaptors/range.common.view/types.h | 64 +++++++++++--------
1 file changed, 37 insertions(+), 27 deletions(-)
diff --git a/libcxx/test/std/ranges/range.adaptors/range.common.view/types.h b/libcxx/test/std/ranges/range.adaptors/range.common.view/types.h
index 93bc5f5283300..71c0bed9f5f8e 100644
--- a/libcxx/test/std/ranges/range.adaptors/range.common.view/types.h
+++ b/libcxx/test/std/ranges/range.adaptors/range.common.view/types.h
@@ -14,10 +14,10 @@
#include "test_iterators.h"
struct DefaultConstructibleView : std::ranges::view_base {
- int* begin_ = nullptr;
- int* end_ = nullptr;
+ int* begin_ = nullptr;
+ int* end_ = nullptr;
explicit DefaultConstructibleView() = default;
- constexpr int *begin() const { return begin_; }
+ constexpr int* begin() const { return begin_; }
constexpr auto end() const { return sentinel_wrapper<int*>(end_); }
};
static_assert(std::ranges::view<DefaultConstructibleView>);
@@ -26,21 +26,21 @@ static_assert(std::default_initializable<DefaultConstructibleView>);
struct MoveOnlyView : std::ranges::view_base {
int* begin_;
int* end_;
- constexpr explicit MoveOnlyView(int* b, int* e) : begin_(b), end_(e) { }
- constexpr MoveOnlyView(MoveOnlyView&&) = default;
+ constexpr explicit MoveOnlyView(int* b, int* e) : begin_(b), end_(e) {}
+ constexpr MoveOnlyView(MoveOnlyView&&) = default;
constexpr MoveOnlyView& operator=(MoveOnlyView&&) = default;
- constexpr int *begin() const { return begin_; }
+ constexpr int* begin() const { return begin_; }
constexpr auto end() const { return sentinel_wrapper<int*>(end_); }
};
-static_assert( std::ranges::view<MoveOnlyView>);
-static_assert( std::ranges::contiguous_range<MoveOnlyView>);
+static_assert(std::ranges::view<MoveOnlyView>);
+static_assert(std::ranges::contiguous_range<MoveOnlyView>);
static_assert(!std::copyable<MoveOnlyView>);
struct CopyableView : std::ranges::view_base {
int* begin_;
int* end_;
- constexpr explicit CopyableView(int* b, int* e) : begin_(b), end_(e) { }
- constexpr int *begin() const { return begin_; }
+ constexpr explicit CopyableView(int* b, int* e) : begin_(b), end_(e) {}
+ constexpr int* begin() const { return begin_; }
constexpr auto end() const { return sentinel_wrapper<int*>(end_); }
};
static_assert(std::ranges::view<CopyableView>);
@@ -50,7 +50,7 @@ using ForwardIter = forward_iterator<int*>;
struct SizedForwardView : std::ranges::view_base {
int* begin_;
int* end_;
- constexpr explicit SizedForwardView(int* b, int* e) : begin_(b), end_(e) { }
+ constexpr explicit SizedForwardView(int* b, int* e) : begin_(b), end_(e) {}
constexpr auto begin() const { return forward_iterator<int*>(begin_); }
constexpr auto end() const { return sized_sentinel<forward_iterator<int*>>(forward_iterator<int*>(end_)); }
};
@@ -62,9 +62,11 @@ using RandomAccessIter = random_access_iterator<int*>;
struct SizedRandomAccessView : std::ranges::view_base {
int* begin_;
int* end_;
- constexpr explicit SizedRandomAccessView(int* b, int* e) : begin_(b), end_(e) { }
+ constexpr explicit SizedRandomAccessView(int* b, int* e) : begin_(b), end_(e) {}
constexpr auto begin() const { return random_access_iterator<int*>(begin_); }
- constexpr auto end() const { return sized_sentinel<random_access_iterator<int*>>(random_access_iterator<int*>(end_)); }
+ constexpr auto end() const {
+ return sized_sentinel<random_access_iterator<int*>>(random_access_iterator<int*>(end_));
+ }
};
static_assert(std::ranges::view<SizedRandomAccessView>);
static_assert(std::ranges::random_access_range<SizedRandomAccessView>);
@@ -73,9 +75,9 @@ static_assert(std::ranges::sized_range<SizedRandomAccessView>);
struct CommonView : std::ranges::view_base {
int* begin_;
int* end_;
- constexpr explicit CommonView(int* b, int* e) : begin_(b), end_(e) { }
- constexpr int *begin() const { return begin_; }
- constexpr int *end() const { return end_; }
+ constexpr explicit CommonView(int* b, int* e) : begin_(b), end_(e) {}
+ constexpr int* begin() const { return begin_; }
+ constexpr int* end() const { return end_; }
};
static_assert(std::ranges::view<CommonView>);
static_assert(std::ranges::common_range<CommonView>);
@@ -83,11 +85,11 @@ static_assert(std::ranges::common_range<CommonView>);
struct NonCommonView : std::ranges::view_base {
int* begin_;
int* end_;
- constexpr explicit NonCommonView(int* b, int* e) : begin_(b), end_(e) { }
- constexpr int *begin() const { return begin_; }
+ constexpr explicit NonCommonView(int* b, int* e) : begin_(b), end_(e) {}
+ constexpr int* begin() const { return begin_; }
constexpr auto end() const { return sentinel_wrapper<int*>(end_); }
};
-static_assert( std::ranges::view<NonCommonView>);
+static_assert(std::ranges::view<NonCommonView>);
static_assert(!std::ranges::common_range<NonCommonView>);
template <class T>
@@ -107,22 +109,30 @@ concept HasOnlyNonConstBegin = HasBegin<T> && !HasConstBegin<T>;
template <class T>
concept HasOnlyConstBegin = HasConstBegin<T> && !HasConstAndNonConstBegin<T>;
-template<bool Simple>
-struct NonCommonBaseView: std::ranges::view_base {
+template <bool Simple>
+struct NonCommonBaseView : std::ranges::view_base {
int* begin_;
int* end_;
- constexpr explicit NonCommonBaseView(int* b, int* e) : begin_(b), end_(e) { }
+ constexpr explicit NonCommonBaseView(int* b, int* e) : begin_(b), end_(e) {}
constexpr auto begin() const { return static_cast<const int*>(begin_); }
constexpr auto end() const { return sentinel_wrapper<const int*>(end_); }
- constexpr int *begin() requires (!Simple) { return begin_; }
- constexpr auto end() requires (!Simple) { return sentinel_wrapper<int*>(end_); }
+ constexpr int* begin()
+ requires(!Simple)
+ {
+ return begin_;
+ }
+ constexpr auto end()
+ requires(!Simple)
+ {
+ return sentinel_wrapper<int*>(end_);
+ }
};
using NonSimpleNonCommonView = NonCommonBaseView<false>;
-static_assert(!HasOnlyNonConstBegin<std::ranges::common_view<const NonSimpleNonCommonView>>);
+static_assert(!HasOnlyNonConstBegin<std::ranges::common_view<NonSimpleNonCommonView>>);
static_assert(!HasOnlyConstBegin<std::ranges::common_view<NonSimpleNonCommonView>>);
static_assert(HasConstAndNonConstBegin<std::ranges::common_view<NonSimpleNonCommonView>>);
-static_assert(HasConstBegin<std::ranges::common_view<const NonSimpleNonCommonView>>);
-static_assert(HasOnlyConstBegin<std::ranges::common_view<const NonSimpleNonCommonView>>);
+static_assert(HasConstBegin<std::ranges::common_view<NonSimpleNonCommonView> const>);
+static_assert(HasOnlyConstBegin<std::ranges::common_view<NonSimpleNonCommonView> const>);
#endif // TEST_STD_RANGES_RANGE_ADAPTORS_RANGE_COMMON_VIEW_TYPES_H
>From c30894275e18bb754c12712d6c76c4209744729b Mon Sep 17 00:00:00 2001
From: changkhothuychung <nhat7203 at gmail.com>
Date: Mon, 18 Aug 2025 16:20:50 -0400
Subject: [PATCH 6/8] fix test
---
.../std/ranges/range.adaptors/range.common.view/begin.pass.cpp | 1 -
.../std/ranges/range.adaptors/range.common.view/end.pass.cpp | 1 -
2 files changed, 2 deletions(-)
diff --git a/libcxx/test/std/ranges/range.adaptors/range.common.view/begin.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.common.view/begin.pass.cpp
index 26b26398bf88a..b13b4b4e69e71 100644
--- a/libcxx/test/std/ranges/range.adaptors/range.common.view/begin.pass.cpp
+++ b/libcxx/test/std/ranges/range.adaptors/range.common.view/begin.pass.cpp
@@ -54,7 +54,6 @@ constexpr bool test() {
{
NonSimpleNonCommonView view{buf, buf + 8};
std::ranges::common_view<NonSimpleNonCommonView> common(view);
- static_assert(!std::ranges::__simple_view<NonSimpleNonCommonView>);
static_assert(!std::is_same_v<decltype(common.begin()), decltype(std::as_const(common).begin())>);
}
diff --git a/libcxx/test/std/ranges/range.adaptors/range.common.view/end.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.common.view/end.pass.cpp
index 8feb028e93893..a80f85defaeb5 100644
--- a/libcxx/test/std/ranges/range.adaptors/range.common.view/end.pass.cpp
+++ b/libcxx/test/std/ranges/range.adaptors/range.common.view/end.pass.cpp
@@ -42,7 +42,6 @@ constexpr bool test() {
{
NonSimpleNonCommonView view{buf, buf + 8};
std::ranges::common_view<NonSimpleNonCommonView> common(view);
- static_assert(!std::ranges::__simple_view<NonSimpleNonCommonView>);
static_assert(!std::is_same_v<decltype(common.end()), decltype(std::as_const(common).end())>);
}
>From e48ab16da6b5d0c55dcb7e72963d07437bc2423b Mon Sep 17 00:00:00 2001
From: changkhothuychung <nhat7203 at gmail.com>
Date: Tue, 19 Aug 2025 14:35:12 -0400
Subject: [PATCH 7/8] revert styling for file
---
.../range.adaptors/range.common.view/types.h | 40 +++++++++----------
1 file changed, 19 insertions(+), 21 deletions(-)
diff --git a/libcxx/test/std/ranges/range.adaptors/range.common.view/types.h b/libcxx/test/std/ranges/range.adaptors/range.common.view/types.h
index 71c0bed9f5f8e..e725ee1bdb27b 100644
--- a/libcxx/test/std/ranges/range.adaptors/range.common.view/types.h
+++ b/libcxx/test/std/ranges/range.adaptors/range.common.view/types.h
@@ -14,10 +14,10 @@
#include "test_iterators.h"
struct DefaultConstructibleView : std::ranges::view_base {
- int* begin_ = nullptr;
- int* end_ = nullptr;
+ int* begin_ = nullptr;
+ int* end_ = nullptr;
explicit DefaultConstructibleView() = default;
- constexpr int* begin() const { return begin_; }
+ constexpr int *begin() const { return begin_; }
constexpr auto end() const { return sentinel_wrapper<int*>(end_); }
};
static_assert(std::ranges::view<DefaultConstructibleView>);
@@ -26,21 +26,21 @@ static_assert(std::default_initializable<DefaultConstructibleView>);
struct MoveOnlyView : std::ranges::view_base {
int* begin_;
int* end_;
- constexpr explicit MoveOnlyView(int* b, int* e) : begin_(b), end_(e) {}
- constexpr MoveOnlyView(MoveOnlyView&&) = default;
+ constexpr explicit MoveOnlyView(int* b, int* e) : begin_(b), end_(e) { }
+ constexpr MoveOnlyView(MoveOnlyView&&) = default;
constexpr MoveOnlyView& operator=(MoveOnlyView&&) = default;
- constexpr int* begin() const { return begin_; }
+ constexpr int *begin() const { return begin_; }
constexpr auto end() const { return sentinel_wrapper<int*>(end_); }
};
-static_assert(std::ranges::view<MoveOnlyView>);
-static_assert(std::ranges::contiguous_range<MoveOnlyView>);
+static_assert( std::ranges::view<MoveOnlyView>);
+static_assert( std::ranges::contiguous_range<MoveOnlyView>);
static_assert(!std::copyable<MoveOnlyView>);
struct CopyableView : std::ranges::view_base {
int* begin_;
int* end_;
- constexpr explicit CopyableView(int* b, int* e) : begin_(b), end_(e) {}
- constexpr int* begin() const { return begin_; }
+ constexpr explicit CopyableView(int* b, int* e) : begin_(b), end_(e) { }
+ constexpr int *begin() const { return begin_; }
constexpr auto end() const { return sentinel_wrapper<int*>(end_); }
};
static_assert(std::ranges::view<CopyableView>);
@@ -50,7 +50,7 @@ using ForwardIter = forward_iterator<int*>;
struct SizedForwardView : std::ranges::view_base {
int* begin_;
int* end_;
- constexpr explicit SizedForwardView(int* b, int* e) : begin_(b), end_(e) {}
+ constexpr explicit SizedForwardView(int* b, int* e) : begin_(b), end_(e) { }
constexpr auto begin() const { return forward_iterator<int*>(begin_); }
constexpr auto end() const { return sized_sentinel<forward_iterator<int*>>(forward_iterator<int*>(end_)); }
};
@@ -62,11 +62,9 @@ using RandomAccessIter = random_access_iterator<int*>;
struct SizedRandomAccessView : std::ranges::view_base {
int* begin_;
int* end_;
- constexpr explicit SizedRandomAccessView(int* b, int* e) : begin_(b), end_(e) {}
+ constexpr explicit SizedRandomAccessView(int* b, int* e) : begin_(b), end_(e) { }
constexpr auto begin() const { return random_access_iterator<int*>(begin_); }
- constexpr auto end() const {
- return sized_sentinel<random_access_iterator<int*>>(random_access_iterator<int*>(end_));
- }
+ constexpr auto end() const { return sized_sentinel<random_access_iterator<int*>>(random_access_iterator<int*>(end_)); }
};
static_assert(std::ranges::view<SizedRandomAccessView>);
static_assert(std::ranges::random_access_range<SizedRandomAccessView>);
@@ -75,9 +73,9 @@ static_assert(std::ranges::sized_range<SizedRandomAccessView>);
struct CommonView : std::ranges::view_base {
int* begin_;
int* end_;
- constexpr explicit CommonView(int* b, int* e) : begin_(b), end_(e) {}
- constexpr int* begin() const { return begin_; }
- constexpr int* end() const { return end_; }
+ constexpr explicit CommonView(int* b, int* e) : begin_(b), end_(e) { }
+ constexpr int *begin() const { return begin_; }
+ constexpr int *end() const { return end_; }
};
static_assert(std::ranges::view<CommonView>);
static_assert(std::ranges::common_range<CommonView>);
@@ -85,11 +83,11 @@ static_assert(std::ranges::common_range<CommonView>);
struct NonCommonView : std::ranges::view_base {
int* begin_;
int* end_;
- constexpr explicit NonCommonView(int* b, int* e) : begin_(b), end_(e) {}
- constexpr int* begin() const { return begin_; }
+ constexpr explicit NonCommonView(int* b, int* e) : begin_(b), end_(e) { }
+ constexpr int *begin() const { return begin_; }
constexpr auto end() const { return sentinel_wrapper<int*>(end_); }
};
-static_assert(std::ranges::view<NonCommonView>);
+static_assert( std::ranges::view<NonCommonView>);
static_assert(!std::ranges::common_range<NonCommonView>);
template <class T>
>From 02f206a1a5012313bf75d0d8b2c3b64085ef5fbd Mon Sep 17 00:00:00 2001
From: changkhothuychung <nhat7203 at gmail.com>
Date: Tue, 19 Aug 2025 15:00:37 -0400
Subject: [PATCH 8/8] update test
---
.../std/ranges/range.adaptors/range.common.view/types.h | 9 +++------
1 file changed, 3 insertions(+), 6 deletions(-)
diff --git a/libcxx/test/std/ranges/range.adaptors/range.common.view/types.h b/libcxx/test/std/ranges/range.adaptors/range.common.view/types.h
index e725ee1bdb27b..dcd758399e0b5 100644
--- a/libcxx/test/std/ranges/range.adaptors/range.common.view/types.h
+++ b/libcxx/test/std/ranges/range.adaptors/range.common.view/types.h
@@ -107,25 +107,22 @@ concept HasOnlyNonConstBegin = HasBegin<T> && !HasConstBegin<T>;
template <class T>
concept HasOnlyConstBegin = HasConstBegin<T> && !HasConstAndNonConstBegin<T>;
-template <bool Simple>
-struct NonCommonBaseView : std::ranges::view_base {
+
+struct NonSimpleNonCommonView : std::ranges::view_base {
int* begin_;
int* end_;
- constexpr explicit NonCommonBaseView(int* b, int* e) : begin_(b), end_(e) {}
+ constexpr explicit NonSimpleNonCommonView(int* b, int* e) : begin_(b), end_(e) {}
constexpr auto begin() const { return static_cast<const int*>(begin_); }
constexpr auto end() const { return sentinel_wrapper<const int*>(end_); }
constexpr int* begin()
- requires(!Simple)
{
return begin_;
}
constexpr auto end()
- requires(!Simple)
{
return sentinel_wrapper<int*>(end_);
}
};
-using NonSimpleNonCommonView = NonCommonBaseView<false>;
static_assert(!HasOnlyNonConstBegin<std::ranges::common_view<NonSimpleNonCommonView>>);
static_assert(!HasOnlyConstBegin<std::ranges::common_view<NonSimpleNonCommonView>>);
More information about the libcxx-commits
mailing list