diff options
author | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2016-03-17 15:56:19 +0000 |
---|---|---|
committer | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2016-03-17 15:56:19 +0000 |
commit | f7995d7df22ea5c54818fc5d6e6a4984840c6055 (patch) | |
tree | c42aad8c58bef657fcf26b301863bb51d149b18c | |
parent | 5ec4a94978e3315cc38288d062b61d58017214df (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/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 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" } } // |