From: Arsen Arsenović Date: Tue, 24 Dec 2024 11:29:02 +0000 (+0100) Subject: libstdc++: don't implicit-construct _Yielded_decvref [PR118022] X-Git-Tag: basepoints/gcc-16~3107 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5a41ab8da087617d785f563b76f5c2fd6600b4c0;p=thirdparty%2Fgcc.git libstdc++: don't implicit-construct _Yielded_decvref [PR118022] This overload requires constructible_from, const remove_reference_t&> ... but then tries to construct remove_cvref_t 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. --- 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 requires std::same_as<_Yield2_t<_R2, _V2>, _Yielded> diff --git a/libstdc++-v3/testsuite/24_iterators/range_generators/pr118022.cc b/libstdc++-v3/testsuite/24_iterators/range_generators/pr118022.cc new file mode 100644 index 000000000000..d8915bb38dc4 --- /dev/null +++ b/libstdc++-v3/testsuite/24_iterators/range_generators/pr118022.cc @@ -0,0 +1,16 @@ +// { dg-do compile { target c++23 } } +#include + +struct O { + O() = default; + explicit O(const O&) = default; +}; + +std::generator gen() { + const O o; + co_yield o; +} + +int +main() +{}