Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit dd883ed

Browse files
committedJun 18, 2020
Add test for generator debuginfo
1 parent f44731a commit dd883ed

File tree

1 file changed

+94
-0
lines changed

1 file changed

+94
-0
lines changed
 

‎src/test/codegen/generator-debug.rs

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
// Verify debuginfo for generators:
2+
// - Each variant points to the file and line of its yield point
3+
// - The generator types and variants are marked artificial
4+
// - Captured vars from the source are not marked artificial
5+
//
6+
// ignore-tidy-linelength
7+
// compile-flags: -C debuginfo=2 --edition=2018
8+
9+
#![feature(generators, generator_trait)]
10+
use std::ops::Generator;
11+
12+
fn generator_test() -> impl Generator<Yield = i32, Return = ()> {
13+
|| {
14+
yield 0;
15+
let s = String::from("foo");
16+
yield 1;
17+
}
18+
}
19+
20+
async fn foo() {}
21+
async fn async_fn_test() {
22+
foo().await;
23+
let s = String::from("foo");
24+
foo().await;
25+
}
26+
27+
// FIXME: We need "checksum" to prevent matching with the wrong (duplicate) file
28+
// metadata, even when -C codegen-units=1.
29+
// CHECK: [[FILE:!.*]] = !DIFile(filename: "{{.*}}/generator-debug.rs", {{.*}}, checksum:
30+
31+
// CHECK: [[GEN:!.*]] = !DICompositeType(tag: DW_TAG_structure_type, name: "generator-0", scope: [[FN:![0-9]*]],
32+
// CHECK-SAME: flags: DIFlagArtificial
33+
// CHECK: [[FN]] = !DINamespace(name: "generator_test"
34+
// CHECK: [[VARIANT:!.*]] = !DICompositeType(tag: DW_TAG_variant_part, scope: [[FN]],
35+
// CHECK-SAME: flags: DIFlagArtificial
36+
// CHECK-SAME: discriminator: [[DISC:![0-9]*]]
37+
// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "0", scope: [[VARIANT]],
38+
// CHECK-SAME: file: [[FILE]], line: 13,
39+
// CHECK-SAME: flags: DIFlagArtificial
40+
// CHECK: {{!.*}} = !DICompositeType(tag: DW_TAG_structure_type, name: "Unresumed", scope: [[GEN]],
41+
// CHECK-SAME: flags: DIFlagArtificial
42+
// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "1", scope: [[VARIANT]],
43+
// CHECK-SAME: file: [[FILE]], line: 17,
44+
// CHECK-SAME: flags: DIFlagArtificial
45+
// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "2", scope: [[VARIANT]],
46+
// CHECK-SAME: file: [[FILE]], line: 17,
47+
// CHECK-SAME: flags: DIFlagArtificial
48+
// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "3", scope: [[VARIANT]],
49+
// CHECK-SAME: file: [[FILE]], line: 14,
50+
// CHECK-SAME: flags: DIFlagArtificial
51+
// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "4", scope: [[VARIANT]],
52+
// CHECK-SAME: file: [[FILE]], line: 16,
53+
// CHECK-SAME: flags: DIFlagArtificial
54+
// CHECK: [[S1:!.*]] = !DICompositeType(tag: DW_TAG_structure_type, name: "Suspend1", scope: [[GEN]],
55+
// CHECK-SAME: flags: DIFlagArtificial
56+
// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "s", scope: [[S1]]
57+
// CHECK-NOT: flags: DIFlagArtificial
58+
// CHECK-SAME: )
59+
// CHECK: [[DISC]] = !DIDerivedType(tag: DW_TAG_member, name: "__state", scope: [[FN]],
60+
// CHECK-SAME: flags: DIFlagArtificial
61+
62+
// CHECK: [[GEN:!.*]] = !DICompositeType(tag: DW_TAG_structure_type, name: "generator-0", scope: [[FN:![0-9]*]],
63+
// CHECK-SAME: flags: DIFlagArtificial
64+
// CHECK: [[FN]] = !DINamespace(name: "async_fn_test"
65+
// CHECK: [[VARIANT:!.*]] = !DICompositeType(tag: DW_TAG_variant_part, scope: [[FN]],
66+
// CHECK-SAME: flags: DIFlagArtificial
67+
// CHECK-SAME: discriminator: [[DISC:![0-9]*]]
68+
// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "0", scope: [[VARIANT]],
69+
// CHECK-SAME: file: [[FILE]], line: 21,
70+
// CHECK-SAME: flags: DIFlagArtificial
71+
// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "1", scope: [[VARIANT]],
72+
// CHECK-SAME: file: [[FILE]], line: 25,
73+
// CHECK-SAME: flags: DIFlagArtificial
74+
// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "2", scope: [[VARIANT]],
75+
// CHECK-SAME: file: [[FILE]], line: 25,
76+
// CHECK-SAME: flags: DIFlagArtificial
77+
// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "3", scope: [[VARIANT]],
78+
// CHECK-SAME: file: [[FILE]], line: 22,
79+
// CHECK-SAME: flags: DIFlagArtificial
80+
// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "4", scope: [[VARIANT]],
81+
// CHECK-SAME: file: [[FILE]], line: 24,
82+
// CHECK-SAME: flags: DIFlagArtificial
83+
// CHECK: [[S1:!.*]] = !DICompositeType(tag: DW_TAG_structure_type, name: "Suspend1", scope: [[GEN]],
84+
// CHECK-SAME: flags: DIFlagArtificial
85+
// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "s", scope: [[S1]]
86+
// CHECK-NOT: flags: DIFlagArtificial
87+
// CHECK-SAME: )
88+
// CHECK: [[DISC]] = !DIDerivedType(tag: DW_TAG_member, name: "__state", scope: [[FN]],
89+
// CHECK-SAME: flags: DIFlagArtificial
90+
91+
fn main() {
92+
let _dummy = generator_test();
93+
let _dummy = async_fn_test();
94+
}

0 commit comments

Comments
 (0)
Please sign in to comment.