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

Reply via email to