diff options
author | Arsen Arsenović <arsen@aarsen.me> | 2024-12-24 12:29:02 +0100 |
---|---|---|
committer | Arsen Arsenović <arsen@gcc.gnu.org> | 2024-12-27 12:29:42 +0100 |
commit | 5a41ab8da087617d785f563b76f5c2fd6600b4c0 (patch) | |
tree | 1417f28d7e37dd1bd0b9e260b67669cf6a54ba22 | |
parent | 4731ead79fac259258dbb027090f3d085f518040 (diff) | |
download | gcc-5a41ab8da087617d785f563b76f5c2fd6600b4c0.zip gcc-5a41ab8da087617d785f563b76f5c2fd6600b4c0.tar.gz gcc-5a41ab8da087617d785f563b76f5c2fd6600b4c0.tar.bz2 |
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.
-rw-r--r-- | libstdc++-v3/include/std/generator | 2 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/24_iterators/range_generators/pr118022.cc | 16 |
2 files changed, 17 insertions, 1 deletions
diff --git a/libstdc++-v3/include/std/generator b/libstdc++-v3/include/std/generator index bba85bd..3a19d53 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.cc b/libstdc++-v3/testsuite/24_iterators/range_generators/pr118022.cc new file mode 100644 index 0000000..d8915bb --- /dev/null +++ b/libstdc++-v3/testsuite/24_iterators/range_generators/pr118022.cc @@ -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() +{} |