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