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