3 // Copyright (C) 1999, 2000 Free Software Foundation, Inc.
4 // Contributed by Nathan Sidwell 29 Aug 1999 <nathan@acm.org>
6 // We cannot catch an ambiguous base class.
7 // -- public, << private, == virtual
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; };
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; }
28 extern "C" void abort();
34 // try with whole object
37 catch(A *p) { abort(); } // A is ambiguous
38 catch(D *p) { caught = 1; if (p != e) abort();}
39 catch(...) { abort(); }
44 catch(A *p) { abort(); } // A is ambiguous
45 catch(B *p) { caught = 1; if (p != e) abort();}
46 catch(...) { abort(); }
51 catch(A *p) { abort(); } // A is ambiguous
52 catch(C *p) { caught = 1; if (p != e) abort();}
53 catch(...) { abort(); }
58 catch(A *p) { abort(); } // A is ambiguous
59 catch(AA *p) { caught = 1; if (p != e) abort();}
60 catch(...) { abort(); }
66 catch(A *p) { abort(); } // A is ambiguous
67 catch(D *p) { caught = 1; if (p != e) abort();}
68 catch(...) { abort(); }
73 catch(A *p) { abort(); } // A is ambiguous
74 catch(B *p) { caught = 1; if (p != e) abort();}
75 catch(...) { abort(); }
80 catch(A *p) { abort(); } // A is ambiguous
81 catch(C *p) { caught = 1; if (p != e) abort();}
82 catch(...) { abort(); }
87 catch(A *p) { abort(); } // A is ambiguous
88 catch(AA *p) { caught = 1; if (p != e) abort();}
89 catch(...) { abort(); }
92 // try with an A object
95 catch(B *p) { abort(); } // throw type is static type
96 catch(A *p) { caught = 1; if (p != (B *)e) abort();}
97 catch(...) { abort(); }
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();
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();
117 catch(A *p) { caught = 1; if (p != (B *)e) abort();}
118 catch(...) { abort(); }
119 if (!caught) abort();
123 catch(B *p) { caught = 1; if (p != e) abort();}
124 catch(...) { abort(); }
125 if (!caught) abort();
129 catch(C *p) { abort(); }
130 catch(D *p) { abort(); }
131 catch(...) { caught =1; }
132 if (!caught) abort();
137 catch(A *p) { caught = 1; if (p != (C *)e) abort();}
138 catch(...) { abort(); }
139 if (!caught) abort();
143 catch(C *p) { caught = 1; if (p != e) abort();}
144 catch(...) { abort(); }
145 if (!caught) abort();
149 catch(B *p) { abort(); }
150 catch(D *p) { abort(); }
151 catch(...) { caught =1; }
152 if (!caught) abort();
154 // try with AA object
156 try { fnaa((AA *)e); }
157 catch(A *p) { caught = 1; if (p != (AA *)e) abort();}
158 catch(...) { abort(); }
159 if (!caught) abort();
162 try { fnaa((AA *)e); }
163 catch(AA *p) { caught = 1; if (p != e) abort();}
164 catch(...) { abort(); }
165 if (!caught) abort();
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();
181 check (&e); // try with an object
182 check ((E *)0); // try with no object