]> git.lizzy.rs Git - rust.git/commitdiff
Box `thir::ExprKind::Closure`.
authorNicholas Nethercote <n.nethercote@gmail.com>
Wed, 24 Aug 2022 01:28:05 +0000 (11:28 +1000)
committerNicholas Nethercote <n.nethercote@gmail.com>
Wed, 24 Aug 2022 05:06:50 +0000 (15:06 +1000)
This shrinks `thir::Expr`.

compiler/rustc_middle/src/thir.rs
compiler/rustc_middle/src/thir/visit.rs
compiler/rustc_mir_build/src/build/expr/as_rvalue.rs
compiler/rustc_mir_build/src/check_unsafety.rs
compiler/rustc_mir_build/src/thir/cx/expr.rs

index b55268d07526f6faeea4b104a0b721ab97fe94b1..73449cc179a1a9413b9039c589ca6e0851c2e64e 100644 (file)
@@ -124,6 +124,15 @@ pub struct Adt<'tcx> {
     pub base: Option<FruInfo<'tcx>>,
 }
 
+#[derive(Clone, Debug, HashStable)]
+pub struct ClosureExpr<'tcx> {
+    pub closure_id: LocalDefId,
+    pub substs: UpvarSubsts<'tcx>,
+    pub upvars: Box<[ExprId]>,
+    pub movability: Option<hir::Movability>,
+    pub fake_reads: Vec<(ExprId, FakeReadCause, hir::HirId)>,
+}
+
 #[derive(Copy, Clone, Debug, HashStable)]
 pub enum BlockSafety {
     Safe,
@@ -387,13 +396,7 @@ pub enum ExprKind<'tcx> {
         user_ty: UserTy<'tcx>,
     },
     /// A closure definition.
-    Closure {
-        closure_id: LocalDefId,
-        substs: UpvarSubsts<'tcx>,
-        upvars: Box<[ExprId]>,
-        movability: Option<hir::Movability>,
-        fake_reads: Vec<(ExprId, FakeReadCause, hir::HirId)>,
-    },
+    Closure(Box<ClosureExpr<'tcx>>),
     /// A literal.
     Literal {
         lit: &'tcx hir::Lit,
@@ -801,7 +804,7 @@ mod size_asserts {
     use super::*;
     // These are in alphabetical order, which is easy to maintain.
     static_assert_size!(Block, 56);
-    static_assert_size!(Expr<'_>, 88);
+    static_assert_size!(Expr<'_>, 80);
     static_assert_size!(Pat<'_>, 24);
     static_assert_size!(Stmt<'_>, 72);
 }
index 758a42ea320f83ce30386a5579612bd5d37dc5d9..baa07d8ef0aa3ea81713a12fead07c4dfbe1328a 100644 (file)
@@ -1,5 +1,6 @@
 use super::{
-    Arm, Block, Expr, ExprKind, Guard, InlineAsmOperand, Pat, PatKind, Stmt, StmtKind, Thir,
+    Arm, Block, ClosureExpr, Expr, ExprKind, Guard, InlineAsmOperand, Pat, PatKind, Stmt, StmtKind,
+    Thir,
 };
 
 pub trait Visitor<'a, 'tcx: 'a>: Sized {
@@ -126,7 +127,13 @@ pub fn walk_expr<'a, 'tcx: 'a, V: Visitor<'a, 'tcx>>(visitor: &mut V, expr: &Exp
         PlaceTypeAscription { source, user_ty: _ } | ValueTypeAscription { source, user_ty: _ } => {
             visitor.visit_expr(&visitor.thir()[source])
         }
-        Closure { closure_id: _, substs: _, upvars: _, movability: _, fake_reads: _ } => {}
+        Closure(box ClosureExpr {
+            closure_id: _,
+            substs: _,
+            upvars: _,
+            movability: _,
+            fake_reads: _,
+        }) => {}
         Literal { lit: _, neg: _ } => {}
         NonHirLiteral { lit: _, user_ty: _ } => {}
         ZstLiteral { user_ty: _ } => {}
index 15f2d17c4e08b2ddc45d181ea9f89d0a2c408cfa..4b232a1b515302fa1317dba9d2cc921d4026a501 100644 (file)
@@ -302,7 +302,13 @@ pub(crate) fn as_rvalue(
 
                 block.and(Rvalue::Aggregate(Box::new(AggregateKind::Tuple), fields))
             }
-            ExprKind::Closure { closure_id, substs, ref upvars, movability, ref fake_reads } => {
+            ExprKind::Closure(box ClosureExpr {
+                closure_id,
+                substs,
+                ref upvars,
+                movability,
+                ref fake_reads,
+            }) => {
                 // Convert the closure fake reads, if any, from `ExprRef` to mir `Place`
                 // and push the fake reads.
                 // This must come before creating the operands. This is required in case
index f0b0456c4b9610a7e2bec3488188d0266726c55a..6564c526c5be4dcfc5e2cada71e34f840d093691 100644 (file)
@@ -402,13 +402,13 @@ fn visit_expr(&mut self, expr: &Expr<'tcx>) {
                 (Bound::Unbounded, Bound::Unbounded) => {}
                 _ => self.requires_unsafe(expr.span, InitializingTypeWith),
             },
-            ExprKind::Closure {
+            ExprKind::Closure(box ClosureExpr {
                 closure_id,
                 substs: _,
                 upvars: _,
                 movability: _,
                 fake_reads: _,
-            } => {
+            }) => {
                 let closure_def = if let Some((did, const_param_id)) =
                     ty::WithOptConstParam::try_lookup(closure_id, self.tcx)
                 {
index 5e1f1c8e84e818bb07270ec425cb9900a70aa88a..a742e2f2647748318882185cf6bac14a27f7f8ac 100644 (file)
@@ -548,7 +548,13 @@ fn make_mirror_unadjusted(&mut self, expr: &'tcx hir::Expr<'tcx>) -> Expr<'tcx>
                     None => Vec::new(),
                 };
 
-                ExprKind::Closure { closure_id: def_id, substs, upvars, movability, fake_reads }
+                ExprKind::Closure(Box::new(ClosureExpr {
+                    closure_id: def_id,
+                    substs,
+                    upvars,
+                    movability,
+                    fake_reads,
+                }))
             }
 
             hir::ExprKind::Path(ref qpath) => {