On 3/4/21 2:54 PM, Iain Sandoe wrote:
Hi,

 From the PR:

The wording of [dcl.fct.def.coroutine]/15 states:
  * The expression co_await promise.final_suspend() shall not be
    potentially-throwing ([except.spec]).

See http://eel.is/c++draft/dcl.fct.def.coroutine#15
and http://eel.is/c++draft/except.spec#6

ie. all of the following must be declared noexcept (if they form part of the 
await-expression):
- promise_type::final_suspend()
- finalSuspendObj.operator co_await()
- finalSuspendAwaiter.await_ready()
- finalSuspendAwaiter.await_suspend()
- finalSuspendAwaiter.await_resume()
- finalSuspedObj destructor
- finalSuspendAwaiter destructor

This implements the checks for these cases and rejects such code with
a diagnostic.

[ accepts invalid ]
tested on x86_64-darwin, x86_64-linux-gnu,
OK for master / 10.x?
thanks
Iain


gcc/cp/ChangeLog:

        PR c++/95616
        * coroutines.cc (coro_diagnose_throwing_fn): New helper.
        (coro_diagnose_throwing_final_aw_expr): New helper.
        (build_co_await): Diagnose throwing final await expression
        components.
        (build_init_or_final_await): Diagnose a throwing promise
        final_suspend() call.


ok. Does this DTRT in the presence of -fno-exceptions? (i.e. use of that flag means you don't have to decorate everything with noexcept)

nathan

--
Nathan Sidwell

Reply via email to