1// { dg-do run  }
2// check MI and VBC offsets on throw
3extern "C" void abort ();
4extern "C" void exit (int);
5
6struct A {
7    int x[23];
8};
9
10struct B : virtual public A {
11    int y[33];
12};
13
14struct C : virtual public A, public B {
15    int z[43];
16};
17
18struct D {
19    int xx[53];
20};
21
22struct E : public D, public A {
23    int yy[63];
24};
25
26C c;
27
28E e;
29
30void f1()
31{
32    throw (C*)0;
33}
34
35void f2()
36{
37    throw &c;
38}
39
40void f3()
41{
42    throw (E*)0;
43}
44
45void f4()
46{
47    throw &e;
48}
49
50int main()
51{
52    int flag;
53
54    flag = 0;
55    try {
56        f1();
57    }
58    catch (A* p) {
59        if (p)
60            abort();
61        flag = 1;
62    }
63    if (!flag)
64        abort();
65
66    flag = 0;
67    try {
68        f2();
69    }
70    catch (A* p) {
71        if (!p || (void*)p == (void*)&c)
72            abort();
73        flag = 1;
74    }
75    if (!flag)
76        abort();
77
78    flag = 0;
79    try {
80        f3();
81    }
82    catch (A* p) {
83        if (p)
84            abort();
85        flag = 1;
86    }
87    if (!flag)
88        abort();
89
90    flag = 0;
91    try {
92        f4();
93    }
94    catch (A* p) {
95        if (!p || (void*)p == (void*)&e)
96            abort();
97        flag = 1;
98    }
99    if (!flag)
100        abort();
101
102    exit(0);
103}
104