[libcxx-commits] [libcxx] 759a2ac - [libc++][ranges] LWG4083: `views::as_rvalue` should reject non-input ranges (#155156)
via libcxx-commits
libcxx-commits at lists.llvm.org
Wed Sep 3 02:17:46 PDT 2025
Author: Hristo Hristov
Date: 2025-09-03T17:17:42+08:00
New Revision: 759a2ac5b0ee09be9dbb51ad50143d7db990a94a
URL: https://github.com/llvm/llvm-project/commit/759a2ac5b0ee09be9dbb51ad50143d7db990a94a
DIFF: https://github.com/llvm/llvm-project/commit/759a2ac5b0ee09be9dbb51ad50143d7db990a94a.diff
LOG: [libc++][ranges] LWG4083: `views::as_rvalue` should reject non-input ranges (#155156)
Fixes #105351
# References:
- https://wg21.link/LWG4083
- https://wg21.link/range.as.rvalue.overview
Added:
Modified:
libcxx/docs/Status/Cxx2cIssues.csv
libcxx/include/__ranges/as_rvalue_view.h
libcxx/test/std/ranges/range.adaptors/range.as.rvalue/adaptor.pass.cpp
Removed:
################################################################################
diff --git a/libcxx/docs/Status/Cxx2cIssues.csv b/libcxx/docs/Status/Cxx2cIssues.csv
index 082a86a65c852..a7a76cff8c68d 100644
--- a/libcxx/docs/Status/Cxx2cIssues.csv
+++ b/libcxx/docs/Status/Cxx2cIssues.csv
@@ -70,7 +70,7 @@
"`LWG4076 <https://wg21.link/LWG4076>`__","``concat_view`` should be freestanding","2024-06 (St. Louis)","","",""
"`LWG4079 <https://wg21.link/LWG4079>`__","Missing Preconditions in ``concat_view::iterator``\`s conversion constructor","2024-06 (St. Louis)","","",""
"`LWG4082 <https://wg21.link/LWG4082>`__","``views::concat(r)`` is well-formed when ``r`` is an ``output_range``","2024-06 (St. Louis)","","",""
-"`LWG4083 <https://wg21.link/LWG4083>`__","``views::as_rvalue`` should reject non-input ranges","2024-06 (St. Louis)","","",""
+"`LWG4083 <https://wg21.link/LWG4083>`__","``views::as_rvalue`` should reject non-input ranges","2024-06 (St. Louis)","|Complete|","22",""
"`LWG4096 <https://wg21.link/LWG4096>`__","``views::iota(views::iota(0))`` should be rejected","2024-06 (St. Louis)","|Complete|","22",""
"`LWG4098 <https://wg21.link/LWG4098>`__","``views::adjacent<0>`` should reject non-forward ranges","2024-06 (St. Louis)","","",""
"`LWG4105 <https://wg21.link/LWG4105>`__","``ranges::ends_with``\`s Returns misses
diff erence casting","2024-06 (St. Louis)","","",""
diff --git a/libcxx/include/__ranges/as_rvalue_view.h b/libcxx/include/__ranges/as_rvalue_view.h
index 5849a6c368396..08acf3d7736c6 100644
--- a/libcxx/include/__ranges/as_rvalue_view.h
+++ b/libcxx/include/__ranges/as_rvalue_view.h
@@ -117,7 +117,7 @@ struct __fn : __range_adaptor_closure<__fn> {
return /*---------------------------------*/ as_rvalue_view(std::forward<_Range>(__range));
}
- template <class _Range>
+ template <input_range _Range>
requires same_as<range_rvalue_reference_t<_Range>, range_reference_t<_Range>>
[[nodiscard]] _LIBCPP_HIDE_FROM_ABI static constexpr auto
operator()(_Range&& __range) noexcept(noexcept(views::all(std::forward<_Range>(__range))))
diff --git a/libcxx/test/std/ranges/range.adaptors/range.as.rvalue/adaptor.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.as.rvalue/adaptor.pass.cpp
index dbe15238ebc86..12ae84c3fb348 100644
--- a/libcxx/test/std/ranges/range.adaptors/range.as.rvalue/adaptor.pass.cpp
+++ b/libcxx/test/std/ranges/range.adaptors/range.as.rvalue/adaptor.pass.cpp
@@ -48,6 +48,18 @@ struct move_iterator_range {
static_assert(!std::ranges::view<move_iterator_range>);
static_assert(std::ranges::range<move_iterator_range>);
+// LWG4083: views::as_rvalue should reject non-input ranges
+struct I {
+ int operator*();
+ using
diff erence_type = int;
+ I& operator++();
+ void operator++(int);
+};
+static_assert(!std::is_invocable_v<decltype(std::views::as_rvalue),
+ decltype(std::ranges::subrange{I{}, std::unreachable_sentinel})>);
+static_assert(
+ !HasPipe<decltype(std::ranges::subrange{I{}, std::unreachable_sentinel}), decltype(std::views::as_rvalue)>);
+
constexpr bool test() {
{ // view | views::as_rvalue
DefaultConstructibleView v{{}, 3};
More information about the libcxx-commits
mailing list