about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorFelix S. Klock II <pnkfelix@pnkfx.org>2017-08-22 11:23:17 +0200
committerFelix S. Klock II <pnkfelix@pnkfx.org>2017-09-25 13:02:17 +0200
commitc4c32b24bd757975b693fbbb46320503d6415f55 (patch)
tree4634f00cb6ac0c69981d348eda2486958264711d /src
parentcd93969ec4fb2d0bc2b5376aec269cf08491187b (diff)
downloadrust-c4c32b24bd757975b693fbbb46320503d6415f55.tar.gz
rust-c4c32b24bd757975b693fbbb46320503d6415f55.zip
More fine-grained delineation for mir-borrowck errors.
Diffstat (limited to 'src')
-rw-r--r--src/librustc_mir/borrow_check.rs24
1 files changed, 20 insertions, 4 deletions
diff --git a/src/librustc_mir/borrow_check.rs b/src/librustc_mir/borrow_check.rs
index 10825323e41..8cc74ef0447 100644
--- a/src/librustc_mir/borrow_check.rs
+++ b/src/librustc_mir/borrow_check.rs
@@ -948,14 +948,30 @@ impl<'c, 'b, 'a: 'b+'c, 'gcx, 'tcx: 'a> MirBorrowckCtxt<'c, 'b, 'a, 'gcx, 'tcx>
         let mut err = match (loan1.kind, "immutable", "mutable",
                              loan2.kind, "immutable", "mutable") {
             (BorrowKind::Shared, lft, _, BorrowKind::Mut, _, rgt) |
-            (BorrowKind::Mut, _, lft, BorrowKind::Shared, rgt, _) |
-            (BorrowKind::Mut, _, lft, BorrowKind::Mut, _, rgt) =>
+            (BorrowKind::Mut, _, lft, BorrowKind::Shared, rgt, _) =>
                 self.tcx.cannot_reborrow_already_borrowed(
                     span, &self.describe_lvalue(lvalue),
                     "", lft, "it", rgt, "", Origin::Mir),
 
-            _ =>  self.tcx.cannot_mutably_borrow_multiply(
-                span, &self.describe_lvalue(lvalue), "", Origin::Mir),
+            (BorrowKind::Mut, _, _, BorrowKind::Mut, _, _) =>
+                self.tcx.cannot_mutably_borrow_multiply(
+                    span, &self.describe_lvalue(lvalue), "", Origin::Mir),
+
+            (BorrowKind::Unique, _, _, BorrowKind::Unique, _, _) =>
+                self.tcx.cannot_uniquely_borrow_by_two_closures(
+                    span, &self.describe_lvalue(lvalue), Origin::Mir),
+
+            (BorrowKind::Unique, _, _, _, _, _) =>
+                self.tcx.cannot_uniquely_borrow_by_one_closure(
+                    span, &self.describe_lvalue(lvalue), "it", "", Origin::Mir),
+
+            (_, _, _, BorrowKind::Unique, _, _) =>
+                self.tcx.cannot_reborrow_already_uniquely_borrowed(
+                    span, &self.describe_lvalue(lvalue), "it", "", Origin::Mir),
+
+            (BorrowKind::Shared, _, _, BorrowKind::Shared, _, _) =>
+                unreachable!(),
+
             // FIXME: add span labels for first and second mutable borrows, as well as
             // end point for first.
         };