]> git.lizzy.rs Git - rust.git/commitdiff
Do not trigger unused_variables lint for variable modified through AddAssign
authorUlrik Sverdrup <bluss@users.noreply.github.com>
Fri, 4 Mar 2016 21:52:34 +0000 (22:52 +0100)
committerUlrik Sverdrup <bluss@users.noreply.github.com>
Fri, 4 Mar 2016 21:52:34 +0000 (22:52 +0100)
Visit an overloaded += like a method call and not like an assignment.

src/librustc/middle/liveness.rs
src/test/compile-fail/liveness-unused.rs

index b581466fedeec452f03c963ea5b21c7b2521811e..0412b26903137eaf0f5a297332979bbd7ef5b916 100644 (file)
@@ -1086,11 +1086,17 @@ fn propagate_through_expr(&mut self, expr: &Expr, succ: LiveNode)
           }
 
           hir::ExprAssignOp(_, ref l, ref r) => {
-            // see comment on lvalues in
-            // propagate_through_lvalue_components()
-            let succ = self.write_lvalue(&l, succ, ACC_WRITE|ACC_READ);
-            let succ = self.propagate_through_expr(&r, succ);
-            self.propagate_through_lvalue_components(&l, succ)
+            // an overloaded assign op is like a method call
+            if self.ir.tcx.is_method_call(expr.id) {
+                let succ = self.propagate_through_expr(&l, succ);
+                self.propagate_through_expr(&r, succ)
+            } else {
+                // see comment on lvalues in
+                // propagate_through_lvalue_components()
+                let succ = self.write_lvalue(&l, succ, ACC_WRITE|ACC_READ);
+                let succ = self.propagate_through_expr(&r, succ);
+                self.propagate_through_lvalue_components(&l, succ)
+            }
           }
 
           // Uninteresting cases: just propagate in rev exec order
index ddc120b8646911f1faf956008ad4c7bbec3a0d10..3aab953eb7940bc6d2a33c3e73ce5b78d30d53aa 100644 (file)
@@ -127,5 +127,24 @@ fn f6() {
     }) += 1;
 }
 
+
+struct MutRef<'a>(&'a mut i32);
+
+impl<'a> AddAssign<i32> for MutRef<'a> {
+    fn add_assign(&mut self, rhs: i32) {
+        *self.0 += rhs;
+    }
+}
+
+fn f7() {
+    let mut a = 1;
+    {
+        // `b` does not trigger unused_variables
+        let mut b = MutRef(&mut a);
+        b += 1;
+    }
+    drop(a);
+}
+
 fn main() {
 }