@@ -593,38 +593,6 @@ impl<'rt, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> ValidityVisitor<'rt, 'mir, '
593593 self . check_safe_pointer ( value, "reference" ) ?;
594594 Ok ( true )
595595 }
596- ty::Adt(def, ..) if def.is_box() => {
597- // Box is special, very special. We carefully assert all the assumptions we make
598- // here; if this needs to be adjusted, remember to also adjust all the other
599- // visitors -- in particular the Stacked Borrows retagging visitor in Miri.
600- // Did I mention that this is a gross hack? Anyway...
601-
602- // `Box` has two fields: the pointer we care about, and the allocator.
603- assert_eq!(value.layout.fields.count(), 2, "`Box` must have exactly 2 fields");
604- let (unique_ptr, alloc) =
605- (self.ecx.operand_field(value, 0)?, self.ecx.operand_field(value, 1)?);
606- // Unfortunately there is some type junk in the way here: `unique_ptr` is a `Unique`...
607- // (which means another 2 fields, the second of which is a `PhantomData`)
608- assert_eq!(unique_ptr.layout.fields.count(), 2);
609- let (nonnull_ptr, phantom) = (
610- self.ecx.operand_field(&unique_ptr, 0)?,
611- self.ecx.operand_field(&unique_ptr, 1)?,
612- );
613- assert!(
614- phantom.layout.ty.ty_adt_def().is_some_and(|adt| adt.is_phantom_data()),
615- "2nd field of `Unique` should be PhantomData but is {:?}",
616- phantom.layout.ty,
617- );
618- // ... that contains a `NonNull`... (gladly, only a single field here)
619- assert_eq!(nonnull_ptr.layout.fields.count(), 1);
620- let raw_ptr = self.ecx.operand_field(&nonnull_ptr, 0)?; // the actual raw ptr
621- // ... whose only field finally is a raw ptr we can dereference.
622- self.check_safe_pointer(&raw_ptr, "box")?;
623- // The second `Box` field is the allocator, which we recursively check for validity
624- // like in regular structs.
625- self.walk_value(&alloc)?;
626- Ok(true)
627- }
628596 ty:: FnPtr ( _sig) => {
629597 let value = try_validation ! (
630598 self . ecx. read_scalar( value) . and_then( |v| v. check_init( ) ) ,
@@ -835,6 +803,12 @@ impl<'rt, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> ValueVisitor<'mir, 'tcx, M>
835803 Ok ( ( ) )
836804 }
837805
806+ #[ inline]
807+ fn visit_box ( & mut self , op : & OpTy < ' tcx , M :: PointerTag > ) -> InterpResult < ' tcx > {
808+ self . check_safe_pointer ( op, "box" ) ?;
809+ Ok ( ( ) )
810+ }
811+
838812 #[ inline]
839813 fn visit_value ( & mut self , op : & OpTy < ' tcx , M :: PointerTag > ) -> InterpResult < ' tcx > {
840814 trace ! ( "visit_value: {:?}, {:?}" , * op, op. layout) ;
@@ -843,8 +817,6 @@ impl<'rt, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> ValueVisitor<'mir, 'tcx, M>
843817 if self . try_visit_primitive ( op) ? {
844818 return Ok ( ( ) ) ;
845819 }
846- // Sanity check: `builtin_deref` does not know any pointers that are not primitive.
847- assert!(op.layout.ty.builtin_deref(true).is_none());
848820
849821 // Special check preventing `UnsafeCell` in the inner part of constants
850822 if let Some ( def) = op. layout . ty . ty_adt_def ( ) {
0 commit comments