Module Name:    src
Committed By:   rillig
Date:           Sun Dec 15 05:08:42 UTC 2024

Modified Files:
        src/tests/usr.bin/xlint/lint1: msg_169.c
        src/usr.bin/xlint/lint1: err.c tree.c

Log Message:
lint: add details to message about possible precedence confusion


To generate a diff of this commit:
cvs rdiff -u -r1.8 -r1.9 src/tests/usr.bin/xlint/lint1/msg_169.c
cvs rdiff -u -r1.260 -r1.261 src/usr.bin/xlint/lint1/err.c
cvs rdiff -u -r1.662 -r1.663 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_169.c
diff -u src/tests/usr.bin/xlint/lint1/msg_169.c:1.8 src/tests/usr.bin/xlint/lint1/msg_169.c:1.9
--- src/tests/usr.bin/xlint/lint1/msg_169.c:1.8	Fri Jul  7 06:03:31 2023
+++ src/tests/usr.bin/xlint/lint1/msg_169.c	Sun Dec 15 05:08:42 2024
@@ -1,7 +1,7 @@
-/*	$NetBSD: msg_169.c,v 1.8 2023/07/07 06:03:31 rillig Exp $	*/
+/*	$NetBSD: msg_169.c,v 1.9 2024/12/15 05:08:42 rillig Exp $	*/
 # 3 "msg_169.c"
 
-// Test for message: precedence confusion possible: parenthesize! [169]
+// Test for message: possible precedence confusion between '%s' and '%s' [169]
 
 /* lint1-flags: -g -h -S -w -X 191,351 */
 
@@ -12,40 +12,40 @@ confusing_shift_arith(unsigned a, unsign
 {
 	unsigned con, okl, okr;
 
-	/* expect+1: warning: precedence confusion possible: parenthesize! [169] */
+	/* expect+1: warning: possible precedence confusion between '<<' and '+' [169] */
 	con = a + b << c;
 	okl = (a + b) << c;
 	okr = a + (b << c);
 
-	/* expect+1: warning: precedence confusion possible: parenthesize! [169] */
+	/* expect+1: warning: possible precedence confusion between '<<' and '+' [169] */
 	con = a << b + c;
 	okl = (a << b) + c;
 	okr = a << (b + c);
 
-	/* expect+1: warning: precedence confusion possible: parenthesize! [169] */
+	/* expect+1: warning: possible precedence confusion between '>>' and '-' [169] */
 	con = a - b >> c;
 	okl = (a - b) >> c;
 	okr = a - (b >> c);
 
-	/* expect+1: warning: precedence confusion possible: parenthesize! [169] */
+	/* expect+1: warning: possible precedence confusion between '>>' and '-' [169] */
 	con = a >> b - c;
 	okl = (a >> b) - c;
 	okr = a >> (b - c);
 
 	// Parenthesizing the inner operands has no effect on the warning.
-	/* expect+1: warning: precedence confusion possible: parenthesize! [169] */
+	/* expect+1: warning: possible precedence confusion between '<<' and '+' [169] */
 	con = (a) + b << c;
-	/* expect+1: warning: precedence confusion possible: parenthesize! [169] */
+	/* expect+1: warning: possible precedence confusion between '<<' and '+' [169] */
 	con = a + (b) << c;
-	/* expect+1: warning: precedence confusion possible: parenthesize! [169] */
+	/* expect+1: warning: possible precedence confusion between '<<' and '+' [169] */
 	con = a + b << (c);
 
 	// The usual arithmetic promotions have no effect on the warning.
-	/* expect+1: warning: precedence confusion possible: parenthesize! [169] */
+	/* expect+1: warning: possible precedence confusion between '<<' and '+' [169] */
 	con = ch + b << c;
-	/* expect+1: warning: precedence confusion possible: parenthesize! [169] */
+	/* expect+1: warning: possible precedence confusion between '<<' and '+' [169] */
 	con = a + ch << c;
-	/* expect+1: warning: precedence confusion possible: parenthesize! [169] */
+	/* expect+1: warning: possible precedence confusion between '<<' and '+' [169] */
 	con = a + b << ch;
 }
 
@@ -57,12 +57,12 @@ confusing_logical(bool a, bool b, bool c
 	eql = a && b && c;
 	eql = a || b || c;
 
-	/* expect+1: warning: precedence confusion possible: parenthesize! [169] */
+	/* expect+1: warning: possible precedence confusion between '||' and '&&' [169] */
 	con = a && b || c;
 	okl = (a && b) || c;
 	okr = a && (b || c);
 
-	/* expect+1: warning: precedence confusion possible: parenthesize! [169] */
+	/* expect+1: warning: possible precedence confusion between '||' and '&&' [169] */
 	con = a || b && c;
 	okl = (a || b) && c;
 	okr = a || (b && c);
@@ -77,48 +77,48 @@ confusing_bitwise(unsigned a, unsigned b
 	eql = a | b | c;
 	eql = a ^ b ^ c;
 
-	/* expect+1: warning: precedence confusion possible: parenthesize! [169] */
+	/* expect+1: warning: possible precedence confusion between '|' and '^' [169] */
 	con = a | b ^ c;
 	okl = (a | b) ^ c;
 	okr = a | (b ^ c);
 
-	/* expect+1: warning: precedence confusion possible: parenthesize! [169] */
+	/* expect+1: warning: possible precedence confusion between '|' and '&' [169] */
 	con = a | b & c;
 	okl = (a | b) & c;
 	okr = a | (b & c);
 
-	/* expect+1: warning: precedence confusion possible: parenthesize! [169] */
+	/* expect+1: warning: possible precedence confusion between '|' and '^' [169] */
 	con = a ^ b | c;
 	okl = (a ^ b) | c;
 	okr = a ^ (b | c);
 
-	/* expect+1: warning: precedence confusion possible: parenthesize! [169] */
+	/* expect+1: warning: possible precedence confusion between '^' and '&' [169] */
 	con = a ^ b & c;
 	okl = (a ^ b) & c;
 	okr = a ^ (b & c);
 
-	/* expect+1: warning: precedence confusion possible: parenthesize! [169] */
+	/* expect+1: warning: possible precedence confusion between '|' and '&' [169] */
 	con = a & b | c;
 	okl = (a & b) ^ c;
 	okr = a & (b ^ c);
 
-	/* expect+1: warning: precedence confusion possible: parenthesize! [169] */
+	/* expect+1: warning: possible precedence confusion between '^' and '&' [169] */
 	con = a & b ^ c;
 	okl = (a & b) ^ c;
 	okr = a & (b ^ c);
 
-	/* expect+1: warning: precedence confusion possible: parenthesize! [169] */
+	/* expect+1: warning: possible precedence confusion between '&' and '+' [169] */
 	con = a & b + c;
 	okl = (a & b) + c;
 	okr = a & (b + c);
 
-	/* expect+1: warning: precedence confusion possible: parenthesize! [169] */
+	/* expect+1: warning: possible precedence confusion between '|' and '-' [169] */
 	con = a - b | c;
 	okl = (a - b) | c;
 	okr = a - (b | c);
 
 	// This looks like a binomial formula but isn't.
-	/* expect+1: warning: precedence confusion possible: parenthesize! [169] */
+	/* expect+1: warning: possible precedence confusion between '^' and '+' [169] */
 	con = a ^ 2 - 2 * a * b + b ^ 2;
 
 	// This isn't a binomial formula either since '^' means xor.
@@ -144,14 +144,14 @@ cast_expressions(char a, char b, char c)
 
 	// Adding casts to the leaf nodes doesn't change anything about the
 	// confusing precedence.
-	/* expect+1: warning: precedence confusion possible: parenthesize! [169] */
+	/* expect+1: warning: possible precedence confusion between '|' and '&' [169] */
 	con = (unsigned)a | (unsigned)b & (unsigned)c;
-	/* expect+1: warning: precedence confusion possible: parenthesize! [169] */
+	/* expect+1: warning: possible precedence confusion between '|' and '&' [169] */
 	con = (unsigned)a & (unsigned)b | (unsigned)c;
 
 	// Adding a cast around the whole calculation doesn't change the
 	// precedence as well.
-	/* expect+1: warning: precedence confusion possible: parenthesize! [169] */
+	/* expect+1: warning: possible precedence confusion between '|' and '&' [169] */
 	con = (unsigned)(a | b & c);
 
 	// Adding a cast around an intermediate result groups the operands
@@ -175,7 +175,7 @@ implicit_conversion_to_long(long la, int
 {
 	int ok;
 
-	/* expect+1: warning: precedence confusion possible: parenthesize! [169] */
+	/* expect+1: warning: possible precedence confusion between '|' and '&' [169] */
 	ok = a & a | la;
 
 	/*
@@ -185,7 +185,7 @@ implicit_conversion_to_long(long la, int
 	 * conversion or an explicit cast between the main operator ('|') and
 	 * the nested operator ('&').
 	 */
-	/* expect+1: warning: precedence confusion possible: parenthesize! [169] */
+	/* expect+1: warning: possible precedence confusion between '|' and '&' [169] */
 	ok = la | a & a;
 
 	ok = (a & a) | la;	/* always ok */

Index: src/usr.bin/xlint/lint1/err.c
diff -u src/usr.bin/xlint/lint1/err.c:1.260 src/usr.bin/xlint/lint1/err.c:1.261
--- src/usr.bin/xlint/lint1/err.c:1.260	Sun Dec  8 17:12:01 2024
+++ src/usr.bin/xlint/lint1/err.c	Sun Dec 15 05:08:42 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: err.c,v 1.260 2024/12/08 17:12:01 rillig Exp $	*/
+/*	$NetBSD: err.c,v 1.261 2024/12/15 05:08:42 rillig Exp $	*/
 
 /*
  * Copyright (c) 1994, 1995 Jochen Pohl
@@ -37,7 +37,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID)
-__RCSID("$NetBSD: err.c,v 1.260 2024/12/08 17:12:01 rillig Exp $");
+__RCSID("$NetBSD: err.c,v 1.261 2024/12/15 05:08:42 rillig Exp $");
 #endif
 
 #include <limits.h>
@@ -224,7 +224,7 @@ static const char *const msgs[] = {
 	"precision lost in bit-field assignment",			// 166
 	"array subscript %jd cannot be negative",			// 167
 	"array subscript %ju cannot be > %d",				// 168
-	"precedence confusion possible: parenthesize!",			// 169
+	"possible precedence confusion between '%s' and '%s'",		// 169
 	"first operand of '?' must have scalar type",			// 170
 	"cannot assign to '%s' from '%s'",				// 171
 	"too many struct/union initializers",				// 172

Index: src/usr.bin/xlint/lint1/tree.c
diff -u src/usr.bin/xlint/lint1/tree.c:1.662 src/usr.bin/xlint/lint1/tree.c:1.663
--- src/usr.bin/xlint/lint1/tree.c:1.662	Sat Nov 30 10:43:49 2024
+++ src/usr.bin/xlint/lint1/tree.c	Sun Dec 15 05:08:42 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: tree.c,v 1.662 2024/11/30 10:43:49 rillig Exp $	*/
+/*	$NetBSD: tree.c,v 1.663 2024/12/15 05:08:42 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.662 2024/11/30 10:43:49 rillig Exp $");
+__RCSID("$NetBSD: tree.c,v 1.663 2024/12/15 05:08:42 rillig Exp $");
 #endif
 
 #include <float.h>
@@ -1581,38 +1581,32 @@ build_real_imag(op_t op, bool sys, tnode
 }
 
 static bool
-is_confusing_precedence(op_t op, op_t lop, bool lparen, op_t rop, bool rparen)
+is_confusing_precedence(op_t op, op_t lop, op_t rop, op_t *cop)
 {
 
 	if (op == SHL || op == SHR) {
-		if (!lparen && (lop == PLUS || lop == MINUS))
-			return true;
-		if (!rparen && (rop == PLUS || rop == MINUS))
-			return true;
+		if (lop == PLUS || lop == MINUS)
+			return *cop = lop, true;
+		if (rop == PLUS || rop == MINUS)
+			return *cop = rop, true;
 		return false;
 	}
 
 	if (op == LOGOR) {
-		if (!lparen && lop == LOGAND)
-			return true;
-		if (!rparen && rop == LOGAND)
-			return true;
+		if (lop == LOGAND)
+			return *cop = lop, true;
+		if (rop == LOGAND)
+			return *cop = rop, true;
 		return false;
 	}
 
 	lint_assert(op == BITAND || op == BITXOR || op == BITOR);
-	if (!lparen && lop != op) {
-		if (lop == PLUS || lop == MINUS)
-			return true;
-		if (lop == BITAND || lop == BITXOR)
-			return true;
-	}
-	if (!rparen && rop != op) {
-		if (rop == PLUS || rop == MINUS)
-			return true;
-		if (rop == BITAND || rop == BITXOR)
-			return true;
-	}
+	if (lop != op
+	    && (lop == PLUS || lop == MINUS || lop == BITAND || lop == BITXOR))
+		return *cop = lop, true;
+	if (rop != op
+	    && (rop == PLUS || rop == MINUS || rop == BITAND || rop == BITXOR))
+		return *cop = rop, true;
 	return false;
 }
 
@@ -1639,11 +1633,12 @@ check_precedence_confusion(tnode_t *tn)
 	for (rn = tn->u.ops.right; rn->tn_op == CVT; rn = rn->u.ops.left)
 		continue;
 
+	op_t cop;
 	if (is_confusing_precedence(tn->tn_op,
-	    ln->tn_op, ln->tn_parenthesized,
-	    rn->tn_op, rn->tn_parenthesized)) {
-		/* precedence confusion possible: parenthesize! */
-		warning(169);
+	    ln->tn_parenthesized ? NOOP : ln->tn_op,
+	    rn->tn_parenthesized ? NOOP : rn->tn_op, &cop)) {
+		/* possible precedence confusion between '%s' and '%s' */
+		warning(169, op_name(tn->tn_op), op_name(cop));
 	}
 }
 

Reply via email to