diff options
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/pr96820.c | 12 | ||||
-rw-r--r-- | gcc/tree-sra.c | 9 |
2 files changed, 19 insertions, 2 deletions
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr96820.c b/gcc/testsuite/gcc.dg/tree-ssa/pr96820.c new file mode 100644 index 0000000..f5c2195 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr96820.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-O1" } */ + +struct a { + int b; +}; +int main() { + struct a d[][6] = {4}; + struct a e; + d[1955249013][1955249013] = e; + return e.b; +} diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c index 754f413..98a6cac 100644 --- a/gcc/tree-sra.c +++ b/gcc/tree-sra.c @@ -941,6 +941,11 @@ create_access (tree expr, gimple *stmt, bool write) disqualify_candidate (base, "Encountered an unconstrained access."); return NULL; } + if (offset + size > tree_to_shwi (DECL_SIZE (base))) + { + disqualify_candidate (base, "Encountered an access beyond the base."); + return NULL; + } access = create_access_1 (base, offset, size); access->expr = expr; @@ -1880,12 +1885,12 @@ maybe_add_sra_candidate (tree var) reject (var, "has incomplete type"); return false; } - if (!tree_fits_uhwi_p (TYPE_SIZE (type))) + if (!tree_fits_shwi_p (TYPE_SIZE (type))) { reject (var, "type size not fixed"); return false; } - if (tree_to_uhwi (TYPE_SIZE (type)) == 0) + if (tree_to_shwi (TYPE_SIZE (type)) == 0) { reject (var, "type size is zero"); return false; |