|
11 | 11 | use syntax_pos::Span;
|
12 | 12 | use rustc::mir::{BorrowKind, Field, Local, Location, Operand};
|
13 | 13 | use rustc::mir::{Place, ProjectionElem, Rvalue, StatementKind};
|
14 |
| -use rustc::ty; |
| 14 | +use rustc::ty::{self, RegionKind}; |
15 | 15 | use rustc_data_structures::indexed_vec::Idx;
|
16 | 16 |
|
17 | 17 | use super::{MirBorrowckCtxt, Context};
|
@@ -366,17 +366,32 @@ impl<'cx, 'gcx, 'tcx> MirBorrowckCtxt<'cx, 'gcx, 'tcx> {
|
366 | 366 | err.emit();
|
367 | 367 | },
|
368 | 368 | 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 | + }, |
377 | 394 | }
|
378 |
| - |
379 |
| - err.emit(); |
380 | 395 | },
|
381 | 396 | }
|
382 | 397 | }
|
|
0 commit comments