about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorDavid Wood <david@davidtw.co>2017-12-10 17:47:55 +0000
committerDavid Wood <david@davidtw.co>2017-12-11 20:34:39 +0000
commit52442d4d8a04f24735f9de120579ba3d997b811b (patch)
tree6dd1d61f8f99056fc1bcc0bc06eb2fff10ba84fc /src
parent15b8fbdfb395315bb082eab793c4b02fa9534aee (diff)
downloadrust-52442d4d8a04f24735f9de120579ba3d997b811b.tar.gz
rust-52442d4d8a04f24735f9de120579ba3d997b811b.zip
Fix error does not know about free/named lifetimes
Diffstat (limited to 'src')
-rw-r--r--src/librustc_mir/borrow_check/error_reporting.rs37
1 files changed, 26 insertions, 11 deletions
diff --git a/src/librustc_mir/borrow_check/error_reporting.rs b/src/librustc_mir/borrow_check/error_reporting.rs
index 4354c16f73b..33a6588c83b 100644
--- a/src/librustc_mir/borrow_check/error_reporting.rs
+++ b/src/librustc_mir/borrow_check/error_reporting.rs
@@ -11,7 +11,7 @@
 use syntax_pos::Span;
 use rustc::mir::{BorrowKind, Field, Local, Location, Operand};
 use rustc::mir::{Place, ProjectionElem, Rvalue, StatementKind};
-use rustc::ty;
+use rustc::ty::{self, RegionKind};
 use rustc_data_structures::indexed_vec::Idx;
 
 use super::{MirBorrowckCtxt, Context};
@@ -366,17 +366,32 @@ impl<'cx, 'gcx, 'tcx> MirBorrowckCtxt<'cx, 'gcx, 'tcx> {
                 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");
+                match borrow.region {
+                    RegionKind::ReEarlyBound(_) | RegionKind::ReFree(_) => {
+                        let mut err = self.tcx.path_does_not_live_long_enough(proper_span,
+                                                                              "borrowed value",
+                                                                              Origin::Mir);
+                        err.span_label(proper_span, "does not live long enough");
+                        err.span_label(drop_span, "temporary value only lives until here");
+                        self.tcx.note_and_explain_region(scope_tree, &mut err,
+                                                         "borrowed value must be valid for ",
+                                                         borrow.region, "...");
+                        err.emit();
+                    },
+                    _ => {
+                        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");
+                        }
+                        err.emit();
+                    },
                 }
-
-                err.emit();
             },
         }
     }