https://gcc.gnu.org/g:3949b7c0a87475692d1727086bdccb8133c53497

commit r15-3064-g3949b7c0a87475692d1727086bdccb8133c53497
Author: Iain Sandoe <i...@sandoe.co.uk>
Date:   Wed Aug 14 13:30:30 2024 +0100

    c++, coroutines: Check for malformed functions before splitting.
    
    This performs the same basic check that is done by finish_function
    to catch cases where the function is so badly malformed that we
    do not have a consistent binding level.
    
    gcc/cp/ChangeLog:
    
            * coroutines.cc (split_coroutine_body_from_ramp): Check
            that the binding level is as expected before attempting
            to outline the function body.
    
    Signed-off-by: Iain Sandoe <i...@sandoe.co.uk>

Diff:
---
 gcc/cp/coroutines.cc | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/gcc/cp/coroutines.cc b/gcc/cp/coroutines.cc
index f7791cbfb9a6..7af2a1885615 100644
--- a/gcc/cp/coroutines.cc
+++ b/gcc/cp/coroutines.cc
@@ -4553,10 +4553,16 @@ coro_rewrite_function_body (location_t fn_start, tree 
fnbody, tree orig,
 static tree
 split_coroutine_body_from_ramp (tree fndecl)
 {
-  tree body;
+  /* Sanity-check and punt if we have a nonsense tree because of earlier
+     parse errors, perhaps.  */
+  if (!current_binding_level
+      || current_binding_level->kind != sk_function_parms)
+    return NULL_TREE;
+
   /* Once we've tied off the original user-authored body in fn_body.
      Start the replacement synthesized ramp body.  */
 
+  tree body;
   if (use_eh_spec_block (fndecl))
     {
       body = pop_stmt_list (TREE_OPERAND (current_eh_spec_block, 0));

Reply via email to