From 09ccc63624f627e44f13c480c934b4d28a845258 Mon Sep 17 00:00:00 2001 From: DrMeepster <19316085+DrMeepster@users.noreply.github.com> Date: Sun, 27 Mar 2022 13:35:29 -0700 Subject: fix other source of box deref --- compiler/rustc_codegen_ssa/src/mir/place.rs | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) (limited to 'compiler/rustc_codegen_ssa') diff --git a/compiler/rustc_codegen_ssa/src/mir/place.rs b/compiler/rustc_codegen_ssa/src/mir/place.rs index be8b0f3c991..17cfb6c5dfb 100644 --- a/compiler/rustc_codegen_ssa/src/mir/place.rs +++ b/compiler/rustc_codegen_ssa/src/mir/place.rs @@ -441,11 +441,19 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> { .find(|elem| matches!(elem.1, mir::ProjectionElem::Deref)) { base = elem.0 + 1; - self.codegen_consume( + let cg_base = self.codegen_consume( bx, mir::PlaceRef { projection: &place_ref.projection[..elem.0], ..place_ref }, - ) - .deref(bx.cx()) + ); + + // a box with a non-zst allocator should not be directly dereferenced + if cg_base.layout.ty.is_box() && !cg_base.layout.field(cx, 1).is_zst() { + let ptr = cg_base.extract_field(bx, 0).extract_field(bx, 0); + + ptr.deref(bx.cx()) + } else { + cg_base.deref(bx.cx()) + } } else { bug!("using operand local {:?} as place", place_ref); } -- cgit 1.4.1-3-g733a5