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