@@ -2492,7 +2492,7 @@ impl<'a> Parser<'a> {
24922492 pub ( super ) fn parse_fn_params ( & mut self , req_name : ReqName ) -> PResult < ' a , ThinVec < Param > > {
24932493 let mut first_param = true ;
24942494 // Parse the arguments, starting out with `self` being allowed...
2495- let ( mut params , _ ) = self . parse_paren_comma_seq ( |p| {
2495+ let parsed = self . parse_paren_comma_seq ( |p| {
24962496 p. recover_diff_marker ( ) ;
24972497 let param = p. parse_param_general ( req_name, first_param) . or_else ( |mut e| {
24982498 e. emit ( ) ;
@@ -2505,7 +2505,29 @@ impl<'a> Parser<'a> {
25052505 // ...now that we've parsed the first argument, `self` is no longer allowed.
25062506 first_param = false ;
25072507 param
2508- } ) ?;
2508+ } ) ;
2509+ let mut params = match parsed {
2510+ Ok ( ( p, _) ) => p,
2511+ Err ( e) => {
2512+ // some error while parsing params
2513+ if self . token . kind == TokenKind :: OpenDelim ( Delimiter :: Parenthesis ) ||
2514+ // removed syntax, handled elsewhere
2515+ self . token . kind == TokenKind :: Tilde ||
2516+ // might be typo'd trait impl, handled elsewhere
2517+ self . token . is_keyword ( kw:: For )
2518+ {
2519+ return Err ( e) ;
2520+ } else {
2521+ // recover from missing argument list, e.g. `fn main -> () {}`
2522+ e. cancel ( ) ;
2523+ self . sess . emit_err ( errors:: MissingFnParams {
2524+ span : self . prev_token . span . shrink_to_hi ( ) ,
2525+ } ) ;
2526+ return Ok ( ThinVec :: new ( ) ) ;
2527+ }
2528+ }
2529+ } ;
2530+
25092531 // Replace duplicated recovered params with `_` pattern to avoid unnecessary errors.
25102532 self . deduplicate_recovered_params_names ( & mut params) ;
25112533 Ok ( params)
0 commit comments