@@ -13,7 +13,7 @@ use rustc_session::parse::feature_err;
13
13
use rustc_span:: hygiene:: ExpnId ;
14
14
use rustc_span:: source_map:: { respan, DesugaringKind , Span , Spanned } ;
15
15
use rustc_span:: symbol:: { sym, Ident , Symbol } ;
16
- use rustc_span:: { hygiene :: ForLoopLoc , DUMMY_SP } ;
16
+ use rustc_span:: DUMMY_SP ;
17
17
18
18
impl < ' hir > LoweringContext < ' _ , ' hir > {
19
19
fn lower_exprs ( & mut self , exprs : & [ AstP < Expr > ] ) -> & ' hir [ hir:: Expr < ' hir > ] {
@@ -1308,16 +1308,13 @@ impl<'hir> LoweringContext<'_, 'hir> {
1308
1308
/// Desugar `ExprForLoop` from: `[opt_ident]: for <pat> in <head> <body>` into:
1309
1309
/// ```rust
1310
1310
/// {
1311
- /// let result = match ::std::iter:: IntoIterator::into_iter(<head>) {
1311
+ /// let result = match IntoIterator::into_iter(<head>) {
1312
1312
/// mut iter => {
1313
1313
/// [opt_ident]: loop {
1314
- /// let mut __next;
1315
- /// match ::std::iter::Iterator::next(&mut iter) {
1316
- /// ::std::option::Option::Some(val) => __next = val,
1317
- /// ::std::option::Option::None => break
1314
+ /// match Iterator::next(&mut iter) {
1315
+ /// None => break,
1316
+ /// Some(<pat>) => <body>,
1318
1317
/// };
1319
- /// let <pat> = __next;
1320
- /// StmtKind::Expr(<body>);
1321
1318
/// }
1322
1319
/// }
1323
1320
/// };
@@ -1332,133 +1329,75 @@ impl<'hir> LoweringContext<'_, 'hir> {
1332
1329
body : & Block ,
1333
1330
opt_label : Option < Label > ,
1334
1331
) -> hir:: Expr < ' hir > {
1335
- // expand <head>
1336
1332
let head = self . lower_expr_mut ( head) ;
1337
- let desugared_span =
1338
- self . mark_span_with_reason ( DesugaringKind :: ForLoop ( ForLoopLoc :: Head ) , head. span , None ) ;
1339
- let e_span = self . lower_span ( e. span ) ;
1340
-
1341
- let iter = Ident :: with_dummy_span ( sym:: iter) ;
1342
-
1343
- let next_ident = Ident :: with_dummy_span ( sym:: __next) ;
1344
- let ( next_pat, next_pat_hid) = self . pat_ident_binding_mode (
1345
- desugared_span,
1346
- next_ident,
1347
- hir:: BindingAnnotation :: Mutable ,
1348
- ) ;
1349
-
1350
- // `::std::option::Option::Some(val) => __next = val`
1351
- let pat_arm = {
1352
- let val_ident = Ident :: with_dummy_span ( sym:: val) ;
1353
- let pat_span = self . lower_span ( pat. span ) ;
1354
- let ( val_pat, val_pat_hid) = self . pat_ident ( pat_span, val_ident) ;
1355
- let val_expr = self . expr_ident ( pat_span, val_ident, val_pat_hid) ;
1356
- let next_expr = self . expr_ident ( pat_span, next_ident, next_pat_hid) ;
1357
- let assign = self . arena . alloc ( self . expr (
1358
- pat_span,
1359
- hir:: ExprKind :: Assign ( next_expr, val_expr, self . lower_span ( pat_span) ) ,
1360
- ThinVec :: new ( ) ,
1361
- ) ) ;
1362
- let some_pat = self . pat_some ( pat_span, val_pat) ;
1363
- self . arm ( some_pat, assign)
1364
- } ;
1333
+ let pat = self . lower_pat ( pat) ;
1334
+ let for_span =
1335
+ self . mark_span_with_reason ( DesugaringKind :: ForLoop , self . lower_span ( e. span ) , None ) ;
1336
+ let head_span = self . mark_span_with_reason ( DesugaringKind :: ForLoop , head. span , None ) ;
1337
+ let pat_span = self . mark_span_with_reason ( DesugaringKind :: ForLoop , pat. span , None ) ;
1365
1338
1366
- // `::std::option::Option:: None => break`
1367
- let break_arm = {
1339
+ // `None => break`
1340
+ let none_arm = {
1368
1341
let break_expr =
1369
- self . with_loop_scope ( e. id , |this| this. expr_break_alloc ( e_span , ThinVec :: new ( ) ) ) ;
1370
- let pat = self . pat_none ( e_span ) ;
1342
+ self . with_loop_scope ( e. id , |this| this. expr_break_alloc ( for_span , ThinVec :: new ( ) ) ) ;
1343
+ let pat = self . pat_none ( for_span ) ;
1371
1344
self . arm ( pat, break_expr)
1372
1345
} ;
1373
1346
1347
+ // Some(<pat>) => <body>,
1348
+ let some_arm = {
1349
+ let some_pat = self . pat_some ( pat_span, pat) ;
1350
+ let body_block = self . with_loop_scope ( e. id , |this| this. lower_block ( body, false ) ) ;
1351
+ let body_expr = self . arena . alloc ( self . expr_block ( body_block, ThinVec :: new ( ) ) ) ;
1352
+ self . arm ( some_pat, body_expr)
1353
+ } ;
1354
+
1374
1355
// `mut iter`
1356
+ let iter = Ident :: with_dummy_span ( sym:: iter) ;
1375
1357
let ( iter_pat, iter_pat_nid) =
1376
- self . pat_ident_binding_mode ( desugared_span , iter, hir:: BindingAnnotation :: Mutable ) ;
1358
+ self . pat_ident_binding_mode ( head_span , iter, hir:: BindingAnnotation :: Mutable ) ;
1377
1359
1378
- // `match ::std::iter:: Iterator::next(&mut iter) { ... }`
1360
+ // `match Iterator::next(&mut iter) { ... }`
1379
1361
let match_expr = {
1380
- let iter = self . expr_ident ( desugared_span , iter, iter_pat_nid) ;
1381
- let ref_mut_iter = self . expr_mut_addr_of ( desugared_span , iter) ;
1362
+ let iter = self . expr_ident ( head_span , iter, iter_pat_nid) ;
1363
+ let ref_mut_iter = self . expr_mut_addr_of ( head_span , iter) ;
1382
1364
let next_expr = self . expr_call_lang_item_fn (
1383
- desugared_span ,
1365
+ head_span ,
1384
1366
hir:: LangItem :: IteratorNext ,
1385
1367
arena_vec ! [ self ; ref_mut_iter] ,
1386
1368
) ;
1387
- let arms = arena_vec ! [ self ; pat_arm , break_arm ] ;
1369
+ let arms = arena_vec ! [ self ; none_arm , some_arm ] ;
1388
1370
1389
- self . expr_match ( desugared_span , next_expr, arms, hir:: MatchSource :: ForLoopDesugar )
1371
+ self . expr_match ( head_span , next_expr, arms, hir:: MatchSource :: ForLoopDesugar )
1390
1372
} ;
1391
- let match_stmt = self . stmt_expr ( desugared_span, match_expr) ;
1392
-
1393
- let next_expr = self . expr_ident ( desugared_span, next_ident, next_pat_hid) ;
1394
-
1395
- // `let mut __next`
1396
- let next_let = self . stmt_let_pat (
1397
- None ,
1398
- desugared_span,
1399
- None ,
1400
- next_pat,
1401
- hir:: LocalSource :: ForLoopDesugar ,
1402
- ) ;
1373
+ let match_stmt = self . stmt_expr ( for_span, match_expr) ;
1403
1374
1404
- // `let <pat> = __next`
1405
- let pat = self . lower_pat ( pat) ;
1406
- let pat_let = self . stmt_let_pat (
1407
- None ,
1408
- desugared_span,
1409
- Some ( next_expr) ,
1410
- pat,
1411
- hir:: LocalSource :: ForLoopDesugar ,
1412
- ) ;
1413
-
1414
- let body_block = self . with_loop_scope ( e. id , |this| this. lower_block ( body, false ) ) ;
1415
- let body_expr = self . expr_block ( body_block, ThinVec :: new ( ) ) ;
1416
- let body_stmt = self . stmt_expr ( body_block. span , body_expr) ;
1417
-
1418
- let loop_block = self . block_all (
1419
- e_span,
1420
- arena_vec ! [ self ; next_let, match_stmt, pat_let, body_stmt] ,
1421
- None ,
1422
- ) ;
1375
+ let loop_block = self . block_all ( for_span, arena_vec ! [ self ; match_stmt] , None ) ;
1423
1376
1424
1377
// `[opt_ident]: loop { ... }`
1425
1378
let kind = hir:: ExprKind :: Loop (
1426
1379
loop_block,
1427
1380
self . lower_label ( opt_label) ,
1428
1381
hir:: LoopSource :: ForLoop ,
1429
- self . lower_span ( e_span . with_hi ( head. span . hi ( ) ) ) ,
1382
+ self . lower_span ( for_span . with_hi ( head. span . hi ( ) ) ) ,
1430
1383
) ;
1431
- let loop_expr = self . arena . alloc ( hir:: Expr {
1432
- hir_id : self . lower_node_id ( e. id ) ,
1433
- kind,
1434
- span : self . lower_span ( e. span ) ,
1435
- } ) ;
1384
+ let loop_expr =
1385
+ self . arena . alloc ( hir:: Expr { hir_id : self . lower_node_id ( e. id ) , kind, span : for_span } ) ;
1436
1386
1437
1387
// `mut iter => { ... }`
1438
1388
let iter_arm = self . arm ( iter_pat, loop_expr) ;
1439
1389
1440
- let into_iter_span = self . mark_span_with_reason (
1441
- DesugaringKind :: ForLoop ( ForLoopLoc :: IntoIter ) ,
1442
- head. span ,
1443
- None ,
1444
- ) ;
1445
-
1446
1390
// `match ::std::iter::IntoIterator::into_iter(<head>) { ... }`
1447
1391
let into_iter_expr = {
1448
1392
self . expr_call_lang_item_fn (
1449
- into_iter_span ,
1393
+ head_span ,
1450
1394
hir:: LangItem :: IntoIterIntoIter ,
1451
1395
arena_vec ! [ self ; head] ,
1452
1396
)
1453
1397
} ;
1454
1398
1455
- // #82462: to correctly diagnose borrow errors, the block that contains
1456
- // the iter expr needs to have a span that covers the loop body.
1457
- let desugared_full_span =
1458
- self . mark_span_with_reason ( DesugaringKind :: ForLoop ( ForLoopLoc :: Head ) , e_span, None ) ;
1459
-
1460
1399
let match_expr = self . arena . alloc ( self . expr_match (
1461
- desugared_full_span ,
1400
+ for_span ,
1462
1401
into_iter_expr,
1463
1402
arena_vec ! [ self ; iter_arm] ,
1464
1403
hir:: MatchSource :: ForLoopDesugar ,
@@ -1472,7 +1411,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
1472
1411
// surrounding scope of the `match` since the `match` is not a terminating scope.
1473
1412
//
1474
1413
// Also, add the attributes to the outer returned expr node.
1475
- self . expr_drop_temps_mut ( desugared_full_span , match_expr, attrs. into ( ) )
1414
+ self . expr_drop_temps_mut ( for_span , match_expr, attrs. into ( ) )
1476
1415
}
1477
1416
1478
1417
/// Desugar `ExprKind::Try` from: `<expr>?` into:
0 commit comments