Clang Project

clang_source_code/test/CodeGenCXX/debug-info-composite-triviality.cpp
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
6struct Explicit {
7  explicit Explicit();
8  int a;
9} Explicit;
10
11// CHECK-DAG: !DICompositeType({{.*}}, name: "Struct",{{.*}}flags: DIFlagTypePassByValue | DIFlagNonTrivial
12struct Struct {
13  Struct() {}
14} Struct;
15
16// CHECK-DAG: !DICompositeType({{.*}}, name: "Annotated",{{.*}}flags: DIFlagTypePassByValue | DIFlagNonTrivial
17struct __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)
24int GlobalVar = 0;
25
26// Cases to test composite type's triviality
27
28// CHECK-DAG: !DICompositeType({{.*}}, name: "Union",{{.*}}flags: {{.*}}DIFlagTrivial
29union Union {
30  int a;
31} Union;
32
33// CHECK-DAG: !DICompositeType({{.*}}, name: "Trivial",{{.*}}flags: {{.*}}DIFlagTrivial
34struct Trivial {
35  int i;
36} Trivial;
37
38// CHECK-DAG: !DICompositeType({{.*}}, name: "TrivialA",{{.*}}flags: {{.*}}DIFlagTrivial
39struct TrivialA {
40  TrivialA() = default;
41} TrivialA;
42
43// CHECK-DAG: !DICompositeType({{.*}}, name: "TrivialB",{{.*}}flags: {{.*}}DIFlagTrivial
44struct TrivialB {
45  int m;
46  TrivialB(int x) { m = x; }
47  TrivialB() = default;
48} TrivialB;
49
50// CHECK-DAG: !DICompositeType({{.*}}, name: "TrivialC",{{.*}}flags: {{.*}}DIFlagTrivial
51struct TrivialC {
52  struct Trivial x;
53} TrivialC;
54
55// CHECK-DAG: !DICompositeType({{.*}}, name: "TrivialD",{{.*}}flags: {{.*}}DIFlagTrivial
56struct NT {
57  NT() {};
58};
59struct 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
65struct NonTrivial {
66  NonTrivial() {}
67} NonTrivial;
68
69// CHECK-DAG: !DICompositeType({{.*}}, name: "NonTrivialA",{{.*}}flags: {{.*}}DIFlagNonTrivial
70struct NonTrivialA {
71  ~NonTrivialA();
72} NonTrivialA;
73
74// CHECK-DAG: !DICompositeType({{.*}}, name: "NonTrivialB",{{.*}}flags: {{.*}}DIFlagNonTrivial
75struct NonTrivialB {
76  struct NonTrivial x;
77} NonTrivialB;
78
79// CHECK-DAG: !DICompositeType({{.*}}, name: "NonTrivialC",{{.*}}flags: {{.*}}DIFlagNonTrivial
80struct NonTrivialC {
81  virtual void f() {}
82} NonTrivialC;
83
84// CHECK-DAG: !DICompositeType({{.*}}, name: "NonTrivialD",{{.*}}flags: {{.*}}DIFlagNonTrivial
85struct NonTrivialD : NonTrivial {
86} NonTrivialD;
87
88// CHECK-DAG: !DICompositeType({{.*}}, name: "NonTrivialE",{{.*}}flags: {{.*}}DIFlagNonTrivial
89struct NonTrivialE : Trivial, NonTrivial {
90} NonTrivialE;
91