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; }