From f45d5e30bd98ea1d8dc29841a06b2cfa5662deb5 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Tue, 28 Nov 2023 12:49:35 +0100 Subject: middle-end/112741 - ICE with gimple FE and later regimplification The GIMPLE frontend, when bypassing gimplification, doesn't set DECL_SEEN_IN_BIND_EXPR_P given there are no such things in GIMPLE. But it probably should set the flag anyway to avoid later ICEs when regimplifying. PR middle-end/112741 gcc/c/ * gimple-parser.cc (c_parser_parse_gimple_body): Also set DECL_SEEN_IN_BIND_EXPR_Pfor locals. gcc/testsuite/ * gcc.dg/ubsan/pr112741.c: New testcase. --- gcc/c/gimple-parser.cc | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'gcc/c') diff --git a/gcc/c/gimple-parser.cc b/gcc/c/gimple-parser.cc index f43c039..72bff1c 100644 --- a/gcc/c/gimple-parser.cc +++ b/gcc/c/gimple-parser.cc @@ -280,7 +280,13 @@ c_parser_parse_gimple_body (c_parser *cparser, char *gimple_pass, for (tree var = BIND_EXPR_VARS (stmt); var; var = DECL_CHAIN (var)) if (VAR_P (var) && !DECL_EXTERNAL (var)) - add_local_decl (cfun, var); + { + add_local_decl (cfun, var); + /* When the middle-end re-gimplifies any expression we might + run into the assertion that we've seen the decl in a BIND. */ + if (!TREE_STATIC (var)) + DECL_SEEN_IN_BIND_EXPR_P (var) = 1; + } /* We have a CFG. Build the edges. */ for (unsigned i = 0; i < parser.edges.length (); ++i) { -- cgit v1.1