1 /* PR c/7652 */
2 /* { dg-do compile } */
3 /* { dg-options "-Wimplicit-fallthrough" } */
4 
5 extern void bar (int);
6 
7 /* Test nested scopes.  */
8 
9 void
f(int i)10 f (int i)
11 {
12   switch (i)
13     {
14     case 1:
15       {
16 	int j;
17       }
18     case 2:
19       bar (99);
20     }
21 
22   switch (i)
23     {
24     case 1:
25       {
26 	int j = 10; /* { dg-warning "statement may fall through" } */
27       }
28     case 2:
29       bar (99);
30     }
31 
32   switch (i)
33     {
34     case 1:
35       {
36 	int k = 9;
37 	k++;
38 	{
39 	  int j = 10;
40 	  j++; /* { dg-warning "statement may fall through" } */
41 	}
42       }
43     case 2:
44       bar (99);
45     }
46 
47   switch (i)
48     {
49     case 1:
50       {
51 	int k = 9;
52 	k++;
53 	{
54 	  int j = 10;
55 	  j++;
56 	  {
57 	    bar (1); /* { dg-warning "statement may fall through" } */
58 	  }
59 	}
60       }
61     case 2:
62       bar (99);
63     }
64 
65   switch (i)
66     {
67     case 1:
68       {
69 	int j = 0;
70 	bar (j);
71 	__attribute__((fallthrough));
72       }
73     case 2:
74       bar (99);
75     }
76 
77   switch (i)
78     {
79     case 1:
80       {
81 	int j = 0;
82 	{
83 	  int k = j + 5;
84 	  bar (k);
85 	  __attribute__((fallthrough));
86 	}
87       }
88     case 2:
89       bar (99);
90     }
91 
92   switch (i)
93     {
94     case 1:
95       {
96 	int j = 0;
97 	bar (j);
98 	return;
99       }
100     case 2:
101       bar (99);
102     }
103 
104   switch (i)
105     {
106     case 1:
107       {
108 	int j = 0;
109 	bar (j);
110 	goto L1;
111       }
112 L1:
113     case 2:
114       bar (99);
115     }
116 
117   switch (i)
118     {
119     case 1:
120       { /* { dg-warning "statement may fall through" "" { target c } } */
121 	int j = 0;
122 	bar (j);
123 	if (j == 8)
124 	  return;
125       } /* { dg-warning "statement may fall through" "" { target c++ } } */
126     case 2:
127       bar (99);
128     }
129 
130   switch (i)
131     {
132     case 1:
133       {
134 	int j = 0;
135 	bar (j);
136 	if (j == 8)
137 	  return;
138 	else
139 	  return;
140       }
141     case 2:
142       bar (99);
143     }
144 
145   switch (i)
146     {
147     case 1:
148       { /* { dg-warning "statement may fall through" "" { target c } } */
149 	int j = 0;
150 	bar (j);
151 	if (j == 8)
152 	  bar (1);
153 	else
154 	  return;
155       } /* { dg-warning "statement may fall through" "" { target c++ } } */
156     case 2:
157       bar (99);
158     }
159 
160   switch (i)
161     {
162     case 1:
163       {
164 	int j = 0;
165 	bar (j);
166 	if (j == 8)
167 	  return;
168 	else
169 	  bar (2); /* { dg-warning "statement may fall through" } */
170       }
171     case 2:
172       bar (99);
173     }
174 
175   switch (i)
176     {
177     case 1:
178       { /* { dg-warning "statement may fall through" "" { target c } } */
179 	int j = 0;
180 	bar (j);
181 	if (j == 8)
182 	  bar (1);
183 	else
184 	  bar (2);
185       } /* { dg-warning "statement may fall through" "" { target c++ } } */
186     case 2:
187       bar (99);
188     }
189 
190   switch (i)
191     {
192     case 1:
193       {
194 	int j = 0;
195 	bar (j);
196 	if (j == 8)
197 	  return;
198       }
199       break;
200     case 2:
201       bar (99);
202     }
203 
204   switch (i)
205     {
206     case 1:
207       {
208 	int j = 0;
209 	bar (j);
210 	if (j == 8)
211 	  return;
212 	else
213 	  return;
214       }
215       break;
216     case 2:
217       bar (99);
218     }
219 
220   switch (i)
221     {
222     case 1:
223       {
224 	int j = 0;
225 	bar (j);
226 	if (j == 8)
227 	  bar (1);
228 	else
229 	  return;
230       }
231       break;
232     case 2:
233       bar (99);
234     }
235 
236   switch (i)
237     {
238     case 1:
239       {
240 	int j = 0;
241 	bar (j);
242 	if (j == 8)
243 	  return;
244 	else
245 	  bar (2);
246       }
247       break;
248     case 2:
249       bar (99);
250     }
251 
252   switch (i)
253     {
254     case 1:
255       {
256 	int j = 0;
257 	bar (j);
258 	if (j == 8)
259 	  bar (1);
260 	else
261 	  bar (2);
262       }
263       break;
264     case 2:
265       bar (99);
266     }
267 
268   switch (i)
269     {
270     case 1:
271       {
272 	int j = 9;
273 	while (1);
274       }
275     case 2:
276       bar (99);
277     }
278 
279   switch (i)
280     {
281     case 1:
282       { /* { dg-warning "statement may fall through" "" { target c } } */
283 	int j = 9;
284 	switch (j);
285       } /* { dg-warning "statement may fall through" "" { target c++ } } */
286     case 2:
287       bar (99);
288     }
289 
290   switch (i)
291     {
292     case 1:
293       {
294 	int j = 0;
295 	bar (j);
296 	if (j == 8)
297 	  bar (1);
298 	else
299 	  bar (2);
300 	__attribute__((fallthrough));
301       }
302     case 2:
303       bar (99);
304     }
305 }
306