Closed
Description
Playing around with unsized_fn_params
, @jhjourdan and I encountered an ICE caused by move
closures. Removing the marked move
allows the code to compile successfully.
Code
#![feature(unsized_fn_params)]
pub enum Tree {
Node(Box<Tree>, Box<Tree>),
Leaf,
}
pub type Cont<'a> = dyn Fn(u64) -> u64 + 'a;
pub fn height_cps<'a>(x : &'a Tree, k : Cont<'a>) -> u64 {
match x {
Tree::Leaf => k(0),
Tree::Node(l, r) => {
// v-- causes crash
height_cps(l, {let k : Box<Cont> = Box::new(move |lh| {
height_cps(r, {let k : Box<Cont> = Box::new(|lr| { k(1 + lh.max(lr)) }); *k})
}); *k})
}
}
}
fn main () {
height_cps(&Tree::Leaf, *(Box::new(|i| {i}) as Box<Cont>));
}
Meta
rustc --version --verbose
:
rustc 1.60.0-nightly (ad46af247 2022-01-14)
binary: rustc
commit-hash: ad46af24713115e7b9b258346e66b9b2d14eacfc
commit-date: 2022-01-14
host: aarch64-apple-darwin
release: 1.60.0-nightly
LLVM version: 13.0.0
Error output
error: internal compiler error: /rustc/ad46af24713115e7b9b258346e66b9b2d14eacfc/compiler/rustc_const_eval/src/interpret/eval_context.rs:689:18: size_and_align_of::<[[email protected]:14:57: 16:14]> not supported
--> cps.rs:11:11
|
11 | match x {
| ^
thread 'rustc' panicked at 'Box<dyn Any>', /rustc/ad46af24713115e7b9b258346e66b9b2d14eacfc/compiler/rustc_errors/src/lib.rs:1115:9
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrac
Backtrace
stack backtrace:
0: std::panicking::begin_panic::<rustc_errors::ExplicitBug>
1: std::panic::panic_any::<rustc_errors::ExplicitBug>
2: <rustc_errors::HandlerInner>::span_bug::<rustc_span::span_encoding::Span>
3: <rustc_errors::Handler>::span_bug::<rustc_span::span_encoding::Span>
4: rustc_middle::ty::context::tls::with_opt::<rustc_middle::util::bug::opt_span_bug_fmt<rustc_span::span_encoding::Span>::{closure#0}, ()>
5: rustc_middle::util::bug::opt_span_bug_fmt::<rustc_span::span_encoding::Span>
6: rustc_middle::util::bug::span_bug_fmt::<rustc_span::span_encoding::Span>
7: <rustc_const_eval::interpret::eval_context::InterpCx<rustc_mir_transform::const_prop::ConstPropMachine>>::size_and_align_of
8: <rustc_const_eval::interpret::eval_context::InterpCx<rustc_mir_transform::const_prop::ConstPropMachine>>::force_allocation_maybe_sized
9: <rustc_const_eval::interpret::eval_context::InterpCx<rustc_mir_transform::const_prop::ConstPropMachine>>::place_field
10: <rustc_const_eval::interpret::eval_context::InterpCx<rustc_mir_transform::const_prop::ConstPropMachine>>::eval_place
11: <rustc_const_eval::interpret::eval_context::InterpCx<rustc_mir_transform::const_prop::ConstPropMachine>>::eval_rvalue_into_place
12: <rustc_mir_transform::const_prop::ConstPropagator as rustc_middle::mir::visit::MutVisitor>::visit_statement
13: <rustc_mir_transform::const_prop::ConstPropagator as rustc_middle::mir::visit::MutVisitor>::visit_body
14: <rustc_mir_transform::const_prop::ConstProp as rustc_middle::mir::MirPass>::run_pass
15: rustc_mir_transform::pass_manager::run_passes
16: rustc_mir_transform::optimized_mir
17: rustc_query_system::query::plumbing::try_execute_query::<rustc_query_impl::plumbing::QueryCtxt, rustc_query_system::query::caches::DefaultCache<rustc_span::def_id::DefId, &rustc_middle::mir::Body>>
18: rustc_query_system::query::plumbing::get_query::<rustc_query_impl::queries::optimized_mir, rustc_query_impl::plumbing::QueryCtxt>
19: <rustc_middle::ty::context::TyCtxt>::instance_mir
20: rustc_monomorphize::collector::collect_neighbours
21: rustc_monomorphize::collector::collect_items_rec
22: rustc_monomorphize::collector::collect_items_rec
23: <rustc_session::session::Session>::time::<(), rustc_monomorphize::collector::collect_crate_mono_items::{closure#1}>
24: rustc_monomorphize::collector::collect_crate_mono_items
25: rustc_monomorphize::partitioning::collect_and_partition_mono_items
26: rustc_query_system::query::plumbing::try_execute_query::<rustc_query_impl::plumbing::QueryCtxt, rustc_query_system::query::caches::DefaultCache<(), (&std::collections::hash::set::HashSet<rustc_span::def_id::DefId, core::hash::BuildHasherDefault<rustc_hash::FxHasher>>, &[rustc_middle::mir::mono::CodegenUnit])>>
27: rustc_query_system::query::plumbing::get_query::<rustc_query_impl::queries::collect_and_partition_mono_items, rustc_query_impl::plumbing::QueryCtxt>
28: rustc_codegen_ssa::base::codegen_crate::<rustc_codegen_llvm::LlvmCodegenBackend>
29: <rustc_codegen_llvm::LlvmCodegenBackend as rustc_codegen_ssa::traits::backend::CodegenBackend>::codegen_crate
30: <rustc_session::session::Session>::time::<alloc::boxed::Box<dyn core::any::Any>, rustc_interface::passes::start_codegen::{closure#0}>
31: <rustc_interface::queries::Queries>::ongoing_codegen
32: <rustc_interface::interface::Compiler>::enter::<rustc_driver::run_compiler::{closure#1}::{closure#2}, core::result::Result<core::option::Option<rustc_interface::queries::Linker>, rustc_errors::ErrorReported>>
33: rustc_span::with_source_map::<core::result::Result<(), rustc_errors::ErrorReported>, rustc_interface::interface::create_compiler_and_run<core::result::Result<(), rustc_errors::ErrorReported>, rustc_driver::run_compiler::{closure#1}>::{closure#1}>
34: rustc_interface::interface::create_compiler_and_run::<core::result::Result<(), rustc_errors::ErrorReported>, rustc_driver::run_compiler::{closure#1}>
35: <scoped_tls::ScopedKey<rustc_span::SessionGlobals>>::set::<rustc_interface::util::setup_callbacks_and_run_in_thread_pool_with_globals<rustc_interface::interface::run_compiler<core::result::Result<(), rustc_errors::ErrorReported>, rustc_driver::run_compiler::{closure#1}>::{closure#0}, core::result::Result<(), rustc_errors::ErrorReported>>::{closure#0}::{closure#0}, core::result::Result<(), rustc_errors::ErrorReported>>