@@ -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 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,18 @@ 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 ( e. span , next_ident) ;
2191
+
2192
+ // `::std::option::Option::Some(val) => next = val`
2188
2193
let pat_arm = {
2189
2194
let val_ident = self . str_to_ident ( "val" ) ;
2190
2195
let val_pat = self . pat_ident ( e. span , val_ident) ;
2191
2196
let val_expr = P ( self . expr_ident ( e. span , val_ident, val_pat. id ) ) ;
2197
+ let next_expr = P ( self . expr_ident ( e. span , next_ident, next_pat. id ) ) ;
2198
+ let assign = P ( self . expr ( e. span , hir:: ExprAssign ( next_expr, val_expr) , ThinVec :: new ( ) ) ) ;
2192
2199
let some_pat = self . pat_some ( e. span , val_pat) ;
2193
- self . arm ( hir_vec ! [ some_pat] , val_expr )
2200
+ self . arm ( hir_vec ! [ some_pat] , assign )
2194
2201
} ;
2195
2202
2196
2203
// `::std::option::Option::None => break`
@@ -2220,10 +2227,20 @@ impl<'a> LoweringContext<'a> {
2220
2227
hir:: MatchSource :: ForLoopDesugar ) ,
2221
2228
ThinVec :: new ( ) ) )
2222
2229
} ;
2230
+ let match_stmt = respan ( e. span , hir:: StmtExpr ( match_expr, self . next_id ( ) ) ) ;
2231
+
2232
+ let next_expr = P ( self . expr_ident ( e. span , next_ident, next_pat. id ) ) ;
2233
+
2234
+ // `let next`
2235
+ let next_let = self . stmt_let_pat ( e. span ,
2236
+ None ,
2237
+ next_pat,
2238
+ hir:: LocalSource :: ForLoopDesugar ) ;
2223
2239
2240
+ // `let <pat> = next`
2224
2241
let pat = self . lower_pat ( pat) ;
2225
2242
let pat_let = self . stmt_let_pat ( e. span ,
2226
- match_expr ,
2243
+ Some ( next_expr ) ,
2227
2244
pat,
2228
2245
hir:: LocalSource :: ForLoopDesugar ) ;
2229
2246
@@ -2232,7 +2249,7 @@ impl<'a> LoweringContext<'a> {
2232
2249
let body_expr = P ( self . expr_block ( body_block, ThinVec :: new ( ) ) ) ;
2233
2250
let body_stmt = respan ( e. span , hir:: StmtExpr ( body_expr, self . next_id ( ) ) ) ;
2234
2251
2235
- let loop_block = P ( self . block_all ( e. span , hir_vec ! [ pat_let, body_stmt] , None ) ) ;
2252
+ let loop_block = P ( self . block_all ( e. span , hir_vec ! [ next_let , match_stmt , pat_let, body_stmt] , None ) ) ;
2236
2253
2237
2254
// `[opt_ident]: loop { ... }`
2238
2255
let loop_expr = hir:: ExprLoop ( loop_block, self . lower_opt_sp_ident ( opt_ident) ,
@@ -2599,14 +2616,14 @@ impl<'a> LoweringContext<'a> {
2599
2616
2600
2617
fn stmt_let_pat ( & mut self ,
2601
2618
sp : Span ,
2602
- ex : P < hir:: Expr > ,
2619
+ ex : Option < P < hir:: Expr > > ,
2603
2620
pat : P < hir:: Pat > ,
2604
2621
source : hir:: LocalSource )
2605
2622
-> hir:: Stmt {
2606
2623
let local = P ( hir:: Local {
2607
2624
pat : pat,
2608
2625
ty : None ,
2609
- init : Some ( ex ) ,
2626
+ init : ex ,
2610
2627
id : self . next_id ( ) ,
2611
2628
span : sp,
2612
2629
attrs : ThinVec :: new ( ) ,
@@ -2624,7 +2641,7 @@ impl<'a> LoweringContext<'a> {
2624
2641
self . pat_ident ( sp, ident)
2625
2642
} ;
2626
2643
let pat_id = pat. id ;
2627
- ( self . stmt_let_pat ( sp, ex , pat, hir:: LocalSource :: Normal ) , pat_id)
2644
+ ( self . stmt_let_pat ( sp, Some ( ex ) , pat, hir:: LocalSource :: Normal ) , pat_id)
2628
2645
}
2629
2646
2630
2647
fn block_expr ( & mut self , expr : P < hir:: Expr > ) -> hir:: Block {
0 commit comments