diff options
author | jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-03-14 19:06:54 +0000 |
---|---|---|
committer | jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-03-14 19:06:54 +0000 |
commit | 27ea311dce42a5df5ec4772cdb0e2b365b891016 (patch) | |
tree | b0eec92fff85e3e1e0053ea49ba468b4ea9a3644 /gcc/testsuite/g++.dg/ipa | |
parent | b7985449a3309ab7d96a7fccd4bb72c13897fb46 (diff) | |
download | gcc-27ea311dce42a5df5ec4772cdb0e2b365b891016.tar.gz |
PR c++/58678
* search.c (dfs_get_pure_virtuals): Treat the destructor of an
abstract class as pure.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@208573 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/testsuite/g++.dg/ipa')
-rw-r--r-- | gcc/testsuite/g++.dg/ipa/devirt-30.C | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/ipa/devirt-30.C b/gcc/testsuite/g++.dg/ipa/devirt-30.C new file mode 100644 index 00000000000..c4ac6940a98 --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/devirt-30.C @@ -0,0 +1,25 @@ +// PR c++/58678 +// { dg-options "-O3 -fdump-ipa-devirt" } + +// We shouldn't speculatively devirtualize to ~B because B is an abstract +// class; any actual object passed to f will be of some derived class which +// has its own destructor. + +struct A +{ + virtual void f() = 0; + virtual ~A(); +}; + +struct B : A +{ + virtual ~B() {} +}; + +void f(B* b) +{ + delete b; +} + +// { dg-final { scan-ipa-dump-not "Speculatively devirtualizing" "devirt" } } +// { dg-final { cleanup-ipa-dump "devirt" } } |