]> git.lizzy.rs Git - rust.git/commitdiff
Fix casting generic functions to concrete function pointers
authorOliver Schneider <git-spam-no-reply9815368754983@oli-obk.de>
Thu, 23 Mar 2017 16:57:40 +0000 (17:57 +0100)
committerOliver Schneider <git-spam-no-reply9815368754983@oli-obk.de>
Thu, 23 Mar 2017 16:57:40 +0000 (17:57 +0100)
src/eval_context.rs
src/memory.rs
src/terminator/mod.rs

index f81f352c8aa094b69a7e606428991c9f441e7e21..5cd790797b471a5c9eec33feb80e5859b44d8e35 100644 (file)
@@ -825,7 +825,8 @@ pub(super) fn eval_rvalue_into_lvalue(
 
                     ReifyFnPointer => match self.operand_ty(operand).sty {
                         ty::TyFnDef(def_id, substs, _) => {
-                            let fn_ptr = self.memory.create_fn_ptr(def_id, substs);
+                            let instance = resolve(self.tcx, def_id, substs);
+                            let fn_ptr = self.memory.create_fn_alloc(instance);
                             self.write_value(Value::ByVal(PrimVal::Ptr(fn_ptr)), dest, dest_ty)?;
                         },
                         ref other => bug!("reify fn pointer on {:?}", other),
index 058f8b478cac415840b3ee78959f1091898aab98..3d46d710d3dd7501fd7ed5d910affc36045f0de0 100644 (file)
@@ -2,9 +2,7 @@
 use std::collections::{btree_map, BTreeMap, HashMap, HashSet, VecDeque, BTreeSet};
 use std::{fmt, iter, ptr, mem, io};
 
-use rustc::hir::def_id::DefId;
 use rustc::ty;
-use rustc::ty::subst::Substs;
 use rustc::ty::layout::{self, TargetDataLayout};
 
 use error::{EvalError, EvalResult};
@@ -176,11 +174,6 @@ pub fn allocations(&self) -> ::std::collections::hash_map::Iter<AllocId, Allocat
         self.alloc_map.iter()
     }
 
-    pub fn create_fn_ptr(&mut self, def_id: DefId, substs: &'tcx Substs<'tcx>) -> Pointer {
-        let instance = ty::Instance::new(def_id, substs);
-        self.create_fn_alloc(instance)
-    }
-
     pub fn create_fn_alloc(&mut self, instance: ty::Instance<'tcx>) -> Pointer {
         if let Some(&alloc_id) = self.function_alloc_cache.get(&instance) {
             return Pointer::new(alloc_id, 0);
index 14f0652a2b57463554521821a4e8dbd8a9f2cf6a..060299983ed45284d443098537e79dc92b98cfa4 100644 (file)
@@ -66,7 +66,9 @@ pub(super) fn eval_terminator(
                     ty::TyFnPtr(sig) => {
                         let fn_ptr = self.eval_operand_to_primval(func)?.to_ptr()?;
                         let instance = self.memory.get_fn(fn_ptr.alloc_id)?;
-                        match instance.def.def_ty(self.tcx).sty {
+                        let instance_ty = instance.def.def_ty(self.tcx);
+                        let instance_ty = self.monomorphize(instance_ty, instance.substs);
+                        match instance_ty.sty {
                             ty::TyFnDef(_, _, real_sig) => {
                                 let sig = self.erase_lifetimes(&sig);
                                 let real_sig = self.erase_lifetimes(&real_sig);