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