Skip to content

Commit 34ed554

Browse files
Build DebugInfo for coroutine-closure
1 parent 972452c commit 34ed554

File tree

4 files changed

+25
-7
lines changed

4 files changed

+25
-7
lines changed

Diff for: compiler/rustc_codegen_llvm/src/debuginfo/metadata.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -461,6 +461,7 @@ pub fn type_di_node<'ll, 'tcx>(cx: &CodegenCx<'ll, 'tcx>, t: Ty<'tcx>) -> &'ll D
461461
}
462462
ty::FnDef(..) | ty::FnPtr(_) => build_subroutine_type_di_node(cx, unique_type_id),
463463
ty::Closure(..) => build_closure_env_di_node(cx, unique_type_id),
464+
ty::CoroutineClosure(..) => build_closure_env_di_node(cx, unique_type_id),
464465
ty::Coroutine(..) => enums::build_coroutine_di_node(cx, unique_type_id),
465466
ty::Adt(def, ..) => match def.adt_kind() {
466467
AdtKind::Struct => build_struct_type_di_node(cx, unique_type_id),
@@ -1068,6 +1069,7 @@ fn build_upvar_field_di_nodes<'ll, 'tcx>(
10681069
let (&def_id, up_var_tys) = match closure_or_coroutine_ty.kind() {
10691070
ty::Coroutine(def_id, args) => (def_id, args.as_coroutine().prefix_tys()),
10701071
ty::Closure(def_id, args) => (def_id, args.as_closure().upvar_tys()),
1072+
ty::CoroutineClosure(def_id, args) => (def_id, args.as_coroutine_closure().upvar_tys()),
10711073
_ => {
10721074
bug!(
10731075
"build_upvar_field_di_nodes() called with non-closure-or-coroutine-type: {:?}",
@@ -1153,7 +1155,8 @@ fn build_closure_env_di_node<'ll, 'tcx>(
11531155
unique_type_id: UniqueTypeId<'tcx>,
11541156
) -> DINodeCreationResult<'ll> {
11551157
let closure_env_type = unique_type_id.expect_ty();
1156-
let &ty::Closure(def_id, _args) = closure_env_type.kind() else {
1158+
let &(ty::Closure(def_id, _) | ty::CoroutineClosure(def_id, _)) = closure_env_type.kind()
1159+
else {
11571160
bug!("build_closure_env_di_node() called with non-closure-type: {:?}", closure_env_type)
11581161
};
11591162
let containing_scope = get_namespace_for_item(cx, def_id);

Diff for: tests/codegen/async-closure-debug.rs

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// Just make sure that async closures don't ICE.
2+
//
3+
// compile-flags: -C debuginfo=2 --edition=2018
4+
// ignore-msvc
5+
6+
// CHECK-DAG: [[GEN_FN:!.*]] = !DINamespace(name: "async_closure_test"
7+
// CHECK-DAG: [[CLOSURE:!.*]] = !DICompositeType(tag: DW_TAG_structure_type, name: "{closure_env#0}", scope: [[GEN_FN]]
8+
// CHECK-DAG: [[UPVAR:!.*]] = !DIDerivedType(tag: DW_TAG_member, name: "upvar", scope: [[CLOSURE]]
9+
10+
#![feature(async_closure)]
11+
12+
fn async_closure_test(upvar: &str) -> impl async Fn() + '_ {
13+
async move || {
14+
let hello = String::from("hello");
15+
println!("{hello}, {upvar}");
16+
}
17+
}
18+
19+
fn main() {
20+
let _async_closure = async_closure_test("world");
21+
}

Diff for: tests/ui/async-await/async-closures/async-fn-mut-for-async-fn.rs

-3
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,6 @@
22
// edition:2021
33
// run-pass
44

5-
// FIXME(async_closures): When `fn_sig_for_fn_abi` is fixed, remove this.
6-
// ignore-pass (test emits codegen-time warnings)
7-
85
#![feature(async_closure)]
96

107
extern crate block_on;

Diff for: tests/ui/async-await/async-closures/async-fn-once-for-async-fn.rs

-3
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,6 @@
22
// edition:2021
33
// run-pass
44

5-
// FIXME(async_closures): When `fn_sig_for_fn_abi` is fixed, remove this.
6-
// ignore-pass (test emits codegen-time warnings)
7-
85
#![feature(async_closure)]
96

107
extern crate block_on;

0 commit comments

Comments
 (0)