Skip to content

Feed HIR for by-move coroutine body def, since the inliner tries to read its attrs #139193

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

Merged
merged 1 commit into from
Apr 2, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions compiler/rustc_mir_transform/src/coroutine/by_move_body.rs
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,8 @@ pub(crate) fn coroutine_by_move_body_def_id<'tcx>(
mir::MirSource::from_instance(InstanceKind::Item(body_def.def_id().to_def_id()));
dump_mir(tcx, false, "built", &"after", &by_move_body, |_, _| Ok(()));

// Feed HIR because we try to access this body's attrs in the inliner.
body_def.feed_hir();
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

feed_hir both feeds the local_def_id_to_hir_id query, and also the HIR attrs (as an empty list), which is fine here b/c you can't put attrs on the child coroutine anyways.

// Inherited from the by-ref coroutine.
body_def.codegen_fn_attrs(tcx.codegen_fn_attrs(coroutine_def_id).clone());
body_def.coverage_attr_on(tcx.coverage_attr_on(coroutine_def_id));
Expand Down
12 changes: 0 additions & 12 deletions tests/crashes/134335.rs

This file was deleted.

28 changes: 28 additions & 0 deletions tests/ui/async-await/async-closures/by-move-body-inlined-attrs.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
//@ check-pass
//@ compile-flags: -Zinline-mir -Zvalidate-mir
//@ edition: 2024

// See comment below.

use std::future::Future;
use std::pin::pin;
use std::task::{Context, Waker};

fn call_once<T>(f: impl FnOnce() -> T) -> T { f() }

fn main() {
let x = async || {};
// We first inline `call_once<{async closure}>`.
//
// This gives us a future whose type is the "FnOnce" flavor of the async closure's
// child coroutine. The body of this coroutine is synthetic, which we synthesize in
// the by-move body query.
let fut = pin!(call_once(x));
// We then try to inline that body in this poll call.
//
// The inliner does some inlinability checks; one of these checks involves checking
// the body for the `#[rustc_no_mir_inline]` attribute. Since the synthetic body had
// no HIR synthesized, but it's still a local def id, we end up ICEing in the
// `local_def_id_to_hir_id` call when trying to read its attrs.
fut.poll(&mut Context::from_waker(Waker::noop()));
}
Loading