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