Clang Project

clang_source_code/test/AST/ast-dump-record-definition-data.cpp
1// RUN: %clang_cc1 -triple x86_64-unknown-unknown -std=c++17 -ast-dump %s | FileCheck -strict-whitespace %s
2
3void f() {
4  auto IsNotGenericLambda = [](){};
5  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <col:29> col:29 implicit class definition
6  // CHECK-NOT: DefinitionData {{.*}}generic{{.*}}
7  // CHECK-NEXT: DefinitionData {{.*}}lambda{{.*}}
8  auto IsGenericLambda = [](auto){};
9  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <col:26> col:26 implicit class definition
10  // CHECK-NEXT: DefinitionData {{.*}}generic{{.*}}lambda{{.*}}
11}
12
13struct CanPassInRegisters {
14  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct CanPassInRegisters definition
15  // CHECK-NEXT: DefinitionData {{.*}}pass_in_registers{{.*}}
16  CanPassInRegisters(const CanPassInRegisters&) = default;
17};
18
19struct CantPassInRegisters {
20  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct CantPassInRegisters definition
21  // CHECK-NOT: DefinitionData {{.*}}pass_in_registers{{.*}}
22  CantPassInRegisters(const CantPassInRegisters&) = delete;
23};
24
25struct IsEmpty {
26  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct IsEmpty definition
27  // CHECK-NEXT: DefinitionData {{.*}}empty{{.*}}
28};
29
30struct IsNotEmpty {
31  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct IsNotEmpty definition
32  // CHECK-NOT: DefinitionData {{.*}}empty{{.*}}
33  int a;
34};
35
36struct IsAggregate {
37  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct IsAggregate definition
38  // CHECK-NEXT: DefinitionData {{.*}}aggregate{{.*}}
39  int a;
40};
41
42struct IsNotAggregate {
43  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+4]]:1> line:[[@LINE-1]]:8 struct IsNotAggregate definition
44  // CHECK-NOT: DefinitionData {{.*}}aggregate{{.*}}
45private:
46  int a;
47};
48
49struct IsStandardLayout {
50  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct IsStandardLayout definition
51  // CHECK-NEXT: DefinitionData {{.*}}standard_layout{{.*}}
52  void f();
53};
54
55struct IsNotStandardLayout {
56  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct IsNotStandardLayout definition
57  // CHECK-NOT: DefinitionData {{.*}}standard_layout{{.*}}
58  virtual void f();
59};
60
61struct IsTriviallyCopyable {
62  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct IsTriviallyCopyable definition
63  // CHECK-NEXT: DefinitionData {{.*}}trivially_copyable{{.*}}
64};
65
66struct IsNotTriviallyCopyable {
67  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct IsNotTriviallyCopyable definition
68  // CHECK-NOT: DefinitionData {{.*}}trivially_copyable{{.*}}
69  IsNotTriviallyCopyable(const IsNotTriviallyCopyable&) {}
70};
71
72struct IsPOD {
73  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct IsPOD definition
74  // CHECK-NEXT: DefinitionData {{.*}}pod{{.*}}
75  int a;
76};
77
78struct IsNotPOD {
79  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct IsNotPOD definition
80  // CHECK-NOT: DefinitionData {{.*}}pod{{.*}}
81  int &a;
82};
83
84struct IsTrivial {
85  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct IsTrivial definition
86  // CHECK-NEXT: DefinitionData {{.*}}trivial {{.*}}
87  IsTrivial() = default;
88};
89
90struct IsNotTrivial {
91  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct IsNotTrivial definition
92  // CHECK-NOT: DefinitionData {{.*}}trivial {{.*}}
93  IsNotTrivial() {}
94};
95
96struct IsPolymorphic {
97  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct IsPolymorphic definition
98  // CHECK-NEXT: DefinitionData {{.*}}polymorphic{{.*}}
99  virtual void f();
100};
101
102struct IsNotPolymorphic {
103  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct IsNotPolymorphic definition
104  // CHECK-NOT: DefinitionData {{.*}}polymorphic{{.*}}
105  void f();
106};
107
108struct IsAbstract {
109  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct IsAbstract definition
110  // CHECK-NEXT: DefinitionData {{.*}}abstract{{.*}}
111  virtual void f() = 0;
112};
113
114struct IsNotAbstract {
115  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct IsNotAbstract definition
116  // CHECK-NOT: DefinitionData {{.*}}abstract{{.*}}
117  virtual void f();
118};
119
120struct IsLiteral {
121  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct IsLiteral definition
122  // CHECK-NEXT: DefinitionData {{.*}}literal{{.*}}
123  ~IsLiteral() = default;
124};
125
126struct IsNotLiteral {
127  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct IsNotLiteral definition
128  // CHECK-NOT: DefinitionData {{.*}}literal{{.*}}
129  ~IsNotLiteral() {}
130};
131
132struct HasUserDeclaredConstructor {
133  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct HasUserDeclaredConstructor definition
134  // CHECK-NEXT: DefinitionData {{.*}}has_user_declared_ctor{{.*}}
135  HasUserDeclaredConstructor() {}
136};
137
138struct HasNoUserDeclaredConstructor {
139  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct HasNoUserDeclaredConstructor definition
140  // CHECK-NOT: DefinitionData {{.*}}has_user_declared_ctor{{.*}}
141};
142
143struct HasConstexprNonCopyMoveConstructor {
144  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct HasConstexprNonCopyMoveConstructor definition
145  // CHECK-NEXT: DefinitionData {{.*}}has_constexpr_non_copy_move_ctor{{.*}}
146  constexpr HasConstexprNonCopyMoveConstructor() {}
147};
148
149struct HasNoConstexprNonCopyMoveConstructor {
150  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct HasNoConstexprNonCopyMoveConstructor definition
151  // CHECK-NOT: DefinitionData {{.*}}has_constexpr_non_copy_move_ctor{{.*}}
152  HasNoConstexprNonCopyMoveConstructor() {}
153};
154
155struct HasMutableFields {
156  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct HasMutableFields definition
157  // CHECK-NEXT: DefinitionData {{.*}}has_mutable_fields{{.*}}
158  mutable int i;
159};
160
161struct HasNoMutableFields {
162  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct HasNoMutableFields definition
163  // CHECK-NOT: DefinitionData {{.*}}has_mutable_fields{{.*}}
164  int i;
165};
166
167struct HasVariantMembers {
168  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+5]]:1> line:[[@LINE-1]]:8 struct HasVariantMembers definition
169  // CHECK-NEXT: DefinitionData {{.*}}has_variant_members{{.*}}
170  union {
171    int i;
172  };
173};
174
175struct HasNoVariantMembers {
176  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct HasNoVariantMembers definition
177  // CHECK-NOT: DefinitionData {{.*}}has_variant_members{{.*}}
178};
179
180struct AllowsConstDefaultInit {
181  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct AllowsConstDefaultInit definition
182  // CHECK-NEXT: DefinitionData {{.*}}can_const_default_init{{.*}}
183  int i = 12;
184};
185
186struct DoesNotAllowConstDefaultInit {
187  // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct DoesNotAllowConstDefaultInit definition
188  // CHECK-NOT: DefinitionData {{.*}}can_const_default_init{{.*}}
189  int i;
190};
191