Module Name: src
Committed By: rillig
Date: Sun Jan 31 12:44:34 UTC 2021
Modified Files:
src/tests/usr.bin/xlint/lint1: msg_161.c msg_161.exp
src/usr.bin/xlint/lint1: cgram.y externs1.h func.c init.c tree.c
Log Message:
lint: don't warn about constant condition in 'do { } while (0)'
To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/tests/usr.bin/xlint/lint1/msg_161.c
cvs rdiff -u -r1.2 -r1.3 src/tests/usr.bin/xlint/lint1/msg_161.exp
cvs rdiff -u -r1.159 -r1.160 src/usr.bin/xlint/lint1/cgram.y
cvs rdiff -u -r1.64 -r1.65 src/usr.bin/xlint/lint1/externs1.h
cvs rdiff -u -r1.66 -r1.67 src/usr.bin/xlint/lint1/func.c
cvs rdiff -u -r1.65 -r1.66 src/usr.bin/xlint/lint1/init.c
cvs rdiff -u -r1.201 -r1.202 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.3 src/tests/usr.bin/xlint/lint1/msg_161.c:1.4
--- src/tests/usr.bin/xlint/lint1/msg_161.c:1.3 Sun Jan 31 12:30:53 2021
+++ src/tests/usr.bin/xlint/lint1/msg_161.c Sun Jan 31 12:44:34 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_161.c,v 1.3 2021/01/31 12:30:53 rillig Exp $ */
+/* $NetBSD: msg_161.c,v 1.4 2021/01/31 12:44:34 rillig Exp $ */
# 3 "msg_161.c"
// Test for message: constant in conditional context [161]
@@ -23,14 +23,14 @@ while_0(void)
* The pattern 'do { } while (0)' is a common technique to define a
* preprocessor macro that behaves like a single statement. There is
* nothing unusual or surprising about the constant condition.
- * Still, lint warns about it. FIXME don't.
+ * Before tree.c 1.202 from 2021-01-31, lint warned about it.
*/
void
do_while_0(void)
{
do {
- } while (0); /* expect: 161 */
+ } while (0);
}
void
Index: src/tests/usr.bin/xlint/lint1/msg_161.exp
diff -u src/tests/usr.bin/xlint/lint1/msg_161.exp:1.2 src/tests/usr.bin/xlint/lint1/msg_161.exp:1.3
--- src/tests/usr.bin/xlint/lint1/msg_161.exp:1.2 Sun Jan 31 12:29:16 2021
+++ src/tests/usr.bin/xlint/lint1/msg_161.exp Sun Jan 31 12:44:34 2021
@@ -1,4 +1,3 @@
msg_161.c(11): warning: constant in conditional context [161]
msg_161.c(18): warning: constant in conditional context [161]
-msg_161.c(33): warning: constant in conditional context [161]
msg_161.c(41): warning: constant in conditional context [161]
Index: src/usr.bin/xlint/lint1/cgram.y
diff -u src/usr.bin/xlint/lint1/cgram.y:1.159 src/usr.bin/xlint/lint1/cgram.y:1.160
--- src/usr.bin/xlint/lint1/cgram.y:1.159 Sun Jan 31 11:23:01 2021
+++ src/usr.bin/xlint/lint1/cgram.y Sun Jan 31 12:44:34 2021
@@ -1,5 +1,5 @@
%{
-/* $NetBSD: cgram.y,v 1.159 2021/01/31 11:23:01 rillig Exp $ */
+/* $NetBSD: cgram.y,v 1.160 2021/01/31 12:44:34 rillig Exp $ */
/*
* Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved.
@@ -35,7 +35,7 @@
#include <sys/cdefs.h>
#if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: cgram.y,v 1.159 2021/01/31 11:23:01 rillig Exp $");
+__RCSID("$NetBSD: cgram.y,v 1.160 2021/01/31 12:44:34 rillig Exp $");
#endif
#include <limits.h>
@@ -1557,7 +1557,7 @@ statement_list:
expr_statement:
expr T_SEMI {
- expr($1, 0, 0, 0);
+ expr($1, false, false, false, false);
ftflg = false;
}
| T_SEMI {
@@ -1576,7 +1576,7 @@ expr_statement_val:
if ($1->tn_op == NAME)
$1->tn_sym->s_used = true;
$$ = $1;
- expr($1, 0, 0, 0);
+ expr($1, false, false, false, false);
ftflg = false;
}
| non_expr_statement {
Index: src/usr.bin/xlint/lint1/externs1.h
diff -u src/usr.bin/xlint/lint1/externs1.h:1.64 src/usr.bin/xlint/lint1/externs1.h:1.65
--- src/usr.bin/xlint/lint1/externs1.h:1.64 Sat Jan 30 18:16:45 2021
+++ src/usr.bin/xlint/lint1/externs1.h Sun Jan 31 12:44:34 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: externs1.h,v 1.64 2021/01/30 18:16:45 rillig Exp $ */
+/* $NetBSD: externs1.h,v 1.65 2021/01/31 12:44:34 rillig Exp $ */
/*
* Copyright (c) 1994, 1995 Jochen Pohl
@@ -216,7 +216,7 @@ extern tnode_t *cast(tnode_t *, type_t *
extern tnode_t *new_function_argument_node(tnode_t *, tnode_t *);
extern tnode_t *new_function_call_node(tnode_t *, tnode_t *);
extern val_t *constant(tnode_t *, bool);
-extern void expr(tnode_t *, bool, bool, bool);
+extern void expr(tnode_t *, bool, bool, bool, bool);
extern void check_expr_misc(const tnode_t *, bool, bool, bool,
bool, bool, bool);
extern bool constant_addr(tnode_t *, sym_t **, ptrdiff_t *);
Index: src/usr.bin/xlint/lint1/func.c
diff -u src/usr.bin/xlint/lint1/func.c:1.66 src/usr.bin/xlint/lint1/func.c:1.67
--- src/usr.bin/xlint/lint1/func.c:1.66 Sat Jan 30 18:16:45 2021
+++ src/usr.bin/xlint/lint1/func.c Sun Jan 31 12:44:34 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: func.c,v 1.66 2021/01/30 18:16:45 rillig Exp $ */
+/* $NetBSD: func.c,v 1.67 2021/01/31 12:44:34 rillig Exp $ */
/*
* Copyright (c) 1994, 1995 Jochen Pohl
@@ -37,7 +37,7 @@
#include <sys/cdefs.h>
#if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: func.c,v 1.66 2021/01/30 18:16:45 rillig Exp $");
+__RCSID("$NetBSD: func.c,v 1.67 2021/01/31 12:44:34 rillig Exp $");
#endif
#include <stdlib.h>
@@ -569,7 +569,7 @@ if1(tnode_t *tn)
if (tn != NULL)
tn = check_controlling_expression(tn);
if (tn != NULL)
- expr(tn, false, true, false);
+ expr(tn, false, true, false, false);
pushctrl(T_IF);
}
@@ -642,7 +642,7 @@ switch1(tnode_t *tn)
tp->t_tspec = INT;
}
- expr(tn, true, false, true);
+ expr(tn, true, false, true, false);
pushctrl(T_SWITCH);
cstmt->c_switch = true;
@@ -726,7 +726,7 @@ while1(tnode_t *tn)
if (tn != NULL && tn->tn_op == CON)
cstmt->c_infinite = is_nonzero(tn);
- expr(tn, false, true, true);
+ expr(tn, false, true, true, false);
}
/*
@@ -789,7 +789,7 @@ do2(tnode_t *tn)
error(323);
}
- expr(tn, false, true, true);
+ expr(tn, false, true, true, true);
/*
* The end of the loop is only reached if it is no endless loop
@@ -832,12 +832,12 @@ for1(tnode_t *tn1, tnode_t *tn2, tnode_t
cstmt->c_cfpos = csrc_pos;
if (tn1 != NULL)
- expr(tn1, false, false, true);
+ expr(tn1, false, false, true, false);
if (tn2 != NULL)
tn2 = check_controlling_expression(tn2);
if (tn2 != NULL)
- expr(tn2, false, true, true);
+ expr(tn2, false, true, true, false);
cstmt->c_infinite =
tn2 == NULL || (tn2->tn_op == CON && is_nonzero(tn2));
@@ -877,7 +877,7 @@ for2(void)
}
if (tn3 != NULL) {
- expr(tn3, false, false, true);
+ expr(tn3, false, false, true, false);
} else {
tfreeblk();
}
@@ -1013,7 +1013,7 @@ doreturn(tnode_t *tn)
}
}
- expr(tn, true, false, true);
+ expr(tn, true, false, true, false);
} else {
Index: src/usr.bin/xlint/lint1/init.c
diff -u src/usr.bin/xlint/lint1/init.c:1.65 src/usr.bin/xlint/lint1/init.c:1.66
--- src/usr.bin/xlint/lint1/init.c:1.65 Sat Jan 30 18:16:45 2021
+++ src/usr.bin/xlint/lint1/init.c Sun Jan 31 12:44:34 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: init.c,v 1.65 2021/01/30 18:16:45 rillig Exp $ */
+/* $NetBSD: init.c,v 1.66 2021/01/31 12:44:34 rillig Exp $ */
/*
* Copyright (c) 1994, 1995 Jochen Pohl
@@ -37,7 +37,7 @@
#include <sys/cdefs.h>
#if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: init.c,v 1.65 2021/01/30 18:16:45 rillig Exp $");
+__RCSID("$NetBSD: init.c,v 1.66 2021/01/31 12:44:34 rillig Exp $");
#endif
#include <stdlib.h>
@@ -584,7 +584,7 @@ mkinit(tnode_t *tn)
ln->tn_type = tduptyp(ln->tn_type);
ln->tn_type->t_const = false;
tn = build(ASSIGN, ln, tn);
- expr(tn, false, false, false);
+ expr(tn, false, false, false, false);
return;
}
@@ -628,7 +628,7 @@ mkinit(tnode_t *tn)
* expr() would free it.
*/
tmem = tsave();
- expr(tn, true, false, true);
+ expr(tn, true, false, true, false);
trestor(tmem);
if (is_integer(lt) && ln->tn_type->t_bitfield && !is_integer(rt)) {
Index: src/usr.bin/xlint/lint1/tree.c
diff -u src/usr.bin/xlint/lint1/tree.c:1.201 src/usr.bin/xlint/lint1/tree.c:1.202
--- src/usr.bin/xlint/lint1/tree.c:1.201 Sun Jan 31 12:20:00 2021
+++ src/usr.bin/xlint/lint1/tree.c Sun Jan 31 12:44:34 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: tree.c,v 1.201 2021/01/31 12:20:00 rillig Exp $ */
+/* $NetBSD: tree.c,v 1.202 2021/01/31 12:44:34 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.201 2021/01/31 12:20:00 rillig Exp $");
+__RCSID("$NetBSD: tree.c,v 1.202 2021/01/31 12:44:34 rillig Exp $");
#endif
#include <float.h>
@@ -3730,7 +3730,7 @@ constant(tnode_t *tn, bool required)
* for the expression.
*/
void
-expr(tnode_t *tn, bool vctx, bool tctx, bool dofreeblk)
+expr(tnode_t *tn, bool vctx, bool tctx, bool dofreeblk, bool constcond_zero_ok)
{
lint_assert(tn != NULL || nerr != 0);
@@ -3750,7 +3750,9 @@ expr(tnode_t *tn, bool vctx, bool tctx,
/* assignment in conditional context */
warning(159);
} else if (tn->tn_op == CON) {
- if (hflag && tctx && !constcond_flag)
+ if (hflag && tctx && !constcond_flag &&
+ !(constcond_zero_ok &&
+ is_int_constant_zero(tn, tn->tn_type->t_tspec)))
/* constant in conditional context */
warning(161);
}