xref: /netbsd-src/tests/usr.bin/xlint/lint1/expr_range.c (revision 6937eff333b197fb14840f0e58df0f7a0edfd51a)
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