Skip to content

Commit

Permalink
Auto merge of rust-lang#129716 - compiler-errors:closure-debuginfo, r…
Browse files Browse the repository at this point in the history
…=cjgillot

Don't use `typeck_root_def_id` in codegen for finding closure's root

Generating debuginfo in codegen currently peels off all the closure-specific generics (which presumably is done because they're redundant). This doesn't currently work correctly for the bodies we synthesize for async closures's returned coroutines (rust-lang#128506), leading to rust-lang#129702.

Specifically, `typeck_root_def_id` for some `DefKind::SyntheticCoroutineBody` just returns itself (because it loops while `is_typeck_child` is `true`, and that returns `false` for this defkind), which means we don't end up peeling off the coroutine-specific generics, and we end up encountering an otherwise unreachable `CoroutineWitness` type leading to an ICE.

This PR fixes `is_typeck_child` to consider `DefKind::SyntheticCorotuineBody` to be a typeck child, fixing `typeck_root_def_id` and suppressing this debuginfo bug.

Fixes rust-lang#129702
  • Loading branch information
bors committed Sep 16, 2024
2 parents 170d6cb + 63405fc commit 13b5a4e
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 1 deletion.
5 changes: 4 additions & 1 deletion compiler/rustc_middle/src/ty/util.rs
Original file line number Diff line number Diff line change
Expand Up @@ -571,7 +571,10 @@ impl<'tcx> TyCtxt<'tcx> {
/// Returns `true` if `def_id` refers to a definition that does not have its own
/// type-checking context, i.e. closure, coroutine or inline const.
pub fn is_typeck_child(self, def_id: DefId) -> bool {
matches!(self.def_kind(def_id), DefKind::Closure | DefKind::InlineConst)
matches!(
self.def_kind(def_id),
DefKind::Closure | DefKind::InlineConst | DefKind::SyntheticCoroutineBody
)
}

/// Returns `true` if `def_id` refers to a trait (i.e., `trait Foo { ... }`).
Expand Down
19 changes: 19 additions & 0 deletions tests/ui/async-await/async-closures/debuginfo-by-move-body.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
//@ aux-build:block-on.rs
//@ edition: 2021
//@ build-pass
//@ compile-flags: -Cdebuginfo=2

#![feature(async_closure)]

extern crate block_on;

async fn call_once(f: impl async FnOnce()) {
f().await;
}

pub fn main() {
block_on::block_on(async {
let async_closure = async move || {};
call_once(async_closure).await;
});
}

0 comments on commit 13b5a4e

Please sign in to comment.