Modify message to match label

This commit is contained in:
Esteban Küber 2018-01-09 19:10:45 -08:00
parent 18908184de
commit 90bc98c5d1
6 changed files with 30 additions and 18 deletions

View File

@ -772,6 +772,7 @@ impl<'a, 'tcx> BorrowckCtxt<'a, 'tcx> {
&move_data::Assignment) {
let mut err = self.cannot_reassign_immutable(span,
&self.loan_path_to_string(lp),
false,
Origin::Ast);
err.span_label(span, "cannot assign twice to immutable variable");
if span != assign.span {

View File

@ -568,25 +568,31 @@ impl<'cx, 'gcx, 'tcx> MirBorrowckCtxt<'cx, 'gcx, 'tcx> {
(place, span): (&Place<'tcx>, Span),
assigned_span: Span,
) {
let is_arg = if let Place::Local(local) = place {
if let LocalKind::Arg = self.mir.local_kind(*local) {
true
} else {
false
}
} else {
false
};
let mut err = self.tcx.cannot_reassign_immutable(
span,
&self.describe_place(place).unwrap_or("_".to_owned()),
is_arg,
Origin::Mir,
);
let mut msg = "cannot assign twice to immutable variable";
let msg = if is_arg {
"cannot assign to immutable argument"
} else {
"cannot assign twice to immutable variable"
};
if span != assigned_span {
let suggestion = if let Place::Local(local) = place {
if let LocalKind::Arg = self.mir.local_kind(*local) {
msg = "cannot assign to immutable argument";
err.span_label(assigned_span, "argument not declared as `mut`");
true
} else {
false
}
if is_arg {
err.span_label(assigned_span, "argument not declared as `mut`");
} else {
false
};
if !suggestion {
let value_msg = match self.describe_place(place) {
Some(name) => format!("`{}`", name),
None => "value".to_owned(),

View File

@ -269,12 +269,17 @@ pub trait BorrowckErrors {
self.cancel_if_wrong_origin(err, o)
}
fn cannot_reassign_immutable(&self, span: Span, desc: &str, o: Origin)
fn cannot_reassign_immutable(&self, span: Span, desc: &str, is_arg: bool, o: Origin)
-> DiagnosticBuilder
{
let msg = if is_arg {
"to immutable argument"
} else {
"twice to immutable variable"
};
let err = struct_span_err!(self, span, E0384,
"cannot assign twice to immutable variable `{}`{OGN}",
desc, OGN=o);
"cannot assign {} `{}`{OGN}",
msg, desc, OGN=o);
self.cancel_if_wrong_origin(err, o)
}

View File

@ -33,7 +33,7 @@ fn test_call() {
fn test_args(b: Box<i32>) { //[ast]~ NOTE first assignment
//[mir]~^ NOTE argument not declared as `mut`
b = Box::new(2); //[ast]~ ERROR cannot assign twice to immutable variable
//[mir]~^ ERROR cannot assign twice to immutable variable `b`
//[mir]~^ ERROR cannot assign to immutable argument `b`
//[ast]~| NOTE cannot assign twice to immutable
//[mir]~| NOTE cannot assign to immutable argument
}

View File

@ -12,7 +12,7 @@
fn foo(_x: u32) {
_x = 4;
//~^ ERROR cannot assign twice to immutable variable `_x` (Mir)
//~^ ERROR cannot assign to immutable argument `_x` (Mir)
//~^^ ERROR cannot assign twice to immutable variable `_x` (Ast)
}

View File

@ -6,7 +6,7 @@ error[E0384]: cannot assign twice to immutable variable `_x` (Ast)
14 | _x = 4;
| ^^^^^^ cannot assign twice to immutable variable
error[E0384]: cannot assign twice to immutable variable `_x` (Mir)
error[E0384]: cannot assign to immutable argument `_x` (Mir)
--> $DIR/immutable-arg.rs:14:5
|
13 | fn foo(_x: u32) {