Better message for invalid keyword placement in fn
After this commit, `unsafe async fn ...` now suggests the `async unsafe` fix instead of misunderstanding the issue. This is not perfect for repeated keywords (`const async const`) and for keywords that are misplaced after `extern "some abi"` because of the way `check_fn_font_matter` works, but changing it breaks so many tests and diagnostics it has been judged too high a cost for this PR.
This commit is contained in:
parent
f381e77d35
commit
690cbb79b3
13 changed files with 184 additions and 4 deletions
|
|
@ -2,7 +2,12 @@ error: expected one of `extern`, `fn`, or `unsafe`, found keyword `const`
|
|||
--> $DIR/no-async-const.rs:4:11
|
||||
|
|
||||
LL | pub async const fn x() {}
|
||||
| ^^^^^ expected one of `extern`, `fn`, or `unsafe`
|
||||
| ------^^^^^
|
||||
| | |
|
||||
| | expected one of `extern`, `fn`, or `unsafe`
|
||||
| help: `const` must come before `async`: `const async`
|
||||
|
|
||||
= note: keyword order for functions declaration is `default`, `pub`, `const`, `async`, `unsafe`, `extern`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
|
|
|||
|
|
@ -5,15 +5,25 @@ LL | impl S {
|
|||
| - while parsing this item list starting here
|
||||
LL | #[cfg(FALSE)]
|
||||
LL | unsafe async fn g() {}
|
||||
| ^^^^^ expected one of `extern` or `fn`
|
||||
| -------^^^^^
|
||||
| | |
|
||||
| | expected one of `extern` or `fn`
|
||||
| help: `async` must come before `unsafe`: `async unsafe`
|
||||
LL | }
|
||||
| - the item list ends here
|
||||
|
|
||||
= note: keyword order for functions declaration is `default`, `pub`, `const`, `async`, `unsafe`, `extern`
|
||||
|
||||
error: expected one of `extern` or `fn`, found keyword `async`
|
||||
--> $DIR/no-unsafe-async.rs:11:8
|
||||
|
|
||||
LL | unsafe async fn f() {}
|
||||
| ^^^^^ expected one of `extern` or `fn`
|
||||
| -------^^^^^
|
||||
| | |
|
||||
| | expected one of `extern` or `fn`
|
||||
| help: `async` must come before `unsafe`: `async unsafe`
|
||||
|
|
||||
= note: keyword order for functions declaration is `default`, `pub`, `const`, `async`, `unsafe`, `extern`
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,11 @@
|
|||
// edition:2018
|
||||
|
||||
// Test that even when `const` is already present, the proposed fix is `const const async`,
|
||||
// like for `pub pub`.
|
||||
|
||||
const async const fn test() {}
|
||||
//~^ ERROR expected one of `extern`, `fn`, or `unsafe`, found keyword `const`
|
||||
//~| NOTE expected one of `extern`, `fn`, or `unsafe`
|
||||
//~| HELP `const` must come before `async`
|
||||
//~| SUGGESTION const async
|
||||
//~| NOTE keyword order for functions declaration is `default`, `pub`, `const`, `async`, `unsafe`, `extern`
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
error: expected one of `extern`, `fn`, or `unsafe`, found keyword `const`
|
||||
--> $DIR/const-async-const.rs:6:13
|
||||
|
|
||||
LL | const async const fn test() {}
|
||||
| ------^^^^^
|
||||
| | |
|
||||
| | expected one of `extern`, `fn`, or `unsafe`
|
||||
| help: `const` must come before `async`: `const async`
|
||||
|
|
||||
= note: keyword order for functions declaration is `default`, `pub`, `const`, `async`, `unsafe`, `extern`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
// edition:2018
|
||||
|
||||
// There is an order to respect for keywords before a function:
|
||||
// `<visibility>, const, async, unsafe, extern, "<ABI>"`
|
||||
//
|
||||
// This test ensures the compiler is helpful about them being misplaced.
|
||||
// Visibilities are tested elsewhere.
|
||||
|
||||
async unsafe const fn test() {}
|
||||
//~^ ERROR expected one of `extern` or `fn`, found keyword `const`
|
||||
//~| NOTE expected one of `extern` or `fn`
|
||||
//~| HELP `const` must come before `async unsafe`
|
||||
//~| SUGGESTION const async unsafe
|
||||
//~| NOTE keyword order for functions declaration is `default`, `pub`, `const`, `async`, `unsafe`, `extern`
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
error: expected one of `extern` or `fn`, found keyword `const`
|
||||
--> $DIR/several-kw-jump.rs:9:14
|
||||
|
|
||||
LL | async unsafe const fn test() {}
|
||||
| -------------^^^^^
|
||||
| | |
|
||||
| | expected one of `extern` or `fn`
|
||||
| help: `const` must come before `async unsafe`: `const async unsafe`
|
||||
|
|
||||
= note: keyword order for functions declaration is `default`, `pub`, `const`, `async`, `unsafe`, `extern`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
14
src/test/ui/parser/issue-87217-keyword-order/wrong-async.rs
Normal file
14
src/test/ui/parser/issue-87217-keyword-order/wrong-async.rs
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
// edition:2018
|
||||
|
||||
// There is an order to respect for keywords before a function:
|
||||
// `<visibility>, const, async, unsafe, extern, "<ABI>"`
|
||||
//
|
||||
// This test ensures the compiler is helpful about them being misplaced.
|
||||
// Visibilities are tested elsewhere.
|
||||
|
||||
unsafe async fn test() {}
|
||||
//~^ ERROR expected one of `extern` or `fn`, found keyword `async`
|
||||
//~| NOTE expected one of `extern` or `fn`
|
||||
//~| HELP `async` must come before `unsafe`
|
||||
//~| SUGGESTION async unsafe
|
||||
//~| NOTE keyword order for functions declaration is `default`, `pub`, `const`, `async`, `unsafe`, `extern`
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
error: expected one of `extern` or `fn`, found keyword `async`
|
||||
--> $DIR/wrong-async.rs:9:8
|
||||
|
|
||||
LL | unsafe async fn test() {}
|
||||
| -------^^^^^
|
||||
| | |
|
||||
| | expected one of `extern` or `fn`
|
||||
| help: `async` must come before `unsafe`: `async unsafe`
|
||||
|
|
||||
= note: keyword order for functions declaration is `default`, `pub`, `const`, `async`, `unsafe`, `extern`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
14
src/test/ui/parser/issue-87217-keyword-order/wrong-const.rs
Normal file
14
src/test/ui/parser/issue-87217-keyword-order/wrong-const.rs
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
// edition:2018
|
||||
|
||||
// There is an order to respect for keywords before a function:
|
||||
// `<visibility>, const, async, unsafe, extern, "<ABI>"`
|
||||
//
|
||||
// This test ensures the compiler is helpful about them being misplaced.
|
||||
// Visibilities are tested elsewhere.
|
||||
|
||||
unsafe const fn test() {}
|
||||
//~^ ERROR expected one of `extern` or `fn`, found keyword `const`
|
||||
//~| NOTE expected one of `extern` or `fn`
|
||||
//~| HELP `const` must come before `unsafe`
|
||||
//~| SUGGESTION const unsafe
|
||||
//~| NOTE keyword order for functions declaration is `default`, `pub`, `const`, `async`, `unsafe`, `extern`
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
error: expected one of `extern` or `fn`, found keyword `const`
|
||||
--> $DIR/wrong-const.rs:9:8
|
||||
|
|
||||
LL | unsafe const fn test() {}
|
||||
| -------^^^^^
|
||||
| | |
|
||||
| | expected one of `extern` or `fn`
|
||||
| help: `const` must come before `unsafe`: `const unsafe`
|
||||
|
|
||||
= note: keyword order for functions declaration is `default`, `pub`, `const`, `async`, `unsafe`, `extern`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
14
src/test/ui/parser/issue-87217-keyword-order/wrong-unsafe.rs
Normal file
14
src/test/ui/parser/issue-87217-keyword-order/wrong-unsafe.rs
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
// edition:2018
|
||||
|
||||
// There is an order to respect for keywords before a function:
|
||||
// `<visibility>, const, async, unsafe, extern, "<ABI>"`
|
||||
//
|
||||
// This test ensures the compiler is helpful about them being misplaced.
|
||||
// Visibilities are tested elsewhere.
|
||||
|
||||
extern unsafe fn test() {}
|
||||
//~^ ERROR expected `fn`, found keyword `unsafe`
|
||||
//~| NOTE expected `fn`
|
||||
//~| HELP `unsafe` must come before `extern`
|
||||
//~| SUGGESTION unsafe extern
|
||||
//~| NOTE keyword order for functions declaration is `default`, `pub`, `const`, `async`, `unsafe`, `extern`
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
error: expected `fn`, found keyword `unsafe`
|
||||
--> $DIR/wrong-unsafe.rs:9:8
|
||||
|
|
||||
LL | extern unsafe fn test() {}
|
||||
| -------^^^^^^
|
||||
| | |
|
||||
| | expected `fn`
|
||||
| help: `unsafe` must come before `extern`: `unsafe extern`
|
||||
|
|
||||
= note: keyword order for functions declaration is `default`, `pub`, `const`, `async`, `unsafe`, `extern`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue