about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorDavid Wood <david@davidtw.co>2017-12-09 11:45:15 +0000
committerDavid Wood <david@davidtw.co>2017-12-11 20:14:06 +0000
commitd78e8a730a266ce75ff1fc0f9cdc66716de78744 (patch)
treeb4c4a33c9148d80f455e8a26d8f2d41cf68460d0 /src
parent4651d1e3cf784d19c0c9e5f79b5f0b83a31a7ce9 (diff)
downloadrust-d78e8a730a266ce75ff1fc0f9cdc66716de78744.tar.gz
rust-d78e8a730a266ce75ff1fc0f9cdc66716de78744.zip
Fix error message confuses locals and temporaries
Diffstat (limited to 'src')
-rw-r--r--src/librustc_mir/borrow_check/error_reporting.rs31
-rw-r--r--src/librustc_mir/borrow_check/mod.rs1
2 files changed, 22 insertions, 10 deletions
diff --git a/src/librustc_mir/borrow_check/error_reporting.rs b/src/librustc_mir/borrow_check/error_reporting.rs
index e4d2d7228c2..12f7f8cd8f8 100644
--- a/src/librustc_mir/borrow_check/error_reporting.rs
+++ b/src/librustc_mir/borrow_check/error_reporting.rs
@@ -347,22 +347,35 @@ impl<'cx, 'gcx, 'tcx> MirBorrowckCtxt<'cx, 'gcx, 'tcx> {
                 unreachable!("root_place is an unreachable???")
         };
 
+        let borrow_span = self.mir.source_info(borrow.location).span;
         let proper_span = match *root_place {
             Place::Local(local) => self.mir.local_decls[local].source_info.span,
             _ => drop_span,
         };
 
-        let mut err = self.tcx
-            .path_does_not_live_long_enough(drop_span, "borrowed value", Origin::Mir);
-        err.span_label(proper_span, "temporary value created here");
-        err.span_label(drop_span, "temporary value dropped here while still borrowed");
-        err.note("consider using a `let` binding to increase its lifetime");
+        match &self.describe_place(&borrow.place) {
+            Some(description) => {
+                let mut err = self.tcx.path_does_not_live_long_enough(
+                    borrow_span, &format!("`{}`", description), Origin::Mir);
+                err.span_label(borrow_span, "does not live long enough");
+                err.span_label(drop_span, "borrowed value only lives until here");
+                err.note("borrowed value must be valid for the static lifetime...");
+                err.emit();
+            },
+            None => {
+                let mut err = self.tcx
+                    .path_does_not_live_long_enough(drop_span, "borrowed value", Origin::Mir);
+                err.span_label(proper_span, "temporary value created here");
+                err.span_label(drop_span, "temporary value dropped here while still borrowed");
+                err.note("consider using a `let` binding to increase its lifetime");
+
+                if let Some(end) = end_span {
+                    err.span_label(end, "temporary value needs to live until here");
+                }
 
-        if let Some(end) = end_span {
-            err.span_label(end, "temporary value needs to live until here");
+                err.emit();
+            },
         }
-
-        err.emit();
     }
 
     pub(super) fn report_illegal_mutation_of_borrowed(
diff --git a/src/librustc_mir/borrow_check/mod.rs b/src/librustc_mir/borrow_check/mod.rs
index 358f96abe72..128052e5894 100644
--- a/src/librustc_mir/borrow_check/mod.rs
+++ b/src/librustc_mir/borrow_check/mod.rs
@@ -1800,7 +1800,6 @@ impl<'cx, 'gcx, 'tcx> MirBorrowckCtxt<'cx, 'gcx, 'tcx> {
     }
 }
 
-
 impl<'cx, 'gcx, 'tcx> MirBorrowckCtxt<'cx, 'gcx, 'tcx> {
     // FIXME (#16118): function intended to allow the borrow checker
     // to be less precise in its handling of Box while still allowing