msg_193.c revision 1.17 1 1.17 rillig /* $NetBSD: msg_193.c,v 1.17 2022/01/16 10:11:38 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.4 rillig unreachable(); /* expect: 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.4 rillig unreachable(); /* expect: 193 */
75 1.3 rillig }
76 1.3 rillig if (0) {
77 1.3 rillig {
78 1.3 rillig {
79 1.4 rillig unreachable(); /* expect: 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.4 rillig unreachable(); /* expect: 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.4 rillig unreachable(); /* expect: 193 */
104 1.3 rillig reachable();
105 1.3 rillig
106 1.3 rillig if (0)
107 1.4 rillig unreachable(); /* expect: 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.4 rillig else if (1) /* expect: 193 */
119 1.4 rillig unreachable();
120 1.3 rillig else
121 1.4 rillig unreachable(); /* expect: 193 */
122 1.3 rillig
123 1.3 rillig if (0)
124 1.4 rillig unreachable(); /* expect: 193 */
125 1.3 rillig else if (1)
126 1.3 rillig reachable();
127 1.3 rillig else
128 1.4 rillig unreachable(); /* expect: 193 */
129 1.3 rillig
130 1.3 rillig if (0)
131 1.4 rillig unreachable(); /* expect: 193 */
132 1.3 rillig else if (0)
133 1.4 rillig unreachable(); /* expect: 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.5 rillig unreachable(); /* expect: 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.4 rillig return; /* expect: 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.3 rillig unreachable(); /* expect: 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.3 rillig unreachable(); /* expect: 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.6 rillig unreachable(); /* expect: 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.3 rillig unreachable(); /* expect: 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.4 rillig unreachable(); /* expect: 193 */
198 1.3 rillig break;
199 1.3 rillig unreachable(); /* expect: 193 */
200 1.3 rillig }
201 1.3 rillig if (1) {
202 1.3 rillig reachable();
203 1.3 rillig break;
204 1.3 rillig unreachable(); /* expect: 193 */
205 1.3 rillig }
206 1.8 rillig unreachable(); /* expect: 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.3 rillig unreachable(); /* expect: 193 */
218 1.3 rillig }
219 1.3 rillig unreachable(); /* expect: 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.4 rillig unreachable(); /* expect: 193 */
229 1.3 rillig continue;
230 1.3 rillig unreachable(); /* expect: 193 */
231 1.3 rillig }
232 1.3 rillig if (1) {
233 1.3 rillig reachable();
234 1.3 rillig continue;
235 1.3 rillig unreachable(); /* expect: 193 */
236 1.3 rillig }
237 1.8 rillig unreachable(); /* expect: 193 */
238 1.3 rillig }
239 1.3 rillig unreachable(); /* expect: 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.3 rillig unreachable(); /* expect: 193 */
249 1.3 rillig }
250 1.3 rillig unreachable(); /* expect: 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.4 rillig unreachable(); /* expect: 193 */
260 1.3 rillig return;
261 1.3 rillig unreachable(); /* expect: 193 */
262 1.3 rillig }
263 1.3 rillig if (1) {
264 1.3 rillig reachable();
265 1.3 rillig return;
266 1.3 rillig unreachable(); /* expect: 193 */
267 1.3 rillig }
268 1.8 rillig unreachable(); /* expect: 193 */
269 1.3 rillig }
270 1.3 rillig unreachable(); /* expect: 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.3 rillig unreachable(); /* expect: 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.7 rillig unreachable(); /* expect: 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.3 rillig unreachable(); /* expect: 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.4 rillig unreachable(); /* expect: 193 */
307 1.3 rillig break;
308 1.3 rillig unreachable(); /* expect: 193 */
309 1.3 rillig }
310 1.3 rillig if (1) {
311 1.3 rillig reachable();
312 1.3 rillig break;
313 1.3 rillig unreachable(); /* expect: 193 */
314 1.3 rillig }
315 1.8 rillig unreachable(); /* expect: 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.3 rillig unreachable(); /* expect: 193 */
327 1.3 rillig }
328 1.3 rillig unreachable(); /* expect: 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.4 rillig unreachable(); /* expect: 193 */
338 1.3 rillig continue;
339 1.3 rillig unreachable(); /* expect: 193 */
340 1.3 rillig }
341 1.3 rillig if (1) {
342 1.3 rillig reachable();
343 1.3 rillig continue;
344 1.3 rillig unreachable(); /* expect: 193 */
345 1.3 rillig }
346 1.8 rillig unreachable(); /* expect: 193 */
347 1.3 rillig }
348 1.3 rillig unreachable(); /* expect: 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.3 rillig unreachable(); /* expect: 193 */
358 1.3 rillig }
359 1.3 rillig unreachable(); /* expect: 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.4 rillig unreachable(); /* expect: 193 */
369 1.3 rillig return;
370 1.3 rillig unreachable(); /* expect: 193 */
371 1.3 rillig }
372 1.3 rillig if (1) {
373 1.3 rillig reachable();
374 1.3 rillig return;
375 1.3 rillig unreachable(); /* expect: 193 */
376 1.3 rillig }
377 1.8 rillig unreachable(); /* expect: 193 */
378 1.3 rillig }
379 1.3 rillig unreachable(); /* expect: 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.3 rillig unreachable(); /* expect: 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.3 rillig unreachable(); /* expect: 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.4 rillig unreachable(); /* expect: 193 */
418 1.3 rillig break;
419 1.3 rillig unreachable(); /* expect: 193 */
420 1.3 rillig }
421 1.3 rillig if (1) {
422 1.3 rillig reachable();
423 1.3 rillig break;
424 1.3 rillig unreachable(); /* expect: 193 */
425 1.3 rillig }
426 1.8 rillig unreachable(); /* expect: 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.3 rillig unreachable(); /* expect: 193 */
438 1.3 rillig } while (1);
439 1.3 rillig unreachable(); /* expect: 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.4 rillig unreachable(); /* expect: 193 */
449 1.3 rillig continue;
450 1.3 rillig unreachable(); /* expect: 193 */
451 1.3 rillig }
452 1.3 rillig if (1) {
453 1.3 rillig reachable();
454 1.3 rillig continue;
455 1.3 rillig unreachable(); /* expect: 193 */
456 1.3 rillig }
457 1.8 rillig unreachable(); /* expect: 193 */
458 1.3 rillig } while (1);
459 1.3 rillig unreachable(); /* expect: 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.3 rillig unreachable(); /* expect: 193 */
469 1.3 rillig } while (1);
470 1.3 rillig unreachable(); /* expect: 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.4 rillig unreachable(); /* expect: 193 */
480 1.3 rillig return;
481 1.3 rillig unreachable(); /* expect: 193 */
482 1.3 rillig }
483 1.3 rillig if (1) {
484 1.3 rillig reachable();
485 1.3 rillig return;
486 1.3 rillig unreachable(); /* expect: 193 */
487 1.3 rillig }
488 1.8 rillig unreachable(); /* expect: 193 */
489 1.3 rillig } while (1);
490 1.3 rillig unreachable(); /* expect: 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.9 rillig if (1) /* expect: 193 */
498 1.9 rillig unreachable();
499 1.9 rillig else
500 1.9 rillig unreachable(); /* expect: 193 *//* XXX: redundant */
501 1.9 rillig
502 1.9 rillig if (0)
503 1.9 rillig unreachable(); /* expect: 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.9 rillig unreachable(); /* expect: 193 */
516 1.9 rillig
517 1.9 rillig if (0)
518 1.9 rillig unreachable(); /* expect: 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.10 rillig unreachable(); /* expect: 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.10 rillig if (maybe()) /* expect: 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.12 rillig six: /* expect: warning: label 'six' unused */
581 1.11 rillig goto seven;
582 1.11 rillig ten:
583 1.11 rillig return;
584 1.11 rillig three:
585 1.11 rillig goto four;
586 1.11 rillig two:
587 1.11 rillig goto three;
588 1.11 rillig }
589 1.11 rillig
590 1.11 rillig void
591 1.11 rillig test_while_goto(void)
592 1.11 rillig {
593 1.11 rillig while (1) {
594 1.11 rillig goto out;
595 1.11 rillig break; /* lint only warns with the -b option */
596 1.11 rillig }
597 1.11 rillig unreachable(); /* expect: 193 */
598 1.11 rillig out:
599 1.11 rillig reachable();
600 1.11 rillig }
601 1.11 rillig
602 1.11 rillig void
603 1.11 rillig test_unreachable_label(void)
604 1.11 rillig {
605 1.11 rillig if (0)
606 1.11 rillig goto unreachable; /* expect: 193 */
607 1.11 rillig goto reachable;
608 1.11 rillig
609 1.11 rillig /* named_label assumes that any label is reachable. */
610 1.11 rillig unreachable:
611 1.11 rillig unreachable();
612 1.11 rillig reachable:
613 1.11 rillig reachable();
614 1.11 rillig }
615 1.11 rillig
616 1.3 rillig /* TODO: switch */
617 1.3 rillig
618 1.3 rillig /* TODO: system-dependent constant expression (see tn_system_dependent) */
619 1.13 rillig
620 1.13 rillig void suppressed(void);
621 1.13 rillig
622 1.13 rillig void
623 1.13 rillig lint_annotation_NOTREACHED(void)
624 1.13 rillig {
625 1.13 rillig if (0) {
626 1.13 rillig /* expect+1: warning: statement not reached [193] */
627 1.13 rillig unreachable();
628 1.13 rillig }
629 1.13 rillig
630 1.13 rillig if (0) {
631 1.13 rillig /* NOTREACHED */
632 1.13 rillig suppressed();
633 1.13 rillig }
634 1.13 rillig
635 1.13 rillig if (0)
636 1.13 rillig /* NOTREACHED */
637 1.13 rillig suppressed();
638 1.13 rillig
639 1.13 rillig if (1) {
640 1.13 rillig reachable();
641 1.13 rillig }
642 1.13 rillig
643 1.13 rillig if (1) {
644 1.13 rillig /* NOTREACHED */
645 1.13 rillig suppressed();
646 1.13 rillig }
647 1.13 rillig
648 1.14 rillig /*
649 1.14 rillig * Since the condition in the 'if' statement is constant, lint knows
650 1.14 rillig * that the branch is unconditionally taken. The annotation comment
651 1.14 rillig * marks that branch as not reached, which means that any following
652 1.14 rillig * statement cannot be reached as well.
653 1.14 rillig */
654 1.13 rillig /* expect+1: warning: statement not reached [193] */
655 1.13 rillig if (1)
656 1.13 rillig /* NOTREACHED */
657 1.13 rillig suppressed();
658 1.13 rillig }
659 1.15 rillig
660 1.15 rillig /*
661 1.16 rillig * Since at least 2002 and before cgram.y 1.379 from 2022-01-16, lint did not
662 1.16 rillig * detect a double semicolon. See cgram.y, expression_statement, T_SEMI.
663 1.15 rillig */
664 1.15 rillig int
665 1.16 rillig test_null_statement(void)
666 1.15 rillig {
667 1.16 rillig /*
668 1.16 rillig * The following 2 semicolons are superfluous but lint doesn't warn
669 1.16 rillig * about them. Probably it should. A null statement as part of a
670 1.16 rillig * block-list has no use.
671 1.16 rillig */
672 1.16 rillig ;;
673 1.16 rillig
674 1.16 rillig /*
675 1.17 rillig * If assertions are disabled with -DNDEBUG and __lint__ is defined,
676 1.17 rillig * NetBSD's <assert.h> defines assert(x) to nothing, leaving only
677 1.17 rillig * the trailing semicolon. If there are several assertions next to
678 1.17 rillig * each other, without any whitespace in between (very unusual), the
679 1.17 rillig * GCC preprocessor generates ";;" for them, which makes them
680 1.17 rillig * indistinguishable from the literal ";;" from the typo above.
681 1.17 rillig *
682 1.17 rillig * (echo '#include <assert.h>'; echo 'assert(0);assert(1);') \
683 1.17 rillig * | gcc -DNDEBUG -E - -D__lint__
684 1.17 rillig *
685 1.17 rillig * To actually see the difference, lint would need to look at the
686 1.17 rillig * code before preprocessing and compare it with the preprocessed
687 1.17 rillig * code, which would be a lot of work.
688 1.17 rillig *
689 1.17 rillig * Apart from the above edge case, detecting extra semicolons would
690 1.17 rillig * be possible, but lint would have to look at the whitespace between
691 1.17 rillig * the tokens, and this is something that it doesn't do at all, as of
692 1.17 rillig * 2022-01-16.
693 1.17 rillig */
694 1.17 rillig
695 1.17 rillig /*
696 1.16 rillig * A stand-alone null statement, on the other hand, has its purpose.
697 1.16 rillig * Without it, the 'for' loop would not be complete. The NetBSD
698 1.16 rillig * style is to use 'continue;' instead of a simple ';'.
699 1.16 rillig */
700 1.16 rillig for (int i = 0; i < 10; i++)
701 1.16 rillig ;
702 1.16 rillig
703 1.16 rillig /* expect+1: warning: statement not reached [193] */
704 1.16 rillig return 0;;
705 1.15 rillig }
706