From: Martin Jambor Date: Fri, 21 Dec 2012 22:06:38 +0000 (+0100) Subject: re PR tree-optimization/55355 (internal compiler error: in tree_low_cst, at tree... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=28afe3fc7b02e8dd8925d35c7d5f062712885d47;p=gcc.git re PR tree-optimization/55355 (internal compiler error: in tree_low_cst, at tree.c:6415) 2012-12-21 Martin Jambor 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 21af1477892..8bc25edd86c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2012-12-21 Martin Jambor + + 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 * rtlanal.c (volatile_insn_p): Delete commented out code. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index cfbece022a9..3fa83c217a9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-12-21 Martin Jambor + + PR tree-optimization/55355 + * g++.dg/torture/pr55355.C: New test. + 2012-12-21 Vladimir Makarov 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 00000000000..6d8f8b6be1e --- /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 21d8a514117..286ef266920 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) {