[libcxx-commits] [clang] [clang-tools-extra] [libcxx] [llvm] [libc++] LWG4012: common_view::begin/end are missing the simple-view check (PR #153674)

A. Jiang via libcxx-commits libcxx-commits at lists.llvm.org
Sat Feb 7 21:54:28 PST 2026


================
@@ -90,4 +90,37 @@ 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>;
+
+struct NonSimpleNonCommonView : std::ranges::view_base {
+  int* begin_;
+  int* end_;
+  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() { return begin_; }
+  constexpr auto end() { return sentinel_wrapper<int*>(end_); }
+};
+
+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>>);
----------------
frederick-vs-ja wrote:

Sorry for suggesting wrong changes.
```suggestion
static_assert(HasConstBegin<const std::ranges::common_view<NonSimpleNonCommonView>>);
static_assert(HasOnlyConstBegin<const std::ranges::common_view<NonSimpleNonCommonView>>);
```

https://github.com/llvm/llvm-project/pull/153674


More information about the libcxx-commits mailing list