111
|
1 /* { dg-do run } */
|
|
2 /* { dg-options "-O3 -fno-early-inlining -fno-ipa-sra -fdump-ipa-cp" } */
|
|
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;
|
131
|
15 virtual B *m_fn1(int *) { return NULL; }
|
111
|
16 virtual inline ~MultiTermDocs();
|
|
17 void wrap(void)
|
|
18 {
|
|
19 m_fn1(NULL);
|
|
20 }
|
|
21 };
|
|
22 class C : MultiTermDocs {
|
|
23 B *m_fn1(int *);
|
|
24 };
|
|
25 MultiTermDocs::~MultiTermDocs() {
|
|
26 wrap ();
|
|
27 if (&readerTermDocs) {
|
|
28 B *a;
|
|
29 for (unsigned i = 0; i < subReaders.length; i++)
|
|
30 (a != 0);
|
|
31 }
|
|
32 }
|
|
33
|
|
34 B *C::m_fn1(int *) { abort (); }
|
|
35
|
131
|
36 int main()
|
111
|
37 {
|
|
38 class C c;
|
|
39 }
|
|
40 /* { dg-final { scan-ipa-dump "Discovered a virtual call to" "cp" } } */
|