fix: false positive double_negations when it jumps macro boundary

This commit is contained in:
anatawa12
2025-07-16 15:39:31 +09:00
parent 3014e79f9c
commit fad8dec970
3 changed files with 38 additions and 0 deletions

View File

@@ -1584,6 +1584,8 @@ impl EarlyLintPass for DoubleNegations {
if let ExprKind::Unary(UnOp::Neg, ref inner) = expr.kind if let ExprKind::Unary(UnOp::Neg, ref inner) = expr.kind
&& let ExprKind::Unary(UnOp::Neg, ref inner2) = inner.kind && let ExprKind::Unary(UnOp::Neg, ref inner2) = inner.kind
&& !matches!(inner2.kind, ExprKind::Unary(UnOp::Neg, _)) && !matches!(inner2.kind, ExprKind::Unary(UnOp::Neg, _))
// Don't lint if this jumps macro expansion boundary (Issue #143980)
&& expr.span.eq_ctxt(inner.span)
{ {
cx.emit_span_lint( cx.emit_span_lint(
DOUBLE_NEGATIONS, DOUBLE_NEGATIONS,

View File

@@ -0,0 +1,16 @@
//@ check-pass
macro_rules! neg {
($e: expr) => {
-$e
};
}
macro_rules! bad_macro {
($e: expr) => {
--$e //~ WARN use of a double negation
};
}
fn main() {
neg!(-1);
bad_macro!(1);
}

View File

@@ -0,0 +1,20 @@
warning: use of a double negation
--> $DIR/lint-double-negations-macro.rs:9:9
|
LL | --$e
| ^^^^
...
LL | bad_macro!(1);
| ------------- in this macro invocation
|
= note: the prefix `--` could be misinterpreted as a decrement operator which exists in other languages
= note: use `-= 1` if you meant to decrement the value
= note: `#[warn(double_negations)]` on by default
= note: this warning originates in the macro `bad_macro` (in Nightly builds, run with -Z macro-backtrace for more info)
help: add parentheses for clarity
|
LL | -(-$e)
| + +
warning: 1 warning emitted