@@ -2626,7 +2626,13 @@ impl<'a> Parser<'a> {
2626
2626
let mut trailing_comma = false ;
2627
2627
let mut recovered = false ;
2628
2628
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
+ } ) ;
2630
2636
recovered = self . expect_one_of (
2631
2637
& [ ] ,
2632
2638
& [ token:: Comma , token:: CloseDelim ( token:: Paren ) ] ,
@@ -3237,36 +3243,54 @@ impl<'a> Parser<'a> {
3237
3243
}
3238
3244
if self . expr_is_complete ( & e) { break ; }
3239
3245
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
+ }
3253
3260
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)
3265
3272
}
3266
3273
}
3267
3274
return Ok ( e) ;
3268
3275
}
3269
3276
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
+
3270
3294
crate fn process_potential_macro_variable ( & mut self ) {
3271
3295
let ( token, span) = match self . token {
3272
3296
token:: Dollar if self . span . ctxt ( ) != syntax_pos:: hygiene:: SyntaxContext :: empty ( ) &&
@@ -4253,7 +4277,14 @@ impl<'a> Parser<'a> {
4253
4277
// Trailing commas are significant because (p) and (p,) are different patterns.
4254
4278
fn parse_parenthesized_pat_list ( & mut self ) -> PResult < ' a , ( Vec < P < Pat > > , Option < usize > , bool ) > {
4255
4279
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
+ } ;
4257
4288
self . expect ( & token:: CloseDelim ( token:: Paren ) ) ?;
4258
4289
Ok ( result)
4259
4290
}
0 commit comments