We must flag that the resumer might throw (since the wrapping of the
original function body unconditionally adds a try-catch/rethrow). We
also add code that might throw - even when the original function body
would not.
TODO: We could improve code-gen by recognising cases where the combined
body + initial await expressions cannot throw and omitting the unneeded
try/catch/rethrow wrapper.
gcc/cp/ChangeLog:
* coroutines.cc (build_actor_fn): Set can_throw.
Signed-off-by: Iain Sandoe <iain@sandoe.co.uk>
(cherry picked from commit
e83c4bfc338fad0c87b2debb37ccfe98d148c7ac)
bool spf = start_preparsed_function (actor, NULL_TREE, SF_PRE_PARSED);
gcc_checking_assert (spf);
gcc_checking_assert (cfun && current_function_decl && TREE_STATIC (actor));
+ if (flag_exceptions)
+ /* We, unconditionally, add a try/catch and rethrow.
+ TODO: Determine if the combination of initial suspend and the original
+ body cannot throw, and elide these additions. */
+ cp_function_chain->can_throw = true;
tree stmt = begin_function_body ();
tree actor_bind = build3 (BIND_EXPR, void_type_node, NULL, NULL, NULL);