1 1.10 rillig /* $NetBSD: msg_220.c,v 1.10 2025/05/08 20:45:21 rillig Exp $ */ 2 1.1 rillig # 3 "msg_220.c" 3 1.1 rillig 4 1.1 rillig // Test for message: fallthrough on case statement [220] 5 1.1 rillig 6 1.9 rillig /* lint1-extra-flags: -h -X 351 */ 7 1.2 rillig 8 1.2 rillig extern void 9 1.2 rillig println(const char *); 10 1.2 rillig 11 1.2 rillig void 12 1.2 rillig example(int n) 13 1.2 rillig { 14 1.2 rillig switch (n) { 15 1.2 rillig case 1: 16 1.2 rillig case 3: 17 1.2 rillig case 5: 18 1.2 rillig println("odd"); 19 1.8 rillig /* expect+1: warning: fallthrough on case statement [220] */ 20 1.8 rillig case 2: 21 1.2 rillig case 7: 22 1.2 rillig println("prime"); 23 1.8 rillig /* expect+1: warning: fallthrough on default statement [284] */ 24 1.8 rillig default: 25 1.2 rillig println("number"); 26 1.2 rillig } 27 1.2 rillig } 28 1.3 christos 29 1.3 christos void 30 1.3 christos example1(int n) 31 1.3 christos { 32 1.3 christos switch (n) { 33 1.3 christos case 1: 34 1.3 christos case 3: 35 1.3 christos case 5: 36 1.3 christos println("odd"); 37 1.3 christos __attribute__((__fallthrough__)); 38 1.3 christos case 2: 39 1.3 christos case 7: 40 1.3 christos println("prime"); 41 1.3 christos __attribute__((__fallthrough__)); 42 1.3 christos default: 43 1.3 christos println("number"); 44 1.3 christos } 45 1.3 christos } 46 1.4 rillig 47 1.4 rillig /* https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wimplicit-fallthrough */ 48 1.4 rillig void 49 1.4 rillig annotation_comment_variations(int n) 50 1.4 rillig { 51 1.4 rillig switch (n) { 52 1.4 rillig case 0: 53 1.4 rillig println("0"); 54 1.4 rillig /* FALLTHROUGH */ 55 1.4 rillig case 1: 56 1.4 rillig println("1"); 57 1.7 rillig /* Seen in libarchive/archive_string.c, macro WRITE_UC. */ 58 1.4 rillig /* FALL THROUGH */ 59 1.7 rillig /* Lint warned before lex.c 1.79 from 2021-08-29. */ 60 1.4 rillig case 2: 61 1.4 rillig println("2"); 62 1.4 rillig /* FALLS THROUGH */ 63 1.4 rillig /* expect+1: warning: fallthrough on case statement [220] */ 64 1.4 rillig case 3: 65 1.4 rillig println("3"); 66 1.4 rillig /* intentionally falls through */ 67 1.4 rillig /* expect+1: warning: fallthrough on case statement [220] */ 68 1.4 rillig case 4: 69 1.4 rillig println("4"); 70 1.7 rillig /* This is the Splint variant, which is seldom used. */ 71 1.4 rillig /* @fallthrough@ */ 72 1.4 rillig /* expect+1: warning: fallthrough on case statement [220] */ 73 1.4 rillig case 5: 74 1.4 rillig println("5"); 75 1.7 rillig /* Seen in unbound/lookup3.c, function hashlittle. */ 76 1.7 rillig /* Lint warned before lex.c 1.80 from 2021-08-29. */ 77 1.6 rillig /* fallthrough */ 78 1.6 rillig case 6: 79 1.6 rillig println("6"); 80 1.4 rillig } 81 1.4 rillig } 82 1.10 rillig 83 1.10 rillig 84 1.10 rillig void do_return(void); 85 1.10 rillig void noreturn(void) 86 1.10 rillig __attribute__((__noreturn__)); 87 1.10 rillig void noreturn_attr_comma(void) 88 1.10 rillig __attribute__((__unused__, __noreturn__)); 89 1.10 rillig void noreturn_attr_attr(void) 90 1.10 rillig __attribute__((__unused__)) 91 1.10 rillig __attribute__((__noreturn__)); 92 1.10 rillig 93 1.10 rillig void 94 1.10 rillig call_noreturn(void) 95 1.10 rillig { 96 1.10 rillig switch (0) { 97 1.10 rillig case 0: 98 1.10 rillig do_return(); 99 1.10 rillig /* expect+1: warning: fallthrough on case statement [220] */ 100 1.10 rillig case 1: 101 1.10 rillig noreturn(); 102 1.10 rillig case 2: 103 1.10 rillig noreturn_attr_comma(); 104 1.10 rillig // FIXME 105 1.10 rillig /* expect+1: warning: fallthrough on case statement [220] */ 106 1.10 rillig case 3: 107 1.10 rillig noreturn_attr_attr(); 108 1.10 rillig // FIXME 109 1.10 rillig /* expect+1: warning: fallthrough on case statement [220] */ 110 1.10 rillig case 4: 111 1.10 rillig return; 112 1.10 rillig } 113 1.10 rillig } 114