Auto merge of #129716 - compiler-errors:closure-debuginfo, r=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 (#128506), leading to #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 #129702
This commit is contained in:
commit
13b5a4e43b
2 changed files with 23 additions and 1 deletions
|
@ -571,7 +571,10 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||||
/// Returns `true` if `def_id` refers to a definition that does not have its own
|
/// 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.
|
/// type-checking context, i.e. closure, coroutine or inline const.
|
||||||
pub fn is_typeck_child(self, def_id: DefId) -> bool {
|
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 { ... }`).
|
/// Returns `true` if `def_id` refers to a trait (i.e., `trait Foo { ... }`).
|
||||||
|
|
|
@ -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;
|
||||||
|
});
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue