@@ -2168,11 +2168,13 @@ impl<'a> LoweringContext<'a> {
2168
2168
// let result = match ::std::iter::IntoIterator::into_iter(<head>) {
2169
2169
// mut iter => {
2170
2170
// [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,
2173
2174
// ::std::option::Option::None => break
2174
2175
// };
2175
- // SemiExpr(<body>);
2176
+ // let <pat> = _next;
2177
+ // StmtExpr(<body>);
2176
2178
// }
2177
2179
// }
2178
2180
// };
@@ -2184,13 +2186,22 @@ impl<'a> LoweringContext<'a> {
2184
2186
2185
2187
let iter = self . str_to_ident ( "iter" ) ;
2186
2188
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`
2188
2195
let pat_arm = {
2189
2196
let val_ident = self . str_to_ident ( "val" ) ;
2190
2197
let val_pat = self . pat_ident ( e. span , val_ident) ;
2191
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 ,
2201
+ hir:: ExprAssign ( next_expr, val_expr) ,
2202
+ ThinVec :: new ( ) ) ) ;
2192
2203
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 )
2194
2205
} ;
2195
2206
2196
2207
// `::std::option::Option::None => break`
@@ -2220,10 +2231,20 @@ impl<'a> LoweringContext<'a> {
2220
2231
hir:: MatchSource :: ForLoopDesugar ) ,
2221
2232
ThinVec :: new ( ) ) )
2222
2233
} ;
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 ) ;
2223
2243
2244
+ // `let <pat> = _next`
2224
2245
let pat = self . lower_pat ( pat) ;
2225
2246
let pat_let = self . stmt_let_pat ( e. span ,
2226
- match_expr ,
2247
+ Some ( next_expr ) ,
2227
2248
pat,
2228
2249
hir:: LocalSource :: ForLoopDesugar ) ;
2229
2250
@@ -2232,7 +2253,12 @@ impl<'a> LoweringContext<'a> {
2232
2253
let body_expr = P ( self . expr_block ( body_block, ThinVec :: new ( ) ) ) ;
2233
2254
let body_stmt = respan ( e. span , hir:: StmtExpr ( body_expr, self . next_id ( ) ) ) ;
2234
2255
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 ) ) ;
2236
2262
2237
2263
// `[opt_ident]: loop { ... }`
2238
2264
let loop_expr = hir:: ExprLoop ( loop_block, self . lower_opt_sp_ident ( opt_ident) ,
@@ -2599,14 +2625,14 @@ impl<'a> LoweringContext<'a> {
2599
2625
2600
2626
fn stmt_let_pat ( & mut self ,
2601
2627
sp : Span ,
2602
- ex : P < hir:: Expr > ,
2628
+ ex : Option < P < hir:: Expr > > ,
2603
2629
pat : P < hir:: Pat > ,
2604
2630
source : hir:: LocalSource )
2605
2631
-> hir:: Stmt {
2606
2632
let local = P ( hir:: Local {
2607
2633
pat : pat,
2608
2634
ty : None ,
2609
- init : Some ( ex ) ,
2635
+ init : ex ,
2610
2636
id : self . next_id ( ) ,
2611
2637
span : sp,
2612
2638
attrs : ThinVec :: new ( ) ,
@@ -2624,7 +2650,7 @@ impl<'a> LoweringContext<'a> {
2624
2650
self . pat_ident ( sp, ident)
2625
2651
} ;
2626
2652
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)
2628
2654
}
2629
2655
2630
2656
fn block_expr ( & mut self , expr : P < hir:: Expr > ) -> hir:: Block {
0 commit comments