diff options
-rw-r--r-- | gcc/testsuite/g++.dg/torture/pr102505.C | 15 | ||||
-rw-r--r-- | gcc/tree-sra.c | 2 |
2 files changed, 17 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/torture/pr102505.C b/gcc/testsuite/g++.dg/torture/pr102505.C new file mode 100644 index 0000000..a846751 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr102505.C @@ -0,0 +1,15 @@ +struct D { int i; int pad alignas(16); }; +struct B : virtual D +{ + int j =84; + int k =84; +}; + +struct C: B { }; + +int main() +{ + C c; + if (c.j != 84 || c.k != 84) + __builtin_abort(); +} diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c index 9b786e2..f561e1a 100644 --- a/gcc/tree-sra.c +++ b/gcc/tree-sra.c @@ -3288,6 +3288,8 @@ totally_scalarize_subtree (struct access *root) continue; HOST_WIDE_INT pos = root->offset + int_bit_position (fld); + if (pos + fsize > root->size) + return false; enum total_sra_field_state state = total_should_skip_creating_access (root, &last_seen_sibling, |