Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve diagnostics for mismatched type in async main #3039

Closed
wants to merge 1 commit into from

Commits on Oct 24, 2020

  1. Improve diagnostics for mismatched type in async main

    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
    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<(), _>`
    ```
    Aaron1011 committed Oct 24, 2020
    Configuration menu
    Copy the full SHA
    8b060aa View commit details
    Browse the repository at this point in the history