about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEsteban Küber <esteban@kuber.com.ar>2018-01-07 17:02:26 -0800
committerEsteban Küber <esteban@kuber.com.ar>2018-01-07 19:00:45 -0800
commit18908184de3d6f29c8bd2a364b105fd89a7f0377 (patch)
tree39b42aebd70397ccccd7b997ebade99f748c4a0d
parentee220daca345302c3277befee2732b6b2a5a711c (diff)
downloadrust-18908184de3d6f29c8bd2a364b105fd89a7f0377.tar.gz
rust-18908184de3d6f29c8bd2a364b105fd89a7f0377.zip
Assignment to immutable argument: diagnostic tweak
-rw-r--r--src/librustc_borrowck/borrowck/mod.rs2
-rw-r--r--src/librustc_mir/borrow_check/error_reporting.rs26
-rw-r--r--src/test/compile-fail/issue-45199.rs4
-rw-r--r--src/test/ui/borrowck/immutable-arg.rs20
-rw-r--r--src/test/ui/borrowck/immutable-arg.stderr18
5 files changed, 61 insertions, 9 deletions
diff --git a/src/librustc_borrowck/borrowck/mod.rs b/src/librustc_borrowck/borrowck/mod.rs
index 58112650c05..61ca37afae9 100644
--- a/src/librustc_borrowck/borrowck/mod.rs
+++ b/src/librustc_borrowck/borrowck/mod.rs
@@ -776,7 +776,7 @@ impl<'a, 'tcx> BorrowckCtxt<'a, 'tcx> {
         err.span_label(span, "cannot assign twice to immutable variable");
         if span != assign.span {
             err.span_label(assign.span, format!("first assignment to `{}`",
-                                              self.loan_path_to_string(lp)));
+                                                self.loan_path_to_string(lp)));
         }
         err.emit();
     }
diff --git a/src/librustc_mir/borrow_check/error_reporting.rs b/src/librustc_mir/borrow_check/error_reporting.rs
index 19bebea7cb8..94308554814 100644
--- a/src/librustc_mir/borrow_check/error_reporting.rs
+++ b/src/librustc_mir/borrow_check/error_reporting.rs
@@ -10,7 +10,7 @@
 
 use syntax_pos::Span;
 use rustc::middle::region::ScopeTree;
-use rustc::mir::{BorrowKind, Field, Local, Location, Operand};
+use rustc::mir::{BorrowKind, Field, Local, LocalKind, Location, Operand};
 use rustc::mir::{Place, ProjectionElem, Rvalue, Statement, StatementKind};
 use rustc::ty::{self, RegionKind};
 use rustc_data_structures::indexed_vec::Idx;
@@ -573,14 +573,28 @@ impl<'cx, 'gcx, 'tcx> MirBorrowckCtxt<'cx, 'gcx, 'tcx> {
             &self.describe_place(place).unwrap_or("_".to_owned()),
             Origin::Mir,
         );
-        err.span_label(span, "cannot assign twice to immutable variable");
+        let mut msg = "cannot assign twice to immutable variable";
         if span != assigned_span {
-            let value_msg = match self.describe_place(place) {
-                Some(name) => format!("`{}`", name),
-                None => "value".to_owned(),
+            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
+                }
+            } else {
+                false
             };
-            err.span_label(assigned_span, format!("first assignment to {}", value_msg));
+            if !suggestion {
+                let value_msg = match self.describe_place(place) {
+                    Some(name) => format!("`{}`", name),
+                    None => "value".to_owned(),
+                };
+                err.span_label(assigned_span, format!("first assignment to {}", value_msg));
+            }
         }
+        err.span_label(span, msg);
         err.emit();
     }
 }
diff --git a/src/test/compile-fail/issue-45199.rs b/src/test/compile-fail/issue-45199.rs
index af8f7dce608..b4468653e80 100644
--- a/src/test/compile-fail/issue-45199.rs
+++ b/src/test/compile-fail/issue-45199.rs
@@ -31,11 +31,11 @@ fn test_call() {
 }
 
 fn test_args(b: Box<i32>) {  //[ast]~ NOTE first assignment
-                                //[mir]~^ 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`
                                 //[ast]~| NOTE cannot assign twice to immutable
-                                //[mir]~| NOTE cannot assign twice to immutable
+                                //[mir]~| NOTE cannot assign to immutable argument
 }
 
 fn main() {}
diff --git a/src/test/ui/borrowck/immutable-arg.rs b/src/test/ui/borrowck/immutable-arg.rs
new file mode 100644
index 00000000000..ea3a95bd573
--- /dev/null
+++ b/src/test/ui/borrowck/immutable-arg.rs
@@ -0,0 +1,20 @@
+// Copyright 2018 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 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+//compile-flags: -Z emit-end-regions -Z borrowck=compare
+
+fn foo(_x: u32) {
+    _x = 4;
+    //~^ ERROR cannot assign twice to immutable variable `_x` (Mir)
+    //~^^ ERROR cannot assign twice to immutable variable `_x` (Ast)
+}
+
+fn main() {}
+
diff --git a/src/test/ui/borrowck/immutable-arg.stderr b/src/test/ui/borrowck/immutable-arg.stderr
new file mode 100644
index 00000000000..a83addc8c65
--- /dev/null
+++ b/src/test/ui/borrowck/immutable-arg.stderr
@@ -0,0 +1,18 @@
+error[E0384]: cannot assign twice to immutable variable `_x` (Ast)
+  --> $DIR/immutable-arg.rs:14:5
+   |
+13 | fn foo(_x: u32) {
+   |        -- first assignment to `_x`
+14 |     _x = 4;
+   |     ^^^^^^ cannot assign twice to immutable variable
+
+error[E0384]: cannot assign twice to immutable variable `_x` (Mir)
+  --> $DIR/immutable-arg.rs:14:5
+   |
+13 | fn foo(_x: u32) {
+   |        -- argument not declared as `mut`
+14 |     _x = 4;
+   |     ^^^^^^ cannot assign to immutable argument
+
+error: aborting due to 2 previous errors
+