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