OSDN Git Service

New test
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / g++.old-deja / g++.eh / catch6p.C
1 // Copyright (C) 1999 Free Software Foundation, Inc.
2 // Contributed by Nathan Sidwell 29 Aug 1999 <nathan@acm.org>
3
4 // We cannot catch an ambiguous base class.
5 // -- public, << private, == virtual
6
7 // E==D--B==A
8 //    +--C==A
9 //    +--AA-A
10
11 struct A { int m; virtual ~A(){}};
12 struct B : virtual A { int m; };
13 struct C : virtual A { int m; };
14 struct AA : A { int m; };
15 struct D : B, C, AA { int m; };
16 struct E : virtual D { int m; };
17
18 void fna(A *obj) { throw obj; }
19 void fnb(B *obj) { throw obj; }
20 void fnc(C *obj) { throw obj; }
21 void fnd(D *obj) { throw obj; }
22 void fnaa(AA *obj) { throw obj; }
23 void fne(E *obj) { throw obj; }
24
25 extern "C" void abort();
26
27 void check(E *e)
28 {
29   int caught;
30   
31   // try with whole object
32   caught = 0;
33   try { fne(e); }
34   catch(A *p) { abort(); } // A is ambiguous
35   catch(D *p) { caught = 1; if (p != e) abort();}
36   catch(...) { abort(); }
37   if (!caught) abort();
38
39   caught = 0;
40   try { fne(e); }
41   catch(A *p) { abort(); } // A is ambiguous
42   catch(B *p) { caught = 1; if (p != e) abort();}
43   catch(...) { abort(); }
44   if (!caught) abort();
45
46   caught = 0;
47   try { fne(e); }
48   catch(A *p) { abort(); } // A is ambiguous
49   catch(C *p) { caught = 1; if (p != e) abort();}
50   catch(...) { abort(); }
51   if (!caught) abort();
52
53   caught = 0;
54   try { fne(e); }
55   catch(A *p) { abort(); } // A is ambiguous
56   catch(AA *p) { caught = 1; if (p != e) abort();}
57   catch(...) { abort(); }
58   if (!caught) abort();
59
60   // try with D oject
61   caught = 0;
62   try { fnd((D *)e); }
63   catch(A *p) { abort(); } // A is ambiguous
64   catch(D *p) { caught = 1; if (p != e) abort();}
65   catch(...) { abort(); }
66   if (!caught) abort();
67
68   caught = 0;
69   try { fnd((D *)e); }
70   catch(A *p) { abort(); } // A is ambiguous
71   catch(B *p) { caught = 1; if (p != e) abort();}
72   catch(...) { abort(); }
73   if (!caught) abort();
74
75   caught = 0;
76   try { fnd((D *)e); }
77   catch(A *p) { abort(); } // A is ambiguous
78   catch(C *p) { caught = 1; if (p != e) abort();}
79   catch(...) { abort(); }
80   if (!caught) abort();
81
82   caught = 0;
83   try { fnd((D *)e); }
84   catch(A *p) { abort(); } // A is ambiguous
85   catch(AA *p) { caught = 1; if (p != e) abort();}
86   catch(...) { abort(); }
87   if (!caught) abort();
88
89   // try with an A object
90   caught = 0;
91   try { fna((B *)e); }
92   catch(B *p) { abort(); } // throw type is static type
93   catch(A *p) { caught = 1; if (p != (B *)e) abort();}
94   catch(...) { abort(); }
95   if (!caught) abort();
96   
97   caught = 0;
98   try { fna((C *)e); }
99   catch(C *p) { abort(); } // throw type is static type
100   catch(A *p) { caught = 1; if (p != (C *)e) abort();}
101   catch(...) { abort(); }
102   if (!caught) abort();
103   
104   caught = 0;
105   try { fna((AA *)e); }
106   catch(AA *p) { abort(); } // throw type is static type
107   catch(A *p) { caught = 1; if (p != (AA *)e) abort();}
108   catch(...) { abort(); }
109   if (!caught) abort();
110   
111   // try with B object
112   caught = 0;
113   try { fnb((B *)e); }
114   catch(A *p) { caught = 1; if (p != (B *)e) abort();}
115   catch(...) { abort(); }
116   if (!caught) abort();
117   
118   caught = 0;
119   try { fnb((B *)e); }
120   catch(B *p) { caught = 1; if (p != e) abort();}
121   catch(...) { abort(); }
122   if (!caught) abort();
123   
124   caught = 0;
125   try { fnb((B *)e); }
126   catch(C *p) { abort(); }
127   catch(D *p) { abort(); }
128   catch(...) { caught =1; }
129   if (!caught) abort();
130   
131   // try with C object
132   caught = 0;
133   try { fnc((C *)e); }
134   catch(A *p) { caught = 1; if (p != (C *)e) abort();}
135   catch(...) { abort(); }
136   if (!caught) abort();
137   
138   caught = 0;
139   try { fnc((C *)e); }
140   catch(C *p) { caught = 1; if (p != e) abort();}
141   catch(...) { abort(); }
142   if (!caught) abort();
143   
144   caught = 0;
145   try { fnc((C *)e); }
146   catch(B *p) { abort(); }
147   catch(D *p) { abort(); }
148   catch(...) { caught =1; }
149   if (!caught) abort();
150   
151   // try with AA object
152   caught = 0;
153   try { fnaa((AA *)e); }
154   catch(A *p) { caught = 1; if (p != (AA *)e) abort();}
155   catch(...) { abort(); }
156   if (!caught) abort();
157   
158   caught = 0;
159   try { fnaa((AA *)e); }
160   catch(AA *p) { caught = 1; if (p != e) abort();}
161   catch(...) { abort(); }
162   if (!caught) abort();
163   
164   caught = 0;
165   try { fnaa((AA *)e); }
166   catch(C *p) { abort(); }
167   catch(B *p) { abort(); }
168   catch(D *p) { abort(); }
169   catch(...) { caught =1; }
170   if (!caught) abort();
171   
172   return;
173 }
174
175 int main ()
176 {
177   E e;
178   check (&e); // try with an object
179   check ((E *)0); // try with no object
180   
181   return 0;
182 }