Skip to content

Commit 52442d4

Browse files
committed
Fix error does not know about free/named lifetimes
1 parent 15b8fbd commit 52442d4

File tree

1 file changed

+26
-11
lines changed

1 file changed

+26
-11
lines changed

src/librustc_mir/borrow_check/error_reporting.rs

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
use syntax_pos::Span;
1212
use rustc::mir::{BorrowKind, Field, Local, Location, Operand};
1313
use rustc::mir::{Place, ProjectionElem, Rvalue, StatementKind};
14-
use rustc::ty;
14+
use rustc::ty::{self, RegionKind};
1515
use rustc_data_structures::indexed_vec::Idx;
1616

1717
use super::{MirBorrowckCtxt, Context};
@@ -366,17 +366,32 @@ impl<'cx, 'gcx, 'tcx> MirBorrowckCtxt<'cx, 'gcx, 'tcx> {
366366
err.emit();
367367
},
368368
None => {
369-
let mut err = self.tcx
370-
.path_does_not_live_long_enough(drop_span, "borrowed value", Origin::Mir);
371-
err.span_label(proper_span, "temporary value created here");
372-
err.span_label(drop_span, "temporary value dropped here while still borrowed");
373-
err.note("consider using a `let` binding to increase its lifetime");
374-
375-
if let Some(end) = end_span {
376-
err.span_label(end, "temporary value needs to live until here");
369+
match borrow.region {
370+
RegionKind::ReEarlyBound(_) | RegionKind::ReFree(_) => {
371+
let mut err = self.tcx.path_does_not_live_long_enough(proper_span,
372+
"borrowed value",
373+
Origin::Mir);
374+
err.span_label(proper_span, "does not live long enough");
375+
err.span_label(drop_span, "temporary value only lives until here");
376+
self.tcx.note_and_explain_region(scope_tree, &mut err,
377+
"borrowed value must be valid for ",
378+
borrow.region, "...");
379+
err.emit();
380+
},
381+
_ => {
382+
let mut err = self.tcx.path_does_not_live_long_enough(drop_span,
383+
"borrowed value",
384+
Origin::Mir);
385+
err.span_label(proper_span, "temporary value created here");
386+
err.span_label(drop_span,
387+
"temporary value dropped here while still borrowed");
388+
err.note("consider using a `let` binding to increase its lifetime");
389+
if let Some(end) = end_span {
390+
err.span_label(end, "temporary value needs to live until here");
391+
}
392+
err.emit();
393+
},
377394
}
378-
379-
err.emit();
380395
},
381396
}
382397
}

0 commit comments

Comments
 (0)