bug in gcc/cp/coroutines.cc line 4688

Lee Brown lhb.jr@gmx.com
Sat Jan 18 23:26:50 GMT 2025


In my view  it is a bug.  It gives an error that it can't find
std::throw,  but that is gcc's problem,  not the problem according to
the standard.  According to the standard, the problem is that ::operator
new(size_t, nothrow_t)  has not been declared.   In fact,  the relevant
paragraph of the standard never mentions std::nothrow .  It only
mentions std::nothrow_t.  Not the same thing.

In other words,  this is an error message for developers,  not for
users...i.e. a bug.



On 1/18/2025 3:18 PM, Andrew Pinski wrote:
> On Sat, Jan 18, 2025 at 2:12 PM Lee Brown via Gcc <gcc@gcc.gnu.org> wrote:
>> Just to be clear,   the appended 17 lines of very simple code breaks gcc
>> on every platform where <coroutine> header does not have <new> in its
>> include hierarchy....which I assume to be every platform.
> See the discussion in the bug report:
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95505 . That is there is
> no bug in libstdc++ nor in GCC in theory. Any use of
> get_return_object_on_allocation_failure for the promise_type requires
> new to be included. Now there should be a note about a missing include
> of new but that is just a small diagnostic issue.
>
> Thanks,
> Andrew Pinski
>
>> 1) place code below in main.cpp
>>
>> 2) g++ -std=c++20 main.cpp
>>
>> and you get
>>
>> main.cxx: In function 'my_co do_co()':
>> main.cxx:16:7: error:
>> 'my_co::promise_type::get_return_object_on_allocation_failure()' is
>> provided by 'std::__n4861::__coroutine_traits_impl<my_co,
>> void>::promise_type' {aka 'my_co::promise_type'} but *'std::nothrow'
>> cannot be found*
>>      16 | my_co do_co() { co_return; }
>>         |       ^~~~~
>>
>>
>> Here's the code:
>>
>> // begin code --------------------------------
>>
>> #include <coroutine>
>>
>> struct my_co {
>>       struct promise_type {
>>           static    my_co get_return_object_on_allocation_failure() {
>> return my_co(); }
>>                   my_co get_return_object()     { return my_co(); }
>>
>>           std::suspend_always initial_suspend() noexcept     { return {}; }
>>           std::suspend_always final_suspend() noexcept     { return {}; }
>>           void                 return_void()                 {}
>>           void                 unhandled_exception()         {}
>>       };
>> };
>>
>> my_co do_co() { co_return; }
>>
>> int main()
>> {
>>       do_co();
>>       return 0;
>> }
>>
>> // end code ----------------------------
>>


More information about the Gcc mailing list