| // { dg-do run } |
| // { dg-options "-O2 -fipa-cp-clone" } |
| |
| struct Distraction |
| { |
| char fc[8]; |
| virtual Distraction * return_self () |
| { return this; } |
| }; |
| |
| static int go; |
| |
| struct A; |
| |
| struct A |
| { |
| int fi; |
| |
| A () : fi(0) {} |
| A (int pi) : fi (pi) {} |
| virtual void foo (int p) = 0; |
| }; |
| |
| struct B; |
| |
| struct B : public Distraction, A |
| { |
| B () : Distraction(), A() { } |
| B (int pi) : Distraction (), A (pi) {} |
| virtual void foo (int p) |
| { |
| int o = fi; |
| for (int i = 0; i < p; i++) |
| o += i + i * i; |
| go = o; |
| } |
| }; |
| |
| struct B gb2 (2); |
| |
| extern "C" void abort (void); |
| |
| int |
| main (void) |
| { |
| for (int i = 0; i < 2; i++) |
| { |
| struct A *p = &gb2; |
| p->foo (0); |
| if (go != 2) |
| abort (); |
| } |
| return 0; |
| } |