Module Name:    src
Committed By:   rillig
Date:           Wed Nov 13 04:32:50 UTC 2024

Modified Files:
        src/tests/usr.bin/xlint/lint1: d_c99_bool_strict.c
            d_c99_bool_strict_syshdr.c expr_range.c msg_130.c msg_161.c
            msg_193.c msg_207.c msg_217.c msg_249.c msg_333.c msg_379.c
        src/usr.bin/xlint/lint1: cgram.y err.c externs1.h func.c init.c tree.c

Log Message:
lint: add more details to 'statement not reached' message

In lib/libcompat/regexp/regexp.c, the FAIL macro expands to a compound
statement containing a function call statement and a return statement,
and the macro invocation is followed by a semicolon, forming an extra
empty statement.  Which of these statements is unreachable now becomes
clear from the diagnostic, without having to inspect the preprocessed
source code.


To generate a diff of this commit:
cvs rdiff -u -r1.50 -r1.51 src/tests/usr.bin/xlint/lint1/d_c99_bool_strict.c
cvs rdiff -u -r1.24 -r1.25 \
    src/tests/usr.bin/xlint/lint1/d_c99_bool_strict_syshdr.c
cvs rdiff -u -r1.5 -r1.6 src/tests/usr.bin/xlint/lint1/expr_range.c
cvs rdiff -u -r1.16 -r1.17 src/tests/usr.bin/xlint/lint1/msg_130.c
cvs rdiff -u -r1.11 -r1.12 src/tests/usr.bin/xlint/lint1/msg_161.c
cvs rdiff -u -r1.21 -r1.22 src/tests/usr.bin/xlint/lint1/msg_193.c
cvs rdiff -u -r1.4 -r1.5 src/tests/usr.bin/xlint/lint1/msg_207.c
cvs rdiff -u -r1.14 -r1.15 src/tests/usr.bin/xlint/lint1/msg_217.c
cvs rdiff -u -r1.15 -r1.16 src/tests/usr.bin/xlint/lint1/msg_249.c
cvs rdiff -u -r1.7 -r1.8 src/tests/usr.bin/xlint/lint1/msg_333.c
cvs rdiff -u -r1.1 -r1.2 src/tests/usr.bin/xlint/lint1/msg_379.c
cvs rdiff -u -r1.514 -r1.515 src/usr.bin/xlint/lint1/cgram.y
cvs rdiff -u -r1.252 -r1.253 src/usr.bin/xlint/lint1/err.c
cvs rdiff -u -r1.234 -r1.235 src/usr.bin/xlint/lint1/externs1.h
cvs rdiff -u -r1.188 -r1.189 src/usr.bin/xlint/lint1/func.c
cvs rdiff -u -r1.270 -r1.271 src/usr.bin/xlint/lint1/init.c
cvs rdiff -u -r1.657 -r1.658 src/usr.bin/xlint/lint1/tree.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/tests/usr.bin/xlint/lint1/d_c99_bool_strict.c
diff -u src/tests/usr.bin/xlint/lint1/d_c99_bool_strict.c:1.50 src/tests/usr.bin/xlint/lint1/d_c99_bool_strict.c:1.51
--- src/tests/usr.bin/xlint/lint1/d_c99_bool_strict.c:1.50	Sun May 12 12:28:35 2024
+++ src/tests/usr.bin/xlint/lint1/d_c99_bool_strict.c	Wed Nov 13 04:32:49 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: d_c99_bool_strict.c,v 1.50 2024/05/12 12:28:35 rillig Exp $	*/
+/*	$NetBSD: d_c99_bool_strict.c,v 1.51 2024/11/13 04:32:49 rillig Exp $	*/
 # 3 "d_c99_bool_strict.c"
 
 /*
@@ -409,8 +409,8 @@ strict_bool_controlling_expression(bool 
 {
 	/* expect+1: warning: constant in conditional context [161] */
 	if (__lint_false)
+		/* expect+1: warning: 'call' statement not reached [193] */
 		do_nothing();
-	/* expect-1: warning: statement not reached [193] */
 
 	/* expect+1: warning: constant in conditional context [161] */
 	if (__lint_true)
@@ -421,8 +421,8 @@ strict_bool_controlling_expression(bool 
 
 	/* expect+1: error: controlling expression must be bool, not 'int' [333] */
 	if (/*CONSTCOND*/0)
+		/* expect+1: warning: 'call' statement not reached [193] */
 		do_nothing();
-	/* expect-1: warning: statement not reached [193] */
 
 	/* expect+1: error: controlling expression must be bool, not 'int' [333] */
 	if (/*CONSTCOND*/1)

Index: src/tests/usr.bin/xlint/lint1/d_c99_bool_strict_syshdr.c
diff -u src/tests/usr.bin/xlint/lint1/d_c99_bool_strict_syshdr.c:1.24 src/tests/usr.bin/xlint/lint1/d_c99_bool_strict_syshdr.c:1.25
--- src/tests/usr.bin/xlint/lint1/d_c99_bool_strict_syshdr.c:1.24	Sun May 12 12:28:35 2024
+++ src/tests/usr.bin/xlint/lint1/d_c99_bool_strict_syshdr.c	Wed Nov 13 04:32:49 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: d_c99_bool_strict_syshdr.c,v 1.24 2024/05/12 12:28:35 rillig Exp $	*/
+/*	$NetBSD: d_c99_bool_strict_syshdr.c,v 1.25 2024/11/13 04:32:49 rillig Exp $	*/
 # 3 "d_c99_bool_strict_syshdr.c"
 
 /*
@@ -266,8 +266,8 @@ if_pointer_or_int(void)
 	    ((void *)0)
 # 268 "d_c99_bool_strict_syshdr.c"
 		       )
+		/* expect+1: warning: 'return' statement not reached [193] */
 		return;
-	/* expect-1: warning: statement not reached [193] */
 
 	/* if (EXIT_SUCCESS) */
 	if (
@@ -275,8 +275,8 @@ if_pointer_or_int(void)
 	    0
 # 277 "d_c99_bool_strict_syshdr.c"
 		       )
+		/* expect+1: warning: 'return' statement not reached [193] */
 		return;
-	/* expect-1: warning: statement not reached [193] */
 
 	/* if (errno) */
 	if (

Index: src/tests/usr.bin/xlint/lint1/expr_range.c
diff -u src/tests/usr.bin/xlint/lint1/expr_range.c:1.5 src/tests/usr.bin/xlint/lint1/expr_range.c:1.6
--- src/tests/usr.bin/xlint/lint1/expr_range.c:1.5	Tue Mar 28 14:44:34 2023
+++ src/tests/usr.bin/xlint/lint1/expr_range.c	Wed Nov 13 04:32:49 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: expr_range.c,v 1.5 2023/03/28 14:44:34 rillig Exp $	*/
+/*	$NetBSD: expr_range.c,v 1.6 2024/11/13 04:32:49 rillig Exp $	*/
 # 3 "expr_range.c"
 
 /*
@@ -28,7 +28,7 @@ example(unsigned x)
 		println("0 is reachable");
 		break;
 	case 1:
-		/* expect-1: warning: statement not reached [193] */
+		/* expect-1: warning: 'case' statement not reached [193] */
 		println("1 is not reachable");
 		break;
 	case 2:
@@ -38,7 +38,7 @@ example(unsigned x)
 		println("6 is reachable");
 		break;
 	case 7:
-		/* expect-1: warning: statement not reached [193] */
+		/* expect-1: warning: 'case' statement not reached [193] */
 		println("7 is not reachable");
 		break;
 	}

Index: src/tests/usr.bin/xlint/lint1/msg_130.c
diff -u src/tests/usr.bin/xlint/lint1/msg_130.c:1.16 src/tests/usr.bin/xlint/lint1/msg_130.c:1.17
--- src/tests/usr.bin/xlint/lint1/msg_130.c:1.16	Tue Mar 28 14:44:34 2023
+++ src/tests/usr.bin/xlint/lint1/msg_130.c	Wed Nov 13 04:32:49 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: msg_130.c,v 1.16 2023/03/28 14:44:34 rillig Exp $	*/
+/*	$NetBSD: msg_130.c,v 1.17 2024/11/13 04:32:49 rillig Exp $	*/
 # 3 "msg_130.c"
 
 // Test for message: enum type mismatch: '%s' '%s' '%s' [130]
@@ -95,7 +95,7 @@ enum_constant_from_unnamed_type(int x)
 	if (sizeof_int == sizeof_uint)
 		return 6;
 
-	/* expect+1: warning: statement not reached [193] */
+	/* expect+1: warning: 'return' statement not reached [193] */
 	return 0;
 }
 

Index: src/tests/usr.bin/xlint/lint1/msg_161.c
diff -u src/tests/usr.bin/xlint/lint1/msg_161.c:1.11 src/tests/usr.bin/xlint/lint1/msg_161.c:1.12
--- src/tests/usr.bin/xlint/lint1/msg_161.c:1.11	Mon Jun 19 12:33:43 2023
+++ src/tests/usr.bin/xlint/lint1/msg_161.c	Wed Nov 13 04:32:49 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: msg_161.c,v 1.11 2023/06/19 12:33:43 rillig Exp $	*/
+/*	$NetBSD: msg_161.c,v 1.12 2024/11/13 04:32:49 rillig Exp $	*/
 # 3 "msg_161.c"
 
 // Test for message: constant in conditional context [161]
@@ -18,7 +18,7 @@ while_0(void)
 {
 	/* expect+1: warning: constant in conditional context [161] */
 	while (0) {
-		/* expect+1: warning: statement not reached [193] */
+		/* expect+1: warning: 'continue' statement not reached [193] */
 		continue;
 	}
 }

Index: src/tests/usr.bin/xlint/lint1/msg_193.c
diff -u src/tests/usr.bin/xlint/lint1/msg_193.c:1.21 src/tests/usr.bin/xlint/lint1/msg_193.c:1.22
--- src/tests/usr.bin/xlint/lint1/msg_193.c:1.21	Tue Mar 28 14:44:35 2023
+++ src/tests/usr.bin/xlint/lint1/msg_193.c	Wed Nov 13 04:32:49 2024
@@ -1,7 +1,7 @@
-/*	$NetBSD: msg_193.c,v 1.21 2023/03/28 14:44:35 rillig Exp $	*/
+/*	$NetBSD: msg_193.c,v 1.22 2024/11/13 04:32:49 rillig Exp $	*/
 # 3 "msg_193.c"
 
-// Test for message: statement not reached [193]
+// Test for message: '%s' statement not reached [193]
 
 /* lint1-extra-flags: -X 351 */
 
@@ -626,7 +626,7 @@ void
 lint_annotation_NOTREACHED(void)
 {
 	if (0) {
-		/* expect+1: warning: statement not reached [193] */
+		/* expect+1: warning: 'call' statement not reached [193] */
 		unreachable();
 	}
 
@@ -654,7 +654,7 @@ lint_annotation_NOTREACHED(void)
 	 * marks that branch as not reached, which means that any following
 	 * statement cannot be reached as well.
 	 */
-	/* expect+1: warning: statement not reached [193] */
+	/* expect+1: warning: 'if' statement not reached [193] */
 	if (1)
 		/* NOTREACHED */
 		suppressed();
@@ -703,7 +703,7 @@ test_null_statement(void)
 	for (int i = 0; i < 10; i++)
 		;
 
-	/* expect+1: warning: statement not reached [193] */
+	/* expect+1: warning: 'empty' statement not reached [193] */
 	return 0;;
 }
 

Index: src/tests/usr.bin/xlint/lint1/msg_207.c
diff -u src/tests/usr.bin/xlint/lint1/msg_207.c:1.4 src/tests/usr.bin/xlint/lint1/msg_207.c:1.5
--- src/tests/usr.bin/xlint/lint1/msg_207.c:1.4	Fri Apr 19 20:59:18 2024
+++ src/tests/usr.bin/xlint/lint1/msg_207.c	Wed Nov 13 04:32:49 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: msg_207.c,v 1.4 2024/04/19 20:59:18 rillig Exp $	*/
+/*	$NetBSD: msg_207.c,v 1.5 2024/11/13 04:32:49 rillig Exp $	*/
 # 3 "msg_207.c"
 
 // Test for message: loop not entered at top [207]
@@ -19,7 +19,7 @@ for_loop(void)
 	// XXX: Why is this different from the snippet above?
 	for (int i = 0; i < 10; i++)
 		if (0 == 1)
-			/* expect+1: warning: statement not reached [193] */
+			/* expect+1: warning: 'init' statement not reached [193] */
 			for (int j = 0;
 			    j < 5;
 			    /* expect+1: warning: end-of-loop code not reached [223] */

Index: src/tests/usr.bin/xlint/lint1/msg_217.c
diff -u src/tests/usr.bin/xlint/lint1/msg_217.c:1.14 src/tests/usr.bin/xlint/lint1/msg_217.c:1.15
--- src/tests/usr.bin/xlint/lint1/msg_217.c:1.14	Wed Nov 13 03:43:00 2024
+++ src/tests/usr.bin/xlint/lint1/msg_217.c	Wed Nov 13 04:32:49 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: msg_217.c,v 1.14 2024/11/13 03:43:00 rillig Exp $	*/
+/*	$NetBSD: msg_217.c,v 1.15 2024/11/13 04:32:49 rillig Exp $	*/
 # 3 "msg_217.c"
 
 // Test for message: function '%s' falls off bottom without returning value [217]
@@ -65,7 +65,7 @@ unreachable_continue_falls_through(void)
 {
 	for (;;) {
 		if (0)
-			/* expect+1: warning: statement not reached [193] */
+			/* expect+1: warning: 'continue' statement not reached [193] */
 			continue;
 		break;
 	}

Index: src/tests/usr.bin/xlint/lint1/msg_249.c
diff -u src/tests/usr.bin/xlint/lint1/msg_249.c:1.15 src/tests/usr.bin/xlint/lint1/msg_249.c:1.16
--- src/tests/usr.bin/xlint/lint1/msg_249.c:1.15	Sun Jan 28 08:17:27 2024
+++ src/tests/usr.bin/xlint/lint1/msg_249.c	Wed Nov 13 04:32:49 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: msg_249.c,v 1.15 2024/01/28 08:17:27 rillig Exp $	*/
+/*	$NetBSD: msg_249.c,v 1.16 2024/11/13 04:32:49 rillig Exp $	*/
 # 3 "msg_249.c"
 
 // Test for message: syntax error '%s' [249]
@@ -31,7 +31,7 @@ void
 function(void)
 {
 	if (0)
-		/* expect+1: warning: statement not reached [193] */
+		/* expect+1: warning: 'empty' statement not reached [193] */
 		;
 	/* expect+1: error: syntax error ')' [249] */
 	);

Index: src/tests/usr.bin/xlint/lint1/msg_333.c
diff -u src/tests/usr.bin/xlint/lint1/msg_333.c:1.7 src/tests/usr.bin/xlint/lint1/msg_333.c:1.8
--- src/tests/usr.bin/xlint/lint1/msg_333.c:1.7	Fri Jul  7 19:45:22 2023
+++ src/tests/usr.bin/xlint/lint1/msg_333.c	Wed Nov 13 04:32:49 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: msg_333.c,v 1.7 2023/07/07 19:45:22 rillig Exp $	*/
+/*	$NetBSD: msg_333.c,v 1.8 2024/11/13 04:32:49 rillig Exp $	*/
 # 3 "msg_333.c"
 
 // Test for message: controlling expression must be bool, not '%s' [333]
@@ -41,13 +41,13 @@ example(bool b, int i, const char *p)
 		return "pointer";
 
 	if (__lint_false) {
-		/* expect+1: warning: statement not reached [193] */
+		/* expect+1: warning: 'return' statement not reached [193] */
 		return "bool constant";
 	}
 
 	/* expect+1: error: controlling expression must be bool, not 'int' [333] */
 	if (0) {
-		/* expect+1: warning: statement not reached [193] */
+		/* expect+1: warning: 'return' statement not reached [193] */
 		return "integer constant";
 	}
 

Index: src/tests/usr.bin/xlint/lint1/msg_379.c
diff -u src/tests/usr.bin/xlint/lint1/msg_379.c:1.1 src/tests/usr.bin/xlint/lint1/msg_379.c:1.2
--- src/tests/usr.bin/xlint/lint1/msg_379.c:1.1	Sat May 11 15:53:38 2024
+++ src/tests/usr.bin/xlint/lint1/msg_379.c	Wed Nov 13 04:32:50 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: msg_379.c,v 1.1 2024/05/11 15:53:38 rillig Exp $	*/
+/*	$NetBSD: msg_379.c,v 1.2 2024/11/13 04:32:50 rillig Exp $	*/
 # 3 "msg_379.c"
 
 // Test for message: comparing integer '%s' to floating point constant %Lg [379]
@@ -18,7 +18,7 @@ int
 comparisons(int x)
 {
 	if (3 > 123.0)
-		/* expect+1: warning: statement not reached [193] */
+		/* expect+1: warning: 'return' statement not reached [193] */
 		return 0;
 	/* expect+1: warning: comparing integer 'int' to floating point constant 123 [379] */
 	if (x > 123.0)

Index: src/usr.bin/xlint/lint1/cgram.y
diff -u src/usr.bin/xlint/lint1/cgram.y:1.514 src/usr.bin/xlint/lint1/cgram.y:1.515
--- src/usr.bin/xlint/lint1/cgram.y:1.514	Wed Nov 13 03:43:00 2024
+++ src/usr.bin/xlint/lint1/cgram.y	Wed Nov 13 04:32:49 2024
@@ -1,5 +1,5 @@
 %{
-/* $NetBSD: cgram.y,v 1.514 2024/11/13 03:43:00 rillig Exp $ */
+/* $NetBSD: cgram.y,v 1.515 2024/11/13 04:32:49 rillig Exp $ */
 
 /*
  * Copyright (c) 1996 Christopher G. Demetriou.  All Rights Reserved.
@@ -35,7 +35,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID)
-__RCSID("$NetBSD: cgram.y,v 1.514 2024/11/13 03:43:00 rillig Exp $");
+__RCSID("$NetBSD: cgram.y,v 1.515 2024/11/13 04:32:49 rillig Exp $");
 #endif
 
 #include <limits.h>
@@ -712,7 +712,8 @@ gcc_statement_expr_item:
 			/* XXX: do that only on the last name */
 			if ($1->tn_op == NAME)
 				$1->u.sym->s_used = true;
-			expr($1, true, false, false, false);
+			expr($1, true, false, false, false,
+			    "statement expression");
 			suppress_fallthrough = false;
 			$$ = $1;
 		}
@@ -2137,25 +2138,39 @@ block_item:
 /* C99 6.8.3, C23 6.8.4 */
 expression_statement:
 	expression T_SEMI {
-		expr($1, false, false, false, false);
+		/*
+		 * Even though a "call statement" is not a formally defined
+		 * term in the C standards, it occurs so often that it's
+		 * helpful to have a distinguishable term for it.
+		 */
+		expr($1, false, false, false, false,
+		    $1 != NULL && $1->tn_op == CALL ? "call" : "expression");
 		suppress_fallthrough = false;
 		if ($1 != NULL && $1->tn_op == CALL
 		    && $1->u.call->func->tn_type->t_subt->t_noreturn)
 			stmt_call_noreturn();
 	}
 |	T_SEMI {
-		check_statement_reachable();
+		check_statement_reachable("empty");
 		suppress_fallthrough = false;
 	}
 |	attribute_specifier_sequence expression T_SEMI {
 		debug_attribute_list(&$1);
-		expr($2, false, false, false, false);
+		/*
+		 * Even though a "call statement" is not a formally defined
+		 * term in the C standards, it occurs so often that it's
+		 * helpful to have a distinguishable term for it.
+		 */
+		expr($2, false, false, false, false,
+		    $2 != NULL && $2->tn_op == CALL ? "call" : "expression");
 		suppress_fallthrough = false;
 	}
 |	attribute_specifier_sequence T_SEMI {
+		bool is_fallthrough = attributes_contain(&$1, "fallthrough");
 		debug_attribute_list(&$1);
-		check_statement_reachable();
-		suppress_fallthrough = attributes_contain(&$1, "fallthrough");
+		check_statement_reachable(
+		    is_fallthrough ? "fallthrough" : "empty");
+		suppress_fallthrough = is_fallthrough;
 	}
 ;
 

Index: src/usr.bin/xlint/lint1/err.c
diff -u src/usr.bin/xlint/lint1/err.c:1.252 src/usr.bin/xlint/lint1/err.c:1.253
--- src/usr.bin/xlint/lint1/err.c:1.252	Thu Oct 31 10:32:08 2024
+++ src/usr.bin/xlint/lint1/err.c	Wed Nov 13 04:32:49 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: err.c,v 1.252 2024/10/31 10:32:08 rillig Exp $	*/
+/*	$NetBSD: err.c,v 1.253 2024/11/13 04:32:49 rillig Exp $	*/
 
 /*
  * Copyright (c) 1994, 1995 Jochen Pohl
@@ -37,7 +37,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID)
-__RCSID("$NetBSD: err.c,v 1.252 2024/10/31 10:32:08 rillig Exp $");
+__RCSID("$NetBSD: err.c,v 1.253 2024/11/13 04:32:49 rillig Exp $");
 #endif
 
 #include <limits.h>
@@ -248,7 +248,7 @@ static const char *const msgs[] = {
 	"empty array declaration for '%s'",				// 190
 	"'%s' set but not used in function '%s'",			// 191
 	"'%s' unused in function '%s'",					// 192
-	"statement not reached",					// 193
+	"'%s' statement not reached",					// 193
 	"label '%s' redefined",						// 194
 	"case not in switch",						// 195
 	"case label affected by conversion",				// 196

Index: src/usr.bin/xlint/lint1/externs1.h
diff -u src/usr.bin/xlint/lint1/externs1.h:1.234 src/usr.bin/xlint/lint1/externs1.h:1.235
--- src/usr.bin/xlint/lint1/externs1.h:1.234	Wed Nov 13 03:43:00 2024
+++ src/usr.bin/xlint/lint1/externs1.h	Wed Nov 13 04:32:49 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: externs1.h,v 1.234 2024/11/13 03:43:00 rillig Exp $	*/
+/*	$NetBSD: externs1.h,v 1.235 2024/11/13 04:32:49 rillig Exp $	*/
 
 /*
  * Copyright (c) 1994, 1995 Jochen Pohl
@@ -301,7 +301,7 @@ tnode_t *cast(tnode_t *, bool, type_t *)
 void add_function_argument(function_call *, tnode_t *);
 tnode_t *build_function_call(tnode_t *, bool, function_call *);
 val_t *integer_constant(tnode_t *, bool);
-void expr(tnode_t *, bool, bool, bool, bool);
+void expr(tnode_t *, bool, bool, bool, bool, const char *);
 void check_expr_misc(const tnode_t *, bool, bool, bool, bool, bool, bool);
 bool constant_addr(const tnode_t *, const sym_t **, ptrdiff_t *);
 buffer *cat_strings(buffer *, buffer *);
@@ -339,7 +339,7 @@ extern bool suppress_longlong;
 
 void begin_control_statement(control_statement_kind);
 void end_control_statement(control_statement_kind);
-void check_statement_reachable(void);
+void check_statement_reachable(const char *);
 void begin_function(sym_t *);
 void end_function(void);
 void named_label(sym_t *);

Index: src/usr.bin/xlint/lint1/func.c
diff -u src/usr.bin/xlint/lint1/func.c:1.188 src/usr.bin/xlint/lint1/func.c:1.189
--- src/usr.bin/xlint/lint1/func.c:1.188	Wed Nov 13 03:43:00 2024
+++ src/usr.bin/xlint/lint1/func.c	Wed Nov 13 04:32:49 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: func.c,v 1.188 2024/11/13 03:43:00 rillig Exp $	*/
+/*	$NetBSD: func.c,v 1.189 2024/11/13 04:32:49 rillig Exp $	*/
 
 /*
  * Copyright (c) 1994, 1995 Jochen Pohl
@@ -37,7 +37,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID)
-__RCSID("$NetBSD: func.c,v 1.188 2024/11/13 03:43:00 rillig Exp $");
+__RCSID("$NetBSD: func.c,v 1.189 2024/11/13 04:32:49 rillig Exp $");
 #endif
 
 #include <stdlib.h>
@@ -181,11 +181,11 @@ set_reached(bool new_reached)
  * Prints a warning if a statement cannot be reached.
  */
 void
-check_statement_reachable(void)
+check_statement_reachable(const char *stmt_kind)
 {
 	if (!reached && warn_about_unreachable) {
-		/* statement not reached */
-		warning(193);
+		/* '%s' statement not reached */
+		warning(193, stmt_kind);
 		warn_about_unreachable = false;
 	}
 }
@@ -408,8 +408,8 @@ check_case_label_bitand(const tnode_t *c
 	uint64_t mask = (uint64_t)switch_expr->u.ops.right->u.value.u.integer;
 
 	if ((case_value & ~mask) != 0)
-		/* statement not reached */
-		warning(193);
+		/* '%s' statement not reached */
+		warning(193, "case");
 }
 
 static void
@@ -579,7 +579,7 @@ stmt_if_expr(tnode_t *tn)
 	if (tn != NULL)
 		tn = check_controlling_expression(tn, false);
 	if (tn != NULL)
-		expr(tn, false, true, false, false);
+		expr(tn, false, true, false, false, "if");
 	begin_control_statement(CS_IF);
 
 	if (tn != NULL && tn->tn_op == CON && !tn->tn_system_dependent) {
@@ -648,7 +648,7 @@ stmt_switch_expr(tnode_t *tn)
 	(void)expr_save_memory();
 
 	check_getopt_begin_switch();
-	expr(tn, true, false, false, false);
+	expr(tn, true, false, false, false, "switch");
 
 	begin_control_statement(CS_SWITCH);
 	cstmt->c_switch = true;
@@ -730,7 +730,7 @@ stmt_while_expr(tnode_t *tn)
 	bool body_reached = !is_zero(tn);
 
 	check_getopt_begin_while(tn);
-	expr(tn, false, true, true, false);
+	expr(tn, false, true, true, false, "while");
 
 	set_reached(body_reached);
 }
@@ -772,7 +772,7 @@ stmt_do_while_expr(tnode_t *tn)
 			error(323);
 	}
 
-	expr(tn, false, true, true, true);
+	expr(tn, false, true, true, true, "do-while");
 
 	if (cstmt->c_maybe_endless)
 		set_reached(false);
@@ -809,12 +809,12 @@ stmt_for_exprs(tnode_t *tn1, tnode_t *tn
 	cstmt->c_for_expr3_csrc_pos = csrc_pos;
 
 	if (tn1 != NULL)
-		expr(tn1, false, false, true, false);
+		expr(tn1, false, false, true, false, "for");
 
 	if (tn2 != NULL)
 		tn2 = check_controlling_expression(tn2, false);
 	if (tn2 != NULL)
-		expr(tn2, false, true, true, false);
+		expr(tn2, false, true, true, false, "for");
 
 	cstmt->c_maybe_endless = tn2 == NULL || is_nonzero(tn2);
 
@@ -845,7 +845,7 @@ stmt_for_exprs_stmt(void)
 	}
 
 	if (tn3 != NULL)
-		expr(tn3, false, false, true, false);
+		expr(tn3, false, false, true, false, "for continuation");
 	else
 		expr_free_all();
 
@@ -861,7 +861,7 @@ void
 stmt_goto(sym_t *lab)
 {
 	mark_as_used(lab, false, false);
-	check_statement_reachable();
+	check_statement_reachable("goto");
 	set_reached(false);
 }
 
@@ -879,7 +879,7 @@ stmt_break(void)
 		cs->c_break = true;
 
 	if (bflag)
-		check_statement_reachable();
+		check_statement_reachable("break");
 
 	set_reached(false);
 }
@@ -899,7 +899,7 @@ stmt_continue(void)
 		/* TODO: only if reachable, for symmetry with c_break */
 		cs->c_continue = true;
 
-	check_statement_reachable();
+	check_statement_reachable("continue");
 
 	set_reached(false);
 }
@@ -945,7 +945,7 @@ check_return_value(bool sys, tnode_t *tn
 			warning(302, funcsym->s_name);
 	}
 
-	expr(retn, true, false, true, false);
+	expr(retn, true, false, true, false, "return");
 }
 
 void
@@ -986,7 +986,7 @@ stmt_return(bool sys, tnode_t *tn)
 	if (tn != NULL)
 		check_return_value(sys, tn);
 	else
-		check_statement_reachable();
+		check_statement_reachable("return");
 
 	set_reached(false);
 }

Index: src/usr.bin/xlint/lint1/init.c
diff -u src/usr.bin/xlint/lint1/init.c:1.270 src/usr.bin/xlint/lint1/init.c:1.271
--- src/usr.bin/xlint/lint1/init.c:1.270	Thu Aug 29 20:35:19 2024
+++ src/usr.bin/xlint/lint1/init.c	Wed Nov 13 04:32:49 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: init.c,v 1.270 2024/08/29 20:35:19 rillig Exp $	*/
+/*	$NetBSD: init.c,v 1.271 2024/11/13 04:32:49 rillig Exp $	*/
 
 /*
  * Copyright (c) 1994, 1995 Jochen Pohl
@@ -38,7 +38,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID)
-__RCSID("$NetBSD: init.c,v 1.270 2024/08/29 20:35:19 rillig Exp $");
+__RCSID("$NetBSD: init.c,v 1.271 2024/11/13 04:32:49 rillig Exp $");
 #endif
 
 #include <stdlib.h>
@@ -263,7 +263,7 @@ check_init_expr(const type_t *ltp, sym_t
 		return;
 
 	memory_pool saved_mem = expr_save_memory();
-	expr(rn, true, false, true, false);
+	expr(rn, true, false, true, false, "init");
 	expr_restore_memory(saved_mem);
 
 	tspec_t lt = ln->tn_type->t_tspec;
@@ -833,7 +833,7 @@ initialization_expr_using_op(initializat
 	ln->tn_type = expr_unqualified_type(ln->tn_type);
 
 	tnode_t *tn = build_binary(ln, INIT, false /* XXX */, rn);
-	expr(tn, false, false, false, false);
+	expr(tn, false, false, false, false, "init");
 
 	return true;
 }

Index: src/usr.bin/xlint/lint1/tree.c
diff -u src/usr.bin/xlint/lint1/tree.c:1.657 src/usr.bin/xlint/lint1/tree.c:1.658
--- src/usr.bin/xlint/lint1/tree.c:1.657	Thu Oct 31 10:32:08 2024
+++ src/usr.bin/xlint/lint1/tree.c	Wed Nov 13 04:32:49 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: tree.c,v 1.657 2024/10/31 10:32:08 rillig Exp $	*/
+/*	$NetBSD: tree.c,v 1.658 2024/11/13 04:32:49 rillig Exp $	*/
 
 /*
  * Copyright (c) 1994, 1995 Jochen Pohl
@@ -37,7 +37,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID)
-__RCSID("$NetBSD: tree.c,v 1.657 2024/10/31 10:32:08 rillig Exp $");
+__RCSID("$NetBSD: tree.c,v 1.658 2024/11/13 04:32:49 rillig Exp $");
 #endif
 
 #include <float.h>
@@ -4524,7 +4524,8 @@ is_constcond_false(const tnode_t *tn, ts
  * memory which is used for the expression.
  */
 void
-expr(tnode_t *tn, bool vctx, bool cond, bool dofreeblk, bool is_do_while)
+expr(tnode_t *tn, bool vctx, bool cond, bool dofreeblk, bool is_do_while,
+    const char *stmt_kind)
 {
 
 	if (tn == NULL) {	/* in case of errors */
@@ -4534,7 +4535,7 @@ expr(tnode_t *tn, bool vctx, bool cond, 
 
 	/* expr() is also called in global initializations */
 	if (dcs->d_kind != DLK_EXTERN && !is_do_while)
-		check_statement_reachable();
+		check_statement_reachable(stmt_kind);
 
 	check_expr_misc(tn, vctx, cond, !cond, false, false, false);
 	if (tn->tn_op == ASSIGN && !tn->tn_parenthesized) {

Reply via email to