forked from rust-lang/rust
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Rollup merge of rust-lang#72804 - estebank:opaque-missing-lts-in-fn-2…
…, r=nikomatsakis Further tweak lifetime errors involving `dyn Trait` and `impl Trait` in return position * Suggest substituting `'static` lifetime in impl/dyn `Trait + 'static` instead of `Trait + 'static + '_` * When `'static` is explicit, also suggest constraining argument with it * Reduce verbosity of suggestion message and mention lifetime in label * Tweak output for overlapping required/captured spans * Give these errors an error code Follow up to rust-lang#72543. r? @nikomatsakis
- Loading branch information
Showing
25 changed files
with
611 additions
and
205 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
A `'static` requirement in a return type involving a trait is not fulfilled. | ||
|
||
Erroneous code examples: | ||
|
||
```compile_fail,E0759 | ||
use std::fmt::Debug; | ||
fn foo(x: &i32) -> impl Debug { | ||
x | ||
} | ||
``` | ||
|
||
```compile_fail,E0759 | ||
# use std::fmt::Debug; | ||
fn bar(x: &i32) -> Box<dyn Debug> { | ||
Box::new(x) | ||
} | ||
``` | ||
|
||
These examples have the same semantics as the following: | ||
|
||
```compile_fail,E0759 | ||
# use std::fmt::Debug; | ||
fn foo(x: &i32) -> impl Debug + 'static { | ||
x | ||
} | ||
``` | ||
|
||
```compile_fail,E0759 | ||
# use std::fmt::Debug; | ||
fn bar(x: &i32) -> Box<dyn Debug + 'static> { | ||
Box::new(x) | ||
} | ||
``` | ||
|
||
Both [`dyn Trait`] and [`impl Trait`] in return types have a an implicit | ||
`'static` requirement, meaning that the value implementing them that is being | ||
returned has to be either a `'static` borrow or an owned value. | ||
|
||
In order to change the requirement from `'static` to be a lifetime derived from | ||
its arguments, you can add an explicit bound, either to an anonymous lifetime | ||
`'_` or some appropriate named lifetime. | ||
|
||
``` | ||
# use std::fmt::Debug; | ||
fn foo(x: &i32) -> impl Debug + '_ { | ||
x | ||
} | ||
fn bar(x: &i32) -> Box<dyn Debug + '_> { | ||
Box::new(x) | ||
} | ||
``` | ||
|
||
These are equivalent to the following explicit lifetime annotations: | ||
|
||
``` | ||
# use std::fmt::Debug; | ||
fn foo<'a>(x: &'a i32) -> impl Debug + 'a { | ||
x | ||
} | ||
fn bar<'a>(x: &'a i32) -> Box<dyn Debug + 'a> { | ||
Box::new(x) | ||
} | ||
``` | ||
|
||
[`dyn Trait`]: https://doc.rust-lang.org/book/ch17-02-trait-objects.html#using-trait-objects-that-allow-for-values-of-different-types | ||
[`impl Trait`]: https://doc.rust-lang.org/book/ch10-02-traits.html#returning-types-that-implement-traits |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,13 +1,14 @@ | ||
error: cannot infer an appropriate lifetime | ||
error[E0759]: cannot infer an appropriate lifetime | ||
--> $DIR/issue-62097.rs:12:31 | ||
| | ||
LL | pub async fn run_dummy_fn(&self) { | ||
| ^^^^^ | ||
| | | ||
| data with this lifetime... | ||
| this data with an anonymous lifetime `'_`... | ||
| ...is captured here... | ||
LL | foo(|| self.bar()).await; | ||
| --- ...and required to be `'static` by this | ||
| --- ...and is required to live as long as `'static` here | ||
|
||
error: aborting due to previous error | ||
|
||
For more information about this error, try `rustc --explain E0759`. |
Oops, something went wrong.