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. Check with a virtual public
6 // -- public, << private, == virtual
11 // Special g++ Options: -w
14 struct B : virtual A { int m; };
15 struct C : virtual A { int m; };
16 struct D : B, C { 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; }
23 extern "C" void abort();
29 // try with whole object
32 catch(A *p) { caught = 1; if (p != d) abort();}
33 catch(...) { abort(); }
38 catch(B *p) { caught = 1; if (p != d) abort();}
39 catch(...) { abort(); }
44 catch(C *p) { caught = 1; if (p != d) abort();}
45 catch(...) { abort(); }
48 // try with an A object
51 catch(B *p) { abort(); } // throw type is static type
52 catch(A *p) { caught = 1; if (p != d) abort();}
53 catch(...) { abort(); }
58 catch(C *p) { abort(); } // throw type is static type
59 catch(A *p) { caught = 1; if (p != d) abort();}
60 catch(...) { abort(); }
66 catch(A *p) { caught = 1; if (p != d) abort();}
67 catch(...) { abort(); }
72 catch(B *p) { caught = 1; if (p != d) abort();}
73 catch(...) { abort(); }
78 catch(C *p) { abort(); }
79 catch(D *p) { abort(); }
80 catch(...) { caught =1; }
86 catch(A *p) { caught = 1; if (p != d) abort();}
87 catch(...) { abort(); }
92 catch(C *p) { caught = 1; if (p != d) abort();}
93 catch(...) { abort(); }
98 catch(B *p) { abort(); }
99 catch(D *p) { abort(); }
100 catch(...) { caught =1; }
101 if (!caught) abort();
109 check (&d); // try with an object
110 check ((D *)0); // try with no object