about summary refs log tree commit diff
path: root/src/test
diff options
context:
space:
mode:
authorMatthew Jasper <mjjasper1@gmail.com>2019-01-17 20:03:58 +0000
committerMatthew Jasper <mjjasper1@gmail.com>2019-03-01 18:53:14 +0000
commit60eeed34af9b8a934ed02c7da36764710e466554 (patch)
treef367b77c18a7362b955bceda4f1794d9a4216128 /src/test
parentc1d2d83ca3b5155468ab96b09a7c54568449b137 (diff)
Include bounds from promoted constants in NLL
Previously, a promoted that contains a function item wouldn't have the
function items bounds propagated to
the main function body.
Diffstat (limited to 'src/test')
-rw-r--r--src/test/ui/nll/issue-48697.rs4
-rw-r--r--src/test/ui/nll/issue-48697.stderr11
-rw-r--r--src/test/ui/nll/promoted-bounds.rs27
-rw-r--r--src/test/ui/nll/promoted-bounds.stderr15
-rw-r--r--src/test/ui/nll/promoted-closure-pair.rs12
-rw-r--r--src/test/ui/nll/promoted-closure-pair.stderr12
6 files changed, 78 insertions, 3 deletions
diff --git a/src/test/ui/nll/issue-48697.rs b/src/test/ui/nll/issue-48697.rs
index c60c265b813..ececd6fccd8 100644
--- a/src/test/ui/nll/issue-48697.rs
+++ b/src/test/ui/nll/issue-48697.rs
@@ -1,14 +1,12 @@
 // Regression test for #48697
 
-// compile-pass
-
 #![feature(nll)]
 
 fn foo(x: &i32) -> &i32 {
     let z = 4;
     let f = &|y| y;
     let k = f(&z);
-    f(x)
+    f(x) //~ cannot return value referencing local variable
 }
 
 fn main() {}
diff --git a/src/test/ui/nll/issue-48697.stderr b/src/test/ui/nll/issue-48697.stderr
new file mode 100644
index 00000000000..16b46c15b90
--- /dev/null
+++ b/src/test/ui/nll/issue-48697.stderr
@@ -0,0 +1,11 @@
+error[E0515]: cannot return value referencing local variable `z`
+  --> $DIR/issue-48697.rs:9:5
+   |
+LL |     let k = f(&z);
+   |               -- `z` is borrowed here
+LL |     f(x) //~ cannot return value referencing local variable
+   |     ^^^^ returns a value referencing data owned by the current function
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0515`.
diff --git a/src/test/ui/nll/promoted-bounds.rs b/src/test/ui/nll/promoted-bounds.rs
new file mode 100644
index 00000000000..59b21cf9ac2
--- /dev/null
+++ b/src/test/ui/nll/promoted-bounds.rs
@@ -0,0 +1,27 @@
+#![feature(nll)]
+
+fn shorten_lifetime<'a, 'b, 'min>(a: &'a i32, b: &'b i32) -> &'min i32
+where
+    'a: 'min,
+    'b: 'min,
+{
+    if *a < *b {
+        &a
+    } else {
+        &b
+    }
+}
+
+fn main() {
+    let promoted_fn_item_ref = &shorten_lifetime;
+
+    let a = &5;
+    let ptr = {
+        let l = 3;
+        let b = &l; //~ ERROR does not live long enough
+        let c = promoted_fn_item_ref(a, b);
+        c
+    };
+
+    println!("ptr = {:?}", ptr);
+}
diff --git a/src/test/ui/nll/promoted-bounds.stderr b/src/test/ui/nll/promoted-bounds.stderr
new file mode 100644
index 00000000000..9798f238fc4
--- /dev/null
+++ b/src/test/ui/nll/promoted-bounds.stderr
@@ -0,0 +1,15 @@
+error[E0597]: `l` does not live long enough
+  --> $DIR/promoted-bounds.rs:21:17
+   |
+LL |     let ptr = {
+   |         --- borrow later stored here
+LL |         let l = 3;
+LL |         let b = &l; //~ ERROR does not live long enough
+   |                 ^^ borrowed value does not live long enough
+...
+LL |     };
+   |     - `l` dropped here while still borrowed
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0597`.
diff --git a/src/test/ui/nll/promoted-closure-pair.rs b/src/test/ui/nll/promoted-closure-pair.rs
new file mode 100644
index 00000000000..7b3bbad4c1e
--- /dev/null
+++ b/src/test/ui/nll/promoted-closure-pair.rs
@@ -0,0 +1,12 @@
+// Check that we handle multiple closures in the same promoted constant.
+
+#![feature(nll)]
+
+fn foo() -> &'static i32 {
+    let z = 0;
+    let p = &(|y| y, |y| y);
+    p.0(&z);
+    p.1(&z)         //~ ERROR cannot return
+}
+
+fn main() {}
diff --git a/src/test/ui/nll/promoted-closure-pair.stderr b/src/test/ui/nll/promoted-closure-pair.stderr
new file mode 100644
index 00000000000..5f4a6037668
--- /dev/null
+++ b/src/test/ui/nll/promoted-closure-pair.stderr
@@ -0,0 +1,12 @@
+error[E0515]: cannot return value referencing local variable `z`
+  --> $DIR/promoted-closure-pair.rs:9:5
+   |
+LL |     p.1(&z)         //~ ERROR cannot return
+   |     ^^^^--^
+   |     |   |
+   |     |   `z` is borrowed here
+   |     returns a value referencing data owned by the current function
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0515`.