1
Fork 0

CTFE: dynamically make sure we do not call non-const-fn

This commit is contained in:
Ralf Jung 2018-11-16 18:05:08 +01:00
parent 6b9b97bd9b
commit 303dbccf04
3 changed files with 21 additions and 7 deletions

View file

@ -365,13 +365,19 @@ impl<'a, 'mir, 'tcx> interpret::Machine<'a, 'mir, 'tcx>
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) {

View file

@ -15,4 +15,5 @@ fn f(x: usize) -> usize {
fn main() {
let _ = [0; f(2)];
//~^ ERROR calls in constants are limited to constant functions
//~| ERROR evaluation of constant value failed
}

View file

@ -4,6 +4,13 @@ error[E0015]: calls in constants are limited to constant functions, tuple struct
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`
For more information about this error, try `rustc --explain E0015`.
error: aborting due to 2 previous errors
Some errors occurred: E0015, E0080.
For more information about an error, try `rustc --explain E0015`.