diff --git a/src/librustc_borrowck/borrowck/mod.rs b/src/librustc_borrowck/borrowck/mod.rs index e8179a8cee0..ccb48ed2edf 100644 --- a/src/librustc_borrowck/borrowck/mod.rs +++ b/src/librustc_borrowck/borrowck/mod.rs @@ -1015,7 +1015,18 @@ impl<'a, 'tcx> BorrowckCtxt<'a, 'tcx> { self by mutable reference"); } } - _ => {} + _ => { + if let Categorization::Local(local_id) = err.cmt.cat { + let span = self.tcx.map.span(local_id); + if let Ok(snippet) = self.tcx.sess.codemap().span_to_snippet(span) { + self.tcx.sess.span_suggestion( + span, + &format!("to make the {} mutable, use `mut` as shown:", + self.cmt_to_string(&err.cmt)), + format!("mut {}", snippet)); + } + } + } } } diff --git a/src/test/compile-fail/mut-suggestion.rs b/src/test/compile-fail/mut-suggestion.rs new file mode 100644 index 00000000000..efd796e1195 --- /dev/null +++ b/src/test/compile-fail/mut-suggestion.rs @@ -0,0 +1,30 @@ +// Copyright 2015 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +#[derive(Copy, Clone)] +struct S; + +impl S { + fn mutate(&mut self) { + } +} + +fn func(arg: S) { + //~^ HELP use `mut` as shown + //~| SUGGESTION fn func(mut arg: S) { + arg.mutate(); //~ ERROR cannot borrow immutable argument +} + +fn main() { + let local = S; + //~^ HELP use `mut` as shown + //~| SUGGESTION let mut local = S; + local.mutate(); //~ ERROR cannot borrow immutable local variable +}