diff options
| author | bors <bors@rust-lang.org> | 2018-10-10 14:51:01 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2018-10-10 14:51:01 +0000 |
| commit | e1041c6cd1a027ab3ada3e8538620d2e1d7067fe (patch) | |
| tree | e28851b594e742084a30a7697ba11802b2c08e00 /src/test | |
| parent | 2243fabd8f25c46a4a76199f10a2cd9adbb5c418 (diff) | |
| parent | 98633b458b6dbde4afd1b468f35a1b8239b5c15c (diff) | |
Auto merge of #54802 - davidtwco:issue-53040, r=pnkfelix
[nll] better error message when returning refs to upvars Fixes #53040. r? @nikomatsakis
Diffstat (limited to 'src/test')
| -rw-r--r-- | src/test/ui/borrowck/borrowck-describe-lvalue.ast.nll.stderr | 14 | ||||
| -rw-r--r-- | src/test/ui/borrowck/borrowck-describe-lvalue.mir.stderr | 14 | ||||
| -rw-r--r-- | src/test/ui/borrowck/borrowck-describe-lvalue.rs | 2 | ||||
| -rw-r--r-- | src/test/ui/issues/issue-40510-1.nll.stderr | 12 | ||||
| -rw-r--r-- | src/test/ui/issues/issue-40510-3.nll.stderr | 12 | ||||
| -rw-r--r-- | src/test/ui/issues/issue-49824.nll.stderr | 12 | ||||
| -rw-r--r-- | src/test/ui/nll/issue-53040.rs | 16 | ||||
| -rw-r--r-- | src/test/ui/nll/issue-53040.stderr | 13 | ||||
| -rw-r--r-- | src/test/ui/regions/regions-return-ref-to-upvar-issue-17403.nll.stderr | 12 |
9 files changed, 63 insertions, 44 deletions
diff --git a/src/test/ui/borrowck/borrowck-describe-lvalue.ast.nll.stderr b/src/test/ui/borrowck/borrowck-describe-lvalue.ast.nll.stderr index ac6cfac2a16..5721c52ba21 100644 --- a/src/test/ui/borrowck/borrowck-describe-lvalue.ast.nll.stderr +++ b/src/test/ui/borrowck/borrowck-describe-lvalue.ast.nll.stderr @@ -20,24 +20,22 @@ LL | //[mir]~^ ERROR cannot borrow `x` as mutable more than o LL | *y = 1; | ------ first borrow later used here -error: unsatisfied lifetime constraints +error: captured variable cannot escape `FnMut` closure body --> $DIR/borrowck-describe-lvalue.rs:305:16 | LL | || { - | -- - | || - | |return type of closure is [closure@$DIR/borrowck-describe-lvalue.rs:305:16: 311:18 x:&'2 mut i32] - | lifetime `'1` represents this closure's body -LL | / || { //[mir]~ ERROR unsatisfied lifetime constraints + | - inferred to be a `FnMut` closure +LL | / || { //[mir]~ ERROR captured variable cannot escape `FnMut` closure body LL | | let y = &mut x; LL | | &mut x; //[ast]~ ERROR cannot borrow `**x` as mutable more than once at a time LL | | //[mir]~^ ERROR cannot borrow `x` as mutable more than once at a time LL | | *y = 1; LL | | drop(y); LL | | } - | |_________________^ returning this value requires that `'1` must outlive `'2` + | |_________________^ returns a closure that contains a reference to a captured variable, which then escapes the closure body | - = note: closure implements `FnMut`, so references to captured variables can't escape the closure + = note: `FnMut` closures only have access to their captured variables while they are executing... + = note: ...therefore, they cannot allow references to captured variables to escape error[E0503]: cannot use `f.x` because it was mutably borrowed --> $DIR/borrowck-describe-lvalue.rs:53:9 diff --git a/src/test/ui/borrowck/borrowck-describe-lvalue.mir.stderr b/src/test/ui/borrowck/borrowck-describe-lvalue.mir.stderr index ac6cfac2a16..5721c52ba21 100644 --- a/src/test/ui/borrowck/borrowck-describe-lvalue.mir.stderr +++ b/src/test/ui/borrowck/borrowck-describe-lvalue.mir.stderr @@ -20,24 +20,22 @@ LL | //[mir]~^ ERROR cannot borrow `x` as mutable more than o LL | *y = 1; | ------ first borrow later used here -error: unsatisfied lifetime constraints +error: captured variable cannot escape `FnMut` closure body --> $DIR/borrowck-describe-lvalue.rs:305:16 | LL | || { - | -- - | || - | |return type of closure is [closure@$DIR/borrowck-describe-lvalue.rs:305:16: 311:18 x:&'2 mut i32] - | lifetime `'1` represents this closure's body -LL | / || { //[mir]~ ERROR unsatisfied lifetime constraints + | - inferred to be a `FnMut` closure +LL | / || { //[mir]~ ERROR captured variable cannot escape `FnMut` closure body LL | | let y = &mut x; LL | | &mut x; //[ast]~ ERROR cannot borrow `**x` as mutable more than once at a time LL | | //[mir]~^ ERROR cannot borrow `x` as mutable more than once at a time LL | | *y = 1; LL | | drop(y); LL | | } - | |_________________^ returning this value requires that `'1` must outlive `'2` + | |_________________^ returns a closure that contains a reference to a captured variable, which then escapes the closure body | - = note: closure implements `FnMut`, so references to captured variables can't escape the closure + = note: `FnMut` closures only have access to their captured variables while they are executing... + = note: ...therefore, they cannot allow references to captured variables to escape error[E0503]: cannot use `f.x` because it was mutably borrowed --> $DIR/borrowck-describe-lvalue.rs:53:9 diff --git a/src/test/ui/borrowck/borrowck-describe-lvalue.rs b/src/test/ui/borrowck/borrowck-describe-lvalue.rs index 2ef08e75cfd..649de888ab0 100644 --- a/src/test/ui/borrowck/borrowck-describe-lvalue.rs +++ b/src/test/ui/borrowck/borrowck-describe-lvalue.rs @@ -302,7 +302,7 @@ fn main() { // FIXME(#49824) -- the free region error below should probably not be there let mut x = 0; || { - || { //[mir]~ ERROR unsatisfied lifetime constraints + || { //[mir]~ ERROR captured variable cannot escape `FnMut` closure body let y = &mut x; &mut x; //[ast]~ ERROR cannot borrow `**x` as mutable more than once at a time //[mir]~^ ERROR cannot borrow `x` as mutable more than once at a time diff --git a/src/test/ui/issues/issue-40510-1.nll.stderr b/src/test/ui/issues/issue-40510-1.nll.stderr index 3a579c04de1..1aeb1a89ead 100644 --- a/src/test/ui/issues/issue-40510-1.nll.stderr +++ b/src/test/ui/issues/issue-40510-1.nll.stderr @@ -1,15 +1,13 @@ -error: unsatisfied lifetime constraints +error: captured variable cannot escape `FnMut` closure body --> $DIR/issue-40510-1.rs:18:9 | LL | || { - | -- - | || - | |return type of closure is &'2 mut std::boxed::Box<()> - | lifetime `'1` represents this closure's body + | - inferred to be a `FnMut` closure LL | &mut x - | ^^^^^^ returning this value requires that `'1` must outlive `'2` + | ^^^^^^ returns a reference to a captured variable which escapes the closure body | - = note: closure implements `FnMut`, so references to captured variables can't escape the closure + = note: `FnMut` closures only have access to their captured variables while they are executing... + = note: ...therefore, they cannot allow references to captured variables to escape error: aborting due to previous error diff --git a/src/test/ui/issues/issue-40510-3.nll.stderr b/src/test/ui/issues/issue-40510-3.nll.stderr index 84ab2a8216d..c334e592fbc 100644 --- a/src/test/ui/issues/issue-40510-3.nll.stderr +++ b/src/test/ui/issues/issue-40510-3.nll.stderr @@ -1,17 +1,15 @@ -error: unsatisfied lifetime constraints +error: captured variable cannot escape `FnMut` closure body --> $DIR/issue-40510-3.rs:18:9 | LL | || { - | -- - | || - | |return type of closure is [closure@$DIR/issue-40510-3.rs:18:9: 20:10 x:&'2 mut std::vec::Vec<()>] - | lifetime `'1` represents this closure's body + | - inferred to be a `FnMut` closure LL | / || { LL | | x.push(()) LL | | } - | |_________^ returning this value requires that `'1` must outlive `'2` + | |_________^ returns a closure that contains a reference to a captured variable, which then escapes the closure body | - = note: closure implements `FnMut`, so references to captured variables can't escape the closure + = note: `FnMut` closures only have access to their captured variables while they are executing... + = note: ...therefore, they cannot allow references to captured variables to escape error: aborting due to previous error diff --git a/src/test/ui/issues/issue-49824.nll.stderr b/src/test/ui/issues/issue-49824.nll.stderr index df43158ec9c..2e0463fdd1d 100644 --- a/src/test/ui/issues/issue-49824.nll.stderr +++ b/src/test/ui/issues/issue-49824.nll.stderr @@ -1,17 +1,15 @@ -error: unsatisfied lifetime constraints +error: captured variable cannot escape `FnMut` closure body --> $DIR/issue-49824.rs:22:9 | LL | || { - | -- - | || - | |return type of closure is [closure@$DIR/issue-49824.rs:22:9: 24:10 x:&'2 mut i32] - | lifetime `'1` represents this closure's body + | - inferred to be a `FnMut` closure LL | / || { LL | | let _y = &mut x; LL | | } - | |_________^ returning this value requires that `'1` must outlive `'2` + | |_________^ returns a closure that contains a reference to a captured variable, which then escapes the closure body | - = note: closure implements `FnMut`, so references to captured variables can't escape the closure + = note: `FnMut` closures only have access to their captured variables while they are executing... + = note: ...therefore, they cannot allow references to captured variables to escape error: aborting due to previous error diff --git a/src/test/ui/nll/issue-53040.rs b/src/test/ui/nll/issue-53040.rs new file mode 100644 index 00000000000..2b6e67be6d9 --- /dev/null +++ b/src/test/ui/nll/issue-53040.rs @@ -0,0 +1,16 @@ +// Copyright 2017 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +#![feature(nll)] + +fn main() { + let mut v: Vec<()> = Vec::new(); + || &mut v; +} diff --git a/src/test/ui/nll/issue-53040.stderr b/src/test/ui/nll/issue-53040.stderr new file mode 100644 index 00000000000..fac9969f193 --- /dev/null +++ b/src/test/ui/nll/issue-53040.stderr @@ -0,0 +1,13 @@ +error: captured variable cannot escape `FnMut` closure body + --> $DIR/issue-53040.rs:15:8 + | +LL | || &mut v; + | - ^^^^^^ returns a reference to a captured variable which escapes the closure body + | | + | inferred to be a `FnMut` closure + | + = note: `FnMut` closures only have access to their captured variables while they are executing... + = note: ...therefore, they cannot allow references to captured variables to escape + +error: aborting due to previous error + diff --git a/src/test/ui/regions/regions-return-ref-to-upvar-issue-17403.nll.stderr b/src/test/ui/regions/regions-return-ref-to-upvar-issue-17403.nll.stderr index 35c1da61ae2..300a5639822 100644 --- a/src/test/ui/regions/regions-return-ref-to-upvar-issue-17403.nll.stderr +++ b/src/test/ui/regions/regions-return-ref-to-upvar-issue-17403.nll.stderr @@ -1,13 +1,13 @@ -error: unsatisfied lifetime constraints +error: captured variable cannot escape `FnMut` closure body --> $DIR/regions-return-ref-to-upvar-issue-17403.rs:17:24 | LL | let mut f = || &mut x; //~ ERROR cannot infer - | -- ^^^^^^ returning this value requires that `'1` must outlive `'2` - | || - | |return type of closure is &'2 mut i32 - | lifetime `'1` represents this closure's body + | - ^^^^^^ returns a reference to a captured variable which escapes the closure body + | | + | inferred to be a `FnMut` closure | - = note: closure implements `FnMut`, so references to captured variables can't escape the closure + = note: `FnMut` closures only have access to their captured variables while they are executing... + = note: ...therefore, they cannot allow references to captured variables to escape error: aborting due to previous error |
