for future use with defer statements, as they do not have a declaration
associated, and are bound to the scope with a BIND_EXPR

gcc/c/ChangeLog:

        * c-typeck.cc (push_cleanup): Adjust.

Signed-off-by: Anna (navi) Figueiredo Gomes <n...@vlhl.dev>
---
 gcc/c/c-typeck.cc | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/gcc/c/c-typeck.cc b/gcc/c/c-typeck.cc
index ed6e56e7279..f26184e5603 100644
--- a/gcc/c/c-typeck.cc
+++ b/gcc/c/c-typeck.cc
@@ -13586,14 +13586,20 @@ c_end_compound_stmt (location_t loc, tree stmt, bool 
do_scope)
    meant to apply to normal control flow transfer.  */
 
 void
-push_cleanup (tree decl, tree cleanup, bool eh_only)
+push_cleanup (tree node, tree cleanup, bool eh_only)
 {
+  location_t loc = UNKNOWN_LOCATION;
   enum tree_code code;
   tree stmt, list;
   bool stmt_expr;
 
+  if (DECL_P (node))
+    loc = DECL_SOURCE_LOCATION (node);
+  else if (EXPR_P (node))
+    loc = EXPR_LOCATION (node);
+
   code = eh_only ? TRY_CATCH_EXPR : TRY_FINALLY_EXPR;
-  stmt = build_stmt (DECL_SOURCE_LOCATION (decl), code, NULL, cleanup);
+  stmt = build_stmt (loc, code, NULL, cleanup);
   add_stmt (stmt);
   stmt_expr = STATEMENT_LIST_STMT_EXPR (cur_stmt_list);
   list = push_stmt_list ();
-- 
2.49.1

Reply via email to