1 | // RUN: %clang_cc1 -emit-llvm -debug-info-kind=standalone -triple %itanium_abi_triple %s -o - | FileCheck %s |
2 | |
3 | // Cases to show some non-trivial types with flags combined with DIFlagNonTrivial and DIFlagTypePassByValue. |
4 | |
5 | // CHECK-DAG: !DICompositeType({{.*}}, name: "Explicit",{{.*}}flags: DIFlagTypePassByValue | DIFlagNonTrivial |
6 | struct Explicit { |
7 | explicit Explicit(); |
8 | int a; |
9 | } Explicit; |
10 | |
11 | // CHECK-DAG: !DICompositeType({{.*}}, name: "Struct",{{.*}}flags: DIFlagTypePassByValue | DIFlagNonTrivial |
12 | struct Struct { |
13 | Struct() {} |
14 | } Struct; |
15 | |
16 | // CHECK-DAG: !DICompositeType({{.*}}, name: "Annotated",{{.*}}flags: DIFlagTypePassByValue | DIFlagNonTrivial |
17 | struct __attribute__((trivial_abi)) Annotated { |
18 | Annotated() {}; |
19 | } Annotated; |
20 | |
21 | |
22 | // Check a non-composite type |
23 | // CHECK-DAG: !DIGlobalVariable(name: "GlobalVar", {{.*}}type: {{.*}}, isLocal: false, isDefinition: true) |
24 | int GlobalVar = 0; |
25 | |
26 | // Cases to test composite type's triviality |
27 | |
28 | // CHECK-DAG: !DICompositeType({{.*}}, name: "Union",{{.*}}flags: {{.*}}DIFlagTrivial |
29 | union Union { |
30 | int a; |
31 | } Union; |
32 | |
33 | // CHECK-DAG: !DICompositeType({{.*}}, name: "Trivial",{{.*}}flags: {{.*}}DIFlagTrivial |
34 | struct Trivial { |
35 | int i; |
36 | } Trivial; |
37 | |
38 | // CHECK-DAG: !DICompositeType({{.*}}, name: "TrivialA",{{.*}}flags: {{.*}}DIFlagTrivial |
39 | struct TrivialA { |
40 | TrivialA() = default; |
41 | } TrivialA; |
42 | |
43 | // CHECK-DAG: !DICompositeType({{.*}}, name: "TrivialB",{{.*}}flags: {{.*}}DIFlagTrivial |
44 | struct TrivialB { |
45 | int m; |
46 | TrivialB(int x) { m = x; } |
47 | TrivialB() = default; |
48 | } TrivialB; |
49 | |
50 | // CHECK-DAG: !DICompositeType({{.*}}, name: "TrivialC",{{.*}}flags: {{.*}}DIFlagTrivial |
51 | struct TrivialC { |
52 | struct Trivial x; |
53 | } TrivialC; |
54 | |
55 | // CHECK-DAG: !DICompositeType({{.*}}, name: "TrivialD",{{.*}}flags: {{.*}}DIFlagTrivial |
56 | struct NT { |
57 | NT() {}; |
58 | }; |
59 | struct TrivialD { |
60 | static struct NT x; // Member is non-trivial but is static. |
61 | } TrivialD; |
62 | |
63 | |
64 | // CHECK-DAG: !DICompositeType({{.*}}, name: "NonTrivial",{{.*}}flags: {{.*}}DIFlagNonTrivial |
65 | struct NonTrivial { |
66 | NonTrivial() {} |
67 | } NonTrivial; |
68 | |
69 | // CHECK-DAG: !DICompositeType({{.*}}, name: "NonTrivialA",{{.*}}flags: {{.*}}DIFlagNonTrivial |
70 | struct NonTrivialA { |
71 | ~NonTrivialA(); |
72 | } NonTrivialA; |
73 | |
74 | // CHECK-DAG: !DICompositeType({{.*}}, name: "NonTrivialB",{{.*}}flags: {{.*}}DIFlagNonTrivial |
75 | struct NonTrivialB { |
76 | struct NonTrivial x; |
77 | } NonTrivialB; |
78 | |
79 | // CHECK-DAG: !DICompositeType({{.*}}, name: "NonTrivialC",{{.*}}flags: {{.*}}DIFlagNonTrivial |
80 | struct NonTrivialC { |
81 | virtual void f() {} |
82 | } NonTrivialC; |
83 | |
84 | // CHECK-DAG: !DICompositeType({{.*}}, name: "NonTrivialD",{{.*}}flags: {{.*}}DIFlagNonTrivial |
85 | struct NonTrivialD : NonTrivial { |
86 | } NonTrivialD; |
87 | |
88 | // CHECK-DAG: !DICompositeType({{.*}}, name: "NonTrivialE",{{.*}}flags: {{.*}}DIFlagNonTrivial |
89 | struct NonTrivialE : Trivial, NonTrivial { |
90 | } NonTrivialE; |
91 | |