From f7995d7df22ea5c54818fc5d6e6a4984840c6055 Mon Sep 17 00:00:00 2001 From: jakub Date: Thu, 17 Mar 2016 15:56:19 +0000 Subject: 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 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/decl.c | 4 +++- gcc/testsuite/ChangeLog | 7 +++++++ gcc/testsuite/g++.dg/opt/flifetime-dse5.C | 2 +- gcc/testsuite/g++.dg/opt/flifetime-dse6.C | 11 +++++++++++ gcc/testsuite/g++.dg/tree-ssa/ehcleanup-1.C | 2 +- 6 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/opt/flifetime-dse6.C (limited to 'gcc') 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 + + PR c++/70272 + * decl.c (begin_destructor_body): Don't insert clobber if + is_empty_class (current_class_type). + 2016-03-17 Marek Polacek 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 + + 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 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" } } // -- cgit v1.2.3