about summary refs log tree commit diff
diff options
context:
space:
mode:
authorYuki Okushi <huyuumi.dev@gmail.com>2020-01-28 10:48:16 +0900
committerGitHub <noreply@github.com>2020-01-28 10:48:16 +0900
commitc38e97cc61d05601843624047bca9cb0dfe794a9 (patch)
tree5f3c1e9bdc5777b73d89df9425f409c287c79b7f
parent8ed586581dd8336f54abc45f913680060c5e4187 (diff)
parent9ad1a8c97f8ee0c6af75bca7fae41f7c37d3e73c (diff)
downloadrust-c38e97cc61d05601843624047bca9cb0dfe794a9.tar.gz
rust-c38e97cc61d05601843624047bca9cb0dfe794a9.zip
Rollup merge of #68563 - Aaron1011:fix/fn-sig-closure, r=varkor
Don't call `tcx.fn_sig` on closures

Fixes #68542
-rw-r--r--src/librustc_mir/const_eval/fn_queries.rs4
-rw-r--r--src/test/ui/consts/issue-68542-closure-in-array-len.rs10
-rw-r--r--src/test/ui/consts/issue-68542-closure-in-array-len.stderr16
3 files changed, 30 insertions, 0 deletions
diff --git a/src/librustc_mir/const_eval/fn_queries.rs b/src/librustc_mir/const_eval/fn_queries.rs
index 2443e1e91d3..5eeb92f583b 100644
--- a/src/librustc_mir/const_eval/fn_queries.rs
+++ b/src/librustc_mir/const_eval/fn_queries.rs
@@ -86,6 +86,10 @@ pub fn provide(providers: &mut Providers<'_>) {
     /// Const evaluability whitelist is here to check evaluability at the
     /// top level beforehand.
     fn is_const_intrinsic(tcx: TyCtxt<'_>, def_id: DefId) -> Option<bool> {
+        if tcx.is_closure(def_id) {
+            return None;
+        }
+
         match tcx.fn_sig(def_id).abi() {
             Abi::RustIntrinsic | Abi::PlatformIntrinsic => {
                 Some(tcx.lookup_const_stability(def_id).is_some())
diff --git a/src/test/ui/consts/issue-68542-closure-in-array-len.rs b/src/test/ui/consts/issue-68542-closure-in-array-len.rs
new file mode 100644
index 00000000000..2e721b85334
--- /dev/null
+++ b/src/test/ui/consts/issue-68542-closure-in-array-len.rs
@@ -0,0 +1,10 @@
+// Regression test for issue #68542
+// Tests that we don't ICE when a closure appears
+// in the length part of an array.
+
+struct Bug {
+    a: [(); (|| { 0 })()] //~ ERROR calls in constants are limited to
+    //~^ ERROR evaluation of constant value failed
+}
+
+fn main() {}
diff --git a/src/test/ui/consts/issue-68542-closure-in-array-len.stderr b/src/test/ui/consts/issue-68542-closure-in-array-len.stderr
new file mode 100644
index 00000000000..815cc9d836f
--- /dev/null
+++ b/src/test/ui/consts/issue-68542-closure-in-array-len.stderr
@@ -0,0 +1,16 @@
+error[E0015]: calls in constants are limited to constant functions, tuple structs and tuple variants
+  --> $DIR/issue-68542-closure-in-array-len.rs:6:13
+   |
+LL |     a: [(); (|| { 0 })()]
+   |             ^^^^^^^^^^^^
+
+error[E0080]: evaluation of constant value failed
+  --> $DIR/issue-68542-closure-in-array-len.rs:6:13
+   |
+LL |     a: [(); (|| { 0 })()]
+   |             ^^^^^^^^^^^^ calling non-const function `Bug::a::{{constant}}#0::{{closure}}#0`
+
+error: aborting due to 2 previous errors
+
+Some errors have detailed explanations: E0015, E0080.
+For more information about an error, try `rustc --explain E0015`.