@@ -4440,23 +4440,23 @@ impl<'a> LoweringContext<'a> {
4440
4440
} )
4441
4441
}
4442
4442
4443
+ fn lower_exprs ( & mut self , exprs : & [ AstP < Expr > ] ) -> HirVec < hir:: Expr > {
4444
+ exprs. iter ( ) . map ( |x| self . lower_expr ( x) ) . collect ( )
4445
+ }
4446
+
4443
4447
fn lower_expr ( & mut self , e : & Expr ) -> hir:: Expr {
4444
4448
let kind = match e. node {
4445
4449
ExprKind :: Box ( ref inner) => hir:: ExprKind :: Box ( P ( self . lower_expr ( inner) ) ) ,
4446
- ExprKind :: Array ( ref exprs) => {
4447
- hir:: ExprKind :: Array ( exprs. iter ( ) . map ( |x| self . lower_expr ( x) ) . collect ( ) )
4448
- }
4450
+ ExprKind :: Array ( ref exprs) => hir:: ExprKind :: Array ( self . lower_exprs ( exprs) ) ,
4449
4451
ExprKind :: Repeat ( ref expr, ref count) => {
4450
4452
let expr = P ( self . lower_expr ( expr) ) ;
4451
4453
let count = self . lower_anon_const ( count) ;
4452
4454
hir:: ExprKind :: Repeat ( expr, count)
4453
4455
}
4454
- ExprKind :: Tup ( ref elts) => {
4455
- hir:: ExprKind :: Tup ( elts. iter ( ) . map ( |x| self . lower_expr ( x) ) . collect ( ) )
4456
- }
4456
+ ExprKind :: Tup ( ref elts) => hir:: ExprKind :: Tup ( self . lower_exprs ( elts) ) ,
4457
4457
ExprKind :: Call ( ref f, ref args) => {
4458
4458
let f = P ( self . lower_expr ( f) ) ;
4459
- hir:: ExprKind :: Call ( f, args . iter ( ) . map ( |x| self . lower_expr ( x ) ) . collect ( ) )
4459
+ hir:: ExprKind :: Call ( f, self . lower_exprs ( args ) )
4460
4460
}
4461
4461
ExprKind :: MethodCall ( ref seg, ref args) => {
4462
4462
let hir_seg = P ( self . lower_path_segment (
@@ -4468,7 +4468,7 @@ impl<'a> LoweringContext<'a> {
4468
4468
ImplTraitContext :: disallowed ( ) ,
4469
4469
None ,
4470
4470
) ) ;
4471
- let args = args . iter ( ) . map ( |x| self . lower_expr ( x ) ) . collect ( ) ;
4471
+ let args = self . lower_exprs ( args ) ;
4472
4472
hir:: ExprKind :: MethodCall ( hir_seg, seg. ident . span , args)
4473
4473
}
4474
4474
ExprKind :: Binary ( binop, ref lhs, ref rhs) => {
@@ -5042,17 +5042,9 @@ impl<'a> LoweringContext<'a> {
5042
5042
) ) ;
5043
5043
let arms = hir_vec ! [ pat_arm, break_arm] ;
5044
5044
5045
- P ( self . expr (
5046
- head_sp,
5047
- hir:: ExprKind :: Match (
5048
- next_expr,
5049
- arms,
5050
- hir:: MatchSource :: ForLoopDesugar
5051
- ) ,
5052
- ThinVec :: new ( ) ,
5053
- ) )
5045
+ self . expr_match ( head_sp, next_expr, arms, hir:: MatchSource :: ForLoopDesugar )
5054
5046
} ;
5055
- let match_stmt = self . stmt ( head_sp, hir :: StmtKind :: Expr ( match_expr) ) ;
5047
+ let match_stmt = self . stmt_expr ( head_sp, match_expr) ;
5056
5048
5057
5049
let next_expr = P ( self . expr_ident ( head_sp, next_ident, next_pat_hid) ) ;
5058
5050
@@ -5076,8 +5068,8 @@ impl<'a> LoweringContext<'a> {
5076
5068
) ;
5077
5069
5078
5070
let body_block = self . with_loop_scope ( e. id , |this| this. lower_block ( body, false ) ) ;
5079
- let body_expr = P ( self . expr_block ( body_block, ThinVec :: new ( ) ) ) ;
5080
- let body_stmt = self . stmt ( body. span , hir :: StmtKind :: Expr ( body_expr) ) ;
5071
+ let body_expr = self . expr_block ( body_block, ThinVec :: new ( ) ) ;
5072
+ let body_stmt = self . stmt_expr ( body. span , body_expr) ;
5081
5073
5082
5074
let loop_block = P ( self . block_all (
5083
5075
e. span ,
@@ -5120,8 +5112,10 @@ impl<'a> LoweringContext<'a> {
5120
5112
) ) ;
5121
5113
5122
5114
// This is effectively `{ let _result = ...; _result }`.
5123
- // The construct was introduced in #21984.
5124
- // FIXME(60253): Is this still necessary?
5115
+ // The construct was introduced in #21984 and is necessary to make sure that
5116
+ // temporaries in the `head` expression are dropped and do not leak to the
5117
+ // surrounding scope of the `match` since the `match` is not a terminating scope.
5118
+ //
5125
5119
// Also, add the attributes to the outer returned expr node.
5126
5120
return self . expr_drop_temps ( head_sp, match_expr, e. attrs . clone ( ) )
5127
5121
}
@@ -5247,7 +5241,7 @@ impl<'a> LoweringContext<'a> {
5247
5241
}
5248
5242
5249
5243
fn lower_stmt ( & mut self , s : & Stmt ) -> SmallVec < [ hir:: Stmt ; 1 ] > {
5250
- smallvec ! [ match s. node {
5244
+ let node = match s. node {
5251
5245
StmtKind :: Local ( ref l) => {
5252
5246
let ( l, item_ids) = self . lower_local ( l) ;
5253
5247
let mut ids: SmallVec < [ hir:: Stmt ; 1 ] > = item_ids
@@ -5284,21 +5278,14 @@ impl<'a> LoweringContext<'a> {
5284
5278
} )
5285
5279
. collect ( ) ;
5286
5280
}
5287
- StmtKind :: Expr ( ref e) => {
5288
- hir:: Stmt {
5289
- hir_id: self . lower_node_id( s. id) ,
5290
- node: hir:: StmtKind :: Expr ( P ( self . lower_expr( e) ) ) ,
5291
- span: s. span,
5292
- }
5293
- } ,
5294
- StmtKind :: Semi ( ref e) => {
5295
- hir:: Stmt {
5296
- hir_id: self . lower_node_id( s. id) ,
5297
- node: hir:: StmtKind :: Semi ( P ( self . lower_expr( e) ) ) ,
5298
- span: s. span,
5299
- }
5300
- } ,
5281
+ StmtKind :: Expr ( ref e) => hir:: StmtKind :: Expr ( P ( self . lower_expr ( e) ) ) ,
5282
+ StmtKind :: Semi ( ref e) => hir:: StmtKind :: Semi ( P ( self . lower_expr ( e) ) ) ,
5301
5283
StmtKind :: Mac ( ..) => panic ! ( "Shouldn't exist here" ) ,
5284
+ } ;
5285
+ smallvec ! [ hir:: Stmt {
5286
+ hir_id: self . lower_node_id( s. id) ,
5287
+ node,
5288
+ span: s. span,
5302
5289
} ]
5303
5290
}
5304
5291
@@ -5560,6 +5547,10 @@ impl<'a> LoweringContext<'a> {
5560
5547
hir:: Stmt { span, node, hir_id : self . next_id ( ) }
5561
5548
}
5562
5549
5550
+ fn stmt_expr ( & mut self , span : Span , expr : hir:: Expr ) -> hir:: Stmt {
5551
+ self . stmt ( span, hir:: StmtKind :: Expr ( P ( expr) ) )
5552
+ }
5553
+
5563
5554
fn stmt_let_pat (
5564
5555
& mut self ,
5565
5556
attrs : ThinVec < Attribute > ,
@@ -6053,23 +6044,23 @@ impl<'a> LoweringContext<'a> {
6053
6044
} ;
6054
6045
6055
6046
let match_stmt = {
6056
- let match_expr = P ( self . expr_match (
6047
+ let match_expr = self . expr_match (
6057
6048
span,
6058
6049
poll_expr,
6059
6050
hir_vec ! [ ready_arm, pending_arm] ,
6060
6051
hir:: MatchSource :: AwaitDesugar ,
6061
- ) ) ;
6062
- self . stmt ( span, hir :: StmtKind :: Expr ( match_expr) )
6052
+ ) ;
6053
+ self . stmt_expr ( span, match_expr)
6063
6054
} ;
6064
6055
6065
6056
let yield_stmt = {
6066
6057
let unit = self . expr_unit ( span) ;
6067
- let yield_expr = P ( self . expr (
6058
+ let yield_expr = self . expr (
6068
6059
span,
6069
6060
hir:: ExprKind :: Yield ( P ( unit) , hir:: YieldSource :: Await ) ,
6070
6061
ThinVec :: new ( ) ,
6071
- ) ) ;
6072
- self . stmt ( span, hir :: StmtKind :: Expr ( yield_expr) )
6062
+ ) ;
6063
+ self . stmt_expr ( span, yield_expr)
6073
6064
} ;
6074
6065
6075
6066
let loop_block = P ( self . block_all (
0 commit comments