1 1.22 rillig /* $NetBSD: msg_193.c,v 1.22 2024/11/13 04:32:49 rillig Exp $ */ 2 1.1 rillig # 3 "msg_193.c" 3 1.1 rillig 4 1.22 rillig // Test for message: '%s' 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.22 rillig /* expect+1: warning: 'call' 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.22 rillig /* expect+1: warning: 'if' 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.22 rillig /* expect+1: warning: 'empty' 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