| // PR rtl-optimization/23299 |
| // { dg-do run } |
| // { dg-options "-Os" } |
| |
| extern "C" void abort (); |
| |
| struct A |
| { |
| virtual int a () { return 0; } |
| }; |
| |
| struct B : public A |
| { |
| virtual int b () { return 0; } |
| }; |
| |
| struct C : public A |
| { |
| virtual int c () { return 0; } |
| }; |
| |
| struct D |
| { |
| D () { d = 64; } |
| ~D (); |
| int d; |
| }; |
| |
| int x; |
| |
| D::~D () |
| { |
| x |= 1; |
| if (d != 64) |
| abort (); |
| } |
| |
| struct E : public B, public C |
| { |
| E () {} |
| virtual int c (); |
| ~E (); |
| D dv; |
| }; |
| |
| E::~E () |
| { |
| int r = c (); |
| } |
| |
| int E::c () |
| { |
| if (x > 10) |
| throw 1; |
| x |= 2; |
| return 0; |
| } |
| |
| int main (void) |
| { |
| { |
| E e; |
| } |
| if (x != 3) |
| abort (); |
| } |