aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2016-03-17 15:56:19 +0000
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2016-03-17 15:56:19 +0000
commitf7995d7df22ea5c54818fc5d6e6a4984840c6055 (patch)
treec42aad8c58bef657fcf26b301863bb51d149b18c
parent5ec4a94978e3315cc38288d062b61d58017214df (diff)
PR c++/70272
* decl.c (begin_destructor_body): Don't insert clobber if is_empty_class (current_class_type). * g++.dg/opt/flifetime-dse5.C (main): Remove extra semicolon. * g++.dg/opt/flifetime-dse6.C: New test. * g++.dg/tree-ssa/ehcleanup-1.C: Adjust unreachable count. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@234296 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/decl.c4
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/g++.dg/opt/flifetime-dse5.C2
-rw-r--r--gcc/testsuite/g++.dg/opt/flifetime-dse6.C11
-rw-r--r--gcc/testsuite/g++.dg/tree-ssa/ehcleanup-1.C2
6 files changed, 29 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 224e3fc5efd..fa3917c178a 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2016-03-17 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/70272
+ * decl.c (begin_destructor_body): Don't insert clobber if
+ is_empty_class (current_class_type).
+
2016-03-17 Marek Polacek <polacek@redhat.com>
PR c++/70194
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 216d7268c28..0a2e26793e0 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -14354,7 +14354,9 @@ begin_destructor_body (void)
initialize_vtbl_ptrs (current_class_ptr);
finish_compound_stmt (compound_stmt);
- if (flag_lifetime_dse)
+ if (flag_lifetime_dse
+ /* Clobbering an empty base is harmful if it overlays real data. */
+ && !is_empty_class (current_class_type))
{
/* Insert a cleanup to let the back end know that the object is dead
when we exit the destructor, either normally or via exception. */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c59417ed2c2..55035d1f33d 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2016-03-17 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/70272
+ * g++.dg/opt/flifetime-dse5.C (main): Remove extra semicolon.
+ * g++.dg/opt/flifetime-dse6.C: New test.
+ * g++.dg/tree-ssa/ehcleanup-1.C: Adjust unreachable count.
+
2016-03-17 H.J. Lu <hongjiu.lu@intel.com>
PR driver/70192
diff --git a/gcc/testsuite/g++.dg/opt/flifetime-dse5.C b/gcc/testsuite/g++.dg/opt/flifetime-dse5.C
index 2c4902120f0..92759440f00 100644
--- a/gcc/testsuite/g++.dg/opt/flifetime-dse5.C
+++ b/gcc/testsuite/g++.dg/opt/flifetime-dse5.C
@@ -10,4 +10,4 @@ int main() {
C c;
if ( c.a == false )
__builtin_abort();
-};
+}
diff --git a/gcc/testsuite/g++.dg/opt/flifetime-dse6.C b/gcc/testsuite/g++.dg/opt/flifetime-dse6.C
new file mode 100644
index 00000000000..6c805586252
--- /dev/null
+++ b/gcc/testsuite/g++.dg/opt/flifetime-dse6.C
@@ -0,0 +1,11 @@
+// PR c++/70272
+// { dg-options -O2 }
+// { dg-do run }
+
+struct Empty { };
+struct A { A() : a(true) { } bool a; ~A() { if (!a) __builtin_abort(); } };
+struct B : Empty { B() : Empty() { } ~B() { } };
+struct C : A, B { C() : A(), B() { } ~C() { } };
+int main() {
+ C c;
+}
diff --git a/gcc/testsuite/g++.dg/tree-ssa/ehcleanup-1.C b/gcc/testsuite/g++.dg/tree-ssa/ehcleanup-1.C
index a5dc2aa38d7..d6e4cf37205 100644
--- a/gcc/testsuite/g++.dg/tree-ssa/ehcleanup-1.C
+++ b/gcc/testsuite/g++.dg/tree-ssa/ehcleanup-1.C
@@ -26,5 +26,5 @@ t (void)
// { dg-final { scan-tree-dump-times "Empty EH handler" 2 "ehcleanup1" } }
//
// And as a result also contained control flow.
-// { dg-final { scan-tree-dump-times "Removing unreachable" 6 "ehcleanup1" } }
+// { dg-final { scan-tree-dump-times "Removing unreachable" 4 "ehcleanup1" } }
//