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 | |
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')
-rw-r--r-- | gcc/c/gimple-parser.cc | 8 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/ubsan/pr112741.c | 21 |
2 files changed, 28 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) { diff --git a/gcc/testsuite/gcc.dg/ubsan/pr112741.c b/gcc/testsuite/gcc.dg/ubsan/pr112741.c new file mode 100644 index 0000000..13994f6 --- /dev/null +++ b/gcc/testsuite/gcc.dg/ubsan/pr112741.c @@ -0,0 +1,21 @@ +/* { dg-do compile } */ +/* { dg-options "-fgimple -fsanitize=undefined" } */ + +int __GIMPLE(ssa) foo(int j) +{ + int c[1][10][1]; + int _1; + +__BB(2): + c[0][1][0] = 1; + c[0][1] = _Literal (int[1]) {}; + _1 = c[0][j_2(D)][0]; + return _1; +} + +int main() +{ + if (foo (1) != 0) + __builtin_abort (); + return 0; +} |