diff --git a/Cargo.toml b/Cargo.toml index 5ff911c8ced6..0946855e3564 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "clippy" -version = "0.0.17" +version = "0.0.18" authors = [ "Manish Goregaokar ", "Andre Bogus ", diff --git a/src/loops.rs b/src/loops.rs index 23be0ce728ff..2069a56f78f1 100644 --- a/src/loops.rs +++ b/src/loops.rs @@ -312,7 +312,7 @@ fn is_iterable_array(ty: ty::Ty) -> bool { fn extract_expr_from_first_stmt(block: &Block) -> Option<&Expr> { match block.expr { Some(_) => None, - None => match block.stmts[0].node { + None if !block.stmts.is_empty() => match block.stmts[0].node { StmtDecl(ref decl, _) => match decl.node { DeclLocal(ref local) => match local.init { Some(ref expr) => Some(expr), @@ -322,6 +322,7 @@ fn extract_expr_from_first_stmt(block: &Block) -> Option<&Expr> { }, _ => None, }, + _ => None, } } @@ -329,10 +330,11 @@ fn extract_expr_from_first_stmt(block: &Block) -> Option<&Expr> { fn extract_first_expr(block: &Block) -> Option<&Expr> { match block.expr { Some(ref expr) => Some(expr), - None => match block.stmts[0].node { + None if !block.stmts.is_empty() => match block.stmts[0].node { StmtExpr(ref expr, _) | StmtSemi(ref expr, _) => Some(expr), _ => None, }, + _ => None, } } diff --git a/tests/compile-fail/while_loop.rs b/tests/compile-fail/while_loop.rs index ef798b2a79e2..eca2c7e12aec 100755 --- a/tests/compile-fail/while_loop.rs +++ b/tests/compile-fail/while_loop.rs @@ -1,7 +1,9 @@ #![feature(plugin)] #![plugin(clippy)] -#[deny(while_let_loop)] +#![deny(while_let_loop)] +#![allow(dead_code, unused)] + fn main() { let y = Some(true); loop { //~ERROR @@ -44,3 +46,18 @@ fn main() { println!("{}", x); } } + +// regression test (#360) +// this should not panic +// it's okay if further iterations of the lint +// cause this function to trigger it +fn no_panic(slice: &[T]) { + let mut iter = slice.iter(); + loop { + let _ = match iter.next() { + Some(ele) => ele, + None => break + }; + loop {} + } +}