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 B : A { int m; };
12 struct C : A { int m; };
13 struct D : virtual B, virtual 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) { abort(); } // A is ambiguous
31 catch(D *p) { caught = 1; if (p != d) abort();}
32 catch(...) { abort(); }
37 catch(A *p) { abort(); } // A is ambiguous
38 catch(B *p) { caught = 1; if (p != d) abort();}
39 catch(...) { abort(); }
44 catch(A *p) { abort(); } // A is ambiguous
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 != (B *)d) abort();}
54 catch(...) { abort(); }
59 catch(C *p) { abort(); } // throw type is static type
60 catch(A *p) { caught = 1; if (p != (C *)d) abort();}
61 catch(...) { abort(); }
67 catch(A *p) { caught = 1; if (p != (B *)d) abort();}
68 catch(...) { abort(); }
73 catch(B *p) { caught = 1; if (p != (B *)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 != (C *)d) abort();}
88 catch(...) { abort(); }
93 catch(C *p) { caught = 1; if (p != (C *)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