Home | History | Annotate | Line # | Download | only in lint1
expr_range.c revision 1.5.2.1
      1  1.5.2.1  perseant /*	$NetBSD: expr_range.c,v 1.5.2.1 2025/08/02 05:58:14 perseant 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.5.2.1  perseant 		/* 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.5.2.1  perseant 		/* 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