Clang Project

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