diff --git a/clippy_lints/src/map_clone.rs b/clippy_lints/src/map_clone.rs index 23c5434a750..2befba5767d 100644 --- a/clippy_lints/src/map_clone.rs +++ b/clippy_lints/src/map_clone.rs @@ -36,7 +36,6 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Pass { ExprClosure(_, ref decl, closure_eid, _, _) => { let body = cx.tcx.hir.body(closure_eid); let closure_expr = remove_blocks(&body.value); - let ty = cx.tables.pat_ty(&body.arguments[0].pat); if_chain! { // nothing special in the argument, besides reference bindings // (e.g. .map(|&x| x) ) @@ -45,6 +44,8 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Pass { // the method is being called on a known type (option or iterator) if let Some(type_name) = get_type_name(cx, expr, &args[0]); then { + // We know that body.arguments is not empty at this point + let ty = cx.tables.pat_ty(&body.arguments[0].pat); // look for derefs, for .map(|x| *x) if only_derefs(cx, &*closure_expr, arg_ident) && // .cloned() only removes one level of indirection, don't lint on more diff --git a/tests/run-pass/issue-2862.rs b/tests/run-pass/issue-2862.rs new file mode 100644 index 00000000000..b35df667f27 --- /dev/null +++ b/tests/run-pass/issue-2862.rs @@ -0,0 +1,14 @@ +pub trait FooMap { + fn map B>(&self, f: F) -> B; +} + +impl FooMap for bool { + fn map B>(&self, f: F) -> B { + f() + } +} + +fn main() { + let a = true; + a.map(|| false); +}