Skip to content

Commit

Permalink
Auto merge of #10502 - blyxyas:fix-almost_swapped, r=giraffate
Browse files Browse the repository at this point in the history
fix `almost_swapped`: Ignore external macros

Fixes #10421 ; Related to #10499 (Fixing points *1* and *3* from #10421)
changelog: [`almost_swapped`]: Add a check to ignore external macros
  • Loading branch information
bors committed Mar 17, 2023
2 parents 5afa93b + 9546517 commit 5c4040e
Show file tree
Hide file tree
Showing 5 changed files with 44 additions and 22 deletions.
4 changes: 3 additions & 1 deletion clippy_lints/src/swap.rs
Expand Up @@ -6,7 +6,8 @@ use clippy_utils::{can_mut_borrow_both, eq_expr_value, in_constant, std_or_core}
use if_chain::if_chain;
use rustc_errors::Applicability;
use rustc_hir::{BinOpKind, Block, Expr, ExprKind, PatKind, QPath, Stmt, StmtKind};
use rustc_lint::{LateContext, LateLintPass};
use rustc_lint::{LateContext, LateLintPass, LintContext};
use rustc_middle::lint::in_external_macro;
use rustc_middle::ty;
use rustc_session::{declare_lint_pass, declare_tool_lint};
use rustc_span::source_map::Spanned;
Expand Down Expand Up @@ -188,6 +189,7 @@ fn check_suspicious_swap(cx: &LateContext<'_>, block: &Block<'_>) {
if let Some((lhs0, rhs0)) = parse(first)
&& let Some((lhs1, rhs1)) = parse(second)
&& first.span.eq_ctxt(second.span)
&& !in_external_macro(&cx.sess(), first.span)
&& is_same(cx, lhs0, rhs1)
&& is_same(cx, lhs1, rhs0)
&& !is_same(cx, lhs1, rhs1) // Ignore a = b; a = a (#10421)
Expand Down
10 changes: 10 additions & 0 deletions tests/ui/auxiliary/macro_rules.rs
Expand Up @@ -27,3 +27,13 @@ macro_rules! mut_mut {
let mut_mut_ty: &mut &mut u32 = &mut &mut 1u32;
};
}

#[macro_export]
macro_rules! issue_10421 {
() => {
let mut a = 1;
let mut b = 2;
a = b;
b = a;
};
}
9 changes: 7 additions & 2 deletions tests/ui/swap.fixed
@@ -1,4 +1,5 @@
// run-rustfix
// aux-build: macro_rules.rs

#![warn(clippy::all)]
#![allow(
Expand All @@ -8,7 +9,8 @@
redundant_semicolons,
dead_code,
unused_assignments,
unused_variables
unused_variables,
clippy::let_and_return
)]

struct Foo(u32);
Expand Down Expand Up @@ -187,8 +189,11 @@ const fn issue_9864(mut u: u32) -> u32 {
u + v
}

#[allow(clippy::let_and_return)]
#[macro_use]
extern crate macro_rules;

const fn issue_10421(x: u32) -> u32 {
issue_10421!();
let a = x;
let a = a;
let a = a;
Expand Down
9 changes: 7 additions & 2 deletions tests/ui/swap.rs
@@ -1,4 +1,5 @@
// run-rustfix
// aux-build: macro_rules.rs

#![warn(clippy::all)]
#![allow(
Expand All @@ -8,7 +9,8 @@
redundant_semicolons,
dead_code,
unused_assignments,
unused_variables
unused_variables,
clippy::let_and_return
)]

struct Foo(u32);
Expand Down Expand Up @@ -216,8 +218,11 @@ const fn issue_9864(mut u: u32) -> u32 {
u + v
}

#[allow(clippy::let_and_return)]
#[macro_use]
extern crate macro_rules;

const fn issue_10421(x: u32) -> u32 {
issue_10421!();
let a = x;
let a = a;
let a = a;
Expand Down
34 changes: 17 additions & 17 deletions tests/ui/swap.stderr
@@ -1,5 +1,5 @@
error: this looks like you are swapping `bar.a` and `bar.b` manually
--> $DIR/swap.rs:25:5
--> $DIR/swap.rs:27:5
|
LL | / let temp = bar.a;
LL | | bar.a = bar.b;
Expand All @@ -10,55 +10,55 @@ LL | | bar.b = temp;
= note: `-D clippy::manual-swap` implied by `-D warnings`

error: this looks like you are swapping elements of `foo` manually
--> $DIR/swap.rs:37:5
--> $DIR/swap.rs:39:5
|
LL | / let temp = foo[0];
LL | | foo[0] = foo[1];
LL | | foo[1] = temp;
| |__________________^ help: try: `foo.swap(0, 1);`

error: this looks like you are swapping elements of `foo` manually
--> $DIR/swap.rs:46:5
--> $DIR/swap.rs:48:5
|
LL | / let temp = foo[0];
LL | | foo[0] = foo[1];
LL | | foo[1] = temp;
| |__________________^ help: try: `foo.swap(0, 1);`

error: this looks like you are swapping elements of `foo` manually
--> $DIR/swap.rs:65:5
--> $DIR/swap.rs:67:5
|
LL | / let temp = foo[0];
LL | | foo[0] = foo[1];
LL | | foo[1] = temp;
| |__________________^ help: try: `foo.swap(0, 1);`

error: this looks like you are swapping `a` and `b` manually
--> $DIR/swap.rs:76:5
--> $DIR/swap.rs:78:5
|
LL | / a ^= b;
LL | | b ^= a;
LL | | a ^= b;
| |___________^ help: try: `std::mem::swap(&mut a, &mut b);`

error: this looks like you are swapping `bar.a` and `bar.b` manually
--> $DIR/swap.rs:84:5
--> $DIR/swap.rs:86:5
|
LL | / bar.a ^= bar.b;
LL | | bar.b ^= bar.a;
LL | | bar.a ^= bar.b;
| |___________________^ help: try: `std::mem::swap(&mut bar.a, &mut bar.b);`

error: this looks like you are swapping elements of `foo` manually
--> $DIR/swap.rs:92:5
--> $DIR/swap.rs:94:5
|
LL | / foo[0] ^= foo[1];
LL | | foo[1] ^= foo[0];
LL | | foo[0] ^= foo[1];
| |_____________________^ help: try: `foo.swap(0, 1);`

error: this looks like you are swapping `foo[0][1]` and `bar[1][0]` manually
--> $DIR/swap.rs:121:5
--> $DIR/swap.rs:123:5
|
LL | / let temp = foo[0][1];
LL | | foo[0][1] = bar[1][0];
Expand All @@ -68,7 +68,7 @@ LL | | bar[1][0] = temp;
= note: or maybe you should use `std::mem::replace`?

error: this looks like you are swapping `a` and `b` manually
--> $DIR/swap.rs:135:7
--> $DIR/swap.rs:137:7
|
LL | ; let t = a;
| _______^
Expand All @@ -79,7 +79,7 @@ LL | | b = t;
= note: or maybe you should use `std::mem::replace`?

error: this looks like you are swapping `c.0` and `a` manually
--> $DIR/swap.rs:144:7
--> $DIR/swap.rs:146:7
|
LL | ; let t = c.0;
| _______^
Expand All @@ -90,7 +90,7 @@ LL | | a = t;
= note: or maybe you should use `std::mem::replace`?

error: this looks like you are swapping `b` and `a` manually
--> $DIR/swap.rs:170:5
--> $DIR/swap.rs:172:5
|
LL | / let t = b;
LL | | b = a;
Expand All @@ -100,7 +100,7 @@ LL | | a = t;
= note: or maybe you should use `std::mem::replace`?

error: this looks like you are trying to swap `a` and `b`
--> $DIR/swap.rs:132:5
--> $DIR/swap.rs:134:5
|
LL | / a = b;
LL | | b = a;
Expand All @@ -110,7 +110,7 @@ LL | | b = a;
= note: `-D clippy::almost-swapped` implied by `-D warnings`

error: this looks like you are trying to swap `c.0` and `a`
--> $DIR/swap.rs:141:5
--> $DIR/swap.rs:143:5
|
LL | / c.0 = a;
LL | | a = c.0;
Expand All @@ -119,7 +119,7 @@ LL | | a = c.0;
= note: or maybe you should use `std::mem::replace`?

error: this looks like you are trying to swap `a` and `b`
--> $DIR/swap.rs:148:5
--> $DIR/swap.rs:150:5
|
LL | / let a = b;
LL | | let b = a;
Expand All @@ -128,7 +128,7 @@ LL | | let b = a;
= note: or maybe you should use `std::mem::replace`?

error: this looks like you are trying to swap `d` and `c`
--> $DIR/swap.rs:153:5
--> $DIR/swap.rs:155:5
|
LL | / d = c;
LL | | c = d;
Expand All @@ -137,7 +137,7 @@ LL | | c = d;
= note: or maybe you should use `std::mem::replace`?

error: this looks like you are trying to swap `a` and `b`
--> $DIR/swap.rs:157:5
--> $DIR/swap.rs:159:5
|
LL | / let a = b;
LL | | b = a;
Expand All @@ -146,7 +146,7 @@ LL | | b = a;
= note: or maybe you should use `std::mem::replace`?

error: this looks like you are swapping `s.0.x` and `s.0.y` manually
--> $DIR/swap.rs:205:5
--> $DIR/swap.rs:207:5
|
LL | / let t = s.0.x;
LL | | s.0.x = s.0.y;
Expand Down

0 comments on commit 5c4040e

Please sign in to comment.