1 // RUN: %clang_cc1 -triple x86_64-unknown-unknown -std=c++17 -ast-dump %s | FileCheck -strict-whitespace %s
2 
3 void 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 
13 struct 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 
19 struct 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 
25 struct 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 
30 struct 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 
36 struct 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 
42 struct 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{{.*}}
45 private:
46   int a;
47 };
48 
49 struct 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 
55 struct 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 
61 struct 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 
66 struct 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 
72 struct 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 
78 struct 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 
84 struct 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 
90 struct 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 
96 struct 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 
102 struct 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 
108 struct 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 
114 struct 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 
120 struct 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 
126 struct 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 
132 struct 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 
138 struct 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 
143 struct 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 
149 struct 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 
155 struct 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 
161 struct 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 
167 struct 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 
175 struct 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 
180 struct 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 
186 struct 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