Skip to content

ICE: broken MIR in AsyncDropGlue( #142560

@matthiaskrgr

Description

@matthiaskrgr

auto-reduced (treereduce-rust):

//@compile-flags: --edition=2024 -Zlint-mir
#![feature(async_drop)]

use std::{
    future::{async_drop_in_place, AsyncDrop, Future},
    pin::{pin, Pin},
    sync::{mpsc, Arc},
    task::{Context, Poll, Wake, Waker},
};

struct Foo {
    my_resource_handle: usize,
}

impl Foo {
    fn new(my_resource_handle: usize) -> Self {
        let out = Foo { my_resource_handle };

        out
    }
}

impl Drop for Foo {
    fn drop(&mut self) {}
}

impl AsyncDrop for Foo {
    async fn drop(self: Pin<&mut Self>) {}
}

fn main() {}

async fn bar(ident_base: usize) {
    let _vec: [Foo; 4] = [
        Foo::new(ident_base),
        Foo::new(ident_base + 1),
        Foo::new(ident_base + 2),
        Foo::new(ident_base + 3),
    ];
}
original code

original:

//@ run-pass
//@ check-run-results
// struct `Foo` has both sync and async drop.
// Struct `Complex` contains three `Foo` fields and has complex async drop glue.

#![feature(async_drop)]
#![allow(incomplete_features)]

use std::mem::ManuallyDrop;

//@ edition: 2021

#[inline(never)]
fn myprintln(msg: &str, my_resource_handle: usize) {
    println!("{} : {}", msg, my_resource_handle);
}

use std::{
    future::{Future, async_drop_in_place, AsyncDrop},
    pin::{pin, Pin},
    sync::{mpsc, Arc},
    task::{Context, Poll, Wake, Waker},
};

struct Foo {
    my_resource_handle: usize,
}

impl Foo {
    fn new(my_resource_handle: usize) -> Self {
        let out = Foo {
            my_resource_handle,
        };
        myprintln("{} : {}", my_resource_handle);
        out
    }
}

impl Drop for Foo {
    fn drop(&mut self) {
        myprintln("Foo::drop()", self.my_resource_handle);
    }
}

impl AsyncDrop for Foo {
    async fn drop(self: Pin<&mut Self>) {
        myprintln("Foo::async drop()", self.my_resource_handle);
    }
}

fn main() {
    {
        let _ = Foo::new(7);
    }
    println!("Middle");
    {
        block_on(bar(10));
    }
    println!("Done")
}

async fn bar(ident_base: usize) {
    let _vec: [Foo; 4] = [
        Foo::new(ident_base),
        Foo::new(ident_base + 1),
        Foo::new(ident_base + 2),
        Foo::new(ident_base + 3)
    ];
}

fn block_on<F>(fut_unpin: F) -> F::Output
where
    F: Future,
{
    let mut fut_pin = pin!(ManuallyDrop::new(fut_unpin));
    let mut fut: Pin<&mut F> = unsafe {
        Pin::map_unchecked_mut(fut_pin.as_mut(), |x| &mut **x)
    };
    let (waker, rx) = simple_waker();
    let mut context = Context::from_waker(&waker);
    let rv = loop {
        match fut.as_mut().poll(&mut context) {
            Poll::Ready(out) => break out,
            // expect wake in polls
            Poll::Pending => rx.try_recv().unwrap(),
        }
    };
    let drop_fut_unpin = unsafe { async_drop_in_place(fut.get_unchecked_mut()) };
    let mut drop_fut: Pin<&mut _> = pin!(drop_fut_unpin);
    loop {
        match drop_fut.as_mut().poll(&mut context) {
            Poll::Ready(()) => break,
            Poll::Pending => rx.try_recv().unwrap(),
        }
    }
    rv
}

fn simple_waker() -> (Waker, mpsc::Receiver<()>) {
    struct SimpleWaker {
        tx: std::sync::mpsc::Sender<()>,
    }

    impl Wake for SimpleWaker {
        fn wake(self: Arc<Self>) {
            self.tx.send(()).unwrap();
        }
    }

    let (tx, rx) = mpsc::channel();
    (Waker::from(Arc::new(SimpleWaker { tx })), rx)
}

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

Command:
/home/matthias/.rustup/toolchains/master/bin/rustc --edition=2024 -Zlint-mir

Program output

warning: the feature `async_drop` is incomplete and may not be safe to use and/or cause compiler crashes
 --> /tmp/icemaker_global_tempdir.bKTOtfhuUm9A/rustc_testrunner_tmpdir_reporting.BhA5t2N8nShp/mvce.rs: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

warning: unused imports: `Arc`, `Context`, `Future`, `Poll`, `Wake`, `Waker`, `async_drop_in_place`, `mpsc`, and `pin`
 --> /tmp/icemaker_global_tempdir.bKTOtfhuUm9A/rustc_testrunner_tmpdir_reporting.BhA5t2N8nShp/mvce.rs:4:14
  |
4 |     future::{async_drop_in_place, AsyncDrop, Future},
  |              ^^^^^^^^^^^^^^^^^^^             ^^^^^^
5 |     pin::{pin, Pin},
  |           ^^^
6 |     sync::{mpsc, Arc},
  |            ^^^^  ^^^
7 |     task::{Context, Poll, Wake, Waker},
  |            ^^^^^^^  ^^^^  ^^^^  ^^^^^
  |
  = note: `#[warn(unused_imports)]` on by default

warning: field `my_resource_handle` is never read
  --> /tmp/icemaker_global_tempdir.bKTOtfhuUm9A/rustc_testrunner_tmpdir_reporting.BhA5t2N8nShp/mvce.rs:11:5
   |
10 | struct Foo {
   |        --- field in this struct
11 |     my_resource_handle: usize,
   |     ^^^^^^^^^^^^^^^^^^
   |
   = note: `#[warn(dead_code)]` on by default

warning: associated function `new` is never used
  --> /tmp/icemaker_global_tempdir.bKTOtfhuUm9A/rustc_testrunner_tmpdir_reporting.BhA5t2N8nShp/mvce.rs:15:8
   |
14 | impl Foo {
   | -------- associated function in this implementation
15 |     fn new(my_resource_handle: usize) -> Self {
   |        ^^^

warning: function `bar` is never used
  --> /tmp/icemaker_global_tempdir.bKTOtfhuUm9A/rustc_testrunner_tmpdir_reporting.BhA5t2N8nShp/mvce.rs:32:10
   |
32 | async fn bar(ident_base: usize) {
   |          ^^^

warning: 5 warnings emitted

note: no errors encountered even though delayed bugs were created

note: those delayed bugs will now be shown as internal compiler errors

error: internal compiler error: broken MIR in AsyncDropGlue(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}), [[Foo; 4_usize], (), std::future::ResumeTy, (), (), CoroutineWitness(DefId(2:15416 ~ core[0a08]::future::async_drop::async_drop_in_place::{closure#0}), [[Foo; 4_usize]]), (*mut [Foo; 4_usize],)])) (after pass MentionedItems) at bb12[2]:
                                StorageLive(_19) which already has storage here
  --> /home/matthias/.rustup/toolchains/master/lib/rustlib/src/rust/library/core/src/future/async_drop.rs:46:70
   |
46 |   pub async unsafe fn async_drop_in_place<T: ?Sized>(_to_drop: *mut T) {
   |  ______________________________________________________________________^
...  |
49 | | }
   | |_^
   |
note: delayed at compiler/rustc_mir_transform/src/lint.rs:96:26
         0: <rustc_errors::DiagCtxtInner>::emit_diagnostic
         1: <rustc_errors::DiagCtxtHandle>::emit_diagnostic
         2: <rustc_span::ErrorGuaranteed as rustc_errors::diagnostic::EmissionGuarantee>::emit_producing_guarantee
         3: <rustc_errors::DiagCtxtHandle>::span_delayed_bug::<rustc_span::span_encoding::Span, alloc::string::String>
         4: <rustc_mir_transform::lint::Lint>::fail::<alloc::string::String>
         5: <rustc_mir_transform::lint::Lint as rustc_middle::mir::visit::Visitor>::visit_statement
         6: rustc_mir_transform::lint::lint_body
         7: rustc_mir_transform::pass_manager::run_passes_inner
         8: rustc_mir_transform::shim::make_shim
         9: rustc_query_impl::plumbing::__rust_begin_short_backtrace::<rustc_query_impl::query_impl::mir_shims::dynamic_query::{closure#2}::{closure#0}, rustc_middle::query::erase::Erased<[u8; 8]>>
        10: <rustc_query_impl::query_impl::mir_shims::dynamic_query::{closure#2} as core::ops::function::FnOnce<(rustc_middle::ty::context::TyCtxt, rustc_middle::ty::instance::InstanceKind)>>::call_once
        11: rustc_query_system::query::plumbing::try_execute_query::<rustc_query_impl::DynamicConfig<rustc_query_system::query::caches::DefaultCache<rustc_middle::ty::instance::InstanceKind, rustc_middle::query::erase::Erased<[u8; 8]>>, false, false, false>, rustc_query_impl::plumbing::QueryCtxt, false>
        12: rustc_query_impl::query_impl::mir_shims::get_query_non_incr::__rust_end_short_backtrace
        13: <rustc_middle::ty::context::TyCtxt>::coroutine_layout
        14: rustc_ty_utils::layout::layout_of_uncached
        15: rustc_ty_utils::layout::layout_of
        16: rustc_query_impl::plumbing::__rust_begin_short_backtrace::<rustc_query_impl::query_impl::layout_of::dynamic_query::{closure#2}::{closure#0}, rustc_middle::query::erase::Erased<[u8; 16]>>
        17: rustc_query_system::query::plumbing::try_execute_query::<rustc_query_impl::DynamicConfig<rustc_query_system::query::caches::DefaultCache<rustc_middle::ty::PseudoCanonicalInput<rustc_middle::ty::Ty>, rustc_middle::query::erase::Erased<[u8; 16]>>, false, true, false>, rustc_query_impl::plumbing::QueryCtxt, false>
        18: rustc_query_impl::query_impl::layout_of::get_query_non_incr::__rust_end_short_backtrace
        19: rustc_ty_utils::layout::layout_of_uncached
        20: rustc_ty_utils::layout::layout_of
        21: rustc_query_impl::plumbing::__rust_begin_short_backtrace::<rustc_query_impl::query_impl::layout_of::dynamic_query::{closure#2}::{closure#0}, rustc_middle::query::erase::Erased<[u8; 16]>>
        22: rustc_query_system::query::plumbing::try_execute_query::<rustc_query_impl::DynamicConfig<rustc_query_system::query::caches::DefaultCache<rustc_middle::ty::PseudoCanonicalInput<rustc_middle::ty::Ty>, rustc_middle::query::erase::Erased<[u8; 16]>>, false, true, false>, rustc_query_impl::plumbing::QueryCtxt, false>
        23: rustc_query_impl::query_impl::layout_of::get_query_non_incr::__rust_end_short_backtrace
        24: rustc_ty_utils::layout::layout_of_uncached
        25: rustc_ty_utils::layout::layout_of
        26: rustc_query_impl::plumbing::__rust_begin_short_backtrace::<rustc_query_impl::query_impl::layout_of::dynamic_query::{closure#2}::{closure#0}, rustc_middle::query::erase::Erased<[u8; 16]>>
        27: rustc_query_system::query::plumbing::try_execute_query::<rustc_query_impl::DynamicConfig<rustc_query_system::query::caches::DefaultCache<rustc_middle::ty::PseudoCanonicalInput<rustc_middle::ty::Ty>, rustc_middle::query::erase::Erased<[u8; 16]>>, false, true, false>, rustc_query_impl::plumbing::QueryCtxt, false>
        28: rustc_query_impl::query_impl::layout_of::get_query_non_incr::__rust_end_short_backtrace
        29: rustc_ty_utils::layout::layout_of
        30: rustc_query_impl::plumbing::__rust_begin_short_backtrace::<rustc_query_impl::query_impl::layout_of::dynamic_query::{closure#2}::{closure#0}, rustc_middle::query::erase::Erased<[u8; 16]>>
        31: rustc_query_system::query::plumbing::try_execute_query::<rustc_query_impl::DynamicConfig<rustc_query_system::query::caches::DefaultCache<rustc_middle::ty::PseudoCanonicalInput<rustc_middle::ty::Ty>, rustc_middle::query::erase::Erased<[u8; 16]>>, false, true, false>, rustc_query_impl::plumbing::QueryCtxt, false>
        32: rustc_query_impl::query_impl::layout_of::get_query_non_incr::__rust_end_short_backtrace
        33: <rustc_middle::ty::layout::LayoutCx as rustc_middle::ty::layout::LayoutOf>::spanned_layout_of
        34: <core::iter::adapters::GenericShunt<core::iter::adapters::by_ref_sized::ByRefSized<core::iter::adapters::map::Map<core::slice::iter::Iter<rustc_middle::mir::query::CoroutineSavedTy>, rustc_ty_utils::layout::layout_of_uncached::{closure#12}>>, core::result::Result<core::convert::Infallible, &rustc_middle::ty::layout::LayoutError>> as core::iter::traits::iterator::Iterator>::next
        35: core::iter::adapters::try_process::<core::iter::adapters::by_ref_sized::ByRefSized<core::iter::adapters::map::Map<core::slice::iter::Iter<rustc_middle::mir::query::CoroutineSavedTy>, rustc_ty_utils::layout::layout_of_uncached::{closure#12}>>, rustc_abi::layout::ty::TyAndLayout<rustc_middle::ty::Ty>, core::result::Result<core::convert::Infallible, &rustc_middle::ty::layout::LayoutError>, <core::iter::adapters::map::Map<core::slice::iter::Iter<rustc_middle::mir::query::CoroutineSavedTy>, rustc_ty_utils::layout::layout_of_uncached::{closure#12}> as core::iter::traits::iterator::Iterator>::try_collect<rustc_index::vec::IndexVec<rustc_middle::mir::query::CoroutineSavedLocal, rustc_abi::layout::ty::TyAndLayout<rustc_middle::ty::Ty>>>::{closure#0}, rustc_index::vec::IndexVec<rustc_middle::mir::query::CoroutineSavedLocal, rustc_abi::layout::ty::TyAndLayout<rustc_middle::ty::Ty>>>
        36: rustc_ty_utils::layout::layout_of_uncached
        37: rustc_ty_utils::layout::layout_of
        38: rustc_query_impl::plumbing::__rust_begin_short_backtrace::<rustc_query_impl::query_impl::layout_of::dynamic_query::{closure#2}::{closure#0}, rustc_middle::query::erase::Erased<[u8; 16]>>
        39: rustc_query_system::query::plumbing::try_execute_query::<rustc_query_impl::DynamicConfig<rustc_query_system::query::caches::DefaultCache<rustc_middle::ty::PseudoCanonicalInput<rustc_middle::ty::Ty>, rustc_middle::query::erase::Erased<[u8; 16]>>, false, true, false>, rustc_query_impl::plumbing::QueryCtxt, false>
        40: rustc_query_impl::query_impl::layout_of::get_query_non_incr::__rust_end_short_backtrace
        41: <rustc_mir_transform::known_panics_lint::KnownPanicsLint as rustc_mir_transform::pass_manager::MirLint>::run_lint
        42: rustc_mir_transform::run_analysis_to_runtime_passes
        43: rustc_mir_transform::mir_drops_elaborated_and_const_checked
        44: rustc_query_impl::plumbing::__rust_begin_short_backtrace::<rustc_query_impl::query_impl::mir_drops_elaborated_and_const_checked::dynamic_query::{closure#2}::{closure#0}, rustc_middle::query::erase::Erased<[u8; 8]>>
        45: rustc_query_system::query::plumbing::try_execute_query::<rustc_query_impl::DynamicConfig<rustc_data_structures::vec_cache::VecCache<rustc_span::def_id::LocalDefId, rustc_middle::query::erase::Erased<[u8; 8]>, rustc_query_system::dep_graph::graph::DepNodeIndex>, false, false, false>, rustc_query_impl::plumbing::QueryCtxt, false>
        46: rustc_query_impl::query_impl::mir_drops_elaborated_and_const_checked::get_query_non_incr::__rust_end_short_backtrace
        47: <rustc_middle::ty::context::TyCtxt>::par_hir_body_owners::<rustc_interface::passes::run_required_analyses::{closure#1}::{closure#0}>::{closure#0}
        48: rustc_interface::passes::analysis
        49: rustc_query_impl::plumbing::__rust_begin_short_backtrace::<rustc_query_impl::query_impl::analysis::dynamic_query::{closure#2}::{closure#0}, rustc_middle::query::erase::Erased<[u8; 0]>>
        50: rustc_query_system::query::plumbing::try_execute_query::<rustc_query_impl::DynamicConfig<rustc_query_system::query::caches::SingleCache<rustc_middle::query::erase::Erased<[u8; 0]>>, false, false, false>, rustc_query_impl::plumbing::QueryCtxt, false>
        51: rustc_query_impl::query_impl::analysis::get_query_non_incr::__rust_end_short_backtrace
        52: rustc_interface::passes::create_and_enter_global_ctxt::<core::option::Option<rustc_interface::queries::Linker>, rustc_driver_impl::run_compiler::{closure#0}::{closure#2}>::{closure#2}::{closure#0}
        53: rustc_interface::interface::run_compiler::<(), rustc_driver_impl::run_compiler::{closure#0}>::{closure#1}
        54: std::sys::backtrace::__rust_begin_short_backtrace::<rustc_interface::util::run_in_thread_with_globals<rustc_interface::util::run_in_thread_pool_with_globals<rustc_interface::interface::run_compiler<(), rustc_driver_impl::run_compiler::{closure#0}>::{closure#1}, ()>::{closure#0}, ()>::{closure#0}::{closure#0}, ()>
        55: <<std::thread::Builder>::spawn_unchecked_<rustc_interface::util::run_in_thread_with_globals<rustc_interface::util::run_in_thread_pool_with_globals<rustc_interface::interface::run_compiler<(), rustc_driver_impl::run_compiler::{closure#0}>::{closure#1}, ()>::{closure#0}, ()>::{closure#0}::{closure#0}, ()>::{closure#1} as core::ops::function::FnOnce<()>>::call_once::{shim:vtable#0}
        56: std::sys::pal::unix::thread::Thread::new::thread_start
        57: <unknown>
        58: <unknown>
  --> /home/matthias/.rustup/toolchains/master/lib/rustlib/src/rust/library/core/src/future/async_drop.rs:46:70
   |
46 |   pub async unsafe fn async_drop_in_place<T: ?Sized>(_to_drop: *mut T) {
   |  ______________________________________________________________________^
...  |
49 | | }
   | |_^

error: internal compiler error: broken MIR in AsyncDropGlue(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}), [[Foo; 4_usize], (), std::future::ResumeTy, (), (), CoroutineWitness(DefId(2:15416 ~ core[0a08]::future::async_drop::async_drop_in_place::{closure#0}), [[Foo; 4_usize]]), (*mut [Foo; 4_usize],)])) (after pass MentionedItems) at bb8[2]:
                                StorageLive(_12) which already has storage here
  --> /home/matthias/.rustup/toolchains/master/lib/rustlib/src/rust/library/core/src/future/async_drop.rs:46:70
   |
46 |   pub async unsafe fn async_drop_in_place<T: ?Sized>(_to_drop: *mut T) {
   |  ______________________________________________________________________^
...  |
49 | | }
   | |_^
   |
note: delayed at compiler/rustc_mir_transform/src/lint.rs:96:26
         0: <rustc_errors::DiagCtxtInner>::emit_diagnostic
         1: <rustc_errors::DiagCtxtHandle>::emit_diagnostic
         2: <rustc_span::ErrorGuaranteed as rustc_errors::diagnostic::EmissionGuarantee>::emit_producing_guarantee
         3: <rustc_errors::DiagCtxtHandle>::span_delayed_bug::<rustc_span::span_encoding::Span, alloc::string::String>
         4: <rustc_mir_transform::lint::Lint>::fail::<alloc::string::String>
         5: <rustc_mir_transform::lint::Lint as rustc_middle::mir::visit::Visitor>::visit_statement
         6: rustc_mir_transform::lint::lint_body
         7: rustc_mir_transform::pass_manager::run_passes_inner
         8: rustc_mir_transform::shim::make_shim
         9: rustc_query_impl::plumbing::__rust_begin_short_backtrace::<rustc_query_impl::query_impl::mir_shims::dynamic_query::{closure#2}::{closure#0}, rustc_middle::query::erase::Erased<[u8; 8]>>
        10: <rustc_query_impl::query_impl::mir_shims::dynamic_query::{closure#2} as core::ops::function::FnOnce<(rustc_middle::ty::context::TyCtxt, rustc_middle::ty::instance::InstanceKind)>>::call_once
        11: rustc_query_system::query::plumbing::try_execute_query::<rustc_query_impl::DynamicConfig<rustc_query_system::query::caches::DefaultCache<rustc_middle::ty::instance::InstanceKind, rustc_middle::query::erase::Erased<[u8; 8]>>, false, false, false>, rustc_query_impl::plumbing::QueryCtxt, false>
        12: rustc_query_impl::query_impl::mir_shims::get_query_non_incr::__rust_end_short_backtrace
        13: <rustc_middle::ty::context::TyCtxt>::coroutine_layout
        14: rustc_ty_utils::layout::layout_of_uncached
        15: rustc_ty_utils::layout::layout_of
        16: rustc_query_impl::plumbing::__rust_begin_short_backtrace::<rustc_query_impl::query_impl::layout_of::dynamic_query::{closure#2}::{closure#0}, rustc_middle::query::erase::Erased<[u8; 16]>>
        17: rustc_query_system::query::plumbing::try_execute_query::<rustc_query_impl::DynamicConfig<rustc_query_system::query::caches::DefaultCache<rustc_middle::ty::PseudoCanonicalInput<rustc_middle::ty::Ty>, rustc_middle::query::erase::Erased<[u8; 16]>>, false, true, false>, rustc_query_impl::plumbing::QueryCtxt, false>
        18: rustc_query_impl::query_impl::layout_of::get_query_non_incr::__rust_end_short_backtrace
        19: rustc_ty_utils::layout::layout_of_uncached
        20: rustc_ty_utils::layout::layout_of
        21: rustc_query_impl::plumbing::__rust_begin_short_backtrace::<rustc_query_impl::query_impl::layout_of::dynamic_query::{closure#2}::{closure#0}, rustc_middle::query::erase::Erased<[u8; 16]>>
        22: rustc_query_system::query::plumbing::try_execute_query::<rustc_query_impl::DynamicConfig<rustc_query_system::query::caches::DefaultCache<rustc_middle::ty::PseudoCanonicalInput<rustc_middle::ty::Ty>, rustc_middle::query::erase::Erased<[u8; 16]>>, false, true, false>, rustc_query_impl::plumbing::QueryCtxt, false>
        23: rustc_query_impl::query_impl::layout_of::get_query_non_incr::__rust_end_short_backtrace
        24: rustc_ty_utils::layout::layout_of_uncached
        25: rustc_ty_utils::layout::layout_of
        26: rustc_query_impl::plumbing::__rust_begin_short_backtrace::<rustc_query_impl::query_impl::layout_of::dynamic_query::{closure#2}::{closure#0}, rustc_middle::query::erase::Erased<[u8; 16]>>
        27: rustc_query_system::query::plumbing::try_execute_query::<rustc_query_impl::DynamicConfig<rustc_query_system::query::caches::DefaultCache<rustc_middle::ty::PseudoCanonicalInput<rustc_middle::ty::Ty>, rustc_middle::query::erase::Erased<[u8; 16]>>, false, true, false>, rustc_query_impl::plumbing::QueryCtxt, false>
        28: rustc_query_impl::query_impl::layout_of::get_query_non_incr::__rust_end_short_backtrace
        29: rustc_ty_utils::layout::layout_of
        30: rustc_query_impl::plumbing::__rust_begin_short_backtrace::<rustc_query_impl::query_impl::layout_of::dynamic_query::{closure#2}::{closure#0}, rustc_middle::query::erase::Erased<[u8; 16]>>
        31: rustc_query_system::query::plumbing::try_execute_query::<rustc_query_impl::DynamicConfig<rustc_query_system::query::caches::DefaultCache<rustc_middle::ty::PseudoCanonicalInput<rustc_middle::ty::Ty>, rustc_middle::query::erase::Erased<[u8; 16]>>, false, true, false>, rustc_query_impl::plumbing::QueryCtxt, false>
        32: rustc_query_impl::query_impl::layout_of::get_query_non_incr::__rust_end_short_backtrace
        33: <rustc_middle::ty::layout::LayoutCx as rustc_middle::ty::layout::LayoutOf>::spanned_layout_of
        34: <core::iter::adapters::GenericShunt<core::iter::adapters::by_ref_sized::ByRefSized<core::iter::adapters::map::Map<core::slice::iter::Iter<rustc_middle::mir::query::CoroutineSavedTy>, rustc_ty_utils::layout::layout_of_uncached::{closure#12}>>, core::result::Result<core::convert::Infallible, &rustc_middle::ty::layout::LayoutError>> as core::iter::traits::iterator::Iterator>::next
        35: core::iter::adapters::try_process::<core::iter::adapters::by_ref_sized::ByRefSized<core::iter::adapters::map::Map<core::slice::iter::Iter<rustc_middle::mir::query::CoroutineSavedTy>, rustc_ty_utils::layout::layout_of_uncached::{closure#12}>>, rustc_abi::layout::ty::TyAndLayout<rustc_middle::ty::Ty>, core::result::Result<core::convert::Infallible, &rustc_middle::ty::layout::LayoutError>, <core::iter::adapters::map::Map<core::slice::iter::Iter<rustc_middle::mir::query::CoroutineSavedTy>, rustc_ty_utils::layout::layout_of_uncached::{closure#12}> as core::iter::traits::iterator::Iterator>::try_collect<rustc_index::vec::IndexVec<rustc_middle::mir::query::CoroutineSavedLocal, rustc_abi::layout::ty::TyAndLayout<rustc_middle::ty::Ty>>>::{closure#0}, rustc_index::vec::IndexVec<rustc_middle::mir::query::CoroutineSavedLocal, rustc_abi::layout::ty::TyAndLayout<rustc_middle::ty::Ty>>>
        36: rustc_ty_utils::layout::layout_of_uncached
        37: rustc_ty_utils::layout::layout_of
        38: rustc_query_impl::plumbing::__rust_begin_short_backtrace::<rustc_query_impl::query_impl::layout_of::dynamic_query::{closure#2}::{closure#0}, rustc_middle::query::erase::Erased<[u8; 16]>>
        39: rustc_query_system::query::plumbing::try_execute_query::<rustc_query_impl::DynamicConfig<rustc_query_system::query::caches::DefaultCache<rustc_middle::ty::PseudoCanonicalInput<rustc_middle::ty::Ty>, rustc_middle::query::erase::Erased<[u8; 16]>>, false, true, false>, rustc_query_impl::plumbing::QueryCtxt, false>
        40: rustc_query_impl::query_impl::layout_of::get_query_non_incr::__rust_end_short_backtrace
        41: <rustc_mir_transform::known_panics_lint::KnownPanicsLint as rustc_mir_transform::pass_manager::MirLint>::run_lint
        42: rustc_mir_transform::run_analysis_to_runtime_passes
        43: rustc_mir_transform::mir_drops_elaborated_and_const_checked
        44: rustc_query_impl::plumbing::__rust_begin_short_backtrace::<rustc_query_impl::query_impl::mir_drops_elaborated_and_const_checked::dynamic_query::{closure#2}::{closure#0}, rustc_middle::query::erase::Erased<[u8; 8]>>
        45: rustc_query_system::query::plumbing::try_execute_query::<rustc_query_impl::DynamicConfig<rustc_data_structures::vec_cache::VecCache<rustc_span::def_id::LocalDefId, rustc_middle::query::erase::Erased<[u8; 8]>, rustc_query_system::dep_graph::graph::DepNodeIndex>, false, false, false>, rustc_query_impl::plumbing::QueryCtxt, false>
        46: rustc_query_impl::query_impl::mir_drops_elaborated_and_const_checked::get_query_non_incr::__rust_end_short_backtrace
        47: <rustc_middle::ty::context::TyCtxt>::par_hir_body_owners::<rustc_interface::passes::run_required_analyses::{closure#1}::{closure#0}>::{closure#0}
        48: rustc_interface::passes::analysis
        49: rustc_query_impl::plumbing::__rust_begin_short_backtrace::<rustc_query_impl::query_impl::analysis::dynamic_query::{closure#2}::{closure#0}, rustc_middle::query::erase::Erased<[u8; 0]>>
        50: rustc_query_system::query::plumbing::try_execute_query::<rustc_query_impl::DynamicConfig<rustc_query_system::query::caches::SingleCache<rustc_middle::query::erase::Erased<[u8; 0]>>, false, false, false>, rustc_query_impl::plumbing::QueryCtxt, false>
        51: rustc_query_impl::query_impl::analysis::get_query_non_incr::__rust_end_short_backtrace
        52: rustc_interface::passes::create_and_enter_global_ctxt::<core::option::Option<rustc_interface::queries::Linker>, rustc_driver_impl::run_compiler::{closure#0}::{closure#2}>::{closure#2}::{closure#0}
        53: rustc_interface::interface::run_compiler::<(), rustc_driver_impl::run_compiler::{closure#0}>::{closure#1}
        54: std::sys::backtrace::__rust_begin_short_backtrace::<rustc_interface::util::run_in_thread_with_globals<rustc_interface::util::run_in_thread_pool_with_globals<rustc_interface::interface::run_compiler<(), rustc_driver_impl::run_compiler::{closure#0}>::{closure#1}, ()>::{closure#0}, ()>::{closure#0}::{closure#0}, ()>
        55: <<std::thread::Builder>::spawn_unchecked_<rustc_interface::util::run_in_thread_with_globals<rustc_interface::util::run_in_thread_pool_with_globals<rustc_interface::interface::run_compiler<(), rustc_driver_impl::run_compiler::{closure#0}>::{closure#1}, ()>::{closure#0}, ()>::{closure#0}::{closure#0}, ()>::{closure#1} as core::ops::function::FnOnce<()>>::call_once::{shim:vtable#0}
        56: std::sys::pal::unix::thread::Thread::new::thread_start
        57: <unknown>
        58: <unknown>
  --> /home/matthias/.rustup/toolchains/master/lib/rustlib/src/rust/library/core/src/future/async_drop.rs:46:70
   |
46 |   pub async unsafe fn async_drop_in_place<T: ?Sized>(_to_drop: *mut T) {
   |  ______________________________________________________________________^
...  |
49 | | }
   | |_^

error: internal compiler error: broken MIR in AsyncDropGlue(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}), [[Foo; 4_usize], (), std::future::ResumeTy, (), (), CoroutineWitness(DefId(2:15416 ~ core[0a08]::future::async_drop::async_drop_in_place::{closure#0}), [[Foo; 4_usize]]), (*mut [Foo; 4_usize],)])) (after pass AbortUnwindingCalls) at bb12[2]:
                                StorageLive(_19) which already has storage here
  --> /home/matthias/.rustup/toolchains/master/lib/rustlib/src/rust/library/core/src/future/async_drop.rs:46:70
   |
46 |   pub async unsafe fn async_drop_in_place<T: ?Sized>(_to_drop: *mut T) {
   |  ______________________________________________________________________^
...  |
49 | | }
   | |_^
   |
note: delayed at compiler/rustc_mir_transform/src/lint.rs:96:26
         0: <rustc_errors::DiagCtxtInner>::emit_diagnostic
         1: <rustc_errors::DiagCtxtHandle>::emit_diagnostic
         2: <rustc_span::ErrorGuaranteed as rustc_errors::diagnostic::EmissionGuarantee>::emit_producing_guarantee
         3: <rustc_errors::DiagCtxtHandle>::span_delayed_bug::<rustc_span::span_encoding::Span, alloc::string::String>
         4: <rustc_mir_transform::lint::Lint>::fail::<alloc::string::String>
         5: <rustc_mir_transform::lint::Lint as rustc_middle::mir::visit::Visitor>::visit_statement
         6: rustc_mir_transform::lint::lint_body
         7: rustc_mir_transform::pass_manager::run_passes_inner
         8: rustc_mir_transform::shim::make_shim
         9: rustc_query_impl::plumbing::__rust_begin_short_backtrace::<rustc_query_impl::query_impl::mir_shims::dynamic_query::{closure#2}::{closure#0}, rustc_middle::query::erase::Erased<[u8; 8]>>
        10: <rustc_query_impl::query_impl::mir_shims::dynamic_query::{closure#2} as core::ops::function::FnOnce<(rustc_middle::ty::context::TyCtxt, rustc_middle::ty::instance::InstanceKind)>>::call_once
        11: rustc_query_system::query::plumbing::try_execute_query::<rustc_query_impl::DynamicConfig<rustc_query_system::query::caches::DefaultCache<rustc_middle::ty::instance::InstanceKind, rustc_middle::query::erase::Erased<[u8; 8]>>, false, false, false>, rustc_query_impl::plumbing::QueryCtxt, false>
        12: rustc_query_impl::query_impl::mir_shims::get_query_non_incr::__rust_end_short_backtrace
        13: <rustc_middle::ty::context::TyCtxt>::coroutine_layout
        14: rustc_ty_utils::layout::layout_of_uncached
        15: rustc_ty_utils::layout::layout_of
        16: rustc_query_impl::plumbing::__rust_begin_short_backtrace::<rustc_query_impl::query_impl::layout_of::dynamic_query::{closure#2}::{closure#0}, rustc_middle::query::erase::Erased<[u8; 16]>>
        17: rustc_query_system::query::plumbing::try_execute_query::<rustc_query_impl::DynamicConfig<rustc_query_system::query::caches::DefaultCache<rustc_middle::ty::PseudoCanonicalInput<rustc_middle::ty::Ty>, rustc_middle::query::erase::Erased<[u8; 16]>>, false, true, false>, rustc_query_impl::plumbing::QueryCtxt, false>
        18: rustc_query_impl::query_impl::layout_of::get_query_non_incr::__rust_end_short_backtrace
        19: rustc_ty_utils::layout::layout_of_uncached
        20: rustc_ty_utils::layout::layout_of
        21: rustc_query_impl::plumbing::__rust_begin_short_backtrace::<rustc_query_impl::query_impl::layout_of::dynamic_query::{closure#2}::{closure#0}, rustc_middle::query::erase::Erased<[u8; 16]>>
        22: rustc_query_system::query::plumbing::try_execute_query::<rustc_query_impl::DynamicConfig<rustc_query_system::query::caches::DefaultCache<rustc_middle::ty::PseudoCanonicalInput<rustc_middle::ty::Ty>, rustc_middle::query::erase::Erased<[u8; 16]>>, false, true, false>, rustc_query_impl::plumbing::QueryCtxt, false>
        23: rustc_query_impl::query_impl::layout_of::get_query_non_incr::__rust_end_short_backtrace
        24: rustc_ty_utils::layout::layout_of_uncached
        25: rustc_ty_utils::layout::layout_of
        26: rustc_query_impl::plumbing::__rust_begin_short_backtrace::<rustc_query_impl::query_impl::layout_of::dynamic_query::{closure#2}::{closure#0}, rustc_middle::query::erase::Erased<[u8; 16]>>
        27: rustc_query_system::query::plumbing::try_execute_query::<rustc_query_impl::DynamicConfig<rustc_query_system::query::caches::DefaultCache<rustc_middle::ty::PseudoCanonicalInput<rustc_middle::ty::Ty>, rustc_middle::query::erase::Erased<[u8; 16]>>, false, true, false>, rustc_query_impl::plumbing::QueryCtxt, false>
        28: rustc_query_impl::query_impl::layout_of::get_query_non_incr::__rust_end_short_backtrace
        29: rustc_ty_utils::layout::layout_of
        30: rustc_query_impl::plumbing::__rust_begin_short_backtrace::<rustc_query_impl::query_impl::layout_of::dynamic_query::{closure#2}::{closure#0}, rustc_middle::query::erase::Erased<[u8; 16]>>
        31: rustc_query_system::query::plumbing::try_execute_query::<rustc_query_impl::DynamicConfig<rustc_query_system::query::caches::DefaultCache<rustc_middle::ty::PseudoCanonicalInput<rustc_middle::ty::Ty>, rustc_middle::query::erase::Erased<[u8; 16]>>, false, true, false>, rustc_query_impl::plumbing::QueryCtxt, false>
        32: rustc_query_impl::query_impl::layout_of::get_query_non_incr::__rust_end_short_backtrace
        33: <rustc_middle::ty::layout::LayoutCx as rustc_middle::ty::layout::LayoutOf>::spanned_layout_of
        34: <core::iter::adapters::GenericShunt<core::iter::adapters::by_ref_sized::ByRefSized<core::iter::adapters::map::Map<core::slice::iter::Iter<rustc_middle::mir::query::CoroutineSavedTy>, rustc_ty_utils::layout::layout_of_uncached::{closure#12}>>, core::result::Result<core::convert::Infallible, &rustc_middle::ty::layout::LayoutError>> as core::iter::traits::iterator::Iterator>::next
        35: core::iter::adapters::try_process::<core::iter::adapters::by_ref_sized::ByRefSized<core::iter::adapters::map::Map<core::slice::iter::Iter<rustc_middle::mir::query::CoroutineSavedTy>, rustc_ty_utils::layout::layout_of_uncached::{closure#12}>>, rustc_abi::layout::ty::TyAndLayout<rustc_middle::ty::Ty>, core::result::Result<core::convert::Infallible, &rustc_middle::ty::layout::LayoutError>, <core::iter::adapters::map::Map<core::slice::iter::Iter<rustc_middle::mir::query::CoroutineSavedTy>, rustc_ty_utils::layout::layout_of_uncached::{closure#12}> as core::iter::traits::iterator::Iterator>::try_collect<rustc_index::vec::IndexVec<rustc_middle::mir::query::CoroutineSavedLocal, rustc_abi::layout::ty::TyAndLayout<rustc_middle::ty::Ty>>>::{closure#0}, rustc_index::vec::IndexVec<rustc_middle::mir::query::CoroutineSavedLocal, rustc_abi::layout::ty::TyAndLayout<rustc_middle::ty::Ty>>>
        36: rustc_ty_utils::layout::layout_of_uncached
        37: rustc_ty_utils::layout::layout_of
        38: rustc_query_impl::plumbing::__rust_begin_short_backtrace::<rustc_query_impl::query_impl::layout_of::dynamic_query::{closure#2}::{closure#0}, rustc_middle::query::erase::Erased<[u8; 16]>>
        39: rustc_query_system::query::plumbing::try_execute_query::<rustc_query_impl::DynamicConfig<rustc_query_system::query::caches::DefaultCache<rustc_middle::ty::PseudoCanonicalInput<rustc_middle::ty::Ty>, rustc_middle::query::erase::Erased<[u8; 16]>>, false, true, false>, rustc_query_impl::plumbing::QueryCtxt, false>
        40: rustc_query_impl::query_impl::layout_of::get_query_non_incr::__rust_end_short_backtrace
        41: <rustc_mir_transform::known_panics_lint::KnownPanicsLint as rustc_mir_transform::pass_manager::MirLint>::run_lint
        42: rustc_mir_transform::run_analysis_to_runtime_passes
        43: rustc_mir_transform::mir_drops_elaborated_and_const_checked
        44: rustc_query_impl::plumbing::__rust_begin_short_backtrace::<rustc_query_impl::query_impl::mir_drops_elaborated_and_const_checked::dynamic_query::{closure#2}::{closure#0}, rustc_middle::query::erase::Erased<[u8; 8]>>
        45: rustc_query_system::query::plumbing::try_execute_query::<rustc_query_impl::DynamicConfig<rustc_data_structures::vec_cache::VecCache<rustc_span::def_id::LocalDefId, rustc_middle::query::erase::Erased<[u8; 8]>, rustc_query_system::dep_graph::graph::DepNodeIndex>, false, false, false>, rustc_query_impl::plumbing::QueryCtxt, false>
        46: rustc_query_impl::query_impl::mir_drops_elaborated_and_const_checked::get_query_non_incr::__rust_end_short_backtrace
        47: <rustc_middle::ty::context::TyCtxt>::par_hir_body_owners::<rustc_interface::passes::run_required_analyses::{closure#1}::{closure#0}>::{closure#0}
        48: rustc_interface::passes::analysis
        49: rustc_query_impl::plumbing::__rust_begin_short_backtrace::<rustc_query_impl::query_impl::analysis::dynamic_query::{closure#2}::{closure#0}, rustc_middle::query::erase::Erased<[u8; 0]>>
        50: rustc_query_system::query::plumbing::try_execute_query::<rustc_query_impl::DynamicConfig<rustc_query_system::query::caches::SingleCache<rustc_middle::query::erase::Erased<[u8; 0]>>, false, false, false>, rustc_query_impl::plumbing::QueryCtxt, false>
        51: rustc_query_impl::query_impl::analysis::get_query_non_incr::__rust_end_short_backtrace
        52: rustc_interface::passes::create_and_enter_global_ctxt::<core::option::Option<rustc_interface::queries::Linker>, rustc_driver_impl::run_compiler::{closure#0}::{closure#2}>::{closure#2}::{closure#0}
        53: rustc_interface::interface::run_compiler::<(), rustc_driver_impl::run_compiler::{closure#0}>::{closure#1}
        54: std::sys::backtrace::__rust_begin_short_backtrace::<rustc_interface::util::run_in_thread_with_globals<rustc_interface::util::run_in_thread_pool_with_globals<rustc_interface::interface::run_compiler<(), rustc_driver_impl::run_compiler::{closure#0}>::{closure#1}, ()>::{closure#0}, ()>::{closure#0}::{closure#0}, ()>
        55: <<std::thread::Builder>::spawn_unchecked_<rustc_interface::util::run_in_thread_with_globals<rustc_interface::util::run_in_thread_pool_with_globals<rustc_interface::interface::run_compiler<(), rustc_driver_impl::run_compiler::{closure#0}>::{closure#1}, ()>::{closure#0}, ()>::{closure#0}::{closure#0}, ()>::{closure#1} as core::ops::function::FnOnce<()>>::call_once::{shim:vtable#0}
        56: std::sys::pal::unix::thread::Thread::new::thread_start
        57: <unknown>
        58: <unknown>
  --> /home/matthias/.rustup/toolchains/master/lib/rustlib/src/rust/library/core/src/future/async_drop.rs:46:70
   |
46 |   pub async unsafe fn async_drop_in_place<T: ?Sized>(_to_drop: *mut T) {
   |  ______________________________________________________________________^
...  |
49 | | }
   | |_^


<snip>


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: -Z lint-mir -Z dump-mir-dir=dir

query stack during panic:
end of query stack

@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.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions