Skip to content

ICE: broken mir in FutureDropPollShim #142559

Open
@matthiaskrgr

Description

@matthiaskrgr

auto-reduced (treereduce-rust):

//@compile-flags: --edition=2024 -Clink-dead-code=true
#![feature(async_drop)]
async fn test<Fut: Future>(operation: impl Fn() -> Fut) {
    operation().await;
}

pub async fn orchestrate_simple_crud() {
    test(async || async {}.await).await;
}

fn main() {}

original:

//@ check-pass
//@ edition: 2021

// Make sure that we don't hit a query cycle when validating
//@ check-pass

use std::future::Future;

async fn test<Fut: Future>(operation: impl Fn() -> Fut) {
    operation().await;
}

pub async fn orchestrate_simple_crud() {
    test(async || async {}.await).await;
}

fn main() {}

Version information

rustc 1.89.0-nightly (e314b97ee 2025-06-16)
binary: rustc
commit-hash: e314b97ee54091b6bcf33db4770c93d82fded8bc
commit-date: 2025-06-16
host: x86_64-unknown-linux-gnu
release: 1.89.0-nightly
LLVM version: 20.1.5

Possibly related line of code:

};
cfg_checker.visit_body(body);
cfg_checker.check_cleanup_control_flow();
// Also run the TypeChecker.
for (location, msg) in validate_types(tcx, typing_env, body, body) {
cfg_checker.fail(location, msg);
}
if let MirPhase::Runtime(_) = body.phase {
if let ty::InstanceKind::Item(_) = body.source.instance {
if body.has_free_regions() {
cfg_checker.fail(

Command:
/home/matthias/.rustup/toolchains/master/bin/rustc --edition=2024 -Clink-dead-code=true -Zcrate-attr=feature(async_drop)

Program output

warning: the feature `async_drop` is incomplete and may not be safe to use and/or cause compiler crashes
 --> <crate attribute>:1:12
  |
1 | #![feature(async_drop)]
  |            ^^^^^^^^^^
  |
  = note: see issue #126482 <https://github.com/rust-lang/rust/issues/126482> for more information
  = note: `#[warn(incomplete_features)]` on by default


thread 'rustc' panicked at compiler/rustc_mir_transform/src/validate.rs:80:25:
broken MIR in FutureDropPollShim(DefId(2:15416 ~ core[0a08]::future::async_drop::async_drop_in_place::{closure#0}), Coroutine(DefId(2:15416 ~ core[0a08]::future::async_drop::async_drop_in_place::{closure#0}), [Coroutine(DefId(0:12 ~ mvce[0444]::orchestrate_simple_crud::{closure#0}::{closure#0}::{closure#0}), [i32, std::future::ResumeTy, (), (), CoroutineWitness(DefId(0:12 ~ mvce[0444]::orchestrate_simple_crud::{closure#0}::{closure#0}::{closure#0}), []), ()]), (), std::future::ResumeTy, (), (), CoroutineWitness(DefId(2:15416 ~ core[0a08]::future::async_drop::async_drop_in_place::{closure#0}), [Coroutine(DefId(0:12 ~ mvce[0444]::orchestrate_simple_crud::{closure#0}::{closure#0}::{closure#0}), [i32, std::future::ResumeTy, (), (), CoroutineWitness(DefId(0:12 ~ mvce[0444]::orchestrate_simple_crud::{closure#0}::{closure#0}::{closure#0}), []), ()])]), (*mut Coroutine(DefId(0:12 ~ mvce[0444]::orchestrate_simple_crud::{closure#0}::{closure#0}::{closure#0}), [i32, std::future::ResumeTy, (), (), CoroutineWitness(DefId(0:12 ~ mvce[0444]::orchestrate_simple_crud::{closure#0}::{closure#0}::{closure#0}), []), ()]),)]), Coroutine(DefId(0:12 ~ mvce[0444]::orchestrate_simple_crud::{closure#0}::{closure#0}::{closure#0}), [i32, std::future::ResumeTy, (), (), CoroutineWitness(DefId(0:12 ~ mvce[0444]::orchestrate_simple_crud::{closure#0}::{closure#0}::{closure#0}), []), ()])) (after phase change to runtime-optimized) at bb1[0]:
encountered `Assign((_24, deref_copy _33))` with incompatible types:
left-hand side has type: &mut {async closure body@/tmp/icemaker_global_tempdir.t1m0hs51jQBf/rustc_testrunner_tmpdir_reporting.UodErDV3T1vY/mvce.rs:6:19: 6:33}
right-hand side has type: &mut {async closure body@/tmp/icemaker_global_tempdir.t1m0hs51jQBf/rustc_testrunner_tmpdir_reporting.UodErDV3T1vY/mvce.rs:6:19: 6:33}
stack backtrace:
   0:     0x77313a2ffb83 - <std::sys::backtrace::BacktraceLock::print::DisplayBacktrace as core::fmt::Display>::fmt::h2db096803c0538a5
   1:     0x77313aa02ff7 - core::fmt::write::h2bd9deb6f5db6782
   2:     0x77313a2f56b3 - std::io::Write::write_fmt::h4227705efcaf9565
   3:     0x77313a2ff9e2 - std::sys::backtrace::BacktraceLock::print::h56b67364e9c86335
   4:     0x77313a3035ca - std::panicking::default_hook::{{closure}}::h3f0ed456e1066d5d
   5:     0x77313a30314f - std::panicking::default_hook::hfeefa2dabcd781fe
   6:     0x7731393fb963 - std[3537e89acc7aaed7]::panicking::update_hook::<alloc[94616aabf5e110b4]::boxed::Box<rustc_driver_impl[86a8aace256a9b33]::install_ice_hook::{closure#1}>>::{closure#0}
   7:     0x77313a303e33 - std::panicking::rust_panic_with_hook::h234a8bbfbe909e0c
   8:     0x77313a303b2a - std::panicking::begin_panic_handler::{{closure}}::h75c4568b39580bcd
   9:     0x77313a300049 - std::sys::backtrace::__rust_end_short_backtrace::hb95ed7221edfb6f1
  10:     0x77313a3037fd - __rustc[ac7174f3e8065775]::rust_begin_unwind
  11:     0x773136a93240 - core::panicking::panic_fmt::h134feef44724d4e2
  12:     0x773138211d42 - <rustc_mir_transform[47c2dced33640326]::validate::CfgChecker>::fail::<alloc[94616aabf5e110b4]::string::String>
  13:     0x77313b699220 - <rustc_mir_transform[47c2dced33640326]::validate::Validator as rustc_mir_transform[47c2dced33640326]::pass_manager::MirPass>::run_pass
  14:     0x77313aa105a3 - rustc_mir_transform[47c2dced33640326]::run_optimization_passes
  15:     0x77313b5d11bd - rustc_mir_transform[47c2dced33640326]::shim::make_shim
  16:     0x77313b5ced2f - rustc_query_impl[bb46ef352fd28360]::plumbing::__rust_begin_short_backtrace::<rustc_query_impl[bb46ef352fd28360]::query_impl::mir_shims::dynamic_query::{closure#2}::{closure#0}, rustc_middle[80666895ac69aa94]::query::erase::Erased<[u8; 8usize]>>
  17:     0x77313b5cece7 - <rustc_query_impl[bb46ef352fd28360]::query_impl::mir_shims::dynamic_query::{closure#2} as core[a08067bb02cbe5a]::ops::function::FnOnce<(rustc_middle[80666895ac69aa94]::ty::context::TyCtxt, rustc_middle[80666895ac69aa94]::ty::instance::InstanceKind)>>::call_once
  18:     0x77313b89be44 - rustc_query_system[dbc003bd89a73e29]::query::plumbing::try_execute_query::<rustc_query_impl[bb46ef352fd28360]::DynamicConfig<rustc_query_system[dbc003bd89a73e29]::query::caches::DefaultCache<rustc_middle[80666895ac69aa94]::ty::instance::InstanceKind, rustc_middle[80666895ac69aa94]::query::erase::Erased<[u8; 8usize]>>, false, false, false>, rustc_query_impl[bb46ef352fd28360]::plumbing::QueryCtxt, false>
  19:     0x77313b89bb55 - rustc_query_impl[bb46ef352fd28360]::query_impl::mir_shims::get_query_non_incr::__rust_end_short_backtrace
  20:     0x77313728e6f5 - <rustc_middle[80666895ac69aa94]::ty::context::TyCtxt>::instance_mir
  21:     0x773137fbdfe7 - rustc_monomorphize[16c92ddbfd6956c4]::mono_checks::check_mono_item
  22:     0x77313b0a80a0 - rustc_query_impl[bb46ef352fd28360]::plumbing::__rust_begin_short_backtrace::<rustc_query_impl[bb46ef352fd28360]::query_impl::check_mono_item::dynamic_query::{closure#2}::{closure#0}, rustc_middle[80666895ac69aa94]::query::erase::Erased<[u8; 0usize]>>
  23:     0x77313b6683b3 - rustc_query_system[dbc003bd89a73e29]::query::plumbing::try_execute_query::<rustc_query_impl[bb46ef352fd28360]::DynamicConfig<rustc_query_system[dbc003bd89a73e29]::query::caches::DefaultCache<rustc_middle[80666895ac69aa94]::ty::instance::Instance, rustc_middle[80666895ac69aa94]::query::erase::Erased<[u8; 0usize]>>, false, false, false>, rustc_query_impl[bb46ef352fd28360]::plumbing::QueryCtxt, false>
  24:     0x77313b66805f - rustc_query_impl[bb46ef352fd28360]::query_impl::check_mono_item::get_query_non_incr::__rust_end_short_backtrace
  25:     0x773137fa6bb9 - rustc_monomorphize[16c92ddbfd6956c4]::collector::items_of_instance
  26:     0x77313aa1697c - rustc_query_impl[bb46ef352fd28360]::plumbing::__rust_begin_short_backtrace::<rustc_query_impl[bb46ef352fd28360]::query_impl::items_of_instance::dynamic_query::{closure#2}::{closure#0}, rustc_middle[80666895ac69aa94]::query::erase::Erased<[u8; 32usize]>>
  27:     0x77313b07862b - rustc_query_system[dbc003bd89a73e29]::query::plumbing::try_execute_query::<rustc_query_impl[bb46ef352fd28360]::DynamicConfig<rustc_query_system[dbc003bd89a73e29]::query::caches::DefaultCache<(rustc_middle[80666895ac69aa94]::ty::instance::Instance, rustc_middle[80666895ac69aa94]::mir::mono::CollectionMode), rustc_middle[80666895ac69aa94]::query::erase::Erased<[u8; 32usize]>>, false, false, false>, rustc_query_impl[bb46ef352fd28360]::plumbing::QueryCtxt, false>
  28:     0x77313b078269 - rustc_query_impl[bb46ef352fd28360]::query_impl::items_of_instance::get_query_non_incr::__rust_end_short_backtrace
  29:     0x77313b07bd41 - rustc_monomorphize[16c92ddbfd6956c4]::collector::collect_items_rec
  30:     0x77313b07ce43 - rustc_monomorphize[16c92ddbfd6956c4]::collector::collect_items_rec
  31:     0x77313b07ce43 - rustc_monomorphize[16c92ddbfd6956c4]::collector::collect_items_rec
  32:     0x77313b0800a1 - rustc_monomorphize[16c92ddbfd6956c4]::collector::collect_crate_mono_items::{closure#1}::{closure#0}
  33:     0x77313b3475b4 - rustc_monomorphize[16c92ddbfd6956c4]::partitioning::collect_and_partition_mono_items
  34:     0x77313beabd56 - rustc_query_impl[bb46ef352fd28360]::plumbing::__rust_begin_short_backtrace::<rustc_query_impl[bb46ef352fd28360]::query_impl::collect_and_partition_mono_items::dynamic_query::{closure#2}::{closure#0}, rustc_middle[80666895ac69aa94]::query::erase::Erased<[u8; 40usize]>>
  35:     0x77313beabd33 - <rustc_query_impl[bb46ef352fd28360]::query_impl::collect_and_partition_mono_items::dynamic_query::{closure#2} as core[a08067bb02cbe5a]::ops::function::FnOnce<(rustc_middle[80666895ac69aa94]::ty::context::TyCtxt, ())>>::call_once
  36:     0x77313beab863 - rustc_query_system[dbc003bd89a73e29]::query::plumbing::try_execute_query::<rustc_query_impl[bb46ef352fd28360]::DynamicConfig<rustc_query_system[dbc003bd89a73e29]::query::caches::SingleCache<rustc_middle[80666895ac69aa94]::query::erase::Erased<[u8; 40usize]>>, false, false, false>, rustc_query_impl[bb46ef352fd28360]::plumbing::QueryCtxt, false>
  37:     0x77313beab603 - rustc_query_impl[bb46ef352fd28360]::query_impl::collect_and_partition_mono_items::get_query_non_incr::__rust_end_short_backtrace
  38:     0x77313bb0af9c - <rustc_codegen_llvm[f2e52499e36a23f9]::LlvmCodegenBackend as rustc_codegen_ssa[18316cca3c803128]::traits::backend::CodegenBackend>::codegen_crate
  39:     0x77313bd5d2e2 - <rustc_interface[d27a25887297ccdd]::queries::Linker>::codegen_and_build_linker
  40:     0x77313bd5b04d - rustc_interface[d27a25887297ccdd]::passes::create_and_enter_global_ctxt::<core[a08067bb02cbe5a]::option::Option<rustc_interface[d27a25887297ccdd]::queries::Linker>, rustc_driver_impl[86a8aace256a9b33]::run_compiler::{closure#0}::{closure#2}>::{closure#2}::{closure#0}
  41:     0x77313bd4a6c9 - rustc_interface[d27a25887297ccdd]::interface::run_compiler::<(), rustc_driver_impl[86a8aace256a9b33]::run_compiler::{closure#0}>::{closure#1}
  42:     0x77313bc0a032 - std[3537e89acc7aaed7]::sys::backtrace::__rust_begin_short_backtrace::<rustc_interface[d27a25887297ccdd]::util::run_in_thread_with_globals<rustc_interface[d27a25887297ccdd]::util::run_in_thread_pool_with_globals<rustc_interface[d27a25887297ccdd]::interface::run_compiler<(), rustc_driver_impl[86a8aace256a9b33]::run_compiler::{closure#0}>::{closure#1}, ()>::{closure#0}, ()>::{closure#0}::{closure#0}, ()>
  43:     0x77313bc09d24 - <<std[3537e89acc7aaed7]::thread::Builder>::spawn_unchecked_<rustc_interface[d27a25887297ccdd]::util::run_in_thread_with_globals<rustc_interface[d27a25887297ccdd]::util::run_in_thread_pool_with_globals<rustc_interface[d27a25887297ccdd]::interface::run_compiler<(), rustc_driver_impl[86a8aace256a9b33]::run_compiler::{closure#0}>::{closure#1}, ()>::{closure#0}, ()>::{closure#0}::{closure#0}, ()>::{closure#1} as core[a08067bb02cbe5a]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0}
  44:     0x77313bc0833d - std::sys::pal::unix::thread::Thread::new::thread_start::h1ccbf030cf233a62
  45:     0x7731356a57eb - <unknown>
  46:     0x77313572918c - <unknown>
  47:                0x0 - <unknown>

error: 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: please make sure that you have updated to the latest nightly

note: rustc 1.89.0-nightly (e314b97ee 2025-06-16) running on x86_64-unknown-linux-gnu

note: compiler flags: -C link-dead-code=true -Z crate-attr=feature(async_drop) -Z dump-mir-dir=dir

query stack during panic:
#0 [mir_shims] generating MIR shim for `core::future::async_drop::async_drop_in_place::{closure#0}`, instance=FutureDropPollShim(DefId(2:15416 ~ core[0a08]::future::async_drop::async_drop_in_place::{closure#0}), Coroutine(DefId(2:15416 ~ core[0a08]::future::async_drop::async_drop_in_place::{closure#0}), [Coroutine(DefId(0:12 ~ mvce[0444]::orchestrate_simple_crud::{closure#0}::{closure#0}::{closure#0}), [i32, core::future::ResumeTy, (), (), CoroutineWitness(DefId(0:12 ~ mvce[0444]::orchestrate_simple_crud::{closure#0}::{closure#0}::{closure#0}), []), ()]), (), core::future::ResumeTy, (), (), CoroutineWitness(DefId(2:15416 ~ core[0a08]::future::async_drop::async_drop_in_place::{closure#0}), [Coroutine(DefId(0:12 ~ mvce[0444]::orchestrate_simple_crud::{closure#0}::{closure#0}::{closure#0}), [i32, core::future::ResumeTy, (), (), CoroutineWitness(DefId(0:12 ~ mvce[0444]::orchestrate_simple_crud::{closure#0}::{closure#0}::{closure#0}), []), ()])]), (*mut Coroutine(DefId(0:12 ~ mvce[0444]::orchestrate_simple_crud::{closure#0}::{closure#0}::{closure#0}), [i32, core::future::ResumeTy, (), (), CoroutineWitness(DefId(0:12 ~ mvce[0444]::orchestrate_simple_crud::{closure#0}::{closure#0}::{closure#0}), []), ()]),)]), Coroutine(DefId(0:12 ~ mvce[0444]::orchestrate_simple_crud::{closure#0}::{closure#0}::{closure#0}), [i32, core::future::ResumeTy, (), (), CoroutineWitness(DefId(0:12 ~ mvce[0444]::orchestrate_simple_crud::{closure#0}::{closure#0}::{closure#0}), []), ()]))
#1 [check_mono_item] monomorphization-time checking
#2 [items_of_instance] collecting items used by `core::future::async_drop::async_drop_in_place::<{async closure body@/tmp/icemaker_global_tempdir.t1m0hs51jQBf/rustc_testrunner_tmpdir_reporting.UodErDV3T1vY/mvce.rs:6:19: 6:33}>::{closure#0} - dropshim({async fn body of core::future::async_drop::async_drop_in_place<{async closure body@/tmp/icemaker_global_tempdir.t1m0hs51jQBf/rustc_testrunner_tmpdir_reporting.UodErDV3T1vY/mvce.rs:6:19: 6:33}>()}-{async closure body@/tmp/icemaker_global_tempdir.t1m0hs51jQBf/rustc_testrunner_tmpdir_reporting.UodErDV3T1vY/mvce.rs:6:19: 6:33})`
#3 [collect_and_partition_mono_items] collect_and_partition_mono_items
end of query stack
warning: 1 warning emitted


@rustbot label +F-async_drop

Metadata

Metadata

Assignees

No one assigned

    Labels

    C-bugCategory: This is a bug.F-async_drop`#![feature(async_drop)]`I-ICEIssue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.needs-triageThis issue may need triage. Remove it if it has been sufficiently triaged.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions