From cfe4efd0523cd8106b20ba732f7d7677548f8157 Mon Sep 17 00:00:00 2001 From: Ulrik Sverdrup Date: Fri, 4 Mar 2016 22:52:34 +0100 Subject: [PATCH] Do not trigger unused_variables lint for variable modified through AddAssign Visit an overloaded += like a method call and not like an assignment. --- src/librustc/middle/liveness.rs | 16 +++++++++++----- src/test/compile-fail/liveness-unused.rs | 19 +++++++++++++++++++ 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/src/librustc/middle/liveness.rs b/src/librustc/middle/liveness.rs index b581466fede..0412b269031 100644 --- a/src/librustc/middle/liveness.rs +++ b/src/librustc/middle/liveness.rs @@ -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 diff --git a/src/test/compile-fail/liveness-unused.rs b/src/test/compile-fail/liveness-unused.rs index ddc120b8646..3aab953eb79 100644 --- a/src/test/compile-fail/liveness-unused.rs +++ b/src/test/compile-fail/liveness-unused.rs @@ -127,5 +127,24 @@ fn f6() { }) += 1; } + +struct MutRef<'a>(&'a mut i32); + +impl<'a> AddAssign 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() { } -- 2.44.0