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
12 // Special g++ Options: -w
15 struct B : A { int m; };
16 struct C : A { int m; };
17 struct D : B, C { int m; };
18 struct E : A { int m; };
19 struct F : D, E { 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 fne(E *obj) { throw obj; }
26 void fnf(F *obj) { throw obj; }
28 extern "C" void abort();
34 // try with whole object
37 catch(A *p) { abort(); } // A is ambiguous
38 catch(F *p) { caught = 1; if (p != f) abort();}
39 catch(...) { abort(); }
44 catch(A *p) { abort(); } // A is ambiguous
45 catch(E *p) { caught = 1; if (p != f) abort();}
46 catch(...) { abort(); }
51 catch(A *p) { abort(); } // A is ambiguous
52 catch(D *p) { caught = 1; if (p != f) abort();}
53 catch(...) { abort(); }
58 catch(A *p) { abort(); } // A is ambiguous
59 catch(B *p) { caught = 1; if (p != f) abort();}
60 catch(...) { abort(); }
65 catch(A *p) { abort(); } // A is ambiguous
66 catch(C *p) { caught = 1; if (p != f) abort();}
67 catch(...) { abort(); }
73 catch(A *p) { abort(); } // A is ambiguous
74 catch(D *p) { caught = 1; if (p != f) abort();}
75 catch(...) { abort(); }
80 catch(A *p) { abort(); } // A is ambiguous
81 catch(B *p) { caught = 1; if (p != f) abort();}
82 catch(...) { abort(); }
87 catch(A *p) { abort(); } // A is ambiguous
88 catch(C *p) { caught = 1; if (p != f) abort();}
89 catch(...) { abort(); }
95 catch(A *p) { caught = 1; if (p != (E *)f) abort();}
96 catch(...) { abort(); }
101 catch(E *p) { caught = 1; if (p != f) abort();}
102 catch(...) { abort(); }
103 if (!caught) abort();
107 catch(F *p) { abort(); }
108 catch(...) { caught = 1; }
109 if (!caught) abort();
111 // try with an A object
114 catch(B *p) { abort(); } // throw type is static type
115 catch(A *p) { caught = 1; if (p != (B *)f) abort();}
116 catch(...) { abort(); }
117 if (!caught) abort();
121 catch(C *p) { abort(); } // throw type is static type
122 catch(A *p) { caught = 1; if (p != (C *)f) abort();}
123 catch(...) { abort(); }
124 if (!caught) abort();
128 catch(E *p) { abort(); } // throw type is static type
129 catch(A *p) { caught = 1; if (p != (E *)f) abort();}
130 catch(...) { abort(); }
131 if (!caught) abort();
136 catch(A *p) { caught = 1; if (p != (B *)f) abort();}
137 catch(...) { abort(); }
138 if (!caught) abort();
142 catch(B *p) { caught = 1; if (p != f) abort();}
143 catch(...) { abort(); }
144 if (!caught) abort();
148 catch(C *p) { abort(); }
149 catch(D *p) { abort(); }
150 catch(...) { caught =1; }
151 if (!caught) abort();
156 catch(A *p) { caught = 1; if (p != (C *)f) abort();}
157 catch(...) { abort(); }
158 if (!caught) abort();
162 catch(C *p) { caught = 1; if (p != f) abort();}
163 catch(...) { abort(); }
164 if (!caught) abort();
168 catch(B *p) { abort(); }
169 catch(D *p) { abort(); }
170 catch(...) { caught =1; }
171 if (!caught) abort();
179 check (&f); // try with an object
180 check ((F *)0); // try with no object