@@ -2170,11 +2170,13 @@ impl<'a> LoweringContext<'a> {
2170
2170
// let result = match ::std::iter::IntoIterator::into_iter(<head>) {
2171
2171
// mut iter => {
2172
2172
// [opt_ident]: loop {
2173
- // let <pat> = match ::std::iter::Iterator::next(&mut iter) {
2174
- // ::std::option::Option::Some(val) => val,
2173
+ // let next;
2174
+ // match ::std::iter::Iterator::next(&mut iter) {
2175
+ // ::std::option::Option::Some(val) => next = val,
2175
2176
// ::std::option::Option::None => break
2176
2177
// };
2177
- // SemiExpr(<body>);
2178
+ // let <pat> = next;
2179
+ // StmtExpr(<body>);
2178
2180
// }
2179
2181
// }
2180
2182
// };
@@ -2186,13 +2188,18 @@ impl<'a> LoweringContext<'a> {
2186
2188
2187
2189
let iter = self . str_to_ident ( "iter" ) ;
2188
2190
2189
- // `::std::option::Option::Some(val) => val`
2191
+ let next_ident = self . str_to_ident ( "next" ) ;
2192
+ let next_pat = self . pat_ident ( e. span , next_ident) ;
2193
+
2194
+ // `::std::option::Option::Some(val) => next = val`
2190
2195
let pat_arm = {
2191
2196
let val_ident = self . str_to_ident ( "val" ) ;
2192
2197
let val_pat = self . pat_ident ( e. span , val_ident) ;
2193
2198
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 , hir:: ExprAssign ( next_expr, val_expr) , ThinVec :: new ( ) ) ) ;
2194
2201
let some_pat = self . pat_some ( e. span , val_pat) ;
2195
- self . arm ( hir_vec ! [ some_pat] , val_expr )
2202
+ self . arm ( hir_vec ! [ some_pat] , assign )
2196
2203
} ;
2197
2204
2198
2205
// `::std::option::Option::None => break`
@@ -2222,10 +2229,20 @@ impl<'a> LoweringContext<'a> {
2222
2229
hir:: MatchSource :: ForLoopDesugar ) ,
2223
2230
ThinVec :: new ( ) ) )
2224
2231
} ;
2232
+ let match_stmt = respan ( e. span , hir:: StmtExpr ( match_expr, self . next_id ( ) ) ) ;
2233
+
2234
+ let next_expr = P ( self . expr_ident ( e. span , next_ident, next_pat. id ) ) ;
2235
+
2236
+ // `let next`
2237
+ let next_let = self . stmt_let_pat ( e. span ,
2238
+ None ,
2239
+ next_pat,
2240
+ hir:: LocalSource :: ForLoopDesugar ) ;
2225
2241
2242
+ // `let <pat> = next`
2226
2243
let pat = self . lower_pat ( pat) ;
2227
2244
let pat_let = self . stmt_let_pat ( e. span ,
2228
- match_expr ,
2245
+ Some ( next_expr ) ,
2229
2246
pat,
2230
2247
hir:: LocalSource :: ForLoopDesugar ) ;
2231
2248
@@ -2234,7 +2251,7 @@ impl<'a> LoweringContext<'a> {
2234
2251
let body_expr = P ( self . expr_block ( body_block, ThinVec :: new ( ) ) ) ;
2235
2252
let body_stmt = respan ( e. span , hir:: StmtExpr ( body_expr, self . next_id ( ) ) ) ;
2236
2253
2237
- let loop_block = P ( self . block_all ( e. span , hir_vec ! [ pat_let, body_stmt] , None ) ) ;
2254
+ let loop_block = P ( self . block_all ( e. span , hir_vec ! [ next_let , match_stmt , pat_let, body_stmt] , None ) ) ;
2238
2255
2239
2256
// `[opt_ident]: loop { ... }`
2240
2257
let loop_expr = hir:: ExprLoop ( loop_block, self . lower_opt_sp_ident ( opt_ident) ,
@@ -2601,14 +2618,14 @@ impl<'a> LoweringContext<'a> {
2601
2618
2602
2619
fn stmt_let_pat ( & mut self ,
2603
2620
sp : Span ,
2604
- ex : P < hir:: Expr > ,
2621
+ ex : Option < P < hir:: Expr > > ,
2605
2622
pat : P < hir:: Pat > ,
2606
2623
source : hir:: LocalSource )
2607
2624
-> hir:: Stmt {
2608
2625
let local = P ( hir:: Local {
2609
2626
pat : pat,
2610
2627
ty : None ,
2611
- init : Some ( ex ) ,
2628
+ init : ex ,
2612
2629
id : self . next_id ( ) ,
2613
2630
span : sp,
2614
2631
attrs : ThinVec :: new ( ) ,
@@ -2626,7 +2643,7 @@ impl<'a> LoweringContext<'a> {
2626
2643
self . pat_ident ( sp, ident)
2627
2644
} ;
2628
2645
let pat_id = pat. id ;
2629
- ( self . stmt_let_pat ( sp, ex , pat, hir:: LocalSource :: Normal ) , pat_id)
2646
+ ( self . stmt_let_pat ( sp, Some ( ex ) , pat, hir:: LocalSource :: Normal ) , pat_id)
2630
2647
}
2631
2648
2632
2649
fn block_expr ( & mut self , expr : P < hir:: Expr > ) -> hir:: Block {
0 commit comments