Module Name: src
Committed By: rillig
Date: Sun Dec 15 06:04:17 UTC 2024
Modified Files:
src/tests/usr.bin/xlint/lint1: msg_169.c
src/usr.bin/xlint/lint1: tree.c
Log Message:
lint: merge duplicate code for possibly confusing precedence
To generate a diff of this commit:
cvs rdiff -u -r1.9 -r1.10 src/tests/usr.bin/xlint/lint1/msg_169.c
cvs rdiff -u -r1.663 -r1.664 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.9 src/tests/usr.bin/xlint/lint1/msg_169.c:1.10
--- src/tests/usr.bin/xlint/lint1/msg_169.c:1.9 Sun Dec 15 05:08:42 2024
+++ src/tests/usr.bin/xlint/lint1/msg_169.c Sun Dec 15 06:04:17 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_169.c,v 1.9 2024/12/15 05:08:42 rillig Exp $ */
+/* $NetBSD: msg_169.c,v 1.10 2024/12/15 06:04:17 rillig Exp $ */
# 3 "msg_169.c"
// Test for message: possible precedence confusion between '%s' and '%s' [169]
@@ -50,9 +50,9 @@ confusing_shift_arith(unsigned a, unsign
}
void
-confusing_logical(bool a, bool b, bool c)
+confusing_logical(bool a, bool b, bool c, bool d)
{
- bool con, okl, okr, eql;
+ bool con, okl, okr, okb, eql;
eql = a && b && c;
eql = a || b || c;
@@ -66,6 +66,16 @@ confusing_logical(bool a, bool b, bool c
con = a || b && c;
okl = (a || b) && c;
okr = a || (b && c);
+
+ // When both nested operands have confusing precedence, there's only
+ // a single warning, as that is enough to point to the issue.
+ /* expect+1: warning: possible precedence confusion between '||' and '&&' [169] */
+ con = a && b || c && d;
+ /* expect+1: warning: possible precedence confusion between '||' and '&&' [169] */
+ okl = (a && b) || c && d;
+ /* expect+1: warning: possible precedence confusion between '||' and '&&' [169] */
+ okr = a && b || (c && d);
+ okb = (a && b) || (c && d);
}
void
Index: src/usr.bin/xlint/lint1/tree.c
diff -u src/usr.bin/xlint/lint1/tree.c:1.663 src/usr.bin/xlint/lint1/tree.c:1.664
--- src/usr.bin/xlint/lint1/tree.c:1.663 Sun Dec 15 05:08:42 2024
+++ src/usr.bin/xlint/lint1/tree.c Sun Dec 15 06:04:17 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: tree.c,v 1.663 2024/12/15 05:08:42 rillig Exp $ */
+/* $NetBSD: tree.c,v 1.664 2024/12/15 06:04:17 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.663 2024/12/15 05:08:42 rillig Exp $");
+__RCSID("$NetBSD: tree.c,v 1.664 2024/12/15 06:04:17 rillig Exp $");
#endif
#include <float.h>
@@ -1581,32 +1581,28 @@ build_real_imag(op_t op, bool sys, tnode
}
static bool
-is_confusing_precedence(op_t op, op_t lop, op_t rop, op_t *cop)
+is_confusing_precedence(op_t op, const tnode_t *operand, op_t *cop)
{
+ if (operand->tn_parenthesized)
+ return false;
+ op_t oop = operand->tn_op;
if (op == SHL || op == SHR) {
- if (lop == PLUS || lop == MINUS)
- return *cop = lop, true;
- if (rop == PLUS || rop == MINUS)
- return *cop = rop, true;
+ if (oop == PLUS || oop == MINUS)
+ return *cop = oop, true;
return false;
}
if (op == LOGOR) {
- if (lop == LOGAND)
- return *cop = lop, true;
- if (rop == LOGAND)
- return *cop = rop, true;
+ if (oop == LOGAND)
+ return *cop = oop, true;
return false;
}
lint_assert(op == BITAND || op == BITXOR || op == BITOR);
- 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;
+ if (oop != op
+ && (oop == PLUS || oop == MINUS || oop == BITAND || oop == BITXOR))
+ return *cop = oop, true;
return false;
}
@@ -1634,9 +1630,8 @@ check_precedence_confusion(tnode_t *tn)
continue;
op_t cop;
- if (is_confusing_precedence(tn->tn_op,
- ln->tn_parenthesized ? NOOP : ln->tn_op,
- rn->tn_parenthesized ? NOOP : rn->tn_op, &cop)) {
+ if (is_confusing_precedence(tn->tn_op, ln, &cop) ||
+ is_confusing_precedence(tn->tn_op, rn, &cop)) {
/* possible precedence confusion between '%s' and '%s' */
warning(169, op_name(tn->tn_op), op_name(cop));
}