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
>
>

Reply via email to