Module Name: src
Committed By: rillig
Date: Tue Sep 12 07:23:27 UTC 2023
Modified Files:
src/tests/usr.bin/xlint/lint1: msg_192.c
src/usr.bin/xlint/lint1: tree.c
Log Message:
lint: mark symbols that are only used in untaken '?:' branch as used
To generate a diff of this commit:
cvs rdiff -u -r1.7 -r1.8 src/tests/usr.bin/xlint/lint1/msg_192.c
cvs rdiff -u -r1.578 -r1.579 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/msg_192.c
diff -u src/tests/usr.bin/xlint/lint1/msg_192.c:1.7 src/tests/usr.bin/xlint/lint1/msg_192.c:1.8
--- src/tests/usr.bin/xlint/lint1/msg_192.c:1.7 Tue Sep 12 06:51:02 2023
+++ src/tests/usr.bin/xlint/lint1/msg_192.c Tue Sep 12 07:23:27 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_192.c,v 1.7 2023/09/12 06:51:02 rillig Exp $ */
+/* $NetBSD: msg_192.c,v 1.8 2023/09/12 07:23:27 rillig Exp $ */
# 3 "msg_192.c"
// Test for message: '%s' unused in function '%s' [192]
@@ -16,13 +16,15 @@ example(int param)
void assertion_failed(const char *);
+/*
+ * The symbol '__func__' only occurs in an unreachable branch. It is
+ * nevertheless marked as used.
+ */
void
assert_true(void)
{
sizeof(char) == 1
? (void)0
-/* FIXME: '__func__' is used, the code is just not reachable. */
-/* expect+1: warning: '__func__' unused in function 'assert_true' [192] */
: assertion_failed(__func__);
}
Index: src/usr.bin/xlint/lint1/tree.c
diff -u src/usr.bin/xlint/lint1/tree.c:1.578 src/usr.bin/xlint/lint1/tree.c:1.579
--- src/usr.bin/xlint/lint1/tree.c:1.578 Sat Aug 26 10:43:53 2023
+++ src/usr.bin/xlint/lint1/tree.c Tue Sep 12 07:23:27 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: tree.c,v 1.578 2023/08/26 10:43:53 rillig Exp $ */
+/* $NetBSD: tree.c,v 1.579 2023/09/12 07:23:27 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.578 2023/08/26 10:43:53 rillig Exp $");
+__RCSID("$NetBSD: tree.c,v 1.579 2023/09/12 07:23:27 rillig Exp $");
#endif
#include <float.h>
@@ -1635,6 +1635,25 @@ fold_float(tnode_t *tn)
return build_constant(tn->tn_type, v);
}
+static void
+use(const tnode_t *tn)
+{
+ if (tn == NULL)
+ return;
+ switch (tn->tn_op) {
+ case NAME:
+ mark_as_used(tn->tn_sym, false /* XXX */, false /* XXX */);
+ break;
+ case CON:
+ case STRING:
+ break;
+ default:
+ use(tn->tn_left);
+ if (is_binary(tn))
+ use(tn->tn_right);
+ }
+}
+
/*
* Create a tree node for a binary operator and its two operands. Also called
* for unary operators; in that case rn is NULL.
@@ -1809,6 +1828,8 @@ build_binary(tnode_t *ln, op_t op, bool
ntn = fold(ntn);
}
} else if (op == QUEST && ln->tn_op == CON) {
+ use(ln->tn_val.u.integer != 0
+ ? rn->tn_right : rn->tn_left);
ntn = ln->tn_val.u.integer != 0
? rn->tn_left : rn->tn_right;
}