@@ -2637,7 +2637,15 @@ impl<'a> Parser<'a> {
2637
2637
let mut trailing_comma = false ;
2638
2638
let mut recovered = false ;
2639
2639
while self . token != token:: CloseDelim ( token:: Paren ) {
2640
- es. push ( self . parse_expr ( ) ?) ;
2640
+ es. push ( match self . parse_expr ( ) {
2641
+ Ok ( es) => es,
2642
+ Err ( mut err) => { // recover from parse error in tuple list
2643
+ err. emit ( ) ;
2644
+ self . consume_block ( token:: Paren ) ;
2645
+ hi = self . prev_span ;
2646
+ return Ok ( self . mk_expr ( lo. to ( hi) , ExprKind :: Err , ThinVec :: new ( ) ) ) ;
2647
+ }
2648
+ } ) ;
2641
2649
recovered = self . expect_one_of (
2642
2650
& [ ] ,
2643
2651
& [ token:: Comma , token:: CloseDelim ( token:: Paren ) ] ,
@@ -3248,16 +3256,24 @@ impl<'a> Parser<'a> {
3248
3256
match self . token {
3249
3257
// expr(...)
3250
3258
token:: OpenDelim ( token:: Paren ) => {
3251
- let es = self . parse_unspanned_seq (
3259
+ match self . parse_unspanned_seq (
3252
3260
& token:: OpenDelim ( token:: Paren ) ,
3253
3261
& token:: CloseDelim ( token:: Paren ) ,
3254
3262
SeqSep :: trailing_allowed ( token:: Comma ) ,
3255
3263
|p| Ok ( p. parse_expr ( ) ?)
3256
- ) ?;
3257
- hi = self . prev_span ;
3258
-
3259
- let nd = self . mk_call ( e, es) ;
3260
- e = self . mk_expr ( lo. to ( hi) , nd, ThinVec :: new ( ) ) ;
3264
+ ) {
3265
+ Ok ( es) => {
3266
+ let nd = self . mk_call ( e, es) ;
3267
+ hi = self . prev_span ;
3268
+ e = self . mk_expr ( lo. to ( hi) , nd, ThinVec :: new ( ) ) ;
3269
+ }
3270
+ Err ( mut err) => { // recover from parse error in argument list
3271
+ err. emit ( ) ;
3272
+ self . consume_block ( token:: Paren ) ;
3273
+ hi = self . prev_span ;
3274
+ e = self . mk_expr ( lo. to ( hi) , ExprKind :: Err , ThinVec :: new ( ) ) ;
3275
+ }
3276
+ }
3261
3277
}
3262
3278
3263
3279
// expr[...]
@@ -4262,7 +4278,14 @@ impl<'a> Parser<'a> {
4262
4278
// Trailing commas are significant because (p) and (p,) are different patterns.
4263
4279
fn parse_parenthesized_pat_list ( & mut self ) -> PResult < ' a , ( Vec < P < Pat > > , Option < usize > , bool ) > {
4264
4280
self . expect ( & token:: OpenDelim ( token:: Paren ) ) ?;
4265
- let result = self . parse_pat_list ( ) ?;
4281
+ let result = match self . parse_pat_list ( ) {
4282
+ Ok ( result) => result,
4283
+ Err ( mut err) => { // recover from parse error in tuple pattern list
4284
+ err. emit ( ) ;
4285
+ self . consume_block ( token:: Paren ) ;
4286
+ return Ok ( ( vec ! [ ] , Some ( 0 ) , false ) ) ;
4287
+ }
4288
+ } ;
4266
4289
self . expect ( & token:: CloseDelim ( token:: Paren ) ) ?;
4267
4290
Ok ( result)
4268
4291
}
0 commit comments