[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