@@ -4447,23 +4447,23 @@ impl<'a> LoweringContext<'a> {
44474447 } )
44484448 }
44494449
4450+ fn lower_exprs ( & mut self , exprs : & [ AstP < Expr > ] ) -> HirVec < hir:: Expr > {
4451+ exprs. iter ( ) . map ( |x| self . lower_expr ( x) ) . collect ( )
4452+ }
4453+
44504454 fn lower_expr ( & mut self , e : & Expr ) -> hir:: Expr {
44514455 let kind = match e. node {
44524456 ExprKind :: Box ( ref inner) => hir:: ExprKind :: Box ( P ( self . lower_expr ( inner) ) ) ,
4453- ExprKind :: Array ( ref exprs) => {
4454- hir:: ExprKind :: Array ( exprs. iter ( ) . map ( |x| self . lower_expr ( x) ) . collect ( ) )
4455- }
4457+ ExprKind :: Array ( ref exprs) => hir:: ExprKind :: Array ( self . lower_exprs ( exprs) ) ,
44564458 ExprKind :: Repeat ( ref expr, ref count) => {
44574459 let expr = P ( self . lower_expr ( expr) ) ;
44584460 let count = self . lower_anon_const ( count) ;
44594461 hir:: ExprKind :: Repeat ( expr, count)
44604462 }
4461- ExprKind :: Tup ( ref elts) => {
4462- hir:: ExprKind :: Tup ( elts. iter ( ) . map ( |x| self . lower_expr ( x) ) . collect ( ) )
4463- }
4463+ ExprKind :: Tup ( ref elts) => hir:: ExprKind :: Tup ( self . lower_exprs ( elts) ) ,
44644464 ExprKind :: Call ( ref f, ref args) => {
44654465 let f = P ( self . lower_expr ( f) ) ;
4466- hir:: ExprKind :: Call ( f, args . iter ( ) . map ( |x| self . lower_expr ( x ) ) . collect ( ) )
4466+ hir:: ExprKind :: Call ( f, self . lower_exprs ( args ) )
44674467 }
44684468 ExprKind :: MethodCall ( ref seg, ref args) => {
44694469 let hir_seg = P ( self . lower_path_segment (
@@ -4475,7 +4475,7 @@ impl<'a> LoweringContext<'a> {
44754475 ImplTraitContext :: disallowed ( ) ,
44764476 None ,
44774477 ) ) ;
4478- let args = args . iter ( ) . map ( |x| self . lower_expr ( x ) ) . collect ( ) ;
4478+ let args = self . lower_exprs ( args ) ;
44794479 hir:: ExprKind :: MethodCall ( hir_seg, seg. ident . span , args)
44804480 }
44814481 ExprKind :: Binary ( binop, ref lhs, ref rhs) => {
@@ -5049,17 +5049,9 @@ impl<'a> LoweringContext<'a> {
50495049 ) ) ;
50505050 let arms = hir_vec ! [ pat_arm, break_arm] ;
50515051
5052- P ( self . expr (
5053- head_sp,
5054- hir:: ExprKind :: Match (
5055- next_expr,
5056- arms,
5057- hir:: MatchSource :: ForLoopDesugar
5058- ) ,
5059- ThinVec :: new ( ) ,
5060- ) )
5052+ self . expr_match ( head_sp, next_expr, arms, hir:: MatchSource :: ForLoopDesugar )
50615053 } ;
5062- let match_stmt = self . stmt ( head_sp, hir :: StmtKind :: Expr ( match_expr) ) ;
5054+ let match_stmt = self . stmt_expr ( head_sp, match_expr) ;
50635055
50645056 let next_expr = P ( self . expr_ident ( head_sp, next_ident, next_pat_hid) ) ;
50655057
@@ -5083,8 +5075,8 @@ impl<'a> LoweringContext<'a> {
50835075 ) ;
50845076
50855077 let body_block = self . with_loop_scope ( e. id , |this| this. lower_block ( body, false ) ) ;
5086- let body_expr = P ( self . expr_block ( body_block, ThinVec :: new ( ) ) ) ;
5087- let body_stmt = self . stmt ( body. span , hir :: StmtKind :: Expr ( body_expr) ) ;
5078+ let body_expr = self . expr_block ( body_block, ThinVec :: new ( ) ) ;
5079+ let body_stmt = self . stmt_expr ( body. span , body_expr) ;
50885080
50895081 let loop_block = P ( self . block_all (
50905082 e. span ,
@@ -5127,8 +5119,10 @@ impl<'a> LoweringContext<'a> {
51275119 ) ) ;
51285120
51295121 // This is effectively `{ let _result = ...; _result }`.
5130- // The construct was introduced in #21984.
5131- // FIXME(60253): Is this still necessary?
5122+ // The construct was introduced in #21984 and is necessary to make sure that
5123+ // temporaries in the `head` expression are dropped and do not leak to the
5124+ // surrounding scope of the `match` since the `match` is not a terminating scope.
5125+ //
51325126 // Also, add the attributes to the outer returned expr node.
51335127 return self . expr_drop_temps ( head_sp, match_expr, e. attrs . clone ( ) )
51345128 }
@@ -5254,7 +5248,7 @@ impl<'a> LoweringContext<'a> {
52545248 }
52555249
52565250 fn lower_stmt ( & mut self , s : & Stmt ) -> SmallVec < [ hir:: Stmt ; 1 ] > {
5257- smallvec ! [ match s. node {
5251+ let node = match s. node {
52585252 StmtKind :: Local ( ref l) => {
52595253 let ( l, item_ids) = self . lower_local ( l) ;
52605254 let mut ids: SmallVec < [ hir:: Stmt ; 1 ] > = item_ids
@@ -5291,21 +5285,14 @@ impl<'a> LoweringContext<'a> {
52915285 } )
52925286 . collect ( ) ;
52935287 }
5294- StmtKind :: Expr ( ref e) => {
5295- hir:: Stmt {
5296- hir_id: self . lower_node_id( s. id) ,
5297- node: hir:: StmtKind :: Expr ( P ( self . lower_expr( e) ) ) ,
5298- span: s. span,
5299- }
5300- } ,
5301- StmtKind :: Semi ( ref e) => {
5302- hir:: Stmt {
5303- hir_id: self . lower_node_id( s. id) ,
5304- node: hir:: StmtKind :: Semi ( P ( self . lower_expr( e) ) ) ,
5305- span: s. span,
5306- }
5307- } ,
5288+ StmtKind :: Expr ( ref e) => hir:: StmtKind :: Expr ( P ( self . lower_expr ( e) ) ) ,
5289+ StmtKind :: Semi ( ref e) => hir:: StmtKind :: Semi ( P ( self . lower_expr ( e) ) ) ,
53085290 StmtKind :: Mac ( ..) => panic ! ( "Shouldn't exist here" ) ,
5291+ } ;
5292+ smallvec ! [ hir:: Stmt {
5293+ hir_id: self . lower_node_id( s. id) ,
5294+ node,
5295+ span: s. span,
53095296 } ]
53105297 }
53115298
@@ -5567,6 +5554,10 @@ impl<'a> LoweringContext<'a> {
55675554 hir:: Stmt { span, node, hir_id : self . next_id ( ) }
55685555 }
55695556
5557+ fn stmt_expr ( & mut self , span : Span , expr : hir:: Expr ) -> hir:: Stmt {
5558+ self . stmt ( span, hir:: StmtKind :: Expr ( P ( expr) ) )
5559+ }
5560+
55705561 fn stmt_let_pat (
55715562 & mut self ,
55725563 attrs : ThinVec < Attribute > ,
@@ -6060,23 +6051,23 @@ impl<'a> LoweringContext<'a> {
60606051 } ;
60616052
60626053 let match_stmt = {
6063- let match_expr = P ( self . expr_match (
6054+ let match_expr = self . expr_match (
60646055 span,
60656056 poll_expr,
60666057 hir_vec ! [ ready_arm, pending_arm] ,
60676058 hir:: MatchSource :: AwaitDesugar ,
6068- ) ) ;
6069- self . stmt ( span, hir :: StmtKind :: Expr ( match_expr) )
6059+ ) ;
6060+ self . stmt_expr ( span, match_expr)
60706061 } ;
60716062
60726063 let yield_stmt = {
60736064 let unit = self . expr_unit ( span) ;
6074- let yield_expr = P ( self . expr (
6065+ let yield_expr = self . expr (
60756066 span,
60766067 hir:: ExprKind :: Yield ( P ( unit) , hir:: YieldSource :: Await ) ,
60776068 ThinVec :: new ( ) ,
6078- ) ) ;
6079- self . stmt ( span, hir :: StmtKind :: Expr ( yield_expr) )
6069+ ) ;
6070+ self . stmt_expr ( span, yield_expr)
60806071 } ;
60816072
60826073 let loop_block = P ( self . block_all (
0 commit comments