summaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg/ipa
diff options
context:
space:
mode:
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2014-03-14 19:06:54 +0000
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2014-03-14 19:06:54 +0000
commit27ea311dce42a5df5ec4772cdb0e2b365b891016 (patch)
treeb0eec92fff85e3e1e0053ea49ba468b4ea9a3644 /gcc/testsuite/g++.dg/ipa
parentb7985449a3309ab7d96a7fccd4bb72c13897fb46 (diff)
downloadgcc-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.C25
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" } }