about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorMikhail Modin <mikhailm1@gmail.com>2016-11-03 09:58:01 +0300
committerMikhail Modin <mikhailm1@gmail.com>2016-11-09 00:28:50 +0300
commitcfdf7633f08ee77e303f1bf88b613a35f9946e75 (patch)
treebc145012daf7b215be45761b4866cc9ff2b6f320 /src
parenta0e7e357a796f93527d0a0e850fa71c48594b91d (diff)
downloadrust-cfdf7633f08ee77e303f1bf88b613a35f9946e75.tar.gz
rust-cfdf7633f08ee77e303f1bf88b613a35f9946e75.zip
Improve "Doesn't live long enough" error
case with temporary variable
Diffstat (limited to 'src')
-rw-r--r--src/librustc_borrowck/borrowck/mod.rs25
-rw-r--r--src/test/ui/lifetimes/borrowck-let-suggestion.stderr4
-rw-r--r--src/test/ui/span/borrowck-let-suggestion-suffixes.stderr12
-rw-r--r--src/test/ui/span/issue-15480.rs (renamed from src/test/compile-fail/issue-15480.rs)1
-rw-r--r--src/test/ui/span/issue-15480.stderr15
-rw-r--r--src/test/ui/span/regions-close-over-borrowed-ref-in-obj.rs (renamed from src/test/compile-fail/regions-close-over-borrowed-ref-in-obj.rs)2
-rw-r--r--src/test/ui/span/regions-close-over-borrowed-ref-in-obj.stderr13
-rw-r--r--src/test/ui/span/slice-borrow.rs (renamed from src/test/compile-fail/slice-borrow.rs)2
-rw-r--r--src/test/ui/span/slice-borrow.stderr13
9 files changed, 63 insertions, 24 deletions
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
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
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<Foo>;
     }
 }
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<Foo>;
+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
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
+