
Previously, async constructs would be lowered to "normal" generators, with an additional `from_generator` / `GenFuture` shim in between to convert from `Generator` to `Future`. The compiler will now special-case these generators internally so that async constructs will *directly* implement `Future` without the need to go through the `from_generator` / `GenFuture` shim. The primary motivation for this change was hiding this implementation detail in stack traces and debuginfo, but it can in theory also help the optimizer as there is less abstractions to see through.
81 lines
3.1 KiB
Text
81 lines
3.1 KiB
Text
error[E0267]: `break` inside of an `async` block
|
|
--> $DIR/async-block-control-flow-static-semantics.rs:32:9
|
|
|
|
|
LL | / async {
|
|
LL | | break 0u8;
|
|
| | ^^^^^^^^^ cannot `break` inside of an `async` block
|
|
LL | | };
|
|
| |_____- enclosing `async` block
|
|
|
|
error[E0267]: `break` inside of an `async` block
|
|
--> $DIR/async-block-control-flow-static-semantics.rs:39:13
|
|
|
|
|
LL | / async {
|
|
LL | | break 0u8;
|
|
| | ^^^^^^^^^ cannot `break` inside of an `async` block
|
|
LL | | };
|
|
| |_________- enclosing `async` block
|
|
|
|
error[E0308]: mismatched types
|
|
--> $DIR/async-block-control-flow-static-semantics.rs:21:58
|
|
|
|
|
LL | async fn return_targets_async_block_not_async_fn() -> u8 {
|
|
| __________________________________________________________^
|
|
LL | |
|
|
LL | | let block = async {
|
|
LL | | return 0u8;
|
|
... |
|
|
LL | |
|
|
LL | | }
|
|
| |_^ expected `u8`, found `()`
|
|
|
|
error[E0271]: expected `impl Future<Output = u8>` to be a future that resolves to `()`, but it resolves to `u8`
|
|
--> $DIR/async-block-control-flow-static-semantics.rs:26:39
|
|
|
|
|
LL | let _: &dyn Future<Output = ()> = █
|
|
| ^^^^^^ expected `()`, found `u8`
|
|
|
|
|
= note: required for the cast from `impl Future<Output = u8>` to the object type `dyn Future<Output = ()>`
|
|
|
|
error[E0308]: mismatched types
|
|
--> $DIR/async-block-control-flow-static-semantics.rs:12:43
|
|
|
|
|
LL | fn return_targets_async_block_not_fn() -> u8 {
|
|
| --------------------------------- ^^ expected `u8`, found `()`
|
|
| |
|
|
| implicitly returns `()` as its body has no tail or `return` expression
|
|
|
|
error[E0271]: expected `impl Future<Output = u8>` to be a future that resolves to `()`, but it resolves to `u8`
|
|
--> $DIR/async-block-control-flow-static-semantics.rs:17:39
|
|
|
|
|
LL | let _: &dyn Future<Output = ()> = █
|
|
| ^^^^^^ expected `()`, found `u8`
|
|
|
|
|
= note: required for the cast from `impl Future<Output = u8>` to the object type `dyn Future<Output = ()>`
|
|
|
|
error[E0308]: mismatched types
|
|
--> $DIR/async-block-control-flow-static-semantics.rs:49:44
|
|
|
|
|
LL | fn rethrow_targets_async_block_not_fn() -> Result<u8, MyErr> {
|
|
| ---------------------------------- ^^^^^^^^^^^^^^^^^ expected enum `Result`, found `()`
|
|
| |
|
|
| implicitly returns `()` as its body has no tail or `return` expression
|
|
|
|
|
= note: expected enum `Result<u8, MyErr>`
|
|
found unit type `()`
|
|
|
|
error[E0308]: mismatched types
|
|
--> $DIR/async-block-control-flow-static-semantics.rs:58:50
|
|
|
|
|
LL | fn rethrow_targets_async_block_not_async_fn() -> Result<u8, MyErr> {
|
|
| ---------------------------------------- ^^^^^^^^^^^^^^^^^ expected enum `Result`, found `()`
|
|
| |
|
|
| implicitly returns `()` as its body has no tail or `return` expression
|
|
|
|
|
= note: expected enum `Result<u8, MyErr>`
|
|
found unit type `()`
|
|
|
|
error: aborting due to 8 previous errors
|
|
|
|
Some errors have detailed explanations: E0267, E0271, E0308.
|
|
For more information about an error, try `rustc --explain E0267`.
|