// { dg-do run } // { dg-options "-O3" } struct Distraction { char fc[8]; virtual Distraction * return_self () { return this; } }; namespace { struct A; static A * __attribute__ ((noinline, noclone)) get_an_A (); static int go; struct A { int fi; A () : fi(777) {} A (int pi) : fi (pi) {} virtual A * foo (int p) = 0; }; struct B; static B * __attribute__ ((noinline, noclone)) get_a_B (); struct B : public Distraction, A { B () : Distraction(), A() { } B (int pi) : Distraction (), A (pi) {} virtual B * foo (int p) { int o = fi; for (int i = 0; i < p; i++) o += i + i * i; go = o; return get_a_B (); } }; struct B gb1 (1111), gb2 (2); static B * __attribute__ ((noinline, noclone)) get_a_B () { return &gb1; } static A * __attribute__ ((noinline, noclone)) get_an_A () { return &gb2; } } static int __attribute__ ((noinline, noclone)) get_a_number () { return 5; } extern "C" void abort (void); int main (int argc, char *argv[]) { for (int i = 0; i < get_a_number (); i++) { struct A *p = get_an_A (); struct A *r = p->foo (4); if (r->fi != 1111) abort (); if (go != 22) abort (); } return 0; }