Check pattern equality while checking declaration equality

This commit is contained in:
Max Taldykin 2018-12-27 20:11:25 +03:00
parent aee138a7cf
commit 911a752561
3 changed files with 20 additions and 7 deletions

View File

@ -54,7 +54,9 @@ impl<'a, 'tcx: 'a> SpanlessEq<'a, 'tcx> {
match (&left.node, &right.node) { match (&left.node, &right.node) {
(&StmtKind::Decl(ref l, _), &StmtKind::Decl(ref r, _)) => { (&StmtKind::Decl(ref l, _), &StmtKind::Decl(ref r, _)) => {
if let (&DeclKind::Local(ref l), &DeclKind::Local(ref r)) = (&l.node, &r.node) { if let (&DeclKind::Local(ref l), &DeclKind::Local(ref r)) = (&l.node, &r.node) {
both(&l.ty, &r.ty, |l, r| self.eq_ty(l, r)) && both(&l.init, &r.init, |l, r| self.eq_expr(l, r)) self.eq_pat(&l.pat, &r.pat)
&& both(&l.ty, &r.ty, |l, r| self.eq_ty(l, r))
&& both(&l.init, &r.init, |l, r| self.eq_expr(l, r))
} else { } else {
false false
} }

View File

@ -335,6 +335,17 @@ fn if_same_then_else() -> Result<&'static str, ()> {
let foo = ""; let foo = "";
return Ok(&foo[0..]); return Ok(&foo[0..]);
} }
// false positive if_same_then_else, let(x,y) vs let(y,x), see #3559
if true {
let foo = "";
let (x, y) = (1, 2);
return Ok(&foo[x..y]);
} else {
let foo = "";
let (y, x) = (1, 2);
return Ok(&foo[x..y]);
}
} }
#[warn(clippy::ifs_same_cond)] #[warn(clippy::ifs_same_cond)]

View File

@ -352,38 +352,38 @@ LL | | } else {
| |_____^ | |_____^
error: this `if` has the same condition as a previous if error: this `if` has the same condition as a previous if
--> $DIR/copies.rs:347:15 --> $DIR/copies.rs:358:15
| |
LL | } else if b { LL | } else if b {
| ^ | ^
| |
= note: `-D clippy::ifs-same-cond` implied by `-D warnings` = note: `-D clippy::ifs-same-cond` implied by `-D warnings`
note: same as this note: same as this
--> $DIR/copies.rs:346:8 --> $DIR/copies.rs:357:8
| |
LL | if b { LL | if b {
| ^ | ^
error: this `if` has the same condition as a previous if error: this `if` has the same condition as a previous if
--> $DIR/copies.rs:352:15 --> $DIR/copies.rs:363:15
| |
LL | } else if a == 1 { LL | } else if a == 1 {
| ^^^^^^ | ^^^^^^
| |
note: same as this note: same as this
--> $DIR/copies.rs:351:8 --> $DIR/copies.rs:362:8
| |
LL | if a == 1 { LL | if a == 1 {
| ^^^^^^ | ^^^^^^
error: this `if` has the same condition as a previous if error: this `if` has the same condition as a previous if
--> $DIR/copies.rs:358:15 --> $DIR/copies.rs:369:15
| |
LL | } else if 2 * a == 1 { LL | } else if 2 * a == 1 {
| ^^^^^^^^^^ | ^^^^^^^^^^
| |
note: same as this note: same as this
--> $DIR/copies.rs:356:8 --> $DIR/copies.rs:367:8
| |
LL | if 2 * a == 1 { LL | if 2 * a == 1 {
| ^^^^^^^^^^ | ^^^^^^^^^^