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
15 struct B
: virtual A
{ int m
; };
16 struct C
: virtual A
{ int m
; };
17 struct AA
: A
{ int m
; };
18 struct D
: B
, C
, AA
{ int m
; };
20 void fna(A
*obj
) { throw obj
; }
21 void fnb(B
*obj
) { throw obj
; }
22 void fnc(C
*obj
) { throw obj
; }
23 void fnd(D
*obj
) { throw obj
; }
24 void fnaa(AA
*obj
) { throw obj
; }
26 extern "C" void abort();
32 // try with whole object
35 catch(A
*p
) { abort(); } // A is ambiguous
36 catch(D
*p
) { caught
= 1; if (p
!= d
) abort();}
37 catch(...) { abort(); }
42 catch(A
*p
) { abort(); } // A is ambiguous
43 catch(B
*p
) { caught
= 1; if (p
!= d
) abort();}
44 catch(...) { abort(); }
49 catch(A
*p
) { abort(); } // A is ambiguous
50 catch(C
*p
) { caught
= 1; if (p
!= d
) abort();}
51 catch(...) { abort(); }
56 catch(A
*p
) { abort(); } // A is ambiguous
57 catch(AA
*p
) { caught
= 1; if (p
!= d
) abort();}
58 catch(...) { abort(); }
61 // try with an A object
64 catch(B
*p
) { abort(); } // throw type is static type
65 catch(A
*p
) { caught
= 1; if (p
!= (B
*)d
) abort();}
66 catch(...) { abort(); }
71 catch(C
*p
) { abort(); } // throw type is static type
72 catch(A
*p
) { caught
= 1; if (p
!= (C
*)d
) abort();}
73 catch(...) { abort(); }
78 catch(AA
*p
) { abort(); } // throw type is static type
79 catch(A
*p
) { caught
= 1; if (p
!= (AA
*)d
) abort();}
80 catch(...) { abort(); }
86 catch(A
*p
) { caught
= 1; if (p
!= (B
*)d
) abort();}
87 catch(...) { abort(); }
92 catch(B
*p
) { caught
= 1; if (p
!= d
) abort();}
93 catch(...) { abort(); }
98 catch(C
*p
) { abort(); }
99 catch(D
*p
) { abort(); }
100 catch(...) { caught
=1; }
101 if (!caught
) abort();
106 catch(A
*p
) { caught
= 1; if (p
!= (C
*)d
) abort();}
107 catch(...) { abort(); }
108 if (!caught
) abort();
112 catch(C
*p
) { caught
= 1; if (p
!= d
) abort();}
113 catch(...) { abort(); }
114 if (!caught
) abort();
118 catch(B
*p
) { abort(); }
119 catch(D
*p
) { abort(); }
120 catch(...) { caught
=1; }
121 if (!caught
) abort();
123 // try with AA object
125 try { fnaa((AA
*)d
); }
126 catch(A
*p
) { caught
= 1; if (p
!= (AA
*)d
) abort();}
127 catch(...) { abort(); }
128 if (!caught
) abort();
131 try { fnaa((AA
*)d
); }
132 catch(AA
*p
) { caught
= 1; if (p
!= d
) abort();}
133 catch(...) { abort(); }
134 if (!caught
) abort();
137 try { fnaa((AA
*)d
); }
138 catch(C
*p
) { abort(); }
139 catch(B
*p
) { abort(); }
140 catch(D
*p
) { abort(); }
141 catch(...) { caught
=1; }
142 if (!caught
) abort();
150 check (&d
); // try with an object
151 check ((D
*)0); // try with no object