From ba284eb85db2910bcdd7c871414f0dc7d8b921b4 Mon Sep 17 00:00:00 2001 From: "A. Jiang" Date: Tue, 14 Jan 2025 17:55:08 +0800 Subject: [PATCH] Implement LWG-4119 `generator::promise_type::yield_value(ranges::elements_of)`'s nested `generator` may be ill-formed (#5220) Co-authored-by: Stephan T. Lavavej --- stl/inc/generator | 5 ++--- tests/std/tests/P2502R2_generator_promise/test.cpp | 10 ++++++++++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/stl/inc/generator b/stl/inc/generator index 8b3a9d30260..524b9a22687 100644 --- a/stl/inc/generator +++ b/stl/inc/generator @@ -289,11 +289,10 @@ namespace _Gen_detail { template <_RANGES input_range _Rng, class _Alloc> requires convertible_to<_RANGES range_reference_t<_Rng>, _Yielded> _NODISCARD auto yield_value(_RANGES elements_of<_Rng, _Alloc> _Elem) { - using _Vty = _RANGES range_value_t<_Rng>; - using _Nested_awaitable = _Nested_awaitable_provider<_Yielded, _Vty, _Alloc>::_Awaitable; + using _Nested_awaitable = _Nested_awaitable_provider<_Yielded, void, _Alloc>::_Awaitable; auto _Lambda = [](allocator_arg_t, _Alloc, _RANGES iterator_t<_Rng> _It, - const _RANGES sentinel_t<_Rng> _Se) -> generator<_Yielded, _Vty, _Alloc> { + const _RANGES sentinel_t<_Rng> _Se) -> generator<_Yielded, void, _Alloc> { for (; _It != _Se; ++_It) { co_yield static_cast<_Yielded>(*_It); } diff --git a/tests/std/tests/P2502R2_generator_promise/test.cpp b/tests/std/tests/P2502R2_generator_promise/test.cpp index 7cd4a2323b2..ea1c71c10ef 100644 --- a/tests/std/tests/P2502R2_generator_promise/test.cpp +++ b/tests/std/tests/P2502R2_generator_promise/test.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -226,6 +227,15 @@ struct Holder { struct Incomplete; #endif // ^^^ no workaround ^^^ +#if !(defined(__clang__) && defined(_M_IX86)) // TRANSITION, LLVM-56507 +// Also test LWG-4119: +// "generator::promise_type::yield_value(ranges::elements_of)'s nested generator may be ill-formed" +generator> test_lwg_4119() { // COMPILE-ONLY + vector> v; + co_yield ranges::elements_of(v); +} +#endif // ^^^ no workaround ^^^ + int main() { test_with_type(); test_with_type();