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