Skip to content

Commit

Permalink
CTFE: dynamically make sure we do not call non-const-fn
Browse files Browse the repository at this point in the history
  • Loading branch information
RalfJung committed Nov 16, 2018
1 parent 6b9b97b commit 303dbcc
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 7 deletions.
16 changes: 11 additions & 5 deletions src/librustc_mir/const_eval.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
1 change: 1 addition & 0 deletions src/test/ui/consts/const-call.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
11 changes: 9 additions & 2 deletions src/test/ui/consts/const-call.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -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`

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`.

0 comments on commit 303dbcc

Please sign in to comment.