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