[libcxx-commits] [libcxx] 9a60b2f - [libc++] LWG4012: common_view::begin/end are missing the simple-view check (#153674)
via libcxx-commits
libcxx-commits at lists.llvm.org
Sun Feb 8 17:17:35 PST 2026
Author: Nhat Nguyen
Date: 2026-02-09T09:17:30+08:00
New Revision: 9a60b2fa0c414c4230801e792be28a92439dae8f
URL: https://github.com/llvm/llvm-project/commit/9a60b2fa0c414c4230801e792be28a92439dae8f
DIFF: https://github.com/llvm/llvm-project/commit/9a60b2fa0c414c4230801e792be28a92439dae8f.diff
LOG: [libc++] LWG4012: common_view::begin/end are missing the simple-view check (#153674)
close #105320
Added:
Modified:
libcxx/docs/Status/Cxx2cIssues.csv
libcxx/test/std/ranges/range.adaptors/range.common.view/begin.pass.cpp
libcxx/test/std/ranges/range.adaptors/range.common.view/end.pass.cpp
libcxx/test/std/ranges/range.adaptors/range.common.view/types.h
Removed:
################################################################################
diff --git a/libcxx/docs/Status/Cxx2cIssues.csv b/libcxx/docs/Status/Cxx2cIssues.csv
index 101a708b7b2de..60b1bd6ff70da 100644
--- a/libcxx/docs/Status/Cxx2cIssues.csv
+++ b/libcxx/docs/Status/Cxx2cIssues.csv
@@ -46,7 +46,7 @@
"`LWG3975 <https://wg21.link/LWG3975>`__","Specializations of ``basic_format_context`` should not be permitted","2024-03 (Tokyo)","|Nothing To Do|","","`#105317 <https://github.com/llvm/llvm-project/issues/105317>`__",""
"`LWG3984 <https://wg21.link/LWG3984>`__","``ranges::to``'s recursion branch may be ill-formed","2024-03 (Tokyo)","|Complete|","19","`#105318 <https://github.com/llvm/llvm-project/issues/105318>`__",""
"`LWG4011 <https://wg21.link/LWG4011>`__","""`Effects`: Equivalent to return"" in ``[span.elem]``","2024-03 (Tokyo)","|Nothing To Do|","","`#105319 <https://github.com/llvm/llvm-project/issues/105319>`__",""
-"`LWG4012 <https://wg21.link/LWG4012>`__","``common_view::begin/end`` are missing the ``simple-view`` check","2024-03 (Tokyo)","","","`#105320 <https://github.com/llvm/llvm-project/issues/105320>`__",""
+"`LWG4012 <https://wg21.link/LWG4012>`__","``common_view::begin/end`` are missing the ``simple-view`` check","2024-03 (Tokyo)","|Complete|","23","`#105320 <https://github.com/llvm/llvm-project/issues/105320>`__",""
"`LWG4013 <https://wg21.link/LWG4013>`__","``lazy_split_view::outer-iterator::value_type`` should not provide default constructor","2024-03 (Tokyo)","","","`#105321 <https://github.com/llvm/llvm-project/issues/105321>`__",""
"`LWG4016 <https://wg21.link/LWG4016>`__","container-insertable checks do not match what container-inserter does","2024-03 (Tokyo)","|Complete|","20","`#105322 <https://github.com/llvm/llvm-project/issues/105322>`__",""
"`LWG4023 <https://wg21.link/LWG4023>`__","Preconditions of ``std::basic_streambuf::setg/setp``","2024-03 (Tokyo)","|Complete|","19","`#105323 <https://github.com/llvm/llvm-project/issues/105323>`__",""
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..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
@@ -51,6 +51,12 @@ constexpr bool test() {
assert(begin == std::ranges::begin(view));
}
+ {
+ NonSimpleNonCommonView view{buf, buf + 8};
+ std::ranges::common_view<NonSimpleNonCommonView> common(view);
+ 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..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
@@ -39,6 +39,12 @@ constexpr bool test() {
assert(base(end) == buf + 8);
}
+ {
+ NonSimpleNonCommonView view{buf, buf + 8};
+ std::ranges::common_view<NonSimpleNonCommonView> common(view);
+ 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..56f2f6ad5fcbf 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,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<const std::ranges::common_view<NonSimpleNonCommonView>>);
+static_assert(HasOnlyConstBegin<const std::ranges::common_view<NonSimpleNonCommonView>>);
+
#endif // TEST_STD_RANGES_RANGE_ADAPTORS_RANGE_COMMON_VIEW_TYPES_H
More information about the libcxx-commits
mailing list