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; };
17 void fna(A *obj) { throw obj; }
18 void fnb(B *obj) { throw obj; }
19 void fnc(C *obj) { throw obj; }
20 void fnd(D *obj) { throw obj; }
21 void fnaa(AA *obj) { throw obj; }
23 extern "C" void abort();
29 // try with whole object
32 catch(A *p) { abort(); } // A is ambiguous
33 catch(D *p) { caught = 1; if (p != d) abort();}
34 catch(...) { abort(); }
39 catch(A *p) { abort(); } // A is ambiguous
40 catch(B *p) { caught = 1; if (p != d) abort();}
41 catch(...) { abort(); }
46 catch(A *p) { abort(); } // A is ambiguous
47 catch(C *p) { caught = 1; if (p != d) abort();}
48 catch(...) { abort(); }
53 catch(A *p) { abort(); } // A is ambiguous
54 catch(AA *p) { caught = 1; if (p != d) abort();}
55 catch(...) { abort(); }
58 // try with an A object
61 catch(B *p) { abort(); } // throw type is static type
62 catch(A *p) { caught = 1; if (p != (B *)d) abort();}
63 catch(...) { abort(); }
68 catch(C *p) { abort(); } // throw type is static type
69 catch(A *p) { caught = 1; if (p != (C *)d) abort();}
70 catch(...) { abort(); }
75 catch(AA *p) { abort(); } // throw type is static type
76 catch(A *p) { caught = 1; if (p != (AA *)d) abort();}
77 catch(...) { abort(); }
83 catch(A *p) { caught = 1; if (p != (B *)d) abort();}
84 catch(...) { abort(); }
89 catch(B *p) { caught = 1; if (p != d) abort();}
90 catch(...) { abort(); }
95 catch(C *p) { abort(); }
96 catch(D *p) { abort(); }
97 catch(...) { caught =1; }
103 catch(A *p) { caught = 1; if (p != (C *)d) abort();}
104 catch(...) { abort(); }
105 if (!caught) abort();
109 catch(C *p) { caught = 1; if (p != d) abort();}
110 catch(...) { abort(); }
111 if (!caught) abort();
115 catch(B *p) { abort(); }
116 catch(D *p) { abort(); }
117 catch(...) { caught =1; }
118 if (!caught) abort();
120 // try with AA object
122 try { fnaa((AA *)d); }
123 catch(A *p) { caught = 1; if (p != (AA *)d) abort();}
124 catch(...) { abort(); }
125 if (!caught) abort();
128 try { fnaa((AA *)d); }
129 catch(AA *p) { caught = 1; if (p != d) abort();}
130 catch(...) { abort(); }
131 if (!caught) abort();
134 try { fnaa((AA *)d); }
135 catch(C *p) { abort(); }
136 catch(B *p) { abort(); }
137 catch(D *p) { abort(); }
138 catch(...) { caught =1; }
139 if (!caught) abort();
147 check (&d); // try with an object
148 check ((D *)0); // try with no object