1 // Copyright (C) 1999, 2000 Free Software Foundation, Inc.
2 // Contributed by Nathan Sidwell 29 Aug 1999 <nathan@acm.org>
4 // We cannot catch an ambiguous base class.
5 // -- public, << private, == virtual
11 // Special g++ Options: -w
14 struct B : virtual A { int m; };
15 struct C : virtual A { int m; };
16 struct AA : A { int m; };
17 struct D : B, C, AA { int m; };
18 struct E : virtual D { int m; };
20 void fna(A *obj) { throw obj; }
21 void fnb(B *obj) { throw obj; }
22 void fnc(C *obj) { throw obj; }
23 void fnd(D *obj) { throw obj; }
24 void fnaa(AA *obj) { throw obj; }
25 void fne(E *obj) { throw obj; }
27 extern "C" void abort();
33 // try with whole object
36 catch(A *p) { abort(); } // A is ambiguous
37 catch(D *p) { caught = 1; if (p != e) abort();}
38 catch(...) { abort(); }
43 catch(A *p) { abort(); } // A is ambiguous
44 catch(B *p) { caught = 1; if (p != e) abort();}
45 catch(...) { abort(); }
50 catch(A *p) { abort(); } // A is ambiguous
51 catch(C *p) { caught = 1; if (p != e) abort();}
52 catch(...) { abort(); }
57 catch(A *p) { abort(); } // A is ambiguous
58 catch(AA *p) { caught = 1; if (p != e) abort();}
59 catch(...) { abort(); }
65 catch(A *p) { abort(); } // A is ambiguous
66 catch(D *p) { caught = 1; if (p != e) abort();}
67 catch(...) { abort(); }
72 catch(A *p) { abort(); } // A is ambiguous
73 catch(B *p) { caught = 1; if (p != e) abort();}
74 catch(...) { abort(); }
79 catch(A *p) { abort(); } // A is ambiguous
80 catch(C *p) { caught = 1; if (p != e) abort();}
81 catch(...) { abort(); }
86 catch(A *p) { abort(); } // A is ambiguous
87 catch(AA *p) { caught = 1; if (p != e) abort();}
88 catch(...) { abort(); }
91 // try with an A object
94 catch(B *p) { abort(); } // throw type is static type
95 catch(A *p) { caught = 1; if (p != (B *)e) abort();}
96 catch(...) { abort(); }
101 catch(C *p) { abort(); } // throw type is static type
102 catch(A *p) { caught = 1; if (p != (C *)e) abort();}
103 catch(...) { abort(); }
104 if (!caught) abort();
107 try { fna((AA *)e); }
108 catch(AA *p) { abort(); } // throw type is static type
109 catch(A *p) { caught = 1; if (p != (AA *)e) abort();}
110 catch(...) { abort(); }
111 if (!caught) abort();
116 catch(A *p) { caught = 1; if (p != (B *)e) abort();}
117 catch(...) { abort(); }
118 if (!caught) abort();
122 catch(B *p) { caught = 1; if (p != e) abort();}
123 catch(...) { abort(); }
124 if (!caught) abort();
128 catch(C *p) { abort(); }
129 catch(D *p) { abort(); }
130 catch(...) { caught =1; }
131 if (!caught) abort();
136 catch(A *p) { caught = 1; if (p != (C *)e) abort();}
137 catch(...) { abort(); }
138 if (!caught) abort();
142 catch(C *p) { caught = 1; if (p != e) abort();}
143 catch(...) { abort(); }
144 if (!caught) abort();
148 catch(B *p) { abort(); }
149 catch(D *p) { abort(); }
150 catch(...) { caught =1; }
151 if (!caught) abort();
153 // try with AA object
155 try { fnaa((AA *)e); }
156 catch(A *p) { caught = 1; if (p != (AA *)e) abort();}
157 catch(...) { abort(); }
158 if (!caught) abort();
161 try { fnaa((AA *)e); }
162 catch(AA *p) { caught = 1; if (p != e) abort();}
163 catch(...) { abort(); }
164 if (!caught) abort();
167 try { fnaa((AA *)e); }
168 catch(C *p) { abort(); }
169 catch(B *p) { abort(); }
170 catch(D *p) { abort(); }
171 catch(...) { caught =1; }
172 if (!caught) abort();
180 check (&e); // try with an object
181 check ((E *)0); // try with no object