1 // Copyright (C) 1999 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 struct A { int m; virtual ~A(){}};
12 struct B : virtual A { int m; };
13 struct C : virtual A { int m; };
14 struct AA : A { int m; };
15 struct D : B, C, AA { int m; };
16 struct E : virtual D { int m; };
18 void fna(A *obj) { throw obj; }
19 void fnb(B *obj) { throw obj; }
20 void fnc(C *obj) { throw obj; }
21 void fnd(D *obj) { throw obj; }
22 void fnaa(AA *obj) { throw obj; }
23 void fne(E *obj) { throw obj; }
25 extern "C" void abort();
31 // try with whole object
34 catch(A *p) { abort(); } // A is ambiguous
35 catch(D *p) { caught = 1; if (p != e) abort();}
36 catch(...) { abort(); }
41 catch(A *p) { abort(); } // A is ambiguous
42 catch(B *p) { caught = 1; if (p != e) abort();}
43 catch(...) { abort(); }
48 catch(A *p) { abort(); } // A is ambiguous
49 catch(C *p) { caught = 1; if (p != e) abort();}
50 catch(...) { abort(); }
55 catch(A *p) { abort(); } // A is ambiguous
56 catch(AA *p) { caught = 1; if (p != e) abort();}
57 catch(...) { abort(); }
63 catch(A *p) { abort(); } // A is ambiguous
64 catch(D *p) { caught = 1; if (p != e) abort();}
65 catch(...) { abort(); }
70 catch(A *p) { abort(); } // A is ambiguous
71 catch(B *p) { caught = 1; if (p != e) abort();}
72 catch(...) { abort(); }
77 catch(A *p) { abort(); } // A is ambiguous
78 catch(C *p) { caught = 1; if (p != e) abort();}
79 catch(...) { abort(); }
84 catch(A *p) { abort(); } // A is ambiguous
85 catch(AA *p) { caught = 1; if (p != e) abort();}
86 catch(...) { abort(); }
89 // try with an A object
92 catch(B *p) { abort(); } // throw type is static type
93 catch(A *p) { caught = 1; if (p != (B *)e) abort();}
94 catch(...) { abort(); }
99 catch(C *p) { abort(); } // throw type is static type
100 catch(A *p) { caught = 1; if (p != (C *)e) abort();}
101 catch(...) { abort(); }
102 if (!caught) abort();
105 try { fna((AA *)e); }
106 catch(AA *p) { abort(); } // throw type is static type
107 catch(A *p) { caught = 1; if (p != (AA *)e) abort();}
108 catch(...) { abort(); }
109 if (!caught) abort();
114 catch(A *p) { caught = 1; if (p != (B *)e) abort();}
115 catch(...) { abort(); }
116 if (!caught) abort();
120 catch(B *p) { caught = 1; if (p != e) abort();}
121 catch(...) { abort(); }
122 if (!caught) abort();
126 catch(C *p) { abort(); }
127 catch(D *p) { abort(); }
128 catch(...) { caught =1; }
129 if (!caught) abort();
134 catch(A *p) { caught = 1; if (p != (C *)e) abort();}
135 catch(...) { abort(); }
136 if (!caught) abort();
140 catch(C *p) { caught = 1; if (p != e) abort();}
141 catch(...) { abort(); }
142 if (!caught) abort();
146 catch(B *p) { abort(); }
147 catch(D *p) { abort(); }
148 catch(...) { caught =1; }
149 if (!caught) abort();
151 // try with AA object
153 try { fnaa((AA *)e); }
154 catch(A *p) { caught = 1; if (p != (AA *)e) abort();}
155 catch(...) { abort(); }
156 if (!caught) abort();
159 try { fnaa((AA *)e); }
160 catch(AA *p) { caught = 1; if (p != e) abort();}
161 catch(...) { abort(); }
162 if (!caught) abort();
165 try { fnaa((AA *)e); }
166 catch(C *p) { abort(); }
167 catch(B *p) { abort(); }
168 catch(D *p) { abort(); }
169 catch(...) { caught =1; }
170 if (!caught) abort();
178 check (&e); // try with an object
179 check ((E *)0); // try with no object