Rollup merge of #89734 - estebank:issue-72312, r=nikomatsakis
Point at capture points for non-`'static` reference crossing a `yield` point
```
error[E0759]: `self` has an anonymous lifetime `'_` but it needs to satisfy a `'static` lifetime requirement
--> $DIR/issue-72312.rs:10:24
|
LL | pub async fn start(&self) {
| ^^^^^ this data with an anonymous lifetime `'_`...
...
LL | require_static(async move {
| -------------- ...is required to live as long as `'static` here...
LL | &self;
| ----- ...and is captured here
|
note: `'static` lifetime requirement introduced by this trait bound
--> $DIR/issue-72312.rs:2:22
|
LL | fn require_static<T: 'static>(val: T) -> T {
| ^^^^^^^
error: aborting due to previous error
For more information about this error, try `rustc --explain E0759`.
```
Fix #72312.
This commit is contained in:
commit
7bba5c163c
37 changed files with 467 additions and 134 deletions
|
|
@ -4,7 +4,7 @@ error[E0759]: `x` has lifetime `'a` but it needs to satisfy a `'static` lifetime
|
|||
LL | fn baz<'a,'b>(x: &'a u32) -> &'static u32 {
|
||||
| ------- this data with lifetime `'a`...
|
||||
LL | bar(foo, x)
|
||||
| ----^^^---- ...is captured and required to live as long as `'static` here
|
||||
| ^^^ - ...is used and required to live as long as `'static` here
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,16 @@ LL | fn baz<'a, 'b>(x: Type<'a>) -> Type<'static> {
|
|||
| -------- this data with lifetime `'a`...
|
||||
...
|
||||
LL | bar(foo, x)
|
||||
| ----^^^---- ...is captured and required to live as long as `'static` here
|
||||
| ^^^ - ...is used and required to live as long as `'static` here
|
||||
|
|
||||
note: `'static` lifetime requirement introduced by the return type
|
||||
--> $DIR/project-fn-ret-invariant.rs:45:37
|
||||
|
|
||||
LL | fn baz<'a, 'b>(x: Type<'a>) -> Type<'static> {
|
||||
| ^^^^^^^ `'static` requirement introduced here
|
||||
...
|
||||
LL | bar(foo, x)
|
||||
| ----------- because of this returned expression
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
|
|
|||
|
|
@ -2,12 +2,15 @@ error[E0759]: `self` has an anonymous lifetime `'_` but it needs to satisfy a `'
|
|||
--> $DIR/issue-62097.rs:12:31
|
||||
|
|
||||
LL | pub async fn run_dummy_fn(&self) {
|
||||
| ^^^^^
|
||||
| |
|
||||
| this data with an anonymous lifetime `'_`...
|
||||
| ...is captured here...
|
||||
| ^^^^^ this data with an anonymous lifetime `'_`...
|
||||
LL | foo(|| self.bar()).await;
|
||||
| --- ...and is required to live as long as `'static` here
|
||||
| --- ...is used and required to live as long as `'static` here
|
||||
|
|
||||
note: `'static` lifetime requirement introduced by this bound
|
||||
--> $DIR/issue-62097.rs:4:19
|
||||
|
|
||||
LL | F: FnOnce() + 'static
|
||||
| ^^^^^^^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
|
|
|||
21
src/test/ui/async-await/issues/issue-72312.nll.stderr
Normal file
21
src/test/ui/async-await/issues/issue-72312.nll.stderr
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
error[E0521]: borrowed data escapes outside of associated function
|
||||
--> $DIR/issue-72312.rs:13:24
|
||||
|
|
||||
LL | pub async fn start(&self) {
|
||||
| -----
|
||||
| |
|
||||
| `self` is a reference that is only valid in the associated function body
|
||||
| let's call the lifetime of this reference `'1`
|
||||
...
|
||||
LL | require_static(async move {
|
||||
| ________________________^
|
||||
LL | | &self;
|
||||
LL | | });
|
||||
| | ^
|
||||
| | |
|
||||
| |_________`self` escapes the associated function body here
|
||||
| argument requires that `'1` must outlive `'static`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0521`.
|
||||
19
src/test/ui/async-await/issues/issue-72312.rs
Normal file
19
src/test/ui/async-await/issues/issue-72312.rs
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
// edition:2018
|
||||
fn require_static<T: 'static>(val: T) -> T {
|
||||
//~^ NOTE 'static` lifetime requirement introduced by this bound
|
||||
val
|
||||
}
|
||||
|
||||
struct Problem;
|
||||
|
||||
impl Problem {
|
||||
pub async fn start(&self) { //~ ERROR E0759
|
||||
//~^ NOTE this data with an anonymous lifetime `'_`
|
||||
//~| NOTE in this expansion of desugaring of `async` block or function
|
||||
require_static(async move { //~ NOTE ...and is required to live as long as `'static` here
|
||||
&self; //~ NOTE ...is used here...
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
23
src/test/ui/async-await/issues/issue-72312.stderr
Normal file
23
src/test/ui/async-await/issues/issue-72312.stderr
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
error[E0759]: `self` has an anonymous lifetime `'_` but it needs to satisfy a `'static` lifetime requirement
|
||||
--> $DIR/issue-72312.rs:10:24
|
||||
|
|
||||
LL | pub async fn start(&self) {
|
||||
| ^^^^^ this data with an anonymous lifetime `'_`...
|
||||
...
|
||||
LL | &self;
|
||||
| ----- ...is used here...
|
||||
|
|
||||
note: ...and is required to live as long as `'static` here
|
||||
--> $DIR/issue-72312.rs:13:9
|
||||
|
|
||||
LL | require_static(async move {
|
||||
| ^^^^^^^^^^^^^^
|
||||
note: `'static` lifetime requirement introduced by this bound
|
||||
--> $DIR/issue-72312.rs:2:22
|
||||
|
|
||||
LL | fn require_static<T: 'static>(val: T) -> T {
|
||||
| ^^^^^^^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0759`.
|
||||
|
|
@ -8,13 +8,18 @@ LL | bar(|| {
|
|||
LL | |
|
||||
LL | | let _ = x;
|
||||
LL | | })
|
||||
| |_____^ ...is captured here...
|
||||
| |_____^ ...is used here...
|
||||
|
|
||||
note: ...and is required to live as long as `'static` here
|
||||
--> $DIR/closure-bounds-static-cant-capture-borrowed.rs:5:5
|
||||
|
|
||||
LL | bar(|| {
|
||||
| ^^^
|
||||
note: `'static` lifetime requirement introduced by this bound
|
||||
--> $DIR/closure-bounds-static-cant-capture-borrowed.rs:1:39
|
||||
|
|
||||
LL | fn bar<F>(blk: F) where F: FnOnce() + 'static {
|
||||
| ^^^^^^^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ LL | fn dangle(x: &mut i32) -> &'static mut i32 {
|
|||
| -------- this data with an anonymous lifetime `'_`...
|
||||
...
|
||||
LL | x
|
||||
| ^ ...is captured here...
|
||||
| ^ ...is used here...
|
||||
...
|
||||
LL | GeneratorState::Complete(c) => return c,
|
||||
| - ...and is required to live as long as `'static` here
|
||||
|
|
|
|||
|
|
@ -4,7 +4,9 @@ error[E0759]: `x` has an anonymous lifetime `'_` but it needs to satisfy a `'sta
|
|||
LL | fn f(x: &impl for<'a> X<Y<'a> = &'a ()>) -> &'static () {
|
||||
| ------------------------------- this data with an anonymous lifetime `'_`...
|
||||
LL | x.m()
|
||||
| --^-- ...is captured and required to live as long as `'static` here
|
||||
| - ^
|
||||
| |
|
||||
| ...is used and required to live as long as `'static` here
|
||||
|
||||
error[E0759]: `x` has an anonymous lifetime `'_` but it needs to satisfy a `'static` lifetime requirement
|
||||
--> $DIR/projection-type-lifetime-mismatch.rs:22:7
|
||||
|
|
@ -12,7 +14,9 @@ error[E0759]: `x` has an anonymous lifetime `'_` but it needs to satisfy a `'sta
|
|||
LL | fn g<T: for<'a> X<Y<'a> = &'a ()>>(x: &T) -> &'static () {
|
||||
| -- this data with an anonymous lifetime `'_`...
|
||||
LL | x.m()
|
||||
| --^-- ...is captured and required to live as long as `'static` here
|
||||
| - ^
|
||||
| |
|
||||
| ...is used and required to live as long as `'static` here
|
||||
|
||||
error[E0759]: `x` has an anonymous lifetime `'_` but it needs to satisfy a `'static` lifetime requirement
|
||||
--> $DIR/projection-type-lifetime-mismatch.rs:27:7
|
||||
|
|
@ -20,7 +24,9 @@ error[E0759]: `x` has an anonymous lifetime `'_` but it needs to satisfy a `'sta
|
|||
LL | fn h(x: &()) -> &'static () {
|
||||
| --- this data with an anonymous lifetime `'_`...
|
||||
LL | x.m()
|
||||
| --^-- ...is captured and required to live as long as `'static` here
|
||||
| - ^
|
||||
| |
|
||||
| ...is used and required to live as long as `'static` here
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ error[E0759]: `x` has lifetime `'a` but it needs to satisfy a `'static` lifetime
|
|||
LL | fn with_dyn_debug_static<'a>(x: Box<dyn Debug + 'a>) {
|
||||
| ------------------- this data with lifetime `'a`...
|
||||
LL | static_val(x);
|
||||
| ^ ...is captured here...
|
||||
| ^ ...is used here...
|
||||
|
|
||||
note: ...and is required to live as long as `'static` here
|
||||
--> $DIR/dyn-trait.rs:20:5
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ error[E0759]: `x` has an anonymous lifetime `'_` but it needs to satisfy a `'sta
|
|||
--> $DIR/must_outlive_least_region_or_bound.rs:9:46
|
||||
|
|
||||
LL | fn elided2(x: &i32) -> impl Copy + 'static { x }
|
||||
| ---- ^ ...is captured here...
|
||||
| ---- ^ ...is used here...
|
||||
| |
|
||||
| this data with an anonymous lifetime `'_`...
|
||||
|
|
||||
|
|
@ -50,7 +50,7 @@ error[E0759]: `x` has lifetime `'a` but it needs to satisfy a `'static` lifetime
|
|||
--> $DIR/must_outlive_least_region_or_bound.rs:11:55
|
||||
|
|
||||
LL | fn explicit2<'a>(x: &'a i32) -> impl Copy + 'static { x }
|
||||
| ------- ^ ...is captured here...
|
||||
| ------- ^ ...is used here...
|
||||
| |
|
||||
| this data with lifetime `'a`...
|
||||
|
|
||||
|
|
@ -80,7 +80,7 @@ error[E0759]: `x` has an anonymous lifetime `'_` but it needs to satisfy a `'sta
|
|||
--> $DIR/must_outlive_least_region_or_bound.rs:24:65
|
||||
|
|
||||
LL | fn elided5(x: &i32) -> (Box<dyn Debug>, impl Debug) { (Box::new(x), x) }
|
||||
| ---- this data with an anonymous lifetime `'_`... ^ ...is captured here, requiring it to live as long as `'static`
|
||||
| ---- this data with an anonymous lifetime `'_`... ^ ...is used and required to live as long as `'static` here
|
||||
|
|
||||
help: to declare that the trait object captures data from argument `x`, you can add an explicit `'_` lifetime bound
|
||||
|
|
||||
|
|
@ -95,7 +95,7 @@ error[E0759]: `x` has lifetime `'a` but it needs to satisfy a `'static` lifetime
|
|||
--> $DIR/must_outlive_least_region_or_bound.rs:29:69
|
||||
|
|
||||
LL | fn with_bound<'a>(x: &'a i32) -> impl LifetimeTrait<'a> + 'static { x }
|
||||
| ------- this data with lifetime `'a`... ^ ...is captured here...
|
||||
| ------- this data with lifetime `'a`... ^ ...is used here...
|
||||
|
|
||||
note: ...and is required to live as long as `'static` here
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:29:34
|
||||
|
|
@ -136,10 +136,17 @@ error[E0759]: `x` has an anonymous lifetime `'_` but it needs to satisfy a `'sta
|
|||
--> $DIR/must_outlive_least_region_or_bound.rs:16:50
|
||||
|
|
||||
LL | fn elided3(x: &i32) -> Box<dyn Debug> { Box::new(x) }
|
||||
| ---- ^ ...is captured here, requiring it to live as long as `'static`
|
||||
| ---- ^ ...is used and required to live as long as `'static` here
|
||||
| |
|
||||
| this data with an anonymous lifetime `'_`...
|
||||
|
|
||||
note: `'static` lifetime requirement introduced by the return type
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:16:28
|
||||
|
|
||||
LL | fn elided3(x: &i32) -> Box<dyn Debug> { Box::new(x) }
|
||||
| ^^^^^^^^^ ----------- because of this returned expression
|
||||
| |
|
||||
| `'static` requirement introduced here
|
||||
help: to declare that the trait object captures data from argument `x`, you can add an explicit `'_` lifetime bound
|
||||
|
|
||||
LL | fn elided3(x: &i32) -> Box<dyn Debug + '_> { Box::new(x) }
|
||||
|
|
@ -149,10 +156,17 @@ error[E0759]: `x` has lifetime `'a` but it needs to satisfy a `'static` lifetime
|
|||
--> $DIR/must_outlive_least_region_or_bound.rs:18:59
|
||||
|
|
||||
LL | fn explicit3<'a>(x: &'a i32) -> Box<dyn Debug> { Box::new(x) }
|
||||
| ------- ^ ...is captured here, requiring it to live as long as `'static`
|
||||
| ------- ^ ...is used and required to live as long as `'static` here
|
||||
| |
|
||||
| this data with lifetime `'a`...
|
||||
|
|
||||
note: `'static` lifetime requirement introduced by the return type
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:18:37
|
||||
|
|
||||
LL | fn explicit3<'a>(x: &'a i32) -> Box<dyn Debug> { Box::new(x) }
|
||||
| ^^^^^^^^^ ----------- because of this returned expression
|
||||
| |
|
||||
| `'static` requirement introduced here
|
||||
help: to declare that the trait object captures data from argument `x`, you can add an explicit `'a` lifetime bound
|
||||
|
|
||||
LL | fn explicit3<'a>(x: &'a i32) -> Box<dyn Debug + 'a> { Box::new(x) }
|
||||
|
|
@ -162,10 +176,17 @@ error[E0759]: `x` has an anonymous lifetime `'_` but it needs to satisfy a `'sta
|
|||
--> $DIR/must_outlive_least_region_or_bound.rs:20:60
|
||||
|
|
||||
LL | fn elided4(x: &i32) -> Box<dyn Debug + 'static> { Box::new(x) }
|
||||
| ---- ^ ...is captured here, requiring it to live as long as `'static`
|
||||
| ---- ^ ...is used and required to live as long as `'static` here
|
||||
| |
|
||||
| this data with an anonymous lifetime `'_`...
|
||||
|
|
||||
note: `'static` lifetime requirement introduced by the return type
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:20:40
|
||||
|
|
||||
LL | fn elided4(x: &i32) -> Box<dyn Debug + 'static> { Box::new(x) }
|
||||
| ^^^^^^^ ----------- because of this returned expression
|
||||
| |
|
||||
| `'static` requirement introduced here
|
||||
help: consider changing the trait object's explicit `'static` bound to the lifetime of argument `x`
|
||||
|
|
||||
LL | fn elided4(x: &i32) -> Box<dyn Debug + '_> { Box::new(x) }
|
||||
|
|
@ -179,8 +200,15 @@ error[E0759]: `x` has lifetime `'a` but it needs to satisfy a `'static` lifetime
|
|||
--> $DIR/must_outlive_least_region_or_bound.rs:22:69
|
||||
|
|
||||
LL | fn explicit4<'a>(x: &'a i32) -> Box<dyn Debug + 'static> { Box::new(x) }
|
||||
| ------- this data with lifetime `'a`... ^ ...is captured here, requiring it to live as long as `'static`
|
||||
| ------- this data with lifetime `'a`... ^ ...is used and required to live as long as `'static` here
|
||||
|
|
||||
note: `'static` lifetime requirement introduced by the return type
|
||||
--> $DIR/must_outlive_least_region_or_bound.rs:22:49
|
||||
|
|
||||
LL | fn explicit4<'a>(x: &'a i32) -> Box<dyn Debug + 'static> { Box::new(x) }
|
||||
| ^^^^^^^ ----------- because of this returned expression
|
||||
| |
|
||||
| `'static` requirement introduced here
|
||||
help: consider changing the trait object's explicit `'static` bound to the lifetime of argument `x`
|
||||
|
|
||||
LL | fn explicit4<'a>(x: &'a i32) -> Box<dyn Debug + 'a> { Box::new(x) }
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ error[E0759]: `value` has an anonymous lifetime `'_` but it needs to satisfy a `
|
|||
LL | fn foo<T: Any>(value: &T) -> Box<dyn Any> {
|
||||
| -- this data with an anonymous lifetime `'_`...
|
||||
LL | Box::new(value) as Box<dyn Any>
|
||||
| ^^^^^ ...is captured here, requiring it to live as long as `'static`
|
||||
| ^^^^^ ...is used and required to live as long as `'static` here
|
||||
|
|
||||
help: to declare that the trait object captures data from argument `value`, you can add an explicit `'_` lifetime bound
|
||||
|
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ error[E0759]: `x` has an anonymous lifetime `'_` but it needs to satisfy a `'sta
|
|||
LL | fn foo(x: &u32) -> &'static u32 {
|
||||
| ---- this data with an anonymous lifetime `'_`...
|
||||
LL | &*x
|
||||
| ^^^ ...is captured and required to live as long as `'static` here
|
||||
| ^^^ ...is used and required to live as long as `'static` here
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ error[E0759]: `foo` has an anonymous lifetime `'_` but it needs to satisfy a `'s
|
|||
LL | fn inner(mut foo: &[u8]) {
|
||||
| ----- this data with an anonymous lifetime `'_`...
|
||||
LL | let refcell = RefCell::new(&mut foo);
|
||||
| ^^^^^^^^ ...is captured here...
|
||||
| ^^^^^^^^ ...is used here...
|
||||
...
|
||||
LL | read_thing(read);
|
||||
| ---- ...and is required to live as long as `'static` here
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ error[E0759]: `fn` parameter has lifetime `'a` but it needs to satisfy a `'stati
|
|||
LL | fn foo<'a>(_: &'a u32) -> &'static u32 {
|
||||
| ------- this data with lifetime `'a`...
|
||||
LL | <Foo<'a>>::C
|
||||
| ^^^^^^^^^^^^ ...is captured and required to live as long as `'static` here
|
||||
| ^^^^^^^^^^^^ ...is used and required to live as long as `'static` here
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
|
|
|||
|
|
@ -5,8 +5,16 @@ LL | fn load(ss: &mut SomeStruct) -> Box<dyn SomeTrait> {
|
|||
| --------------- this data with an anonymous lifetime `'_`...
|
||||
...
|
||||
LL | ss.r
|
||||
| ^^^^ ...is captured and required to live as long as `'static` here
|
||||
| ^^^^ ...is used and required to live as long as `'static` here
|
||||
|
|
||||
note: `'static` lifetime requirement introduced by the return type
|
||||
--> $DIR/object-lifetime-default-from-box-error.rs:14:37
|
||||
|
|
||||
LL | fn load(ss: &mut SomeStruct) -> Box<dyn SomeTrait> {
|
||||
| ^^^^^^^^^^^^^ `'static` requirement introduced here
|
||||
...
|
||||
LL | ss.r
|
||||
| ---- because of this returned expression
|
||||
help: to declare that the trait object captures data from argument `ss`, you can add an explicit `'_` lifetime bound
|
||||
|
|
||||
LL | fn load(ss: &mut SomeStruct) -> Box<dyn SomeTrait + '_> {
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ error[E0759]: `v` has an anonymous lifetime `'_` but it needs to satisfy a `'sta
|
|||
LL | fn a(v: &[u8]) -> Box<dyn Foo + 'static> {
|
||||
| ----- this data with an anonymous lifetime `'_`...
|
||||
LL | let x: Box<dyn Foo + 'static> = Box::new(v);
|
||||
| ^ ...is captured here, requiring it to live as long as `'static`
|
||||
| ^ ...is used and required to live as long as `'static` here
|
||||
|
|
||||
help: consider changing the trait object's explicit `'static` bound to the lifetime of argument `v`
|
||||
|
|
||||
|
|
@ -21,8 +21,15 @@ error[E0759]: `v` has an anonymous lifetime `'_` but it needs to satisfy a `'sta
|
|||
LL | fn b(v: &[u8]) -> Box<dyn Foo + 'static> {
|
||||
| ----- this data with an anonymous lifetime `'_`...
|
||||
LL | Box::new(v)
|
||||
| ^ ...is captured here, requiring it to live as long as `'static`
|
||||
| ^ ...is used and required to live as long as `'static` here
|
||||
|
|
||||
note: `'static` lifetime requirement introduced by the return type
|
||||
--> $DIR/region-object-lifetime-in-coercion.rs:12:33
|
||||
|
|
||||
LL | fn b(v: &[u8]) -> Box<dyn Foo + 'static> {
|
||||
| ^^^^^^^ `'static` requirement introduced here
|
||||
LL | Box::new(v)
|
||||
| ----------- because of this returned expression
|
||||
help: consider changing the trait object's explicit `'static` bound to the lifetime of argument `v`
|
||||
|
|
||||
LL | fn b(v: &[u8]) -> Box<dyn Foo + '_> {
|
||||
|
|
@ -39,8 +46,16 @@ LL | fn c(v: &[u8]) -> Box<dyn Foo> {
|
|||
| ----- this data with an anonymous lifetime `'_`...
|
||||
...
|
||||
LL | Box::new(v)
|
||||
| ^ ...is captured here, requiring it to live as long as `'static`
|
||||
| ^ ...is used and required to live as long as `'static` here
|
||||
|
|
||||
note: `'static` lifetime requirement introduced by the return type
|
||||
--> $DIR/region-object-lifetime-in-coercion.rs:16:23
|
||||
|
|
||||
LL | fn c(v: &[u8]) -> Box<dyn Foo> {
|
||||
| ^^^^^^^ `'static` requirement introduced here
|
||||
...
|
||||
LL | Box::new(v)
|
||||
| ----------- because of this returned expression
|
||||
help: to declare that the trait object captures data from argument `v`, you can add an explicit `'_` lifetime bound
|
||||
|
|
||||
LL | fn c(v: &[u8]) -> Box<dyn Foo + '_> {
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ error[E0759]: `self` has an anonymous lifetime `'_` but it needs to satisfy a `'
|
|||
LL | pub fn chase_cat(&mut self) {
|
||||
| --------- this data with an anonymous lifetime `'_`...
|
||||
LL | let p: &'static mut usize = &mut self.cats_chased;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^ ...is captured and required to live as long as `'static` here
|
||||
| ^^^^^^^^^^^^^^^^^^^^^ ...is used and required to live as long as `'static` here
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
|
|
|||
|
|
@ -4,8 +4,15 @@ error[E0759]: `v` has lifetime `'a` but it needs to satisfy a `'static` lifetime
|
|||
LL | fn g<'a, T: 'static>(v: Box<dyn A<T> + 'a>) -> Box<dyn X + 'static> {
|
||||
| ------------------ this data with lifetime `'a`...
|
||||
LL | Box::new(B(&*v)) as Box<dyn X>
|
||||
| ^^^ ...is captured here, requiring it to live as long as `'static`
|
||||
| ^^^ ...is used and required to live as long as `'static` here
|
||||
|
|
||||
note: `'static` lifetime requirement introduced by the return type
|
||||
--> $DIR/regions-close-object-into-object-2.rs:8:60
|
||||
|
|
||||
LL | fn g<'a, T: 'static>(v: Box<dyn A<T> + 'a>) -> Box<dyn X + 'static> {
|
||||
| ^^^^^^^ `'static` requirement introduced here
|
||||
LL | Box::new(B(&*v)) as Box<dyn X>
|
||||
| ------------------------------ because of this returned expression
|
||||
help: consider changing the trait object's explicit `'static` bound to the lifetime of argument `v`
|
||||
|
|
||||
LL | fn g<'a, T: 'static>(v: Box<dyn A<T> + 'a>) -> Box<dyn X + 'a> {
|
||||
|
|
|
|||
|
|
@ -4,8 +4,15 @@ error[E0759]: `v` has lifetime `'a` but it needs to satisfy a `'static` lifetime
|
|||
LL | fn i<'a, T, U>(v: Box<dyn A<U>+'a>) -> Box<dyn X + 'static> {
|
||||
| ---------------- this data with lifetime `'a`...
|
||||
LL | Box::new(B(&*v)) as Box<dyn X>
|
||||
| ^^^ ...is captured here, requiring it to live as long as `'static`
|
||||
| ^^^ ...is used and required to live as long as `'static` here
|
||||
|
|
||||
note: `'static` lifetime requirement introduced by the return type
|
||||
--> $DIR/regions-close-object-into-object-4.rs:8:52
|
||||
|
|
||||
LL | fn i<'a, T, U>(v: Box<dyn A<U>+'a>) -> Box<dyn X + 'static> {
|
||||
| ^^^^^^^ `'static` requirement introduced here
|
||||
LL | Box::new(B(&*v)) as Box<dyn X>
|
||||
| ------------------------------ because of this returned expression
|
||||
help: consider changing the trait object's explicit `'static` bound to the lifetime of argument `v`
|
||||
|
|
||||
LL | fn i<'a, T, U>(v: Box<dyn A<U>+'a>) -> Box<dyn X + 'a> {
|
||||
|
|
|
|||
|
|
@ -5,8 +5,16 @@ LL | fn static_proc(x: &isize) -> Box<dyn FnMut() -> (isize) + 'static> {
|
|||
| ------ this data with an anonymous lifetime `'_`...
|
||||
LL | // This is illegal, because the region bound on `proc` is 'static.
|
||||
LL | Box::new(move || { *x })
|
||||
| ^^^^^^^^^^^^^^ ...is captured here, requiring it to live as long as `'static`
|
||||
| ^^^^^^^^^^^^^^ ...is used and required to live as long as `'static` here
|
||||
|
|
||||
note: `'static` lifetime requirement introduced by the return type
|
||||
--> $DIR/regions-proc-bound-capture.rs:7:59
|
||||
|
|
||||
LL | fn static_proc(x: &isize) -> Box<dyn FnMut() -> (isize) + 'static> {
|
||||
| ^^^^^^^ `'static` requirement introduced here
|
||||
LL | // This is illegal, because the region bound on `proc` is 'static.
|
||||
LL | Box::new(move || { *x })
|
||||
| ------------------------ because of this returned expression
|
||||
help: consider changing the trait object's explicit `'static` bound to the lifetime of argument `x`
|
||||
|
|
||||
LL | fn static_proc(x: &isize) -> Box<dyn FnMut() -> (isize) + '_> {
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ error[E0759]: `u` has an anonymous lifetime `'_` but it needs to satisfy a `'sta
|
|||
LL | fn error(u: &(), v: &()) {
|
||||
| --- this data with an anonymous lifetime `'_`...
|
||||
LL | static_id(&u);
|
||||
| ^^^^^^^^^ -- ...is captured here...
|
||||
| ^^^^^^^^^ -- ...is used here...
|
||||
|
|
||||
note: ...and is required to live as long as `'static` here
|
||||
--> $DIR/regions-static-bound.rs:10:5
|
||||
|
|
@ -32,7 +32,7 @@ LL | fn error(u: &(), v: &()) {
|
|||
| --- this data with an anonymous lifetime `'_`...
|
||||
LL | static_id(&u);
|
||||
LL | static_id_indirect(&v);
|
||||
| ^^^^^^^^^^^^^^^^^^ -- ...is captured here...
|
||||
| ^^^^^^^^^^^^^^^^^^ -- ...is used here...
|
||||
|
|
||||
note: ...and is required to live as long as `'static` here
|
||||
--> $DIR/regions-static-bound.rs:11:5
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ error[E0772]: `val` has lifetime `'a` but calling `use_self` introduces an impli
|
|||
LL | fn use_it<'a>(val: Box<dyn ObjectTrait<Assoc = i32> + 'a>) -> &'a () {
|
||||
| -------------------------------------- this data with lifetime `'a`...
|
||||
LL | val.use_self()
|
||||
| ^^^^^^^^ ...is captured and required to live as long as `'static` here
|
||||
| ^^^^^^^^ ...is used and required to live as long as `'static` here
|
||||
|
|
||||
note: the used `impl` has a `'static` requirement
|
||||
--> $DIR/impl-on-dyn-trait-with-implicit-static-bound-needing-more-suggestions.rs:60:30
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ error[E0759]: `val` has lifetime `'a` but it needs to satisfy a `'static` lifeti
|
|||
LL | fn use_it<'a, T>(val: &'a dyn ObjectTrait<T>) -> impl OtherTrait<'a> + 'a {
|
||||
| ---------------------- this data with lifetime `'a`...
|
||||
LL | val.use_self::<T>()
|
||||
| ^^^^^^^^ ...is captured and required to live as long as `'static` here
|
||||
| ^^^^^^^^ ...is used and required to live as long as `'static` here
|
||||
|
|
||||
note: the used `impl` has a `'static` requirement
|
||||
--> $DIR/impl-on-dyn-trait-with-implicit-static-bound.rs:14:32
|
||||
|
|
@ -24,7 +24,7 @@ error[E0772]: `val` has lifetime `'a` but calling `use_self` introduces an impli
|
|||
LL | fn use_it<'a>(val: &'a dyn ObjectTrait) -> impl OtherTrait<'a> + 'a {
|
||||
| ------------------- this data with lifetime `'a`...
|
||||
LL | val.use_self()
|
||||
| ^^^^^^^^ ...is captured and required to live as long as `'static` here because of an implicit lifetime bound on the inherent `impl`
|
||||
| ^^^^^^^^ ...is used and required to live as long as `'static` here because of an implicit lifetime bound on the inherent `impl`
|
||||
|
|
||||
note: the used `impl` has a `'static` requirement
|
||||
--> $DIR/impl-on-dyn-trait-with-implicit-static-bound.rs:64:14
|
||||
|
|
@ -44,7 +44,7 @@ error[E0759]: `val` has lifetime `'a` but it needs to satisfy a `'static` lifeti
|
|||
LL | fn use_it<'a>(val: &'a dyn ObjectTrait) -> impl OtherTrait<'a> {
|
||||
| ------------------- this data with lifetime `'a`...
|
||||
LL | val.use_self()
|
||||
| ^^^^^^^^ ...is captured and required to live as long as `'static` here
|
||||
| ^^^^^^^^ ...is used and required to live as long as `'static` here
|
||||
|
|
||||
note: the used `impl` has a `'static` requirement
|
||||
--> $DIR/impl-on-dyn-trait-with-implicit-static-bound.rs:85:26
|
||||
|
|
@ -69,7 +69,7 @@ error[E0759]: `val` has lifetime `'a` but it needs to satisfy a `'static` lifeti
|
|||
LL | fn use_it<'a>(val: &'a dyn ObjectTrait) -> impl OtherTrait<'a> + 'a {
|
||||
| ------------------- this data with lifetime `'a`...
|
||||
LL | MyTrait::use_self(val)
|
||||
| ^^^ ...is captured here...
|
||||
| ^^^ ...is used here...
|
||||
|
|
||||
note: ...and is required to live as long as `'static` here
|
||||
--> $DIR/impl-on-dyn-trait-with-implicit-static-bound.rs:108:9
|
||||
|
|
@ -95,7 +95,7 @@ error[E0772]: `val` has lifetime `'a` but calling `use_self` introduces an impli
|
|||
LL | fn use_it<'a>(val: &'a dyn ObjectTrait) -> &'a () {
|
||||
| ------------------- this data with lifetime `'a`...
|
||||
LL | val.use_self()
|
||||
| ^^^^^^^^ ...is captured and required to live as long as `'static` here
|
||||
| ^^^^^^^^ ...is used and required to live as long as `'static` here
|
||||
|
|
||||
note: the used `impl` has a `'static` requirement
|
||||
--> $DIR/impl-on-dyn-trait-with-implicit-static-bound.rs:31:26
|
||||
|
|
@ -115,7 +115,7 @@ error[E0772]: `val` has lifetime `'a` but calling `use_self` introduces an impli
|
|||
LL | fn use_it<'a>(val: &'a Box<dyn ObjectTrait + 'a>) -> &'a () {
|
||||
| ----------------------------- this data with lifetime `'a`...
|
||||
LL | val.use_self()
|
||||
| ^^^^^^^^ ...is captured and required to live as long as `'static` here
|
||||
| ^^^^^^^^ ...is used and required to live as long as `'static` here
|
||||
|
|
||||
note: the used `impl` has a `'static` requirement
|
||||
--> $DIR/impl-on-dyn-trait-with-implicit-static-bound.rs:48:30
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ LL | fn iter(&self) -> impl Iterator<Item = Box<dyn Foo>> {
|
|||
LL | remaining: self.0.iter(),
|
||||
| ------ ^^^^
|
||||
| |
|
||||
| ...is captured here...
|
||||
| ...is used here...
|
||||
|
|
||||
note: ...and is required to live as long as `'static` here
|
||||
--> $DIR/trait-object-nested-in-impl-trait.rs:27:23
|
||||
|
|
@ -32,7 +32,7 @@ LL | fn iter(&self) -> impl Iterator<Item = Box<dyn Foo>> + '_ {
|
|||
LL | remaining: self.0.iter(),
|
||||
| ------ ^^^^
|
||||
| |
|
||||
| ...is captured here...
|
||||
| ...is used here...
|
||||
|
|
||||
note: ...and is required to live as long as `'static` here
|
||||
--> $DIR/trait-object-nested-in-impl-trait.rs:38:23
|
||||
|
|
@ -53,7 +53,7 @@ LL | fn iter<'a>(&'a self) -> impl Iterator<Item = Box<dyn Foo>> + 'a {
|
|||
LL | remaining: self.0.iter(),
|
||||
| ------ ^^^^
|
||||
| |
|
||||
| ...is captured here...
|
||||
| ...is used here...
|
||||
|
|
||||
note: ...and is required to live as long as `'static` here
|
||||
--> $DIR/trait-object-nested-in-impl-trait.rs:49:30
|
||||
|
|
@ -74,7 +74,7 @@ LL | fn iter<'a>(&'a self) -> impl Iterator<Item = Box<dyn Foo>> {
|
|||
LL | remaining: self.0.iter(),
|
||||
| ------ ^^^^
|
||||
| |
|
||||
| ...is captured here...
|
||||
| ...is used here...
|
||||
|
|
||||
note: ...and is required to live as long as `'static` here
|
||||
--> $DIR/trait-object-nested-in-impl-trait.rs:60:30
|
||||
|
|
|
|||
|
|
@ -29,4 +29,22 @@ fn test_wrong3<'a>(x: &dyn Foo<'a>) -> Option<&'static u32> {
|
|||
y.get_b() // ERROR
|
||||
}
|
||||
|
||||
fn test_wrong4<'a>(x: &dyn Foo<'a>) -> Option<&'static u32> {
|
||||
<_ as Bar>::get_b(x) // ERROR
|
||||
//~^ ERROR `x` has lifetime `'a` but it needs to satisfy a `'static` lifetime requirement
|
||||
}
|
||||
|
||||
fn test_wrong5<'a>(x: &dyn Foo<'a>) -> Option<&'static u32> {
|
||||
<_ as Bar<'_, '_>>::get_b(x) // ERROR
|
||||
//~^ ERROR `x` has lifetime `'a` but it needs to satisfy a `'static` lifetime requirement
|
||||
}
|
||||
|
||||
fn test_wrong6<'a>(x: &dyn Foo<'a>) -> Option<&'static u32> {
|
||||
let y = x as &dyn Bar<'_, '_>;
|
||||
//~^ ERROR `x` has lifetime `'a` but it needs to satisfy a `'static` lifetime requirement
|
||||
y.get_b(); // ERROR
|
||||
let z = y;
|
||||
z.get_b() // ERROR
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
|
|
|||
|
|
@ -36,12 +36,88 @@ LL | fn test_wrong3<'a>(x: &dyn Foo<'a>) -> Option<&'static u32> {
|
|||
LL | let y = x as &dyn Bar<'_, '_>;
|
||||
| - ^^
|
||||
| |
|
||||
| ...is captured here...
|
||||
| ...is used here...
|
||||
LL |
|
||||
LL | y.get_b() // ERROR
|
||||
| --------- ...and is required to live as long as `'static` here
|
||||
| - ...is used here...
|
||||
|
|
||||
note: ...and is required to live as long as `'static` here
|
||||
--> $DIR/type-checking-test-4.rs:29:5
|
||||
|
|
||||
LL | y.get_b() // ERROR
|
||||
| ^^^^^^^^^
|
||||
note: `'static` lifetime requirement introduced by the return type
|
||||
--> $DIR/type-checking-test-4.rs:26:48
|
||||
|
|
||||
LL | fn test_wrong3<'a>(x: &dyn Foo<'a>) -> Option<&'static u32> {
|
||||
| ^^^^^^^ `'static` requirement introduced here
|
||||
...
|
||||
LL | y.get_b() // ERROR
|
||||
| --------- because of this returned expression
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
error[E0759]: `x` has lifetime `'a` but it needs to satisfy a `'static` lifetime requirement
|
||||
--> $DIR/type-checking-test-4.rs:33:5
|
||||
|
|
||||
LL | fn test_wrong4<'a>(x: &dyn Foo<'a>) -> Option<&'static u32> {
|
||||
| ------------ this data with lifetime `'a`...
|
||||
LL | <_ as Bar>::get_b(x) // ERROR
|
||||
| ^^^^^^^^^^^^^^^^^ ...is used and required to live as long as `'static` here
|
||||
|
|
||||
note: `'static` lifetime requirement introduced by the return type
|
||||
--> $DIR/type-checking-test-4.rs:32:48
|
||||
|
|
||||
LL | fn test_wrong4<'a>(x: &dyn Foo<'a>) -> Option<&'static u32> {
|
||||
| ^^^^^^^ `'static` requirement introduced here
|
||||
LL | <_ as Bar>::get_b(x) // ERROR
|
||||
| -------------------- because of this returned expression
|
||||
|
||||
error[E0759]: `x` has lifetime `'a` but it needs to satisfy a `'static` lifetime requirement
|
||||
--> $DIR/type-checking-test-4.rs:38:15
|
||||
|
|
||||
LL | fn test_wrong5<'a>(x: &dyn Foo<'a>) -> Option<&'static u32> {
|
||||
| ------------ this data with lifetime `'a`...
|
||||
LL | <_ as Bar<'_, '_>>::get_b(x) // ERROR
|
||||
| ----------^^------------- ...is used and required to live as long as `'static` here
|
||||
|
|
||||
note: `'static` lifetime requirement introduced by the return type
|
||||
--> $DIR/type-checking-test-4.rs:37:48
|
||||
|
|
||||
LL | fn test_wrong5<'a>(x: &dyn Foo<'a>) -> Option<&'static u32> {
|
||||
| ^^^^^^^ `'static` requirement introduced here
|
||||
LL | <_ as Bar<'_, '_>>::get_b(x) // ERROR
|
||||
| ---------------------------- because of this returned expression
|
||||
|
||||
error[E0759]: `x` has lifetime `'a` but it needs to satisfy a `'static` lifetime requirement
|
||||
--> $DIR/type-checking-test-4.rs:43:27
|
||||
|
|
||||
LL | fn test_wrong6<'a>(x: &dyn Foo<'a>) -> Option<&'static u32> {
|
||||
| ------------ this data with lifetime `'a`...
|
||||
LL | let y = x as &dyn Bar<'_, '_>;
|
||||
| - ^^
|
||||
| |
|
||||
| ...is used here...
|
||||
LL |
|
||||
LL | y.get_b(); // ERROR
|
||||
| - ...is used here...
|
||||
LL | let z = y;
|
||||
LL | z.get_b() // ERROR
|
||||
| - ...is used here...
|
||||
|
|
||||
note: ...and is required to live as long as `'static` here
|
||||
--> $DIR/type-checking-test-4.rs:47:5
|
||||
|
|
||||
LL | z.get_b() // ERROR
|
||||
| ^^^^^^^^^
|
||||
note: `'static` lifetime requirement introduced by the return type
|
||||
--> $DIR/type-checking-test-4.rs:42:48
|
||||
|
|
||||
LL | fn test_wrong6<'a>(x: &dyn Foo<'a>) -> Option<&'static u32> {
|
||||
| ^^^^^^^ `'static` requirement introduced here
|
||||
...
|
||||
LL | z.get_b() // ERROR
|
||||
| --------- because of this returned expression
|
||||
|
||||
error: aborting due to 6 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0308, E0759.
|
||||
For more information about an error, try `rustc --explain E0308`.
|
||||
|
|
|
|||
|
|
@ -5,8 +5,18 @@ LL | fn a<T>(items: &[T]) -> Box<dyn Iterator<Item=&T>> {
|
|||
| ---- this data with an anonymous lifetime `'_`...
|
||||
LL | // ^^^^^^^^^^^^^^^^^^^^^ bound *here* defaults to `'static`
|
||||
LL | Box::new(items.iter())
|
||||
| ---------------^^^^--- ...is captured and required to live as long as `'static` here
|
||||
| ----- ^^^^
|
||||
| |
|
||||
| ...is used and required to live as long as `'static` here
|
||||
|
|
||||
note: `'static` lifetime requirement introduced by the return type
|
||||
--> $DIR/dyn-trait-underscore.rs:6:29
|
||||
|
|
||||
LL | fn a<T>(items: &[T]) -> Box<dyn Iterator<Item=&T>> {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^ `'static` requirement introduced here
|
||||
LL | // ^^^^^^^^^^^^^^^^^^^^^ bound *here* defaults to `'static`
|
||||
LL | Box::new(items.iter())
|
||||
| ---------------------- because of this returned expression
|
||||
help: to declare that the trait object captures data from argument `items`, you can add an explicit `'_` lifetime bound
|
||||
|
|
||||
LL | fn a<T>(items: &[T]) -> Box<dyn Iterator<Item=&T> + '_> {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue