On Wed, 25 Dec 2024, 01:20 Arsen Arsenović, <ar...@aarsen.me> wrote:
> Evening! > > This patchset includes fixes for two bugs in libstdc++s implementation > of std::generator, namely PR118196 and PR118022. > > There's little to note about these fixes. > > Tested on x86_64-pc-linux-gnu via 'make -j17 check' with 'set > v3_std_list { 98 11 14 17 20 23 26 }' in the libstdc++ build directory. > Will do a full reg-strap before pushing (the testsuite just took far > longer than anticipated, so I haven't done it yet). > > OK for trunk after regstrap? > OK, thanks > TIA, have a lovely day and happy holidays :-) > ---------- >8 ---------- > > 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.C: New test. > --- > libstdc++-v3/include/std/generator | 2 +- > .../24_iterators/range_generators/pr118022.C | 16 ++++++++++++++++ > 2 files changed, 17 insertions(+), 1 deletion(-) > create mode 100644 > libstdc++-v3/testsuite/24_iterators/range_generators/pr118022.C > > diff --git a/libstdc++-v3/include/std/generator > b/libstdc++-v3/include/std/generator > index bba85bd0aa4e..3a19d535ef86 100644 > --- a/libstdc++-v3/include/std/generator > +++ b/libstdc++-v3/include/std/generator > @@ -144,7 +144,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > requires (is_rvalue_reference_v<_Yielded> > && constructible_from<_Yielded_decvref, > const _Yielded_deref&>) > - { return _Copy_awaiter(__val, _M_bottom_value()); } > + { return _Copy_awaiter(_Yielded_decvref(__val), > _M_bottom_value()); } > > template<typename _R2, typename _V2, typename _A2, typename _U2> > requires std::same_as<_Yield2_t<_R2, _V2>, _Yielded> > diff --git > a/libstdc++-v3/testsuite/24_iterators/range_generators/pr118022.C > b/libstdc++-v3/testsuite/24_iterators/range_generators/pr118022.C > new file mode 100644 > index 000000000000..d8915bb38dc4 > --- /dev/null > +++ b/libstdc++-v3/testsuite/24_iterators/range_generators/pr118022.C > @@ -0,0 +1,16 @@ > +// { dg-do compile { target c++23 } } > +#include <generator> > + > +struct O { > + O() = default; > + explicit O(const O&) = default; > +}; > + > +std::generator<O&&> gen() { > + const O o; > + co_yield o; > +} > + > +int > +main() > +{} > -- > 2.47.1 > >