Commit d770695
committed
Improve diagnostics for mismatched type in
Previously, we wrapped the body of the `async main` function in an
`async` block, which we passed to `block_on`. However, `block_on` is
generic, so an incorrect return type ends up creating a diagnostic
pointing a `block_on`, not the user's code. Since the call to `block_on`
is generated by the `#[tokio::main]` macro, it ended up with a span of
the `#[tokio::main]` attribute, producing a confusing diagnostic.
We now wrap the body of the `async main` function in a new
`async main_inner` function. This asserts a return type of `()` earlier
on, producing a diagnostic.
Given this code:
```rust
#[tokio::main]
async fn main() {
Ok(())
}
```
We currently produce the error:
```
error[E0308]: mismatched types
--> src/main.rs:1:1
|
1 | #[tokio::main]
| ^^^^^^^^^^^^^^- help: try adding a semicolon: `;`
| |
| expected `()`, found enum `std::result::Result`
|
= note: expected unit type `()`
found enum `std::result::Result<(), _>`
= note: this error originates in an attribute macro (in Nightly builds, run with -Z macro-backtrace for more info)
```
With this PR, we produce:
```
error[E0308]: mismatched types
--> src/main.rs:3:5
|
3 | Ok(())
| ^^^^^^- help: try adding a semicolon: `;`
| |
| expected `()`, found enum `std::result::Result`
|
= note: expected unit type `()`
found enum `std::result::Result<(), _>`
```async main
1 parent ce173fd commit d770695
1 file changed
Lines changed: 5 additions & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
244 | 244 | | |
245 | 245 | | |
246 | 246 | | |
| 247 | + | |
| 248 | + | |
| 249 | + | |
| 250 | + | |
247 | 251 | | |
248 | 252 | | |
249 | 253 | | |
250 | 254 | | |
251 | | - | |
| 255 | + | |
252 | 256 | | |
253 | 257 | | |
254 | 258 | | |
| |||
0 commit comments