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