Skip to content

Commit

Permalink
macros: fix wrong error messages (#4067)
Browse files Browse the repository at this point in the history
  • Loading branch information
c0va23 authored and hawkw committed Nov 16, 2021
1 parent cc7d9e1 commit 441427c
Show file tree
Hide file tree
Showing 7 changed files with 56 additions and 38 deletions.
14 changes: 0 additions & 14 deletions tests-build/tests/fail/macros_type_mismatch.rs
Expand Up @@ -7,25 +7,11 @@ async fn missing_semicolon_or_return_type() {

#[tokio::main]
async fn missing_return_type() {
/* TODO(taiki-e): one of help messages still wrong
help: consider using a semicolon here
|
16 | return Ok(());;
|
*/
return Ok(());
}

#[tokio::main]
async fn extra_semicolon() -> Result<(), ()> {
/* TODO(taiki-e): help message still wrong
help: try using a variant of the expected enum
|
29 | Ok(Ok(());)
|
29 | Err(Ok(());)
|
*/
Ok(());
}

Expand Down
31 changes: 9 additions & 22 deletions tests-build/tests/fail/macros_type_mismatch.stderr
Expand Up @@ -16,36 +16,23 @@ help: try adding a return type
| ^^^^^^^^^^^^^^^^

error[E0308]: mismatched types
--> $DIR/macros_type_mismatch.rs:16:5
--> $DIR/macros_type_mismatch.rs:10:5
|
16 | return Ok(());
9 | async fn missing_return_type() {
| - help: try adding a return type: `-> Result<(), _>`
10 | return Ok(());
| ^^^^^^^^^^^^^^ expected `()`, found enum `Result`
|
= note: expected unit type `()`
found enum `Result<(), _>`
help: consider using a semicolon here
|
16 | return Ok(());;
| ^
help: try adding a return type
|
9 | async fn missing_return_type() -> Result<(), _> {
| ^^^^^^^^^^^^^^^^

error[E0308]: mismatched types
--> $DIR/macros_type_mismatch.rs:29:5
--> $DIR/macros_type_mismatch.rs:14:31
|
20 | async fn extra_semicolon() -> Result<(), ()> {
| -------------- expected `Result<(), ()>` because of return type
...
29 | Ok(());
| ^^^^^^^ expected enum `Result`, found `()`
14 | async fn extra_semicolon() -> Result<(), ()> {
| --------------- ^^^^^^^^^^^^^^ expected enum `Result`, found `()`
| |
| implicitly returns `()` as its body has no tail or `return` expression
|
= note: expected enum `Result<(), ()>`
found unit type `()`
help: try using a variant of the expected enum
|
29 | Ok(Ok(());)
|
29 | Err(Ok(());)
|
6 changes: 6 additions & 0 deletions tests-build/tests/macros.rs
Expand Up @@ -5,6 +5,12 @@ fn compile_fail_full() {
#[cfg(feature = "full")]
t.pass("tests/pass/forward_args_and_output.rs");

#[cfg(feature = "full")]
t.pass("tests/pass/macros_main_return.rs");

#[cfg(feature = "full")]
t.pass("tests/pass/macros_main_loop.rs");

#[cfg(feature = "full")]
t.compile_fail("tests/fail/macros_invalid_input.rs");

Expand Down
7 changes: 7 additions & 0 deletions tests-build/tests/macros_clippy.rs
@@ -0,0 +1,7 @@
#[cfg(feature = "full")]
#[tokio::test]
async fn test_with_semicolon_without_return_type() {
#![deny(clippy::semicolon_if_nothing_returned)]

dbg!(0);
}
14 changes: 14 additions & 0 deletions tests-build/tests/pass/macros_main_loop.rs
@@ -0,0 +1,14 @@
use tests_build::tokio;

#[tokio::main]
async fn main() -> Result<(), ()> {
loop {
if !never() {
return Ok(());
}
}
}

fn never() -> bool {
std::time::Instant::now() > std::time::Instant::now()
}
6 changes: 6 additions & 0 deletions tests-build/tests/pass/macros_main_return.rs
@@ -0,0 +1,6 @@
use tests_build::tokio;

#[tokio::main]
async fn main() -> Result<(), ()> {
return Ok(());
}
16 changes: 14 additions & 2 deletions tokio-macros/src/entry.rs
Expand Up @@ -323,15 +323,27 @@ fn parse_knobs(

let body = &input.block;
let brace_token = input.block.brace_token;
let (tail_return, tail_semicolon) = match body.stmts.last() {
Some(syn::Stmt::Semi(expr, _)) => (
match expr {
syn::Expr::Return(_) => quote! { return },
_ => quote! {},
},
quote! {
;
},
),
_ => (quote! {}, quote! {}),
};
input.block = syn::parse2(quote_spanned! {last_stmt_end_span=>
{
let body = async #body;
#[allow(clippy::expect_used)]
#rt
#tail_return #rt
.enable_all()
.build()
.expect("Failed building the Runtime")
.block_on(body)
.block_on(body)#tail_semicolon
}
})
.expect("Parsing failure");
Expand Down

0 comments on commit 441427c

Please sign in to comment.