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
16 struct B : A { int m; };
17 struct C : A { int m; };
18 struct D : B, C { int m; };
19 struct E : A { int m; };
20 struct F : D, E { int m; };
22 void fna(A *obj) { throw obj; }
23 void fnb(B *obj) { throw obj; }
24 void fnc(C *obj) { throw obj; }
25 void fnd(D *obj) { throw obj; }
26 void fne(E *obj) { throw obj; }
27 void fnf(F *obj) { throw obj; }
29 extern "C" void abort();
35 // try with whole object
38 catch(A *p) { abort(); } // A is ambiguous
39 catch(F *p) { caught = 1; if (p != f) abort();}
40 catch(...) { abort(); }
45 catch(A *p) { abort(); } // A is ambiguous
46 catch(E *p) { caught = 1; if (p != f) abort();}
47 catch(...) { abort(); }
52 catch(A *p) { abort(); } // A is ambiguous
53 catch(D *p) { caught = 1; if (p != f) abort();}
54 catch(...) { abort(); }
59 catch(A *p) { abort(); } // A is ambiguous
60 catch(B *p) { caught = 1; if (p != f) abort();}
61 catch(...) { abort(); }
66 catch(A *p) { abort(); } // A is ambiguous
67 catch(C *p) { caught = 1; if (p != f) abort();}
68 catch(...) { abort(); }
74 catch(A *p) { abort(); } // A is ambiguous
75 catch(D *p) { caught = 1; if (p != f) abort();}
76 catch(...) { abort(); }
81 catch(A *p) { abort(); } // A is ambiguous
82 catch(B *p) { caught = 1; if (p != f) abort();}
83 catch(...) { abort(); }
88 catch(A *p) { abort(); } // A is ambiguous
89 catch(C *p) { caught = 1; if (p != f) abort();}
90 catch(...) { abort(); }
96 catch(A *p) { caught = 1; if (p != (E *)f) abort();}
97 catch(...) { abort(); }
102 catch(E *p) { caught = 1; if (p != f) abort();}
103 catch(...) { abort(); }
104 if (!caught) abort();
108 catch(F *p) { abort(); }
109 catch(...) { caught = 1; }
110 if (!caught) abort();
112 // try with an A object
115 catch(B *p) { abort(); } // throw type is static type
116 catch(A *p) { caught = 1; if (p != (B *)f) abort();}
117 catch(...) { abort(); }
118 if (!caught) abort();
122 catch(C *p) { abort(); } // throw type is static type
123 catch(A *p) { caught = 1; if (p != (C *)f) abort();}
124 catch(...) { abort(); }
125 if (!caught) abort();
129 catch(E *p) { abort(); } // throw type is static type
130 catch(A *p) { caught = 1; if (p != (E *)f) abort();}
131 catch(...) { abort(); }
132 if (!caught) abort();
137 catch(A *p) { caught = 1; if (p != (B *)f) abort();}
138 catch(...) { abort(); }
139 if (!caught) abort();
143 catch(B *p) { caught = 1; if (p != f) abort();}
144 catch(...) { abort(); }
145 if (!caught) abort();
149 catch(C *p) { abort(); }
150 catch(D *p) { abort(); }
151 catch(...) { caught =1; }
152 if (!caught) abort();
157 catch(A *p) { caught = 1; if (p != (C *)f) abort();}
158 catch(...) { abort(); }
159 if (!caught) abort();
163 catch(C *p) { caught = 1; if (p != f) abort();}
164 catch(...) { abort(); }
165 if (!caught) abort();
169 catch(B *p) { abort(); }
170 catch(D *p) { abort(); }
171 catch(...) { caught =1; }
172 if (!caught) abort();
180 check (&f); // try with an object
181 check ((F *)0); // try with no object