From 0447b5091ce6290e5584e6897942fb4ee243a1c9 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Mon, 20 Aug 2018 21:11:35 +0200 Subject: [PATCH] fix array drop glue: properly turn raw ptr into reference --- src/librustc_mir/util/elaborate_drops.rs | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/librustc_mir/util/elaborate_drops.rs b/src/librustc_mir/util/elaborate_drops.rs index bbffeec631a..fd780c6ec15 100644 --- a/src/librustc_mir/util/elaborate_drops.rs +++ b/src/librustc_mir/util/elaborate_drops.rs @@ -562,7 +562,7 @@ fn destructor_call_block<'a>(&mut self, (succ, unwind): (BasicBlock, Unwind)) /// if can_go then succ else drop-block /// drop-block: /// if ptr_based { - /// ptr = cur + /// ptr = &mut *cur /// cur = cur.offset(1) /// } else { /// ptr = &mut P[cur] @@ -591,7 +591,14 @@ fn drop_loop(&mut self, let one = self.constant_usize(1); let (ptr_next, cur_next) = if ptr_based { - (Rvalue::Use(copy(&Place::Local(cur))), + (Rvalue::Ref( + tcx.types.re_erased, + BorrowKind::Mut { allow_two_phase_borrow: false }, + Place::Projection(Box::new(Projection { + base: Place::Local(cur), + elem: ProjectionElem::Deref, + })) + ), Rvalue::BinaryOp(BinOp::Offset, copy(&Place::Local(cur)), one)) } else { (Rvalue::Ref( @@ -736,7 +743,7 @@ fn drop_loop_pair(&mut self, ety: Ty<'tcx>, ptr_based: bool) -> BasicBlock { if ptr_based { let tmp_ty = tcx.mk_mut_ptr(self.place_ty(self.place)); let tmp = Place::Local(self.new_temp(tmp_ty)); - // tmp = &P; + // tmp = &mut P; // cur = tmp as *mut T; // end = Offset(cur, len); drop_block_stmts.push(self.assign(&tmp, Rvalue::Ref( -- GitLab