about summary refs log tree commit diff
path: root/src/test
diff options
context:
space:
mode:
authorNiko Matsakis <niko@alum.mit.edu>2018-10-22 09:19:33 -0400
committerNiko Matsakis <niko@alum.mit.edu>2018-10-22 10:04:47 -0400
commit2921fbaaa8f85c0306d5592973f924a74d356f9a (patch)
tree5431dca31a953b267da7885f866cdd1e6fe1f712 /src/test
parent0afccbb654cfe98ac426b32ccd19ce069e7138a7 (diff)
downloadrust-2921fbaaa8f85c0306d5592973f924a74d356f9a.tar.gz
rust-2921fbaaa8f85c0306d5592973f924a74d356f9a.zip
flesh out closure-substs test
Diffstat (limited to 'src/test')
-rw-r--r--src/test/ui/nll/user-annotations/closure-substs.rs20
-rw-r--r--src/test/ui/nll/user-annotations/closure-substs.stderr54
2 files changed, 66 insertions, 8 deletions
diff --git a/src/test/ui/nll/user-annotations/closure-substs.rs b/src/test/ui/nll/user-annotations/closure-substs.rs
index 0a22390fc71..7dd2d4113bb 100644
--- a/src/test/ui/nll/user-annotations/closure-substs.rs
+++ b/src/test/ui/nll/user-annotations/closure-substs.rs
@@ -13,12 +13,30 @@
 // Test that we enforce user-provided type annotations on closures.
 
 fn foo<'a>() {
+    // Here `x` is free in the closure sig:
     |x: &'a i32| -> &'static i32 {
-        return x; //~ ERROR
+        return x; //~ ERROR unsatisfied lifetime constraints
+    };
+}
+
+fn foo1() {
+    // Here `x` is bound in the closure sig:
+    |x: &i32| -> &'static i32 {
+        return x; //~ ERROR unsatisfied lifetime constraints
+        //~^ ERROR unsatisfied lifetime constraints
+        //~| ERROR unsatisfied lifetime constraints
     };
 }
 
 fn bar<'a>() {
+    // Here `x` is free in the closure sig:
+    |x: &'a i32, b: fn(&'static i32)| {
+        b(x); //~ ERROR unsatisfied lifetime constraints
+    };
+}
+
+fn bar1() {
+    // Here `x` is bound in the closure sig:
     |x: &i32, b: fn(&'static i32)| {
         b(x); //~ ERROR
         //~^ ERROR borrowed data escapes outside of closure
diff --git a/src/test/ui/nll/user-annotations/closure-substs.stderr b/src/test/ui/nll/user-annotations/closure-substs.stderr
index 97f6e594de5..126a66b8059 100644
--- a/src/test/ui/nll/user-annotations/closure-substs.stderr
+++ b/src/test/ui/nll/user-annotations/closure-substs.stderr
@@ -1,14 +1,54 @@
 error: unsatisfied lifetime constraints
-  --> $DIR/closure-substs.rs:17:16
+  --> $DIR/closure-substs.rs:18:16
    |
 LL | fn foo<'a>() {
    |        -- lifetime `'a` defined here
-LL |     |x: &'a i32| -> &'static i32 {
-LL |         return x; //~ ERROR
+...
+LL |         return x; //~ ERROR unsatisfied lifetime constraints
    |                ^ returning this value requires that `'a` must outlive `'static`
 
+error: unsatisfied lifetime constraints
+  --> $DIR/closure-substs.rs:25:16
+   |
+LL |     |x: &i32| -> &'static i32 {
+   |         - let's call the lifetime of this reference `'1`
+LL |         return x; //~ ERROR unsatisfied lifetime constraints
+   |                ^ returning this value requires that `'1` must outlive `'static`
+
+error: unsatisfied lifetime constraints
+  --> $DIR/closure-substs.rs:25:16
+   |
+LL |     |x: &i32| -> &'static i32 {
+   |         -                   - return type of closure is &'2 i32
+   |         |
+   |         let's call the lifetime of this reference `'1`
+LL |         return x; //~ ERROR unsatisfied lifetime constraints
+   |                ^ returning this value requires that `'1` must outlive `'2`
+
+error: unsatisfied lifetime constraints
+  --> $DIR/closure-substs.rs:25:16
+   |
+LL |     |x: &i32| -> &'static i32 {
+   |     -------------------------
+   |     |   |
+   |     |   let's call the lifetime of this reference `'1`
+   |     lifetime `'2` represents this closure's body
+LL |         return x; //~ ERROR unsatisfied lifetime constraints
+   |                ^ closure was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1`
+   |
+   = note: closure implements `Fn`, so references to captured variables can't escape the closure
+
+error: unsatisfied lifetime constraints
+  --> $DIR/closure-substs.rs:34:9
+   |
+LL | fn bar<'a>() {
+   |        -- lifetime `'a` defined here
+...
+LL |         b(x); //~ ERROR unsatisfied lifetime constraints
+   |         ^^^^ argument requires that `'a` must outlive `'static`
+
 error: borrowed data escapes outside of closure
-  --> $DIR/closure-substs.rs:23:9
+  --> $DIR/closure-substs.rs:41:9
    |
 LL |     |x: &i32, b: fn(&'static i32)| {
    |      - `x` is a reference that is only valid in the closure body
@@ -16,7 +56,7 @@ LL |         b(x); //~ ERROR
    |         ^^^^ `x` escapes the closure body here
 
 error: borrowed data escapes outside of closure
-  --> $DIR/closure-substs.rs:23:9
+  --> $DIR/closure-substs.rs:41:9
    |
 LL |     |x: &i32, b: fn(&'static i32)| {
    |      -        - `b` is declared here, outside of the closure body
@@ -26,7 +66,7 @@ LL |         b(x); //~ ERROR
    |         ^^^^ `x` escapes the closure body here
 
 error: unsatisfied lifetime constraints
-  --> $DIR/closure-substs.rs:23:9
+  --> $DIR/closure-substs.rs:41:9
    |
 LL |     |x: &i32, b: fn(&'static i32)| {
    |     ------------------------------
@@ -38,5 +78,5 @@ LL |         b(x); //~ ERROR
    |
    = note: closure implements `Fn`, so references to captured variables can't escape the closure
 
-error: aborting due to 4 previous errors
+error: aborting due to 8 previous errors