[libcxx-commits] [libcxx] [libc++][ranges] Fix the LWG 3568 test for `basic_istream_view` (PR #215589)
Iskandar Emomzoda via libcxx-commits
libcxx-commits at lists.llvm.org
Wed Aug 12 08:50:46 PDT 2026
https://github.com/iskandarem updated https://github.com/llvm/llvm-project/pull/215589
>From 94f3eddb3b96ac8163bd716cac96a1833071d498 Mon Sep 17 00:00:00 2001
From: Iskandar Emomzoda <iskandar.em0m at gmail.com>
Date: Tue, 11 Aug 2026 17:26:48 +0200
Subject: [PATCH 1/2] fix basic_istream_view end dereferencing
---
.../ranges/range.factories/range.istream.view/ctor.pass.cpp | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/libcxx/test/std/ranges/range.factories/range.istream.view/ctor.pass.cpp b/libcxx/test/std/ranges/range.factories/range.istream.view/ctor.pass.cpp
index beeeea4c1bbe1..d15225674049c 100644
--- a/libcxx/test/std/ranges/range.factories/range.istream.view/ctor.pass.cpp
+++ b/libcxx/test/std/ranges/range.factories/range.istream.view/ctor.pass.cpp
@@ -39,10 +39,8 @@ void test() {
// LWG 3568. basic_istream_view needs to initialize value_
{
- auto iss = make_string_stream<CharT>("");
- std::ranges::basic_istream_view<int, CharT> isv{iss};
- auto iter = isv.begin();
- assert(*iter == 0);
+ static auto fn_local_iss = make_string_stream<CharT>("");
+ [[maybe_unused]] constexpr auto isv = std::views::istream<int>(fn_local_iss);
}
}
>From a4aa4213633183aebc86cf899819b415099b8451 Mon Sep 17 00:00:00 2001
From: iskandarem <iskandar.em0m at gmail.com>
Date: Wed, 12 Aug 2026 15:49:45 +0000
Subject: [PATCH 2/2] [libc++][ranges] Test added to test LGW3568, value_
initialization;
---
.../range.istream.view/ctor.pass.cpp | 19 ++++++++++++++++++-
1 file changed, 18 insertions(+), 1 deletion(-)
diff --git a/libcxx/test/std/ranges/range.factories/range.istream.view/ctor.pass.cpp b/libcxx/test/std/ranges/range.factories/range.istream.view/ctor.pass.cpp
index d15225674049c..77a28a7ab196c 100644
--- a/libcxx/test/std/ranges/range.factories/range.istream.view/ctor.pass.cpp
+++ b/libcxx/test/std/ranges/range.factories/range.istream.view/ctor.pass.cpp
@@ -27,6 +27,15 @@ static_assert(std::constructible_from<std::ranges::wistream_view<int>, std::wist
static_assert(!std::convertible_to<std::wistream&, std::ranges::wistream_view<int>>);
#endif
+struct NoopExtraction {
+ int n_; // intentionally doesn't have default member initializer
+};
+
+template <class CharT, class Traits>
+std::basic_istream<CharT, Traits>& operator>>(std::basic_istream<CharT, Traits>& is, const NoopExtraction&) {
+return is; // intentionally doesn't modify the NoopExtraction object
+}
+
template <class CharT>
void test() {
// test constructor init the stream pointer to the passed one
@@ -37,11 +46,19 @@ void test() {
assert(*it == 123);
}
- // LWG 3568. basic_istream_view needs to initialize value_
+ // LWG 3568. value_ must be initialized for basic_istream_view to be constexpr-constructible
{
static auto fn_local_iss = make_string_stream<CharT>("");
[[maybe_unused]] constexpr auto isv = std::views::istream<int>(fn_local_iss);
}
+
+ // LWG 3568. basic_istream_view needs to initialize value_
+ {
+ auto iss = make_string_stream<CharT>("123");
+ std::ranges::basic_istream_view<NoopExtraction, CharT> isv{iss};
+ auto it = isv.begin();
+ assert((*it).n_ == 0);
+ }
}
int main(int, char**) {
More information about the libcxx-commits
mailing list