1 // { dg-do run } 2 // { dg-options "-w" } 3 // Copyright (C) 1999, 2000 Free Software Foundation, Inc. 4 // Contributed by Nathan Sidwell 29 Aug 1999 <nathan (at) acm.org> 5 6 // We cannot catch an ambiguous base class. 7 // -- public, << private, == virtual 8 9 // E==D--B==A 10 // +--C==A 11 // +--AA-A 12 13 14 struct A { int m; virtual ~A(){}}; 15 struct B : virtual A { int m; }; 16 struct C : virtual A { int m; }; 17 struct AA : A { int m; }; 18 struct D : B, C, AA { int m; }; 19 struct E : virtual D { int m; }; 20 21 void fna(A *obj) { throw obj; } 22 void fnb(B *obj) { throw obj; } 23 void fnc(C *obj) { throw obj; } 24 void fnd(D *obj) { throw obj; } 25 void fnaa(AA *obj) { throw obj; } 26 void fne(E *obj) { throw obj; } 27 28 extern "C" void abort(); 29 30 void check(E *e) 31 { 32 int caught; 33 34 // try with whole object 35 caught = 0; 36 try { fne(e); } 37 catch(A *p) { abort(); } // A is ambiguous 38 catch(D *p) { caught = 1; if (p != e) abort();} 39 catch(...) { abort(); } 40 if (!caught) abort(); 41 42 caught = 0; 43 try { fne(e); } 44 catch(A *p) { abort(); } // A is ambiguous 45 catch(B *p) { caught = 1; if (p != e) abort();} 46 catch(...) { abort(); } 47 if (!caught) abort(); 48 49 caught = 0; 50 try { fne(e); } 51 catch(A *p) { abort(); } // A is ambiguous 52 catch(C *p) { caught = 1; if (p != e) abort();} 53 catch(...) { abort(); } 54 if (!caught) abort(); 55 56 caught = 0; 57 try { fne(e); } 58 catch(A *p) { abort(); } // A is ambiguous 59 catch(AA *p) { caught = 1; if (p != e) abort();} 60 catch(...) { abort(); } 61 if (!caught) abort(); 62 63 // try with D oject 64 caught = 0; 65 try { fnd((D *)e); } 66 catch(A *p) { abort(); } // A is ambiguous 67 catch(D *p) { caught = 1; if (p != e) abort();} 68 catch(...) { abort(); } 69 if (!caught) abort(); 70 71 caught = 0; 72 try { fnd((D *)e); } 73 catch(A *p) { abort(); } // A is ambiguous 74 catch(B *p) { caught = 1; if (p != e) abort();} 75 catch(...) { abort(); } 76 if (!caught) abort(); 77 78 caught = 0; 79 try { fnd((D *)e); } 80 catch(A *p) { abort(); } // A is ambiguous 81 catch(C *p) { caught = 1; if (p != e) abort();} 82 catch(...) { abort(); } 83 if (!caught) abort(); 84 85 caught = 0; 86 try { fnd((D *)e); } 87 catch(A *p) { abort(); } // A is ambiguous 88 catch(AA *p) { caught = 1; if (p != e) abort();} 89 catch(...) { abort(); } 90 if (!caught) abort(); 91 92 // try with an A object 93 caught = 0; 94 try { fna((B *)e); } 95 catch(B *p) { abort(); } // throw type is static type 96 catch(A *p) { caught = 1; if (p != (B *)e) abort();} 97 catch(...) { abort(); } 98 if (!caught) abort(); 99 100 caught = 0; 101 try { fna((C *)e); } 102 catch(C *p) { abort(); } // throw type is static type 103 catch(A *p) { caught = 1; if (p != (C *)e) abort();} 104 catch(...) { abort(); } 105 if (!caught) abort(); 106 107 caught = 0; 108 try { fna((AA *)e); } 109 catch(AA *p) { abort(); } // throw type is static type 110 catch(A *p) { caught = 1; if (p != (AA *)e) abort();} 111 catch(...) { abort(); } 112 if (!caught) abort(); 113 114 // try with B object 115 caught = 0; 116 try { fnb((B *)e); } 117 catch(A *p) { caught = 1; if (p != (B *)e) abort();} 118 catch(...) { abort(); } 119 if (!caught) abort(); 120 121 caught = 0; 122 try { fnb((B *)e); } 123 catch(B *p) { caught = 1; if (p != e) abort();} 124 catch(...) { abort(); } 125 if (!caught) abort(); 126 127 caught = 0; 128 try { fnb((B *)e); } 129 catch(C *p) { abort(); } 130 catch(D *p) { abort(); } 131 catch(...) { caught =1; } 132 if (!caught) abort(); 133 134 // try with C object 135 caught = 0; 136 try { fnc((C *)e); } 137 catch(A *p) { caught = 1; if (p != (C *)e) abort();} 138 catch(...) { abort(); } 139 if (!caught) abort(); 140 141 caught = 0; 142 try { fnc((C *)e); } 143 catch(C *p) { caught = 1; if (p != e) abort();} 144 catch(...) { abort(); } 145 if (!caught) abort(); 146 147 caught = 0; 148 try { fnc((C *)e); } 149 catch(B *p) { abort(); } 150 catch(D *p) { abort(); } 151 catch(...) { caught =1; } 152 if (!caught) abort(); 153 154 // try with AA object 155 caught = 0; 156 try { fnaa((AA *)e); } 157 catch(A *p) { caught = 1; if (p != (AA *)e) abort();} 158 catch(...) { abort(); } 159 if (!caught) abort(); 160 161 caught = 0; 162 try { fnaa((AA *)e); } 163 catch(AA *p) { caught = 1; if (p != e) abort();} 164 catch(...) { abort(); } 165 if (!caught) abort(); 166 167 caught = 0; 168 try { fnaa((AA *)e); } 169 catch(C *p) { abort(); } 170 catch(B *p) { abort(); } 171 catch(D *p) { abort(); } 172 catch(...) { caught =1; } 173 if (!caught) abort(); 174 175 return; 176 } 177 178 int main () 179 { 180 E e; 181 check (&e); // try with an object 182 check ((E *)0); // try with no object 183 184 return 0; 185 } 186