From 836554387a86c312a482c95bc9a217303cb399b0 Mon Sep 17 00:00:00 2001 From: mcarton Date: Thu, 16 Jun 2016 16:19:17 +0200 Subject: [PATCH] Fix FP with `WHILE_LET_LOOP` and break expressions --- clippy_lints/src/loops.rs | 11 +++++------ tests/compile-fail/while_loop.rs | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/clippy_lints/src/loops.rs b/clippy_lints/src/loops.rs index f3f10fae16e..3df766c95d4 100644 --- a/clippy_lints/src/loops.rs +++ b/clippy_lints/src/loops.rs @@ -249,7 +249,8 @@ impl LateLintPass for LoopsPass { match *source { MatchSource::Normal | MatchSource::IfLetDesugar { .. } => { - if arms.len() == 2 && arms[0].pats.len() == 1 && arms[0].guard.is_none() && + if arms.len() == 2 && + arms[0].pats.len() == 1 && arms[0].guard.is_none() && arms[1].pats.len() == 1 && arms[1].guard.is_none() && is_break_expr(&arms[1].body) { if in_external_macro(cx, expr.span) { @@ -787,12 +788,11 @@ fn extract_expr_from_first_stmt(block: &Block) -> Option<&Expr> { /// If a block begins with an expression (with or without semicolon), return it. fn extract_first_expr(block: &Block) -> Option<&Expr> { match block.expr { - Some(ref expr) => Some(expr), + Some(ref expr) if block.stmts.is_empty() => Some(expr), None if !block.stmts.is_empty() => { match block.stmts[0].node { - StmtExpr(ref expr, _) | - StmtSemi(ref expr, _) => Some(expr), - _ => None, + StmtExpr(ref expr, _) | StmtSemi(ref expr, _) => Some(expr), + StmtDecl(..) => None, } } _ => None, @@ -803,7 +803,6 @@ fn extract_first_expr(block: &Block) -> Option<&Expr> { fn is_break_expr(expr: &Expr) -> bool { match expr.node { ExprBreak(None) => true, - // there won't be a `let = break` and so we can safely ignore the StmtDecl case ExprBlock(ref b) => { match extract_first_expr(b) { Some(ref subexpr) => is_break_expr(subexpr), diff --git a/tests/compile-fail/while_loop.rs b/tests/compile-fail/while_loop.rs index 4c1090876b4..d8cea42e20b 100644 --- a/tests/compile-fail/while_loop.rs +++ b/tests/compile-fail/while_loop.rs @@ -150,3 +150,18 @@ fn no_panic(slice: &[T]) { loop {} //~ERROR empty `loop {}` detected. } } + +fn issue1017() { + let r: Result = Ok(42); + let mut len = 1337; + + loop { + match r { + Err(_) => len = 0, + Ok(length) => { + len = length; + break + } + } + } +}