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 
11 // FIXME: exists
12 
13 struct TrivialDefaultConstructor {
14   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <{{.*}}:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct TrivialDefaultConstructor definition
15   // CHECK: DefaultConstructor {{.*}} trivial{{.*}}
16   TrivialDefaultConstructor() = default;
17 };
18 
19 struct NontrivialDefaultConstructor {
20   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct NontrivialDefaultConstructor definition
21   // CHECK: DefaultConstructor {{.*}}non_trivial{{.*}}
NontrivialDefaultConstructorNontrivialDefaultConstructor22   NontrivialDefaultConstructor() {}
23 };
24 
25 struct UserProvidedDefaultConstructor {
26   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct UserProvidedDefaultConstructor definition
27   // CHECK: DefaultConstructor {{.*}}user_provided{{.*}}
UserProvidedDefaultConstructorUserProvidedDefaultConstructor28   UserProvidedDefaultConstructor() {}
29 };
30 
31 struct NonUserProvidedDefaultConstructor {
32   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct NonUserProvidedDefaultConstructor definition
33   // CHECK-NOT: DefaultConstructor {{.*}}user_provided{{.*}}
34 };
35 
36 struct HasConstexprDefaultConstructor {
37   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct HasConstexprDefaultConstructor definition
38   // CHECK: DefaultConstructor {{.*}}constexpr{{.*}}
HasConstexprDefaultConstructorHasConstexprDefaultConstructor39   constexpr HasConstexprDefaultConstructor() {}
40 };
41 
42 struct DoesNotHaveConstexprDefaultConstructor {
43   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct DoesNotHaveConstexprDefaultConstructor definition
44   // CHECK-NOT: DefaultConstructor {{.*}} constexpr{{.*}}
DoesNotHaveConstexprDefaultConstructorDoesNotHaveConstexprDefaultConstructor45   DoesNotHaveConstexprDefaultConstructor() {}
46 };
47 
48 struct NeedsImplicitDefaultConstructor {
49   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct NeedsImplicitDefaultConstructor definition
50   // CHECK: DefaultConstructor {{.*}}needs_implicit{{.*}}
51   int i = 12;
52 };
53 
54 struct DoesNotNeedImplicitDefaultConstructor {
55   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct DoesNotNeedImplicitDefaultConstructor definition
56   // CHECK-NOT: DefaultConstructor {{.*}}needs_implicit{{.*}}
DoesNotNeedImplicitDefaultConstructorDoesNotNeedImplicitDefaultConstructor57   DoesNotNeedImplicitDefaultConstructor() {}
58 };
59 
60 struct DefaultedDefaultConstructorIsConstexpr {
61   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct DefaultedDefaultConstructorIsConstexpr definition
62   // CHECK: DefaultConstructor {{.*}}defaulted_is_constexpr{{.*}}
63   DefaultedDefaultConstructorIsConstexpr() = default;
64 };
65 
66 struct DefaultedDefaultConstructorIsNotConstexpr {
67   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+6]]:1> line:[[@LINE-1]]:8 struct DefaultedDefaultConstructorIsNotConstexpr definition
68   // CHECK-NOT: DefaultConstructor {{.*}}defaulted_is_constexpr{{.*}}
69   DefaultedDefaultConstructorIsNotConstexpr() = default;
70   union {
71     int i;
72   };
73 };
74 
75 struct SimpleCopyConstructor {
76   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct SimpleCopyConstructor definition
77   // CHECK: CopyConstructor {{.*}}simple{{.*}}
78   int i = 12;
79 };
80 
81 struct NotSimpleCopyConstructor {
82   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct NotSimpleCopyConstructor definition
83   // CHECK-NOT: CopyConstructor {{.*}}simple{{.*}}
84   NotSimpleCopyConstructor(const NotSimpleCopyConstructor&) = delete;
85 };
86 
87 struct TrivialCopyConstructor {
88   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct TrivialCopyConstructor definition
89   // CHECK: CopyConstructor {{.*}} trivial{{.*}}
90   TrivialCopyConstructor() = default;
91 };
92 
93 struct NontrivialCopyConstructor {
94   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct NontrivialCopyConstructor definition
95   // CHECK: CopyConstructor {{.*}}non_trivial{{.*}}
NontrivialCopyConstructorNontrivialCopyConstructor96   NontrivialCopyConstructor(const NontrivialCopyConstructor&) {}
97 };
98 
99 struct UserDeclaredCopyConstructor {
100   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct UserDeclaredCopyConstructor definition
101   // CHECK: CopyConstructor {{.*}}user_declared{{.*}}
UserDeclaredCopyConstructorUserDeclaredCopyConstructor102   UserDeclaredCopyConstructor(const UserDeclaredCopyConstructor&) {}
103 };
104 
105 struct NonUserDeclaredCopyConstructor {
106   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct NonUserDeclaredCopyConstructor definition
107   // CHECK-NOT: CopyConstructor {{.*}}user_declared{{.*}}
108 };
109 
110 struct CopyConstructorHasConstParam {
111   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct CopyConstructorHasConstParam definition
112   // CHECK: CopyConstructor {{.*}}has_const_param{{.*}}
CopyConstructorHasConstParamCopyConstructorHasConstParam113   CopyConstructorHasConstParam(const CopyConstructorHasConstParam&) {}
114 };
115 
116 struct CopyConstructorDoesNotHaveConstParam {
117   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct CopyConstructorDoesNotHaveConstParam definition
118   // CHECK-NOT: CopyConstructor {{.*}} has_const_param{{.*}}
CopyConstructorDoesNotHaveConstParamCopyConstructorDoesNotHaveConstParam119   CopyConstructorDoesNotHaveConstParam(CopyConstructorDoesNotHaveConstParam&) {}
120 };
121 
122 struct NeedsImplicitCopyConstructor {
123   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct NeedsImplicitCopyConstructor definition
124   // CHECK: CopyConstructor {{.*}}needs_implicit{{.*}}
125   int i = 12;
126 };
127 
128 struct DoesNotNeedImplicitCopyConstructor {
129   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct DoesNotNeedImplicitCopyConstructor definition
130   // CHECK-NOT: CopyConstructor {{.*}}needs_implicit{{.*}}
DoesNotNeedImplicitCopyConstructorDoesNotNeedImplicitCopyConstructor131   DoesNotNeedImplicitCopyConstructor(const DoesNotNeedImplicitCopyConstructor&) {}
132 };
133 
134 struct DeletedDestructor {
135 private:
136   ~DeletedDestructor() = delete;
137 };
138 
139 struct CopyConstructorNeedsOverloadResolution : virtual DeletedDestructor {
140   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct CopyConstructorNeedsOverloadResolution definition
141   // CHECK: CopyConstructor {{.*}}needs_overload_resolution{{.*}}
142 };
143 
144 struct CopyConstructorDoesNotNeedOverloadResolution {
145   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct CopyConstructorDoesNotNeedOverloadResolution definition
146   // CHECK-NOT: CopyConstructor {{.*}}needs_overload_resolution{{.*}}
147 };
148 
149 struct DefaultedCopyConstructorIsDeleted {
150   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+4]]:1> line:[[@LINE-1]]:8 struct DefaultedCopyConstructorIsDeleted definition
151   // CHECK: CopyConstructor {{.*}}defaulted_is_deleted{{.*}}
152   int &&i;
153   DefaultedCopyConstructorIsDeleted(const DefaultedCopyConstructorIsDeleted&) = default;
154 };
155 
156 struct DefaultedCopyConstructorIsNotDeleted {
157   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+4]]:1> line:[[@LINE-1]]:8 struct DefaultedCopyConstructorIsNotDeleted definition
158   // CHECK-NOT: CopyConstructor {{.*}}defaulted_is_deleted{{.*}}
159   int i;
160   DefaultedCopyConstructorIsNotDeleted(const DefaultedCopyConstructorIsNotDeleted&) = default;
161 };
162 
163 struct BaseWithoutCopyConstructorConstParam {
164   BaseWithoutCopyConstructorConstParam(BaseWithoutCopyConstructorConstParam&);
165 };
166 
167 struct ImplicitCopyConstructorHasConstParam {
168   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct ImplicitCopyConstructorHasConstParam definition
169   // CHECK: CopyConstructor {{.*}}implicit_has_const_param{{.*}}
170 };
171 
172 struct ImplicitCopyConstructorDoesNotHaveConstParam : BaseWithoutCopyConstructorConstParam {
173   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct ImplicitCopyConstructorDoesNotHaveConstParam definition
174   // CHECK-NOT: CopyConstructor {{.*}}implicit_has_const_param{{.*}}
175 };
176 
177 struct MoveConstructorExists {
178   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct MoveConstructorExists definition
179   // CHECK: MoveConstructor {{.*}}exists{{.*}}
180 };
181 
182 struct MoveConstructorDoesNotExist {
183   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct MoveConstructorDoesNotExist definition
184   // CHECK-NOT: MoveConstructor {{.*}}exists{{.*}}
185   MoveConstructorDoesNotExist(const MoveConstructorDoesNotExist&);
186 };
187 
188 struct SimpleMoveConstructor {
189   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct SimpleMoveConstructor definition
190   // CHECK: MoveConstructor {{.*}}simple{{.*}}
191   int i = 12;
192 };
193 
194 struct NotSimpleMoveConstructor {
195   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct NotSimpleMoveConstructor definition
196   // CHECK-NOT: MoveConstructor {{.*}}simple{{.*}}
197   NotSimpleMoveConstructor(NotSimpleMoveConstructor&&) = delete;
198 };
199 
200 struct TrivialMoveConstructor {
201   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct TrivialMoveConstructor definition
202   // CHECK: MoveConstructor {{.*}} trivial{{.*}}
203   TrivialMoveConstructor() = default;
204 };
205 
206 struct NontrivialMoveConstructor {
207   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct NontrivialMoveConstructor definition
208   // CHECK: MoveConstructor {{.*}}non_trivial{{.*}}
NontrivialMoveConstructorNontrivialMoveConstructor209   NontrivialMoveConstructor(NontrivialMoveConstructor&&) {}
210 };
211 
212 struct UserDeclaredMoveConstructor {
213   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct UserDeclaredMoveConstructor definition
214   // CHECK: MoveConstructor {{.*}}user_declared{{.*}}
UserDeclaredMoveConstructorUserDeclaredMoveConstructor215   UserDeclaredMoveConstructor(UserDeclaredMoveConstructor&&) {}
216 };
217 
218 struct NonUserDeclaredMoveConstructor {
219   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct NonUserDeclaredMoveConstructor definition
220   // CHECK-NOT: MoveConstructor {{.*}}user_declared{{.*}}
221 };
222 
223 struct NeedsImplicitMoveConstructor {
224   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct NeedsImplicitMoveConstructor definition
225   // CHECK: MoveConstructor {{.*}}needs_implicit{{.*}}
226   int i = 12;
227 };
228 
229 struct DoesNotNeedImplicitMoveConstructor {
230   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct DoesNotNeedImplicitMoveConstructor definition
231   // CHECK-NOT: MoveConstructor {{.*}}needs_implicit{{.*}}
DoesNotNeedImplicitMoveConstructorDoesNotNeedImplicitMoveConstructor232   DoesNotNeedImplicitMoveConstructor(DoesNotNeedImplicitMoveConstructor&&) {}
233 };
234 
235 struct MoveConstructorNeedsOverloadResolution : virtual DeletedDestructor {
236   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct MoveConstructorNeedsOverloadResolution definition
237   // CHECK: MoveConstructor {{.*}}needs_overload_resolution{{.*}}
238 };
239 
240 struct MoveConstructorDoesNotNeedOverloadResolution {
241   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct MoveConstructorDoesNotNeedOverloadResolution definition
242   // CHECK-NOT: MoveConstructor {{.*}}needs_overload_resolution{{.*}}
243 };
244 
245 // FIXME: defaulted_is_deleted
246 
247 struct TrivialCopyAssignment {
248   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct TrivialCopyAssignment definition
249   // CHECK: CopyAssignment {{.*}} trivial{{.*}}
250   TrivialCopyAssignment& operator=(const TrivialCopyAssignment&) = default;
251 };
252 
253 struct NontrivialCopyAssignment {
254   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct NontrivialCopyAssignment definition
255   // CHECK: CopyAssignment {{.*}}non_trivial{{.*}}
operator =NontrivialCopyAssignment256   NontrivialCopyAssignment& operator=(const NontrivialCopyAssignment&) {}
257 };
258 
259 struct CopyAssignmentHasConstParam {
260   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct CopyAssignmentHasConstParam definition
261   // CHECK: CopyAssignment {{.*}}has_const_param{{.*}}
operator =CopyAssignmentHasConstParam262   CopyAssignmentHasConstParam& operator=(const CopyAssignmentHasConstParam&) {}
263 };
264 
265 struct CopyAssignmentDoesNotHaveConstParam {
266   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct CopyAssignmentDoesNotHaveConstParam definition
267   // CHECK-NOT: CopyAssignment {{.*}} has_const_param{{.*}}
operator =CopyAssignmentDoesNotHaveConstParam268   CopyAssignmentDoesNotHaveConstParam& operator=(CopyAssignmentDoesNotHaveConstParam&) {}
269 };
270 
271 struct UserDeclaredCopyAssignment {
272   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct UserDeclaredCopyAssignment definition
273   // CHECK: CopyAssignment {{.*}}user_declared{{.*}}
operator =UserDeclaredCopyAssignment274   UserDeclaredCopyAssignment& operator=(const UserDeclaredCopyAssignment&) {}
275 };
276 
277 struct NonUserDeclaredCopyAssignment {
278   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct NonUserDeclaredCopyAssignment definition
279   // CHECK-NOT: CopyAssignment {{.*}}user_declared{{.*}}
280 };
281 
282 struct NeedsImplicitCopyAssignment {
283   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct NeedsImplicitCopyAssignment definition
284   // CHECK: CopyAssignment {{.*}}needs_implicit{{.*}}
285   int i = 12;
286 };
287 
288 struct DoesNotNeedImplicitCopyAssignment {
289   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct DoesNotNeedImplicitCopyAssignment definition
290   // CHECK-NOT: CopyAssignment {{.*}}needs_implicit{{.*}}
operator =DoesNotNeedImplicitCopyAssignment291   DoesNotNeedImplicitCopyAssignment& operator=(const DoesNotNeedImplicitCopyAssignment&) {}
292 };
293 
294 struct DeclaresCopyAssignment {
295   DeclaresCopyAssignment &operator=(const DeclaresCopyAssignment&) &;
296 };
297 
298 struct CopyAssignmentNeedsOverloadResolution {
299   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct CopyAssignmentNeedsOverloadResolution definition
300   // CHECK: CopyAssignment {{.*}}needs_overload_resolution{{.*}}
301   DeclaresCopyAssignment i;
302 };
303 
304 struct CopyAssignmentDoesNotNeedOverloadResolution {
305   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct CopyAssignmentDoesNotNeedOverloadResolution definition
306   // CHECK-NOT: CopyAssignment {{.*}}needs_overload_resolution{{.*}}
307 };
308 
309 struct BaseWithoutCopyAssignmentConstParam {
310   BaseWithoutCopyAssignmentConstParam& operator=(BaseWithoutCopyAssignmentConstParam&);
311 };
312 
313 struct ImplicitCopyAssignmentHasConstParam {
314   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct ImplicitCopyAssignmentHasConstParam definition
315   // CHECK: CopyAssignment {{.*}}implicit_has_const_param{{.*}}
316 };
317 
318 struct ImplicitCopyAssignmentDoesNotHaveConstParam : BaseWithoutCopyAssignmentConstParam {
319   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct ImplicitCopyAssignmentDoesNotHaveConstParam definition
320   // CHECK-NOT: CopyAssignment {{.*}}implicit_has_const_param{{.*}}
321 };
322 
323 struct MoveAssignmentExists {
324   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct MoveAssignmentExists definition
325   // CHECK: MoveAssignment {{.*}}exists{{.*}}
326 };
327 
328 struct MoveAssignmentDoesNotExist {
329   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct MoveAssignmentDoesNotExist definition
330   // CHECK-NOT: MoveAssignment {{.*}}exists{{.*}}
331   MoveAssignmentDoesNotExist& operator=(const MoveAssignmentDoesNotExist&);
332 };
333 
334 struct SimpleMoveAssignment {
335   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct SimpleMoveAssignment definition
336   // CHECK: MoveAssignment {{.*}}simple{{.*}}
337   int i = 12;
338 };
339 
340 struct NotSimpleMoveAssignment {
341   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct NotSimpleMoveAssignment definition
342   // CHECK-NOT: MoveAssignment {{.*}}simple{{.*}}
343   NotSimpleMoveAssignment& operator=(NotSimpleMoveAssignment&&) = delete;
344 };
345 
346 struct TrivialMoveAssignment {
347   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct TrivialMoveAssignment definition
348   // CHECK: MoveAssignment {{.*}} trivial{{.*}}
349   TrivialMoveAssignment() = default;
350 };
351 
352 struct NontrivialMoveAssignment {
353   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct NontrivialMoveAssignment definition
354   // CHECK: MoveAssignment {{.*}}non_trivial{{.*}}
operator =NontrivialMoveAssignment355   NontrivialMoveAssignment& operator=(NontrivialMoveAssignment&&) {}
356 };
357 
358 struct UserDeclaredMoveAssignment {
359   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct UserDeclaredMoveAssignment definition
360   // CHECK: MoveAssignment {{.*}}user_declared{{.*}}
operator =UserDeclaredMoveAssignment361   UserDeclaredMoveAssignment& operator=(UserDeclaredMoveAssignment&&) {}
362 };
363 
364 struct NonUserDeclaredMoveAssignment {
365   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct NonUserDeclaredMoveAssignment definition
366   // CHECK-NOT: MoveAssignment {{.*}}user_declared{{.*}}
367 };
368 
369 struct NeedsImplicitMoveAssignment {
370   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct NeedsImplicitMoveAssignment definition
371   // CHECK: MoveAssignment {{.*}}needs_implicit{{.*}}
372   int i = 12;
373 };
374 
375 struct DoesNotNeedImplicitMoveAssignment {
376   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct DoesNotNeedImplicitMoveAssignment definition
377   // CHECK-NOT: MoveAssignment {{.*}}needs_implicit{{.*}}
operator =DoesNotNeedImplicitMoveAssignment378   DoesNotNeedImplicitMoveAssignment& operator=(DoesNotNeedImplicitMoveAssignment&&) {}
379 };
380 
381 struct MoveAssignmentNeedsOverloadResolution : virtual DeletedDestructor {
382   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct MoveAssignmentNeedsOverloadResolution definition
383   // CHECK: MoveAssignment {{.*}}needs_overload_resolution{{.*}}
384 };
385 
386 struct MoveAssignmentDoesNotNeedOverloadResolution {
387   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct MoveAssignmentDoesNotNeedOverloadResolution definition
388   // CHECK-NOT: MoveAssignment {{.*}}needs_overload_resolution{{.*}}
389 };
390 
391 struct SimpleDestructor {
392   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct SimpleDestructor definition
393   // CHECK: Destructor {{.*}}simple{{.*}}
394 };
395 
396 struct NotSimpleDestructor : DeletedDestructor {
397   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct NotSimpleDestructor definition
398   // CHECK-NOT: Destructor {{.*}}simple{{.*}}
399 };
400 
401 struct IrrelevantDestructor {
402   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct IrrelevantDestructor definition
403   // CHECK: Destructor {{.*}}irrelevant{{.*}}
404 };
405 
406 struct RelevantDestructor {
407   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct RelevantDestructor definition
408   // CHECK-NOT: Destructor {{.*}}irrelevant{{.*}}
~RelevantDestructorRelevantDestructor409   ~RelevantDestructor() {}
410 };
411 
412 struct TrivialDestructor {
413   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct TrivialDestructor definition
414   // CHECK: Destructor {{.*}} trivial{{.*}}
415   ~TrivialDestructor() = default;
416 };
417 
418 struct NontrivialDestructor {
419   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct NontrivialDestructor definition
420   // CHECK: Destructor {{.*}}non_trivial{{.*}}
~NontrivialDestructorNontrivialDestructor421   ~NontrivialDestructor() {}
422 };
423 
424 struct UserDeclaredDestructor {
425   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct UserDeclaredDestructor definition
426   // CHECK: Destructor {{.*}}user_declared{{.*}}
~UserDeclaredDestructorUserDeclaredDestructor427   ~UserDeclaredDestructor() {}
428 };
429 
430 struct NonUserDeclaredDestructor {
431   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct NonUserDeclaredDestructor definition
432   // CHECK-NOT: Destructor {{.*}}user_declared{{.*}}
433 };
434 
435 struct NeedsImplicitDestructor {
436   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct NeedsImplicitDestructor definition
437   // CHECK: Destructor {{.*}}needs_implicit{{.*}}
438   int i = 12;
439 };
440 
441 struct DoesNotNeedImplicitDestructor {
442   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct DoesNotNeedImplicitDestructor definition
443   // CHECK-NOT: Destructor {{.*}}needs_implicit{{.*}}
~DoesNotNeedImplicitDestructorDoesNotNeedImplicitDestructor444   ~DoesNotNeedImplicitDestructor() {}
445 };
446 
447 struct DestructorNeedsOverloadResolution : virtual DeletedDestructor {
448   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+3]]:1> line:[[@LINE-1]]:8 struct DestructorNeedsOverloadResolution definition
449   // CHECK: Destructor {{.*}}needs_overload_resolution{{.*}}
450   ~DestructorNeedsOverloadResolution();
451 };
452 
453 struct DestructorDoesNotNeedOverloadResolution {
454   // CHECK: CXXRecordDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:1> line:[[@LINE-1]]:8 struct DestructorDoesNotNeedOverloadResolution definition
455   // CHECK-NOT: Destructor {{.*}}needs_overload_resolution{{.*}}
456 };
457 
458 // FIXME: defaulted_is_deleted
459