Merge branches/gcc-4_8-branch rev 210799.
[official-gcc.git] / gcc-4_8-branch / gcc / testsuite / g++.dg / ipa / pr60640-3.C
blob21b1f58a0407d21b957affac63a233aa4da2307a
1 // { dg-do run }
2 // { dg-options "-O3" }
4 struct Distraction
6   char fc[8];
7   virtual Distraction * return_self ()
8   { return this; }
9 };
11 namespace {
13 struct A;
14 static A * __attribute__ ((noinline, noclone)) get_an_A ();
16 static int go;
18 struct A
20   int fi;
22   A () : fi(777) {}
23   A (int pi) : fi (pi) {}
24   virtual A * foo (int p) = 0;
27 struct B;
28 static B * __attribute__ ((noinline, noclone)) get_a_B ();
30 struct B : public Distraction, A
32   B () : Distraction(), A() { }
33   B (int pi) : Distraction (), A (pi) {}
34   virtual B * foo (int p)
35   {
36     int o = fi;
37     for (int i = 0; i < p; i++)
38       o += i + i * i;
39     go = o;
41     return get_a_B ();
42   }
46 struct B gb1 (1111), gb2 (2);
47 static B * __attribute__ ((noinline, noclone))
48 get_a_B ()
50   return &gb1;
53 static A * __attribute__ ((noinline, noclone))
54 get_an_A ()
56   return &gb2;
61 static int __attribute__ ((noinline, noclone))
62 get_a_number ()
64   return 5;
67 extern "C" void abort (void);
69 int main (int argc, char *argv[])
71   for (int i = 0; i < get_a_number (); i++)
72     {
73       struct A *p = get_an_A ();
74       struct A *r = p->foo (4);
75       if (r->fi != 1111)
76         abort ();
77       if (go != 22)
78         abort ();
79     }
80   return 0;