diff options
| author | bors <bors@rust-lang.org> | 2022-06-21 11:00:39 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2022-06-21 11:00:39 +0000 |
| commit | a25b1315ee968146a5b206a8f3c670c5b307ebfe (patch) | |
| tree | 725cc7bfd11f72a19a2ac5d0212dcb83cfe7ed37 /compiler/rustc_mir_dataflow | |
| parent | abace0a1f17986d89aedf610819deab2b4afee56 (diff) | |
| parent | 28ff0df6ede91c8bfadb29d5f966cff15b15c9df (diff) | |
| download | rust-a25b1315ee968146a5b206a8f3c670c5b307ebfe.tar.gz rust-a25b1315ee968146a5b206a8f3c670c5b307ebfe.zip | |
Auto merge of #95576 - DrMeepster:box_erasure, r=oli-obk
Remove dereferencing of Box from codegen Through #94043, #94414, #94873, and #95328, I've been fixing issues caused by Box being treated like a pointer when it is not a pointer. However, these PRs just introduced special cases for Box. This PR removes those special cases and instead transforms a deref of Box into a deref of the pointer it contains. Hopefully, this is the end of the Box<T, A> ICEs.
Diffstat (limited to 'compiler/rustc_mir_dataflow')
| -rw-r--r-- | compiler/rustc_mir_dataflow/src/elaborate_drops.rs | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/compiler/rustc_mir_dataflow/src/elaborate_drops.rs b/compiler/rustc_mir_dataflow/src/elaborate_drops.rs index 8d16c5f22c3..c0b0cc3c591 100644 --- a/compiler/rustc_mir_dataflow/src/elaborate_drops.rs +++ b/compiler/rustc_mir_dataflow/src/elaborate_drops.rs @@ -410,7 +410,18 @@ where fn open_drop_for_box(&mut self, adt: ty::AdtDef<'tcx>, substs: SubstsRef<'tcx>) -> BasicBlock { debug!("open_drop_for_box({:?}, {:?}, {:?})", self, adt, substs); - let interior = self.tcx().mk_place_deref(self.place); + // drop glue is sent straight to codegen + // box cannot be directly dereferenced + let unique_ty = adt.non_enum_variant().fields[0].ty(self.tcx(), substs); + let nonnull_ty = + unique_ty.ty_adt_def().unwrap().non_enum_variant().fields[0].ty(self.tcx(), substs); + let ptr_ty = self.tcx().mk_imm_ptr(substs[0].expect_ty()); + + let unique_place = self.tcx().mk_place_field(self.place, Field::new(0), unique_ty); + let nonnull_place = self.tcx().mk_place_field(unique_place, Field::new(0), nonnull_ty); + let ptr_place = self.tcx().mk_place_field(nonnull_place, Field::new(0), ptr_ty); + let interior = self.tcx().mk_place_deref(ptr_place); + let interior_path = self.elaborator.deref_subpath(self.path); let succ = self.box_free_block(adt, substs, self.succ, self.unwind); |
