Skip to content

Commit

Permalink
Make the unused_mut lint smarter with respect to locals.
Browse files Browse the repository at this point in the history
Fixes #26332
  • Loading branch information
arielb1 authored and Ariel Ben-Yehuda committed Jun 30, 2015
1 parent 2f45294 commit a18d984
Show file tree
Hide file tree
Showing 7 changed files with 23 additions and 23 deletions.
4 changes: 2 additions & 2 deletions src/libcore/iter.rs
Expand Up @@ -2655,8 +2655,8 @@ macro_rules! step_impl_signed {
#[allow(trivial_numeric_casts)]
fn steps_between(start: &$t, end: &$t, by: &$t) -> Option<usize> {
if *by == 0 { return None; }
let mut diff: usize;
let mut by_u: usize;
let diff: usize;
let by_u: usize;
if *by > 0 {
if *start >= *end {
return Some(0);
Expand Down
2 changes: 1 addition & 1 deletion src/libfmt_macros/lib.rs
Expand Up @@ -399,7 +399,7 @@ impl<'a> Parser<'a> {
}
Some(..) | None => { return &self.input[..0]; }
};
let mut end;
let end;
loop {
match self.cur.clone().next() {
Some((_, c)) if c.is_xid_continue() => {
Expand Down
2 changes: 1 addition & 1 deletion src/librustc/middle/infer/error_reporting.rs
Expand Up @@ -1854,7 +1854,7 @@ impl LifeGiver {
}

fn give_lifetime(&self) -> ast::Lifetime {
let mut lifetime;
let lifetime;
loop {
let mut s = String::from("'");
s.push_str(&num_to_string(self.counter.get()));
Expand Down
25 changes: 8 additions & 17 deletions src/librustc_borrowck/borrowck/check_loans.rs
Expand Up @@ -182,7 +182,7 @@ impl<'a, 'tcx> euv::Delegate<'tcx> for CheckLoanCtxt<'a, 'tcx> {
None => { }
}

self.check_assignment(assignment_id, assignment_span, assignee_cmt, mode);
self.check_assignment(assignment_id, assignment_span, assignee_cmt);
}

fn decl_without_init(&mut self, _id: ast::NodeId, _span: Span) { }
Expand Down Expand Up @@ -782,16 +782,9 @@ impl<'a, 'tcx> CheckLoanCtxt<'a, 'tcx> {
fn check_assignment(&self,
assignment_id: ast::NodeId,
assignment_span: Span,
assignee_cmt: mc::cmt<'tcx>,
mode: euv::MutateMode) {
assignee_cmt: mc::cmt<'tcx>) {
debug!("check_assignment(assignee_cmt={:?})", assignee_cmt);

// Initializations never cause borrow errors as they only
// affect a fresh local.
if mode == euv::Init {
return
}

// Check that we don't invalidate any outstanding loans
if let Some(loan_path) = opt_loan_path(&assignee_cmt) {
let scope = region::CodeExtent::from_node_id(assignment_id);
Expand All @@ -801,17 +794,15 @@ impl<'a, 'tcx> CheckLoanCtxt<'a, 'tcx> {
});
}

// Local variables can always be assigned to, expect for reassignments
// of immutable variables (or assignments that invalidate loans,
// of course).
// Check for reassignments to (immutable) local variables. This
// needs to be done here instead of in check_loans because we
// depend on move data.
if let mc::cat_local(local_id) = assignee_cmt.cat {
if assignee_cmt.mutbl.is_mutable() {
self.tcx().used_mut_nodes.borrow_mut().insert(local_id);
}

let lp = opt_loan_path(&assignee_cmt).unwrap();
self.move_data.each_assignment_of(assignment_id, &lp, |assign| {
if !assignee_cmt.mutbl.is_mutable() {
if assignee_cmt.mutbl.is_mutable() {
self.tcx().used_mut_nodes.borrow_mut().insert(local_id);
} else {
self.bccx.report_reassigned_immutable_variable(
assignment_span,
&*lp,
Expand Down
2 changes: 1 addition & 1 deletion src/librustc_trans/save/dump_csv.rs
Expand Up @@ -308,7 +308,7 @@ impl <'l, 'tcx> DumpCsvVisitor<'l, 'tcx> {

debug!("process_method: {}:{}", id, token::get_name(name));

let mut scope_id;
let scope_id;
// The qualname for a method is the trait name or name of the struct in an impl in
// which the method is declared in, followed by the method's name.
let qualname = match self.tcx.impl_of_method(ast_util::local_def(id)) {
Expand Down
2 changes: 1 addition & 1 deletion src/libsyntax/parse/lexer/mod.rs
Expand Up @@ -598,7 +598,7 @@ impl<'a> StringReader<'a> {

/// Lex a LIT_INTEGER or a LIT_FLOAT
fn scan_number(&mut self, c: char) -> token::Lit {
let mut num_digits;
let num_digits;
let mut base = 10;
let start_bpos = self.last_pos;

Expand Down
9 changes: 9 additions & 0 deletions src/test/compile-fail/lint-unused-mut-variables.rs
Expand Up @@ -23,6 +23,15 @@ fn main() {
let mut b = 3; //~ ERROR: variable does not need to be mutable
let mut a = vec!(3); //~ ERROR: variable does not need to be mutable
let (mut a, b) = (1, 2); //~ ERROR: variable does not need to be mutable
let mut a; //~ ERROR: variable does not need to be mutable
a = 3;

let mut b; //~ ERROR: variable does not need to be mutable
if true {
b = 3;
} else {
b = 4;
}

match 30 {
mut x => {} //~ ERROR: variable does not need to be mutable
Expand Down

0 comments on commit a18d984

Please sign in to comment.