From 1c9f5ac669ab3e709df43b453aa1e80d488e3416 Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Thu, 23 Mar 2017 15:23:53 +0100 Subject: [PATCH] Skip the transmute checks for closure glue --- src/terminator/mod.rs | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/terminator/mod.rs b/src/terminator/mod.rs index 4ea2c4d95878..e49c4aa7387b 100644 --- a/src/terminator/mod.rs +++ b/src/terminator/mod.rs @@ -70,10 +70,15 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> { ty::TyFnDef(_, _, real_sig) => { let sig = self.erase_lifetimes(&sig); let real_sig = self.erase_lifetimes(&real_sig); - if sig.abi != real_sig.abi || - sig.variadic != real_sig.variadic || - sig.inputs_and_output != real_sig.inputs_and_output { - return Err(EvalError::FunctionPointerTyMismatch(real_sig, sig)); + match instance.def { + // FIXME: this needs checks for weird transmutes + // we need to bail here, because noncapturing closures as fn ptrs fail the checks + ty::InstanceDef::ClosureOnceShim{..} => {} + _ => if sig.abi != real_sig.abi || + sig.variadic != real_sig.variadic || + sig.inputs_and_output != real_sig.inputs_and_output { + return Err(EvalError::FunctionPointerTyMismatch(real_sig, sig)); + }, } }, ref other => bug!("instance def ty: {:?}", other),