msg_193.c revision 1.20 1 1.20 rillig /* $NetBSD: msg_193.c,v 1.20 2023/02/21 19:47:21 rillig Exp $ */
2 1.1 rillig # 3 "msg_193.c"
3 1.1 rillig
4 1.1 rillig // Test for message: statement not reached [193]
5 1.1 rillig
6 1.3 rillig /*
7 1.3 rillig * Test the reachability of statements in a function.
8 1.3 rillig *
9 1.3 rillig * if
10 1.3 rillig * if-else
11 1.3 rillig * if-else-if-else
12 1.3 rillig * for
13 1.3 rillig * while
14 1.3 rillig * do-while
15 1.3 rillig * switch
16 1.3 rillig * break
17 1.3 rillig * continue
18 1.3 rillig * goto
19 1.3 rillig * return
20 1.3 rillig *
21 1.3 rillig * constant expression
22 1.3 rillig * system-dependent constant expression
23 1.3 rillig */
24 1.3 rillig
25 1.10 rillig extern void reachable(void);
26 1.10 rillig extern void unreachable(void);
27 1.10 rillig extern _Bool maybe(void);
28 1.10 rillig
29 1.3 rillig
30 1.3 rillig void
31 1.3 rillig test_statement(void)
32 1.3 rillig {
33 1.3 rillig reachable();
34 1.3 rillig reachable();
35 1.3 rillig }
36 1.3 rillig
37 1.3 rillig void
38 1.3 rillig test_compound_statement(void)
39 1.3 rillig {
40 1.3 rillig reachable();
41 1.3 rillig {
42 1.3 rillig reachable();
43 1.3 rillig reachable();
44 1.3 rillig }
45 1.3 rillig reachable();
46 1.3 rillig }
47 1.3 rillig
48 1.3 rillig void
49 1.3 rillig test_if_statement(void)
50 1.3 rillig {
51 1.3 rillig if (1)
52 1.3 rillig reachable();
53 1.3 rillig reachable();
54 1.3 rillig if (0)
55 1.19 rillig unreachable(); /* expect+0: ... [193] */
56 1.3 rillig reachable();
57 1.3 rillig }
58 1.3 rillig
59 1.3 rillig void
60 1.3 rillig test_if_compound_statement(void)
61 1.3 rillig {
62 1.3 rillig if (1) {
63 1.3 rillig reachable();
64 1.3 rillig }
65 1.3 rillig if (1) {
66 1.3 rillig {
67 1.3 rillig {
68 1.3 rillig reachable();
69 1.3 rillig }
70 1.3 rillig }
71 1.3 rillig }
72 1.3 rillig
73 1.3 rillig if (0) {
74 1.19 rillig unreachable(); /* expect+0: ... [193] */
75 1.3 rillig }
76 1.3 rillig if (0) {
77 1.3 rillig {
78 1.3 rillig {
79 1.19 rillig unreachable(); /* expect+0: ... [193] */
80 1.3 rillig }
81 1.3 rillig }
82 1.3 rillig }
83 1.3 rillig }
84 1.3 rillig
85 1.3 rillig void
86 1.3 rillig test_if_without_else(void)
87 1.3 rillig {
88 1.3 rillig if (1)
89 1.3 rillig reachable();
90 1.3 rillig reachable();
91 1.3 rillig
92 1.3 rillig if (0)
93 1.19 rillig unreachable(); /* expect+0: ... [193] */
94 1.3 rillig reachable();
95 1.3 rillig }
96 1.3 rillig
97 1.3 rillig void
98 1.3 rillig test_if_with_else(void)
99 1.3 rillig {
100 1.3 rillig if (1)
101 1.3 rillig reachable();
102 1.3 rillig else
103 1.19 rillig unreachable(); /* expect+0: ... [193] */
104 1.3 rillig reachable();
105 1.3 rillig
106 1.3 rillig if (0)
107 1.19 rillig unreachable(); /* expect+0: ... [193] */
108 1.3 rillig else
109 1.3 rillig reachable();
110 1.3 rillig reachable();
111 1.3 rillig }
112 1.3 rillig
113 1.3 rillig void
114 1.3 rillig test_if_else_if_else(void)
115 1.3 rillig {
116 1.3 rillig if (1)
117 1.3 rillig reachable();
118 1.19 rillig else if (1) /* expect+0: ... [193] */
119 1.4 rillig unreachable();
120 1.3 rillig else
121 1.19 rillig unreachable(); /* expect+0: ... [193] */
122 1.3 rillig
123 1.3 rillig if (0)
124 1.19 rillig unreachable(); /* expect+0: ... [193] */
125 1.3 rillig else if (1)
126 1.3 rillig reachable();
127 1.3 rillig else
128 1.19 rillig unreachable(); /* expect+0: ... [193] */
129 1.3 rillig
130 1.3 rillig if (0)
131 1.19 rillig unreachable(); /* expect+0: ... [193] */
132 1.3 rillig else if (0)
133 1.19 rillig unreachable(); /* expect+0: ... [193] */
134 1.3 rillig else
135 1.3 rillig reachable();
136 1.3 rillig }
137 1.3 rillig
138 1.3 rillig void
139 1.3 rillig test_if_return(void)
140 1.3 rillig {
141 1.3 rillig if (1)
142 1.3 rillig return;
143 1.19 rillig unreachable(); /* expect+0: ... [193] */
144 1.3 rillig }
145 1.3 rillig
146 1.3 rillig void
147 1.3 rillig test_if_else_return(void)
148 1.3 rillig {
149 1.3 rillig if (1)
150 1.3 rillig reachable();
151 1.3 rillig else
152 1.19 rillig return; /* expect+0: ... [193] */
153 1.3 rillig reachable();
154 1.3 rillig }
155 1.3 rillig
156 1.3 rillig void
157 1.3 rillig test_for_forever(void)
158 1.3 rillig {
159 1.3 rillig for (;;)
160 1.3 rillig reachable();
161 1.19 rillig unreachable(); /* expect+0: ... [193] */
162 1.3 rillig }
163 1.3 rillig
164 1.3 rillig void
165 1.3 rillig test_for_true(void)
166 1.3 rillig {
167 1.3 rillig for (; 1;)
168 1.3 rillig reachable();
169 1.19 rillig unreachable(); /* expect+0: ... [193] */
170 1.3 rillig }
171 1.3 rillig
172 1.3 rillig void
173 1.3 rillig test_for_false(void)
174 1.3 rillig {
175 1.3 rillig for (; 0;)
176 1.19 rillig unreachable(); /* expect+0: ... [193] */
177 1.3 rillig reachable();
178 1.3 rillig }
179 1.3 rillig
180 1.3 rillig void
181 1.3 rillig test_for_break(void)
182 1.3 rillig {
183 1.3 rillig for (;;) {
184 1.3 rillig reachable();
185 1.3 rillig break;
186 1.19 rillig unreachable(); /* expect+0: ... [193] */
187 1.3 rillig }
188 1.3 rillig reachable();
189 1.3 rillig }
190 1.3 rillig
191 1.3 rillig void
192 1.3 rillig test_for_if_break(void)
193 1.3 rillig {
194 1.3 rillig for (;;) {
195 1.3 rillig reachable();
196 1.3 rillig if (0) {
197 1.19 rillig unreachable(); /* expect+0: ... [193] */
198 1.3 rillig break;
199 1.19 rillig unreachable(); /* expect+0: ... [193] */
200 1.3 rillig }
201 1.3 rillig if (1) {
202 1.3 rillig reachable();
203 1.3 rillig break;
204 1.19 rillig unreachable(); /* expect+0: ... [193] */
205 1.3 rillig }
206 1.19 rillig unreachable(); /* expect+0: ... [193] */
207 1.3 rillig }
208 1.3 rillig reachable();
209 1.3 rillig }
210 1.3 rillig
211 1.3 rillig void
212 1.3 rillig test_for_continue(void)
213 1.3 rillig {
214 1.3 rillig for (;;) {
215 1.3 rillig reachable();
216 1.3 rillig continue;
217 1.19 rillig unreachable(); /* expect+0: ... [193] */
218 1.3 rillig }
219 1.19 rillig unreachable(); /* expect+0: ... [193] */
220 1.3 rillig }
221 1.3 rillig
222 1.3 rillig void
223 1.3 rillig test_for_if_continue(void)
224 1.3 rillig {
225 1.3 rillig for (;;) {
226 1.3 rillig reachable();
227 1.3 rillig if (0) {
228 1.19 rillig unreachable(); /* expect+0: ... [193] */
229 1.3 rillig continue;
230 1.19 rillig unreachable(); /* expect+0: ... [193] */
231 1.3 rillig }
232 1.3 rillig if (1) {
233 1.3 rillig reachable();
234 1.3 rillig continue;
235 1.19 rillig unreachable(); /* expect+0: ... [193] */
236 1.3 rillig }
237 1.19 rillig unreachable(); /* expect+0: ... [193] */
238 1.3 rillig }
239 1.19 rillig unreachable(); /* expect+0: ... [193] */
240 1.3 rillig }
241 1.3 rillig
242 1.3 rillig void
243 1.3 rillig test_for_return(void)
244 1.2 rillig {
245 1.3 rillig for (;;) {
246 1.3 rillig reachable();
247 1.3 rillig return;
248 1.19 rillig unreachable(); /* expect+0: ... [193] */
249 1.3 rillig }
250 1.19 rillig unreachable(); /* expect+0: ... [193] */
251 1.2 rillig }
252 1.3 rillig
253 1.3 rillig void
254 1.3 rillig test_for_if_return(void)
255 1.3 rillig {
256 1.3 rillig for (;;) {
257 1.3 rillig reachable();
258 1.3 rillig if (0) {
259 1.19 rillig unreachable(); /* expect+0: ... [193] */
260 1.3 rillig return;
261 1.19 rillig unreachable(); /* expect+0: ... [193] */
262 1.3 rillig }
263 1.3 rillig if (1) {
264 1.3 rillig reachable();
265 1.3 rillig return;
266 1.19 rillig unreachable(); /* expect+0: ... [193] */
267 1.3 rillig }
268 1.19 rillig unreachable(); /* expect+0: ... [193] */
269 1.3 rillig }
270 1.19 rillig unreachable(); /* expect+0: ... [193] */
271 1.3 rillig }
272 1.3 rillig
273 1.3 rillig void
274 1.3 rillig test_while_true(void)
275 1.3 rillig {
276 1.3 rillig while (1)
277 1.3 rillig reachable();
278 1.19 rillig unreachable(); /* expect+0: ... [193] */
279 1.3 rillig }
280 1.3 rillig
281 1.3 rillig void
282 1.3 rillig test_while_false(void)
283 1.3 rillig {
284 1.3 rillig while (0)
285 1.19 rillig unreachable(); /* expect+0: ... [193] */
286 1.3 rillig reachable();
287 1.3 rillig }
288 1.3 rillig
289 1.3 rillig void
290 1.3 rillig test_while_break(void)
291 1.3 rillig {
292 1.3 rillig while (1) {
293 1.3 rillig reachable();
294 1.3 rillig break;
295 1.19 rillig unreachable(); /* expect+0: ... [193] */
296 1.3 rillig }
297 1.3 rillig reachable();
298 1.3 rillig }
299 1.3 rillig
300 1.3 rillig void
301 1.3 rillig test_while_if_break(void)
302 1.3 rillig {
303 1.3 rillig while (1) {
304 1.3 rillig reachable();
305 1.3 rillig if (0) {
306 1.19 rillig unreachable(); /* expect+0: ... [193] */
307 1.3 rillig break;
308 1.19 rillig unreachable(); /* expect+0: ... [193] */
309 1.3 rillig }
310 1.3 rillig if (1) {
311 1.3 rillig reachable();
312 1.3 rillig break;
313 1.19 rillig unreachable(); /* expect+0: ... [193] */
314 1.3 rillig }
315 1.19 rillig unreachable(); /* expect+0: ... [193] */
316 1.3 rillig }
317 1.3 rillig reachable();
318 1.3 rillig }
319 1.3 rillig
320 1.3 rillig void
321 1.3 rillig test_while_continue(void)
322 1.3 rillig {
323 1.3 rillig while (1) {
324 1.3 rillig reachable();
325 1.3 rillig continue;
326 1.19 rillig unreachable(); /* expect+0: ... [193] */
327 1.3 rillig }
328 1.19 rillig unreachable(); /* expect+0: ... [193] */
329 1.3 rillig }
330 1.3 rillig
331 1.3 rillig void
332 1.3 rillig test_while_if_continue(void)
333 1.3 rillig {
334 1.3 rillig while (1) {
335 1.3 rillig reachable();
336 1.3 rillig if (0) {
337 1.19 rillig unreachable(); /* expect+0: ... [193] */
338 1.3 rillig continue;
339 1.19 rillig unreachable(); /* expect+0: ... [193] */
340 1.3 rillig }
341 1.3 rillig if (1) {
342 1.3 rillig reachable();
343 1.3 rillig continue;
344 1.19 rillig unreachable(); /* expect+0: ... [193] */
345 1.3 rillig }
346 1.19 rillig unreachable(); /* expect+0: ... [193] */
347 1.3 rillig }
348 1.19 rillig unreachable(); /* expect+0: ... [193] */
349 1.3 rillig }
350 1.3 rillig
351 1.3 rillig void
352 1.3 rillig test_while_return(void)
353 1.3 rillig {
354 1.3 rillig while (1) {
355 1.3 rillig reachable();
356 1.3 rillig return;
357 1.19 rillig unreachable(); /* expect+0: ... [193] */
358 1.3 rillig }
359 1.19 rillig unreachable(); /* expect+0: ... [193] */
360 1.3 rillig }
361 1.3 rillig
362 1.3 rillig void
363 1.3 rillig test_while_if_return(void)
364 1.3 rillig {
365 1.3 rillig while (1) {
366 1.3 rillig reachable();
367 1.3 rillig if (0) {
368 1.19 rillig unreachable(); /* expect+0: ... [193] */
369 1.3 rillig return;
370 1.19 rillig unreachable(); /* expect+0: ... [193] */
371 1.3 rillig }
372 1.3 rillig if (1) {
373 1.3 rillig reachable();
374 1.3 rillig return;
375 1.19 rillig unreachable(); /* expect+0: ... [193] */
376 1.3 rillig }
377 1.19 rillig unreachable(); /* expect+0: ... [193] */
378 1.3 rillig }
379 1.19 rillig unreachable(); /* expect+0: ... [193] */
380 1.3 rillig }
381 1.3 rillig
382 1.3 rillig void
383 1.3 rillig test_do_while_true(void)
384 1.3 rillig {
385 1.3 rillig do {
386 1.3 rillig reachable();
387 1.3 rillig } while (1);
388 1.19 rillig unreachable(); /* expect+0: ... [193] */
389 1.3 rillig }
390 1.3 rillig
391 1.3 rillig void
392 1.3 rillig test_do_while_false(void)
393 1.3 rillig {
394 1.3 rillig do {
395 1.3 rillig reachable();
396 1.3 rillig } while (0);
397 1.3 rillig reachable();
398 1.3 rillig }
399 1.3 rillig
400 1.3 rillig void
401 1.3 rillig test_do_while_break(void)
402 1.3 rillig {
403 1.3 rillig do {
404 1.3 rillig reachable();
405 1.3 rillig break;
406 1.19 rillig unreachable(); /* expect+0: ... [193] */
407 1.3 rillig } while (1);
408 1.3 rillig reachable();
409 1.3 rillig }
410 1.3 rillig
411 1.3 rillig void
412 1.3 rillig test_do_while_if_break(void)
413 1.3 rillig {
414 1.3 rillig do {
415 1.3 rillig reachable();
416 1.3 rillig if (0) {
417 1.19 rillig unreachable(); /* expect+0: ... [193] */
418 1.3 rillig break;
419 1.19 rillig unreachable(); /* expect+0: ... [193] */
420 1.3 rillig }
421 1.3 rillig if (1) {
422 1.3 rillig reachable();
423 1.3 rillig break;
424 1.19 rillig unreachable(); /* expect+0: ... [193] */
425 1.3 rillig }
426 1.19 rillig unreachable(); /* expect+0: ... [193] */
427 1.3 rillig } while (1);
428 1.3 rillig reachable();
429 1.3 rillig }
430 1.3 rillig
431 1.3 rillig void
432 1.3 rillig test_do_while_continue(void)
433 1.3 rillig {
434 1.3 rillig do {
435 1.3 rillig reachable();
436 1.3 rillig continue;
437 1.19 rillig unreachable(); /* expect+0: ... [193] */
438 1.3 rillig } while (1);
439 1.19 rillig unreachable(); /* expect+0: ... [193] */
440 1.3 rillig }
441 1.3 rillig
442 1.3 rillig void
443 1.3 rillig test_do_while_if_continue(void)
444 1.3 rillig {
445 1.3 rillig do {
446 1.3 rillig reachable();
447 1.3 rillig if (0) {
448 1.19 rillig unreachable(); /* expect+0: ... [193] */
449 1.3 rillig continue;
450 1.19 rillig unreachable(); /* expect+0: ... [193] */
451 1.3 rillig }
452 1.3 rillig if (1) {
453 1.3 rillig reachable();
454 1.3 rillig continue;
455 1.19 rillig unreachable(); /* expect+0: ... [193] */
456 1.3 rillig }
457 1.19 rillig unreachable(); /* expect+0: ... [193] */
458 1.3 rillig } while (1);
459 1.19 rillig unreachable(); /* expect+0: ... [193] */
460 1.3 rillig }
461 1.3 rillig
462 1.3 rillig void
463 1.3 rillig test_do_while_return(void)
464 1.3 rillig {
465 1.3 rillig do {
466 1.3 rillig reachable();
467 1.3 rillig return;
468 1.19 rillig unreachable(); /* expect+0: ... [193] */
469 1.3 rillig } while (1);
470 1.19 rillig unreachable(); /* expect+0: ... [193] */
471 1.3 rillig }
472 1.3 rillig
473 1.3 rillig void
474 1.3 rillig test_do_while_if_return(void)
475 1.3 rillig {
476 1.3 rillig do {
477 1.3 rillig reachable();
478 1.3 rillig if (0) {
479 1.19 rillig unreachable(); /* expect+0: ... [193] */
480 1.3 rillig return;
481 1.19 rillig unreachable(); /* expect+0: ... [193] */
482 1.3 rillig }
483 1.3 rillig if (1) {
484 1.3 rillig reachable();
485 1.3 rillig return;
486 1.19 rillig unreachable(); /* expect+0: ... [193] */
487 1.3 rillig }
488 1.19 rillig unreachable(); /* expect+0: ... [193] */
489 1.3 rillig } while (1);
490 1.19 rillig unreachable(); /* expect+0: ... [193] */
491 1.3 rillig }
492 1.3 rillig
493 1.9 rillig void
494 1.9 rillig test_if_nested(void)
495 1.9 rillig {
496 1.9 rillig if (0) {
497 1.19 rillig if (1) /* expect+0: ... [193] */
498 1.9 rillig unreachable();
499 1.9 rillig else
500 1.19 rillig unreachable(); /* expect+0: ... [193] *//* XXX: redundant */
501 1.9 rillig
502 1.9 rillig if (0)
503 1.19 rillig unreachable(); /* expect+0: ... [193] *//* XXX: redundant */
504 1.9 rillig else
505 1.9 rillig unreachable();
506 1.9 rillig
507 1.9 rillig unreachable();
508 1.9 rillig }
509 1.9 rillig reachable();
510 1.9 rillig
511 1.9 rillig if (1) {
512 1.9 rillig if (1)
513 1.9 rillig reachable();
514 1.9 rillig else
515 1.19 rillig unreachable(); /* expect+0: ... [193] */
516 1.9 rillig
517 1.9 rillig if (0)
518 1.19 rillig unreachable(); /* expect+0: ... [193] */
519 1.9 rillig else
520 1.9 rillig reachable();
521 1.9 rillig
522 1.9 rillig reachable();
523 1.9 rillig }
524 1.9 rillig reachable();
525 1.9 rillig }
526 1.9 rillig
527 1.10 rillig void
528 1.10 rillig test_if_maybe(void)
529 1.10 rillig {
530 1.10 rillig if (maybe()) {
531 1.10 rillig if (0)
532 1.19 rillig unreachable(); /* expect+0: ... [193] */
533 1.10 rillig else
534 1.10 rillig reachable();
535 1.10 rillig reachable();
536 1.10 rillig }
537 1.10 rillig reachable();
538 1.10 rillig
539 1.10 rillig if (0) {
540 1.19 rillig if (maybe()) /* expect+0: ... [193] */
541 1.10 rillig unreachable();
542 1.10 rillig else
543 1.10 rillig unreachable();
544 1.10 rillig unreachable();
545 1.10 rillig }
546 1.10 rillig reachable();
547 1.10 rillig
548 1.10 rillig if (1) {
549 1.10 rillig if (maybe())
550 1.10 rillig reachable();
551 1.10 rillig else
552 1.10 rillig reachable();
553 1.10 rillig reachable();
554 1.10 rillig }
555 1.10 rillig reachable();
556 1.10 rillig }
557 1.10 rillig
558 1.11 rillig /*
559 1.11 rillig * To compute the reachability graph of this little monster, lint would have
560 1.11 rillig * to keep all statements and their relations from the whole function in
561 1.11 rillig * memory. It doesn't do that. Therefore it does not warn about any
562 1.11 rillig * unreachable statements in this function.
563 1.11 rillig */
564 1.11 rillig void
565 1.11 rillig test_goto_numbers_alphabetically(void)
566 1.11 rillig {
567 1.11 rillig goto one;
568 1.11 rillig eight:
569 1.11 rillig goto nine;
570 1.11 rillig five:
571 1.11 rillig return;
572 1.11 rillig four:
573 1.11 rillig goto five;
574 1.11 rillig nine:
575 1.11 rillig goto ten;
576 1.11 rillig one:
577 1.11 rillig goto two;
578 1.11 rillig seven:
579 1.11 rillig goto eight;
580 1.18 rillig six:
581 1.18 rillig /* expect-1: warning: label 'six' unused in function 'test_goto_numbers_alphabetically' [232] */
582 1.11 rillig goto seven;
583 1.11 rillig ten:
584 1.11 rillig return;
585 1.11 rillig three:
586 1.11 rillig goto four;
587 1.11 rillig two:
588 1.11 rillig goto three;
589 1.11 rillig }
590 1.11 rillig
591 1.11 rillig void
592 1.11 rillig test_while_goto(void)
593 1.11 rillig {
594 1.11 rillig while (1) {
595 1.11 rillig goto out;
596 1.11 rillig break; /* lint only warns with the -b option */
597 1.11 rillig }
598 1.19 rillig unreachable(); /* expect+0: ... [193] */
599 1.11 rillig out:
600 1.11 rillig reachable();
601 1.11 rillig }
602 1.11 rillig
603 1.11 rillig void
604 1.11 rillig test_unreachable_label(void)
605 1.11 rillig {
606 1.11 rillig if (0)
607 1.19 rillig goto unreachable; /* expect+0: ... [193] */
608 1.11 rillig goto reachable;
609 1.11 rillig
610 1.11 rillig /* named_label assumes that any label is reachable. */
611 1.11 rillig unreachable:
612 1.11 rillig unreachable();
613 1.11 rillig reachable:
614 1.11 rillig reachable();
615 1.11 rillig }
616 1.11 rillig
617 1.3 rillig /* TODO: switch */
618 1.3 rillig
619 1.3 rillig /* TODO: system-dependent constant expression (see tn_system_dependent) */
620 1.13 rillig
621 1.13 rillig void suppressed(void);
622 1.13 rillig
623 1.13 rillig void
624 1.13 rillig lint_annotation_NOTREACHED(void)
625 1.13 rillig {
626 1.13 rillig if (0) {
627 1.13 rillig /* expect+1: warning: statement not reached [193] */
628 1.13 rillig unreachable();
629 1.13 rillig }
630 1.13 rillig
631 1.13 rillig if (0) {
632 1.13 rillig /* NOTREACHED */
633 1.13 rillig suppressed();
634 1.13 rillig }
635 1.13 rillig
636 1.13 rillig if (0)
637 1.13 rillig /* NOTREACHED */
638 1.13 rillig suppressed();
639 1.13 rillig
640 1.13 rillig if (1) {
641 1.13 rillig reachable();
642 1.13 rillig }
643 1.13 rillig
644 1.13 rillig if (1) {
645 1.13 rillig /* NOTREACHED */
646 1.13 rillig suppressed();
647 1.13 rillig }
648 1.13 rillig
649 1.14 rillig /*
650 1.14 rillig * Since the condition in the 'if' statement is constant, lint knows
651 1.14 rillig * that the branch is unconditionally taken. The annotation comment
652 1.14 rillig * marks that branch as not reached, which means that any following
653 1.14 rillig * statement cannot be reached as well.
654 1.14 rillig */
655 1.13 rillig /* expect+1: warning: statement not reached [193] */
656 1.13 rillig if (1)
657 1.13 rillig /* NOTREACHED */
658 1.13 rillig suppressed();
659 1.13 rillig }
660 1.15 rillig
661 1.15 rillig /*
662 1.16 rillig * Since at least 2002 and before cgram.y 1.379 from 2022-01-16, lint did not
663 1.16 rillig * detect a double semicolon. See cgram.y, expression_statement, T_SEMI.
664 1.15 rillig */
665 1.15 rillig int
666 1.16 rillig test_null_statement(void)
667 1.15 rillig {
668 1.16 rillig /*
669 1.16 rillig * The following 2 semicolons are superfluous but lint doesn't warn
670 1.16 rillig * about them. Probably it should. A null statement as part of a
671 1.16 rillig * block-list has no use.
672 1.16 rillig */
673 1.16 rillig ;;
674 1.16 rillig
675 1.16 rillig /*
676 1.17 rillig * If assertions are disabled with -DNDEBUG and __lint__ is defined,
677 1.17 rillig * NetBSD's <assert.h> defines assert(x) to nothing, leaving only
678 1.17 rillig * the trailing semicolon. If there are several assertions next to
679 1.17 rillig * each other, without any whitespace in between (very unusual), the
680 1.17 rillig * GCC preprocessor generates ";;" for them, which makes them
681 1.17 rillig * indistinguishable from the literal ";;" from the typo above.
682 1.17 rillig *
683 1.17 rillig * (echo '#include <assert.h>'; echo 'assert(0);assert(1);') \
684 1.17 rillig * | gcc -DNDEBUG -E - -D__lint__
685 1.17 rillig *
686 1.17 rillig * To actually see the difference, lint would need to look at the
687 1.17 rillig * code before preprocessing and compare it with the preprocessed
688 1.17 rillig * code, which would be a lot of work.
689 1.17 rillig *
690 1.17 rillig * Apart from the above edge case, detecting extra semicolons would
691 1.17 rillig * be possible, but lint would have to look at the whitespace between
692 1.17 rillig * the tokens, and this is something that it doesn't do at all, as of
693 1.17 rillig * 2022-01-16.
694 1.17 rillig */
695 1.17 rillig
696 1.17 rillig /*
697 1.16 rillig * A stand-alone null statement, on the other hand, has its purpose.
698 1.16 rillig * Without it, the 'for' loop would not be complete. The NetBSD
699 1.16 rillig * style is to use 'continue;' instead of a simple ';'.
700 1.16 rillig */
701 1.16 rillig for (int i = 0; i < 10; i++)
702 1.16 rillig ;
703 1.16 rillig
704 1.16 rillig /* expect+1: warning: statement not reached [193] */
705 1.16 rillig return 0;;
706 1.15 rillig }
707 1.20 rillig
708 1.20 rillig /*
709 1.20 rillig * Before func.c 1.149 from 2023-02-21, lint crashed due to a null pointer
710 1.20 rillig * dereference.
711 1.20 rillig */
712 1.20 rillig void
713 1.20 rillig invalid_case_expression(void)
714 1.20 rillig {
715 1.20 rillig switch (4) {
716 1.20 rillig /* expect+1: error: operand of '~' has invalid type 'double' [108] */
717 1.20 rillig case ~0.0:
718 1.20 rillig ;
719 1.20 rillig }
720 1.20 rillig }
721