From cfdf7633f08ee77e303f1bf88b613a35f9946e75 Mon Sep 17 00:00:00 2001 From: Mikhail Modin Date: Thu, 3 Nov 2016 09:58:01 +0300 Subject: [PATCH] Improve "Doesn't live long enough" error case with temporary variable --- src/librustc_borrowck/borrowck/mod.rs | 25 +++++++++---------- .../lifetimes/borrowck-let-suggestion.stderr | 4 +-- .../borrowck-let-suggestion-suffixes.stderr | 12 ++++----- .../{compile-fail => ui/span}/issue-15480.rs | 1 - src/test/ui/span/issue-15480.stderr | 15 +++++++++++ .../regions-close-over-borrowed-ref-in-obj.rs | 2 +- ...ions-close-over-borrowed-ref-in-obj.stderr | 13 ++++++++++ .../{compile-fail => ui/span}/slice-borrow.rs | 2 +- src/test/ui/span/slice-borrow.stderr | 13 ++++++++++ 9 files changed, 63 insertions(+), 24 deletions(-) rename src/test/{compile-fail => ui/span}/issue-15480.rs (91%) create mode 100644 src/test/ui/span/issue-15480.stderr rename src/test/{compile-fail => ui/span}/regions-close-over-borrowed-ref-in-obj.rs (88%) create mode 100644 src/test/ui/span/regions-close-over-borrowed-ref-in-obj.stderr rename src/test/{compile-fail => ui/span}/slice-borrow.rs (86%) create mode 100644 src/test/ui/span/slice-borrow.stderr diff --git a/src/librustc_borrowck/borrowck/mod.rs b/src/librustc_borrowck/borrowck/mod.rs index 0d084d9b930..a0e1e4f3c93 100644 --- a/src/librustc_borrowck/borrowck/mod.rs +++ b/src/librustc_borrowck/borrowck/mod.rs @@ -1013,11 +1013,11 @@ impl<'a, 'tcx> BorrowckCtxt<'a, 'tcx> { } err_out_of_scope(super_scope, sub_scope, cause) => { - let (value_kind, value_msg, is_temporary) = match err.cmt.cat { + let (value_kind, value_msg) = match err.cmt.cat { mc::Categorization::Rvalue(_) => - ("temporary value", "temporary value created here", true), + ("temporary value", "temporary value created here"), _ => - ("borrowed value", "does not live long enough", false) + ("borrowed value", "borrow occurs here") }; let is_closure = match cause { @@ -1030,14 +1030,14 @@ impl<'a, 'tcx> BorrowckCtxt<'a, 'tcx> { Some(primary) => { db.span = MultiSpan::from_span(s); db.span_label(primary, &format!("capture occurs here")); - db.span_label(s, &value_msg); + db.span_label(s, &"does not live long enough"); true } None => false } } _ => { - db.span_label(error_span, &value_msg); + db.span_label(error_span, &"does not live long enough"); false } }; @@ -1047,11 +1047,11 @@ impl<'a, 'tcx> BorrowckCtxt<'a, 'tcx> { match (sub_span, super_span) { (Some(s1), Some(s2)) if s1 == s2 => { - if !is_temporary && !is_closure { + if !is_closure { db.span = MultiSpan::from_span(s1); - db.span_label(error_span, &format!("borrow occurs here")); + db.span_label(error_span, &value_msg); let msg = match opt_loan_path(&err.cmt) { - None => "borrowed value".to_string(), + None => value_kind.to_string(), Some(lp) => { format!("`{}`", self.loan_path_to_string(&lp)) } @@ -1064,17 +1064,16 @@ impl<'a, 'tcx> BorrowckCtxt<'a, 'tcx> { db.note("values in a scope are dropped in the opposite order \ they are created"); } - (Some(s1), Some(s2)) if !is_temporary && !is_closure => { + (Some(s1), Some(s2)) if !is_closure => { db.span = MultiSpan::from_span(s2); - db.span_label(error_span, &format!("borrow occurs here")); + db.span_label(error_span, &value_msg); let msg = match opt_loan_path(&err.cmt) { - None => "borrowed value".to_string(), + None => value_kind.to_string(), Some(lp) => { format!("`{}`", self.loan_path_to_string(&lp)) } }; - db.span_label(s2, - &format!("{} dropped here while still borrowed", msg)); + db.span_label(s2, &format!("{} dropped here while still borrowed", msg)); db.span_label(s1, &format!("{} needs to live until here", value_kind)); } _ => { diff --git a/src/test/ui/lifetimes/borrowck-let-suggestion.stderr b/src/test/ui/lifetimes/borrowck-let-suggestion.stderr index 91600340019..d85483f43c9 100644 --- a/src/test/ui/lifetimes/borrowck-let-suggestion.stderr +++ b/src/test/ui/lifetimes/borrowck-let-suggestion.stderr @@ -1,8 +1,8 @@ error: borrowed value does not live long enough - --> $DIR/borrowck-let-suggestion.rs:12:13 + --> $DIR/borrowck-let-suggestion.rs:12:23 | 12 | let x = [1].iter(); - | ^^^ - temporary value only lives until here + | --- ^ temporary value dropped here while still borrowed | | | temporary value created here 13 | } diff --git a/src/test/ui/span/borrowck-let-suggestion-suffixes.stderr b/src/test/ui/span/borrowck-let-suggestion-suffixes.stderr index 0bba986e437..5bb656878b3 100644 --- a/src/test/ui/span/borrowck-let-suggestion-suffixes.stderr +++ b/src/test/ui/span/borrowck-let-suggestion-suffixes.stderr @@ -10,10 +10,10 @@ error: `young[..]` does not live long enough = note: values in a scope are dropped in the opposite order they are created error: borrowed value does not live long enough - --> $DIR/borrowck-let-suggestion-suffixes.rs:24:14 + --> $DIR/borrowck-let-suggestion-suffixes.rs:24:18 | 24 | v3.push(&'x'); // statement 6 - | ^^^ - temporary value only lives until here + | --- ^ temporary value dropped here while still borrowed | | | temporary value created here ... @@ -23,10 +23,10 @@ error: borrowed value does not live long enough = note: consider using a `let` binding to increase its lifetime error: borrowed value does not live long enough - --> $DIR/borrowck-let-suggestion-suffixes.rs:34:18 + --> $DIR/borrowck-let-suggestion-suffixes.rs:34:22 | 34 | v4.push(&'y'); - | ^^^ - temporary value only lives until here + | --- ^ temporary value dropped here while still borrowed | | | temporary value created here ... @@ -36,10 +36,10 @@ error: borrowed value does not live long enough = note: consider using a `let` binding to increase its lifetime error: borrowed value does not live long enough - --> $DIR/borrowck-let-suggestion-suffixes.rs:45:14 + --> $DIR/borrowck-let-suggestion-suffixes.rs:45:18 | 45 | v5.push(&'z'); - | ^^^ - temporary value only lives until here + | --- ^ temporary value dropped here while still borrowed | | | temporary value created here ... diff --git a/src/test/compile-fail/issue-15480.rs b/src/test/ui/span/issue-15480.rs similarity index 91% rename from src/test/compile-fail/issue-15480.rs rename to src/test/ui/span/issue-15480.rs index 30f58f909a0..ea5f4d3fe60 100644 --- a/src/test/compile-fail/issue-15480.rs +++ b/src/test/ui/span/issue-15480.rs @@ -11,7 +11,6 @@ fn main() { let v = vec![ &3 -//~^ ERROR borrowed value does not live long enough ]; for &&x in &v { diff --git a/src/test/ui/span/issue-15480.stderr b/src/test/ui/span/issue-15480.stderr new file mode 100644 index 00000000000..85f6c41c366 --- /dev/null +++ b/src/test/ui/span/issue-15480.stderr @@ -0,0 +1,15 @@ +error: borrowed value does not live long enough + --> $DIR/issue-15480.rs:14:6 + | +13 | &3 + | - temporary value created here +14 | ]; + | ^ temporary value dropped here while still borrowed +... +19 | } + | - temporary value needs to live until here + | + = note: consider using a `let` binding to increase its lifetime + +error: aborting due to previous error + diff --git a/src/test/compile-fail/regions-close-over-borrowed-ref-in-obj.rs b/src/test/ui/span/regions-close-over-borrowed-ref-in-obj.rs similarity index 88% rename from src/test/compile-fail/regions-close-over-borrowed-ref-in-obj.rs rename to src/test/ui/span/regions-close-over-borrowed-ref-in-obj.rs index 25b8137d29c..a524562f2d9 100644 --- a/src/test/compile-fail/regions-close-over-borrowed-ref-in-obj.rs +++ b/src/test/ui/span/regions-close-over-borrowed-ref-in-obj.rs @@ -17,7 +17,7 @@ impl<'a> Foo for &'a isize { } fn main() { let blah; { - let ss: &isize = &1; //~ ERROR borrowed value does not live long enough + let ss: &isize = &1; blah = box ss as Box; } } diff --git a/src/test/ui/span/regions-close-over-borrowed-ref-in-obj.stderr b/src/test/ui/span/regions-close-over-borrowed-ref-in-obj.stderr new file mode 100644 index 00000000000..205734c25e0 --- /dev/null +++ b/src/test/ui/span/regions-close-over-borrowed-ref-in-obj.stderr @@ -0,0 +1,13 @@ +error: borrowed value does not live long enough + --> $DIR/regions-close-over-borrowed-ref-in-obj.rs:22:5 + | +20 | let ss: &isize = &1; + | - temporary value created here +21 | blah = box ss as Box; +22 | } + | ^ temporary value dropped here while still borrowed +23 | } + | - temporary value needs to live until here + +error: aborting due to previous error + diff --git a/src/test/compile-fail/slice-borrow.rs b/src/test/ui/span/slice-borrow.rs similarity index 86% rename from src/test/compile-fail/slice-borrow.rs rename to src/test/ui/span/slice-borrow.rs index 0062f66ae22..4ca0ccaa731 100644 --- a/src/test/compile-fail/slice-borrow.rs +++ b/src/test/ui/span/slice-borrow.rs @@ -13,7 +13,7 @@ fn main() { let y; { - let x: &[isize] = &[1, 2, 3, 4, 5]; //~ ERROR borrowed value does not live long enough + let x: &[isize] = &[1, 2, 3, 4, 5]; y = &x[1..]; } } diff --git a/src/test/ui/span/slice-borrow.stderr b/src/test/ui/span/slice-borrow.stderr new file mode 100644 index 00000000000..efe81fd00bf --- /dev/null +++ b/src/test/ui/span/slice-borrow.stderr @@ -0,0 +1,13 @@ +error: borrowed value does not live long enough + --> $DIR/slice-borrow.rs:18:5 + | +16 | let x: &[isize] = &[1, 2, 3, 4, 5]; + | --------------- temporary value created here +17 | y = &x[1..]; +18 | } + | ^ temporary value dropped here while still borrowed +19 | } + | - temporary value needs to live until here + +error: aborting due to previous error +