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

Recover from missing param list in function definitions #117298

Merged
merged 1 commit into from
Nov 2, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions compiler/rustc_parse/messages.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -523,6 +523,9 @@ parse_missing_fn_for_function_definition = missing `fn` for function definition
parse_missing_fn_for_method_definition = missing `fn` for method definition
.suggestion = add `fn` here to parse `{$ident}` as a public method

parse_missing_fn_params = missing parameters for function definition
.suggestion = add a parameter list

parse_missing_for_in_trait_impl = missing `for` in a trait impl
.suggestion = add `for` here

Expand Down
8 changes: 8 additions & 0 deletions compiler/rustc_parse/src/errors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1543,6 +1543,14 @@ pub(crate) enum AmbiguousMissingKwForItemSub {
HelpMacro,
}

#[derive(Diagnostic)]
#[diag(parse_missing_fn_params)]
pub(crate) struct MissingFnParams {
#[primary_span]
#[suggestion(code = "()", applicability = "machine-applicable", style = "short")]
pub span: Span,
}

#[derive(Diagnostic)]
#[diag(parse_missing_trait_in_trait_impl)]
pub(crate) struct MissingTraitInTraitImpl {
Expand Down
10 changes: 10 additions & 0 deletions compiler/rustc_parse/src/parser/item.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2492,6 +2492,16 @@ impl<'a> Parser<'a> {
pub(super) fn parse_fn_params(&mut self, req_name: ReqName) -> PResult<'a, ThinVec<Param>> {
let mut first_param = true;
// Parse the arguments, starting out with `self` being allowed...
if self.token.kind != TokenKind::OpenDelim(Delimiter::Parenthesis)
// might be typo'd trait impl, handled elsewhere
&& !self.token.is_keyword(kw::For)
{
// recover from missing argument list, e.g. `fn main -> () {}`
self.sess
.emit_err(errors::MissingFnParams { span: self.prev_token.span.shrink_to_hi() });
return Ok(ThinVec::new());
}

let (mut params, _) = self.parse_paren_comma_seq(|p| {
p.recover_diff_marker();
let param = p.parse_param_general(req_name, first_param).or_else(|mut e| {
Expand Down
6 changes: 0 additions & 6 deletions tests/ui/mismatched_types/recovered-block.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,4 @@ pub fn foo() -> Foo {
}
//~^^ ERROR missing `struct` for struct definition

pub fn bar() -> Foo {
fn
Foo { text: "".to_string() }
}
//~^^ ERROR expected one of `(` or `<`, found `{`

fn main() {}
8 changes: 1 addition & 7 deletions tests/ui/mismatched_types/recovered-block.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,5 @@ help: add `struct` here to parse `Foo` as a public struct
LL | pub struct Foo { text }
| ++++++

error: expected one of `(` or `<`, found `{`
--> $DIR/recovered-block.rs:17:9
|
LL | Foo { text: "".to_string() }
| ^ expected one of `(` or `<`

error: aborting due to 2 previous errors
error: aborting due to previous error

9 changes: 9 additions & 0 deletions tests/ui/parser/issues/issue-108109-fn-missing-params.fixed
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
// run-rustfix

pub fn missing() -> () {}
//~^ ERROR missing parameters for function definition

pub fn missing2() {}
//~^ ERROR missing parameters for function definition

fn main() {}
9 changes: 9 additions & 0 deletions tests/ui/parser/issues/issue-108109-fn-missing-params.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
// run-rustfix

pub fn missing -> () {}
//~^ ERROR missing parameters for function definition

pub fn missing2 {}
//~^ ERROR missing parameters for function definition

fn main() {}
14 changes: 14 additions & 0 deletions tests/ui/parser/issues/issue-108109-fn-missing-params.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
error: missing parameters for function definition
--> $DIR/issue-108109-fn-missing-params.rs:3:15
|
LL | pub fn missing -> () {}
| ^ help: add a parameter list

error: missing parameters for function definition
--> $DIR/issue-108109-fn-missing-params.rs:6:16
|
LL | pub fn missing2 {}
| ^ help: add a parameter list

error: aborting due to 2 previous errors

3 changes: 2 additions & 1 deletion tests/ui/parser/removed-syntax-fn-sigil.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
fn main() {
let x: fn~() = || (); //~ ERROR expected `(`, found `~`
let x: fn~() = || (); //~ ERROR missing parameters for function definition
//~| ERROR expected one of `->`, `;`, or `=`, found `~`
}
14 changes: 9 additions & 5 deletions tests/ui/parser/removed-syntax-fn-sigil.stderr
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
error: expected `(`, found `~`
error: missing parameters for function definition
--> $DIR/removed-syntax-fn-sigil.rs:2:14
|
LL | let x: fn~() = || ();
| - ^ expected `(`
| |
| while parsing the type for `x`
| ^ help: add a parameter list

error: aborting due to previous error
error: expected one of `->`, `;`, or `=`, found `~`
--> $DIR/removed-syntax-fn-sigil.rs:2:14
|
LL | let x: fn~() = || ();
| ^ expected one of `->`, `;`, or `=`

error: aborting due to 2 previous errors

Loading