@@ -2626,7 +2626,13 @@ impl<'a> Parser<'a> {
26262626 let mut trailing_comma = false ;
26272627 let mut recovered = false ;
26282628 while self . token != token:: CloseDelim ( token:: Paren ) {
2629- es. push ( self . parse_expr ( ) ?) ;
2629+ es. push ( match self . parse_expr ( ) {
2630+ Ok ( es) => es,
2631+ Err ( err) => {
2632+ // recover from parse error in tuple list
2633+ return Ok ( self . recover_seq_parse_error ( token:: Paren , lo, Err ( err) ) ) ;
2634+ }
2635+ } ) ;
26302636 recovered = self . expect_one_of (
26312637 & [ ] ,
26322638 & [ token:: Comma , token:: CloseDelim ( token:: Paren ) ] ,
@@ -3237,36 +3243,54 @@ impl<'a> Parser<'a> {
32373243 }
32383244 if self . expr_is_complete ( & e) { break ; }
32393245 match self . token {
3240- // expr(...)
3241- token:: OpenDelim ( token:: Paren ) => {
3242- let es = self . parse_unspanned_seq (
3243- & token:: OpenDelim ( token:: Paren ) ,
3244- & token:: CloseDelim ( token:: Paren ) ,
3245- SeqSep :: trailing_allowed ( token:: Comma ) ,
3246- |p| Ok ( p. parse_expr ( ) ?)
3247- ) ?;
3248- hi = self . prev_span ;
3249-
3250- let nd = self . mk_call ( e, es) ;
3251- e = self . mk_expr ( lo. to ( hi) , nd, ThinVec :: new ( ) ) ;
3252- }
3246+ // expr(...)
3247+ token:: OpenDelim ( token:: Paren ) => {
3248+ let seq = self . parse_unspanned_seq (
3249+ & token:: OpenDelim ( token:: Paren ) ,
3250+ & token:: CloseDelim ( token:: Paren ) ,
3251+ SeqSep :: trailing_allowed ( token:: Comma ) ,
3252+ |p| Ok ( p. parse_expr ( ) ?)
3253+ ) . map ( |es| {
3254+ let nd = self . mk_call ( e, es) ;
3255+ let hi = self . prev_span ;
3256+ self . mk_expr ( lo. to ( hi) , nd, ThinVec :: new ( ) )
3257+ } ) ;
3258+ e = self . recover_seq_parse_error ( token:: Paren , lo, seq) ;
3259+ }
32533260
3254- // expr[...]
3255- // Could be either an index expression or a slicing expression.
3256- token:: OpenDelim ( token:: Bracket ) => {
3257- self . bump ( ) ;
3258- let ix = self . parse_expr ( ) ?;
3259- hi = self . span ;
3260- self . expect ( & token:: CloseDelim ( token:: Bracket ) ) ?;
3261- let index = self . mk_index ( e, ix) ;
3262- e = self . mk_expr ( lo. to ( hi) , index, ThinVec :: new ( ) )
3263- }
3264- _ => return Ok ( e)
3261+ // expr[...]
3262+ // Could be either an index expression or a slicing expression.
3263+ token:: OpenDelim ( token:: Bracket ) => {
3264+ self . bump ( ) ;
3265+ let ix = self . parse_expr ( ) ?;
3266+ hi = self . span ;
3267+ self . expect ( & token:: CloseDelim ( token:: Bracket ) ) ?;
3268+ let index = self . mk_index ( e, ix) ;
3269+ e = self . mk_expr ( lo. to ( hi) , index, ThinVec :: new ( ) )
3270+ }
3271+ _ => return Ok ( e)
32653272 }
32663273 }
32673274 return Ok ( e) ;
32683275 }
32693276
3277+ fn recover_seq_parse_error (
3278+ & mut self ,
3279+ delim : token:: DelimToken ,
3280+ lo : Span ,
3281+ result : PResult < ' a , P < Expr > > ,
3282+ ) -> P < Expr > {
3283+ match result {
3284+ Ok ( x) => x,
3285+ Err ( mut err) => {
3286+ err. emit ( ) ;
3287+ // recover from parse error
3288+ self . consume_block ( delim) ;
3289+ self . mk_expr ( lo. to ( self . prev_span ) , ExprKind :: Err , ThinVec :: new ( ) )
3290+ }
3291+ }
3292+ }
3293+
32703294 crate fn process_potential_macro_variable ( & mut self ) {
32713295 let ( token, span) = match self . token {
32723296 token:: Dollar if self . span . ctxt ( ) != syntax_pos:: hygiene:: SyntaxContext :: empty ( ) &&
@@ -4253,7 +4277,14 @@ impl<'a> Parser<'a> {
42534277 // Trailing commas are significant because (p) and (p,) are different patterns.
42544278 fn parse_parenthesized_pat_list ( & mut self ) -> PResult < ' a , ( Vec < P < Pat > > , Option < usize > , bool ) > {
42554279 self . expect ( & token:: OpenDelim ( token:: Paren ) ) ?;
4256- let result = self . parse_pat_list ( ) ?;
4280+ let result = match self . parse_pat_list ( ) {
4281+ Ok ( result) => result,
4282+ Err ( mut err) => { // recover from parse error in tuple pattern list
4283+ err. emit ( ) ;
4284+ self . consume_block ( token:: Paren ) ;
4285+ return Ok ( ( vec ! [ ] , Some ( 0 ) , false ) ) ;
4286+ }
4287+ } ;
42574288 self . expect ( & token:: CloseDelim ( token:: Paren ) ) ?;
42584289 Ok ( result)
42594290 }
0 commit comments