@@ -132,6 +132,18 @@ impl<'tcx> UnsafetyVisitor<'_, 'tcx> {
132
132
fn unsafe_op_in_unsafe_fn_allowed ( & self ) -> bool {
133
133
self . tcx . lint_level_at_node ( UNSAFE_OP_IN_UNSAFE_FN , self . hir_context ) . 0 == Level :: Allow
134
134
}
135
+
136
+ /// Handle closures/generators/inline-consts, which is unsafecked with their parent body.
137
+ fn visit_inner_body ( & mut self , def : ty:: WithOptConstParam < LocalDefId > ) {
138
+ if let Ok ( ( inner_thir, expr) ) = self . tcx . thir_body ( def) {
139
+ let inner_thir = & inner_thir. borrow ( ) ;
140
+ let hir_context = self . tcx . hir ( ) . local_def_id_to_hir_id ( def. did ) ;
141
+ let mut inner_visitor = UnsafetyVisitor { thir : inner_thir, hir_context, ..* self } ;
142
+ inner_visitor. visit_expr ( & inner_thir[ expr] ) ;
143
+ // Unsafe blocks can be used in the inner body, make sure to take it into account
144
+ self . safety_context = inner_visitor. safety_context ;
145
+ }
146
+ }
135
147
}
136
148
137
149
// Searches for accesses to layout constrained fields.
@@ -408,29 +420,11 @@ impl<'a, 'tcx> Visitor<'a, 'tcx> for UnsafetyVisitor<'a, 'tcx> {
408
420
} else {
409
421
ty:: WithOptConstParam :: unknown ( closure_id)
410
422
} ;
411
- if let Ok ( ( closure_thir, expr) ) = self . tcx . thir_body ( closure_def) {
412
- let closure_thir = & closure_thir. borrow ( ) ;
413
- let hir_context = self . tcx . hir ( ) . local_def_id_to_hir_id ( closure_id) ;
414
- let mut closure_visitor =
415
- UnsafetyVisitor { thir : closure_thir, hir_context, ..* self } ;
416
- closure_visitor. visit_expr ( & closure_thir[ expr] ) ;
417
- // Unsafe blocks can be used in closures, make sure to take it into account
418
- self . safety_context = closure_visitor. safety_context ;
419
- }
423
+ self . visit_inner_body ( closure_def) ;
420
424
}
421
425
ExprKind :: ConstBlock { did, substs : _ } => {
422
426
let def_id = did. expect_local ( ) ;
423
- if let Ok ( ( inner_thir, expr) ) =
424
- self . tcx . thir_body ( ty:: WithOptConstParam :: unknown ( def_id) )
425
- {
426
- let inner_thir = & inner_thir. borrow ( ) ;
427
- let hir_context = self . tcx . hir ( ) . local_def_id_to_hir_id ( def_id) ;
428
- let mut inner_visitor =
429
- UnsafetyVisitor { thir : inner_thir, hir_context, ..* self } ;
430
- inner_visitor. visit_expr ( & inner_thir[ expr] ) ;
431
- // Unsafe blocks can be used in inline consts, make sure to take it into account
432
- self . safety_context = inner_visitor. safety_context ;
433
- }
427
+ self . visit_inner_body ( ty:: WithOptConstParam :: unknown ( def_id) ) ;
434
428
}
435
429
ExprKind :: Field { lhs, .. } => {
436
430
let lhs = & self . thir [ lhs] ;
0 commit comments