[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