]> git.lizzy.rs Git - rust.git/commitdiff
Fix FP with `for` loops and shadowed loop variable
authormcarton <cartonmartin+git@gmail.com>
Sun, 10 Jul 2016 12:05:57 +0000 (14:05 +0200)
committermcarton <cartonmartin+git@gmail.com>
Sun, 10 Jul 2016 12:05:57 +0000 (14:05 +0200)
clippy_lints/src/loops.rs
tests/compile-fail/for_loop.rs

index a4e338053e27b003add995aafcd537020e36d6e1..b87d1d3d5fdb449d567ebbfe440c63ea8effdf37 100644 (file)
@@ -1,6 +1,7 @@
 use reexport::*;
 use rustc::hir::*;
 use rustc::hir::def::Def;
+use rustc::hir::def_id::DefId;
 use rustc::hir::intravisit::{Visitor, walk_expr, walk_block, walk_decl};
 use rustc::hir::map::Node::NodeBlock;
 use rustc::lint::*;
@@ -337,7 +338,7 @@ fn check_for_loop_range(cx: &LateContext, pat: &Pat, arg: &Expr, body: &Expr, ex
         if let PatKind::Binding(_, ref ident, _) = pat.node {
             let mut visitor = VarVisitor {
                 cx: cx,
-                var: ident.node,
+                var: cx.tcx.expect_def(pat.id).def_id(),
                 indexed: HashMap::new(),
                 nonindex: false,
             };
@@ -667,7 +668,7 @@ fn visit_expr(&mut self, expr: &Expr) {
 
 struct VarVisitor<'v, 't: 'v> {
     cx: &'v LateContext<'v, 't>, // context reference
-    var: Name, // var name to look for as index
+    var: DefId, // var name to look for as index
     indexed: HashMap<Name, Option<CodeExtent>>, // indexed variables, the extent is None for global
     nonindex: bool, // has the var been used otherwise?
 }
@@ -675,7 +676,7 @@ struct VarVisitor<'v, 't: 'v> {
 impl<'v, 't> Visitor<'v> for VarVisitor<'v, 't> {
     fn visit_expr(&mut self, expr: &'v Expr) {
         if let ExprPath(None, ref path) = expr.node {
-            if path.segments.len() == 1 && path.segments[0].name == self.var {
+            if path.segments.len() == 1 && self.cx.tcx.expect_def(expr.id).def_id() == self.var {
                 // we are referencing our variable! now check if it's as an index
                 if_let_chain! {[
                     let Some(parexpr) = get_parent_expr(self.cx, expr),
index bcb20be4ff462d715541b840c25b6cdd094ccc55..91e31adc44d580dc75534f22dfc5f7e3dddd37de 100644 (file)
@@ -104,6 +104,12 @@ fn main() {
         println!("{}", vec[i]);
     }
 
+    for i in 0..vec.len() {
+        //~^ WARNING unused variable
+        let i = 42; // make a different `i`
+        println!("{}", vec[i]); // ok, not the `i` of the for-loop
+    }
+
     for i in 0..vec.len() { let _ = vec[i]; }
     //~^ ERROR `i` is only used to index `vec`
     //~| HELP consider