Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ICE when passing unsized trait object closure to function #93622

Closed
xldenis opened this issue Feb 3, 2022 · 4 comments · Fixed by #116081
Closed

ICE when passing unsized trait object closure to function #93622

xldenis opened this issue Feb 3, 2022 · 4 comments · Fixed by #116081
Assignees
Labels
C-bug Category: This is a bug. glacier ICE tracked in rust-lang/glacier. I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.

Comments

@xldenis
Copy link
Contributor

xldenis commented Feb 3, 2022

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.

Playground

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::<[closure@cps.rs: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>>

@xldenis xldenis added C-bug Category: This is a bug. I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Feb 3, 2022
@xldenis
Copy link
Contributor Author

xldenis commented Feb 3, 2022

The following code also gives the same error but at a different location in the code:

#![feature(unsized_fn_params)]

pub enum Tree {
    Node(Box<Tree>, Box<Tree>),
    Leaf,
}

pub type Cont<'a> = dyn FnOnce(u64) -> u64 + 'a;

pub fn height_cps<'a>(x : &'a Tree, f : Cont<'a>) -> u64 {
    match x {
        Tree::Leaf => f(0),
        Tree::Node(l, r) => {
            height_cps(l, {let k : Box<Cont> = Box::new(move |lh| {
                height_cps(r, {let k : Box<Cont> = Box::new(move |lr| { let lh = lh; f(1 + lh.max(lr)) }); *k})
            }); *k})
        }
    }
}

@rust-lang-glacier-bot rust-lang-glacier-bot added the glacier ICE tracked in rust-lang/glacier. label Feb 5, 2022
@compiler-errors
Copy link
Member

compiler-errors commented Feb 5, 2022

The issue here is moving an unsized fn param into a box by capture.

Minimized:

#![feature(unsized_fn_params)]

pub fn f(k: dyn std::fmt::Display) {
    let k2 = Box::new(move || { let x = k.to_string(); });
}

@compiler-errors
Copy link
Member

compiler-errors commented Feb 5, 2022

A similar ICE:

#![feature(unsized_fn_params)]

pub fn f(k: dyn std::fmt::Display) {
    let k2 = move || {
        k.to_string();
    };
}
Backtrace

thread 'rustc' panicked at 'fat_pointer_kind() - Encountered unexpected `pointee_ty`: [closure@src/lib.rs:4:14: 4:21]', compiler/rustc_codegen_llvm/src/debuginfo/utils.rs:102:13
stack backtrace:
   0:     0x7fd74e146ebc - std::backtrace_rs::backtrace::libunwind::trace::hddd5a7e459ce4327
                               at /rustc/4e8fb743ccbec27344b2dd42de7057f41d4ebfdd/library/std/src/../../backtrace/src/backtrace/libunwind.rs:93:5
   1:     0x7fd74e146ebc - std::backtrace_rs::backtrace::trace_unsynchronized::h69db3e09cfd8bf11
                               at /rustc/4e8fb743ccbec27344b2dd42de7057f41d4ebfdd/library/std/src/../../backtrace/src/backtrace/mod.rs:66:5
   2:     0x7fd74e146ebc - std::sys_common::backtrace::_print_fmt::h83b461b46804fdab
                               at /rustc/4e8fb743ccbec27344b2dd42de7057f41d4ebfdd/library/std/src/sys_common/backtrace.rs:66:5
   3:     0x7fd74e146ebc - <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt::h2f6e5cd8872f3d74
                               at /rustc/4e8fb743ccbec27344b2dd42de7057f41d4ebfdd/library/std/src/sys_common/backtrace.rs:45:22
   4:     0x7fd74e1a82dc - core::fmt::write::hd64a00f3787c90bd
                               at /rustc/4e8fb743ccbec27344b2dd42de7057f41d4ebfdd/library/core/src/fmt/mod.rs:1190:17
   5:     0x7fd74e136383 - std::io::Write::write_fmt::h6347402c88d40325
                               at /rustc/4e8fb743ccbec27344b2dd42de7057f41d4ebfdd/library/std/src/io/mod.rs:1653:15
   6:     0x7fd74e14b181 - std::sys_common::backtrace::_print::h989064c3e0b39e3c
                               at /rustc/4e8fb743ccbec27344b2dd42de7057f41d4ebfdd/library/std/src/sys_common/backtrace.rs:48:5
   7:     0x7fd74e14b181 - std::sys_common::backtrace::print::h4af8c55ce731a045
                               at /rustc/4e8fb743ccbec27344b2dd42de7057f41d4ebfdd/library/std/src/sys_common/backtrace.rs:35:9
   8:     0x7fd74e14b181 - std::panicking::default_hook::{{closure}}::h41ef6f6a9fac6b53
                               at /rustc/4e8fb743ccbec27344b2dd42de7057f41d4ebfdd/library/std/src/panicking.rs:295:22
   9:     0x7fd74e14ae3f - std::panicking::default_hook::hbaf11e031e0e4a5f
                               at /rustc/4e8fb743ccbec27344b2dd42de7057f41d4ebfdd/library/std/src/panicking.rs:314:9
  10:     0x7fd74e928541 - rustc_driver[7b59b981d4c23d31]::DEFAULT_HOOK::{closure#0}::{closure#0}
  11:     0x7fd74e14ba5b - std::panicking::rust_panic_with_hook::h4788f0bd625b1005
                               at /rustc/4e8fb743ccbec27344b2dd42de7057f41d4ebfdd/library/std/src/panicking.rs:702:17
  12:     0x7fd74e14b717 - std::panicking::begin_panic_handler::{{closure}}::h3fc193fd0625168a
                               at /rustc/4e8fb743ccbec27344b2dd42de7057f41d4ebfdd/library/std/src/panicking.rs:588:13
  13:     0x7fd74e147364 - std::sys_common::backtrace::__rust_end_short_backtrace::h379714bd69912a88
                               at /rustc/4e8fb743ccbec27344b2dd42de7057f41d4ebfdd/library/std/src/sys_common/backtrace.rs:138:18
  14:     0x7fd74e14b429 - rust_begin_unwind
                               at /rustc/4e8fb743ccbec27344b2dd42de7057f41d4ebfdd/library/std/src/panicking.rs:584:5
  15:     0x7fd74e112993 - core::panicking::panic_fmt::hc13e2c29da5b89d3
                               at /rustc/4e8fb743ccbec27344b2dd42de7057f41d4ebfdd/library/core/src/panicking.rs:135:14
  16:     0x7fd74fb63631 - rustc_codegen_llvm[b175ffb6fe16318c]::debuginfo::utils::fat_pointer_kind
  17:     0x7fd74fb65fb3 - rustc_codegen_llvm[b175ffb6fe16318c]::debuginfo::metadata::pointer_or_reference_metadata
  18:     0x7fd74fb66d04 - rustc_codegen_llvm[b175ffb6fe16318c]::debuginfo::metadata::type_metadata
  19:     0x7fd74fb80e5b - <rustc_codegen_llvm[b175ffb6fe16318c]::context::CodegenCx as rustc_codegen_ssa[caeff511e0898096]::traits::debuginfo::DebugInfoMethods>::dbg_scope_fn
  20:     0x7fd74fbab083 - rustc_codegen_ssa[caeff511e0898096]::mir::codegen_mir::<rustc_codegen_llvm[b175ffb6fe16318c]::builder::Builder>
  21:     0x7fd74fb74e62 - rustc_codegen_llvm[b175ffb6fe16318c]::base::compile_codegen_unit::module_codegen
  22:     0x7fd750802896 - <rustc_query_system[59fab566a51c2c24]::dep_graph::graph::DepGraph<rustc_middle[e664fb30aec2b69e]::dep_graph::dep_node::DepKind>>::with_task::<rustc_middle[e664fb30aec2b69e]::ty::context::TyCtxt, rustc_span[26d1c5a8904e1196]::symbol::Symbol, rustc_codegen_ssa[caeff511e0898096]::ModuleCodegen<rustc_codegen_llvm[b175ffb6fe16318c]::ModuleLlvm>>
  23:     0x7fd7507fb1ae - rustc_codegen_llvm[b175ffb6fe16318c]::base::compile_codegen_unit
  24:     0x7fd75082b1b2 - <rustc_codegen_llvm[b175ffb6fe16318c]::LlvmCodegenBackend as rustc_codegen_ssa[caeff511e0898096]::traits::backend::CodegenBackend>::codegen_crate
  25:     0x7fd7507d9337 - <rustc_session[bcbf86d149cb5e94]::session::Session>::time::<alloc[53f90fd9233e64f9]::boxed::Box<dyn core[90c82cfbe27f5d33]::any::Any>, rustc_interface[be440f50dcda62f9]::passes::start_codegen::{closure#0}>
  26:     0x7fd7507c1007 - <rustc_interface[be440f50dcda62f9]::passes::QueryContext>::enter::<<rustc_interface[be440f50dcda62f9]::queries::Queries>::ongoing_codegen::{closure#0}::{closure#0}, core[90c82cfbe27f5d33]::result::Result<alloc[53f90fd9233e64f9]::boxed::Box<dyn core[90c82cfbe27f5d33]::any::Any>, rustc_errors[b77837aed2b0d3e7]::ErrorReported>>
  27:     0x7fd7507b6c9f - <rustc_interface[be440f50dcda62f9]::queries::Queries>::ongoing_codegen
  28:     0x7fd75079684d - <rustc_interface[be440f50dcda62f9]::interface::Compiler>::enter::<rustc_driver[7b59b981d4c23d31]::run_compiler::{closure#1}::{closure#2}, core[90c82cfbe27f5d33]::result::Result<core[90c82cfbe27f5d33]::option::Option<rustc_interface[be440f50dcda62f9]::queries::Linker>, rustc_errors[b77837aed2b0d3e7]::ErrorReported>>
  29:     0x7fd750799876 - rustc_span[26d1c5a8904e1196]::with_source_map::<core[90c82cfbe27f5d33]::result::Result<(), rustc_errors[b77837aed2b0d3e7]::ErrorReported>, rustc_interface[be440f50dcda62f9]::interface::create_compiler_and_run<core[90c82cfbe27f5d33]::result::Result<(), rustc_errors[b77837aed2b0d3e7]::ErrorReported>, rustc_driver[7b59b981d4c23d31]::run_compiler::{closure#1}>::{closure#1}>
  30:     0x7fd7507961fe - rustc_interface[be440f50dcda62f9]::interface::create_compiler_and_run::<core[90c82cfbe27f5d33]::result::Result<(), rustc_errors[b77837aed2b0d3e7]::ErrorReported>, rustc_driver[7b59b981d4c23d31]::run_compiler::{closure#1}>
  31:     0x7fd75077c302 - std[daefdbcf0dca51d0]::sys_common::backtrace::__rust_begin_short_backtrace::<rustc_interface[be440f50dcda62f9]::util::setup_callbacks_and_run_in_thread_pool_with_globals<rustc_interface[be440f50dcda62f9]::interface::run_compiler<core[90c82cfbe27f5d33]::result::Result<(), rustc_errors[b77837aed2b0d3e7]::ErrorReported>, rustc_driver[7b59b981d4c23d31]::run_compiler::{closure#1}>::{closure#0}, core[90c82cfbe27f5d33]::result::Result<(), rustc_errors[b77837aed2b0d3e7]::ErrorReported>>::{closure#0}, core[90c82cfbe27f5d33]::result::Result<(), rustc_errors[b77837aed2b0d3e7]::ErrorReported>>
  32:     0x7fd750779a19 - <<std[daefdbcf0dca51d0]::thread::Builder>::spawn_unchecked_<rustc_interface[be440f50dcda62f9]::util::setup_callbacks_and_run_in_thread_pool_with_globals<rustc_interface[be440f50dcda62f9]::interface::run_compiler<core[90c82cfbe27f5d33]::result::Result<(), rustc_errors[b77837aed2b0d3e7]::ErrorReported>, rustc_driver[7b59b981d4c23d31]::run_compiler::{closure#1}>::{closure#0}, core[90c82cfbe27f5d33]::result::Result<(), rustc_errors[b77837aed2b0d3e7]::ErrorReported>>::{closure#0}, core[90c82cfbe27f5d33]::result::Result<(), rustc_errors[b77837aed2b0d3e7]::ErrorReported>>::{closure#1} as core[90c82cfbe27f5d33]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0}
  33:     0x7fd74e157803 - <alloc::boxed::Box<F,A> as core::ops::function::FnOnce<Args>>::call_once::hed49a6c6e767ba83
                               at /rustc/4e8fb743ccbec27344b2dd42de7057f41d4ebfdd/library/alloc/src/boxed.rs:1854:9
  34:     0x7fd74e157803 - <alloc::boxed::Box<F,A> as core::ops::function::FnOnce<Args>>::call_once::h14238373d01dc9bc
                               at /rustc/4e8fb743ccbec27344b2dd42de7057f41d4ebfdd/library/alloc/src/boxed.rs:1854:9
  35:     0x7fd74e157803 - std::sys::unix::thread::Thread::new::thread_start::hc6dbf73cd24f68cc
                               at /rustc/4e8fb743ccbec27344b2dd42de7057f41d4ebfdd/library/std/src/sys/unix/thread.rs:108:17
  36:     0x7fd74e08b609 - start_thread
  37:     0x7fd74dfa5293 - clone
  38:                0x0 - <unknown>

@compiler-errors
Copy link
Member

compiler-errors commented Feb 5, 2022

To be fair, unsized_fn_params probably should be like unsized_locals and marked with incomplete_features...

My guess would be a lot of the behaviors that make the latter an incomplete compiler feature also apply to unsized_fn_params.. especially considering expressions that move the unsized params..

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
C-bug Category: This is a bug. glacier ICE tracked in rust-lang/glacier. I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants