about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/librustc_mir/const_eval.rs16
-rw-r--r--src/test/ui/consts/const-call.rs1
-rw-r--r--src/test/ui/consts/const-call.stderr11
3 files changed, 21 insertions, 7 deletions
diff --git a/src/librustc_mir/const_eval.rs b/src/librustc_mir/const_eval.rs
index 7bff76f948e..51046399ec2 100644
--- a/src/librustc_mir/const_eval.rs
+++ b/src/librustc_mir/const_eval.rs
@@ -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) {
diff --git a/src/test/ui/consts/const-call.rs b/src/test/ui/consts/const-call.rs
index 18476494300..bd407192cd7 100644
--- a/src/test/ui/consts/const-call.rs
+++ b/src/test/ui/consts/const-call.rs
@@ -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
 }
diff --git a/src/test/ui/consts/const-call.stderr b/src/test/ui/consts/const-call.stderr
index 81be93e916e..219fcec51b3 100644
--- a/src/test/ui/consts/const-call.stderr
+++ b/src/test/ui/consts/const-call.stderr
@@ -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`.