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