1 // { dg-do run  }
2 // Test pointer chain catching
3 // Copyright (C) 2000, 2002 Free Software Foundation, Inc.
4 // Contributed by Nathan Sidwell 9 Apr 2000 <nathan@nathan@codesourcery.com>
5 
6 #include <stdio.h>
7 
fn()8 void fn () {}
fnA9 struct A {void fn () {}};
10 static int var = 1;
11 static const int const_var = 2;
12 
13 struct B;
14 struct C;
15 
test0()16 int test0 ()
17 {
18   try
19   {
20     throw &fn;
21   }
22   catch (void *)
23   {
24     // should not decay to void *
25     fprintf(stderr, "25\n");
26     return 1;
27   }
28   catch (...)
29   {
30     return 0;
31   }
32   return -1;
33 }
34 
test1()35 int test1 ()
36 {
37   try
38   {
39     throw &A::fn;
40   }
41   catch (void *)
42   {
43     // should not decay to void *
44     fprintf(stderr, "44\n");
45     return 1;
46   }
47   catch (...)
48   {
49     return 0;
50   }
51   return -1;
52 }
53 
test2()54 int test2 ()
55 {
56   try
57   {
58     throw &var;
59   }
60   catch (void *)
61   {
62     // should decay to void *
63     return 0;
64   }
65   catch (...)
66   {
67     fprintf(stderr, "67\n");
68     return 1;
69   }
70   return -1;
71 }
72 
test3()73 int test3 ()
74 {
75   try
76   {
77     throw &var;
78   }
79   catch (void const *)
80   {
81     // should decay to const void *
82     return 0;
83   }
84   catch (...)
85   {
86     fprintf(stderr, "86\n");
87     return 1;
88   }
89   return -1;
90 }
91 
test4()92 int test4 ()
93 {
94   try
95   {
96     throw &const_var;
97   }
98   catch (void *)
99   {
100     fprintf(stderr, "100\n");
101     // should not decay to void *
102     return 1;
103   }
104   catch (void const *)
105   {
106     // should decay to const void *
107     return 0;
108   }
109   catch (...)
110   {
111     return 2;
112   }
113   return -1;
114 }
115 
test5()116 int test5 ()
117 {
118   try
119   {
120     throw (void ***)0;
121   }
122   catch (void ***)
123   {
124     return 0;
125   }
126   catch (...)
127   {
128     fprintf(stderr, "128\n");
129     return 1;
130   }
131   return -1;
132 }
133 
test6()134 int test6 ()
135 {
136   try
137   {
138     throw (void const* const* const*)0;
139   }
140   catch (void ***)
141   {
142     fprintf(stderr, "142\n");
143     return 1;
144   }
145   catch (void * const* const*)
146   {
147     return 2;
148   }
149   catch (void const* * const*)
150   {
151     return 3;
152   }
153   catch (void const* const* *)
154   {
155     return 4;
156   }
157   catch (void const* const* const *)
158   {
159     return 0;
160   }
161   catch (...)
162   {
163     return 1;
164   }
165   return -1;
166 }
167 
test7()168 int test7 ()
169 {
170   try
171   {
172     throw (void ***)0;
173   }
174   catch (void const* const**)
175   {
176     return 1;
177   }
178   catch (void const** const *)
179   {
180     return 2;
181   }
182   catch (void * const* const *)
183   {
184     return 0;
185   }
186   catch (...)
187   {
188     return 3;
189   }
190   return -1;
191 }
192 
test8()193 int test8 ()
194 {
195   try
196   {
197     throw (B **)0;
198   }
199   catch (C **)
200   {
201     return 1;
202   }
203   catch (B **)
204   {
205     return 0;
206   }
207   catch (...)
208   {
209     return 2;
210   }
211   return -1;
212 }
213 
test9()214 int test9 ()
215 {
216   try
217   {
218     throw (B **)0;
219   }
220   catch (C const *const *)
221   {
222     return 1;
223   }
224   catch (B const *const *)
225   {
226     return 0;
227   }
228   catch (...)
229   {
230     return 2;
231   }
232   return -1;
233 }
234 
235 static int (*tests[])() =
236 {
237   test0,
238   test1,
239   test2,
240   test3,
241   test4,
242 
243   test5,
244   test6,
245   test7,
246 
247   test8,
248   test9,
249 
250   NULL
251 };
252 
main()253 int main ()
254 {
255   int ix;
256   int errors = 0;
257 
258   for (ix = 0; tests[ix]; ix++)
259   {
260     int n = tests[ix] ();
261 
262     if (n)
263     {
264       printf ("test %d failed %d\n", ix, n);
265       errors++;
266     }
267   }
268   return errors;
269 }
270