diff options
author | Jakub Jelinek <jakub@redhat.com> | 2016-03-17 16:56:19 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2016-03-17 16:56:19 +0100 |
commit | a3aad0e69c4f3f66a51c03c50c48c0d083db96f7 (patch) | |
tree | c42aad8c58bef657fcf26b301863bb51d149b18c /gcc | |
parent | b57e6e182cc596dd2e346b5799b57014ced47229 (diff) | |
download | gcc-a3aad0e69c4f3f66a51c03c50c48c0d083db96f7.zip gcc-a3aad0e69c4f3f66a51c03c50c48c0d083db96f7.tar.gz gcc-a3aad0e69c4f3f66a51c03c50c48c0d083db96f7.tar.bz2 |
re PR c++/70272 (-flifetime-dse miscompilation starting with r217967)
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/decl.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/opt/flifetime-dse5.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/opt/flifetime-dse6.C | 11 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/tree-ssa/ehcleanup-1.C | 2 |
6 files changed, 29 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 224e3fc..fa3917c 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 216d726..0a2e267 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 c59417e..55035d1 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 2c49021..9275944 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 0000000..6c80558 --- /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 a5dc2aa..d6e4cf3 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" } } // |