From 1549c2d51e128825f6ecd92ae1cd88dd4a0ae02b Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Tue, 15 Nov 2016 15:20:10 +0100 Subject: [PATCH] erase all lifetimes from function types before creating pointers to them --- src/interpreter/mod.rs | 3 +++ src/interpreter/vtable.rs | 5 +++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/interpreter/mod.rs b/src/interpreter/mod.rs index 791466f6908..a431a7111a1 100644 --- a/src/interpreter/mod.rs +++ b/src/interpreter/mod.rs @@ -654,6 +654,7 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> { ReifyFnPointer => match self.operand_ty(operand).sty { ty::TyFnDef(def_id, substs, fn_ty) => { + let fn_ty = self.tcx.erase_regions(&fn_ty); let fn_ptr = self.memory.create_fn_ptr(def_id, substs, fn_ty); self.write_value(Value::ByVal(PrimVal::from_fn_ptr(fn_ptr)), dest, dest_ty)?; }, @@ -665,6 +666,7 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> { let src = self.eval_operand(operand)?; let ptr = src.read_ptr(&self.memory)?; let (def_id, substs, _) = self.memory.get_fn(ptr.alloc_id)?; + let unsafe_fn_ty = self.tcx.erase_regions(&unsafe_fn_ty); let fn_ptr = self.memory.create_fn_ptr(def_id, substs, unsafe_fn_ty); self.write_value(Value::ByVal(PrimVal::from_fn_ptr(fn_ptr)), dest, dest_ty)?; }, @@ -1390,6 +1392,7 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> { ty::TyFloat(FloatTy::F64) => PrimVal::from_f64(self.memory.read_f64(ptr)?), ty::TyFnDef(def_id, substs, fn_ty) => { + let fn_ty = self.tcx.erase_regions(&fn_ty); PrimVal::from_fn_ptr(self.memory.create_fn_ptr(def_id, substs, fn_ty)) }, ty::TyFnPtr(_) => self.memory.read_ptr(ptr).map(PrimVal::from_fn_ptr)?, diff --git a/src/interpreter/vtable.rs b/src/interpreter/vtable.rs index 73208727240..9892da0bdb5 100644 --- a/src/interpreter/vtable.rs +++ b/src/interpreter/vtable.rs @@ -35,7 +35,8 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> { self.get_vtable_methods(id, substs) .into_iter() .map(|opt_mth| opt_mth.map(|mth| { - self.memory.create_fn_ptr(mth.method.def_id, mth.substs, mth.method.fty) + let fn_ty = self.tcx.erase_regions(&mth.method.fty); + self.memory.create_fn_ptr(mth.method.def_id, mth.substs, fn_ty) })) .collect::>() .into_iter() @@ -90,7 +91,7 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> { if let Some(drop_def_id) = adt_def.destructor() { let ty_scheme = self.tcx.lookup_item_type(drop_def_id); let fn_ty = match ty_scheme.ty.sty { - ty::TyFnDef(_, _, fn_ty) => fn_ty, + ty::TyFnDef(_, _, fn_ty) => self.tcx.erase_regions(&fn_ty), _ => bug!("drop method is not a TyFnDef"), }; let fn_ptr = self.memory.create_fn_ptr(drop_def_id, substs, fn_ty);