From ad164939ed1cdd7164683814f8411d20d49e090b Mon Sep 17 00:00:00 2001 From: Phil Ellison Date: Sun, 14 Jan 2018 20:04:34 +0000 Subject: [PATCH] Check that we're calling Iterator::fold --- clippy_lints/src/methods.rs | 6 +++++- tests/ui/methods.rs | 6 +++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/clippy_lints/src/methods.rs b/clippy_lints/src/methods.rs index 9661a6011bd..98dfb3ad980 100644 --- a/clippy_lints/src/methods.rs +++ b/clippy_lints/src/methods.rs @@ -1126,7 +1126,11 @@ fn lint_iter_cloned_collect(cx: &LateContext, expr: &hir::Expr, iter_args: &[hir } fn lint_fold_any(cx: &LateContext, expr: &hir::Expr, fold_args: &[hir::Expr]) { - // DONOTMERGE: What if this is just some other method called fold? + // Check that this is a call to Iterator::fold rather than just some function called fold + if !match_trait_method(cx, expr, &paths::ITERATOR) { + return; + } + assert!(fold_args.len() == 3, "Expected fold_args to have three entries - the receiver, the initial value and the closure"); diff --git a/tests/ui/methods.rs b/tests/ui/methods.rs index 8cffbf76924..ae347269430 100644 --- a/tests/ui/methods.rs +++ b/tests/ui/methods.rs @@ -385,17 +385,17 @@ fn iter_skip_next() { let _ = foo.filter().skip(42).next(); } -/// Checks implementation of the `FOLD_ANY` lint +/// Should trigger the `FOLD_ANY` lint fn fold_any() { let _ = (0..3).fold(false, |acc, x| acc || x > 2); } -/// Checks implementation of the `FOLD_ANY` lint +/// Should not trigger the `FOLD_ANY` lint as the initial value is not the literal `false` fn fold_any_ignores_initial_value_of_true() { let _ = (0..3).fold(true, |acc, x| acc || x > 2); } -/// Checks implementation of the `FOLD_ANY` lint +/// Should not trigger the `FOLD_ANY` lint as the accumulator is not integer valued fn fold_any_ignores_non_boolean_accumalator() { let _ = (0..3).fold(0, |acc, x| acc + if x > 2 { 1 } else { 0 }); }