@@ -13,7 +13,7 @@ use rustc_session::parse::feature_err;
1313use rustc_span:: hygiene:: ExpnId ;
1414use rustc_span:: source_map:: { respan, DesugaringKind , Span , Spanned } ;
1515use rustc_span:: symbol:: { sym, Ident , Symbol } ;
16- use rustc_span:: { hygiene :: ForLoopLoc , DUMMY_SP } ;
16+ use rustc_span:: DUMMY_SP ;
1717
1818impl < ' hir > LoweringContext < ' _ , ' hir > {
1919 fn lower_exprs ( & mut self , exprs : & [ AstP < Expr > ] ) -> & ' hir [ hir:: Expr < ' hir > ] {
@@ -1308,16 +1308,13 @@ impl<'hir> LoweringContext<'_, 'hir> {
13081308 /// Desugar `ExprForLoop` from: `[opt_ident]: for <pat> in <head> <body>` into:
13091309 /// ```rust
13101310 /// {
1311- /// let result = match ::std::iter:: IntoIterator::into_iter(<head>) {
1311+ /// let result = match IntoIterator::into_iter(<head>) {
13121312 /// mut iter => {
13131313 /// [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>,
13181317 /// };
1319- /// let <pat> = __next;
1320- /// StmtKind::Expr(<body>);
13211318 /// }
13221319 /// }
13231320 /// };
@@ -1332,133 +1329,75 @@ impl<'hir> LoweringContext<'_, 'hir> {
13321329 body : & Block ,
13331330 opt_label : Option < Label > ,
13341331 ) -> hir:: Expr < ' hir > {
1335- // expand <head>
13361332 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 ) ;
13651338
1366- // `::std::option::Option:: None => break`
1367- let break_arm = {
1339+ // `None => break`
1340+ let none_arm = {
13681341 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 ) ;
13711344 self . arm ( pat, break_expr)
13721345 } ;
13731346
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+
13741355 // `mut iter`
1356+ let iter = Ident :: with_dummy_span ( sym:: iter) ;
13751357 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 ) ;
13771359
1378- // `match ::std::iter:: Iterator::next(&mut iter) { ... }`
1360+ // `match Iterator::next(&mut iter) { ... }`
13791361 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) ;
13821364 let next_expr = self . expr_call_lang_item_fn (
1383- desugared_span ,
1365+ head_span ,
13841366 hir:: LangItem :: IteratorNext ,
13851367 arena_vec ! [ self ; ref_mut_iter] ,
13861368 ) ;
1387- let arms = arena_vec ! [ self ; pat_arm , break_arm ] ;
1369+ let arms = arena_vec ! [ self ; none_arm , some_arm ] ;
13881370
1389- self . expr_match ( desugared_span , next_expr, arms, hir:: MatchSource :: ForLoopDesugar )
1371+ self . expr_match ( head_span , next_expr, arms, hir:: MatchSource :: ForLoopDesugar )
13901372 } ;
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) ;
14031374
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 ) ;
14231376
14241377 // `[opt_ident]: loop { ... }`
14251378 let kind = hir:: ExprKind :: Loop (
14261379 loop_block,
14271380 self . lower_label ( opt_label) ,
14281381 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 ( ) ) ) ,
14301383 ) ;
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 } ) ;
14361386
14371387 // `mut iter => { ... }`
14381388 let iter_arm = self . arm ( iter_pat, loop_expr) ;
14391389
1440- let into_iter_span = self . mark_span_with_reason (
1441- DesugaringKind :: ForLoop ( ForLoopLoc :: IntoIter ) ,
1442- head. span ,
1443- None ,
1444- ) ;
1445-
14461390 // `match ::std::iter::IntoIterator::into_iter(<head>) { ... }`
14471391 let into_iter_expr = {
14481392 self . expr_call_lang_item_fn (
1449- into_iter_span ,
1393+ head_span ,
14501394 hir:: LangItem :: IntoIterIntoIter ,
14511395 arena_vec ! [ self ; head] ,
14521396 )
14531397 } ;
14541398
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-
14601399 let match_expr = self . arena . alloc ( self . expr_match (
1461- desugared_full_span ,
1400+ for_span ,
14621401 into_iter_expr,
14631402 arena_vec ! [ self ; iter_arm] ,
14641403 hir:: MatchSource :: ForLoopDesugar ,
@@ -1472,7 +1411,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
14721411 // surrounding scope of the `match` since the `match` is not a terminating scope.
14731412 //
14741413 // 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 ( ) )
14761415 }
14771416
14781417 /// Desugar `ExprKind::Try` from: `<expr>?` into:
0 commit comments