about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--compiler/rustc_mir_build/src/check_unsafety.rs34
1 files changed, 14 insertions, 20 deletions
diff --git a/compiler/rustc_mir_build/src/check_unsafety.rs b/compiler/rustc_mir_build/src/check_unsafety.rs
index bd9535eedda..3bb1f51650a 100644
--- a/compiler/rustc_mir_build/src/check_unsafety.rs
+++ b/compiler/rustc_mir_build/src/check_unsafety.rs
@@ -132,6 +132,18 @@ impl<'tcx> UnsafetyVisitor<'_, 'tcx> {
     fn unsafe_op_in_unsafe_fn_allowed(&self) -> bool {
         self.tcx.lint_level_at_node(UNSAFE_OP_IN_UNSAFE_FN, self.hir_context).0 == Level::Allow
     }
+
+    /// Handle closures/generators/inline-consts, which is unsafecked with their parent body.
+    fn visit_inner_body(&mut self, def: ty::WithOptConstParam<LocalDefId>) {
+        if let Ok((inner_thir, expr)) = self.tcx.thir_body(def) {
+            let inner_thir = &inner_thir.borrow();
+            let hir_context = self.tcx.hir().local_def_id_to_hir_id(def.did);
+            let mut inner_visitor = UnsafetyVisitor { thir: inner_thir, hir_context, ..*self };
+            inner_visitor.visit_expr(&inner_thir[expr]);
+            // Unsafe blocks can be used in the inner body, make sure to take it into account
+            self.safety_context = inner_visitor.safety_context;
+        }
+    }
 }
 
 // Searches for accesses to layout constrained fields.
@@ -408,29 +420,11 @@ impl<'a, 'tcx> Visitor<'a, 'tcx> for UnsafetyVisitor<'a, 'tcx> {
                 } else {
                     ty::WithOptConstParam::unknown(closure_id)
                 };
-                if let Ok((closure_thir, expr)) = self.tcx.thir_body(closure_def) {
-                    let closure_thir = &closure_thir.borrow();
-                    let hir_context = self.tcx.hir().local_def_id_to_hir_id(closure_id);
-                    let mut closure_visitor =
-                        UnsafetyVisitor { thir: closure_thir, hir_context, ..*self };
-                    closure_visitor.visit_expr(&closure_thir[expr]);
-                    // Unsafe blocks can be used in closures, make sure to take it into account
-                    self.safety_context = closure_visitor.safety_context;
-                }
+                self.visit_inner_body(closure_def);
             }
             ExprKind::ConstBlock { did, substs: _ } => {
                 let def_id = did.expect_local();
-                if let Ok((inner_thir, expr)) =
-                    self.tcx.thir_body(ty::WithOptConstParam::unknown(def_id))
-                {
-                    let inner_thir = &inner_thir.borrow();
-                    let hir_context = self.tcx.hir().local_def_id_to_hir_id(def_id);
-                    let mut inner_visitor =
-                        UnsafetyVisitor { thir: inner_thir, hir_context, ..*self };
-                    inner_visitor.visit_expr(&inner_thir[expr]);
-                    // Unsafe blocks can be used in inline consts, make sure to take it into account
-                    self.safety_context = inner_visitor.safety_context;
-                }
+                self.visit_inner_body(ty::WithOptConstParam::unknown(def_id));
             }
             ExprKind::Field { lhs, .. } => {
                 let lhs = &self.thir[lhs];