Borrow checking fails in case a closure appears in a const expression #81899
Closed
Description
The following code causes compiler panics due to the first line without which the issue isn't reproducible. Calling the function outside of a constant context emits the right compiler errors.
Code
const CACHE: &[u32] = &const_sort(&[2, 3, 1], |a, b| a < b); // that line is a failure reason
const fn const_sort<F, const N: usize>(v: &[u32; N], mut is_less: F) -> [u32; N]
where
F: FnMut(&u32, &u32) -> bool,
{
let mut r = [0; N];
let mut i = 0;
while i < N {
r[i] = v[i];
i += 1;
}
let mut i = 1;
while i < N {
if is_less(&r[i], &r[i - 1]) {
let tmp = r[i];
r[i] = r[i - 1];
let mut j = i - 1;
while j > 0 && is_less(&tmp, &r[j - 1]) {
r[j] = r[j - 1];
j -= 1;
}
r[j] = tmp;
}
i += 1;
}
r
}
Meta
rustc --version --verbose
:
<version>
Error output
Compiling playground v0.0.1 (/playground)
thread 'rustc' panicked at 'called `Option::unwrap()` on a `None` value', compiler/rustc_mir/src/borrow_check/region_infer/mod.rs:2136:35
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
error: internal compiler error: unexpected panic
note: the compiler unexpectedly panicked. this is a bug.
note: we would appreciate a bug report: /~https://github.com/rust-lang/rust/issues/new?labels=C-bug%2C+I-ICE%2C+T-compiler&template=ice.md
note: rustc 1.52.0-nightly (9778068cb 2021-02-07) running on x86_64-unknown-linux-gnu
note: compiler flags: -C embed-bitcode=no -C codegen-units=1 -C debuginfo=2 --crate-type lib
note: some of the compiler flags provided by cargo are hidden
query stack during panic:
#0 [mir_borrowck] borrow-checking `CACHE`
#1 [analysis] running analysis passes on this crate
end of query stack
error: could not compile `playground`
Backtrace
0: rust_begin_unwind
at /rustc/9778068cbc1e06cc3685422323ff38a2f397de26/library/std/src/panicking.rs:493:5
1: core::panicking::panic_fmt
at /rustc/9778068cbc1e06cc3685422323ff38a2f397de26/library/core/src/panicking.rs:92:14
2: core::panicking::panic
at /rustc/9778068cbc1e06cc3685422323ff38a2f397de26/library/core/src/panicking.rs:50:5
3: rustc_mir::borrow_check::region_infer::RegionInferenceContext::find_outlives_blame_span
4: rustc_mir::borrow_check::do_mir_borrowck
5: rustc_infer::infer::InferCtxtBuilder::enter
6: rustc_mir::borrow_check::mir_borrowck
7: core::ops::function::FnOnce::call_once
8: rustc_middle::ty::query::<impl rustc_query_system::query::config::QueryAccessors<rustc_middle::ty::context::TyCtxt> for rustc_middle::ty::query::queries::mir_borrowck>::compute
9: rustc_query_system::dep_graph::graph::DepGraph<K>::with_task_impl
10: rustc_data_structures::stack::ensure_sufficient_stack
11: rustc_query_system::query::plumbing::force_query_with_job
12: rustc_query_system::query::plumbing::get_query_impl
13: rustc_query_system::query::plumbing::ensure_query_impl
14: rustc_session::utils::<impl rustc_session::session::Session>::time
15: rustc_interface::passes::analysis
16: rustc_middle::ty::query::<impl rustc_query_system::query::config::QueryAccessors<rustc_middle::ty::context::TyCtxt> for rustc_middle::ty::query::queries::analysis>::compute
17: rustc_query_system::dep_graph::graph::DepGraph<K>::with_task_impl
18: rustc_data_structures::stack::ensure_sufficient_stack
19: rustc_query_system::query::plumbing::force_query_with_job
20: rustc_query_system::query::plumbing::get_query_impl
21: rustc_interface::passes::QueryContext::enter
22: rustc_interface::queries::<impl rustc_interface::interface::Compiler>::enter
23: rustc_span::with_source_map
24: rustc_interface::interface::create_compiler_and_run
25: rustc_span::with_session_globals
Metadata
Assignees
Labels
Area: The borrow checkerCategory: This is a bug.Call for participation: An issue has been fixed and does not reproduce, but no test has been added.Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️Medium priorityRelevant to the compiler team, which will review and decide on the PR/issue.An error is correctly emitted, but is confusing, for `min_const_generics`.ICE tracked in rust-lang/glacier.Performance or correctness regression from one stable version to another.