@@ -2492,7 +2492,7 @@ impl<'a> Parser<'a> {
2492
2492
pub ( super ) fn parse_fn_params ( & mut self , req_name : ReqName ) -> PResult < ' a , ThinVec < Param > > {
2493
2493
let mut first_param = true ;
2494
2494
// 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| {
2496
2496
p. recover_diff_marker ( ) ;
2497
2497
let param = p. parse_param_general ( req_name, first_param) . or_else ( |mut e| {
2498
2498
e. emit ( ) ;
@@ -2505,7 +2505,29 @@ impl<'a> Parser<'a> {
2505
2505
// ...now that we've parsed the first argument, `self` is no longer allowed.
2506
2506
first_param = false ;
2507
2507
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
+
2509
2531
// Replace duplicated recovered params with `_` pattern to avoid unnecessary errors.
2510
2532
self . deduplicate_recovered_params_names ( & mut params) ;
2511
2533
Ok ( params)
0 commit comments