xref: /netbsd-src/tests/usr.bin/xlint/lint1/msg_193.c (revision 6937eff333b197fb14840f0e58df0f7a0edfd51a)
1*6937eff3Srillig /*	$NetBSD: msg_193.c,v 1.22 2024/11/13 04:32:49 rillig Exp $	*/
2a0a15c14Srillig # 3 "msg_193.c"
3a0a15c14Srillig 
4*6937eff3Srillig // Test for message: '%s' statement not reached [193]
5a0a15c14Srillig 
6b2baa501Srillig /* lint1-extra-flags: -X 351 */
7b2baa501Srillig 
8b37b780bSrillig /*
9b37b780bSrillig  * Test the reachability of statements in a function.
10b37b780bSrillig  *
11b37b780bSrillig  *	if
12b37b780bSrillig  *	if-else
13b37b780bSrillig  *	if-else-if-else
14b37b780bSrillig  *	for
15b37b780bSrillig  *	while
16b37b780bSrillig  *	do-while
17b37b780bSrillig  *	switch
18b37b780bSrillig  *	break
19b37b780bSrillig  *	continue
20b37b780bSrillig  *	goto
21b37b780bSrillig  *	return
22b37b780bSrillig  *
23b37b780bSrillig  *	constant expression
24b37b780bSrillig  *	system-dependent constant expression
25b37b780bSrillig  */
26b37b780bSrillig 
270676c13cSrillig extern void reachable(void);
280676c13cSrillig extern void unreachable(void);
290676c13cSrillig extern _Bool maybe(void);
300676c13cSrillig 
31b37b780bSrillig 
32b37b780bSrillig void
33b37b780bSrillig test_statement(void)
344916b997Srillig {
35b37b780bSrillig 	reachable();
36b37b780bSrillig 	reachable();
374916b997Srillig }
38b37b780bSrillig 
39b37b780bSrillig void
40b37b780bSrillig test_compound_statement(void)
41b37b780bSrillig {
42b37b780bSrillig 	reachable();
43b37b780bSrillig 	{
44b37b780bSrillig 		reachable();
45b37b780bSrillig 		reachable();
46b37b780bSrillig 	}
47b37b780bSrillig 	reachable();
48b37b780bSrillig }
49b37b780bSrillig 
50b37b780bSrillig void
51b37b780bSrillig test_if_statement(void)
52b37b780bSrillig {
53b37b780bSrillig 	if (1)
54b37b780bSrillig 		reachable();
55b37b780bSrillig 	reachable();
56b37b780bSrillig 	if (0)
57c83f7defSrillig 		unreachable();		/* expect+0: ... [193] */
58b37b780bSrillig 	reachable();
59b37b780bSrillig }
60b37b780bSrillig 
61b37b780bSrillig void
62b37b780bSrillig test_if_compound_statement(void)
63b37b780bSrillig {
64b37b780bSrillig 	if (1) {
65b37b780bSrillig 		reachable();
66b37b780bSrillig 	}
67b37b780bSrillig 	if (1) {
68b37b780bSrillig 		{
69b37b780bSrillig 			{
70b37b780bSrillig 				reachable();
71b37b780bSrillig 			}
72b37b780bSrillig 		}
73b37b780bSrillig 	}
74b37b780bSrillig 
75b37b780bSrillig 	if (0) {
76c83f7defSrillig 		unreachable();		/* expect+0: ... [193] */
77b37b780bSrillig 	}
78b37b780bSrillig 	if (0) {
79b37b780bSrillig 		{
80b37b780bSrillig 			{
81c83f7defSrillig 				unreachable();	/* expect+0: ... [193] */
82b37b780bSrillig 			}
83b37b780bSrillig 		}
84b37b780bSrillig 	}
85b37b780bSrillig }
86b37b780bSrillig 
87b37b780bSrillig void
88b37b780bSrillig test_if_without_else(void)
89b37b780bSrillig {
90b37b780bSrillig 	if (1)
91b37b780bSrillig 		reachable();
92b37b780bSrillig 	reachable();
93b37b780bSrillig 
94b37b780bSrillig 	if (0)
95c83f7defSrillig 		unreachable();		/* expect+0: ... [193] */
96b37b780bSrillig 	reachable();
97b37b780bSrillig }
98b37b780bSrillig 
99b37b780bSrillig void
100b37b780bSrillig test_if_with_else(void)
101b37b780bSrillig {
102b37b780bSrillig 	if (1)
103b37b780bSrillig 		reachable();
104b37b780bSrillig 	else
105c83f7defSrillig 		unreachable();		/* expect+0: ... [193] */
106b37b780bSrillig 	reachable();
107b37b780bSrillig 
108b37b780bSrillig 	if (0)
109c83f7defSrillig 		unreachable();		/* expect+0: ... [193] */
110b37b780bSrillig 	else
111b37b780bSrillig 		reachable();
112b37b780bSrillig 	reachable();
113b37b780bSrillig }
114b37b780bSrillig 
115b37b780bSrillig void
116b37b780bSrillig test_if_else_if_else(void)
117b37b780bSrillig {
118b37b780bSrillig 	if (1)
119b37b780bSrillig 		reachable();
120c83f7defSrillig 	else if (1)			/* expect+0: ... [193] */
12197e5c72aSrillig 		unreachable();
122b37b780bSrillig 	else
123c83f7defSrillig 		unreachable();		/* expect+0: ... [193] */
124b37b780bSrillig 
125b37b780bSrillig 	if (0)
126c83f7defSrillig 		unreachable();		/* expect+0: ... [193] */
127b37b780bSrillig 	else if (1)
128b37b780bSrillig 		reachable();
129b37b780bSrillig 	else
130c83f7defSrillig 		unreachable();		/* expect+0: ... [193] */
131b37b780bSrillig 
132b37b780bSrillig 	if (0)
133c83f7defSrillig 		unreachable();		/* expect+0: ... [193] */
134b37b780bSrillig 	else if (0)
135c83f7defSrillig 		unreachable();		/* expect+0: ... [193] */
136b37b780bSrillig 	else
137b37b780bSrillig 		reachable();
138b37b780bSrillig }
139b37b780bSrillig 
140b37b780bSrillig void
141b37b780bSrillig test_if_return(void)
142b37b780bSrillig {
143b37b780bSrillig 	if (1)
144b37b780bSrillig 		return;
145c83f7defSrillig 	unreachable();			/* expect+0: ... [193] */
146b37b780bSrillig }
147b37b780bSrillig 
148b37b780bSrillig void
149b37b780bSrillig test_if_else_return(void)
150b37b780bSrillig {
151b37b780bSrillig 	if (1)
152b37b780bSrillig 		reachable();
153b37b780bSrillig 	else
154c83f7defSrillig 		return;			/* expect+0: ... [193] */
155b37b780bSrillig 	reachable();
156b37b780bSrillig }
157b37b780bSrillig 
158b37b780bSrillig void
159b37b780bSrillig test_for_forever(void)
160b37b780bSrillig {
161b37b780bSrillig 	for (;;)
162b37b780bSrillig 		reachable();
163c83f7defSrillig 	unreachable();			/* expect+0: ... [193] */
164b37b780bSrillig }
165b37b780bSrillig 
166b37b780bSrillig void
167b37b780bSrillig test_for_true(void)
168b37b780bSrillig {
169b37b780bSrillig 	for (; 1;)
170b37b780bSrillig 		reachable();
171c83f7defSrillig 	unreachable();			/* expect+0: ... [193] */
172b37b780bSrillig }
173b37b780bSrillig 
174b37b780bSrillig void
175b37b780bSrillig test_for_false(void)
176b37b780bSrillig {
177b37b780bSrillig 	for (; 0;)
178c83f7defSrillig 		unreachable();		/* expect+0: ... [193] */
179b37b780bSrillig 	reachable();
180b37b780bSrillig }
181b37b780bSrillig 
182b37b780bSrillig void
183b37b780bSrillig test_for_break(void)
184b37b780bSrillig {
185b37b780bSrillig 	for (;;) {
186b37b780bSrillig 		reachable();
187b37b780bSrillig 		break;
188c83f7defSrillig 		unreachable();		/* expect+0: ... [193] */
189b37b780bSrillig 	}
190b37b780bSrillig 	reachable();
191b37b780bSrillig }
192b37b780bSrillig 
193b37b780bSrillig void
194b37b780bSrillig test_for_if_break(void)
195b37b780bSrillig {
196b37b780bSrillig 	for (;;) {
197b37b780bSrillig 		reachable();
198b37b780bSrillig 		if (0) {
199c83f7defSrillig 			unreachable();	/* expect+0: ... [193] */
200b37b780bSrillig 			break;
201c83f7defSrillig 			unreachable();	/* expect+0: ... [193] */
202b37b780bSrillig 		}
203b37b780bSrillig 		if (1) {
204b37b780bSrillig 			reachable();
205b37b780bSrillig 			break;
206c83f7defSrillig 			unreachable();	/* expect+0: ... [193] */
207b37b780bSrillig 		}
208c83f7defSrillig 		unreachable();		/* expect+0: ... [193] */
209b37b780bSrillig 	}
210b37b780bSrillig 	reachable();
211b37b780bSrillig }
212b37b780bSrillig 
213b37b780bSrillig void
214b37b780bSrillig test_for_continue(void)
215b37b780bSrillig {
216b37b780bSrillig 	for (;;) {
217b37b780bSrillig 		reachable();
218b37b780bSrillig 		continue;
219c83f7defSrillig 		unreachable();		/* expect+0: ... [193] */
220b37b780bSrillig 	}
221c83f7defSrillig 	unreachable();			/* expect+0: ... [193] */
222b37b780bSrillig }
223b37b780bSrillig 
224b37b780bSrillig void
225b37b780bSrillig test_for_if_continue(void)
226b37b780bSrillig {
227b37b780bSrillig 	for (;;) {
228b37b780bSrillig 		reachable();
229b37b780bSrillig 		if (0) {
230c83f7defSrillig 			unreachable();	/* expect+0: ... [193] */
231b37b780bSrillig 			continue;
232c83f7defSrillig 			unreachable();	/* expect+0: ... [193] */
233b37b780bSrillig 		}
234b37b780bSrillig 		if (1) {
235b37b780bSrillig 			reachable();
236b37b780bSrillig 			continue;
237c83f7defSrillig 			unreachable();	/* expect+0: ... [193] */
238b37b780bSrillig 		}
239c83f7defSrillig 		unreachable();		/* expect+0: ... [193] */
240b37b780bSrillig 	}
241c83f7defSrillig 	unreachable();			/* expect+0: ... [193] */
242b37b780bSrillig }
243b37b780bSrillig 
244b37b780bSrillig void
245b37b780bSrillig test_for_return(void)
246b37b780bSrillig {
247b37b780bSrillig 	for (;;) {
248b37b780bSrillig 		reachable();
249b37b780bSrillig 		return;
250c83f7defSrillig 		unreachable();		/* expect+0: ... [193] */
251b37b780bSrillig 	}
252c83f7defSrillig 	unreachable();			/* expect+0: ... [193] */
253b37b780bSrillig }
254b37b780bSrillig 
255b37b780bSrillig void
256b37b780bSrillig test_for_if_return(void)
257b37b780bSrillig {
258b37b780bSrillig 	for (;;) {
259b37b780bSrillig 		reachable();
260b37b780bSrillig 		if (0) {
261c83f7defSrillig 			unreachable();	/* expect+0: ... [193] */
262b37b780bSrillig 			return;
263c83f7defSrillig 			unreachable();	/* expect+0: ... [193] */
264b37b780bSrillig 		}
265b37b780bSrillig 		if (1) {
266b37b780bSrillig 			reachable();
267b37b780bSrillig 			return;
268c83f7defSrillig 			unreachable();	/* expect+0: ... [193] */
269b37b780bSrillig 		}
270c83f7defSrillig 		unreachable();		/* expect+0: ... [193] */
271b37b780bSrillig 	}
272c83f7defSrillig 	unreachable();			/* expect+0: ... [193] */
273b37b780bSrillig }
274b37b780bSrillig 
275b37b780bSrillig void
276b37b780bSrillig test_while_true(void)
277b37b780bSrillig {
278b37b780bSrillig 	while (1)
279b37b780bSrillig 		reachable();
280c83f7defSrillig 	unreachable();			/* expect+0: ... [193] */
281b37b780bSrillig }
282b37b780bSrillig 
283b37b780bSrillig void
284b37b780bSrillig test_while_false(void)
285b37b780bSrillig {
286b37b780bSrillig 	while (0)
287c83f7defSrillig 		unreachable();		/* expect+0: ... [193] */
288b37b780bSrillig 	reachable();
289b37b780bSrillig }
290b37b780bSrillig 
291b37b780bSrillig void
292b37b780bSrillig test_while_break(void)
293b37b780bSrillig {
294b37b780bSrillig 	while (1) {
295b37b780bSrillig 		reachable();
296b37b780bSrillig 		break;
297c83f7defSrillig 		unreachable();		/* expect+0: ... [193] */
298b37b780bSrillig 	}
299b37b780bSrillig 	reachable();
300b37b780bSrillig }
301b37b780bSrillig 
302b37b780bSrillig void
303b37b780bSrillig test_while_if_break(void)
304b37b780bSrillig {
305b37b780bSrillig 	while (1) {
306b37b780bSrillig 		reachable();
307b37b780bSrillig 		if (0) {
308c83f7defSrillig 			unreachable();	/* expect+0: ... [193] */
309b37b780bSrillig 			break;
310c83f7defSrillig 			unreachable();	/* expect+0: ... [193] */
311b37b780bSrillig 		}
312b37b780bSrillig 		if (1) {
313b37b780bSrillig 			reachable();
314b37b780bSrillig 			break;
315c83f7defSrillig 			unreachable();	/* expect+0: ... [193] */
316b37b780bSrillig 		}
317c83f7defSrillig 		unreachable();		/* expect+0: ... [193] */
318b37b780bSrillig 	}
319b37b780bSrillig 	reachable();
320b37b780bSrillig }
321b37b780bSrillig 
322b37b780bSrillig void
323b37b780bSrillig test_while_continue(void)
324b37b780bSrillig {
325b37b780bSrillig 	while (1) {
326b37b780bSrillig 		reachable();
327b37b780bSrillig 		continue;
328c83f7defSrillig 		unreachable();		/* expect+0: ... [193] */
329b37b780bSrillig 	}
330c83f7defSrillig 	unreachable();			/* expect+0: ... [193] */
331b37b780bSrillig }
332b37b780bSrillig 
333b37b780bSrillig void
334b37b780bSrillig test_while_if_continue(void)
335b37b780bSrillig {
336b37b780bSrillig 	while (1) {
337b37b780bSrillig 		reachable();
338b37b780bSrillig 		if (0) {
339c83f7defSrillig 			unreachable();	/* expect+0: ... [193] */
340b37b780bSrillig 			continue;
341c83f7defSrillig 			unreachable();	/* expect+0: ... [193] */
342b37b780bSrillig 		}
343b37b780bSrillig 		if (1) {
344b37b780bSrillig 			reachable();
345b37b780bSrillig 			continue;
346c83f7defSrillig 			unreachable();	/* expect+0: ... [193] */
347b37b780bSrillig 		}
348c83f7defSrillig 		unreachable();		/* expect+0: ... [193] */
349b37b780bSrillig 	}
350c83f7defSrillig 	unreachable();			/* expect+0: ... [193] */
351b37b780bSrillig }
352b37b780bSrillig 
353b37b780bSrillig void
354b37b780bSrillig test_while_return(void)
355b37b780bSrillig {
356b37b780bSrillig 	while (1) {
357b37b780bSrillig 		reachable();
358b37b780bSrillig 		return;
359c83f7defSrillig 		unreachable();		/* expect+0: ... [193] */
360b37b780bSrillig 	}
361c83f7defSrillig 	unreachable();			/* expect+0: ... [193] */
362b37b780bSrillig }
363b37b780bSrillig 
364b37b780bSrillig void
365b37b780bSrillig test_while_if_return(void)
366b37b780bSrillig {
367b37b780bSrillig 	while (1) {
368b37b780bSrillig 		reachable();
369b37b780bSrillig 		if (0) {
370c83f7defSrillig 			unreachable();	/* expect+0: ... [193] */
371b37b780bSrillig 			return;
372c83f7defSrillig 			unreachable();	/* expect+0: ... [193] */
373b37b780bSrillig 		}
374b37b780bSrillig 		if (1) {
375b37b780bSrillig 			reachable();
376b37b780bSrillig 			return;
377c83f7defSrillig 			unreachable();	/* expect+0: ... [193] */
378b37b780bSrillig 		}
379c83f7defSrillig 		unreachable();		/* expect+0: ... [193] */
380b37b780bSrillig 	}
381c83f7defSrillig 	unreachable();			/* expect+0: ... [193] */
382b37b780bSrillig }
383b37b780bSrillig 
384b37b780bSrillig void
385b37b780bSrillig test_do_while_true(void)
386b37b780bSrillig {
387b37b780bSrillig 	do {
388b37b780bSrillig 		reachable();
389b37b780bSrillig 	} while (1);
390c83f7defSrillig 	unreachable();			/* expect+0: ... [193] */
391b37b780bSrillig }
392b37b780bSrillig 
393b37b780bSrillig void
394b37b780bSrillig test_do_while_false(void)
395b37b780bSrillig {
396b37b780bSrillig 	do {
397b37b780bSrillig 		reachable();
398b37b780bSrillig 	} while (0);
399b37b780bSrillig 	reachable();
400b37b780bSrillig }
401b37b780bSrillig 
402b37b780bSrillig void
403b37b780bSrillig test_do_while_break(void)
404b37b780bSrillig {
405b37b780bSrillig 	do {
406b37b780bSrillig 		reachable();
407b37b780bSrillig 		break;
408c83f7defSrillig 		unreachable();		/* expect+0: ... [193] */
409b37b780bSrillig 	} while (1);
410b37b780bSrillig 	reachable();
411b37b780bSrillig }
412b37b780bSrillig 
413b37b780bSrillig void
414b37b780bSrillig test_do_while_if_break(void)
415b37b780bSrillig {
416b37b780bSrillig 	do {
417b37b780bSrillig 		reachable();
418b37b780bSrillig 		if (0) {
419c83f7defSrillig 			unreachable();	/* expect+0: ... [193] */
420b37b780bSrillig 			break;
421c83f7defSrillig 			unreachable();	/* expect+0: ... [193] */
422b37b780bSrillig 		}
423b37b780bSrillig 		if (1) {
424b37b780bSrillig 			reachable();
425b37b780bSrillig 			break;
426c83f7defSrillig 			unreachable();	/* expect+0: ... [193] */
427b37b780bSrillig 		}
428c83f7defSrillig 		unreachable();		/* expect+0: ... [193] */
429b37b780bSrillig 	} while (1);
430b37b780bSrillig 	reachable();
431b37b780bSrillig }
432b37b780bSrillig 
433b37b780bSrillig void
434b37b780bSrillig test_do_while_continue(void)
435b37b780bSrillig {
436b37b780bSrillig 	do {
437b37b780bSrillig 		reachable();
438b37b780bSrillig 		continue;
439c83f7defSrillig 		unreachable();		/* expect+0: ... [193] */
440b37b780bSrillig 	} while (1);
441c83f7defSrillig 	unreachable();			/* expect+0: ... [193] */
442b37b780bSrillig }
443b37b780bSrillig 
444b37b780bSrillig void
445b37b780bSrillig test_do_while_if_continue(void)
446b37b780bSrillig {
447b37b780bSrillig 	do {
448b37b780bSrillig 		reachable();
449b37b780bSrillig 		if (0) {
450c83f7defSrillig 			unreachable();	/* expect+0: ... [193] */
451b37b780bSrillig 			continue;
452c83f7defSrillig 			unreachable();	/* expect+0: ... [193] */
453b37b780bSrillig 		}
454b37b780bSrillig 		if (1) {
455b37b780bSrillig 			reachable();
456b37b780bSrillig 			continue;
457c83f7defSrillig 			unreachable();	/* expect+0: ... [193] */
458b37b780bSrillig 		}
459c83f7defSrillig 		unreachable();		/* expect+0: ... [193] */
460b37b780bSrillig 	} while (1);
461c83f7defSrillig 	unreachable();			/* expect+0: ... [193] */
462b37b780bSrillig }
463b37b780bSrillig 
464b37b780bSrillig void
465b37b780bSrillig test_do_while_return(void)
466b37b780bSrillig {
467b37b780bSrillig 	do {
468b37b780bSrillig 		reachable();
469b37b780bSrillig 		return;
470c83f7defSrillig 		unreachable();		/* expect+0: ... [193] */
471b37b780bSrillig 	} while (1);
472c83f7defSrillig 	unreachable();			/* expect+0: ... [193] */
473b37b780bSrillig }
474b37b780bSrillig 
475b37b780bSrillig void
476b37b780bSrillig test_do_while_if_return(void)
477b37b780bSrillig {
478b37b780bSrillig 	do {
479b37b780bSrillig 		reachable();
480b37b780bSrillig 		if (0) {
481c83f7defSrillig 			unreachable();	/* expect+0: ... [193] */
482b37b780bSrillig 			return;
483c83f7defSrillig 			unreachable();	/* expect+0: ... [193] */
484b37b780bSrillig 		}
485b37b780bSrillig 		if (1) {
486b37b780bSrillig 			reachable();
487b37b780bSrillig 			return;
488c83f7defSrillig 			unreachable();	/* expect+0: ... [193] */
489b37b780bSrillig 		}
490c83f7defSrillig 		unreachable();		/* expect+0: ... [193] */
491b37b780bSrillig 	} while (1);
492c83f7defSrillig 	unreachable();			/* expect+0: ... [193] */
493b37b780bSrillig }
494b37b780bSrillig 
495cd0f66feSrillig void
496cd0f66feSrillig test_if_nested(void)
497cd0f66feSrillig {
498cd0f66feSrillig 	if (0) {
499c83f7defSrillig 		if (1)			/* expect+0: ... [193] */
500cd0f66feSrillig 			unreachable();
501cd0f66feSrillig 		else
502c83f7defSrillig 			unreachable();	/* expect+0: ... [193] *//* XXX: redundant */
503cd0f66feSrillig 
504cd0f66feSrillig 		if (0)
505c83f7defSrillig 			unreachable();	/* expect+0: ... [193] *//* XXX: redundant */
506cd0f66feSrillig 		else
507cd0f66feSrillig 			unreachable();
508cd0f66feSrillig 
509cd0f66feSrillig 		unreachable();
510cd0f66feSrillig 	}
511cd0f66feSrillig 	reachable();
512cd0f66feSrillig 
513cd0f66feSrillig 	if (1) {
514cd0f66feSrillig 		if (1)
515cd0f66feSrillig 			reachable();
516cd0f66feSrillig 		else
517c83f7defSrillig 			unreachable();	/* expect+0: ... [193] */
518cd0f66feSrillig 
519cd0f66feSrillig 		if (0)
520c83f7defSrillig 			unreachable();	/* expect+0: ... [193] */
521cd0f66feSrillig 		else
522cd0f66feSrillig 			reachable();
523cd0f66feSrillig 
524cd0f66feSrillig 		reachable();
525cd0f66feSrillig 	}
526cd0f66feSrillig 	reachable();
527cd0f66feSrillig }
528cd0f66feSrillig 
5290676c13cSrillig void
5300676c13cSrillig test_if_maybe(void)
5310676c13cSrillig {
5320676c13cSrillig 	if (maybe()) {
5330676c13cSrillig 		if (0)
534c83f7defSrillig 			unreachable();	/* expect+0: ... [193] */
5350676c13cSrillig 		else
5360676c13cSrillig 			reachable();
5370676c13cSrillig 		reachable();
5380676c13cSrillig 	}
5390676c13cSrillig 	reachable();
5400676c13cSrillig 
5410676c13cSrillig 	if (0) {
542c83f7defSrillig 		if (maybe())		/* expect+0: ... [193] */
5430676c13cSrillig 			unreachable();
5440676c13cSrillig 		else
5450676c13cSrillig 			unreachable();
5460676c13cSrillig 		unreachable();
5470676c13cSrillig 	}
5480676c13cSrillig 	reachable();
5490676c13cSrillig 
5500676c13cSrillig 	if (1) {
5510676c13cSrillig 		if (maybe())
5520676c13cSrillig 			reachable();
5530676c13cSrillig 		else
5540676c13cSrillig 			reachable();
5550676c13cSrillig 		reachable();
5560676c13cSrillig 	}
5570676c13cSrillig 	reachable();
5580676c13cSrillig }
5590676c13cSrillig 
560a23b8b6dSrillig /*
561a23b8b6dSrillig  * To compute the reachability graph of this little monster, lint would have
562a23b8b6dSrillig  * to keep all statements and their relations from the whole function in
563a23b8b6dSrillig  * memory.  It doesn't do that.  Therefore it does not warn about any
564a23b8b6dSrillig  * unreachable statements in this function.
565a23b8b6dSrillig  */
566a23b8b6dSrillig void
567a23b8b6dSrillig test_goto_numbers_alphabetically(void)
568a23b8b6dSrillig {
569a23b8b6dSrillig 	goto one;
570a23b8b6dSrillig eight:
571a23b8b6dSrillig 	goto nine;
572a23b8b6dSrillig five:
573a23b8b6dSrillig 	return;
574a23b8b6dSrillig four:
575a23b8b6dSrillig 	goto five;
576a23b8b6dSrillig nine:
577a23b8b6dSrillig 	goto ten;
578a23b8b6dSrillig one:
579a23b8b6dSrillig 	goto two;
580a23b8b6dSrillig seven:
581a23b8b6dSrillig 	goto eight;
58265e5c21bSrillig six:
58365e5c21bSrillig 	/* expect-1: warning: label 'six' unused in function 'test_goto_numbers_alphabetically' [232] */
584a23b8b6dSrillig 	goto seven;
585a23b8b6dSrillig ten:
586a23b8b6dSrillig 	return;
587a23b8b6dSrillig three:
588a23b8b6dSrillig 	goto four;
589a23b8b6dSrillig two:
590a23b8b6dSrillig 	goto three;
591a23b8b6dSrillig }
592b37b780bSrillig 
593a23b8b6dSrillig void
594a23b8b6dSrillig test_while_goto(void)
595a23b8b6dSrillig {
596a23b8b6dSrillig 	while (1) {
597a23b8b6dSrillig 		goto out;
598a23b8b6dSrillig 		break;		/* lint only warns with the -b option */
599a23b8b6dSrillig 	}
600c83f7defSrillig 	unreachable();		/* expect+0: ... [193] */
601a23b8b6dSrillig out:
602a23b8b6dSrillig 	reachable();
603a23b8b6dSrillig }
604a23b8b6dSrillig 
605a23b8b6dSrillig void
606a23b8b6dSrillig test_unreachable_label(void)
607a23b8b6dSrillig {
608a23b8b6dSrillig 	if (0)
609c83f7defSrillig 		goto unreachable;	/* expect+0: ... [193] */
610a23b8b6dSrillig 	goto reachable;
611a23b8b6dSrillig 
612a23b8b6dSrillig 	/* named_label assumes that any label is reachable. */
613a23b8b6dSrillig unreachable:
614a23b8b6dSrillig 	unreachable();
615a23b8b6dSrillig reachable:
616a23b8b6dSrillig 	reachable();
617a23b8b6dSrillig }
618a23b8b6dSrillig 
619a23b8b6dSrillig /* TODO: switch */
620b37b780bSrillig 
621b37b780bSrillig /* TODO: system-dependent constant expression (see tn_system_dependent) */
62273792c87Srillig 
62373792c87Srillig void suppressed(void);
62473792c87Srillig 
62573792c87Srillig void
62673792c87Srillig lint_annotation_NOTREACHED(void)
62773792c87Srillig {
62873792c87Srillig 	if (0) {
629*6937eff3Srillig 		/* expect+1: warning: 'call' statement not reached [193] */
63073792c87Srillig 		unreachable();
63173792c87Srillig 	}
63273792c87Srillig 
63373792c87Srillig 	if (0) {
63473792c87Srillig 		/* NOTREACHED */
63573792c87Srillig 		suppressed();
63673792c87Srillig 	}
63773792c87Srillig 
63873792c87Srillig 	if (0)
63973792c87Srillig 		/* NOTREACHED */
64073792c87Srillig 		suppressed();
64173792c87Srillig 
64273792c87Srillig 	if (1) {
64373792c87Srillig 		reachable();
64473792c87Srillig 	}
64573792c87Srillig 
64673792c87Srillig 	if (1) {
64773792c87Srillig 		/* NOTREACHED */
64873792c87Srillig 		suppressed();
64973792c87Srillig 	}
65073792c87Srillig 
65179676afaSrillig 	/*
65279676afaSrillig 	 * Since the condition in the 'if' statement is constant, lint knows
65379676afaSrillig 	 * that the branch is unconditionally taken.  The annotation comment
65479676afaSrillig 	 * marks that branch as not reached, which means that any following
65579676afaSrillig 	 * statement cannot be reached as well.
65679676afaSrillig 	 */
657*6937eff3Srillig 	/* expect+1: warning: 'if' statement not reached [193] */
65873792c87Srillig 	if (1)
65973792c87Srillig 		/* NOTREACHED */
66073792c87Srillig 		suppressed();
66173792c87Srillig }
6627c0fdb81Srillig 
6637c0fdb81Srillig /*
664990054f8Srillig  * Since at least 2002 and before cgram.y 1.379 from 2022-01-16, lint did not
665990054f8Srillig  * detect a double semicolon.  See cgram.y, expression_statement, T_SEMI.
6667c0fdb81Srillig  */
6677c0fdb81Srillig int
668990054f8Srillig test_null_statement(void)
6697c0fdb81Srillig {
670990054f8Srillig 	/*
671990054f8Srillig 	 * The following 2 semicolons are superfluous but lint doesn't warn
672990054f8Srillig 	 * about them.  Probably it should.  A null statement as part of a
673990054f8Srillig 	 * block-list has no use.
674990054f8Srillig 	 */
675990054f8Srillig 	;;
676990054f8Srillig 
677990054f8Srillig 	/*
678f0364de6Srillig 	 * If assertions are disabled with -DNDEBUG and __lint__ is defined,
679f0364de6Srillig 	 * NetBSD's <assert.h> defines assert(x) to nothing, leaving only
680f0364de6Srillig 	 * the trailing semicolon.  If there are several assertions next to
681f0364de6Srillig 	 * each other, without any whitespace in between (very unusual), the
682f0364de6Srillig 	 * GCC preprocessor generates ";;" for them, which makes them
683f0364de6Srillig 	 * indistinguishable from the literal ";;" from the typo above.
684f0364de6Srillig 	 *
685f0364de6Srillig 	 * (echo '#include <assert.h>'; echo 'assert(0);assert(1);') \
686f0364de6Srillig 	 * | gcc -DNDEBUG -E - -D__lint__
687f0364de6Srillig 	 *
688f0364de6Srillig 	 * To actually see the difference, lint would need to look at the
689f0364de6Srillig 	 * code before preprocessing and compare it with the preprocessed
690f0364de6Srillig 	 * code, which would be a lot of work.
691f0364de6Srillig 	 *
692f0364de6Srillig 	 * Apart from the above edge case, detecting extra semicolons would
693f0364de6Srillig 	 * be possible, but lint would have to look at the whitespace between
694f0364de6Srillig 	 * the tokens, and this is something that it doesn't do at all, as of
695f0364de6Srillig 	 * 2022-01-16.
696f0364de6Srillig 	 */
697f0364de6Srillig 
698f0364de6Srillig 	/*
699990054f8Srillig 	 * A stand-alone null statement, on the other hand, has its purpose.
700990054f8Srillig 	 * Without it, the 'for' loop would not be complete.  The NetBSD
701990054f8Srillig 	 * style is to use 'continue;' instead of a simple ';'.
702990054f8Srillig 	 */
703990054f8Srillig 	for (int i = 0; i < 10; i++)
704990054f8Srillig 		;
705990054f8Srillig 
706*6937eff3Srillig 	/* expect+1: warning: 'empty' statement not reached [193] */
707990054f8Srillig 	return 0;;
7087c0fdb81Srillig }
70968d13a7aSrillig 
71068d13a7aSrillig /*
71168d13a7aSrillig  * Before func.c 1.149 from 2023-02-21, lint crashed due to a null pointer
71268d13a7aSrillig  * dereference.
71368d13a7aSrillig  */
71468d13a7aSrillig void
71568d13a7aSrillig invalid_case_expression(void)
71668d13a7aSrillig {
71768d13a7aSrillig 	switch (4) {
71868d13a7aSrillig 	/* expect+1: error: operand of '~' has invalid type 'double' [108] */
71968d13a7aSrillig 	case ~0.0:
72068d13a7aSrillig 		;
72168d13a7aSrillig 	}
72268d13a7aSrillig }
723