mirror of
https://github.com/rust-lang/rust.git
synced 2024-12-18 11:34:11 +00:00
Merge pull request #808 from mcarton/copies
Fix false positive in `MATCH_SAME_ARMS` and guards
This commit is contained in:
commit
94f10ee69a
@ -132,13 +132,15 @@ fn lint_match_arms(cx: &LateContext, expr: &Expr) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
let eq = |lhs: &Arm, rhs: &Arm| -> bool {
|
let eq = |lhs: &Arm, rhs: &Arm| -> bool {
|
||||||
SpanlessEq::new(cx).eq_expr(&lhs.body, &rhs.body) &&
|
// Arms with a guard are ignored, those can’t always be merged together
|
||||||
|
lhs.guard.is_none() && rhs.guard.is_none() &&
|
||||||
|
SpanlessEq::new(cx).eq_expr(&lhs.body, &rhs.body) &&
|
||||||
// all patterns should have the same bindings
|
// all patterns should have the same bindings
|
||||||
bindings(cx, &lhs.pats[0]) == bindings(cx, &rhs.pats[0])
|
bindings(cx, &lhs.pats[0]) == bindings(cx, &rhs.pats[0])
|
||||||
};
|
};
|
||||||
|
|
||||||
if let ExprMatch(_, ref arms, MatchSource::Normal) = expr.node {
|
if let ExprMatch(_, ref arms, MatchSource::Normal) = expr.node {
|
||||||
if let Some((i, j)) = search_same(&**arms, hash, eq) {
|
if let Some((i, j)) = search_same(&arms, hash, eq) {
|
||||||
span_note_and_lint(cx,
|
span_note_and_lint(cx,
|
||||||
MATCH_SAME_ARMS,
|
MATCH_SAME_ARMS,
|
||||||
j.body.span,
|
j.body.span,
|
||||||
|
@ -142,12 +142,23 @@ fn if_same_then_else() -> Result<&'static str, ()> {
|
|||||||
_ => true,
|
_ => true,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let _ = match Some(42) {
|
||||||
|
Some(_) => 24,
|
||||||
|
None => 24,
|
||||||
|
};
|
||||||
|
|
||||||
let _ = match Some(42) {
|
let _ = match Some(42) {
|
||||||
Some(42) => 24,
|
Some(42) => 24,
|
||||||
Some(a) => 24, // bindings are different
|
Some(a) => 24, // bindings are different
|
||||||
None => 0,
|
None => 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let _ = match Some(42) {
|
||||||
|
Some(a) if a > 0 => 24,
|
||||||
|
Some(a) => 24, // one arm has a guard
|
||||||
|
None => 0,
|
||||||
|
};
|
||||||
|
|
||||||
match (Some(42), Some(42)) {
|
match (Some(42), Some(42)) {
|
||||||
(Some(a), None) => bar(a),
|
(Some(a), None) => bar(a),
|
||||||
(None, Some(a)) => bar(a), //~ERROR this `match` has identical arm bodies
|
(None, Some(a)) => bar(a), //~ERROR this `match` has identical arm bodies
|
||||||
|
Loading…
Reference in New Issue
Block a user