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.
7 // -- public, << private, == virtual
13 struct A { int m; virtual ~A(){}};
14 struct B : A { int m; };
15 struct C : A { int m; };
16 struct D : virtual B, virtual 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) { abort(); } // A is ambiguous
34 catch(D *p) { caught = 1; if (p != d) abort();}
35 catch(...) { abort(); }
40 catch(A *p) { abort(); } // A is ambiguous
41 catch(B *p) { caught = 1; if (p != d) abort();}
42 catch(...) { abort(); }
47 catch(A *p) { abort(); } // A is ambiguous
48 catch(C *p) { caught = 1; if (p != d) abort();}
49 catch(...) { abort(); }
52 // try with an A object
55 catch(B *p) { abort(); } // throw type is static type
56 catch(A *p) { caught = 1; if (p != (B *)d) abort();}
57 catch(...) { abort(); }
62 catch(C *p) { abort(); } // throw type is static type
63 catch(A *p) { caught = 1; if (p != (C *)d) abort();}
64 catch(...) { abort(); }
70 catch(A *p) { caught = 1; if (p != (B *)d) abort();}
71 catch(...) { abort(); }
76 catch(B *p) { caught = 1; if (p != d) abort();}
77 catch(...) { abort(); }
82 catch(C *p) { abort(); }
83 catch(D *p) { abort(); }
84 catch(...) { caught =1; }
90 catch(A *p) { caught = 1; if (p != (C *)d) abort();}
91 catch(...) { abort(); }
96 catch(C *p) { caught = 1; if (p != d) abort();}
97 catch(...) { abort(); }
102 catch(B *p) { abort(); }
103 catch(D *p) { abort(); }
104 catch(...) { caught =1; }
105 if (!caught) abort();
113 check (&d); // try with an object
114 check ((D *)0); // try with no object