about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/librustc_mir/borrow_check.rs14
-rw-r--r--src/test/ui/lifetime-errors/liveness-assign-imm-local-notes.rs54
-rw-r--r--src/test/ui/lifetime-errors/liveness-assign-imm-local-notes.stderr64
3 files changed, 126 insertions, 6 deletions
diff --git a/src/librustc_mir/borrow_check.rs b/src/librustc_mir/borrow_check.rs
index 57735807edb..76968a871c9 100644
--- a/src/librustc_mir/borrow_check.rs
+++ b/src/librustc_mir/borrow_check.rs
@@ -1586,13 +1586,15 @@ impl<'cx, 'gcx, 'tcx> MirBorrowckCtxt<'cx, 'gcx, 'tcx> {
                                    _context: Context,
                                    (lvalue, span): (&Lvalue<'tcx>, Span),
                                    assigned_span: Span) {
-        self.tcx.cannot_reassign_immutable(span,
+        let mut err = self.tcx.cannot_reassign_immutable(span,
                                            &self.describe_lvalue(lvalue),
-                                           Origin::Mir)
-                .span_label(span, "cannot assign twice to immutable variable")
-                .span_label(assigned_span, format!("first assignment to `{}`",
-                                                   self.describe_lvalue(lvalue)))
-                .emit();
+                                           Origin::Mir);
+        err.span_label(span, "cannot assign twice to immutable variable");
+        if span != assigned_span {
+            err.span_label(assigned_span, format!("first assignment to `{}`",
+                                              self.describe_lvalue(lvalue)));
+        }
+        err.emit();
     }
 
     fn report_assignment_to_static(&mut self,
diff --git a/src/test/ui/lifetime-errors/liveness-assign-imm-local-notes.rs b/src/test/ui/lifetime-errors/liveness-assign-imm-local-notes.rs
new file mode 100644
index 00000000000..d4ef87cdd76
--- /dev/null
+++ b/src/test/ui/lifetime-errors/liveness-assign-imm-local-notes.rs
@@ -0,0 +1,54 @@
+// Copyright 2012 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.
+
+// FIXME: Change to UI Test
+// Check notes are placed on an assignment that can actually preceed the current assigmnent
+// Don't emmit a first assignment for assignment in a loop.
+
+// compile-flags: -Zborrowck=compare
+
+fn test() {
+    let x;
+    if true {
+        x = 1;
+    } else {
+        x = 2;
+        x = 3;      //~ ERROR (Ast) [E0384]
+                    //~^ ERROR (Mir) [E0384]
+    }
+}
+
+fn test_in_loop() {
+    loop {
+        let x;
+        if true {
+            x = 1;
+        } else {
+            x = 2;
+            x = 3;      //~ ERROR (Ast) [E0384]
+                        //~^ ERROR (Mir) [E0384]
+        }
+    }
+}
+
+fn test_using_loop() {
+    let x;
+    loop {
+        if true {
+            x = 1;      //~ ERROR (Ast) [E0384]
+                        //~^ ERROR (Mir) [E0384]
+        } else {
+            x = 2;      //~ ERROR (Ast) [E0384]
+                        //~^ ERROR (Mir) [E0384]
+        }
+    }
+}
+
+fn main() {}
diff --git a/src/test/ui/lifetime-errors/liveness-assign-imm-local-notes.stderr b/src/test/ui/lifetime-errors/liveness-assign-imm-local-notes.stderr
new file mode 100644
index 00000000000..b8f738e445e
--- /dev/null
+++ b/src/test/ui/lifetime-errors/liveness-assign-imm-local-notes.stderr
@@ -0,0 +1,64 @@
+error[E0384]: cannot assign twice to immutable variable `x` (Ast)
+  --> $DIR/liveness-assign-imm-local-notes.rs:23:9
+   |
+22 |         x = 2;
+   |         ----- first assignment to `x`
+23 |         x = 3;      //~ ERROR (Ast) [E0384]
+   |         ^^^^^ cannot assign twice to immutable variable
+
+error[E0384]: cannot assign twice to immutable variable `x` (Ast)
+  --> $DIR/liveness-assign-imm-local-notes.rs:35:13
+   |
+34 |             x = 2;
+   |             ----- first assignment to `x`
+35 |             x = 3;      //~ ERROR (Ast) [E0384]
+   |             ^^^^^ cannot assign twice to immutable variable
+
+error[E0384]: cannot assign twice to immutable variable `x` (Ast)
+  --> $DIR/liveness-assign-imm-local-notes.rs:45:13
+   |
+45 |             x = 1;      //~ ERROR (Ast) [E0384]
+   |             ^^^^^ cannot assign twice to immutable variable
+
+error[E0384]: cannot assign twice to immutable variable `x` (Ast)
+  --> $DIR/liveness-assign-imm-local-notes.rs:48:13
+   |
+45 |             x = 1;      //~ ERROR (Ast) [E0384]
+   |             ----- first assignment to `x`
+...
+48 |             x = 2;      //~ ERROR (Ast) [E0384]
+   |             ^^^^^ cannot assign twice to immutable variable
+
+error[E0384]: cannot assign twice to immutable variable `x` (Mir)
+  --> $DIR/liveness-assign-imm-local-notes.rs:23:9
+   |
+22 |         x = 2;
+   |         ----- first assignment to `x`
+23 |         x = 3;      //~ ERROR (Ast) [E0384]
+   |         ^^^^^ cannot assign twice to immutable variable
+
+error[E0384]: cannot assign twice to immutable variable `x` (Mir)
+  --> $DIR/liveness-assign-imm-local-notes.rs:35:13
+   |
+34 |             x = 2;
+   |             ----- first assignment to `x`
+35 |             x = 3;      //~ ERROR (Ast) [E0384]
+   |             ^^^^^ cannot assign twice to immutable variable
+
+error[E0384]: cannot assign twice to immutable variable `x` (Mir)
+  --> $DIR/liveness-assign-imm-local-notes.rs:45:13
+   |
+45 |             x = 1;      //~ ERROR (Ast) [E0384]
+   |             ^^^^^ cannot assign twice to immutable variable
+
+error[E0384]: cannot assign twice to immutable variable `x` (Mir)
+  --> $DIR/liveness-assign-imm-local-notes.rs:48:13
+   |
+45 |             x = 1;      //~ ERROR (Ast) [E0384]
+   |             ----- first assignment to `x`
+...
+48 |             x = 2;      //~ ERROR (Ast) [E0384]
+   |             ^^^^^ cannot assign twice to immutable variable
+
+error: aborting due to 8 previous errors
+