| // { dg-do run } |
| // check MI and VBC offsets on throw |
| extern "C" void abort (); |
| extern "C" void exit (int); |
| |
| struct A { |
| int x[23]; |
| }; |
| |
| struct B : virtual public A { |
| int y[33]; |
| }; |
| |
| struct C : virtual public A, public B { |
| int z[43]; |
| }; |
| |
| struct D { |
| int xx[53]; |
| }; |
| |
| struct E : public D, public A { |
| int yy[63]; |
| }; |
| |
| C c; |
| |
| E e; |
| |
| void f1() |
| { |
| throw (C*)0; |
| } |
| |
| void f2() |
| { |
| throw &c; |
| } |
| |
| void f3() |
| { |
| throw (E*)0; |
| } |
| |
| void f4() |
| { |
| throw &e; |
| } |
| |
| int main() |
| { |
| int flag; |
| |
| flag = 0; |
| try { |
| f1(); |
| } |
| catch (A* p) { |
| if (p) |
| abort(); |
| flag = 1; |
| } |
| if (!flag) |
| abort(); |
| |
| flag = 0; |
| try { |
| f2(); |
| } |
| catch (A* p) { |
| if (!p || (void*)p == (void*)&c) |
| abort(); |
| flag = 1; |
| } |
| if (!flag) |
| abort(); |
| |
| flag = 0; |
| try { |
| f3(); |
| } |
| catch (A* p) { |
| if (p) |
| abort(); |
| flag = 1; |
| } |
| if (!flag) |
| abort(); |
| |
| flag = 0; |
| try { |
| f4(); |
| } |
| catch (A* p) { |
| if (!p || (void*)p == (void*)&e) |
| abort(); |
| flag = 1; |
| } |
| if (!flag) |
| abort(); |
| |
| exit(0); |
| } |