2015-03-24 Paolo Carlini <paolo.carlini@oracle.com>
[official-gcc.git] / gcc / testsuite / g++.dg / ipa / devirt-11.C
blob7a698f16967e701f4dfd0ce8eb8cad6bd8598b11
1 /* { dg-do compile } */
2 /* { dg-options "-O2 -fno-ipa-cp -fdump-ipa-inline -fno-devirtualize-speculatively" } */
3 int baz ();
4 struct A
6   virtual int fn2 () = 0;
7   virtual int *fn3 ();
8   double *fn4 ();
9   int fn5 (int);
10   template <class T>
11   void fn1 (A &, T) { fn3 (); fn4 (); fn2 (); }
13 struct B : A
15   int fn2 () { return 6; }
16   void fn3 (int, double);
17   B (bool = true);
18   B (int, int);
20 template <typename T>
21 void
22 foo (B &x, A &y, A &z)
24   y.fn2 ();
25   z.fn2 ();
26   int i = baz ();
27   int j = (y.fn3 ())[i];
28   x.fn3 (j, (y.fn4 ())[i] + (z.fn4 ())[z.fn5 (j)]);
30 inline B
31 operator+ (A &y, A &z)
33   B x;
34   foo<int> (x, y, z);
35   return x;
37 void
38 bar ()
40   B a, b, c (4, 0), d;
41   a.fn1 (b, .6);
42   baz ();
43   c + d;
45 /* { dg-final { scan-ipa-dump "Discovered a virtual call to a known target" "inline"  } } */
46 /* { dg-final { cleanup-ipa-dump "inline" } } */