re PR c++/70272 (-flifetime-dse miscompilation starting with r217967)
authorJakub Jelinek <jakub@redhat.com>
Thu, 17 Mar 2016 15:56:19 +0000 (16:56 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 17 Mar 2016 15:56:19 +0000 (16:56 +0100)
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.

From-SVN: r234296

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/opt/flifetime-dse5.C
gcc/testsuite/g++.dg/opt/flifetime-dse6.C [new file with mode: 0644]
gcc/testsuite/g++.dg/tree-ssa/ehcleanup-1.C

index 224e3fc5efd3fdb9228e6a943d250e54409cb52a..fa3917c178a80607526ddc156f639c39d85c004e 100644 (file)
@@ -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
index 216d7268c280e95457b07f61b6916cbed5f26f33..0a2e26793e0432cd66102cdc17bc2dd168a16183 100644 (file)
@@ -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.  */
index c59417ed2c2f45659295c3e24242a6c1ee2853f2..55035d1f33d589bc4793e88e08c5af5f9642b55a 100644 (file)
@@ -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
index 2c4902120f02d2c107214d35f3524c15183de4a6..92759440f00b8e5f643afd6256f5665aa49a31ec 100644 (file)
@@ -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 (file)
index 0000000..6c80558
--- /dev/null
@@ -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;
+}
index a5dc2aa38d728c0bbdfee4ec959d188c4b2be38c..d6e4cf37205958b5cfbe95611623f869546d5452 100644 (file)
@@ -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" } }
 //