mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 14:55:26 +00:00
Update tests
This commit is contained in:
parent
3d8a0733ae
commit
f9f3063cfa
@ -1,12 +0,0 @@
|
||||
error: borrowed data cannot be stored outside of its closure
|
||||
--> $DIR/issue-45983.rs:20:27
|
||||
|
|
||||
LL | let x = None;
|
||||
| - borrowed data cannot be stored into here...
|
||||
LL | give_any(|y| x = Some(y));
|
||||
| --- ^ cannot be stored outside of its closure
|
||||
| |
|
||||
| ...because it cannot outlive this closure
|
||||
|
||||
error: aborting due to previous error
|
||||
|
@ -1,21 +0,0 @@
|
||||
error[E0521]: borrowed data escapes outside of closure
|
||||
--> $DIR/issue-45983.rs:20:18
|
||||
|
|
||||
LL | let x = None;
|
||||
| - `x` declared here, outside of the closure body
|
||||
LL | give_any(|y| x = Some(y));
|
||||
| - ^^^^^^^^^^^ `y` escapes the closure body here
|
||||
| |
|
||||
| `y` is a reference that is only valid in the closure body
|
||||
|
||||
error[E0594]: cannot assign to `x`, as it is not declared as mutable
|
||||
--> $DIR/issue-45983.rs:20:18
|
||||
|
|
||||
LL | let x = None;
|
||||
| - help: consider changing this to be mutable: `mut x`
|
||||
LL | give_any(|y| x = Some(y));
|
||||
| ^^^^^^^^^^^ cannot assign
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0594`.
|
@ -1,24 +1,12 @@
|
||||
// As documented in Issue #45983, this test is evaluating the quality
|
||||
// of our diagnostics on erroneous code using higher-ranked closures.
|
||||
|
||||
// revisions: migrate nll
|
||||
|
||||
// Since we are testing nll (and migration) explicitly as a separate
|
||||
// revisions, don't worry about the --compare-mode=nll on this test.
|
||||
|
||||
// ignore-compare-mode-nll
|
||||
// ignore-compare-mode-polonius
|
||||
|
||||
//[nll]compile-flags: -Z borrowck=mir
|
||||
|
||||
fn give_any<F: for<'r> FnOnce(&'r ())>(f: F) {
|
||||
f(&());
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let x = None;
|
||||
let mut x = None;
|
||||
give_any(|y| x = Some(y));
|
||||
//[migrate]~^ ERROR borrowed data cannot be stored outside of its closure
|
||||
//[nll]~^^ ERROR borrowed data escapes outside of closure
|
||||
//[nll]~| ERROR cannot assign to `x`, as it is not declared as mutable
|
||||
//~^ ERROR borrowed data escapes outside of closure
|
||||
}
|
||||
|
@ -1,9 +1,9 @@
|
||||
error[E0521]: borrowed data escapes outside of closure
|
||||
--> $DIR/regions-escape-bound-fn-2.rs:8:18
|
||||
--> $DIR/issue-45983.rs:10:18
|
||||
|
|
||||
LL | let mut x = None;
|
||||
| ----- `x` declared here, outside of the closure body
|
||||
LL | with_int(|y| x = Some(y));
|
||||
LL | give_any(|y| x = Some(y));
|
||||
| - ^^^^^^^^^^^ `y` escapes the closure body here
|
||||
| |
|
||||
| `y` is a reference that is only valid in the closure body
|
@ -1,14 +0,0 @@
|
||||
error[E0521]: borrowed data escapes outside of closure
|
||||
--> $DIR/issue-7573.rs:21:9
|
||||
|
|
||||
LL | let mut lines_to_use: Vec<&CrateId> = Vec::new();
|
||||
| ---------------- `lines_to_use` declared here, outside of the closure body
|
||||
LL |
|
||||
LL | let push_id = |installed_id: &CrateId| {
|
||||
| ------------ `installed_id` is a reference that is only valid in the closure body
|
||||
...
|
||||
LL | lines_to_use.push(installed_id);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `installed_id` escapes the closure body here
|
||||
|
||||
error: aborting due to previous error
|
||||
|
@ -1,36 +1,34 @@
|
||||
pub struct CrateId {
|
||||
local_path: String,
|
||||
junk: String
|
||||
junk: String,
|
||||
}
|
||||
|
||||
impl CrateId {
|
||||
fn new(s: &str) -> CrateId {
|
||||
CrateId {
|
||||
local_path: s.to_string(),
|
||||
junk: "wutevs".to_string()
|
||||
}
|
||||
CrateId { local_path: s.to_string(), junk: "wutevs".to_string() }
|
||||
}
|
||||
}
|
||||
|
||||
pub fn remove_package_from_database() {
|
||||
let mut lines_to_use: Vec<&CrateId> = Vec::new();
|
||||
//~^ NOTE cannot infer an appropriate lifetime
|
||||
//~^ NOTE `lines_to_use` declared here, outside of the closure body
|
||||
let push_id = |installed_id: &CrateId| {
|
||||
//~^ NOTE borrowed data cannot outlive this closure
|
||||
//~| NOTE ...so that variable is valid at time of its declaration
|
||||
//~^ NOTE `installed_id` is a reference that is only valid in the closure body
|
||||
lines_to_use.push(installed_id);
|
||||
//~^ ERROR borrowed data cannot be stored outside of its closure
|
||||
//~| NOTE cannot be stored outside of its closure
|
||||
//~^ ERROR borrowed data escapes outside of closure
|
||||
//~| NOTE `installed_id` escapes the closure body here
|
||||
};
|
||||
list_database(push_id);
|
||||
|
||||
for l in &lines_to_use {
|
||||
println!("{}", l.local_path);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
pub fn list_database<F>(mut f: F) where F: FnMut(&CrateId) {
|
||||
pub fn list_database<F>(mut f: F)
|
||||
where
|
||||
F: FnMut(&CrateId),
|
||||
{
|
||||
let stuff = ["foo", "bar"];
|
||||
|
||||
for l in &stuff {
|
||||
|
@ -1,16 +1,14 @@
|
||||
error: borrowed data cannot be stored outside of its closure
|
||||
--> $DIR/issue-7573.rs:21:27
|
||||
error[E0521]: borrowed data escapes outside of closure
|
||||
--> $DIR/issue-7573.rs:17:9
|
||||
|
|
||||
LL | let mut lines_to_use: Vec<&CrateId> = Vec::new();
|
||||
| - cannot infer an appropriate lifetime...
|
||||
| ---------------- `lines_to_use` declared here, outside of the closure body
|
||||
LL |
|
||||
LL | let push_id = |installed_id: &CrateId| {
|
||||
| ------- ------------------------ borrowed data cannot outlive this closure
|
||||
| |
|
||||
| ...so that variable is valid at time of its declaration
|
||||
...
|
||||
| ------------ `installed_id` is a reference that is only valid in the closure body
|
||||
LL |
|
||||
LL | lines_to_use.push(installed_id);
|
||||
| ^^^^^^^^^^^^ cannot be stored outside of its closure
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `installed_id` escapes the closure body here
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -1,4 +1,7 @@
|
||||
fn with_int<F>(f: F) where F: FnOnce(&isize) {
|
||||
fn with_int<F>(f: F)
|
||||
where
|
||||
F: FnOnce(&isize),
|
||||
{
|
||||
let x = 3;
|
||||
f(&x);
|
||||
}
|
||||
@ -6,5 +9,5 @@ fn with_int<F>(f: F) where F: FnOnce(&isize) {
|
||||
fn main() {
|
||||
let mut x = None;
|
||||
with_int(|y| x = Some(y));
|
||||
//~^ ERROR borrowed data cannot be stored outside of its closure
|
||||
//~^ ERROR borrowed data escapes outside of closure
|
||||
}
|
||||
|
@ -1,12 +1,12 @@
|
||||
error: borrowed data cannot be stored outside of its closure
|
||||
--> $DIR/regions-escape-bound-fn-2.rs:8:27
|
||||
error[E0521]: borrowed data escapes outside of closure
|
||||
--> $DIR/regions-escape-bound-fn-2.rs:11:18
|
||||
|
|
||||
LL | let mut x = None;
|
||||
| ----- borrowed data cannot be stored into here...
|
||||
| ----- `x` declared here, outside of the closure body
|
||||
LL | with_int(|y| x = Some(y));
|
||||
| --- ^ cannot be stored outside of its closure
|
||||
| |
|
||||
| ...because it cannot outlive this closure
|
||||
| - ^^^^^^^^^^^ `y` escapes the closure body here
|
||||
| |
|
||||
| `y` is a reference that is only valid in the closure body
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -1,12 +0,0 @@
|
||||
error[E0521]: borrowed data escapes outside of closure
|
||||
--> $DIR/regions-escape-bound-fn.rs:8:18
|
||||
|
|
||||
LL | let mut x: Option<&isize> = None;
|
||||
| ----- `x` declared here, outside of the closure body
|
||||
LL | with_int(|y| x = Some(y));
|
||||
| - ^^^^^^^^^^^ `y` escapes the closure body here
|
||||
| |
|
||||
| `y` is a reference that is only valid in the closure body
|
||||
|
||||
error: aborting due to previous error
|
||||
|
@ -1,4 +1,7 @@
|
||||
fn with_int<F>(f: F) where F: FnOnce(&isize) {
|
||||
fn with_int<F>(f: F)
|
||||
where
|
||||
F: FnOnce(&isize),
|
||||
{
|
||||
let x = 3;
|
||||
f(&x);
|
||||
}
|
||||
@ -6,5 +9,5 @@ fn with_int<F>(f: F) where F: FnOnce(&isize) {
|
||||
fn main() {
|
||||
let mut x: Option<&isize> = None;
|
||||
with_int(|y| x = Some(y));
|
||||
//~^ ERROR borrowed data cannot be stored outside of its closure
|
||||
//~^ ERROR borrowed data escapes outside of closure
|
||||
}
|
||||
|
@ -1,12 +1,12 @@
|
||||
error: borrowed data cannot be stored outside of its closure
|
||||
--> $DIR/regions-escape-bound-fn.rs:8:27
|
||||
error[E0521]: borrowed data escapes outside of closure
|
||||
--> $DIR/regions-escape-bound-fn.rs:11:18
|
||||
|
|
||||
LL | let mut x: Option<&isize> = None;
|
||||
| ----- borrowed data cannot be stored into here...
|
||||
| ----- `x` declared here, outside of the closure body
|
||||
LL | with_int(|y| x = Some(y));
|
||||
| --- ^ cannot be stored outside of its closure
|
||||
| |
|
||||
| ...because it cannot outlive this closure
|
||||
| - ^^^^^^^^^^^ `y` escapes the closure body here
|
||||
| |
|
||||
| `y` is a reference that is only valid in the closure body
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -1,12 +0,0 @@
|
||||
error[E0521]: borrowed data escapes outside of closure
|
||||
--> $DIR/regions-escape-unboxed-closure.rs:6:23
|
||||
|
|
||||
LL | let mut x: Option<&isize> = None;
|
||||
| ----- `x` declared here, outside of the closure body
|
||||
LL | with_int(&mut |y| x = Some(y));
|
||||
| - ^^^^^^^^^^^ `y` escapes the closure body here
|
||||
| |
|
||||
| `y` is a reference that is only valid in the closure body
|
||||
|
||||
error: aborting due to previous error
|
||||
|
@ -1,8 +1,7 @@
|
||||
fn with_int(f: &mut dyn FnMut(&isize)) {
|
||||
}
|
||||
fn with_int(f: &mut dyn FnMut(&isize)) {}
|
||||
|
||||
fn main() {
|
||||
let mut x: Option<&isize> = None;
|
||||
with_int(&mut |y| x = Some(y));
|
||||
//~^ ERROR borrowed data cannot be stored outside of its closure
|
||||
//~^ ERROR borrowed data escapes outside of closure
|
||||
}
|
||||
|
@ -1,12 +1,12 @@
|
||||
error: borrowed data cannot be stored outside of its closure
|
||||
--> $DIR/regions-escape-unboxed-closure.rs:6:32
|
||||
error[E0521]: borrowed data escapes outside of closure
|
||||
--> $DIR/regions-escape-unboxed-closure.rs:5:23
|
||||
|
|
||||
LL | let mut x: Option<&isize> = None;
|
||||
| ----- borrowed data cannot be stored into here...
|
||||
| ----- `x` declared here, outside of the closure body
|
||||
LL | with_int(&mut |y| x = Some(y));
|
||||
| --- ^ cannot be stored outside of its closure
|
||||
| |
|
||||
| ...because it cannot outlive this closure
|
||||
| - ^^^^^^^^^^^ `y` escapes the closure body here
|
||||
| |
|
||||
| `y` is a reference that is only valid in the closure body
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -1,123 +0,0 @@
|
||||
error: lifetime may not live long enough
|
||||
--> $DIR/variadic-ffi-4.rs:8:5
|
||||
|
|
||||
LL | pub unsafe extern "C" fn no_escape0<'f>(_: usize, ap: ...) -> VaListImpl<'f> {
|
||||
| -- -- has type `core::ffi::VaListImpl<'1>`
|
||||
| |
|
||||
| lifetime `'f` defined here
|
||||
LL | ap
|
||||
| ^^ function was supposed to return data with lifetime `'1` but it is returning data with lifetime `'f`
|
||||
|
||||
error: lifetime may not live long enough
|
||||
--> $DIR/variadic-ffi-4.rs:8:5
|
||||
|
|
||||
LL | pub unsafe extern "C" fn no_escape0<'f>(_: usize, ap: ...) -> VaListImpl<'f> {
|
||||
| -- -- has type `core::ffi::VaListImpl<'1>`
|
||||
| |
|
||||
| lifetime `'f` defined here
|
||||
LL | ap
|
||||
| ^^ returning this value requires that `'1` must outlive `'f`
|
||||
|
||||
error: lifetime may not live long enough
|
||||
--> $DIR/variadic-ffi-4.rs:12:5
|
||||
|
|
||||
LL | pub unsafe extern "C" fn no_escape1(_: usize, ap: ...) -> VaListImpl<'static> {
|
||||
| -- has type `core::ffi::VaListImpl<'1>`
|
||||
LL | ap
|
||||
| ^^ returning this value requires that `'1` must outlive `'static`
|
||||
|
||||
error: lifetime may not live long enough
|
||||
--> $DIR/variadic-ffi-4.rs:16:33
|
||||
|
|
||||
LL | let _ = ap.with_copy(|ap| { ap });
|
||||
| --- ^^ returning this value requires that `'1` must outlive `'2`
|
||||
| | |
|
||||
| | return type of closure is core::ffi::VaList<'2, '_>
|
||||
| has type `core::ffi::VaList<'1, '_>`
|
||||
|
||||
error: lifetime may not live long enough
|
||||
--> $DIR/variadic-ffi-4.rs:20:5
|
||||
|
|
||||
LL | pub unsafe extern "C" fn no_escape3(_: usize, mut ap0: &mut VaListImpl, mut ap1: ...) {
|
||||
| ------- ------- has type `core::ffi::VaListImpl<'2>`
|
||||
| |
|
||||
| has type `&mut core::ffi::VaListImpl<'1>`
|
||||
LL | *ap0 = ap1;
|
||||
| ^^^^ assignment requires that `'1` must outlive `'2`
|
||||
|
||||
error: lifetime may not live long enough
|
||||
--> $DIR/variadic-ffi-4.rs:20:5
|
||||
|
|
||||
LL | pub unsafe extern "C" fn no_escape3(_: usize, mut ap0: &mut VaListImpl, mut ap1: ...) {
|
||||
| ------- ------- has type `core::ffi::VaListImpl<'2>`
|
||||
| |
|
||||
| has type `&mut core::ffi::VaListImpl<'1>`
|
||||
LL | *ap0 = ap1;
|
||||
| ^^^^ assignment requires that `'2` must outlive `'1`
|
||||
|
||||
error: lifetime may not live long enough
|
||||
--> $DIR/variadic-ffi-4.rs:24:5
|
||||
|
|
||||
LL | pub unsafe extern "C" fn no_escape4(_: usize, ap0: &mut VaListImpl, mut ap1: ...) {
|
||||
| --- ------- has type `core::ffi::VaListImpl<'2>`
|
||||
| |
|
||||
| has type `&mut core::ffi::VaListImpl<'1>`
|
||||
LL | ap0 = &mut ap1;
|
||||
| ^^^^^^^^^^^^^^ assignment requires that `'1` must outlive `'2`
|
||||
|
||||
error: lifetime may not live long enough
|
||||
--> $DIR/variadic-ffi-4.rs:24:5
|
||||
|
|
||||
LL | pub unsafe extern "C" fn no_escape4(_: usize, ap0: &mut VaListImpl, mut ap1: ...) {
|
||||
| --- ------- has type `core::ffi::VaListImpl<'2>`
|
||||
| |
|
||||
| has type `&mut core::ffi::VaListImpl<'1>`
|
||||
LL | ap0 = &mut ap1;
|
||||
| ^^^^^^^^^^^^^^ assignment requires that `'2` must outlive `'1`
|
||||
|
||||
error[E0384]: cannot assign to immutable argument `ap0`
|
||||
--> $DIR/variadic-ffi-4.rs:24:5
|
||||
|
|
||||
LL | pub unsafe extern "C" fn no_escape4(_: usize, ap0: &mut VaListImpl, mut ap1: ...) {
|
||||
| --- help: make this binding mutable: `mut ap0`
|
||||
LL | ap0 = &mut ap1;
|
||||
| ^^^^^^^^^^^^^^ cannot assign to immutable argument
|
||||
|
||||
error[E0597]: `ap1` does not live long enough
|
||||
--> $DIR/variadic-ffi-4.rs:24:11
|
||||
|
|
||||
LL | pub unsafe extern "C" fn no_escape4(_: usize, ap0: &mut VaListImpl, mut ap1: ...) {
|
||||
| - let's call the lifetime of this reference `'3`
|
||||
LL | ap0 = &mut ap1;
|
||||
| ------^^^^^^^^
|
||||
| | |
|
||||
| | borrowed value does not live long enough
|
||||
| assignment requires that `ap1` is borrowed for `'3`
|
||||
...
|
||||
LL | }
|
||||
| - `ap1` dropped here while still borrowed
|
||||
|
||||
error: lifetime may not live long enough
|
||||
--> $DIR/variadic-ffi-4.rs:31:12
|
||||
|
|
||||
LL | pub unsafe extern "C" fn no_escape5(_: usize, mut ap0: &mut VaListImpl, mut ap1: ...) {
|
||||
| ------- ------- has type `core::ffi::VaListImpl<'2>`
|
||||
| |
|
||||
| has type `&mut core::ffi::VaListImpl<'1>`
|
||||
LL | *ap0 = ap1.clone();
|
||||
| ^^^^^^^^^^^ argument requires that `'1` must outlive `'2`
|
||||
|
||||
error: lifetime may not live long enough
|
||||
--> $DIR/variadic-ffi-4.rs:31:12
|
||||
|
|
||||
LL | pub unsafe extern "C" fn no_escape5(_: usize, mut ap0: &mut VaListImpl, mut ap1: ...) {
|
||||
| ------- ------- has type `core::ffi::VaListImpl<'2>`
|
||||
| |
|
||||
| has type `&mut core::ffi::VaListImpl<'1>`
|
||||
LL | *ap0 = ap1.clone();
|
||||
| ^^^^^^^^^^^ argument requires that `'2` must outlive `'1`
|
||||
|
||||
error: aborting due to 12 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0384, E0597.
|
||||
For more information about an error, try `rustc --explain E0384`.
|
@ -1,32 +1,38 @@
|
||||
#![crate_type="lib"]
|
||||
#![crate_type = "lib"]
|
||||
#![no_std]
|
||||
#![feature(c_variadic)]
|
||||
|
||||
use core::ffi::{VaList, VaListImpl};
|
||||
|
||||
pub unsafe extern "C" fn no_escape0<'f>(_: usize, ap: ...) -> VaListImpl<'f> {
|
||||
ap //~ ERROR: mismatched types
|
||||
ap
|
||||
//~^ ERROR: lifetime may not live long enough
|
||||
//~| ERROR: lifetime may not live long enough
|
||||
}
|
||||
|
||||
pub unsafe extern "C" fn no_escape1(_: usize, ap: ...) -> VaListImpl<'static> {
|
||||
ap //~ ERROR: mismatched types
|
||||
ap //~ ERROR: lifetime may not live long enough
|
||||
}
|
||||
|
||||
pub unsafe extern "C" fn no_escape2(_: usize, ap: ...) {
|
||||
let _ = ap.with_copy(|ap| { ap }); //~ ERROR: cannot infer an appropriate lifetime
|
||||
let _ = ap.with_copy(|ap| ap); //~ ERROR: lifetime may not live long enough
|
||||
}
|
||||
|
||||
pub unsafe extern "C" fn no_escape3(_: usize, mut ap0: &mut VaListImpl, mut ap1: ...) {
|
||||
*ap0 = ap1; //~ ERROR: mismatched types
|
||||
*ap0 = ap1;
|
||||
//~^ ERROR: lifetime may not live long enough
|
||||
//~| ERROR: lifetime may not live long enough
|
||||
}
|
||||
|
||||
pub unsafe extern "C" fn no_escape4(_: usize, ap0: &mut VaListImpl, mut ap1: ...) {
|
||||
pub unsafe extern "C" fn no_escape4(_: usize, mut ap0: &mut VaListImpl, mut ap1: ...) {
|
||||
ap0 = &mut ap1;
|
||||
//~^ ERROR: a value of type `core::ffi::VaListImpl<'_>` is borrowed for too long
|
||||
//~| ERROR: mismatched types
|
||||
//~| ERROR: cannot infer an appropriate lifetime
|
||||
//~^ ERROR: `ap1` does not live long enough
|
||||
//~| ERROR: lifetime may not live long enough
|
||||
//~| ERROR: lifetime may not live long enough
|
||||
}
|
||||
|
||||
pub unsafe extern "C" fn no_escape5(_: usize, mut ap0: &mut VaListImpl, mut ap1: ...) {
|
||||
*ap0 = ap1.clone(); //~ ERROR: mismatched types
|
||||
*ap0 = ap1.clone();
|
||||
//~^ ERROR: lifetime may not live long enough
|
||||
//~| ERROR: lifetime may not live long enough
|
||||
}
|
||||
|
@ -1,217 +1,114 @@
|
||||
error[E0308]: mismatched types
|
||||
error: lifetime may not live long enough
|
||||
--> $DIR/variadic-ffi-4.rs:8:5
|
||||
|
|
||||
LL | pub unsafe extern "C" fn no_escape0<'f>(_: usize, ap: ...) -> VaListImpl<'f> {
|
||||
| -- -- has type `core::ffi::VaListImpl<'1>`
|
||||
| |
|
||||
| lifetime `'f` defined here
|
||||
LL | ap
|
||||
| ^^ lifetime mismatch
|
||||
|
|
||||
= note: expected struct `core::ffi::VaListImpl<'f>`
|
||||
found struct `core::ffi::VaListImpl<'_>`
|
||||
note: the scope of call-site for function at 7:78...
|
||||
--> $DIR/variadic-ffi-4.rs:7:78
|
||||
|
|
||||
LL | pub unsafe extern "C" fn no_escape0<'f>(_: usize, ap: ...) -> VaListImpl<'f> {
|
||||
| ______________________________________________________________________________^
|
||||
LL | | ap
|
||||
LL | | }
|
||||
| |_^
|
||||
note: ...does not necessarily outlive the lifetime `'f` as defined on the function body at 7:37
|
||||
--> $DIR/variadic-ffi-4.rs:7:37
|
||||
| ^^ function was supposed to return data with lifetime `'1` but it is returning data with lifetime `'f`
|
||||
|
||||
error: lifetime may not live long enough
|
||||
--> $DIR/variadic-ffi-4.rs:8:5
|
||||
|
|
||||
LL | pub unsafe extern "C" fn no_escape0<'f>(_: usize, ap: ...) -> VaListImpl<'f> {
|
||||
| ^^
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/variadic-ffi-4.rs:12:5
|
||||
|
|
||||
| -- -- has type `core::ffi::VaListImpl<'1>`
|
||||
| |
|
||||
| lifetime `'f` defined here
|
||||
LL | ap
|
||||
| ^^ lifetime mismatch
|
||||
|
|
||||
= note: expected struct `core::ffi::VaListImpl<'static>`
|
||||
found struct `core::ffi::VaListImpl<'_>`
|
||||
note: the scope of call-site for function at 11:79...
|
||||
--> $DIR/variadic-ffi-4.rs:11:79
|
||||
|
|
||||
LL | pub unsafe extern "C" fn no_escape1(_: usize, ap: ...) -> VaListImpl<'static> {
|
||||
| _______________________________________________________________________________^
|
||||
LL | | ap
|
||||
LL | | }
|
||||
| |_^
|
||||
= note: ...does not necessarily outlive the static lifetime
|
||||
| ^^ returning this value requires that `'1` must outlive `'f`
|
||||
|
||||
error[E0495]: cannot infer an appropriate lifetime due to conflicting requirements
|
||||
--> $DIR/variadic-ffi-4.rs:16:33
|
||||
error: lifetime may not live long enough
|
||||
--> $DIR/variadic-ffi-4.rs:14:5
|
||||
|
|
||||
LL | let _ = ap.with_copy(|ap| { ap });
|
||||
| ^^
|
||||
|
|
||||
note: first, the lifetime cannot outlive the anonymous lifetime #2 defined on the body at 16:26...
|
||||
--> $DIR/variadic-ffi-4.rs:16:26
|
||||
|
|
||||
LL | let _ = ap.with_copy(|ap| { ap });
|
||||
| ^^^^^^^^^^^
|
||||
note: ...so that the expression is assignable
|
||||
--> $DIR/variadic-ffi-4.rs:16:33
|
||||
|
|
||||
LL | let _ = ap.with_copy(|ap| { ap });
|
||||
| ^^
|
||||
= note: expected `core::ffi::VaList<'_, '_>`
|
||||
found `core::ffi::VaList<'_, '_>`
|
||||
note: but, the lifetime must be valid for the method call at 16:13...
|
||||
--> $DIR/variadic-ffi-4.rs:16:13
|
||||
|
|
||||
LL | let _ = ap.with_copy(|ap| { ap });
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
note: ...so type `core::ffi::VaList<'_, '_>` of expression is valid during the expression
|
||||
--> $DIR/variadic-ffi-4.rs:16:13
|
||||
|
|
||||
LL | let _ = ap.with_copy(|ap| { ap });
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
LL | pub unsafe extern "C" fn no_escape1(_: usize, ap: ...) -> VaListImpl<'static> {
|
||||
| -- has type `core::ffi::VaListImpl<'1>`
|
||||
LL | ap
|
||||
| ^^ returning this value requires that `'1` must outlive `'static`
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/variadic-ffi-4.rs:20:12
|
||||
error: lifetime may not live long enough
|
||||
--> $DIR/variadic-ffi-4.rs:18:31
|
||||
|
|
||||
LL | let _ = ap.with_copy(|ap| ap);
|
||||
| --- ^^ returning this value requires that `'1` must outlive `'2`
|
||||
| | |
|
||||
| | return type of closure is core::ffi::VaList<'2, '_>
|
||||
| has type `core::ffi::VaList<'1, '_>`
|
||||
|
||||
error: lifetime may not live long enough
|
||||
--> $DIR/variadic-ffi-4.rs:22:5
|
||||
|
|
||||
LL | pub unsafe extern "C" fn no_escape3(_: usize, mut ap0: &mut VaListImpl, mut ap1: ...) {
|
||||
| ------- ------- has type `core::ffi::VaListImpl<'2>`
|
||||
| |
|
||||
| has type `&mut core::ffi::VaListImpl<'1>`
|
||||
LL | *ap0 = ap1;
|
||||
| ^^^ lifetime mismatch
|
||||
|
|
||||
= note: expected struct `core::ffi::VaListImpl<'_>`
|
||||
found struct `core::ffi::VaListImpl<'_>`
|
||||
note: the scope of call-site for function at 19:87...
|
||||
--> $DIR/variadic-ffi-4.rs:19:87
|
||||
|
|
||||
LL | pub unsafe extern "C" fn no_escape3(_: usize, mut ap0: &mut VaListImpl, mut ap1: ...) {
|
||||
| _______________________________________________________________________________________^
|
||||
LL | | *ap0 = ap1;
|
||||
LL | | }
|
||||
| |_^
|
||||
note: ...does not necessarily outlive the anonymous lifetime #2 defined on the function body at 19:1
|
||||
--> $DIR/variadic-ffi-4.rs:19:1
|
||||
|
|
||||
LL | / pub unsafe extern "C" fn no_escape3(_: usize, mut ap0: &mut VaListImpl, mut ap1: ...) {
|
||||
LL | | *ap0 = ap1;
|
||||
LL | | }
|
||||
| |_^
|
||||
| ^^^^ assignment requires that `'1` must outlive `'2`
|
||||
|
||||
error[E0490]: a value of type `core::ffi::VaListImpl<'_>` is borrowed for too long
|
||||
--> $DIR/variadic-ffi-4.rs:24:11
|
||||
error: lifetime may not live long enough
|
||||
--> $DIR/variadic-ffi-4.rs:22:5
|
||||
|
|
||||
LL | ap0 = &mut ap1;
|
||||
| ^^^^^^^^
|
||||
|
|
||||
note: the type is valid for the anonymous lifetime #1 defined on the function body at 23:1
|
||||
--> $DIR/variadic-ffi-4.rs:23:1
|
||||
|
|
||||
LL | / pub unsafe extern "C" fn no_escape4(_: usize, ap0: &mut VaListImpl, mut ap1: ...) {
|
||||
LL | | ap0 = &mut ap1;
|
||||
LL | |
|
||||
LL | |
|
||||
LL | |
|
||||
LL | | }
|
||||
| |_^
|
||||
note: but the borrow lasts for the scope of call-site for function at 23:83
|
||||
--> $DIR/variadic-ffi-4.rs:23:83
|
||||
|
|
||||
LL | pub unsafe extern "C" fn no_escape4(_: usize, ap0: &mut VaListImpl, mut ap1: ...) {
|
||||
| ___________________________________________________________________________________^
|
||||
LL | | ap0 = &mut ap1;
|
||||
LL | |
|
||||
LL | |
|
||||
LL | |
|
||||
LL | | }
|
||||
| |_^
|
||||
LL | pub unsafe extern "C" fn no_escape3(_: usize, mut ap0: &mut VaListImpl, mut ap1: ...) {
|
||||
| ------- ------- has type `core::ffi::VaListImpl<'2>`
|
||||
| |
|
||||
| has type `&mut core::ffi::VaListImpl<'1>`
|
||||
LL | *ap0 = ap1;
|
||||
| ^^^^ assignment requires that `'2` must outlive `'1`
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/variadic-ffi-4.rs:24:11
|
||||
error: lifetime may not live long enough
|
||||
--> $DIR/variadic-ffi-4.rs:28:5
|
||||
|
|
||||
LL | pub unsafe extern "C" fn no_escape4(_: usize, mut ap0: &mut VaListImpl, mut ap1: ...) {
|
||||
| ------- ------- has type `core::ffi::VaListImpl<'2>`
|
||||
| |
|
||||
| has type `&mut core::ffi::VaListImpl<'1>`
|
||||
LL | ap0 = &mut ap1;
|
||||
| ^^^^^^^^ lifetime mismatch
|
||||
|
|
||||
= note: expected mutable reference `&mut core::ffi::VaListImpl<'_>`
|
||||
found mutable reference `&mut core::ffi::VaListImpl<'_>`
|
||||
note: the scope of call-site for function at 23:83...
|
||||
--> $DIR/variadic-ffi-4.rs:23:83
|
||||
|
|
||||
LL | pub unsafe extern "C" fn no_escape4(_: usize, ap0: &mut VaListImpl, mut ap1: ...) {
|
||||
| ___________________________________________________________________________________^
|
||||
LL | | ap0 = &mut ap1;
|
||||
LL | |
|
||||
LL | |
|
||||
LL | |
|
||||
LL | | }
|
||||
| |_^
|
||||
note: ...does not necessarily outlive the anonymous lifetime #2 defined on the function body at 23:1
|
||||
--> $DIR/variadic-ffi-4.rs:23:1
|
||||
|
|
||||
LL | / pub unsafe extern "C" fn no_escape4(_: usize, ap0: &mut VaListImpl, mut ap1: ...) {
|
||||
LL | | ap0 = &mut ap1;
|
||||
LL | |
|
||||
LL | |
|
||||
LL | |
|
||||
LL | | }
|
||||
| |_^
|
||||
| ^^^^^^^^^^^^^^ assignment requires that `'1` must outlive `'2`
|
||||
|
||||
error[E0495]: cannot infer an appropriate lifetime for borrow expression due to conflicting requirements
|
||||
--> $DIR/variadic-ffi-4.rs:24:11
|
||||
error: lifetime may not live long enough
|
||||
--> $DIR/variadic-ffi-4.rs:28:5
|
||||
|
|
||||
LL | pub unsafe extern "C" fn no_escape4(_: usize, mut ap0: &mut VaListImpl, mut ap1: ...) {
|
||||
| ------- ------- has type `core::ffi::VaListImpl<'2>`
|
||||
| |
|
||||
| has type `&mut core::ffi::VaListImpl<'1>`
|
||||
LL | ap0 = &mut ap1;
|
||||
| ^^^^^^^^
|
||||
|
|
||||
note: first, the lifetime cannot outlive the scope of call-site for function at 23:83...
|
||||
--> $DIR/variadic-ffi-4.rs:23:83
|
||||
|
|
||||
LL | pub unsafe extern "C" fn no_escape4(_: usize, ap0: &mut VaListImpl, mut ap1: ...) {
|
||||
| ___________________________________________________________________________________^
|
||||
LL | | ap0 = &mut ap1;
|
||||
LL | |
|
||||
LL | |
|
||||
LL | |
|
||||
LL | | }
|
||||
| |_^
|
||||
note: ...so that the type `core::ffi::VaListImpl<'_>` is not borrowed for too long
|
||||
--> $DIR/variadic-ffi-4.rs:24:11
|
||||
|
|
||||
LL | ap0 = &mut ap1;
|
||||
| ^^^^^^^^
|
||||
note: but, the lifetime must be valid for the anonymous lifetime #1 defined on the function body at 23:1...
|
||||
--> $DIR/variadic-ffi-4.rs:23:1
|
||||
|
|
||||
LL | / pub unsafe extern "C" fn no_escape4(_: usize, ap0: &mut VaListImpl, mut ap1: ...) {
|
||||
LL | | ap0 = &mut ap1;
|
||||
LL | |
|
||||
LL | |
|
||||
LL | |
|
||||
LL | | }
|
||||
| |_^
|
||||
note: ...so that reference does not outlive borrowed content
|
||||
--> $DIR/variadic-ffi-4.rs:24:11
|
||||
|
|
||||
LL | ap0 = &mut ap1;
|
||||
| ^^^^^^^^
|
||||
| ^^^^^^^^^^^^^^ assignment requires that `'2` must outlive `'1`
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/variadic-ffi-4.rs:31:12
|
||||
error[E0597]: `ap1` does not live long enough
|
||||
--> $DIR/variadic-ffi-4.rs:28:11
|
||||
|
|
||||
LL | pub unsafe extern "C" fn no_escape4(_: usize, mut ap0: &mut VaListImpl, mut ap1: ...) {
|
||||
| - let's call the lifetime of this reference `'3`
|
||||
LL | ap0 = &mut ap1;
|
||||
| ------^^^^^^^^
|
||||
| | |
|
||||
| | borrowed value does not live long enough
|
||||
| assignment requires that `ap1` is borrowed for `'3`
|
||||
...
|
||||
LL | }
|
||||
| - `ap1` dropped here while still borrowed
|
||||
|
||||
error: lifetime may not live long enough
|
||||
--> $DIR/variadic-ffi-4.rs:35:12
|
||||
|
|
||||
LL | pub unsafe extern "C" fn no_escape5(_: usize, mut ap0: &mut VaListImpl, mut ap1: ...) {
|
||||
| ------- ------- has type `core::ffi::VaListImpl<'2>`
|
||||
| |
|
||||
| has type `&mut core::ffi::VaListImpl<'1>`
|
||||
LL | *ap0 = ap1.clone();
|
||||
| ^^^^^^^^^^^ lifetime mismatch
|
||||
|
|
||||
= note: expected struct `core::ffi::VaListImpl<'_>`
|
||||
found struct `core::ffi::VaListImpl<'_>`
|
||||
note: the scope of call-site for function at 30:87...
|
||||
--> $DIR/variadic-ffi-4.rs:30:87
|
||||
|
|
||||
LL | pub unsafe extern "C" fn no_escape5(_: usize, mut ap0: &mut VaListImpl, mut ap1: ...) {
|
||||
| _______________________________________________________________________________________^
|
||||
LL | | *ap0 = ap1.clone();
|
||||
LL | | }
|
||||
| |_^
|
||||
note: ...does not necessarily outlive the anonymous lifetime #2 defined on the function body at 30:1
|
||||
--> $DIR/variadic-ffi-4.rs:30:1
|
||||
|
|
||||
LL | / pub unsafe extern "C" fn no_escape5(_: usize, mut ap0: &mut VaListImpl, mut ap1: ...) {
|
||||
LL | | *ap0 = ap1.clone();
|
||||
LL | | }
|
||||
| |_^
|
||||
| ^^^^^^^^^^^ argument requires that `'1` must outlive `'2`
|
||||
|
||||
error: aborting due to 8 previous errors
|
||||
error: lifetime may not live long enough
|
||||
--> $DIR/variadic-ffi-4.rs:35:12
|
||||
|
|
||||
LL | pub unsafe extern "C" fn no_escape5(_: usize, mut ap0: &mut VaListImpl, mut ap1: ...) {
|
||||
| ------- ------- has type `core::ffi::VaListImpl<'2>`
|
||||
| |
|
||||
| has type `&mut core::ffi::VaListImpl<'1>`
|
||||
LL | *ap0 = ap1.clone();
|
||||
| ^^^^^^^^^^^ argument requires that `'2` must outlive `'1`
|
||||
|
||||
Some errors have detailed explanations: E0308, E0495.
|
||||
For more information about an error, try `rustc --explain E0308`.
|
||||
error: aborting due to 11 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0597`.
|
||||
|
@ -0,0 +1,24 @@
|
||||
error: lifetime may not live long enough
|
||||
--> $DIR/expect-region-supply-region-2.rs:14:30
|
||||
|
|
||||
LL | fn expect_bound_supply_named<'x>() {
|
||||
| -- lifetime `'x` defined here
|
||||
...
|
||||
LL | closure_expecting_bound(|x: &'x u32| {
|
||||
| ^ - let's call the lifetime of this reference `'1`
|
||||
| |
|
||||
| requires that `'1` must outlive `'x`
|
||||
|
||||
error: lifetime may not live long enough
|
||||
--> $DIR/expect-region-supply-region-2.rs:14:30
|
||||
|
|
||||
LL | fn expect_bound_supply_named<'x>() {
|
||||
| -- lifetime `'x` defined here
|
||||
...
|
||||
LL | closure_expecting_bound(|x: &'x u32| {
|
||||
| ^ requires that `'x` must outlive `'static`
|
||||
|
|
||||
= help: consider replacing `'x` with `'static`
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
@ -0,0 +1,24 @@
|
||||
#![allow(warnings)]
|
||||
|
||||
fn closure_expecting_bound<F>(_: F)
|
||||
where
|
||||
F: FnOnce(&u32),
|
||||
{
|
||||
}
|
||||
|
||||
fn expect_bound_supply_named<'x>() {
|
||||
let mut f: Option<&u32> = None;
|
||||
|
||||
// Here we give a type annotation that `x` should be free. We get
|
||||
// an error because of that.
|
||||
closure_expecting_bound(|x: &'x u32| {
|
||||
//~^ ERROR mismatched types
|
||||
//~| ERROR mismatched types
|
||||
|
||||
// Borrowck doesn't get a chance to run, but if it did it should error
|
||||
// here.
|
||||
f = Some(x);
|
||||
});
|
||||
}
|
||||
|
||||
fn main() {}
|
@ -0,0 +1,55 @@
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/expect-region-supply-region-2.rs:14:33
|
||||
|
|
||||
LL | closure_expecting_bound(|x: &'x u32| {
|
||||
| ^^^^^^^ lifetime mismatch
|
||||
|
|
||||
= note: expected reference `&u32`
|
||||
found reference `&'x u32`
|
||||
note: the anonymous lifetime #2 defined on the body at 14:29...
|
||||
--> $DIR/expect-region-supply-region-2.rs:14:29
|
||||
|
|
||||
LL | closure_expecting_bound(|x: &'x u32| {
|
||||
| _____________________________^
|
||||
LL | |
|
||||
LL | |
|
||||
LL | |
|
||||
... |
|
||||
LL | | f = Some(x);
|
||||
LL | | });
|
||||
| |_____^
|
||||
note: ...does not necessarily outlive the lifetime `'x` as defined on the function body at 9:30
|
||||
--> $DIR/expect-region-supply-region-2.rs:9:30
|
||||
|
|
||||
LL | fn expect_bound_supply_named<'x>() {
|
||||
| ^^
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/expect-region-supply-region-2.rs:14:33
|
||||
|
|
||||
LL | closure_expecting_bound(|x: &'x u32| {
|
||||
| ^^^^^^^ lifetime mismatch
|
||||
|
|
||||
= note: expected reference `&u32`
|
||||
found reference `&'x u32`
|
||||
note: the lifetime `'x` as defined on the function body at 9:30...
|
||||
--> $DIR/expect-region-supply-region-2.rs:9:30
|
||||
|
|
||||
LL | fn expect_bound_supply_named<'x>() {
|
||||
| ^^
|
||||
note: ...does not necessarily outlive the anonymous lifetime #2 defined on the body at 14:29
|
||||
--> $DIR/expect-region-supply-region-2.rs:14:29
|
||||
|
|
||||
LL | closure_expecting_bound(|x: &'x u32| {
|
||||
| _____________________________^
|
||||
LL | |
|
||||
LL | |
|
||||
LL | |
|
||||
... |
|
||||
LL | | f = Some(x);
|
||||
LL | | });
|
||||
| |_____^
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0308`.
|
@ -1,44 +0,0 @@
|
||||
error[E0521]: borrowed data escapes outside of closure
|
||||
--> $DIR/expect-region-supply-region.rs:18:9
|
||||
|
|
||||
LL | let mut f: Option<&u32> = None;
|
||||
| ----- `f` declared here, outside of the closure body
|
||||
LL | closure_expecting_bound(|x| {
|
||||
| - `x` is a reference that is only valid in the closure body
|
||||
LL | f = Some(x);
|
||||
| ^^^^^^^^^^^ `x` escapes the closure body here
|
||||
|
||||
error[E0521]: borrowed data escapes outside of closure
|
||||
--> $DIR/expect-region-supply-region.rs:28:9
|
||||
|
|
||||
LL | let mut f: Option<&u32> = None;
|
||||
| ----- `f` declared here, outside of the closure body
|
||||
LL | closure_expecting_bound(|x: &u32| {
|
||||
| - `x` is a reference that is only valid in the closure body
|
||||
LL | f = Some(x);
|
||||
| ^^^^^^^^^^^ `x` escapes the closure body here
|
||||
|
||||
error: lifetime may not live long enough
|
||||
--> $DIR/expect-region-supply-region.rs:37:30
|
||||
|
|
||||
LL | fn expect_bound_supply_named<'x>() {
|
||||
| -- lifetime `'x` defined here
|
||||
...
|
||||
LL | closure_expecting_bound(|x: &'x u32| {
|
||||
| ^ - let's call the lifetime of this reference `'1`
|
||||
| |
|
||||
| requires that `'1` must outlive `'x`
|
||||
|
||||
error: lifetime may not live long enough
|
||||
--> $DIR/expect-region-supply-region.rs:37:30
|
||||
|
|
||||
LL | fn expect_bound_supply_named<'x>() {
|
||||
| -- lifetime `'x` defined here
|
||||
...
|
||||
LL | closure_expecting_bound(|x: &'x u32| {
|
||||
| ^ requires that `'x` must outlive `'static`
|
||||
|
|
||||
= help: consider replacing `'x` with `'static`
|
||||
|
||||
error: aborting due to 4 previous errors
|
||||
|
@ -1,12 +1,14 @@
|
||||
#![allow(warnings)]
|
||||
|
||||
fn closure_expecting_bound<F>(_: F)
|
||||
where F: FnOnce(&u32)
|
||||
where
|
||||
F: FnOnce(&u32),
|
||||
{
|
||||
}
|
||||
|
||||
fn closure_expecting_free<'a, F>(_: F)
|
||||
where F: FnOnce(&'a u32)
|
||||
where
|
||||
F: FnOnce(&'a u32),
|
||||
{
|
||||
}
|
||||
|
||||
@ -15,7 +17,7 @@ fn expect_bound_supply_nothing() {
|
||||
// it to escape into `f`:
|
||||
let mut f: Option<&u32> = None;
|
||||
closure_expecting_bound(|x| {
|
||||
f = Some(x); //~ ERROR borrowed data cannot be stored outside of its closure
|
||||
f = Some(x); //~ ERROR borrowed data escapes outside of closure
|
||||
});
|
||||
}
|
||||
|
||||
@ -25,22 +27,7 @@ fn expect_bound_supply_bound() {
|
||||
// closure:
|
||||
let mut f: Option<&u32> = None;
|
||||
closure_expecting_bound(|x: &u32| {
|
||||
f = Some(x); //~ ERROR borrowed data cannot be stored outside of its closure
|
||||
});
|
||||
}
|
||||
|
||||
fn expect_bound_supply_named<'x>() {
|
||||
let mut f: Option<&u32> = None;
|
||||
|
||||
// Here we give a type annotation that `x` should be free. We get
|
||||
// an error because of that.
|
||||
closure_expecting_bound(|x: &'x u32| {
|
||||
//~^ ERROR mismatched types
|
||||
//~| ERROR mismatched types
|
||||
|
||||
// And we still cannot let `x` escape into `f`.
|
||||
f = Some(x);
|
||||
//~^ ERROR borrowed data cannot be stored outside of its closure
|
||||
f = Some(x); //~ ERROR borrowed data escapes outside of closure
|
||||
});
|
||||
}
|
||||
|
||||
@ -67,4 +54,4 @@ fn expect_free_supply_named<'x>() {
|
||||
closure_expecting_free(|x: &'x u32| f = Some(x)); // OK
|
||||
}
|
||||
|
||||
fn main() { }
|
||||
fn main() {}
|
||||
|
@ -1,87 +1,22 @@
|
||||
error: borrowed data cannot be stored outside of its closure
|
||||
--> $DIR/expect-region-supply-region.rs:18:18
|
||||
error[E0521]: borrowed data escapes outside of closure
|
||||
--> $DIR/expect-region-supply-region.rs:20:9
|
||||
|
|
||||
LL | let mut f: Option<&u32> = None;
|
||||
| ----- borrowed data cannot be stored into here...
|
||||
| ----- `f` declared here, outside of the closure body
|
||||
LL | closure_expecting_bound(|x| {
|
||||
| --- ...because it cannot outlive this closure
|
||||
| - `x` is a reference that is only valid in the closure body
|
||||
LL | f = Some(x);
|
||||
| ^ cannot be stored outside of its closure
|
||||
| ^^^^^^^^^^^ `x` escapes the closure body here
|
||||
|
||||
error: borrowed data cannot be stored outside of its closure
|
||||
--> $DIR/expect-region-supply-region.rs:28:18
|
||||
error[E0521]: borrowed data escapes outside of closure
|
||||
--> $DIR/expect-region-supply-region.rs:30:9
|
||||
|
|
||||
LL | let mut f: Option<&u32> = None;
|
||||
| ----- borrowed data cannot be stored into here...
|
||||
| ----- `f` declared here, outside of the closure body
|
||||
LL | closure_expecting_bound(|x: &u32| {
|
||||
| --------- ...because it cannot outlive this closure
|
||||
| - `x` is a reference that is only valid in the closure body
|
||||
LL | f = Some(x);
|
||||
| ^ cannot be stored outside of its closure
|
||||
| ^^^^^^^^^^^ `x` escapes the closure body here
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/expect-region-supply-region.rs:37:33
|
||||
|
|
||||
LL | closure_expecting_bound(|x: &'x u32| {
|
||||
| ^^^^^^^ lifetime mismatch
|
||||
|
|
||||
= note: expected reference `&u32`
|
||||
found reference `&'x u32`
|
||||
note: the anonymous lifetime #2 defined on the body at 37:29...
|
||||
--> $DIR/expect-region-supply-region.rs:37:29
|
||||
|
|
||||
LL | closure_expecting_bound(|x: &'x u32| {
|
||||
| _____________________________^
|
||||
LL | |
|
||||
LL | |
|
||||
LL | |
|
||||
... |
|
||||
LL | |
|
||||
LL | | });
|
||||
| |_____^
|
||||
note: ...does not necessarily outlive the lifetime `'x` as defined on the function body at 32:30
|
||||
--> $DIR/expect-region-supply-region.rs:32:30
|
||||
|
|
||||
LL | fn expect_bound_supply_named<'x>() {
|
||||
| ^^
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/expect-region-supply-region.rs:37:33
|
||||
|
|
||||
LL | closure_expecting_bound(|x: &'x u32| {
|
||||
| ^^^^^^^ lifetime mismatch
|
||||
|
|
||||
= note: expected reference `&u32`
|
||||
found reference `&'x u32`
|
||||
note: the lifetime `'x` as defined on the function body at 32:30...
|
||||
--> $DIR/expect-region-supply-region.rs:32:30
|
||||
|
|
||||
LL | fn expect_bound_supply_named<'x>() {
|
||||
| ^^
|
||||
note: ...does not necessarily outlive the anonymous lifetime #2 defined on the body at 37:29
|
||||
--> $DIR/expect-region-supply-region.rs:37:29
|
||||
|
|
||||
LL | closure_expecting_bound(|x: &'x u32| {
|
||||
| _____________________________^
|
||||
LL | |
|
||||
LL | |
|
||||
LL | |
|
||||
... |
|
||||
LL | |
|
||||
LL | | });
|
||||
| |_____^
|
||||
|
||||
error: borrowed data cannot be stored outside of its closure
|
||||
--> $DIR/expect-region-supply-region.rs:42:18
|
||||
|
|
||||
LL | let mut f: Option<&u32> = None;
|
||||
| ----- borrowed data cannot be stored into here...
|
||||
...
|
||||
LL | closure_expecting_bound(|x: &'x u32| {
|
||||
| ------------ ...because it cannot outlive this closure
|
||||
...
|
||||
LL | f = Some(x);
|
||||
| ^ cannot be stored outside of its closure
|
||||
|
||||
error: aborting due to 5 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0308`.
|
||||
|
28
src/test/ui/error-codes/E0490.nll.stderr
Normal file
28
src/test/ui/error-codes/E0490.nll.stderr
Normal file
@ -0,0 +1,28 @@
|
||||
error: lifetime may not live long enough
|
||||
--> $DIR/E0490.rs:2:12
|
||||
|
|
||||
LL | fn f<'a, 'b>(y: &'b ()) {
|
||||
| -- -- lifetime `'b` defined here
|
||||
| |
|
||||
| lifetime `'a` defined here
|
||||
LL | let x: &'a _ = &y;
|
||||
| ^^^^^ type annotation requires that `'b` must outlive `'a`
|
||||
|
|
||||
= help: consider adding the following bound: `'b: 'a`
|
||||
|
||||
error[E0597]: `y` does not live long enough
|
||||
--> $DIR/E0490.rs:2:20
|
||||
|
|
||||
LL | fn f<'a, 'b>(y: &'b ()) {
|
||||
| -- lifetime `'a` defined here
|
||||
LL | let x: &'a _ = &y;
|
||||
| ----- ^^ borrowed value does not live long enough
|
||||
| |
|
||||
| type annotation requires that `y` is borrowed for `'a`
|
||||
...
|
||||
LL | }
|
||||
| - `y` dropped here while still borrowed
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0597`.
|
8
src/test/ui/error-codes/E0490.rs
Normal file
8
src/test/ui/error-codes/E0490.rs
Normal file
@ -0,0 +1,8 @@
|
||||
fn f<'a, 'b>(y: &'b ()) {
|
||||
let x: &'a _ = &y;
|
||||
//~^ E0490
|
||||
//~| E0495
|
||||
//~| E0495
|
||||
}
|
||||
|
||||
fn main() {}
|
76
src/test/ui/error-codes/E0490.stderr
Normal file
76
src/test/ui/error-codes/E0490.stderr
Normal file
@ -0,0 +1,76 @@
|
||||
error[E0490]: a value of type `&'b ()` is borrowed for too long
|
||||
--> $DIR/E0490.rs:2:20
|
||||
|
|
||||
LL | let x: &'a _ = &y;
|
||||
| ^^
|
||||
|
|
||||
note: the type is valid for the lifetime `'a` as defined on the function body at 1:6
|
||||
--> $DIR/E0490.rs:1:6
|
||||
|
|
||||
LL | fn f<'a, 'b>(y: &'b ()) {
|
||||
| ^^
|
||||
note: but the borrow lasts for the lifetime `'b` as defined on the function body at 1:10
|
||||
--> $DIR/E0490.rs:1:10
|
||||
|
|
||||
LL | fn f<'a, 'b>(y: &'b ()) {
|
||||
| ^^
|
||||
|
||||
error[E0495]: cannot infer an appropriate lifetime for borrow expression due to conflicting requirements
|
||||
--> $DIR/E0490.rs:2:20
|
||||
|
|
||||
LL | let x: &'a _ = &y;
|
||||
| ^^
|
||||
|
|
||||
note: first, the lifetime cannot outlive the lifetime `'b` as defined on the function body at 1:10...
|
||||
--> $DIR/E0490.rs:1:10
|
||||
|
|
||||
LL | fn f<'a, 'b>(y: &'b ()) {
|
||||
| ^^
|
||||
note: ...so that the type `&'b ()` is not borrowed for too long
|
||||
--> $DIR/E0490.rs:2:20
|
||||
|
|
||||
LL | let x: &'a _ = &y;
|
||||
| ^^
|
||||
note: but, the lifetime must be valid for the lifetime `'a` as defined on the function body at 1:6...
|
||||
--> $DIR/E0490.rs:1:6
|
||||
|
|
||||
LL | fn f<'a, 'b>(y: &'b ()) {
|
||||
| ^^
|
||||
note: ...so that reference does not outlive borrowed content
|
||||
--> $DIR/E0490.rs:2:20
|
||||
|
|
||||
LL | let x: &'a _ = &y;
|
||||
| ^^
|
||||
|
||||
error[E0495]: cannot infer an appropriate lifetime due to conflicting requirements
|
||||
--> $DIR/E0490.rs:2:20
|
||||
|
|
||||
LL | let x: &'a _ = &y;
|
||||
| ^^
|
||||
|
|
||||
note: first, the lifetime cannot outlive the lifetime `'b` as defined on the function body at 1:10...
|
||||
--> $DIR/E0490.rs:1:10
|
||||
|
|
||||
LL | fn f<'a, 'b>(y: &'b ()) {
|
||||
| ^^
|
||||
note: ...so that the expression is assignable
|
||||
--> $DIR/E0490.rs:2:20
|
||||
|
|
||||
LL | let x: &'a _ = &y;
|
||||
| ^^
|
||||
= note: expected `&'a &()`
|
||||
found `&'a &'b ()`
|
||||
note: but, the lifetime must be valid for the lifetime `'a` as defined on the function body at 1:6...
|
||||
--> $DIR/E0490.rs:1:6
|
||||
|
|
||||
LL | fn f<'a, 'b>(y: &'b ()) {
|
||||
| ^^
|
||||
note: ...so that the reference type `&'a &()` does not outlive the data it points at
|
||||
--> $DIR/E0490.rs:2:12
|
||||
|
|
||||
LL | let x: &'a _ = &y;
|
||||
| ^^^^^
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0495`.
|
@ -1,11 +0,0 @@
|
||||
error: lifetime may not live long enough
|
||||
--> $DIR/E0621-does-not-trigger-for-closures.rs:15:45
|
||||
|
|
||||
LL | invoke(&x, |a, b| if a > b { a } else { b });
|
||||
| -- ^ returning this value requires that `'1` must outlive `'2`
|
||||
| ||
|
||||
| |return type of closure is &'2 i32
|
||||
| has type `&'1 i32`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
@ -1,9 +1,7 @@
|
||||
// Test that we give the generic E0495 when one of the free regions is
|
||||
// Test that we give the generic error when one of the free regions is
|
||||
// bound in a closure (rather than suggesting a change to the signature
|
||||
// of the closure, which is not specified in `foo` but rather in `invoke`).
|
||||
|
||||
// FIXME - This might be better as a UI test, but the finer details
|
||||
// of the error seem to vary on different machines.
|
||||
fn invoke<'a, F>(x: &'a i32, f: F) -> &'a i32
|
||||
where F: FnOnce(&'a i32, &i32) -> &'a i32
|
||||
{
|
||||
@ -12,7 +10,7 @@ where F: FnOnce(&'a i32, &i32) -> &'a i32
|
||||
}
|
||||
|
||||
fn foo<'a>(x: &'a i32) {
|
||||
invoke(&x, |a, b| if a > b { a } else { b }); //~ ERROR E0495
|
||||
invoke(&x, |a, b| if a > b { a } else { b }); //~ ERROR lifetime may not live long enough
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
@ -1,30 +1,11 @@
|
||||
error[E0495]: cannot infer an appropriate lifetime for lifetime parameter `'a` due to conflicting requirements
|
||||
--> $DIR/E0621-does-not-trigger-for-closures.rs:15:5
|
||||
error: lifetime may not live long enough
|
||||
--> $DIR/E0621-does-not-trigger-for-closures.rs:13:45
|
||||
|
|
||||
LL | invoke(&x, |a, b| if a > b { a } else { b });
|
||||
| ^^^^^^
|
||||
|
|
||||
note: first, the lifetime cannot outlive the anonymous lifetime #2 defined on the body at 15:16...
|
||||
--> $DIR/E0621-does-not-trigger-for-closures.rs:15:16
|
||||
|
|
||||
LL | invoke(&x, |a, b| if a > b { a } else { b });
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
note: ...so that reference does not outlive borrowed content
|
||||
--> $DIR/E0621-does-not-trigger-for-closures.rs:15:45
|
||||
|
|
||||
LL | invoke(&x, |a, b| if a > b { a } else { b });
|
||||
| ^
|
||||
note: but, the lifetime must be valid for the call at 15:5...
|
||||
--> $DIR/E0621-does-not-trigger-for-closures.rs:15:5
|
||||
|
|
||||
LL | invoke(&x, |a, b| if a > b { a } else { b });
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
note: ...so type `&i32` of expression is valid during the expression
|
||||
--> $DIR/E0621-does-not-trigger-for-closures.rs:15:5
|
||||
|
|
||||
LL | invoke(&x, |a, b| if a > b { a } else { b });
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| -- ^ returning this value requires that `'1` must outlive `'2`
|
||||
| ||
|
||||
| |return type of closure is &'2 i32
|
||||
| has type `&'1 i32`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0495`.
|
||||
|
@ -4,17 +4,11 @@ error[E0700]: hidden type for `impl Trait` captures lifetime that does not appea
|
||||
LL | fn upper_bounds<'a, 'b, 'c, 'd, 'e>(a: Ordinary<'a>, b: Ordinary<'b>) -> impl Trait<'d, 'e>
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
note: hidden type `Ordinary<'_>` captures the scope of call-site for function at 23:1
|
||||
--> $DIR/ordinary-bounds-unrelated.rs:23:1
|
||||
note: hidden type `Ordinary<'_>` captures lifetime smaller than the function body
|
||||
--> $DIR/ordinary-bounds-unrelated.rs:18:74
|
||||
|
|
||||
LL | / {
|
||||
LL | | // Hidden type `Ordinary<'0>` with constraints:
|
||||
LL | | //
|
||||
LL | | // ```
|
||||
... |
|
||||
LL | | if condition() { a } else { b }
|
||||
LL | | }
|
||||
| |_^
|
||||
LL | fn upper_bounds<'a, 'b, 'c, 'd, 'e>(a: Ordinary<'a>, b: Ordinary<'b>) -> impl Trait<'d, 'e>
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -4,17 +4,11 @@ error[E0700]: hidden type for `impl Trait` captures lifetime that does not appea
|
||||
LL | fn upper_bounds<'a, 'b>(a: Ordinary<'a>, b: Ordinary<'b>) -> impl Trait<'a, 'b>
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
note: hidden type `Ordinary<'_>` captures the scope of call-site for function at 22:1
|
||||
--> $DIR/ordinary-bounds-unsuited.rs:22:1
|
||||
note: hidden type `Ordinary<'_>` captures lifetime smaller than the function body
|
||||
--> $DIR/ordinary-bounds-unsuited.rs:20:62
|
||||
|
|
||||
LL | / {
|
||||
LL | | // We return a value:
|
||||
LL | | //
|
||||
LL | | // ```
|
||||
... |
|
||||
LL | | if condition() { a } else { b }
|
||||
LL | | }
|
||||
| |_^
|
||||
LL | fn upper_bounds<'a, 'b>(a: Ordinary<'a>, b: Ordinary<'b>) -> impl Trait<'a, 'b>
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -6,22 +6,21 @@ trait A<T>
|
||||
fn get(&self) -> T { panic!() }
|
||||
}
|
||||
|
||||
struct B<'a, T:'a>(&'a (A<T>+'a));
|
||||
struct B<'a, T: 'a>(&'a (A<T> + 'a));
|
||||
|
||||
trait X { fn foo(&self) {} }
|
||||
|
||||
impl<'a, T> X for B<'a, T> {}
|
||||
|
||||
fn f<'a, T, U>(v: Box<A<T>+'static>) -> Box<X+'static> {
|
||||
fn f<'a, T, U>(v: Box<A<T> + 'static>) -> Box<X + 'static> {
|
||||
// oh dear!
|
||||
box B(&*v) as Box<X>
|
||||
//~^ ERROR the parameter type `T` may not live long enough
|
||||
//~| ERROR the parameter type `T` may not live long enough
|
||||
//~| ERROR the parameter type `T` may not live long enough
|
||||
//~| ERROR the parameter type `T` may not live long enough
|
||||
//~| ERROR the parameter type `T` may not live long enough
|
||||
//~| ERROR the parameter type `T` may not live long enough
|
||||
//~| ERROR the parameter type `T` may not live long enough
|
||||
//~^ ERROR the parameter type `T` may not live long enough
|
||||
//~| ERROR the parameter type `T` may not live long enough
|
||||
//~| ERROR the parameter type `T` may not live long enough
|
||||
//~| ERROR the parameter type `T` may not live long enough
|
||||
//~| ERROR the parameter type `T` may not live long enough
|
||||
//~| ERROR the parameter type `T` may not live long enough
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
@ -1,7 +1,7 @@
|
||||
error[E0310]: the parameter type `T` may not live long enough
|
||||
--> $DIR/regions-close-object-into-object-5.rs:17:5
|
||||
|
|
||||
LL | fn f<'a, T, U>(v: Box<A<T>+'static>) -> Box<X+'static> {
|
||||
LL | fn f<'a, T, U>(v: Box<A<T> + 'static>) -> Box<X + 'static> {
|
||||
| - help: consider adding an explicit lifetime bound...: `T: 'static`
|
||||
LL | // oh dear!
|
||||
LL | box B(&*v) as Box<X>
|
||||
@ -13,25 +13,10 @@ note: ...so that the type `B<'_, T>` will meet its required lifetime bounds
|
||||
LL | box B(&*v) as Box<X>
|
||||
| ^^^^^^^^^^
|
||||
|
||||
error[E0310]: the parameter type `T` may not live long enough
|
||||
--> $DIR/regions-close-object-into-object-5.rs:17:5
|
||||
|
|
||||
LL | fn f<'a, T, U>(v: Box<A<T>+'static>) -> Box<X+'static> {
|
||||
| - help: consider adding an explicit lifetime bound...: `T: 'static`
|
||||
LL | // oh dear!
|
||||
LL | box B(&*v) as Box<X>
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
note: ...so that it can be closed over into an object
|
||||
--> $DIR/regions-close-object-into-object-5.rs:17:5
|
||||
|
|
||||
LL | box B(&*v) as Box<X>
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0310]: the parameter type `T` may not live long enough
|
||||
--> $DIR/regions-close-object-into-object-5.rs:17:9
|
||||
|
|
||||
LL | fn f<'a, T, U>(v: Box<A<T>+'static>) -> Box<X+'static> {
|
||||
LL | fn f<'a, T, U>(v: Box<A<T> + 'static>) -> Box<X + 'static> {
|
||||
| - help: consider adding an explicit lifetime bound...: `T: 'static`
|
||||
LL | // oh dear!
|
||||
LL | box B(&*v) as Box<X>
|
||||
@ -46,7 +31,7 @@ LL | box B(&*v) as Box<X>
|
||||
error[E0310]: the parameter type `T` may not live long enough
|
||||
--> $DIR/regions-close-object-into-object-5.rs:17:9
|
||||
|
|
||||
LL | fn f<'a, T, U>(v: Box<A<T>+'static>) -> Box<X+'static> {
|
||||
LL | fn f<'a, T, U>(v: Box<A<T> + 'static>) -> Box<X + 'static> {
|
||||
| - help: consider adding an explicit lifetime bound...: `T: 'static`
|
||||
LL | // oh dear!
|
||||
LL | box B(&*v) as Box<X>
|
||||
@ -61,7 +46,7 @@ LL | box B(&*v) as Box<X>
|
||||
error[E0310]: the parameter type `T` may not live long enough
|
||||
--> $DIR/regions-close-object-into-object-5.rs:17:11
|
||||
|
|
||||
LL | fn f<'a, T, U>(v: Box<A<T>+'static>) -> Box<X+'static> {
|
||||
LL | fn f<'a, T, U>(v: Box<A<T> + 'static>) -> Box<X + 'static> {
|
||||
| - help: consider adding an explicit lifetime bound...: `T: 'static`
|
||||
LL | // oh dear!
|
||||
LL | box B(&*v) as Box<X>
|
||||
@ -76,7 +61,7 @@ LL | box B(&*v) as Box<X>
|
||||
error[E0310]: the parameter type `T` may not live long enough
|
||||
--> $DIR/regions-close-object-into-object-5.rs:17:11
|
||||
|
|
||||
LL | fn f<'a, T, U>(v: Box<A<T>+'static>) -> Box<X+'static> {
|
||||
LL | fn f<'a, T, U>(v: Box<A<T> + 'static>) -> Box<X + 'static> {
|
||||
| - help: consider adding an explicit lifetime bound...: `T: 'static`
|
||||
LL | // oh dear!
|
||||
LL | box B(&*v) as Box<X>
|
||||
@ -91,7 +76,7 @@ LL | box B(&*v) as Box<X>
|
||||
error[E0310]: the parameter type `T` may not live long enough
|
||||
--> $DIR/regions-close-object-into-object-5.rs:17:11
|
||||
|
|
||||
LL | fn f<'a, T, U>(v: Box<A<T>+'static>) -> Box<X+'static> {
|
||||
LL | fn f<'a, T, U>(v: Box<A<T> + 'static>) -> Box<X + 'static> {
|
||||
| - help: consider adding an explicit lifetime bound...: `T: 'static`
|
||||
LL | // oh dear!
|
||||
LL | box B(&*v) as Box<X>
|
||||
@ -103,6 +88,6 @@ note: ...so that the type `(dyn A<T> + 'static)` is not borrowed for too long
|
||||
LL | box B(&*v) as Box<X>
|
||||
| ^^^
|
||||
|
||||
error: aborting due to 7 previous errors
|
||||
error: aborting due to 6 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0310`.
|
||||
|
@ -1,5 +1,5 @@
|
||||
error[E0310]: the parameter type `A` may not live long enough
|
||||
--> $DIR/regions-close-over-type-parameter-1.rs:10:5
|
||||
--> $DIR/regions-close-over-type-parameter-1.rs:12:5
|
||||
|
|
||||
LL | box v as Box<dyn SomeTrait + 'static>
|
||||
| ^^^^^
|
||||
@ -7,7 +7,7 @@ LL | box v as Box<dyn SomeTrait + 'static>
|
||||
= help: consider adding an explicit lifetime bound `A: 'static`...
|
||||
|
||||
error[E0309]: the parameter type `A` may not live long enough
|
||||
--> $DIR/regions-close-over-type-parameter-1.rs:20:5
|
||||
--> $DIR/regions-close-over-type-parameter-1.rs:21:5
|
||||
|
|
||||
LL | box v as Box<dyn SomeTrait + 'b>
|
||||
| ^^^^^
|
||||
|
@ -4,22 +4,22 @@
|
||||
// an object. This should yield errors unless `A` (and the object)
|
||||
// both have suitable bounds.
|
||||
|
||||
trait SomeTrait { fn get(&self) -> isize; }
|
||||
|
||||
fn make_object1<A:SomeTrait>(v: A) -> Box<dyn SomeTrait + 'static> {
|
||||
box v as Box<dyn SomeTrait + 'static>
|
||||
//~^ ERROR the parameter type `A` may not live long enough
|
||||
//~| ERROR the parameter type `A` may not live long enough
|
||||
trait SomeTrait {
|
||||
fn get(&self) -> isize;
|
||||
}
|
||||
|
||||
fn make_object2<'a,A:SomeTrait+'a>(v: A) -> Box<dyn SomeTrait + 'a> {
|
||||
fn make_object1<A: SomeTrait>(v: A) -> Box<dyn SomeTrait + 'static> {
|
||||
box v as Box<dyn SomeTrait + 'static>
|
||||
//~^ ERROR the parameter type `A` may not live long enough
|
||||
}
|
||||
|
||||
fn make_object2<'a, A: SomeTrait + 'a>(v: A) -> Box<dyn SomeTrait + 'a> {
|
||||
box v as Box<dyn SomeTrait + 'a>
|
||||
}
|
||||
|
||||
fn make_object3<'a,'b,A:SomeTrait+'a>(v: A) -> Box<dyn SomeTrait + 'b> {
|
||||
fn make_object3<'a, 'b, A: SomeTrait + 'a>(v: A) -> Box<dyn SomeTrait + 'b> {
|
||||
box v as Box<dyn SomeTrait + 'b>
|
||||
//~^ ERROR the parameter type `A` may not live long enough
|
||||
//~| ERROR the parameter type `A` may not live long enough
|
||||
//~^ ERROR the parameter type `A` may not live long enough
|
||||
}
|
||||
|
||||
fn main() { }
|
||||
fn main() {}
|
||||
|
@ -1,60 +1,32 @@
|
||||
error[E0310]: the parameter type `A` may not live long enough
|
||||
--> $DIR/regions-close-over-type-parameter-1.rs:10:5
|
||||
--> $DIR/regions-close-over-type-parameter-1.rs:12:5
|
||||
|
|
||||
LL | fn make_object1<A:SomeTrait>(v: A) -> Box<dyn SomeTrait + 'static> {
|
||||
LL | fn make_object1<A: SomeTrait>(v: A) -> Box<dyn SomeTrait + 'static> {
|
||||
| -- help: consider adding an explicit lifetime bound...: `A: 'static +`
|
||||
LL | box v as Box<dyn SomeTrait + 'static>
|
||||
| ^^^^^
|
||||
|
|
||||
note: ...so that the type `A` will meet its required lifetime bounds
|
||||
--> $DIR/regions-close-over-type-parameter-1.rs:10:5
|
||||
--> $DIR/regions-close-over-type-parameter-1.rs:12:5
|
||||
|
|
||||
LL | box v as Box<dyn SomeTrait + 'static>
|
||||
| ^^^^^
|
||||
|
||||
error[E0310]: the parameter type `A` may not live long enough
|
||||
--> $DIR/regions-close-over-type-parameter-1.rs:10:5
|
||||
|
|
||||
LL | fn make_object1<A:SomeTrait>(v: A) -> Box<dyn SomeTrait + 'static> {
|
||||
| -- help: consider adding an explicit lifetime bound...: `A: 'static +`
|
||||
LL | box v as Box<dyn SomeTrait + 'static>
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
note: ...so that it can be closed over into an object
|
||||
--> $DIR/regions-close-over-type-parameter-1.rs:10:5
|
||||
|
|
||||
LL | box v as Box<dyn SomeTrait + 'static>
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0309]: the parameter type `A` may not live long enough
|
||||
--> $DIR/regions-close-over-type-parameter-1.rs:20:5
|
||||
--> $DIR/regions-close-over-type-parameter-1.rs:21:5
|
||||
|
|
||||
LL | fn make_object3<'a,'b,A:SomeTrait+'a>(v: A) -> Box<dyn SomeTrait + 'b> {
|
||||
| -- help: consider adding an explicit lifetime bound...: `A: 'b +`
|
||||
LL | fn make_object3<'a, 'b, A: SomeTrait + 'a>(v: A) -> Box<dyn SomeTrait + 'b> {
|
||||
| -- help: consider adding an explicit lifetime bound...: `A: 'b +`
|
||||
LL | box v as Box<dyn SomeTrait + 'b>
|
||||
| ^^^^^
|
||||
|
|
||||
note: ...so that the type `A` will meet its required lifetime bounds
|
||||
--> $DIR/regions-close-over-type-parameter-1.rs:20:5
|
||||
--> $DIR/regions-close-over-type-parameter-1.rs:21:5
|
||||
|
|
||||
LL | box v as Box<dyn SomeTrait + 'b>
|
||||
| ^^^^^
|
||||
|
||||
error[E0309]: the parameter type `A` may not live long enough
|
||||
--> $DIR/regions-close-over-type-parameter-1.rs:20:5
|
||||
|
|
||||
LL | fn make_object3<'a,'b,A:SomeTrait+'a>(v: A) -> Box<dyn SomeTrait + 'b> {
|
||||
| -- help: consider adding an explicit lifetime bound...: `A: 'b +`
|
||||
LL | box v as Box<dyn SomeTrait + 'b>
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
note: ...so that it can be closed over into an object
|
||||
--> $DIR/regions-close-over-type-parameter-1.rs:20:5
|
||||
|
|
||||
LL | box v as Box<dyn SomeTrait + 'b>
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to 4 previous errors
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0309, E0310.
|
||||
For more information about an error, try `rustc --explain E0309`.
|
||||
|
@ -1,11 +0,0 @@
|
||||
error: lifetime may not live long enough
|
||||
--> $DIR/regions-escape-method.rs:15:13
|
||||
|
|
||||
LL | s.f(|p| p)
|
||||
| -- ^ returning this value requires that `'1` must outlive `'2`
|
||||
| ||
|
||||
| |return type of closure is &'2 i32
|
||||
| has type `&'1 i32`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
@ -12,5 +12,5 @@ impl S {
|
||||
|
||||
fn main() {
|
||||
let s = S;
|
||||
s.f(|p| p) //~ ERROR cannot infer
|
||||
s.f(|p| p) //~ ERROR lifetime may not live long enough
|
||||
}
|
||||
|
@ -1,32 +1,11 @@
|
||||
error[E0495]: cannot infer an appropriate lifetime due to conflicting requirements
|
||||
error: lifetime may not live long enough
|
||||
--> $DIR/regions-escape-method.rs:15:13
|
||||
|
|
||||
LL | s.f(|p| p)
|
||||
| ^
|
||||
|
|
||||
note: first, the lifetime cannot outlive the anonymous lifetime #2 defined on the body at 15:9...
|
||||
--> $DIR/regions-escape-method.rs:15:9
|
||||
|
|
||||
LL | s.f(|p| p)
|
||||
| ^^^^^
|
||||
note: ...so that the expression is assignable
|
||||
--> $DIR/regions-escape-method.rs:15:13
|
||||
|
|
||||
LL | s.f(|p| p)
|
||||
| ^
|
||||
= note: expected `&i32`
|
||||
found `&i32`
|
||||
note: but, the lifetime must be valid for the method call at 15:5...
|
||||
--> $DIR/regions-escape-method.rs:15:5
|
||||
|
|
||||
LL | s.f(|p| p)
|
||||
| ^^^^^^^^^^
|
||||
note: ...so that a type/lifetime parameter is in scope here
|
||||
--> $DIR/regions-escape-method.rs:15:5
|
||||
|
|
||||
LL | s.f(|p| p)
|
||||
| ^^^^^^^^^^
|
||||
| -- ^ returning this value requires that `'1` must outlive `'2`
|
||||
| ||
|
||||
| |return type of closure is &'2 i32
|
||||
| has type `&'1 i32`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0495`.
|
||||
|
@ -1,11 +0,0 @@
|
||||
error: lifetime may not live long enough
|
||||
--> $DIR/regions-escape-via-trait-or-not.rs:18:14
|
||||
|
|
||||
LL | with(|o| o)
|
||||
| -- ^ returning this value requires that `'1` must outlive `'2`
|
||||
| ||
|
||||
| |return type of closure is &'2 isize
|
||||
| has type `&'1 isize`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
@ -15,7 +15,7 @@ fn with<R:Deref, F>(f: F) -> isize where F: FnOnce(&isize) -> R {
|
||||
}
|
||||
|
||||
fn return_it() -> isize {
|
||||
with(|o| o) //~ ERROR cannot infer
|
||||
with(|o| o) //~ ERROR lifetime may not live long enough
|
||||
}
|
||||
|
||||
fn main() {
|
||||
|
@ -1,32 +1,11 @@
|
||||
error[E0495]: cannot infer an appropriate lifetime due to conflicting requirements
|
||||
error: lifetime may not live long enough
|
||||
--> $DIR/regions-escape-via-trait-or-not.rs:18:14
|
||||
|
|
||||
LL | with(|o| o)
|
||||
| ^
|
||||
|
|
||||
note: first, the lifetime cannot outlive the anonymous lifetime #2 defined on the body at 18:10...
|
||||
--> $DIR/regions-escape-via-trait-or-not.rs:18:10
|
||||
|
|
||||
LL | with(|o| o)
|
||||
| ^^^^^
|
||||
note: ...so that the expression is assignable
|
||||
--> $DIR/regions-escape-via-trait-or-not.rs:18:14
|
||||
|
|
||||
LL | with(|o| o)
|
||||
| ^
|
||||
= note: expected `&isize`
|
||||
found `&isize`
|
||||
note: but, the lifetime must be valid for the expression at 18:5...
|
||||
--> $DIR/regions-escape-via-trait-or-not.rs:18:5
|
||||
|
|
||||
LL | with(|o| o)
|
||||
| ^^^^
|
||||
note: ...so type `fn([closure@$DIR/regions-escape-via-trait-or-not.rs:18:10: 18:15]) -> isize {with::<&isize, [closure@$DIR/regions-escape-via-trait-or-not.rs:18:10: 18:15]>}` of expression is valid during the expression
|
||||
--> $DIR/regions-escape-via-trait-or-not.rs:18:5
|
||||
|
|
||||
LL | with(|o| o)
|
||||
| ^^^^
|
||||
| -- ^ returning this value requires that `'1` must outlive `'2`
|
||||
| ||
|
||||
| |return type of closure is &'2 isize
|
||||
| has type `&'1 isize`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0495`.
|
||||
|
@ -1,11 +0,0 @@
|
||||
error: lifetime may not live long enough
|
||||
--> $DIR/regions-infer-call-3.rs:8:24
|
||||
|
|
||||
LL | let z = with(|y| { select(x, y) });
|
||||
| -- ^^^^^^^^^^^^ returning this value requires that `'1` must outlive `'2`
|
||||
| ||
|
||||
| |return type of closure is &'2 isize
|
||||
| has type `&'1 isize`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
@ -6,7 +6,7 @@ fn with<T, F>(f: F) -> T where F: FnOnce(&isize) -> T {
|
||||
|
||||
fn manip<'a>(x: &'a isize) -> isize {
|
||||
let z = with(|y| { select(x, y) });
|
||||
//~^ ERROR cannot infer
|
||||
//~^ ERROR lifetime may not live long enough
|
||||
*z
|
||||
}
|
||||
|
||||
|
@ -1,30 +1,11 @@
|
||||
error[E0495]: cannot infer an appropriate lifetime for lifetime parameter 'r in function call due to conflicting requirements
|
||||
error: lifetime may not live long enough
|
||||
--> $DIR/regions-infer-call-3.rs:8:24
|
||||
|
|
||||
LL | let z = with(|y| { select(x, y) });
|
||||
| ^^^^^^^^^^^^
|
||||
|
|
||||
note: first, the lifetime cannot outlive the anonymous lifetime #2 defined on the body at 8:18...
|
||||
--> $DIR/regions-infer-call-3.rs:8:18
|
||||
|
|
||||
LL | let z = with(|y| { select(x, y) });
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
note: ...so that reference does not outlive borrowed content
|
||||
--> $DIR/regions-infer-call-3.rs:8:34
|
||||
|
|
||||
LL | let z = with(|y| { select(x, y) });
|
||||
| ^
|
||||
note: but, the lifetime must be valid for the call at 8:13...
|
||||
--> $DIR/regions-infer-call-3.rs:8:13
|
||||
|
|
||||
LL | let z = with(|y| { select(x, y) });
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
note: ...so type `&isize` of expression is valid during the expression
|
||||
--> $DIR/regions-infer-call-3.rs:8:13
|
||||
|
|
||||
LL | let z = with(|y| { select(x, y) });
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| -- ^^^^^^^^^^^^ returning this value requires that `'1` must outlive `'2`
|
||||
| ||
|
||||
| |return type of closure is &'2 isize
|
||||
| has type `&'1 isize`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0495`.
|
||||
|
@ -1,13 +0,0 @@
|
||||
error: captured variable cannot escape `FnMut` closure body
|
||||
--> $DIR/regions-return-ref-to-upvar-issue-17403.rs:7:24
|
||||
|
|
||||
LL | let mut f = || &mut x;
|
||||
| - ^^^^^^ 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
|
||||
|
@ -4,7 +4,7 @@ fn main() {
|
||||
// Unboxed closure case
|
||||
{
|
||||
let mut x = 0;
|
||||
let mut f = || &mut x; //~ ERROR cannot infer
|
||||
let mut f = || &mut x; //~ ERROR captured variable cannot escape `FnMut` closure body
|
||||
let x = f();
|
||||
let y = f();
|
||||
}
|
||||
|
@ -1,30 +1,13 @@
|
||||
error[E0495]: cannot infer an appropriate lifetime for borrow expression due to conflicting requirements
|
||||
error: captured variable cannot escape `FnMut` closure body
|
||||
--> $DIR/regions-return-ref-to-upvar-issue-17403.rs:7:24
|
||||
|
|
||||
LL | let mut f = || &mut x;
|
||||
| ^^^^^^
|
||||
| - ^^^^^^ returns a reference to a captured variable which escapes the closure body
|
||||
| |
|
||||
| inferred to be a `FnMut` closure
|
||||
|
|
||||
note: first, the lifetime cannot outlive the lifetime `'_` as defined on the body at 7:21...
|
||||
--> $DIR/regions-return-ref-to-upvar-issue-17403.rs:7:21
|
||||
|
|
||||
LL | let mut f = || &mut x;
|
||||
| ^^^^^^^^^
|
||||
note: ...so that closure can access `x`
|
||||
--> $DIR/regions-return-ref-to-upvar-issue-17403.rs:7:24
|
||||
|
|
||||
LL | let mut f = || &mut x;
|
||||
| ^^^^^^
|
||||
note: but, the lifetime must be valid for the call at 9:17...
|
||||
--> $DIR/regions-return-ref-to-upvar-issue-17403.rs:9:17
|
||||
|
|
||||
LL | let y = f();
|
||||
| ^^^
|
||||
note: ...so type `&mut i32` of expression is valid during the expression
|
||||
--> $DIR/regions-return-ref-to-upvar-issue-17403.rs:9:17
|
||||
|
|
||||
LL | let y = f();
|
||||
| ^^^
|
||||
= 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
|
||||
|
||||
For more information about this error, try `rustc --explain E0495`.
|
||||
|
@ -3,8 +3,8 @@
|
||||
// revisions: legacy v0
|
||||
//[legacy]compile-flags: -Z symbol-mangling-version=legacy
|
||||
//[v0]compile-flags: -Z symbol-mangling-version=v0
|
||||
//[legacy]normalize-stderr-32bit: "hdb62078998ce7ea8" -> "SYMBOL_HASH"
|
||||
//[legacy]normalize-stderr-64bit: "h62e540f14f879d56" -> "SYMBOL_HASH"
|
||||
//[legacy]normalize-stderr-32bit: "h5ef5dfc14aeecbfc" -> "SYMBOL_HASH"
|
||||
//[legacy]normalize-stderr-64bit: "h9e54d216f70fcbc5" -> "SYMBOL_HASH"
|
||||
|
||||
#![feature(optin_builtin_traits, rustc_attrs)]
|
||||
#![allow(dead_code)]
|
||||
|
Loading…
Reference in New Issue
Block a user