diff options
Diffstat (limited to 'gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-21.C')
-rw-r--r-- | gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-21.C | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-21.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-21.C new file mode 100644 index 000000000..99f60afe3 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-21.C @@ -0,0 +1,41 @@ +/* { dg-do run } */ +/* { dg-options "-O3 -fno-early-inlining -fno-ipa-sra -fdump-ipa-cp" } */ +/* Main purpose is to verify that we do not produce wrong devirtualization to + C::m_fn1. We currently devirtualize to B::m_fn1, so check that. */ +#include <stdlib.h> +class A { +public: + unsigned length; +}; +class B {}; +class MultiTermDocs : public virtual B { +protected: + A readerTermDocs; + A subReaders; + virtual B *m_fn1(int *) {} + virtual inline ~MultiTermDocs(); + void wrap(void) + { + m_fn1(NULL); + } +}; +class C : MultiTermDocs { + B *m_fn1(int *); +}; +MultiTermDocs::~MultiTermDocs() { + wrap (); + if (&readerTermDocs) { + B *a; + for (unsigned i = 0; i < subReaders.length; i++) + (a != 0); + } +} + +B *C::m_fn1(int *) { abort (); } + +main() +{ + class C c; +} +/* { dg-final { scan-ipa-dump "Discovered a virtual call to" "cp" } } */ +/* { dg-final { cleanup-ipa-dump "cp" } } */ |