Skip to content

Commit

Permalink
Rollup merge of rust-lang#94449 - GuillaumeGomez:explanation-e0726, r…
Browse files Browse the repository at this point in the history
…=Urgau

Add long explanation for E0726

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

Part of rust-lang#61137.

r? `@Urgau`
  • Loading branch information
matthiaskrgr authored Feb 28, 2022
2 parents 5be38d2 + 8f36d4a commit 34657cc
Show file tree
Hide file tree
Showing 7 changed files with 53 additions and 2 deletions.
2 changes: 1 addition & 1 deletion compiler/rustc_error_codes/src/error_codes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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"),
Expand Down Expand Up @@ -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" { ... }`.
}
46 changes: 46 additions & 0 deletions compiler/rustc_error_codes/src/error_codes/E0726.md
Original file line number Diff line number Diff line change
@@ -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
1 change: 1 addition & 0 deletions src/test/ui/async-await/async-fn-path-elision.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -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`.
Original file line number Diff line number Diff line change
Expand Up @@ -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`.
Original file line number Diff line number Diff line change
Expand Up @@ -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`.
3 changes: 2 additions & 1 deletion src/test/ui/issues/issue-10412.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -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`.
1 change: 1 addition & 0 deletions src/test/ui/wf/wf-in-foreign-fn-decls-issue-80468.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -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`.

0 comments on commit 34657cc

Please sign in to comment.