diff options
| author | David Wood <david@davidtw.co> | 2017-12-09 11:45:15 +0000 |
|---|---|---|
| committer | David Wood <david@davidtw.co> | 2017-12-11 20:14:06 +0000 |
| commit | d78e8a730a266ce75ff1fc0f9cdc66716de78744 (patch) | |
| tree | b4c4a33c9148d80f455e8a26d8f2d41cf68460d0 /src | |
| parent | 4651d1e3cf784d19c0c9e5f79b5f0b83a31a7ce9 (diff) | |
| download | rust-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.rs | 31 | ||||
| -rw-r--r-- | src/librustc_mir/borrow_check/mod.rs | 1 |
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 |
