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. Check with a virtual public
8 // -- public, << private, == virtual
15 struct B : virtual A { int m; };
16 struct C : virtual A { int m; };
17 struct D : B, C { int m; };
19 void fna(A *obj) { throw obj; }
20 void fnb(B *obj) { throw obj; }
21 void fnc(C *obj) { throw obj; }
22 void fnd(D *obj) { throw obj; }
24 extern "C" void abort();
30 // try with whole object
33 catch(A *p) { caught = 1; if (p != d) abort();}
34 catch(...) { abort(); }
39 catch(B *p) { caught = 1; if (p != d) abort();}
40 catch(...) { abort(); }
45 catch(C *p) { caught = 1; if (p != d) abort();}
46 catch(...) { abort(); }
49 // try with an A object
52 catch(B *p) { abort(); } // throw type is static type
53 catch(A *p) { caught = 1; if (p != d) abort();}
54 catch(...) { abort(); }
59 catch(C *p) { abort(); } // throw type is static type
60 catch(A *p) { caught = 1; if (p != d) abort();}
61 catch(...) { abort(); }
67 catch(A *p) { caught = 1; if (p != d) abort();}
68 catch(...) { abort(); }
73 catch(B *p) { caught = 1; if (p != d) abort();}
74 catch(...) { abort(); }
79 catch(C *p) { abort(); }
80 catch(D *p) { abort(); }
81 catch(...) { caught =1; }
87 catch(A *p) { caught = 1; if (p != d) abort();}
88 catch(...) { abort(); }
93 catch(C *p) { caught = 1; if (p != d) abort();}
94 catch(...) { abort(); }
99 catch(B *p) { abort(); }
100 catch(D *p) { abort(); }
101 catch(...) { caught =1; }
102 if (!caught) abort();
110 check (&d); // try with an object
111 check ((D *)0); // try with no object