]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++, coroutines: Ensure that the resumer is marked as can_throw.
authorIain Sandoe <iain@sandoe.co.uk>
Sat, 7 Jun 2025 16:01:15 +0000 (17:01 +0100)
committerIain Sandoe <iain@sandoe.co.uk>
Fri, 13 Jun 2025 22:06:01 +0000 (23:06 +0100)
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>
gcc/cp/coroutines.cc

index 97eee6e8ea4dddc9958fba59a8c35eb20642c79c..bd61785a4ef564d03322048d24fee645e439fa64 100644 (file)
@@ -2406,6 +2406,11 @@ build_actor_fn (location_t loc, tree coro_frame_type, tree actor, tree fnbody,
   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);