From f9e953c92a955858039b86d10021949655d2e394 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Mon, 18 Apr 2011 14:37:08 +0000 Subject: [PATCH] backport: [multiple changes] 2011-04-18 Richard Guenther Backported from 4.6 branch 2011-03-11 Jakub Jelinek PR c++/48035 * init.c (build_zero_init_1): Extracted from build_zero_init. Add FIELD_SIZE argument, if non-NULL and field bit_position as not smaller than that, don't add that field's initializer. Pass DECL_SIZE as last argument to build_zero_init_1 for DECL_FIELD_IS_BASE fields. (build_zero_init): Use build_zero_init_1. * g++.dg/inherit/virtual8.C: New test. 2011-03-05 Zdenek Dvorak PR rtl-optimization/47899 * cfgloopmanip.c (fix_bb_placements): Fix first argument to flow_loop_nested_p when moving the loop upward. * gcc.dg/pr47899.c: New test. 2011-03-15 Richard Guenther PR middle-end/48031 * fold-const.c (fold_indirect_ref_1): Do not create new variable-sized or variable-indexed array accesses when in gimple form. From-SVN: r172652 --- gcc/testsuite/g++.dg/inherit/virtual8.C | 48 +++++++++++++++++++++++++ gcc/testsuite/gcc.dg/pr47899.c | 26 ++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 gcc/testsuite/g++.dg/inherit/virtual8.C create mode 100644 gcc/testsuite/gcc.dg/pr47899.c diff --git a/gcc/testsuite/g++.dg/inherit/virtual8.C b/gcc/testsuite/g++.dg/inherit/virtual8.C new file mode 100644 index 000000000000..4f6a119b2879 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/virtual8.C @@ -0,0 +1,48 @@ +// PR c++/48035 +// { dg-do run } + +#include +#include +#include + +struct A +{ + virtual void foo (void) {} + virtual ~A () {} +}; + +struct B : public A +{ + virtual ~B () {} +}; + +struct C +{ + virtual ~C () {} + int c; +}; + +struct D : public virtual B, public C +{ + virtual ~D () {} +}; + +struct E : public virtual D +{ + virtual ~E () {} +}; + +int +main () +{ + char *v = new char[sizeof (E) + 16]; + memset (v, 0x55, sizeof (E) + 16); + E *e = new (v) E (); + e->~E (); + + for (unsigned i = sizeof (E); i < sizeof (E) + 16; ++i) + if (v[i] != 0x55) + abort (); + + delete[] v; +} diff --git a/gcc/testsuite/gcc.dg/pr47899.c b/gcc/testsuite/gcc.dg/pr47899.c new file mode 100644 index 000000000000..c83bb85e314c --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr47899.c @@ -0,0 +1,26 @@ +/* PR rtl-optimization/47899 */ +/* { dg-do compile } */ +/* { dg-options "-O -funroll-loops" } */ + +extern unsigned int a, b, c; +extern int d; + +static int +foo (void) +{ +lab: + if (b) + for (d = 0; d >= 0; d--) + if (a || c) + for (; c; c++) + ; + else + goto lab; +} + +int +main () +{ + foo (); + return 0; +} -- 2.47.2