@@ -1272,15 +1272,13 @@ impl<'a> Parser<'a> {
1272
1272
} ;
1273
1273
let open_paren = self . token . span ;
1274
1274
1275
- let mut seq = self
1275
+ let seq = self
1276
1276
. parse_expr_paren_seq ( )
1277
1277
. map ( |args| self . mk_expr ( lo. to ( self . prev_token . span ) , self . mk_call ( fun, args) ) ) ;
1278
- if let Some ( expr) =
1279
- self . maybe_recover_struct_lit_bad_delims ( lo, open_paren, & mut seq, snapshot)
1280
- {
1281
- return expr;
1278
+ match self . maybe_recover_struct_lit_bad_delims ( lo, open_paren, seq, snapshot) {
1279
+ Ok ( expr) => expr,
1280
+ Err ( err) => self . recover_seq_parse_error ( Delimiter :: Parenthesis , lo, err) ,
1282
1281
}
1283
- self . recover_seq_parse_error ( Delimiter :: Parenthesis , lo, seq)
1284
1282
}
1285
1283
1286
1284
/// If we encounter a parser state that looks like the user has written a `struct` literal with
@@ -1290,14 +1288,11 @@ impl<'a> Parser<'a> {
1290
1288
& mut self ,
1291
1289
lo : Span ,
1292
1290
open_paren : Span ,
1293
- seq : & mut PResult < ' a , P < Expr > > ,
1291
+ seq : PResult < ' a , P < Expr > > ,
1294
1292
snapshot : Option < ( SnapshotParser < ' a > , ExprKind ) > ,
1295
- ) -> Option < P < Expr > > {
1296
- if !self . may_recover ( ) {
1297
- return None ;
1298
- }
1299
- match ( seq. as_mut ( ) , snapshot) {
1300
- ( Err ( err) , Some ( ( mut snapshot, ExprKind :: Path ( None , path) ) ) ) => {
1293
+ ) -> PResult < ' a , P < Expr > > {
1294
+ match ( self . may_recover ( ) , seq, snapshot) {
1295
+ ( true , Err ( err) , Some ( ( mut snapshot, ExprKind :: Path ( None , path) ) ) ) => {
1301
1296
snapshot. bump ( ) ; // `(`
1302
1297
match snapshot. parse_struct_fields ( path. clone ( ) , false , Delimiter :: Parenthesis ) {
1303
1298
Ok ( ( fields, ..) )
@@ -1315,11 +1310,13 @@ impl<'a> Parser<'a> {
1315
1310
if !fields. is_empty ( ) &&
1316
1311
// `token.kind` should not be compared here.
1317
1312
// This is because the `snapshot.token.kind` is treated as the same as
1318
- // that of the open delim in `TokenTreesReader::parse_token_tree`, even if they are different.
1313
+ // that of the open delim in `TokenTreesReader::parse_token_tree`, even
1314
+ // if they are different.
1319
1315
self . span_to_snippet ( close_paren) . is_ok_and ( |snippet| snippet == ")" )
1320
1316
{
1321
- let mut replacement_err =
1322
- self . dcx ( ) . create_err ( errors:: ParenthesesWithStructFields {
1317
+ err. cancel ( ) ;
1318
+ self . dcx ( )
1319
+ . create_err ( errors:: ParenthesesWithStructFields {
1323
1320
span,
1324
1321
r#type : path,
1325
1322
braces_for_struct : errors:: BracesForStructLiteral {
@@ -1332,23 +1329,22 @@ impl<'a> Parser<'a> {
1332
1329
. map ( |field| field. span . until ( field. expr . span ) )
1333
1330
. collect ( ) ,
1334
1331
} ,
1335
- } ) ;
1336
- replacement_err. emit_without_consuming ( ) ;
1337
-
1338
- let old_err = mem:: replace ( err, replacement_err) ;
1339
- old_err. cancel ( ) ;
1332
+ } )
1333
+ . emit ( ) ;
1340
1334
} else {
1341
- err. emit_without_consuming ( ) ;
1335
+ err. emit ( ) ;
1342
1336
}
1343
- return Some ( self . mk_expr_err ( span) ) ;
1337
+ Ok ( self . mk_expr_err ( span) )
1338
+ }
1339
+ Ok ( _) => Err ( err) ,
1340
+ Err ( err2) => {
1341
+ err2. cancel ( ) ;
1342
+ Err ( err)
1344
1343
}
1345
- Ok ( _) => { }
1346
- Err ( err) => err. cancel ( ) ,
1347
1344
}
1348
1345
}
1349
- _ => { }
1346
+ ( _ , seq , _ ) => seq ,
1350
1347
}
1351
- None
1352
1348
}
1353
1349
1354
1350
/// Parse an indexing expression `expr[...]`.
@@ -1552,7 +1548,7 @@ impl<'a> Parser<'a> {
1552
1548
) {
1553
1549
Ok ( x) => x,
1554
1550
Err ( err) => {
1555
- return Ok ( self . recover_seq_parse_error ( Delimiter :: Parenthesis , lo, Err ( err) ) ) ;
1551
+ return Ok ( self . recover_seq_parse_error ( Delimiter :: Parenthesis , lo, err) ) ;
1556
1552
}
1557
1553
} ;
1558
1554
let kind = if es. len ( ) == 1 && !trailing_comma {
0 commit comments