Skip to content

Commit ba284eb

Browse files
Implement LWG-4119 generator::promise_type::yield_value(ranges::elements_of<R, Alloc>)'s nested generator may be ill-formed (#5220)
Co-authored-by: Stephan T. Lavavej <[email protected]>
1 parent 4119eb8 commit ba284eb

File tree

2 files changed

+12
-3
lines changed

2 files changed

+12
-3
lines changed

stl/inc/generator

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -289,11 +289,10 @@ namespace _Gen_detail {
289289
template <_RANGES input_range _Rng, class _Alloc>
290290
requires convertible_to<_RANGES range_reference_t<_Rng>, _Yielded>
291291
_NODISCARD auto yield_value(_RANGES elements_of<_Rng, _Alloc> _Elem) {
292-
using _Vty = _RANGES range_value_t<_Rng>;
293-
using _Nested_awaitable = _Nested_awaitable_provider<_Yielded, _Vty, _Alloc>::_Awaitable;
292+
using _Nested_awaitable = _Nested_awaitable_provider<_Yielded, void, _Alloc>::_Awaitable;
294293

295294
auto _Lambda = [](allocator_arg_t, _Alloc, _RANGES iterator_t<_Rng> _It,
296-
const _RANGES sentinel_t<_Rng> _Se) -> generator<_Yielded, _Vty, _Alloc> {
295+
const _RANGES sentinel_t<_Rng> _Se) -> generator<_Yielded, void, _Alloc> {
297296
for (; _It != _Se; ++_It) {
298297
co_yield static_cast<_Yielded>(*_It);
299298
}

tests/std/tests/P2502R2_generator_promise/test.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include <memory_resource>
1414
#include <new>
1515
#include <ranges>
16+
#include <span>
1617
#include <string>
1718
#include <type_traits>
1819
#include <utility>
@@ -226,6 +227,15 @@ struct Holder {
226227
struct Incomplete;
227228
#endif // ^^^ no workaround ^^^
228229

230+
#if !(defined(__clang__) && defined(_M_IX86)) // TRANSITION, LLVM-56507
231+
// Also test LWG-4119:
232+
// "generator::promise_type::yield_value(ranges::elements_of<R, Alloc>)'s nested generator may be ill-formed"
233+
generator<span<int>> test_lwg_4119() { // COMPILE-ONLY
234+
vector<vector<int>> v;
235+
co_yield ranges::elements_of(v);
236+
}
237+
#endif // ^^^ no workaround ^^^
238+
229239
int main() {
230240
test_with_type<int>();
231241
test_with_type<float>();

0 commit comments

Comments
 (0)