_unwind: Option<mir::BasicBlock> // unwinding is not supported in consts
) -> InterpResult<'tcx, Option<&'mir mir::Body<'tcx>>> {
debug!("eval_fn_call: {:?}", instance);
+
+ // If this function is a `const fn` then as an optimization we can query this
+ // evaluation immediately.
+ //
+ // For the moment we only do this for functions which take no arguments
+ // (or all arguments are ZSTs) so that we don't memoize too much.
+ if ecx.tcx.is_const_fn_raw(instance.def.def_id()) &&
+ args.iter().all(|a| a.layout.is_zst())
+ {
+ let gid = GlobalId { instance, promoted: None };
+ ecx.eval_const_fn_call(gid, ret)?;
+ return Ok(None);
+ }
+
// Only check non-glue functions
if let ty::InstanceDef::Item(def_id) = instance.def {
// Execution might have wandered off into other crates, so we cannot do a stability-
ty::InstanceDef::DropGlue(..) |
ty::InstanceDef::CloneShim(..) |
ty::InstanceDef::Item(_) => {
- // If this function is a `const fn` then as an optimization we can query this
- // evaluation immediately.
- //
- // For the moment we only do this for functions which take no arguments
- // (or all arguments are ZSTs) so that we don't memoize too much.
- if self.tcx.is_const_fn_raw(instance.def.def_id()) &&
- args.iter().all(|a| a.layout.is_zst())
- {
- let gid = GlobalId { instance, promoted: None };
- return self.eval_const_fn_call(gid, ret);
- }
-
// We need MIR for this fn
let body = match M::find_fn(self, instance, args, ret, unwind)? {
Some(body) => body,
/// Evaluate a const function where all arguments (if any) are zero-sized types.
/// The evaluation is memoized thanks to the query system.
- fn eval_const_fn_call(
+ pub (crate) fn eval_const_fn_call(
&mut self,
gid: GlobalId<'tcx>,
ret: Option<(PlaceTy<'tcx, M::PointerTag>, mir::BasicBlock)>,