[gcc r17-1371] libstdc++: avoid ill-formed nested generator

Yuao Ma yuao@gcc.gnu.org
Fri Jun 5 11:54:09 GMT 2026


https://gcc.gnu.org/g:78090f55dbb896e57f14b3ab2c333d1f5adb4815

commit r17-1371-g78090f55dbb896e57f14b3ab2c333d1f5adb4815
Author: Yuao Ma <c8ef@outlook.com>
Date:   Fri Jun 5 19:50:54 2026 +0800

    libstdc++: avoid ill-formed nested generator
    
    This was approved as LWG 4119.
    
    libstdc++-v3/ChangeLog:
    
            * include/std/generator (generator::yield_value): Change the
            second template parameter from range_value_t<R> to void.
            * testsuite/24_iterators/range_generators/lwg4119.cc: New test.

Diff:
---
 libstdc++-v3/include/std/generator                         |  5 ++++-
 .../testsuite/24_iterators/range_generators/lwg4119.cc     | 14 ++++++++++++++
 2 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/libstdc++-v3/include/std/generator b/libstdc++-v3/include/std/generator
index 88651dd6f76a..87fe28766f09 100644
--- a/libstdc++-v3/include/std/generator
+++ b/libstdc++-v3/include/std/generator
@@ -163,6 +163,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 	  noexcept
 	{ return _Recursive_awaiter { std::move(__r.range) }; }
 
+	// _GLIBCXX_RESOLVE_LIB_DEFECTS
+	// 4119. generator::promise_type::yield_value(elements_of<R, Alloc>)'s
+	// nested generator may be ill-formed
 	template<ranges::input_range _R, typename _Alloc>
 	requires convertible_to<ranges::range_reference_t<_R>, _Yielded>
 	auto
@@ -171,7 +174,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 	  auto __n = [] (allocator_arg_t, _Alloc,
 			 ranges::iterator_t<_R> __i,
 			 ranges::sentinel_t<_R> __s)
-	    -> generator<_Yielded, ranges::range_value_t<_R>, _Alloc> {
+	    -> generator<_Yielded, void, _Alloc> {
 	    for (; __i != __s; ++__i)
 	      co_yield static_cast<_Yielded>(*__i);
 	  };
diff --git a/libstdc++-v3/testsuite/24_iterators/range_generators/lwg4119.cc b/libstdc++-v3/testsuite/24_iterators/range_generators/lwg4119.cc
new file mode 100644
index 000000000000..383c9074345c
--- /dev/null
+++ b/libstdc++-v3/testsuite/24_iterators/range_generators/lwg4119.cc
@@ -0,0 +1,14 @@
+// { dg-do compile { target c++23 } }
+
+#include <generator>
+#include <vector>
+
+std::generator<std::span<int>> f() {
+  std::vector<int> v;
+  co_yield v;
+}
+
+std::generator<std::span<int>> g() {
+  std::vector<std::vector<int>> v;
+  co_yield std::ranges::elements_of(v);
+}


More information about the Libstdc++-cvs mailing list