diff options
| author | David Wood <david@davidtw.co> | 2017-12-10 17:47:55 +0000 |
|---|---|---|
| committer | David Wood <david@davidtw.co> | 2017-12-11 20:34:39 +0000 |
| commit | 52442d4d8a04f24735f9de120579ba3d997b811b (patch) | |
| tree | 6dd1d61f8f99056fc1bcc0bc06eb2fff10ba84fc /src | |
| parent | 15b8fbdfb395315bb082eab793c4b02fa9534aee (diff) | |
| download | rust-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.rs | 37 |
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(); }, } } |
