On Thu, 26 Dec 2024, 10:03 Jonathan Wakely, <jwakely....@gmail.com> wrote:

>
>
> 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.
>>
>
Actually this one should be .cc too.


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