FSF GCC merge 02/23/03
[official-gcc.git] / gcc / testsuite / g++.old-deja / g++.eh / catch7.C
blob1c24063273da93ee67d2a187de522bd29cce6735
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.
5 // -- public, << private, == virtual
7 // different levels
8 // F--D--B--A
9 //    +--C--A
10 // +--E--A
12 // Special g++ Options: -w
14 struct A { int m; };
15 struct B : A { int m; };
16 struct C : A { int m; };
17 struct D : B, C { int m; };
18 struct E : A { int m; };
19 struct F : D, E { int m; };
21 void fna(A *obj) { throw obj; }
22 void fnb(B *obj) { throw obj; }
23 void fnc(C *obj) { throw obj; }
24 void fnd(D *obj) { throw obj; }
25 void fne(E *obj) { throw obj; }
26 void fnf(F *obj) { throw obj; }
28 extern "C" void abort();
30 void check(F *f)
32   int caught;
33   
34   // try with whole object
35   caught = 0;
36   try { fnf(f); }
37   catch(A *p) { abort(); } // A is ambiguous
38   catch(F *p) { caught = 1; if (p != f) abort();}
39   catch(...) { abort(); }
40   if (!caught) abort();
42   caught = 0;
43   try { fnf(f); }
44   catch(A *p) { abort(); } // A is ambiguous
45   catch(E *p) { caught = 1; if (p != f) abort();}
46   catch(...) { abort(); }
47   if (!caught) abort();
49   caught = 0;
50   try { fnf(f); }
51   catch(A *p) { abort(); } // A is ambiguous
52   catch(D *p) { caught = 1; if (p != f) abort();}
53   catch(...) { abort(); }
54   if (!caught) abort();
56   caught = 0;
57   try { fnf(f); }
58   catch(A *p) { abort(); } // A is ambiguous
59   catch(B *p) { caught = 1; if (p != f) abort();}
60   catch(...) { abort(); }
61   if (!caught) abort();
63   caught = 0;
64   try { fnf(f); }
65   catch(A *p) { abort(); } // A is ambiguous
66   catch(C *p) { caught = 1; if (p != f) abort();}
67   catch(...) { abort(); }
68   if (!caught) abort();
70   // try with D object
71   caught = 0;
72   try { fnd(f); }
73   catch(A *p) { abort(); } // A is ambiguous
74   catch(D *p) { caught = 1; if (p != f) abort();}
75   catch(...) { abort(); }
76   if (!caught) abort();
78   caught = 0;
79   try { fnd(f); }
80   catch(A *p) { abort(); } // A is ambiguous
81   catch(B *p) { caught = 1; if (p != f) abort();}
82   catch(...) { abort(); }
83   if (!caught) abort();
85   caught = 0;
86   try { fnd(f); }
87   catch(A *p) { abort(); } // A is ambiguous
88   catch(C *p) { caught = 1; if (p != f) abort();}
89   catch(...) { abort(); }
90   if (!caught) abort();
92   // try with E object
93   caught = 0;
94   try { fne(f); }
95   catch(A *p) { caught = 1; if (p != (E *)f) abort();}
96   catch(...) { abort(); }
97   if (!caught) abort();
99   caught = 0;
100   try { fne(f); }
101   catch(E *p) { caught = 1; if (p != f) abort();}
102   catch(...) { abort(); }
103   if (!caught) abort();
105   caught = 0;
106   try { fne(f); }
107   catch(F *p) { abort(); }
108   catch(...) { caught = 1; }
109   if (!caught) abort();
111   // try with an A object
112   caught = 0;
113   try { fna((B *)f); }
114   catch(B *p) { abort(); } // throw type is static type
115   catch(A *p) { caught = 1; if (p != (B *)f) abort();}
116   catch(...) { abort(); }
117   if (!caught) abort();
118   
119   caught = 0;
120   try { fna((C *)f); }
121   catch(C *p) { abort(); } // throw type is static type
122   catch(A *p) { caught = 1; if (p != (C *)f) abort();}
123   catch(...) { abort(); }
124   if (!caught) abort();
125   
126   caught = 0;
127   try { fna((E *)f); }
128   catch(E *p) { abort(); } // throw type is static type
129   catch(A *p) { caught = 1; if (p != (E *)f) abort();}
130   catch(...) { abort(); }
131   if (!caught) abort();
132   
133   // try with B object
134   caught = 0;
135   try { fnb((B *)f); }
136   catch(A *p) { caught = 1; if (p != (B *)f) abort();}
137   catch(...) { abort(); }
138   if (!caught) abort();
139   
140   caught = 0;
141   try { fnb((B *)f); }
142   catch(B *p) { caught = 1; if (p != f) abort();}
143   catch(...) { abort(); }
144   if (!caught) abort();
145   
146   caught = 0;
147   try { fnb((B *)f); }
148   catch(C *p) { abort(); }
149   catch(D *p) { abort(); }
150   catch(...) { caught =1; }
151   if (!caught) abort();
152   
153   // try with C object
154   caught = 0;
155   try { fnc((C *)f); }
156   catch(A *p) { caught = 1; if (p != (C *)f) abort();}
157   catch(...) { abort(); }
158   if (!caught) abort();
159   
160   caught = 0;
161   try { fnc((C *)f); }
162   catch(C *p) { caught = 1; if (p != f) abort();}
163   catch(...) { abort(); }
164   if (!caught) abort();
165   
166   caught = 0;
167   try { fnc((C *)f); }
168   catch(B *p) { abort(); }
169   catch(D *p) { abort(); }
170   catch(...) { caught =1; }
171   if (!caught) abort();
172   
173   return;
176 int main ()
178   F f;
179   check (&f); // try with an object
180   check ((F *)0); // try with no object
181   
182   return 0;