Rebase.
[official-gcc.git] / gcc / testsuite / g++.dg / ipa / devirt-7.C
blob1c59122303dc1b286ef7a571aa5c51c642302e5f
1 /* Verify that IPA-CP can do devirtualization even if the virtual call
2    comes from a method that has been early-inlined into a descendant.  */
3 /* { dg-do run } */
4 /* { dg-options "-O3 -fdump-ipa-cp"  } */
6 extern "C" void abort (void);
8 class Distraction
10 public:
11   float f;
12   double d;
13   Distraction ()
14   {
15     f = 8.3;
16     d = 10.2;
17   }
18   virtual float bar (float z);
21 class A
23 public:
24   int data;
25   virtual int foo (int i);
26   int middleman_1 (int i);
30 class B : public Distraction, public A
32 public:
33   virtual int foo (int i);
34   int middleman_2 (int i);
35   __attribute__ ((noinline)) B();
38 float Distraction::bar (float z)
40   f += z;
41   return f/2;
44 int A::foo (int i)
46   return i + 1;
49 int B::foo (int i)
51   return i + 2;
54 int __attribute__ ((noinline,noclone)) get_input(void)
56   return 1;
59 int inline __attribute__ ((always_inline))
60 A::middleman_1 (int i)
62   return this->foo (i);
65 int __attribute__ ((noinline))
66 B::middleman_2 (int i)
68   return this->middleman_1 (i);
71 B::B ()
75 int main (int argc, char *argv[])
77   class B b;
78   int i;
80   for (i = 0; i < get_input(); i++)
81     if (b.middleman_2 (get_input ()) != 3)
82       abort ();
83   return 0;
86 /* { dg-final { scan-ipa-dump "Discovered a virtual call to a known target.*B::foo"  "cp"  } } */
87 /* { dg-final { cleanup-ipa-dump "cp" } } */