From 61e5b6dfdbb34d9569ebddc6af09cb5a5beb605a Mon Sep 17 00:00:00 2001 From: Seo Sanghyeon Date: Tue, 3 Nov 2015 19:04:36 +0900 Subject: [PATCH] Warn unused_assignments for arguments --- src/librustc/middle/liveness.rs | 20 ++++++++++++++++---- src/test/compile-fail/liveness-dead.rs | 10 ++++++++++ 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/librustc/middle/liveness.rs b/src/librustc/middle/liveness.rs index 3b56597d353a3..b25ad66fd1fa5 100644 --- a/src/librustc/middle/liveness.rs +++ b/src/librustc/middle/liveness.rs @@ -1555,7 +1555,11 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> { // Ignore unused self. let name = path1.node; if name != special_idents::self_.name { - self.warn_about_unused(sp, p_id, entry_ln, var); + if !self.warn_about_unused(sp, p_id, entry_ln, var) { + if self.live_on_entry(entry_ln, var).is_none() { + self.report_dead_assign(p_id, sp, var, true); + } + } } }) } @@ -1609,11 +1613,19 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> { ln: LiveNode, var: Variable) { if self.live_on_exit(ln, var).is_none() { - let r = self.should_warn(var); - if let Some(name) = r { + self.report_dead_assign(id, sp, var, false); + } + } + + fn report_dead_assign(&self, id: NodeId, sp: Span, var: Variable, is_argument: bool) { + if let Some(name) = self.should_warn(var) { + if is_argument { + self.ir.tcx.sess.add_lint(lint::builtin::UNUSED_ASSIGNMENTS, id, sp, + format!("value passed to `{}` is never read", name)); + } else { self.ir.tcx.sess.add_lint(lint::builtin::UNUSED_ASSIGNMENTS, id, sp, format!("value assigned to `{}` is never read", name)); } } } - } +} diff --git a/src/test/compile-fail/liveness-dead.rs b/src/test/compile-fail/liveness-dead.rs index dc7b0fc4fd0f2..ddd8fc68c43a3 100644 --- a/src/test/compile-fail/liveness-dead.rs +++ b/src/test/compile-fail/liveness-dead.rs @@ -27,4 +27,14 @@ fn f3() { x = 4; //~ ERROR: value assigned to `x` is never read } +fn f4(mut x: i32) { //~ ERROR: value passed to `x` is never read + x = 4; + x.clone(); +} + +fn f5(mut x: i32) { + x.clone(); + x = 4; //~ ERROR: value assigned to `x` is never read +} + fn main() {}