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