Hi,

Exception in coroutine is not correctly handled because the default
return_void call is now inserted before the finish suspend point,
rather than at the end of the original coroutine body.  This patch
fixes the issue by generating following code:
  co_await promise.initial_suspend();
  try {
    // The original coroutine body

    promise.return_void(); // The default return_void call.
  } catch (...) {
    promise.unhandled_exception();
  }
  final_suspend:
  // ...

Bootstrap and test on x86_64.  Is it OK?

Thanks,
bin

gcc/cp
2020-02-03  Bin Cheng  <bin.ch...@linux.alibaba.com>

        * coroutines.cc (build_actor_fn): Factor out code inserting the
        default return_void call to...
        (morph_fn_to_coro): ...here, also hoist local var declarations.

gcc/testsuite
2020-02-03  Bin Cheng  <bin.ch...@linux.alibaba.com>

        * g++.dg/coroutines/torture/co-ret-15-default-return_void.C: New.

Attachment: 0001-Insert-default-return_void-at-the-end-of-coroutine-b.patch
Description: Binary data

Reply via email to