2015-05-18 Steven G. Kargl <kargl@gcc.gnu.org>
[official-gcc.git] / gcc / testsuite / g++.dg / ipa / devirt-23.C
blob98d86aee8e04c3593e92738f1e2e4d016c148c9b
1 /* { dg-do run } */
2 /* { dg-options "-O3 -fno-partial-inlining -fdump-ipa-cp -fno-devirtualize-speculatively"  } */
3 /* Main purpose is to verify that we do not produce wrong devirtualization to
4    C::m_fn1.  We currently devirtualize to B::m_fn1, so check that. */
5 #include <stdlib.h>
6 class A {
7 public:
8   unsigned length;
9 };
10 class B {};
11 class MultiTermDocs : public virtual B {
12 protected:
13   A readerTermDocs;
14   A subReaders;
15   virtual B *m_fn1(int *) {}
16   virtual inline  ~MultiTermDocs();
17   inline void wrap(void)
18   {
19   m_fn1(NULL);
20   m_fn1(NULL);
21   m_fn1(NULL);
22   m_fn1(NULL);
23   m_fn1(NULL);
24   m_fn1(NULL);
25   m_fn1(NULL);
26   m_fn1(NULL);
27   m_fn1(NULL);
28   }
30 class C : MultiTermDocs {
31   B *m_fn1(int *);
33 MultiTermDocs::~MultiTermDocs() {
34   wrap ();
35   if (&readerTermDocs) {
36     B *a;
37     for (unsigned i = 0; i < subReaders.length; i++)
38       (a != 0);
39   }
42 B *C::m_fn1(int *) { abort (); }
44 main()
46   class C c;
48 /* { dg-final { scan-ipa-dump "Discovered a virtual call to" "cp" { xfail *-*-* } } } */
49 /* { dg-final { cleanup-ipa-dump "cp" } } */