aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/testsuite/g++.dg/torture/pr102505.C15
-rw-r--r--gcc/tree-sra.c2
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,