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. Check with a virtual public
6 // -- public, << private, == virtual
12 struct B : virtual A { int m; };
13 struct C : virtual A { int m; };
14 struct D : B, C { int m; };
16 void fna(A *obj) { throw obj; }
17 void fnb(B *obj) { throw obj; }
18 void fnc(C *obj) { throw obj; }
19 void fnd(D *obj) { throw obj; }
21 extern "C" void abort();
27 // try with whole object
30 catch(A *p) { caught = 1; if (p != d) abort();}
31 catch(...) { abort(); }
36 catch(B *p) { caught = 1; if (p != d) abort();}
37 catch(...) { abort(); }
42 catch(C *p) { caught = 1; if (p != d) abort();}
43 catch(...) { abort(); }
46 // try with an A object
49 catch(B *p) { abort(); } // throw type is static type
50 catch(A *p) { caught = 1; if (p != d) abort();}
51 catch(...) { abort(); }
56 catch(C *p) { abort(); } // throw type is static type
57 catch(A *p) { caught = 1; if (p != d) abort();}
58 catch(...) { abort(); }
64 catch(A *p) { caught = 1; if (p != d) abort();}
65 catch(...) { abort(); }
70 catch(B *p) { caught = 1; if (p != d) abort();}
71 catch(...) { abort(); }
76 catch(C *p) { abort(); }
77 catch(D *p) { abort(); }
78 catch(...) { caught =1; }
84 catch(A *p) { caught = 1; if (p != d) abort();}
85 catch(...) { abort(); }
90 catch(C *p) { caught = 1; if (p != d) abort();}
91 catch(...) { abort(); }
96 catch(B *p) { abort(); }
97 catch(D *p) { abort(); }
98 catch(...) { caught =1; }
107 check (&d); // try with an object
108 check ((D *)0); // try with no object