aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMartin Jambor <mjambor@suse.cz>2012-12-21 23:06:38 +0100
committerMartin Jambor <jamborm@gcc.gnu.org>2012-12-21 23:06:38 +0100
commit28afe3fc7b02e8dd8925d35c7d5f062712885d47 (patch)
tree0c0efc5d601d7b0ae1e8707ebec73c815804ffe4 /gcc
parentc84a808e493a4041b64a91eb662042d490f8f84c (diff)
downloadgcc-28afe3fc7b02e8dd8925d35c7d5f062712885d47.zip
gcc-28afe3fc7b02e8dd8925d35c7d5f062712885d47.tar.gz
gcc-28afe3fc7b02e8dd8925d35c7d5f062712885d47.tar.bz2
re PR tree-optimization/55355 (internal compiler error: in tree_low_cst, at tree.c:6415)
2012-12-21 Martin Jambor <mjambor@suse.cz> PR tree-optimization/55355 * tree-sra.c (type_internals_preclude_sra_p): Also check that bit_position is small enough to fit a single HOST_WIDE_INT. * testsuite/g++.dg/torture/pr55355.C: New test. From-SVN: r194682
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/torture/pr55355.C23
-rw-r--r--gcc/tree-sra.c7
4 files changed, 40 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 21af147..8bc25ed 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2012-12-21 Martin Jambor <mjambor@suse.cz>
+
+ PR tree-optimization/55355
+ * tree-sra.c (type_internals_preclude_sra_p): Also check that
+ bit_position is small enough to fit a single HOST_WIDE_INT.
+
2012-12-21 Eric Botcazou <ebotcazou@adacore.com>
* rtlanal.c (volatile_insn_p): Delete commented out code.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index cfbece0..3fa83c2 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2012-12-21 Martin Jambor <mjambor@suse.cz>
+
+ PR tree-optimization/55355
+ * g++.dg/torture/pr55355.C: New test.
+
2012-12-21 Vladimir Makarov <vmakarov@redhat.com>
PR middle-end/55775
diff --git a/gcc/testsuite/g++.dg/torture/pr55355.C b/gcc/testsuite/g++.dg/torture/pr55355.C
new file mode 100644
index 0000000..6d8f8b6
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr55355.C
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+
+struct A
+{
+ void funcA(void);
+};
+
+struct B {};
+
+struct C
+{
+ void funcC(void) { a_mp->funcA(); }
+
+ char buf_ma[268435456];
+ A *a_mp;
+ B b_m;
+};
+
+void
+func(C *c_p)
+{
+ c_p->funcC();
+}
diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
index 21d8a51..286ef26 100644
--- a/gcc/tree-sra.c
+++ b/gcc/tree-sra.c
@@ -714,7 +714,12 @@ type_internals_preclude_sra_p (tree type, const char **msg)
{
*msg = "structure field size not fixed";
return true;
- }
+ }
+ if (!host_integerp (bit_position (fld), 0))
+ {
+ *msg = "structure field size too big";
+ return true;
+ }
if (AGGREGATE_TYPE_P (ft)
&& int_bit_position (fld) % BITS_PER_UNIT != 0)
{