Skip to content

Commit 5a41ab8

Browse files
committed
libstdc++: don't implicit-construct _Yielded_decvref [PR118022]
This overload requires constructible_from<remove_cvref_t<yielded>, const remove_reference_t<yielded>&> ... but then tries to construct remove_cvref_t<yielded> implicitly, which means it imposes an additional constraint not in the standard. libstdc++-v3/ChangeLog: PR libstdc++/118022 * include/std/generator (_Promise_erased::yield_value(const _Yielded_deref&)): Don't implicit-constuct _Yielded_decvref. * testsuite/24_iterators/range_generators/pr118022.cc: New test.
1 parent 4731ead commit 5a41ab8

File tree

2 files changed

+17
-1
lines changed

2 files changed

+17
-1
lines changed

libstdc++-v3/include/std/generator

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
144144
requires (is_rvalue_reference_v<_Yielded>
145145
&& constructible_from<_Yielded_decvref,
146146
const _Yielded_deref&>)
147-
{ return _Copy_awaiter(__val, _M_bottom_value()); }
147+
{ return _Copy_awaiter(_Yielded_decvref(__val), _M_bottom_value()); }
148148

149149
template<typename _R2, typename _V2, typename _A2, typename _U2>
150150
requires std::same_as<_Yield2_t<_R2, _V2>, _Yielded>
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// { dg-do compile { target c++23 } }
2+
#include <generator>
3+
4+
struct O {
5+
O() = default;
6+
explicit O(const O&) = default;
7+
};
8+
9+
std::generator<O&&> gen() {
10+
const O o;
11+
co_yield o;
12+
}
13+
14+
int
15+
main()
16+
{}

0 commit comments

Comments
 (0)