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