diff options
| author | Dylan DPC <99973273+Dylan-DPC@users.noreply.github.com> | 2022-06-29 17:59:35 +0530 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-06-29 17:59:35 +0530 |
| commit | b2836bd34c34b60de93e6bc1c548bb9349b4dfea (patch) | |
| tree | ecad7547e5b6c3005b4e25256015c13d52bcbda9 | |
| parent | 375ab3e44f721bb65f7cf975de06b2daf52c8563 (diff) | |
| parent | 9039265c308fccf6599080db51e6db103ecaf5ad (diff) | |
| download | rust-b2836bd34c34b60de93e6bc1c548bb9349b4dfea.tar.gz rust-b2836bd34c34b60de93e6bc1c548bb9349b4dfea.zip | |
Rollup merge of #98554 - DrMeepster:box_unsizing_is_not_special, r=RalfJung
Fix box with custom allocator in miri This should fix the failures in https://github.com/rust-lang/miri/pull/2072 and https://github.com/rust-lang/rust/pull/98510. cc ```@RalfJung```
| -rw-r--r-- | compiler/rustc_const_eval/src/interpret/cast.rs | 16 | ||||
| -rw-r--r-- | compiler/rustc_const_eval/src/interpret/validity.rs | 8 |
2 files changed, 7 insertions, 17 deletions
diff --git a/compiler/rustc_const_eval/src/interpret/cast.rs b/compiler/rustc_const_eval/src/interpret/cast.rs index fb484fba9fd..076415b2d1b 100644 --- a/compiler/rustc_const_eval/src/interpret/cast.rs +++ b/compiler/rustc_const_eval/src/interpret/cast.rs @@ -366,22 +366,6 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { } (&ty::Adt(def_a, _), &ty::Adt(def_b, _)) => { assert_eq!(def_a, def_b); - if def_a.is_box() || def_b.is_box() { - if !def_a.is_box() || !def_b.is_box() { - span_bug!( - self.cur_span(), - "invalid unsizing between {:?} -> {:?}", - src.layout.ty, - cast_ty.ty - ); - } - return self.unsize_into_ptr( - src, - dest, - src.layout.ty.boxed_ty(), - cast_ty.ty.boxed_ty(), - ); - } // unsizing of generic struct with pointer fields // Example: `Arc<T>` -> `Arc<Trait>` diff --git a/compiler/rustc_const_eval/src/interpret/validity.rs b/compiler/rustc_const_eval/src/interpret/validity.rs index 630281bb092..905ab6cb578 100644 --- a/compiler/rustc_const_eval/src/interpret/validity.rs +++ b/compiler/rustc_const_eval/src/interpret/validity.rs @@ -594,7 +594,13 @@ impl<'rt, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> ValidityVisitor<'rt, 'mir, ' Ok(true) } ty::Adt(def, ..) if def.is_box() => { - self.check_safe_pointer(value, "box")?; + let unique = self.ecx.operand_field(value, 0)?; + let nonnull = self.ecx.operand_field(&unique, 0)?; + let ptr = self.ecx.operand_field(&nonnull, 0)?; + self.check_safe_pointer(&ptr, "box")?; + + // Check other fields of Box + self.walk_value(value)?; Ok(true) } ty::FnPtr(_sig) => { |
