| // PR middle-end/48661 |
| // { dg-do run } |
| |
| extern "C" void abort (); |
| |
| __attribute__((noinline)) |
| double |
| foo (double x, double y) |
| { |
| asm volatile ("" : : : "memory"); |
| return x + y; |
| } |
| |
| __attribute__((noinline, noclone)) |
| void |
| bar (int x) |
| { |
| if (x != 123) |
| abort (); |
| } |
| |
| struct A |
| { |
| double a1, a2; |
| }; |
| |
| struct B |
| { |
| virtual int m () const = 0 ; |
| }; |
| |
| struct C |
| { |
| virtual ~C () {} |
| }; |
| |
| struct D : virtual public B, public C |
| { |
| explicit D (const A &x) : d(123) { foo (x.a2, x.a1); } |
| int m () const { return d; } |
| int d; |
| }; |
| |
| struct E |
| { |
| E () : d(0) {} |
| virtual void n (const B &x) { d = x.m (); x.m (); x.m (); } |
| int d; |
| }; |
| |
| void |
| test () |
| { |
| A a; |
| a.a1 = 0; |
| a.a2 = 1; |
| E p; |
| D q (a); |
| const B &b = q; |
| bar (b.m ()); |
| p.n (b); |
| bar (p.d); |
| } |
| |
| void |
| baz () |
| { |
| A a; |
| D p2 (a); |
| } |
| |
| int |
| main () |
| { |
| test (); |
| return 0; |
| } |