diff options
author | Richard Biener <rguenther@suse.de> | 2023-11-28 12:49:35 +0100 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2023-11-28 16:58:34 +0100 |
commit | f45d5e30bd98ea1d8dc29841a06b2cfa5662deb5 (patch) | |
tree | 3eff1bb4c79f753039f4c03fc05ea9bb6dac0f8b /gcc/c/gimple-parser.cc | |
parent | f26d68d5d128c86faaceeb81b1e8f22254ad53df (diff) | |
download | gcc-f45d5e30bd98ea1d8dc29841a06b2cfa5662deb5.zip gcc-f45d5e30bd98ea1d8dc29841a06b2cfa5662deb5.tar.gz gcc-f45d5e30bd98ea1d8dc29841a06b2cfa5662deb5.tar.bz2 |
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.
Diffstat (limited to 'gcc/c/gimple-parser.cc')
-rw-r--r-- | gcc/c/gimple-parser.cc | 8 |
1 files changed, 7 insertions, 1 deletions
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) { |