about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--clippy_lints/src/loops.rs11
1 files changed, 11 insertions, 0 deletions
diff --git a/clippy_lints/src/loops.rs b/clippy_lints/src/loops.rs
index 56dd2795c60..6e9b7f685eb 100644
--- a/clippy_lints/src/loops.rs
+++ b/clippy_lints/src/loops.rs
@@ -566,6 +566,17 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Loops {
             ) = (pat, &match_expr.kind)
             {
                 let iter_expr = &method_args[0];
+
+                // Don't lint when the iterator is recreated on every iteration
+                if_chain! {
+                    if let ExprKind::MethodCall(..) | ExprKind::Call(..) = iter_expr.kind;
+                    if let Some(iter_def_id) = get_trait_def_id(cx, &paths::ITERATOR);
+                    if implements_trait(cx, cx.tables.expr_ty(iter_expr), iter_def_id, &[]);
+                    then {
+                        return;
+                    }
+                }
+
                 let lhs_constructor = last_path_segment(qpath);
                 if method_path.ident.name == sym!(next)
                     && match_trait_method(cx, match_expr, &paths::ITERATOR)