Rollup merge of #94449 - GuillaumeGomez:explanation-e0726, r=Urgau

Add long explanation for E0726

This is the cleaned up version of #87655 with the missing fixes.

Part of https://github.com/rust-lang/rust/issues/61137.

r? `@Urgau`
This commit is contained in:
Matthias Krüger 2022-02-28 20:05:18 +01:00 committed by GitHub
commit 34657ccbe7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 53 additions and 2 deletions

View file

@ -429,6 +429,7 @@ E0720: include_str!("./error_codes/E0720.md"),
E0722: include_str!("./error_codes/E0722.md"),
E0724: include_str!("./error_codes/E0724.md"),
E0725: include_str!("./error_codes/E0725.md"),
E0726: include_str!("./error_codes/E0726.md"),
E0727: include_str!("./error_codes/E0727.md"),
E0728: include_str!("./error_codes/E0728.md"),
E0729: include_str!("./error_codes/E0729.md"),
@ -641,6 +642,5 @@ E0787: include_str!("./error_codes/E0787.md"),
E0717, // rustc_promotable without stability attribute
// E0721, // `await` keyword
// E0723, // unstable feature in `const` context
E0726, // non-explicit (not `'_`) elided lifetime in unsupported position
// E0738, // Removed; errored on `#[track_caller] fn`s in `extern "Rust" { ... }`.
}

View file

@ -0,0 +1,46 @@
An argument lifetime was elided in an async function.
Erroneous code example:
When a struct or a type is bound/declared with a lifetime it is important for
the Rust compiler to know, on usage, the lifespan of the type. When the
lifetime is not explicitly mentioned and the Rust Compiler cannot determine
the lifetime of your type, the following error occurs.
```compile_fail,E0726
use futures::executor::block_on;
struct Content<'a> {
title: &'a str,
body: &'a str,
}
async fn create(content: Content) { // error: implicit elided
// lifetime not allowed here
println!("title: {}", content.title);
println!("body: {}", content.body);
}
let content = Content { title: "Rust", body: "is great!" };
let future = create(content);
block_on(future);
```
Specify desired lifetime of parameter `content` or indicate the anonymous
lifetime like `content: Content<'_>`. The anonymous lifetime tells the Rust
compiler that `content` is only needed until create function is done with
it's execution.
The `implicit elision` meaning the omission of suggested lifetime that is
`pub async fn create<'a>(content: Content<'a>) {}` is not allowed here as
lifetime of the `content` can differ from current context:
```ignore (needs futures dependency)
async fn create(content: Content<'_>) { // ok!
println!("title: {}", content.title);
println!("body: {}", content.body);
}
```
Know more about lifetime elision in this [chapter][lifetime-elision] and a
chapter on lifetimes can be found [here][lifetimes].
[lifetime-elision]: https://doc.rust-lang.org/book/ch10-03-lifetime-syntax.html#lifetime-elision
[lifetimes]: https://doc.rust-lang.org/rust-by-example/scope/lifetime.html

View file

@ -8,3 +8,4 @@ LL | async fn error(lt: HasLifetime) {
error: aborting due to previous error
For more information about this error, try `rustc --explain E0726`.

View file

@ -8,3 +8,4 @@ LL | impl MyTrait for Foo {
error: aborting due to previous error
For more information about this error, try `rustc --explain E0726`.

View file

@ -8,3 +8,4 @@ LL | impl MyTrait for u32 {
error: aborting due to previous error
For more information about this error, try `rustc --explain E0726`.

View file

@ -67,4 +67,5 @@ LL | trait Serializable<'self, T: ?Sized> {
error: aborting due to 9 previous errors
For more information about this error, try `rustc --explain E0277`.
Some errors have detailed explanations: E0277, E0726.
For more information about an error, try `rustc --explain E0277`.

View file

@ -30,3 +30,4 @@ LL | impl Trait for Ref {}
error: aborting due to 2 previous errors
For more information about this error, try `rustc --explain E0726`.