diff options
author | Martin Jambor <mjambor@suse.cz> | 2012-12-21 23:06:38 +0100 |
---|---|---|
committer | Martin Jambor <jamborm@gcc.gnu.org> | 2012-12-21 23:06:38 +0100 |
commit | 28afe3fc7b02e8dd8925d35c7d5f062712885d47 (patch) | |
tree | 0c0efc5d601d7b0ae1e8707ebec73c815804ffe4 /gcc | |
parent | c84a808e493a4041b64a91eb662042d490f8f84c (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/torture/pr55355.C | 23 | ||||
-rw-r--r-- | gcc/tree-sra.c | 7 |
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) { |