@@ -2168,11 +2168,13 @@ impl<'a> LoweringContext<'a> {
21682168 // let result = match ::std::iter::IntoIterator::into_iter(<head>) {
21692169 // mut iter => {
21702170 // [opt_ident]: loop {
2171- // let <pat> = match ::std::iter::Iterator::next(&mut iter) {
2172- // ::std::option::Option::Some(val) => val,
2171+ // let mut _next;
2172+ // match ::std::iter::Iterator::next(&mut iter) {
2173+ // ::std::option::Option::Some(val) => _next = val,
21732174 // ::std::option::Option::None => break
21742175 // };
2175- // SemiExpr(<body>);
2176+ // let <pat> = _next;
2177+ // StmtExpr(<body>);
21762178 // }
21772179 // }
21782180 // };
@@ -2184,13 +2186,22 @@ impl<'a> LoweringContext<'a> {
21842186
21852187 let iter = self . str_to_ident ( "iter" ) ;
21862188
2187- // `::std::option::Option::Some(val) => val`
2189+ let next_ident = self . str_to_ident ( "_next" ) ;
2190+ let next_pat = self . pat_ident_binding_mode ( e. span ,
2191+ next_ident,
2192+ hir:: BindByValue ( hir:: MutMutable ) ) ;
2193+
2194+ // `::std::option::Option::Some(val) => next = val`
21882195 let pat_arm = {
21892196 let val_ident = self . str_to_ident ( "val" ) ;
21902197 let val_pat = self . pat_ident ( e. span , val_ident) ;
21912198 let val_expr = P ( self . expr_ident ( e. span , val_ident, val_pat. id ) ) ;
2199+ let next_expr = P ( self . expr_ident ( e. span , next_ident, next_pat. id ) ) ;
2200+ let assign = P ( self . expr ( e. span ,
2201+ hir:: ExprAssign ( next_expr, val_expr) ,
2202+ ThinVec :: new ( ) ) ) ;
21922203 let some_pat = self . pat_some ( e. span , val_pat) ;
2193- self . arm ( hir_vec ! [ some_pat] , val_expr )
2204+ self . arm ( hir_vec ! [ some_pat] , assign )
21942205 } ;
21952206
21962207 // `::std::option::Option::None => break`
@@ -2220,10 +2231,20 @@ impl<'a> LoweringContext<'a> {
22202231 hir:: MatchSource :: ForLoopDesugar ) ,
22212232 ThinVec :: new ( ) ) )
22222233 } ;
2234+ let match_stmt = respan ( e. span , hir:: StmtExpr ( match_expr, self . next_id ( ) ) ) ;
2235+
2236+ let next_expr = P ( self . expr_ident ( e. span , next_ident, next_pat. id ) ) ;
2237+
2238+ // `let mut _next`
2239+ let next_let = self . stmt_let_pat ( e. span ,
2240+ None ,
2241+ next_pat,
2242+ hir:: LocalSource :: ForLoopDesugar ) ;
22232243
2244+ // `let <pat> = _next`
22242245 let pat = self . lower_pat ( pat) ;
22252246 let pat_let = self . stmt_let_pat ( e. span ,
2226- match_expr ,
2247+ Some ( next_expr ) ,
22272248 pat,
22282249 hir:: LocalSource :: ForLoopDesugar ) ;
22292250
@@ -2232,7 +2253,12 @@ impl<'a> LoweringContext<'a> {
22322253 let body_expr = P ( self . expr_block ( body_block, ThinVec :: new ( ) ) ) ;
22332254 let body_stmt = respan ( e. span , hir:: StmtExpr ( body_expr, self . next_id ( ) ) ) ;
22342255
2235- let loop_block = P ( self . block_all ( e. span , hir_vec ! [ pat_let, body_stmt] , None ) ) ;
2256+ let loop_block = P ( self . block_all ( e. span ,
2257+ hir_vec ! [ next_let,
2258+ match_stmt,
2259+ pat_let,
2260+ body_stmt] ,
2261+ None ) ) ;
22362262
22372263 // `[opt_ident]: loop { ... }`
22382264 let loop_expr = hir:: ExprLoop ( loop_block, self . lower_opt_sp_ident ( opt_ident) ,
@@ -2599,14 +2625,14 @@ impl<'a> LoweringContext<'a> {
25992625
26002626 fn stmt_let_pat ( & mut self ,
26012627 sp : Span ,
2602- ex : P < hir:: Expr > ,
2628+ ex : Option < P < hir:: Expr > > ,
26032629 pat : P < hir:: Pat > ,
26042630 source : hir:: LocalSource )
26052631 -> hir:: Stmt {
26062632 let local = P ( hir:: Local {
26072633 pat : pat,
26082634 ty : None ,
2609- init : Some ( ex ) ,
2635+ init : ex ,
26102636 id : self . next_id ( ) ,
26112637 span : sp,
26122638 attrs : ThinVec :: new ( ) ,
@@ -2624,7 +2650,7 @@ impl<'a> LoweringContext<'a> {
26242650 self . pat_ident ( sp, ident)
26252651 } ;
26262652 let pat_id = pat. id ;
2627- ( self . stmt_let_pat ( sp, ex , pat, hir:: LocalSource :: Normal ) , pat_id)
2653+ ( self . stmt_let_pat ( sp, Some ( ex ) , pat, hir:: LocalSource :: Normal ) , pat_id)
26282654 }
26292655
26302656 fn block_expr ( & mut self , expr : P < hir:: Expr > ) -> hir:: Block {
0 commit comments