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.
Auto merge of rust-lang#66571 - Centril:rollup-41tn2fw, r=Centril
Rollup of 8 pull requests Successful merges: - rust-lang#65665 (Update Source Code Pro and include italics) - rust-lang#66478 (rustc_plugin: Remove the compatibility shim) - rust-lang#66497 (Fix rust-lang#53820) - rust-lang#66526 (Add more context to `async fn` trait error) - rust-lang#66532 (Generate DWARF address ranges for faster lookups) - rust-lang#66546 (Remove duplicate function) - rust-lang#66548 ([RISCV] Disable Atomics on all Non-A RISC-V targets) - rust-lang#66553 (remove HermitCore leftovers from sys/unix) Failed merges: r? @ghost
- Loading branch information
Showing
38 changed files
with
426 additions
and
203 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
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
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,57 @@ | ||
`async fn`s are not yet supported in traits in Rust. | ||
|
||
Erroneous code example: | ||
|
||
```compile_fail,edition2018 | ||
trait T { | ||
// Neither case is currently supported. | ||
async fn foo() {} | ||
async fn bar(&self) {} | ||
} | ||
``` | ||
|
||
`async fn`s return an `impl Future`, making the following two examples equivalent: | ||
|
||
```edition2018,ignore (example-of-desugaring-equivalence) | ||
async fn foo() -> User { | ||
unimplemented!() | ||
} | ||
// The async fn above gets desugared as follows: | ||
fn foo(&self) -> impl Future<Output = User> + '_ { | ||
unimplemented!() | ||
} | ||
``` | ||
|
||
But when it comes to supporting this in traits, there are [a few implementation | ||
issues][async-is-hard]. One of them is returning `impl Trait` in traits is not supported, | ||
as it would require [Generic Associated Types] to be supported: | ||
|
||
```edition2018,ignore (example-of-desugaring-equivalence) | ||
impl MyDatabase { | ||
async fn get_user(&self) -> User { | ||
unimplemented!() | ||
} | ||
} | ||
impl MyDatabase { | ||
fn get_user(&self) -> impl Future<Output = User> + '_ { | ||
unimplemented!() | ||
} | ||
} | ||
``` | ||
|
||
Until these issues are resolved, you can use the [`async-trait` crate], allowing you to use | ||
`async fn` in traits by desugaring to "boxed futures" | ||
(`Pin<Box<dyn Future + Send + 'async>>`). | ||
|
||
Note that using these trait methods will result in a heap allocation per-function-call. This is not | ||
a significant cost for the vast majority of applications, but should be considered when deciding | ||
whether to use this functionality in the public API of a low-level function that is expected to be | ||
called millions of times a second. | ||
|
||
You might be interested in visiting the [async book] for further information. | ||
|
||
[`async-trait` crate]: https://crates.io/crates/async-trait | ||
[async-is-hard]: https://smallcultfollowing.com/babysteps/blog/2019/10/26/async-fn-in-traits-are-hard/ | ||
[Generic Associated Types]: https://github.com/rust-lang/rust/issues/44265 | ||
[async book]: https://rust-lang.github.io/async-book/07_workarounds/06_async_in_traits.html |
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
Oops, something went wrong.