ret: Option<mir::BasicBlock>,
) -> EvalResult<'tcx, Option<&'mir mir::Mir<'tcx>>> {
debug!("eval_fn_call: {:?}", instance);
- if !ecx.tcx.is_const_fn(instance.def_id()) {
+ // Execution might have wandered off into other crates, so we cannot to a stability-
+ // sensitive check here. But we can at least rule out functions that are not const
+ // at all.
+ if !ecx.tcx.is_const_fn_raw(instance.def_id()) {
// Some functions we support even if they are non-const -- but avoid testing
- // that for const fn!
- if ecx.hook_fn(instance, args, dest)? {
+ // that for const fn! We certainly do *not* want to actually call the fn
+ // though, so be sure we return here.
+ return if ecx.hook_fn(instance, args, dest)? {
ecx.goto_block(ret)?; // fully evaluated and done
- return Ok(None);
- }
+ Ok(None)
+ } else {
+ err!(MachineError(format!("calling non-const function `{}`", instance)))
+ };
}
// This is a const fn. Call it.
Ok(Some(match ecx.load_mir(instance.def) {
LL | let _ = [0; f(2)];
| ^^^^
-error: aborting due to previous error
+error[E0080]: evaluation of constant value failed
+ --> $DIR/const-call.rs:16:17
+ |
+LL | let _ = [0; f(2)];
+ | ^^^^ calling non-const function `f`
+
+error: aborting due to 2 previous errors
-For more information about this error, try `rustc --explain E0015`.
+Some errors occurred: E0015, E0080.
+For more information about an error, try `rustc --explain E0015`.