From bd6e52d831769ccf86d1bbd66444f13c800cac7e Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Fri, 4 Nov 2016 16:37:12 +0100 Subject: [PATCH] fix the `drop_in_place` intrinsic for fat pointers --- src/interpreter/terminator/intrinsics.rs | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/interpreter/terminator/intrinsics.rs b/src/interpreter/terminator/intrinsics.rs index 71fb83d580e4..f6dc8778a5f3 100644 --- a/src/interpreter/terminator/intrinsics.rs +++ b/src/interpreter/terminator/intrinsics.rs @@ -123,9 +123,20 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> { "drop_in_place" => { let ty = substs.type_at(0); - let ptr = arg_vals[0].read_ptr(&self.memory)?; + let ptr_ty = self.tcx.mk_mut_ptr(ty); + let lvalue = match self.follow_by_ref_value(arg_vals[0], ptr_ty)? { + Value::ByRef(_) => bug!("follow_by_ref_value returned ByRef"), + Value::ByVal(ptr) => Lvalue::from_ptr(ptr.expect_ptr("drop_in_place first arg not a pointer")), + Value::ByValPair(ptr, extra) => Lvalue::Ptr { + ptr: ptr.expect_ptr("drop_in_place first arg not a pointer"), + extra: match extra.try_as_ptr() { + Some(vtable) => LvalueExtra::Vtable(vtable), + None => LvalueExtra::Length(extra.expect_uint("either pointer or not, but not neither")), + }, + }, + }; let mut drops = Vec::new(); - self.drop(Lvalue::from_ptr(ptr), ty, &mut drops)?; + self.drop(lvalue, ty, &mut drops)?; self.eval_drop_impls(drops)?; }