aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2016-03-16 15:37:22 -0400
committerJason Merrill <jason@gcc.gnu.org>2016-03-16 15:37:22 -0400
commitc5e003cfe45c37f8170c12b4037e8dda70dbfb94 (patch)
tree511ac2e9bf961297ec53530805f624824e2c1367 /gcc
parentda0ad2630087aaaf62078123d554ffb722ca46c7 (diff)
downloadgcc-c5e003cfe45c37f8170c12b4037e8dda70dbfb94.zip
gcc-c5e003cfe45c37f8170c12b4037e8dda70dbfb94.tar.gz
gcc-c5e003cfe45c37f8170c12b4037e8dda70dbfb94.tar.bz2
re PR c++/70259 (-flifetime-dse=2 bug with empty bases)
PR c++/70259 * decl.c (start_preparsed_function): Don't clobber an empty base. From-SVN: r234267
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/decl.c2
-rw-r--r--gcc/testsuite/g++.dg/opt/flifetime-dse5.C13
3 files changed, 20 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index b142413..ac73878 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2016-03-16 Jason Merrill <jason@redhat.com>
+
+ PR c++/70259
+ * decl.c (start_preparsed_function): Don't clobber an empty base.
+
2016-03-16 Jakub Jelinek <jakub@redhat.com>
PR c++/70147
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 27c3597..216d726 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -14121,6 +14121,8 @@ start_preparsed_function (tree decl1, tree attrs, int flags)
&& (flag_lifetime_dse > 1)
&& DECL_CONSTRUCTOR_P (decl1)
&& !DECL_CLONED_FUNCTION_P (decl1)
+ /* Clobbering an empty base is harmful if it overlays real data. */
+ && !is_empty_class (current_class_type)
/* We can't clobber safely for an implicitly-defined default constructor
because part of the initialization might happen before we enter the
constructor, via AGGR_INIT_ZERO_FIRST (c++/68006). */
diff --git a/gcc/testsuite/g++.dg/opt/flifetime-dse5.C b/gcc/testsuite/g++.dg/opt/flifetime-dse5.C
new file mode 100644
index 0000000..2c49021
--- /dev/null
+++ b/gcc/testsuite/g++.dg/opt/flifetime-dse5.C
@@ -0,0 +1,13 @@
+// PR c++/70259
+// { dg-options -O2 }
+// { dg-do run }
+
+struct Empty { };
+struct A { A() : a(true) { } bool a; };
+struct B : Empty { B() : Empty() { } };
+struct C : A, B { C() : A(), B() { } };
+int main() {
+ C c;
+ if ( c.a == false )
+ __builtin_abort();
+};