diff options
| author | Yuki Okushi <huyuumi.dev@gmail.com> | 2020-01-28 10:48:16 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-01-28 10:48:16 +0900 |
| commit | c38e97cc61d05601843624047bca9cb0dfe794a9 (patch) | |
| tree | 5f3c1e9bdc5777b73d89df9425f409c287c79b7f | |
| parent | 8ed586581dd8336f54abc45f913680060c5e4187 (diff) | |
| parent | 9ad1a8c97f8ee0c6af75bca7fae41f7c37d3e73c (diff) | |
| download | rust-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.rs | 4 | ||||
| -rw-r--r-- | src/test/ui/consts/issue-68542-closure-in-array-len.rs | 10 | ||||
| -rw-r--r-- | src/test/ui/consts/issue-68542-closure-in-array-len.stderr | 16 |
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`. |
