@@ -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 mut _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,22 @@ 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_binding_mode ( e. span ,
2193
+ next_ident,
2194
+ hir:: BindByValue ( hir:: MutMutable ) ) ;
2195
+
2196
+ // `::std::option::Option::Some(val) => next = val`
2190
2197
let pat_arm = {
2191
2198
let val_ident = self . str_to_ident ( "val" ) ;
2192
2199
let val_pat = self . pat_ident ( e. span , val_ident) ;
2193
2200
let val_expr = P ( self . expr_ident ( e. span , val_ident, val_pat. id ) ) ;
2201
+ let next_expr = P ( self . expr_ident ( e. span , next_ident, next_pat. id ) ) ;
2202
+ let assign = P ( self . expr ( e. span ,
2203
+ hir:: ExprAssign ( next_expr, val_expr) ,
2204
+ ThinVec :: new ( ) ) ) ;
2194
2205
let some_pat = self . pat_some ( e. span , val_pat) ;
2195
- self . arm ( hir_vec ! [ some_pat] , val_expr )
2206
+ self . arm ( hir_vec ! [ some_pat] , assign )
2196
2207
} ;
2197
2208
2198
2209
// `::std::option::Option::None => break`
@@ -2222,10 +2233,20 @@ impl<'a> LoweringContext<'a> {
2222
2233
hir:: MatchSource :: ForLoopDesugar ) ,
2223
2234
ThinVec :: new ( ) ) )
2224
2235
} ;
2236
+ let match_stmt = respan ( e. span , hir:: StmtExpr ( match_expr, self . next_id ( ) ) ) ;
2237
+
2238
+ let next_expr = P ( self . expr_ident ( e. span , next_ident, next_pat. id ) ) ;
2239
+
2240
+ // `let mut _next`
2241
+ let next_let = self . stmt_let_pat ( e. span ,
2242
+ None ,
2243
+ next_pat,
2244
+ hir:: LocalSource :: ForLoopDesugar ) ;
2225
2245
2246
+ // `let <pat> = _next`
2226
2247
let pat = self . lower_pat ( pat) ;
2227
2248
let pat_let = self . stmt_let_pat ( e. span ,
2228
- match_expr ,
2249
+ Some ( next_expr ) ,
2229
2250
pat,
2230
2251
hir:: LocalSource :: ForLoopDesugar ) ;
2231
2252
@@ -2234,7 +2255,12 @@ impl<'a> LoweringContext<'a> {
2234
2255
let body_expr = P ( self . expr_block ( body_block, ThinVec :: new ( ) ) ) ;
2235
2256
let body_stmt = respan ( e. span , hir:: StmtExpr ( body_expr, self . next_id ( ) ) ) ;
2236
2257
2237
- let loop_block = P ( self . block_all ( e. span , hir_vec ! [ pat_let, body_stmt] , None ) ) ;
2258
+ let loop_block = P ( self . block_all ( e. span ,
2259
+ hir_vec ! [ next_let,
2260
+ match_stmt,
2261
+ pat_let,
2262
+ body_stmt] ,
2263
+ None ) ) ;
2238
2264
2239
2265
// `[opt_ident]: loop { ... }`
2240
2266
let loop_expr = hir:: ExprLoop ( loop_block, self . lower_opt_sp_ident ( opt_ident) ,
@@ -2601,14 +2627,14 @@ impl<'a> LoweringContext<'a> {
2601
2627
2602
2628
fn stmt_let_pat ( & mut self ,
2603
2629
sp : Span ,
2604
- ex : P < hir:: Expr > ,
2630
+ ex : Option < P < hir:: Expr > > ,
2605
2631
pat : P < hir:: Pat > ,
2606
2632
source : hir:: LocalSource )
2607
2633
-> hir:: Stmt {
2608
2634
let local = P ( hir:: Local {
2609
2635
pat : pat,
2610
2636
ty : None ,
2611
- init : Some ( ex ) ,
2637
+ init : ex ,
2612
2638
id : self . next_id ( ) ,
2613
2639
span : sp,
2614
2640
attrs : ThinVec :: new ( ) ,
@@ -2626,7 +2652,7 @@ impl<'a> LoweringContext<'a> {
2626
2652
self . pat_ident ( sp, ident)
2627
2653
} ;
2628
2654
let pat_id = pat. id ;
2629
- ( self . stmt_let_pat ( sp, ex , pat, hir:: LocalSource :: Normal ) , pat_id)
2655
+ ( self . stmt_let_pat ( sp, Some ( ex ) , pat, hir:: LocalSource :: Normal ) , pat_id)
2630
2656
}
2631
2657
2632
2658
fn block_expr ( & mut self , expr : P < hir:: Expr > ) -> hir:: Block {
0 commit comments