Module Name: src
Committed By: rillig
Date: Sat Apr 16 20:57:10 UTC 2022
Modified Files:
src/tests/usr.bin/xlint/lint1: msg_161.c msg_161.exp
src/usr.bin/xlint/lint1: lint1.h tree.c
Log Message:
lint: investigate why lint only warns about some constant conditions
Noticed in lex.c, in the macro kwdef, where lint complains about the
condition containing '||' but not about the conditions containing only
'>' or '=='.
To generate a diff of this commit:
cvs rdiff -u -r1.7 -r1.8 src/tests/usr.bin/xlint/lint1/msg_161.c
cvs rdiff -u -r1.6 -r1.7 src/tests/usr.bin/xlint/lint1/msg_161.exp
cvs rdiff -u -r1.152 -r1.153 src/usr.bin/xlint/lint1/lint1.h
cvs rdiff -u -r1.430 -r1.431 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_161.c
diff -u src/tests/usr.bin/xlint/lint1/msg_161.c:1.7 src/tests/usr.bin/xlint/lint1/msg_161.c:1.8
--- src/tests/usr.bin/xlint/lint1/msg_161.c:1.7 Sun Mar 21 15:44:57 2021
+++ src/tests/usr.bin/xlint/lint1/msg_161.c Sat Apr 16 20:57:10 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_161.c,v 1.7 2021/03/21 15:44:57 rillig Exp $ */
+/* $NetBSD: msg_161.c,v 1.8 2022/04/16 20:57:10 rillig Exp $ */
# 3 "msg_161.c"
// Test for message: constant in conditional context [161]
@@ -55,3 +55,22 @@ test_sizeof(void)
if (sizeof(int) < sizeof(char))
println("impossible");
}
+
+const _Bool conditions[] = {
+ /* XXX: Why no warning here? */
+ 13 < 13,
+ /* XXX: Why no warning here? */
+ 0 < 0,
+ /* XXX: Why no warning here? */
+ 0 != 0,
+ /* expect+1: warning: constant in conditional context [161] */
+ 0 == 0 && 1 == 0,
+ /* expect+1: warning: constant in conditional context [161] */
+ 1 == 0 || 2 == 1,
+ /* expect+2: warning: constant in conditional context [161] */
+ /* expect+1: error: non-constant initializer [177] */
+ 0 == 0 && ""[0] == '\0',
+ /* expect+2: warning: constant in conditional context [161] */
+ /* expect+1: error: non-constant initializer [177] */
+ ""[0] == '\0' && 0 == 0,
+};
Index: src/tests/usr.bin/xlint/lint1/msg_161.exp
diff -u src/tests/usr.bin/xlint/lint1/msg_161.exp:1.6 src/tests/usr.bin/xlint/lint1/msg_161.exp:1.7
--- src/tests/usr.bin/xlint/lint1/msg_161.exp:1.6 Sun Mar 21 15:44:57 2021
+++ src/tests/usr.bin/xlint/lint1/msg_161.exp Sat Apr 16 20:57:10 2022
@@ -2,3 +2,9 @@ msg_161.c(11): warning: constant in cond
msg_161.c(18): warning: constant in conditional context [161]
msg_161.c(19): warning: statement not reached [193]
msg_161.c(41): warning: constant in conditional context [161]
+msg_161.c(67): warning: constant in conditional context [161]
+msg_161.c(69): warning: constant in conditional context [161]
+msg_161.c(72): warning: constant in conditional context [161]
+msg_161.c(72): error: non-constant initializer [177]
+msg_161.c(75): warning: constant in conditional context [161]
+msg_161.c(75): error: non-constant initializer [177]
Index: src/usr.bin/xlint/lint1/lint1.h
diff -u src/usr.bin/xlint/lint1/lint1.h:1.152 src/usr.bin/xlint/lint1/lint1.h:1.153
--- src/usr.bin/xlint/lint1/lint1.h:1.152 Sat Apr 16 19:18:17 2022
+++ src/usr.bin/xlint/lint1/lint1.h Sat Apr 16 20:57:10 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: lint1.h,v 1.152 2022/04/16 19:18:17 rillig Exp $ */
+/* $NetBSD: lint1.h,v 1.153 2022/04/16 20:57:10 rillig Exp $ */
/*
* Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved.
@@ -493,6 +493,7 @@ check_printf(const char *fmt, ...)
# define wrap_check_printf(func, msgid, args...) \
({ \
+ debug_step("%s:%d: %s", __FILE__, __LINE__, __func__); \
check_printf(__CONCAT(MSG_, msgid), ##args); \
(func)(msgid, ##args); \
/* LINTED 129 */ \
Index: src/usr.bin/xlint/lint1/tree.c
diff -u src/usr.bin/xlint/lint1/tree.c:1.430 src/usr.bin/xlint/lint1/tree.c:1.431
--- src/usr.bin/xlint/lint1/tree.c:1.430 Sat Apr 16 20:02:55 2022
+++ src/usr.bin/xlint/lint1/tree.c Sat Apr 16 20:57:10 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: tree.c,v 1.430 2022/04/16 20:02:55 rillig Exp $ */
+/* $NetBSD: tree.c,v 1.431 2022/04/16 20:57:10 rillig Exp $ */
/*
* Copyright (c) 1994, 1995 Jochen Pohl
@@ -37,7 +37,7 @@
#include <sys/cdefs.h>
#if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: tree.c,v 1.430 2022/04/16 20:02:55 rillig Exp $");
+__RCSID("$NetBSD: tree.c,v 1.431 2022/04/16 20:57:10 rillig Exp $");
#endif
#include <float.h>
@@ -534,7 +534,7 @@ build_binary(tnode_t *ln, op_t op, bool
/*
* Apply class conversions to the left operand, but only if its
- * value is needed or it is compared with null.
+ * value is needed or it is compared with zero.
*/
if (mp->m_left_value_context || mp->m_left_test_context)
ln = cconv(ln);
@@ -549,21 +549,14 @@ build_binary(tnode_t *ln, op_t op, bool
* Print some warnings for comparisons of unsigned values with
* constants lower than or equal to null. This must be done
* before promote() because otherwise unsigned char and unsigned
- * short would be promoted to int. Also types are tested to be
+ * short would be promoted to int. Types are also tested to be
* CHAR, which would also become int.
*/
if (mp->m_comparison)
check_integer_comparison(op, ln, rn);
- /*
- * Promote the left operand if it is in a test or value context
- */
if (mp->m_left_value_context || mp->m_left_test_context)
ln = promote(op, false, ln);
- /*
- * Promote the right operand, but only if it is no struct or
- * union member, or if it is not to be assigned to the left operand
- */
if (mp->m_binary && op != ARROW && op != POINT &&
op != ASSIGN && op != RETURN && op != INIT) {
rn = promote(op, false, rn);
@@ -653,7 +646,7 @@ build_binary(tnode_t *ln, op_t op, bool
default:
rettp = mp->m_returns_bool
? gettyp(Tflag ? BOOL : INT) : ln->tn_type;
- lint_assert(mp->m_binary || rn == NULL);
+ lint_assert(mp->m_binary == (rn != NULL));
ntn = new_tnode(op, sys, rettp, ln, rn);
break;
}
@@ -670,14 +663,14 @@ build_binary(tnode_t *ln, op_t op, bool
* Print a warning if one of the operands is in a context where
* it is compared with zero and if this operand is a constant.
*/
- if (mp->m_left_test_context) {
- if (ln->tn_op == CON ||
- ((mp->m_binary && op != QUEST) && rn->tn_op == CON)) {
- if (hflag && !constcond_flag &&
- !ln->tn_system_dependent)
- /* constant in conditional context */
- warning(161);
- }
+ if (hflag && !constcond_flag &&
+ mp->m_left_test_context &&
+ (ln->tn_op == CON ||
+ ((mp->m_binary && op != QUEST) && rn->tn_op == CON)) &&
+ /* XXX: rn->tn_system_dependent should be checked as well */
+ !ln->tn_system_dependent) {
+ /* constant in conditional context */
+ warning(161);
}
/* Fold if the operator requires it */