1 /* $NetBSD: expr_range.c,v 1.6 2024/11/13 04:32:49 rillig Exp $ */ 2 # 3 "expr_range.c" 3 4 /* 5 * In a switch statement that has (expr & constant) as the controlling 6 * expression, complain if a case branch is unreachable because the case 7 * label can never match the controlling expression. 8 * 9 * GCC 10 does not complain about the unreachable branch. It knows that the 10 * branch is unreachable though, since it doesn't generate any code for it. 11 * GCC once had the option -Wunreachable-code, but that option was made a 12 * no-op in 2011. 13 * 14 * Clang 10 does not complain about this either, and just like GCC it doesn't 15 * generate any code for this branch. The code for tracking an expression's 16 * possible values may be related to RangeConstraintManager, just guessing. 17 */ 18 19 /* lint1-extra-flags: -chap -X 351 */ 20 21 void println(const char *); 22 23 void 24 example(unsigned x) 25 { 26 switch (x & 6) { 27 case 0: 28 println("0 is reachable"); 29 break; 30 case 1: 31 /* expect-1: warning: 'case' statement not reached [193] */ 32 println("1 is not reachable"); 33 break; 34 case 2: 35 println("2 is reachable"); 36 break; 37 case 6: 38 println("6 is reachable"); 39 break; 40 case 7: 41 /* expect-1: warning: 'case' statement not reached [193] */ 42 println("7 is not reachable"); 43 break; 44 } 45 } 46