From e5585a29fb1d071b7d11db85dc2d8a82c046fdcf Mon Sep 17 00:00:00 2001 From: "A. Jiang" Date: Sun, 5 Jan 2025 23:42:20 +0800 Subject: [PATCH 1/2] Implement LWG-4119 --- stl/inc/generator | 5 ++--- tests/std/tests/P2502R2_generator_promise/test.cpp | 9 +++++++++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/stl/inc/generator b/stl/inc/generator index 8e5d94619d9..4568916dab3 100644 --- a/stl/inc/generator +++ b/stl/inc/generator @@ -287,11 +287,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 42a2f7c09ea..56beae08fc4 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 @@ -228,6 +229,14 @@ struct Holder { struct Incomplete; #endif // ^^^ no workaround ^^^ +// Also test LWG-4119: +// "generator::promise_type::yield_value(ranges::elements_of)'s nested generator may be ill-formed" + +generator> test_lwg_4119() { + vector> v; + co_yield ranges::elements_of(v); +} + int main() { test_with_type(); test_with_type(); From 4b96b5871e3726dca747d9fa6aab8aa422387f8d Mon Sep 17 00:00:00 2001 From: "A. Jiang" Date: Mon, 6 Jan 2025 00:52:50 +0800 Subject: [PATCH 2/2] Skip testing Clang on x86 --- tests/std/tests/P2502R2_generator_promise/test.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/std/tests/P2502R2_generator_promise/test.cpp b/tests/std/tests/P2502R2_generator_promise/test.cpp index 56beae08fc4..fe7b97a09c7 100644 --- a/tests/std/tests/P2502R2_generator_promise/test.cpp +++ b/tests/std/tests/P2502R2_generator_promise/test.cpp @@ -229,13 +229,14 @@ 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() { +generator> test_lwg_4119() { // COMPILE-ONLY vector> v; co_yield ranges::elements_of(v); } +#endif // ^^^ no workaround ^^^ int main() { test_with_type();