Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/llvm-project/clang/lib/AST/DeclCXX.cpp
35259 views
1
//===- DeclCXX.cpp - C++ Declaration AST Node Implementation --------------===//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//===----------------------------------------------------------------------===//
8
//
9
// This file implements the C++ related Decl classes.
10
//
11
//===----------------------------------------------------------------------===//
12
13
#include "clang/AST/DeclCXX.h"
14
#include "clang/AST/ASTContext.h"
15
#include "clang/AST/ASTLambda.h"
16
#include "clang/AST/ASTMutationListener.h"
17
#include "clang/AST/ASTUnresolvedSet.h"
18
#include "clang/AST/Attr.h"
19
#include "clang/AST/CXXInheritance.h"
20
#include "clang/AST/DeclBase.h"
21
#include "clang/AST/DeclTemplate.h"
22
#include "clang/AST/DeclarationName.h"
23
#include "clang/AST/Expr.h"
24
#include "clang/AST/ExprCXX.h"
25
#include "clang/AST/LambdaCapture.h"
26
#include "clang/AST/NestedNameSpecifier.h"
27
#include "clang/AST/ODRHash.h"
28
#include "clang/AST/Type.h"
29
#include "clang/AST/TypeLoc.h"
30
#include "clang/AST/UnresolvedSet.h"
31
#include "clang/Basic/Diagnostic.h"
32
#include "clang/Basic/IdentifierTable.h"
33
#include "clang/Basic/LLVM.h"
34
#include "clang/Basic/LangOptions.h"
35
#include "clang/Basic/OperatorKinds.h"
36
#include "clang/Basic/PartialDiagnostic.h"
37
#include "clang/Basic/SourceLocation.h"
38
#include "clang/Basic/Specifiers.h"
39
#include "clang/Basic/TargetInfo.h"
40
#include "llvm/ADT/SmallPtrSet.h"
41
#include "llvm/ADT/SmallVector.h"
42
#include "llvm/ADT/iterator_range.h"
43
#include "llvm/Support/Casting.h"
44
#include "llvm/Support/ErrorHandling.h"
45
#include "llvm/Support/Format.h"
46
#include "llvm/Support/raw_ostream.h"
47
#include <algorithm>
48
#include <cassert>
49
#include <cstddef>
50
#include <cstdint>
51
52
using namespace clang;
53
54
//===----------------------------------------------------------------------===//
55
// Decl Allocation/Deallocation Method Implementations
56
//===----------------------------------------------------------------------===//
57
58
void AccessSpecDecl::anchor() {}
59
60
AccessSpecDecl *AccessSpecDecl::CreateDeserialized(ASTContext &C,
61
GlobalDeclID ID) {
62
return new (C, ID) AccessSpecDecl(EmptyShell());
63
}
64
65
void LazyASTUnresolvedSet::getFromExternalSource(ASTContext &C) const {
66
ExternalASTSource *Source = C.getExternalSource();
67
assert(Impl.Decls.isLazy() && "getFromExternalSource for non-lazy set");
68
assert(Source && "getFromExternalSource with no external source");
69
70
for (ASTUnresolvedSet::iterator I = Impl.begin(); I != Impl.end(); ++I)
71
I.setDecl(
72
cast<NamedDecl>(Source->GetExternalDecl(GlobalDeclID(I.getDeclID()))));
73
Impl.Decls.setLazy(false);
74
}
75
76
CXXRecordDecl::DefinitionData::DefinitionData(CXXRecordDecl *D)
77
: UserDeclaredConstructor(false), UserDeclaredSpecialMembers(0),
78
Aggregate(true), PlainOldData(true), Empty(true), Polymorphic(false),
79
Abstract(false), IsStandardLayout(true), IsCXX11StandardLayout(true),
80
HasBasesWithFields(false), HasBasesWithNonStaticDataMembers(false),
81
HasPrivateFields(false), HasProtectedFields(false),
82
HasPublicFields(false), HasMutableFields(false), HasVariantMembers(false),
83
HasOnlyCMembers(true), HasInitMethod(false), HasInClassInitializer(false),
84
HasUninitializedReferenceMember(false), HasUninitializedFields(false),
85
HasInheritedConstructor(false), HasInheritedDefaultConstructor(false),
86
HasInheritedAssignment(false),
87
NeedOverloadResolutionForCopyConstructor(false),
88
NeedOverloadResolutionForMoveConstructor(false),
89
NeedOverloadResolutionForCopyAssignment(false),
90
NeedOverloadResolutionForMoveAssignment(false),
91
NeedOverloadResolutionForDestructor(false),
92
DefaultedCopyConstructorIsDeleted(false),
93
DefaultedMoveConstructorIsDeleted(false),
94
DefaultedCopyAssignmentIsDeleted(false),
95
DefaultedMoveAssignmentIsDeleted(false),
96
DefaultedDestructorIsDeleted(false), HasTrivialSpecialMembers(SMF_All),
97
HasTrivialSpecialMembersForCall(SMF_All),
98
DeclaredNonTrivialSpecialMembers(0),
99
DeclaredNonTrivialSpecialMembersForCall(0), HasIrrelevantDestructor(true),
100
HasConstexprNonCopyMoveConstructor(false),
101
HasDefaultedDefaultConstructor(false),
102
DefaultedDefaultConstructorIsConstexpr(true),
103
HasConstexprDefaultConstructor(false),
104
DefaultedDestructorIsConstexpr(true),
105
HasNonLiteralTypeFieldsOrBases(false), StructuralIfLiteral(true),
106
UserProvidedDefaultConstructor(false), DeclaredSpecialMembers(0),
107
ImplicitCopyConstructorCanHaveConstParamForVBase(true),
108
ImplicitCopyConstructorCanHaveConstParamForNonVBase(true),
109
ImplicitCopyAssignmentHasConstParam(true),
110
HasDeclaredCopyConstructorWithConstParam(false),
111
HasDeclaredCopyAssignmentWithConstParam(false),
112
IsAnyDestructorNoReturn(false), IsLambda(false),
113
IsParsingBaseSpecifiers(false), ComputedVisibleConversions(false),
114
HasODRHash(false), Definition(D) {}
115
116
CXXBaseSpecifier *CXXRecordDecl::DefinitionData::getBasesSlowCase() const {
117
return Bases.get(Definition->getASTContext().getExternalSource());
118
}
119
120
CXXBaseSpecifier *CXXRecordDecl::DefinitionData::getVBasesSlowCase() const {
121
return VBases.get(Definition->getASTContext().getExternalSource());
122
}
123
124
CXXRecordDecl::CXXRecordDecl(Kind K, TagKind TK, const ASTContext &C,
125
DeclContext *DC, SourceLocation StartLoc,
126
SourceLocation IdLoc, IdentifierInfo *Id,
127
CXXRecordDecl *PrevDecl)
128
: RecordDecl(K, TK, C, DC, StartLoc, IdLoc, Id, PrevDecl),
129
DefinitionData(PrevDecl ? PrevDecl->DefinitionData
130
: nullptr) {}
131
132
CXXRecordDecl *CXXRecordDecl::Create(const ASTContext &C, TagKind TK,
133
DeclContext *DC, SourceLocation StartLoc,
134
SourceLocation IdLoc, IdentifierInfo *Id,
135
CXXRecordDecl *PrevDecl,
136
bool DelayTypeCreation) {
137
auto *R = new (C, DC) CXXRecordDecl(CXXRecord, TK, C, DC, StartLoc, IdLoc, Id,
138
PrevDecl);
139
R->setMayHaveOutOfDateDef(C.getLangOpts().Modules);
140
141
// FIXME: DelayTypeCreation seems like such a hack
142
if (!DelayTypeCreation)
143
C.getTypeDeclType(R, PrevDecl);
144
return R;
145
}
146
147
CXXRecordDecl *
148
CXXRecordDecl::CreateLambda(const ASTContext &C, DeclContext *DC,
149
TypeSourceInfo *Info, SourceLocation Loc,
150
unsigned DependencyKind, bool IsGeneric,
151
LambdaCaptureDefault CaptureDefault) {
152
auto *R = new (C, DC) CXXRecordDecl(CXXRecord, TagTypeKind::Class, C, DC, Loc,
153
Loc, nullptr, nullptr);
154
R->setBeingDefined(true);
155
R->DefinitionData = new (C) struct LambdaDefinitionData(
156
R, Info, DependencyKind, IsGeneric, CaptureDefault);
157
R->setMayHaveOutOfDateDef(false);
158
R->setImplicit(true);
159
160
C.getTypeDeclType(R, /*PrevDecl=*/nullptr);
161
return R;
162
}
163
164
CXXRecordDecl *CXXRecordDecl::CreateDeserialized(const ASTContext &C,
165
GlobalDeclID ID) {
166
auto *R = new (C, ID)
167
CXXRecordDecl(CXXRecord, TagTypeKind::Struct, C, nullptr,
168
SourceLocation(), SourceLocation(), nullptr, nullptr);
169
R->setMayHaveOutOfDateDef(false);
170
return R;
171
}
172
173
/// Determine whether a class has a repeated base class. This is intended for
174
/// use when determining if a class is standard-layout, so makes no attempt to
175
/// handle virtual bases.
176
static bool hasRepeatedBaseClass(const CXXRecordDecl *StartRD) {
177
llvm::SmallPtrSet<const CXXRecordDecl*, 8> SeenBaseTypes;
178
SmallVector<const CXXRecordDecl*, 8> WorkList = {StartRD};
179
while (!WorkList.empty()) {
180
const CXXRecordDecl *RD = WorkList.pop_back_val();
181
if (RD->getTypeForDecl()->isDependentType())
182
continue;
183
for (const CXXBaseSpecifier &BaseSpec : RD->bases()) {
184
if (const CXXRecordDecl *B = BaseSpec.getType()->getAsCXXRecordDecl()) {
185
if (!SeenBaseTypes.insert(B).second)
186
return true;
187
WorkList.push_back(B);
188
}
189
}
190
}
191
return false;
192
}
193
194
void
195
CXXRecordDecl::setBases(CXXBaseSpecifier const * const *Bases,
196
unsigned NumBases) {
197
ASTContext &C = getASTContext();
198
199
if (!data().Bases.isOffset() && data().NumBases > 0)
200
C.Deallocate(data().getBases());
201
202
if (NumBases) {
203
if (!C.getLangOpts().CPlusPlus17) {
204
// C++ [dcl.init.aggr]p1:
205
// An aggregate is [...] a class with [...] no base classes [...].
206
data().Aggregate = false;
207
}
208
209
// C++ [class]p4:
210
// A POD-struct is an aggregate class...
211
data().PlainOldData = false;
212
}
213
214
// The set of seen virtual base types.
215
llvm::SmallPtrSet<CanQualType, 8> SeenVBaseTypes;
216
217
// The virtual bases of this class.
218
SmallVector<const CXXBaseSpecifier *, 8> VBases;
219
220
data().Bases = new(C) CXXBaseSpecifier [NumBases];
221
data().NumBases = NumBases;
222
for (unsigned i = 0; i < NumBases; ++i) {
223
data().getBases()[i] = *Bases[i];
224
// Keep track of inherited vbases for this base class.
225
const CXXBaseSpecifier *Base = Bases[i];
226
QualType BaseType = Base->getType();
227
// Skip dependent types; we can't do any checking on them now.
228
if (BaseType->isDependentType())
229
continue;
230
auto *BaseClassDecl =
231
cast<CXXRecordDecl>(BaseType->castAs<RecordType>()->getDecl());
232
233
// C++2a [class]p7:
234
// A standard-layout class is a class that:
235
// [...]
236
// -- has all non-static data members and bit-fields in the class and
237
// its base classes first declared in the same class
238
if (BaseClassDecl->data().HasBasesWithFields ||
239
!BaseClassDecl->field_empty()) {
240
if (data().HasBasesWithFields)
241
// Two bases have members or bit-fields: not standard-layout.
242
data().IsStandardLayout = false;
243
data().HasBasesWithFields = true;
244
}
245
246
// C++11 [class]p7:
247
// A standard-layout class is a class that:
248
// -- [...] has [...] at most one base class with non-static data
249
// members
250
if (BaseClassDecl->data().HasBasesWithNonStaticDataMembers ||
251
BaseClassDecl->hasDirectFields()) {
252
if (data().HasBasesWithNonStaticDataMembers)
253
data().IsCXX11StandardLayout = false;
254
data().HasBasesWithNonStaticDataMembers = true;
255
}
256
257
if (!BaseClassDecl->isEmpty()) {
258
// C++14 [meta.unary.prop]p4:
259
// T is a class type [...] with [...] no base class B for which
260
// is_empty<B>::value is false.
261
data().Empty = false;
262
}
263
264
// C++1z [dcl.init.agg]p1:
265
// An aggregate is a class with [...] no private or protected base classes
266
if (Base->getAccessSpecifier() != AS_public) {
267
data().Aggregate = false;
268
269
// C++20 [temp.param]p7:
270
// A structural type is [...] a literal class type with [...] all base
271
// classes [...] public
272
data().StructuralIfLiteral = false;
273
}
274
275
// C++ [class.virtual]p1:
276
// A class that declares or inherits a virtual function is called a
277
// polymorphic class.
278
if (BaseClassDecl->isPolymorphic()) {
279
data().Polymorphic = true;
280
281
// An aggregate is a class with [...] no virtual functions.
282
data().Aggregate = false;
283
}
284
285
// C++0x [class]p7:
286
// A standard-layout class is a class that: [...]
287
// -- has no non-standard-layout base classes
288
if (!BaseClassDecl->isStandardLayout())
289
data().IsStandardLayout = false;
290
if (!BaseClassDecl->isCXX11StandardLayout())
291
data().IsCXX11StandardLayout = false;
292
293
// Record if this base is the first non-literal field or base.
294
if (!hasNonLiteralTypeFieldsOrBases() && !BaseType->isLiteralType(C))
295
data().HasNonLiteralTypeFieldsOrBases = true;
296
297
// Now go through all virtual bases of this base and add them.
298
for (const auto &VBase : BaseClassDecl->vbases()) {
299
// Add this base if it's not already in the list.
300
if (SeenVBaseTypes.insert(C.getCanonicalType(VBase.getType())).second) {
301
VBases.push_back(&VBase);
302
303
// C++11 [class.copy]p8:
304
// The implicitly-declared copy constructor for a class X will have
305
// the form 'X::X(const X&)' if each [...] virtual base class B of X
306
// has a copy constructor whose first parameter is of type
307
// 'const B&' or 'const volatile B&' [...]
308
if (CXXRecordDecl *VBaseDecl = VBase.getType()->getAsCXXRecordDecl())
309
if (!VBaseDecl->hasCopyConstructorWithConstParam())
310
data().ImplicitCopyConstructorCanHaveConstParamForVBase = false;
311
312
// C++1z [dcl.init.agg]p1:
313
// An aggregate is a class with [...] no virtual base classes
314
data().Aggregate = false;
315
}
316
}
317
318
if (Base->isVirtual()) {
319
// Add this base if it's not already in the list.
320
if (SeenVBaseTypes.insert(C.getCanonicalType(BaseType)).second)
321
VBases.push_back(Base);
322
323
// C++14 [meta.unary.prop] is_empty:
324
// T is a class type, but not a union type, with ... no virtual base
325
// classes
326
data().Empty = false;
327
328
// C++1z [dcl.init.agg]p1:
329
// An aggregate is a class with [...] no virtual base classes
330
data().Aggregate = false;
331
332
// C++11 [class.ctor]p5, C++11 [class.copy]p12, C++11 [class.copy]p25:
333
// A [default constructor, copy/move constructor, or copy/move assignment
334
// operator for a class X] is trivial [...] if:
335
// -- class X has [...] no virtual base classes
336
data().HasTrivialSpecialMembers &= SMF_Destructor;
337
data().HasTrivialSpecialMembersForCall &= SMF_Destructor;
338
339
// C++0x [class]p7:
340
// A standard-layout class is a class that: [...]
341
// -- has [...] no virtual base classes
342
data().IsStandardLayout = false;
343
data().IsCXX11StandardLayout = false;
344
345
// C++20 [dcl.constexpr]p3:
346
// In the definition of a constexpr function [...]
347
// -- if the function is a constructor or destructor,
348
// its class shall not have any virtual base classes
349
data().DefaultedDefaultConstructorIsConstexpr = false;
350
data().DefaultedDestructorIsConstexpr = false;
351
352
// C++1z [class.copy]p8:
353
// The implicitly-declared copy constructor for a class X will have
354
// the form 'X::X(const X&)' if each potentially constructed subobject
355
// has a copy constructor whose first parameter is of type
356
// 'const B&' or 'const volatile B&' [...]
357
if (!BaseClassDecl->hasCopyConstructorWithConstParam())
358
data().ImplicitCopyConstructorCanHaveConstParamForVBase = false;
359
} else {
360
// C++ [class.ctor]p5:
361
// A default constructor is trivial [...] if:
362
// -- all the direct base classes of its class have trivial default
363
// constructors.
364
if (!BaseClassDecl->hasTrivialDefaultConstructor())
365
data().HasTrivialSpecialMembers &= ~SMF_DefaultConstructor;
366
367
// C++0x [class.copy]p13:
368
// A copy/move constructor for class X is trivial if [...]
369
// [...]
370
// -- the constructor selected to copy/move each direct base class
371
// subobject is trivial, and
372
if (!BaseClassDecl->hasTrivialCopyConstructor())
373
data().HasTrivialSpecialMembers &= ~SMF_CopyConstructor;
374
375
if (!BaseClassDecl->hasTrivialCopyConstructorForCall())
376
data().HasTrivialSpecialMembersForCall &= ~SMF_CopyConstructor;
377
378
// If the base class doesn't have a simple move constructor, we'll eagerly
379
// declare it and perform overload resolution to determine which function
380
// it actually calls. If it does have a simple move constructor, this
381
// check is correct.
382
if (!BaseClassDecl->hasTrivialMoveConstructor())
383
data().HasTrivialSpecialMembers &= ~SMF_MoveConstructor;
384
385
if (!BaseClassDecl->hasTrivialMoveConstructorForCall())
386
data().HasTrivialSpecialMembersForCall &= ~SMF_MoveConstructor;
387
388
// C++0x [class.copy]p27:
389
// A copy/move assignment operator for class X is trivial if [...]
390
// [...]
391
// -- the assignment operator selected to copy/move each direct base
392
// class subobject is trivial, and
393
if (!BaseClassDecl->hasTrivialCopyAssignment())
394
data().HasTrivialSpecialMembers &= ~SMF_CopyAssignment;
395
// If the base class doesn't have a simple move assignment, we'll eagerly
396
// declare it and perform overload resolution to determine which function
397
// it actually calls. If it does have a simple move assignment, this
398
// check is correct.
399
if (!BaseClassDecl->hasTrivialMoveAssignment())
400
data().HasTrivialSpecialMembers &= ~SMF_MoveAssignment;
401
402
// C++11 [class.ctor]p6:
403
// If that user-written default constructor would satisfy the
404
// requirements of a constexpr constructor/function(C++23), the
405
// implicitly-defined default constructor is constexpr.
406
if (!BaseClassDecl->hasConstexprDefaultConstructor())
407
data().DefaultedDefaultConstructorIsConstexpr =
408
C.getLangOpts().CPlusPlus23;
409
410
// C++1z [class.copy]p8:
411
// The implicitly-declared copy constructor for a class X will have
412
// the form 'X::X(const X&)' if each potentially constructed subobject
413
// has a copy constructor whose first parameter is of type
414
// 'const B&' or 'const volatile B&' [...]
415
if (!BaseClassDecl->hasCopyConstructorWithConstParam())
416
data().ImplicitCopyConstructorCanHaveConstParamForNonVBase = false;
417
}
418
419
// C++ [class.ctor]p3:
420
// A destructor is trivial if all the direct base classes of its class
421
// have trivial destructors.
422
if (!BaseClassDecl->hasTrivialDestructor())
423
data().HasTrivialSpecialMembers &= ~SMF_Destructor;
424
425
if (!BaseClassDecl->hasTrivialDestructorForCall())
426
data().HasTrivialSpecialMembersForCall &= ~SMF_Destructor;
427
428
if (!BaseClassDecl->hasIrrelevantDestructor())
429
data().HasIrrelevantDestructor = false;
430
431
if (BaseClassDecl->isAnyDestructorNoReturn())
432
data().IsAnyDestructorNoReturn = true;
433
434
// C++11 [class.copy]p18:
435
// The implicitly-declared copy assignment operator for a class X will
436
// have the form 'X& X::operator=(const X&)' if each direct base class B
437
// of X has a copy assignment operator whose parameter is of type 'const
438
// B&', 'const volatile B&', or 'B' [...]
439
if (!BaseClassDecl->hasCopyAssignmentWithConstParam())
440
data().ImplicitCopyAssignmentHasConstParam = false;
441
442
// A class has an Objective-C object member if... or any of its bases
443
// has an Objective-C object member.
444
if (BaseClassDecl->hasObjectMember())
445
setHasObjectMember(true);
446
447
if (BaseClassDecl->hasVolatileMember())
448
setHasVolatileMember(true);
449
450
if (BaseClassDecl->getArgPassingRestrictions() ==
451
RecordArgPassingKind::CanNeverPassInRegs)
452
setArgPassingRestrictions(RecordArgPassingKind::CanNeverPassInRegs);
453
454
// Keep track of the presence of mutable fields.
455
if (BaseClassDecl->hasMutableFields())
456
data().HasMutableFields = true;
457
458
if (BaseClassDecl->hasUninitializedReferenceMember())
459
data().HasUninitializedReferenceMember = true;
460
461
if (!BaseClassDecl->allowConstDefaultInit())
462
data().HasUninitializedFields = true;
463
464
addedClassSubobject(BaseClassDecl);
465
}
466
467
// C++2a [class]p7:
468
// A class S is a standard-layout class if it:
469
// -- has at most one base class subobject of any given type
470
//
471
// Note that we only need to check this for classes with more than one base
472
// class. If there's only one base class, and it's standard layout, then
473
// we know there are no repeated base classes.
474
if (data().IsStandardLayout && NumBases > 1 && hasRepeatedBaseClass(this))
475
data().IsStandardLayout = false;
476
477
if (VBases.empty()) {
478
data().IsParsingBaseSpecifiers = false;
479
return;
480
}
481
482
// Create base specifier for any direct or indirect virtual bases.
483
data().VBases = new (C) CXXBaseSpecifier[VBases.size()];
484
data().NumVBases = VBases.size();
485
for (int I = 0, E = VBases.size(); I != E; ++I) {
486
QualType Type = VBases[I]->getType();
487
if (!Type->isDependentType())
488
addedClassSubobject(Type->getAsCXXRecordDecl());
489
data().getVBases()[I] = *VBases[I];
490
}
491
492
data().IsParsingBaseSpecifiers = false;
493
}
494
495
unsigned CXXRecordDecl::getODRHash() const {
496
assert(hasDefinition() && "ODRHash only for records with definitions");
497
498
// Previously calculated hash is stored in DefinitionData.
499
if (DefinitionData->HasODRHash)
500
return DefinitionData->ODRHash;
501
502
// Only calculate hash on first call of getODRHash per record.
503
ODRHash Hash;
504
Hash.AddCXXRecordDecl(getDefinition());
505
DefinitionData->HasODRHash = true;
506
DefinitionData->ODRHash = Hash.CalculateHash();
507
508
return DefinitionData->ODRHash;
509
}
510
511
void CXXRecordDecl::addedClassSubobject(CXXRecordDecl *Subobj) {
512
// C++11 [class.copy]p11:
513
// A defaulted copy/move constructor for a class X is defined as
514
// deleted if X has:
515
// -- a direct or virtual base class B that cannot be copied/moved [...]
516
// -- a non-static data member of class type M (or array thereof)
517
// that cannot be copied or moved [...]
518
if (!Subobj->hasSimpleCopyConstructor())
519
data().NeedOverloadResolutionForCopyConstructor = true;
520
if (!Subobj->hasSimpleMoveConstructor())
521
data().NeedOverloadResolutionForMoveConstructor = true;
522
523
// C++11 [class.copy]p23:
524
// A defaulted copy/move assignment operator for a class X is defined as
525
// deleted if X has:
526
// -- a direct or virtual base class B that cannot be copied/moved [...]
527
// -- a non-static data member of class type M (or array thereof)
528
// that cannot be copied or moved [...]
529
if (!Subobj->hasSimpleCopyAssignment())
530
data().NeedOverloadResolutionForCopyAssignment = true;
531
if (!Subobj->hasSimpleMoveAssignment())
532
data().NeedOverloadResolutionForMoveAssignment = true;
533
534
// C++11 [class.ctor]p5, C++11 [class.copy]p11, C++11 [class.dtor]p5:
535
// A defaulted [ctor or dtor] for a class X is defined as
536
// deleted if X has:
537
// -- any direct or virtual base class [...] has a type with a destructor
538
// that is deleted or inaccessible from the defaulted [ctor or dtor].
539
// -- any non-static data member has a type with a destructor
540
// that is deleted or inaccessible from the defaulted [ctor or dtor].
541
if (!Subobj->hasSimpleDestructor()) {
542
data().NeedOverloadResolutionForCopyConstructor = true;
543
data().NeedOverloadResolutionForMoveConstructor = true;
544
data().NeedOverloadResolutionForDestructor = true;
545
}
546
547
// C++2a [dcl.constexpr]p4:
548
// The definition of a constexpr destructor [shall] satisfy the
549
// following requirement:
550
// -- for every subobject of class type or (possibly multi-dimensional)
551
// array thereof, that class type shall have a constexpr destructor
552
if (!Subobj->hasConstexprDestructor())
553
data().DefaultedDestructorIsConstexpr =
554
getASTContext().getLangOpts().CPlusPlus23;
555
556
// C++20 [temp.param]p7:
557
// A structural type is [...] a literal class type [for which] the types
558
// of all base classes and non-static data members are structural types or
559
// (possibly multi-dimensional) array thereof
560
if (!Subobj->data().StructuralIfLiteral)
561
data().StructuralIfLiteral = false;
562
}
563
564
const CXXRecordDecl *CXXRecordDecl::getStandardLayoutBaseWithFields() const {
565
assert(
566
isStandardLayout() &&
567
"getStandardLayoutBaseWithFields called on a non-standard-layout type");
568
#ifdef EXPENSIVE_CHECKS
569
{
570
unsigned NumberOfBasesWithFields = 0;
571
if (!field_empty())
572
++NumberOfBasesWithFields;
573
llvm::SmallPtrSet<const CXXRecordDecl *, 8> UniqueBases;
574
forallBases([&](const CXXRecordDecl *Base) -> bool {
575
if (!Base->field_empty())
576
++NumberOfBasesWithFields;
577
assert(
578
UniqueBases.insert(Base->getCanonicalDecl()).second &&
579
"Standard layout struct has multiple base classes of the same type");
580
return true;
581
});
582
assert(NumberOfBasesWithFields <= 1 &&
583
"Standard layout struct has fields declared in more than one class");
584
}
585
#endif
586
if (!field_empty())
587
return this;
588
const CXXRecordDecl *Result = this;
589
forallBases([&](const CXXRecordDecl *Base) -> bool {
590
if (!Base->field_empty()) {
591
// This is the base where the fields are declared; return early
592
Result = Base;
593
return false;
594
}
595
return true;
596
});
597
return Result;
598
}
599
600
bool CXXRecordDecl::hasConstexprDestructor() const {
601
auto *Dtor = getDestructor();
602
return Dtor ? Dtor->isConstexpr() : defaultedDestructorIsConstexpr();
603
}
604
605
bool CXXRecordDecl::hasAnyDependentBases() const {
606
if (!isDependentContext())
607
return false;
608
609
return !forallBases([](const CXXRecordDecl *) { return true; });
610
}
611
612
bool CXXRecordDecl::isTriviallyCopyable() const {
613
// C++0x [class]p5:
614
// A trivially copyable class is a class that:
615
// -- has no non-trivial copy constructors,
616
if (hasNonTrivialCopyConstructor()) return false;
617
// -- has no non-trivial move constructors,
618
if (hasNonTrivialMoveConstructor()) return false;
619
// -- has no non-trivial copy assignment operators,
620
if (hasNonTrivialCopyAssignment()) return false;
621
// -- has no non-trivial move assignment operators, and
622
if (hasNonTrivialMoveAssignment()) return false;
623
// -- has a trivial destructor.
624
if (!hasTrivialDestructor()) return false;
625
626
return true;
627
}
628
629
bool CXXRecordDecl::isTriviallyCopyConstructible() const {
630
631
// A trivially copy constructible class is a class that:
632
// -- has no non-trivial copy constructors,
633
if (hasNonTrivialCopyConstructor())
634
return false;
635
// -- has a trivial destructor.
636
if (!hasTrivialDestructor())
637
return false;
638
639
return true;
640
}
641
642
void CXXRecordDecl::markedVirtualFunctionPure() {
643
// C++ [class.abstract]p2:
644
// A class is abstract if it has at least one pure virtual function.
645
data().Abstract = true;
646
}
647
648
bool CXXRecordDecl::hasSubobjectAtOffsetZeroOfEmptyBaseType(
649
ASTContext &Ctx, const CXXRecordDecl *XFirst) {
650
if (!getNumBases())
651
return false;
652
653
llvm::SmallPtrSet<const CXXRecordDecl*, 8> Bases;
654
llvm::SmallPtrSet<const CXXRecordDecl*, 8> M;
655
SmallVector<const CXXRecordDecl*, 8> WorkList;
656
657
// Visit a type that we have determined is an element of M(S).
658
auto Visit = [&](const CXXRecordDecl *RD) -> bool {
659
RD = RD->getCanonicalDecl();
660
661
// C++2a [class]p8:
662
// A class S is a standard-layout class if it [...] has no element of the
663
// set M(S) of types as a base class.
664
//
665
// If we find a subobject of an empty type, it might also be a base class,
666
// so we'll need to walk the base classes to check.
667
if (!RD->data().HasBasesWithFields) {
668
// Walk the bases the first time, stopping if we find the type. Build a
669
// set of them so we don't need to walk them again.
670
if (Bases.empty()) {
671
bool RDIsBase = !forallBases([&](const CXXRecordDecl *Base) -> bool {
672
Base = Base->getCanonicalDecl();
673
if (RD == Base)
674
return false;
675
Bases.insert(Base);
676
return true;
677
});
678
if (RDIsBase)
679
return true;
680
} else {
681
if (Bases.count(RD))
682
return true;
683
}
684
}
685
686
if (M.insert(RD).second)
687
WorkList.push_back(RD);
688
return false;
689
};
690
691
if (Visit(XFirst))
692
return true;
693
694
while (!WorkList.empty()) {
695
const CXXRecordDecl *X = WorkList.pop_back_val();
696
697
// FIXME: We don't check the bases of X. That matches the standard, but
698
// that sure looks like a wording bug.
699
700
// -- If X is a non-union class type with a non-static data member
701
// [recurse to each field] that is either of zero size or is the
702
// first non-static data member of X
703
// -- If X is a union type, [recurse to union members]
704
bool IsFirstField = true;
705
for (auto *FD : X->fields()) {
706
// FIXME: Should we really care about the type of the first non-static
707
// data member of a non-union if there are preceding unnamed bit-fields?
708
if (FD->isUnnamedBitField())
709
continue;
710
711
if (!IsFirstField && !FD->isZeroSize(Ctx))
712
continue;
713
714
if (FD->isInvalidDecl())
715
continue;
716
717
// -- If X is n array type, [visit the element type]
718
QualType T = Ctx.getBaseElementType(FD->getType());
719
if (auto *RD = T->getAsCXXRecordDecl())
720
if (Visit(RD))
721
return true;
722
723
if (!X->isUnion())
724
IsFirstField = false;
725
}
726
}
727
728
return false;
729
}
730
731
bool CXXRecordDecl::lambdaIsDefaultConstructibleAndAssignable() const {
732
assert(isLambda() && "not a lambda");
733
734
// C++2a [expr.prim.lambda.capture]p11:
735
// The closure type associated with a lambda-expression has no default
736
// constructor if the lambda-expression has a lambda-capture and a
737
// defaulted default constructor otherwise. It has a deleted copy
738
// assignment operator if the lambda-expression has a lambda-capture and
739
// defaulted copy and move assignment operators otherwise.
740
//
741
// C++17 [expr.prim.lambda]p21:
742
// The closure type associated with a lambda-expression has no default
743
// constructor and a deleted copy assignment operator.
744
if (!isCapturelessLambda())
745
return false;
746
return getASTContext().getLangOpts().CPlusPlus20;
747
}
748
749
void CXXRecordDecl::addedMember(Decl *D) {
750
if (!D->isImplicit() && !isa<FieldDecl>(D) && !isa<IndirectFieldDecl>(D) &&
751
(!isa<TagDecl>(D) ||
752
cast<TagDecl>(D)->getTagKind() == TagTypeKind::Class ||
753
cast<TagDecl>(D)->getTagKind() == TagTypeKind::Interface))
754
data().HasOnlyCMembers = false;
755
756
// Ignore friends and invalid declarations.
757
if (D->getFriendObjectKind() || D->isInvalidDecl())
758
return;
759
760
auto *FunTmpl = dyn_cast<FunctionTemplateDecl>(D);
761
if (FunTmpl)
762
D = FunTmpl->getTemplatedDecl();
763
764
// FIXME: Pass NamedDecl* to addedMember?
765
Decl *DUnderlying = D;
766
if (auto *ND = dyn_cast<NamedDecl>(DUnderlying)) {
767
DUnderlying = ND->getUnderlyingDecl();
768
if (auto *UnderlyingFunTmpl = dyn_cast<FunctionTemplateDecl>(DUnderlying))
769
DUnderlying = UnderlyingFunTmpl->getTemplatedDecl();
770
}
771
772
if (const auto *Method = dyn_cast<CXXMethodDecl>(D)) {
773
if (Method->isVirtual()) {
774
// C++ [dcl.init.aggr]p1:
775
// An aggregate is an array or a class with [...] no virtual functions.
776
data().Aggregate = false;
777
778
// C++ [class]p4:
779
// A POD-struct is an aggregate class...
780
data().PlainOldData = false;
781
782
// C++14 [meta.unary.prop]p4:
783
// T is a class type [...] with [...] no virtual member functions...
784
data().Empty = false;
785
786
// C++ [class.virtual]p1:
787
// A class that declares or inherits a virtual function is called a
788
// polymorphic class.
789
data().Polymorphic = true;
790
791
// C++11 [class.ctor]p5, C++11 [class.copy]p12, C++11 [class.copy]p25:
792
// A [default constructor, copy/move constructor, or copy/move
793
// assignment operator for a class X] is trivial [...] if:
794
// -- class X has no virtual functions [...]
795
data().HasTrivialSpecialMembers &= SMF_Destructor;
796
data().HasTrivialSpecialMembersForCall &= SMF_Destructor;
797
798
// C++0x [class]p7:
799
// A standard-layout class is a class that: [...]
800
// -- has no virtual functions
801
data().IsStandardLayout = false;
802
data().IsCXX11StandardLayout = false;
803
}
804
}
805
806
// Notify the listener if an implicit member was added after the definition
807
// was completed.
808
if (!isBeingDefined() && D->isImplicit())
809
if (ASTMutationListener *L = getASTMutationListener())
810
L->AddedCXXImplicitMember(data().Definition, D);
811
812
// The kind of special member this declaration is, if any.
813
unsigned SMKind = 0;
814
815
// Handle constructors.
816
if (const auto *Constructor = dyn_cast<CXXConstructorDecl>(D)) {
817
if (Constructor->isInheritingConstructor()) {
818
// Ignore constructor shadow declarations. They are lazily created and
819
// so shouldn't affect any properties of the class.
820
} else {
821
if (!Constructor->isImplicit()) {
822
// Note that we have a user-declared constructor.
823
data().UserDeclaredConstructor = true;
824
825
const TargetInfo &TI = getASTContext().getTargetInfo();
826
if ((!Constructor->isDeleted() && !Constructor->isDefaulted()) ||
827
!TI.areDefaultedSMFStillPOD(getLangOpts())) {
828
// C++ [class]p4:
829
// A POD-struct is an aggregate class [...]
830
// Since the POD bit is meant to be C++03 POD-ness, clear it even if
831
// the type is technically an aggregate in C++0x since it wouldn't be
832
// in 03.
833
data().PlainOldData = false;
834
}
835
}
836
837
if (Constructor->isDefaultConstructor()) {
838
SMKind |= SMF_DefaultConstructor;
839
840
if (Constructor->isUserProvided())
841
data().UserProvidedDefaultConstructor = true;
842
if (Constructor->isConstexpr())
843
data().HasConstexprDefaultConstructor = true;
844
if (Constructor->isDefaulted())
845
data().HasDefaultedDefaultConstructor = true;
846
}
847
848
if (!FunTmpl) {
849
unsigned Quals;
850
if (Constructor->isCopyConstructor(Quals)) {
851
SMKind |= SMF_CopyConstructor;
852
853
if (Quals & Qualifiers::Const)
854
data().HasDeclaredCopyConstructorWithConstParam = true;
855
} else if (Constructor->isMoveConstructor())
856
SMKind |= SMF_MoveConstructor;
857
}
858
859
// C++11 [dcl.init.aggr]p1: DR1518
860
// An aggregate is an array or a class with no user-provided [or]
861
// explicit [...] constructors
862
// C++20 [dcl.init.aggr]p1:
863
// An aggregate is an array or a class with no user-declared [...]
864
// constructors
865
if (getASTContext().getLangOpts().CPlusPlus20
866
? !Constructor->isImplicit()
867
: (Constructor->isUserProvided() || Constructor->isExplicit()))
868
data().Aggregate = false;
869
}
870
}
871
872
// Handle constructors, including those inherited from base classes.
873
if (const auto *Constructor = dyn_cast<CXXConstructorDecl>(DUnderlying)) {
874
// Record if we see any constexpr constructors which are neither copy
875
// nor move constructors.
876
// C++1z [basic.types]p10:
877
// [...] has at least one constexpr constructor or constructor template
878
// (possibly inherited from a base class) that is not a copy or move
879
// constructor [...]
880
if (Constructor->isConstexpr() && !Constructor->isCopyOrMoveConstructor())
881
data().HasConstexprNonCopyMoveConstructor = true;
882
if (!isa<CXXConstructorDecl>(D) && Constructor->isDefaultConstructor())
883
data().HasInheritedDefaultConstructor = true;
884
}
885
886
// Handle member functions.
887
if (const auto *Method = dyn_cast<CXXMethodDecl>(D)) {
888
if (isa<CXXDestructorDecl>(D))
889
SMKind |= SMF_Destructor;
890
891
if (Method->isCopyAssignmentOperator()) {
892
SMKind |= SMF_CopyAssignment;
893
894
const auto *ParamTy =
895
Method->getNonObjectParameter(0)->getType()->getAs<ReferenceType>();
896
if (!ParamTy || ParamTy->getPointeeType().isConstQualified())
897
data().HasDeclaredCopyAssignmentWithConstParam = true;
898
}
899
900
if (Method->isMoveAssignmentOperator())
901
SMKind |= SMF_MoveAssignment;
902
903
// Keep the list of conversion functions up-to-date.
904
if (auto *Conversion = dyn_cast<CXXConversionDecl>(D)) {
905
// FIXME: We use the 'unsafe' accessor for the access specifier here,
906
// because Sema may not have set it yet. That's really just a misdesign
907
// in Sema. However, LLDB *will* have set the access specifier correctly,
908
// and adds declarations after the class is technically completed,
909
// so completeDefinition()'s overriding of the access specifiers doesn't
910
// work.
911
AccessSpecifier AS = Conversion->getAccessUnsafe();
912
913
if (Conversion->getPrimaryTemplate()) {
914
// We don't record specializations.
915
} else {
916
ASTContext &Ctx = getASTContext();
917
ASTUnresolvedSet &Conversions = data().Conversions.get(Ctx);
918
NamedDecl *Primary =
919
FunTmpl ? cast<NamedDecl>(FunTmpl) : cast<NamedDecl>(Conversion);
920
if (Primary->getPreviousDecl())
921
Conversions.replace(cast<NamedDecl>(Primary->getPreviousDecl()),
922
Primary, AS);
923
else
924
Conversions.addDecl(Ctx, Primary, AS);
925
}
926
}
927
928
if (SMKind) {
929
// If this is the first declaration of a special member, we no longer have
930
// an implicit trivial special member.
931
data().HasTrivialSpecialMembers &=
932
data().DeclaredSpecialMembers | ~SMKind;
933
data().HasTrivialSpecialMembersForCall &=
934
data().DeclaredSpecialMembers | ~SMKind;
935
936
// Note when we have declared a declared special member, and suppress the
937
// implicit declaration of this special member.
938
data().DeclaredSpecialMembers |= SMKind;
939
if (!Method->isImplicit()) {
940
data().UserDeclaredSpecialMembers |= SMKind;
941
942
const TargetInfo &TI = getASTContext().getTargetInfo();
943
if ((!Method->isDeleted() && !Method->isDefaulted() &&
944
SMKind != SMF_MoveAssignment) ||
945
!TI.areDefaultedSMFStillPOD(getLangOpts())) {
946
// C++03 [class]p4:
947
// A POD-struct is an aggregate class that has [...] no user-defined
948
// copy assignment operator and no user-defined destructor.
949
//
950
// Since the POD bit is meant to be C++03 POD-ness, and in C++03,
951
// aggregates could not have any constructors, clear it even for an
952
// explicitly defaulted or deleted constructor.
953
// type is technically an aggregate in C++0x since it wouldn't be in
954
// 03.
955
//
956
// Also, a user-declared move assignment operator makes a class
957
// non-POD. This is an extension in C++03.
958
data().PlainOldData = false;
959
}
960
}
961
// When instantiating a class, we delay updating the destructor and
962
// triviality properties of the class until selecting a destructor and
963
// computing the eligibility of its special member functions. This is
964
// because there might be function constraints that we need to evaluate
965
// and compare later in the instantiation.
966
if (!Method->isIneligibleOrNotSelected()) {
967
addedEligibleSpecialMemberFunction(Method, SMKind);
968
}
969
}
970
971
return;
972
}
973
974
// Handle non-static data members.
975
if (const auto *Field = dyn_cast<FieldDecl>(D)) {
976
ASTContext &Context = getASTContext();
977
978
// C++2a [class]p7:
979
// A standard-layout class is a class that:
980
// [...]
981
// -- has all non-static data members and bit-fields in the class and
982
// its base classes first declared in the same class
983
if (data().HasBasesWithFields)
984
data().IsStandardLayout = false;
985
986
// C++ [class.bit]p2:
987
// A declaration for a bit-field that omits the identifier declares an
988
// unnamed bit-field. Unnamed bit-fields are not members and cannot be
989
// initialized.
990
if (Field->isUnnamedBitField()) {
991
// C++ [meta.unary.prop]p4: [LWG2358]
992
// T is a class type [...] with [...] no unnamed bit-fields of non-zero
993
// length
994
if (data().Empty && !Field->isZeroLengthBitField(Context) &&
995
Context.getLangOpts().getClangABICompat() >
996
LangOptions::ClangABI::Ver6)
997
data().Empty = false;
998
return;
999
}
1000
1001
// C++11 [class]p7:
1002
// A standard-layout class is a class that:
1003
// -- either has no non-static data members in the most derived class
1004
// [...] or has no base classes with non-static data members
1005
if (data().HasBasesWithNonStaticDataMembers)
1006
data().IsCXX11StandardLayout = false;
1007
1008
// C++ [dcl.init.aggr]p1:
1009
// An aggregate is an array or a class (clause 9) with [...] no
1010
// private or protected non-static data members (clause 11).
1011
//
1012
// A POD must be an aggregate.
1013
if (D->getAccess() == AS_private || D->getAccess() == AS_protected) {
1014
data().Aggregate = false;
1015
data().PlainOldData = false;
1016
1017
// C++20 [temp.param]p7:
1018
// A structural type is [...] a literal class type [for which] all
1019
// non-static data members are public
1020
data().StructuralIfLiteral = false;
1021
}
1022
1023
// Track whether this is the first field. We use this when checking
1024
// whether the class is standard-layout below.
1025
bool IsFirstField = !data().HasPrivateFields &&
1026
!data().HasProtectedFields && !data().HasPublicFields;
1027
1028
// C++0x [class]p7:
1029
// A standard-layout class is a class that:
1030
// [...]
1031
// -- has the same access control for all non-static data members,
1032
switch (D->getAccess()) {
1033
case AS_private: data().HasPrivateFields = true; break;
1034
case AS_protected: data().HasProtectedFields = true; break;
1035
case AS_public: data().HasPublicFields = true; break;
1036
case AS_none: llvm_unreachable("Invalid access specifier");
1037
};
1038
if ((data().HasPrivateFields + data().HasProtectedFields +
1039
data().HasPublicFields) > 1) {
1040
data().IsStandardLayout = false;
1041
data().IsCXX11StandardLayout = false;
1042
}
1043
1044
// Keep track of the presence of mutable fields.
1045
if (Field->isMutable()) {
1046
data().HasMutableFields = true;
1047
1048
// C++20 [temp.param]p7:
1049
// A structural type is [...] a literal class type [for which] all
1050
// non-static data members are public
1051
data().StructuralIfLiteral = false;
1052
}
1053
1054
// C++11 [class.union]p8, DR1460:
1055
// If X is a union, a non-static data member of X that is not an anonymous
1056
// union is a variant member of X.
1057
if (isUnion() && !Field->isAnonymousStructOrUnion())
1058
data().HasVariantMembers = true;
1059
1060
// C++0x [class]p9:
1061
// A POD struct is a class that is both a trivial class and a
1062
// standard-layout class, and has no non-static data members of type
1063
// non-POD struct, non-POD union (or array of such types).
1064
//
1065
// Automatic Reference Counting: the presence of a member of Objective-C pointer type
1066
// that does not explicitly have no lifetime makes the class a non-POD.
1067
QualType T = Context.getBaseElementType(Field->getType());
1068
if (T->isObjCRetainableType() || T.isObjCGCStrong()) {
1069
if (T.hasNonTrivialObjCLifetime()) {
1070
// Objective-C Automatic Reference Counting:
1071
// If a class has a non-static data member of Objective-C pointer
1072
// type (or array thereof), it is a non-POD type and its
1073
// default constructor (if any), copy constructor, move constructor,
1074
// copy assignment operator, move assignment operator, and destructor are
1075
// non-trivial.
1076
setHasObjectMember(true);
1077
struct DefinitionData &Data = data();
1078
Data.PlainOldData = false;
1079
Data.HasTrivialSpecialMembers = 0;
1080
1081
// __strong or __weak fields do not make special functions non-trivial
1082
// for the purpose of calls.
1083
Qualifiers::ObjCLifetime LT = T.getQualifiers().getObjCLifetime();
1084
if (LT != Qualifiers::OCL_Strong && LT != Qualifiers::OCL_Weak)
1085
data().HasTrivialSpecialMembersForCall = 0;
1086
1087
// Structs with __weak fields should never be passed directly.
1088
if (LT == Qualifiers::OCL_Weak)
1089
setArgPassingRestrictions(RecordArgPassingKind::CanNeverPassInRegs);
1090
1091
Data.HasIrrelevantDestructor = false;
1092
1093
if (isUnion()) {
1094
data().DefaultedCopyConstructorIsDeleted = true;
1095
data().DefaultedMoveConstructorIsDeleted = true;
1096
data().DefaultedCopyAssignmentIsDeleted = true;
1097
data().DefaultedMoveAssignmentIsDeleted = true;
1098
data().DefaultedDestructorIsDeleted = true;
1099
data().NeedOverloadResolutionForCopyConstructor = true;
1100
data().NeedOverloadResolutionForMoveConstructor = true;
1101
data().NeedOverloadResolutionForCopyAssignment = true;
1102
data().NeedOverloadResolutionForMoveAssignment = true;
1103
data().NeedOverloadResolutionForDestructor = true;
1104
}
1105
} else if (!Context.getLangOpts().ObjCAutoRefCount) {
1106
setHasObjectMember(true);
1107
}
1108
} else if (!T.isCXX98PODType(Context))
1109
data().PlainOldData = false;
1110
1111
if (T->isReferenceType()) {
1112
if (!Field->hasInClassInitializer())
1113
data().HasUninitializedReferenceMember = true;
1114
1115
// C++0x [class]p7:
1116
// A standard-layout class is a class that:
1117
// -- has no non-static data members of type [...] reference,
1118
data().IsStandardLayout = false;
1119
data().IsCXX11StandardLayout = false;
1120
1121
// C++1z [class.copy.ctor]p10:
1122
// A defaulted copy constructor for a class X is defined as deleted if X has:
1123
// -- a non-static data member of rvalue reference type
1124
if (T->isRValueReferenceType())
1125
data().DefaultedCopyConstructorIsDeleted = true;
1126
}
1127
1128
if (!Field->hasInClassInitializer() && !Field->isMutable()) {
1129
if (CXXRecordDecl *FieldType = T->getAsCXXRecordDecl()) {
1130
if (FieldType->hasDefinition() && !FieldType->allowConstDefaultInit())
1131
data().HasUninitializedFields = true;
1132
} else {
1133
data().HasUninitializedFields = true;
1134
}
1135
}
1136
1137
// Record if this field is the first non-literal or volatile field or base.
1138
if (!T->isLiteralType(Context) || T.isVolatileQualified())
1139
data().HasNonLiteralTypeFieldsOrBases = true;
1140
1141
if (Field->hasInClassInitializer() ||
1142
(Field->isAnonymousStructOrUnion() &&
1143
Field->getType()->getAsCXXRecordDecl()->hasInClassInitializer())) {
1144
data().HasInClassInitializer = true;
1145
1146
// C++11 [class]p5:
1147
// A default constructor is trivial if [...] no non-static data member
1148
// of its class has a brace-or-equal-initializer.
1149
data().HasTrivialSpecialMembers &= ~SMF_DefaultConstructor;
1150
1151
// C++11 [dcl.init.aggr]p1:
1152
// An aggregate is a [...] class with [...] no
1153
// brace-or-equal-initializers for non-static data members.
1154
//
1155
// This rule was removed in C++14.
1156
if (!getASTContext().getLangOpts().CPlusPlus14)
1157
data().Aggregate = false;
1158
1159
// C++11 [class]p10:
1160
// A POD struct is [...] a trivial class.
1161
data().PlainOldData = false;
1162
}
1163
1164
// C++11 [class.copy]p23:
1165
// A defaulted copy/move assignment operator for a class X is defined
1166
// as deleted if X has:
1167
// -- a non-static data member of reference type
1168
if (T->isReferenceType()) {
1169
data().DefaultedCopyAssignmentIsDeleted = true;
1170
data().DefaultedMoveAssignmentIsDeleted = true;
1171
}
1172
1173
// Bitfields of length 0 are also zero-sized, but we already bailed out for
1174
// those because they are always unnamed.
1175
bool IsZeroSize = Field->isZeroSize(Context);
1176
1177
if (const auto *RecordTy = T->getAs<RecordType>()) {
1178
auto *FieldRec = cast<CXXRecordDecl>(RecordTy->getDecl());
1179
if (FieldRec->getDefinition()) {
1180
addedClassSubobject(FieldRec);
1181
1182
// We may need to perform overload resolution to determine whether a
1183
// field can be moved if it's const or volatile qualified.
1184
if (T.getCVRQualifiers() & (Qualifiers::Const | Qualifiers::Volatile)) {
1185
// We need to care about 'const' for the copy constructor because an
1186
// implicit copy constructor might be declared with a non-const
1187
// parameter.
1188
data().NeedOverloadResolutionForCopyConstructor = true;
1189
data().NeedOverloadResolutionForMoveConstructor = true;
1190
data().NeedOverloadResolutionForCopyAssignment = true;
1191
data().NeedOverloadResolutionForMoveAssignment = true;
1192
}
1193
1194
// C++11 [class.ctor]p5, C++11 [class.copy]p11:
1195
// A defaulted [special member] for a class X is defined as
1196
// deleted if:
1197
// -- X is a union-like class that has a variant member with a
1198
// non-trivial [corresponding special member]
1199
if (isUnion()) {
1200
if (FieldRec->hasNonTrivialCopyConstructor())
1201
data().DefaultedCopyConstructorIsDeleted = true;
1202
if (FieldRec->hasNonTrivialMoveConstructor())
1203
data().DefaultedMoveConstructorIsDeleted = true;
1204
if (FieldRec->hasNonTrivialCopyAssignment())
1205
data().DefaultedCopyAssignmentIsDeleted = true;
1206
if (FieldRec->hasNonTrivialMoveAssignment())
1207
data().DefaultedMoveAssignmentIsDeleted = true;
1208
if (FieldRec->hasNonTrivialDestructor())
1209
data().DefaultedDestructorIsDeleted = true;
1210
}
1211
1212
// For an anonymous union member, our overload resolution will perform
1213
// overload resolution for its members.
1214
if (Field->isAnonymousStructOrUnion()) {
1215
data().NeedOverloadResolutionForCopyConstructor |=
1216
FieldRec->data().NeedOverloadResolutionForCopyConstructor;
1217
data().NeedOverloadResolutionForMoveConstructor |=
1218
FieldRec->data().NeedOverloadResolutionForMoveConstructor;
1219
data().NeedOverloadResolutionForCopyAssignment |=
1220
FieldRec->data().NeedOverloadResolutionForCopyAssignment;
1221
data().NeedOverloadResolutionForMoveAssignment |=
1222
FieldRec->data().NeedOverloadResolutionForMoveAssignment;
1223
data().NeedOverloadResolutionForDestructor |=
1224
FieldRec->data().NeedOverloadResolutionForDestructor;
1225
}
1226
1227
// C++0x [class.ctor]p5:
1228
// A default constructor is trivial [...] if:
1229
// -- for all the non-static data members of its class that are of
1230
// class type (or array thereof), each such class has a trivial
1231
// default constructor.
1232
if (!FieldRec->hasTrivialDefaultConstructor())
1233
data().HasTrivialSpecialMembers &= ~SMF_DefaultConstructor;
1234
1235
// C++0x [class.copy]p13:
1236
// A copy/move constructor for class X is trivial if [...]
1237
// [...]
1238
// -- for each non-static data member of X that is of class type (or
1239
// an array thereof), the constructor selected to copy/move that
1240
// member is trivial;
1241
if (!FieldRec->hasTrivialCopyConstructor())
1242
data().HasTrivialSpecialMembers &= ~SMF_CopyConstructor;
1243
1244
if (!FieldRec->hasTrivialCopyConstructorForCall())
1245
data().HasTrivialSpecialMembersForCall &= ~SMF_CopyConstructor;
1246
1247
// If the field doesn't have a simple move constructor, we'll eagerly
1248
// declare the move constructor for this class and we'll decide whether
1249
// it's trivial then.
1250
if (!FieldRec->hasTrivialMoveConstructor())
1251
data().HasTrivialSpecialMembers &= ~SMF_MoveConstructor;
1252
1253
if (!FieldRec->hasTrivialMoveConstructorForCall())
1254
data().HasTrivialSpecialMembersForCall &= ~SMF_MoveConstructor;
1255
1256
// C++0x [class.copy]p27:
1257
// A copy/move assignment operator for class X is trivial if [...]
1258
// [...]
1259
// -- for each non-static data member of X that is of class type (or
1260
// an array thereof), the assignment operator selected to
1261
// copy/move that member is trivial;
1262
if (!FieldRec->hasTrivialCopyAssignment())
1263
data().HasTrivialSpecialMembers &= ~SMF_CopyAssignment;
1264
// If the field doesn't have a simple move assignment, we'll eagerly
1265
// declare the move assignment for this class and we'll decide whether
1266
// it's trivial then.
1267
if (!FieldRec->hasTrivialMoveAssignment())
1268
data().HasTrivialSpecialMembers &= ~SMF_MoveAssignment;
1269
1270
if (!FieldRec->hasTrivialDestructor())
1271
data().HasTrivialSpecialMembers &= ~SMF_Destructor;
1272
if (!FieldRec->hasTrivialDestructorForCall())
1273
data().HasTrivialSpecialMembersForCall &= ~SMF_Destructor;
1274
if (!FieldRec->hasIrrelevantDestructor())
1275
data().HasIrrelevantDestructor = false;
1276
if (FieldRec->isAnyDestructorNoReturn())
1277
data().IsAnyDestructorNoReturn = true;
1278
if (FieldRec->hasObjectMember())
1279
setHasObjectMember(true);
1280
if (FieldRec->hasVolatileMember())
1281
setHasVolatileMember(true);
1282
if (FieldRec->getArgPassingRestrictions() ==
1283
RecordArgPassingKind::CanNeverPassInRegs)
1284
setArgPassingRestrictions(RecordArgPassingKind::CanNeverPassInRegs);
1285
1286
// C++0x [class]p7:
1287
// A standard-layout class is a class that:
1288
// -- has no non-static data members of type non-standard-layout
1289
// class (or array of such types) [...]
1290
if (!FieldRec->isStandardLayout())
1291
data().IsStandardLayout = false;
1292
if (!FieldRec->isCXX11StandardLayout())
1293
data().IsCXX11StandardLayout = false;
1294
1295
// C++2a [class]p7:
1296
// A standard-layout class is a class that:
1297
// [...]
1298
// -- has no element of the set M(S) of types as a base class.
1299
if (data().IsStandardLayout &&
1300
(isUnion() || IsFirstField || IsZeroSize) &&
1301
hasSubobjectAtOffsetZeroOfEmptyBaseType(Context, FieldRec))
1302
data().IsStandardLayout = false;
1303
1304
// C++11 [class]p7:
1305
// A standard-layout class is a class that:
1306
// -- has no base classes of the same type as the first non-static
1307
// data member
1308
if (data().IsCXX11StandardLayout && IsFirstField) {
1309
// FIXME: We should check all base classes here, not just direct
1310
// base classes.
1311
for (const auto &BI : bases()) {
1312
if (Context.hasSameUnqualifiedType(BI.getType(), T)) {
1313
data().IsCXX11StandardLayout = false;
1314
break;
1315
}
1316
}
1317
}
1318
1319
// Keep track of the presence of mutable fields.
1320
if (FieldRec->hasMutableFields())
1321
data().HasMutableFields = true;
1322
1323
if (Field->isMutable()) {
1324
// Our copy constructor/assignment might call something other than
1325
// the subobject's copy constructor/assignment if it's mutable and of
1326
// class type.
1327
data().NeedOverloadResolutionForCopyConstructor = true;
1328
data().NeedOverloadResolutionForCopyAssignment = true;
1329
}
1330
1331
// C++11 [class.copy]p13:
1332
// If the implicitly-defined constructor would satisfy the
1333
// requirements of a constexpr constructor, the implicitly-defined
1334
// constructor is constexpr.
1335
// C++11 [dcl.constexpr]p4:
1336
// -- every constructor involved in initializing non-static data
1337
// members [...] shall be a constexpr constructor
1338
if (!Field->hasInClassInitializer() &&
1339
!FieldRec->hasConstexprDefaultConstructor() && !isUnion())
1340
// The standard requires any in-class initializer to be a constant
1341
// expression. We consider this to be a defect.
1342
data().DefaultedDefaultConstructorIsConstexpr =
1343
Context.getLangOpts().CPlusPlus23;
1344
1345
// C++11 [class.copy]p8:
1346
// The implicitly-declared copy constructor for a class X will have
1347
// the form 'X::X(const X&)' if each potentially constructed subobject
1348
// of a class type M (or array thereof) has a copy constructor whose
1349
// first parameter is of type 'const M&' or 'const volatile M&'.
1350
if (!FieldRec->hasCopyConstructorWithConstParam())
1351
data().ImplicitCopyConstructorCanHaveConstParamForNonVBase = false;
1352
1353
// C++11 [class.copy]p18:
1354
// The implicitly-declared copy assignment oeprator for a class X will
1355
// have the form 'X& X::operator=(const X&)' if [...] for all the
1356
// non-static data members of X that are of a class type M (or array
1357
// thereof), each such class type has a copy assignment operator whose
1358
// parameter is of type 'const M&', 'const volatile M&' or 'M'.
1359
if (!FieldRec->hasCopyAssignmentWithConstParam())
1360
data().ImplicitCopyAssignmentHasConstParam = false;
1361
1362
if (FieldRec->hasUninitializedReferenceMember() &&
1363
!Field->hasInClassInitializer())
1364
data().HasUninitializedReferenceMember = true;
1365
1366
// C++11 [class.union]p8, DR1460:
1367
// a non-static data member of an anonymous union that is a member of
1368
// X is also a variant member of X.
1369
if (FieldRec->hasVariantMembers() &&
1370
Field->isAnonymousStructOrUnion())
1371
data().HasVariantMembers = true;
1372
}
1373
} else {
1374
// Base element type of field is a non-class type.
1375
if (!T->isLiteralType(Context) ||
1376
(!Field->hasInClassInitializer() && !isUnion() &&
1377
!Context.getLangOpts().CPlusPlus20))
1378
data().DefaultedDefaultConstructorIsConstexpr = false;
1379
1380
// C++11 [class.copy]p23:
1381
// A defaulted copy/move assignment operator for a class X is defined
1382
// as deleted if X has:
1383
// -- a non-static data member of const non-class type (or array
1384
// thereof)
1385
if (T.isConstQualified()) {
1386
data().DefaultedCopyAssignmentIsDeleted = true;
1387
data().DefaultedMoveAssignmentIsDeleted = true;
1388
}
1389
1390
// C++20 [temp.param]p7:
1391
// A structural type is [...] a literal class type [for which] the
1392
// types of all non-static data members are structural types or
1393
// (possibly multidimensional) array thereof
1394
// We deal with class types elsewhere.
1395
if (!T->isStructuralType())
1396
data().StructuralIfLiteral = false;
1397
}
1398
1399
// C++14 [meta.unary.prop]p4:
1400
// T is a class type [...] with [...] no non-static data members other
1401
// than subobjects of zero size
1402
if (data().Empty && !IsZeroSize)
1403
data().Empty = false;
1404
}
1405
1406
// Handle using declarations of conversion functions.
1407
if (auto *Shadow = dyn_cast<UsingShadowDecl>(D)) {
1408
if (Shadow->getDeclName().getNameKind()
1409
== DeclarationName::CXXConversionFunctionName) {
1410
ASTContext &Ctx = getASTContext();
1411
data().Conversions.get(Ctx).addDecl(Ctx, Shadow, Shadow->getAccess());
1412
}
1413
}
1414
1415
if (const auto *Using = dyn_cast<UsingDecl>(D)) {
1416
if (Using->getDeclName().getNameKind() ==
1417
DeclarationName::CXXConstructorName) {
1418
data().HasInheritedConstructor = true;
1419
// C++1z [dcl.init.aggr]p1:
1420
// An aggregate is [...] a class [...] with no inherited constructors
1421
data().Aggregate = false;
1422
}
1423
1424
if (Using->getDeclName().getCXXOverloadedOperator() == OO_Equal)
1425
data().HasInheritedAssignment = true;
1426
}
1427
}
1428
1429
bool CXXRecordDecl::isLiteral() const {
1430
const LangOptions &LangOpts = getLangOpts();
1431
if (!(LangOpts.CPlusPlus20 ? hasConstexprDestructor()
1432
: hasTrivialDestructor()))
1433
return false;
1434
1435
if (hasNonLiteralTypeFieldsOrBases()) {
1436
// CWG2598
1437
// is an aggregate union type that has either no variant
1438
// members or at least one variant member of non-volatile literal type,
1439
if (!isUnion())
1440
return false;
1441
bool HasAtLeastOneLiteralMember =
1442
fields().empty() || any_of(fields(), [this](const FieldDecl *D) {
1443
return !D->getType().isVolatileQualified() &&
1444
D->getType()->isLiteralType(getASTContext());
1445
});
1446
if (!HasAtLeastOneLiteralMember)
1447
return false;
1448
}
1449
1450
return isAggregate() || (isLambda() && LangOpts.CPlusPlus17) ||
1451
hasConstexprNonCopyMoveConstructor() || hasTrivialDefaultConstructor();
1452
}
1453
1454
void CXXRecordDecl::addedSelectedDestructor(CXXDestructorDecl *DD) {
1455
DD->setIneligibleOrNotSelected(false);
1456
addedEligibleSpecialMemberFunction(DD, SMF_Destructor);
1457
}
1458
1459
void CXXRecordDecl::addedEligibleSpecialMemberFunction(const CXXMethodDecl *MD,
1460
unsigned SMKind) {
1461
// FIXME: We shouldn't change DeclaredNonTrivialSpecialMembers if `MD` is
1462
// a function template, but this needs CWG attention before we break ABI.
1463
// See https://github.com/llvm/llvm-project/issues/59206
1464
1465
if (const auto *DD = dyn_cast<CXXDestructorDecl>(MD)) {
1466
if (DD->isUserProvided())
1467
data().HasIrrelevantDestructor = false;
1468
// If the destructor is explicitly defaulted and not trivial or not public
1469
// or if the destructor is deleted, we clear HasIrrelevantDestructor in
1470
// finishedDefaultedOrDeletedMember.
1471
1472
// C++11 [class.dtor]p5:
1473
// A destructor is trivial if [...] the destructor is not virtual.
1474
if (DD->isVirtual()) {
1475
data().HasTrivialSpecialMembers &= ~SMF_Destructor;
1476
data().HasTrivialSpecialMembersForCall &= ~SMF_Destructor;
1477
}
1478
1479
if (DD->isNoReturn())
1480
data().IsAnyDestructorNoReturn = true;
1481
}
1482
1483
if (!MD->isImplicit() && !MD->isUserProvided()) {
1484
// This method is user-declared but not user-provided. We can't work
1485
// out whether it's trivial yet (not until we get to the end of the
1486
// class). We'll handle this method in
1487
// finishedDefaultedOrDeletedMember.
1488
} else if (MD->isTrivial()) {
1489
data().HasTrivialSpecialMembers |= SMKind;
1490
data().HasTrivialSpecialMembersForCall |= SMKind;
1491
} else if (MD->isTrivialForCall()) {
1492
data().HasTrivialSpecialMembersForCall |= SMKind;
1493
data().DeclaredNonTrivialSpecialMembers |= SMKind;
1494
} else {
1495
data().DeclaredNonTrivialSpecialMembers |= SMKind;
1496
// If this is a user-provided function, do not set
1497
// DeclaredNonTrivialSpecialMembersForCall here since we don't know
1498
// yet whether the method would be considered non-trivial for the
1499
// purpose of calls (attribute "trivial_abi" can be dropped from the
1500
// class later, which can change the special method's triviality).
1501
if (!MD->isUserProvided())
1502
data().DeclaredNonTrivialSpecialMembersForCall |= SMKind;
1503
}
1504
}
1505
1506
void CXXRecordDecl::finishedDefaultedOrDeletedMember(CXXMethodDecl *D) {
1507
assert(!D->isImplicit() && !D->isUserProvided());
1508
1509
// The kind of special member this declaration is, if any.
1510
unsigned SMKind = 0;
1511
1512
if (const auto *Constructor = dyn_cast<CXXConstructorDecl>(D)) {
1513
if (Constructor->isDefaultConstructor()) {
1514
SMKind |= SMF_DefaultConstructor;
1515
if (Constructor->isConstexpr())
1516
data().HasConstexprDefaultConstructor = true;
1517
}
1518
if (Constructor->isCopyConstructor())
1519
SMKind |= SMF_CopyConstructor;
1520
else if (Constructor->isMoveConstructor())
1521
SMKind |= SMF_MoveConstructor;
1522
else if (Constructor->isConstexpr())
1523
// We may now know that the constructor is constexpr.
1524
data().HasConstexprNonCopyMoveConstructor = true;
1525
} else if (isa<CXXDestructorDecl>(D)) {
1526
SMKind |= SMF_Destructor;
1527
if (!D->isTrivial() || D->getAccess() != AS_public || D->isDeleted())
1528
data().HasIrrelevantDestructor = false;
1529
} else if (D->isCopyAssignmentOperator())
1530
SMKind |= SMF_CopyAssignment;
1531
else if (D->isMoveAssignmentOperator())
1532
SMKind |= SMF_MoveAssignment;
1533
1534
// Update which trivial / non-trivial special members we have.
1535
// addedMember will have skipped this step for this member.
1536
if (!D->isIneligibleOrNotSelected()) {
1537
if (D->isTrivial())
1538
data().HasTrivialSpecialMembers |= SMKind;
1539
else
1540
data().DeclaredNonTrivialSpecialMembers |= SMKind;
1541
}
1542
}
1543
1544
void CXXRecordDecl::LambdaDefinitionData::AddCaptureList(ASTContext &Ctx,
1545
Capture *CaptureList) {
1546
Captures.push_back(CaptureList);
1547
if (Captures.size() == 2) {
1548
// The TinyPtrVector member now needs destruction.
1549
Ctx.addDestruction(&Captures);
1550
}
1551
}
1552
1553
void CXXRecordDecl::setCaptures(ASTContext &Context,
1554
ArrayRef<LambdaCapture> Captures) {
1555
CXXRecordDecl::LambdaDefinitionData &Data = getLambdaData();
1556
1557
// Copy captures.
1558
Data.NumCaptures = Captures.size();
1559
Data.NumExplicitCaptures = 0;
1560
auto *ToCapture = (LambdaCapture *)Context.Allocate(sizeof(LambdaCapture) *
1561
Captures.size());
1562
Data.AddCaptureList(Context, ToCapture);
1563
for (const LambdaCapture &C : Captures) {
1564
if (C.isExplicit())
1565
++Data.NumExplicitCaptures;
1566
1567
new (ToCapture) LambdaCapture(C);
1568
ToCapture++;
1569
}
1570
1571
if (!lambdaIsDefaultConstructibleAndAssignable())
1572
Data.DefaultedCopyAssignmentIsDeleted = true;
1573
}
1574
1575
void CXXRecordDecl::setTrivialForCallFlags(CXXMethodDecl *D) {
1576
unsigned SMKind = 0;
1577
1578
if (const auto *Constructor = dyn_cast<CXXConstructorDecl>(D)) {
1579
if (Constructor->isCopyConstructor())
1580
SMKind = SMF_CopyConstructor;
1581
else if (Constructor->isMoveConstructor())
1582
SMKind = SMF_MoveConstructor;
1583
} else if (isa<CXXDestructorDecl>(D))
1584
SMKind = SMF_Destructor;
1585
1586
if (D->isTrivialForCall())
1587
data().HasTrivialSpecialMembersForCall |= SMKind;
1588
else
1589
data().DeclaredNonTrivialSpecialMembersForCall |= SMKind;
1590
}
1591
1592
bool CXXRecordDecl::isCLike() const {
1593
if (getTagKind() == TagTypeKind::Class ||
1594
getTagKind() == TagTypeKind::Interface ||
1595
!TemplateOrInstantiation.isNull())
1596
return false;
1597
if (!hasDefinition())
1598
return true;
1599
1600
return isPOD() && data().HasOnlyCMembers;
1601
}
1602
1603
bool CXXRecordDecl::isGenericLambda() const {
1604
if (!isLambda()) return false;
1605
return getLambdaData().IsGenericLambda;
1606
}
1607
1608
#ifndef NDEBUG
1609
static bool allLookupResultsAreTheSame(const DeclContext::lookup_result &R) {
1610
return llvm::all_of(R, [&](NamedDecl *D) {
1611
return D->isInvalidDecl() || declaresSameEntity(D, R.front());
1612
});
1613
}
1614
#endif
1615
1616
static NamedDecl* getLambdaCallOperatorHelper(const CXXRecordDecl &RD) {
1617
if (!RD.isLambda()) return nullptr;
1618
DeclarationName Name =
1619
RD.getASTContext().DeclarationNames.getCXXOperatorName(OO_Call);
1620
DeclContext::lookup_result Calls = RD.lookup(Name);
1621
1622
assert(!Calls.empty() && "Missing lambda call operator!");
1623
assert(allLookupResultsAreTheSame(Calls) &&
1624
"More than one lambda call operator!");
1625
return Calls.front();
1626
}
1627
1628
FunctionTemplateDecl* CXXRecordDecl::getDependentLambdaCallOperator() const {
1629
NamedDecl *CallOp = getLambdaCallOperatorHelper(*this);
1630
return dyn_cast_or_null<FunctionTemplateDecl>(CallOp);
1631
}
1632
1633
CXXMethodDecl *CXXRecordDecl::getLambdaCallOperator() const {
1634
NamedDecl *CallOp = getLambdaCallOperatorHelper(*this);
1635
1636
if (CallOp == nullptr)
1637
return nullptr;
1638
1639
if (const auto *CallOpTmpl = dyn_cast<FunctionTemplateDecl>(CallOp))
1640
return cast<CXXMethodDecl>(CallOpTmpl->getTemplatedDecl());
1641
1642
return cast<CXXMethodDecl>(CallOp);
1643
}
1644
1645
CXXMethodDecl* CXXRecordDecl::getLambdaStaticInvoker() const {
1646
CXXMethodDecl *CallOp = getLambdaCallOperator();
1647
CallingConv CC = CallOp->getType()->castAs<FunctionType>()->getCallConv();
1648
return getLambdaStaticInvoker(CC);
1649
}
1650
1651
static DeclContext::lookup_result
1652
getLambdaStaticInvokers(const CXXRecordDecl &RD) {
1653
assert(RD.isLambda() && "Must be a lambda");
1654
DeclarationName Name =
1655
&RD.getASTContext().Idents.get(getLambdaStaticInvokerName());
1656
return RD.lookup(Name);
1657
}
1658
1659
static CXXMethodDecl *getInvokerAsMethod(NamedDecl *ND) {
1660
if (const auto *InvokerTemplate = dyn_cast<FunctionTemplateDecl>(ND))
1661
return cast<CXXMethodDecl>(InvokerTemplate->getTemplatedDecl());
1662
return cast<CXXMethodDecl>(ND);
1663
}
1664
1665
CXXMethodDecl *CXXRecordDecl::getLambdaStaticInvoker(CallingConv CC) const {
1666
if (!isLambda())
1667
return nullptr;
1668
DeclContext::lookup_result Invoker = getLambdaStaticInvokers(*this);
1669
1670
for (NamedDecl *ND : Invoker) {
1671
const auto *FTy =
1672
cast<ValueDecl>(ND->getAsFunction())->getType()->castAs<FunctionType>();
1673
if (FTy->getCallConv() == CC)
1674
return getInvokerAsMethod(ND);
1675
}
1676
1677
return nullptr;
1678
}
1679
1680
void CXXRecordDecl::getCaptureFields(
1681
llvm::DenseMap<const ValueDecl *, FieldDecl *> &Captures,
1682
FieldDecl *&ThisCapture) const {
1683
Captures.clear();
1684
ThisCapture = nullptr;
1685
1686
LambdaDefinitionData &Lambda = getLambdaData();
1687
for (const LambdaCapture *List : Lambda.Captures) {
1688
RecordDecl::field_iterator Field = field_begin();
1689
for (const LambdaCapture *C = List, *CEnd = C + Lambda.NumCaptures;
1690
C != CEnd; ++C, ++Field) {
1691
if (C->capturesThis())
1692
ThisCapture = *Field;
1693
else if (C->capturesVariable())
1694
Captures[C->getCapturedVar()] = *Field;
1695
}
1696
assert(Field == field_end());
1697
}
1698
}
1699
1700
TemplateParameterList *
1701
CXXRecordDecl::getGenericLambdaTemplateParameterList() const {
1702
if (!isGenericLambda()) return nullptr;
1703
CXXMethodDecl *CallOp = getLambdaCallOperator();
1704
if (FunctionTemplateDecl *Tmpl = CallOp->getDescribedFunctionTemplate())
1705
return Tmpl->getTemplateParameters();
1706
return nullptr;
1707
}
1708
1709
ArrayRef<NamedDecl *>
1710
CXXRecordDecl::getLambdaExplicitTemplateParameters() const {
1711
TemplateParameterList *List = getGenericLambdaTemplateParameterList();
1712
if (!List)
1713
return {};
1714
1715
assert(std::is_partitioned(List->begin(), List->end(),
1716
[](const NamedDecl *D) { return !D->isImplicit(); })
1717
&& "Explicit template params should be ordered before implicit ones");
1718
1719
const auto ExplicitEnd = llvm::partition_point(
1720
*List, [](const NamedDecl *D) { return !D->isImplicit(); });
1721
return llvm::ArrayRef(List->begin(), ExplicitEnd);
1722
}
1723
1724
Decl *CXXRecordDecl::getLambdaContextDecl() const {
1725
assert(isLambda() && "Not a lambda closure type!");
1726
ExternalASTSource *Source = getParentASTContext().getExternalSource();
1727
return getLambdaData().ContextDecl.get(Source);
1728
}
1729
1730
void CXXRecordDecl::setLambdaNumbering(LambdaNumbering Numbering) {
1731
assert(isLambda() && "Not a lambda closure type!");
1732
getLambdaData().ManglingNumber = Numbering.ManglingNumber;
1733
if (Numbering.DeviceManglingNumber)
1734
getASTContext().DeviceLambdaManglingNumbers[this] =
1735
Numbering.DeviceManglingNumber;
1736
getLambdaData().IndexInContext = Numbering.IndexInContext;
1737
getLambdaData().ContextDecl = Numbering.ContextDecl;
1738
getLambdaData().HasKnownInternalLinkage = Numbering.HasKnownInternalLinkage;
1739
}
1740
1741
unsigned CXXRecordDecl::getDeviceLambdaManglingNumber() const {
1742
assert(isLambda() && "Not a lambda closure type!");
1743
return getASTContext().DeviceLambdaManglingNumbers.lookup(this);
1744
}
1745
1746
static CanQualType GetConversionType(ASTContext &Context, NamedDecl *Conv) {
1747
QualType T =
1748
cast<CXXConversionDecl>(Conv->getUnderlyingDecl()->getAsFunction())
1749
->getConversionType();
1750
return Context.getCanonicalType(T);
1751
}
1752
1753
/// Collect the visible conversions of a base class.
1754
///
1755
/// \param Record a base class of the class we're considering
1756
/// \param InVirtual whether this base class is a virtual base (or a base
1757
/// of a virtual base)
1758
/// \param Access the access along the inheritance path to this base
1759
/// \param ParentHiddenTypes the conversions provided by the inheritors
1760
/// of this base
1761
/// \param Output the set to which to add conversions from non-virtual bases
1762
/// \param VOutput the set to which to add conversions from virtual bases
1763
/// \param HiddenVBaseCs the set of conversions which were hidden in a
1764
/// virtual base along some inheritance path
1765
static void CollectVisibleConversions(
1766
ASTContext &Context, const CXXRecordDecl *Record, bool InVirtual,
1767
AccessSpecifier Access,
1768
const llvm::SmallPtrSet<CanQualType, 8> &ParentHiddenTypes,
1769
ASTUnresolvedSet &Output, UnresolvedSetImpl &VOutput,
1770
llvm::SmallPtrSet<NamedDecl *, 8> &HiddenVBaseCs) {
1771
// The set of types which have conversions in this class or its
1772
// subclasses. As an optimization, we don't copy the derived set
1773
// unless it might change.
1774
const llvm::SmallPtrSet<CanQualType, 8> *HiddenTypes = &ParentHiddenTypes;
1775
llvm::SmallPtrSet<CanQualType, 8> HiddenTypesBuffer;
1776
1777
// Collect the direct conversions and figure out which conversions
1778
// will be hidden in the subclasses.
1779
CXXRecordDecl::conversion_iterator ConvI = Record->conversion_begin();
1780
CXXRecordDecl::conversion_iterator ConvE = Record->conversion_end();
1781
if (ConvI != ConvE) {
1782
HiddenTypesBuffer = ParentHiddenTypes;
1783
HiddenTypes = &HiddenTypesBuffer;
1784
1785
for (CXXRecordDecl::conversion_iterator I = ConvI; I != ConvE; ++I) {
1786
CanQualType ConvType(GetConversionType(Context, I.getDecl()));
1787
bool Hidden = ParentHiddenTypes.count(ConvType);
1788
if (!Hidden)
1789
HiddenTypesBuffer.insert(ConvType);
1790
1791
// If this conversion is hidden and we're in a virtual base,
1792
// remember that it's hidden along some inheritance path.
1793
if (Hidden && InVirtual)
1794
HiddenVBaseCs.insert(cast<NamedDecl>(I.getDecl()->getCanonicalDecl()));
1795
1796
// If this conversion isn't hidden, add it to the appropriate output.
1797
else if (!Hidden) {
1798
AccessSpecifier IAccess
1799
= CXXRecordDecl::MergeAccess(Access, I.getAccess());
1800
1801
if (InVirtual)
1802
VOutput.addDecl(I.getDecl(), IAccess);
1803
else
1804
Output.addDecl(Context, I.getDecl(), IAccess);
1805
}
1806
}
1807
}
1808
1809
// Collect information recursively from any base classes.
1810
for (const auto &I : Record->bases()) {
1811
const auto *RT = I.getType()->getAs<RecordType>();
1812
if (!RT) continue;
1813
1814
AccessSpecifier BaseAccess
1815
= CXXRecordDecl::MergeAccess(Access, I.getAccessSpecifier());
1816
bool BaseInVirtual = InVirtual || I.isVirtual();
1817
1818
auto *Base = cast<CXXRecordDecl>(RT->getDecl());
1819
CollectVisibleConversions(Context, Base, BaseInVirtual, BaseAccess,
1820
*HiddenTypes, Output, VOutput, HiddenVBaseCs);
1821
}
1822
}
1823
1824
/// Collect the visible conversions of a class.
1825
///
1826
/// This would be extremely straightforward if it weren't for virtual
1827
/// bases. It might be worth special-casing that, really.
1828
static void CollectVisibleConversions(ASTContext &Context,
1829
const CXXRecordDecl *Record,
1830
ASTUnresolvedSet &Output) {
1831
// The collection of all conversions in virtual bases that we've
1832
// found. These will be added to the output as long as they don't
1833
// appear in the hidden-conversions set.
1834
UnresolvedSet<8> VBaseCs;
1835
1836
// The set of conversions in virtual bases that we've determined to
1837
// be hidden.
1838
llvm::SmallPtrSet<NamedDecl*, 8> HiddenVBaseCs;
1839
1840
// The set of types hidden by classes derived from this one.
1841
llvm::SmallPtrSet<CanQualType, 8> HiddenTypes;
1842
1843
// Go ahead and collect the direct conversions and add them to the
1844
// hidden-types set.
1845
CXXRecordDecl::conversion_iterator ConvI = Record->conversion_begin();
1846
CXXRecordDecl::conversion_iterator ConvE = Record->conversion_end();
1847
Output.append(Context, ConvI, ConvE);
1848
for (; ConvI != ConvE; ++ConvI)
1849
HiddenTypes.insert(GetConversionType(Context, ConvI.getDecl()));
1850
1851
// Recursively collect conversions from base classes.
1852
for (const auto &I : Record->bases()) {
1853
const auto *RT = I.getType()->getAs<RecordType>();
1854
if (!RT) continue;
1855
1856
CollectVisibleConversions(Context, cast<CXXRecordDecl>(RT->getDecl()),
1857
I.isVirtual(), I.getAccessSpecifier(),
1858
HiddenTypes, Output, VBaseCs, HiddenVBaseCs);
1859
}
1860
1861
// Add any unhidden conversions provided by virtual bases.
1862
for (UnresolvedSetIterator I = VBaseCs.begin(), E = VBaseCs.end();
1863
I != E; ++I) {
1864
if (!HiddenVBaseCs.count(cast<NamedDecl>(I.getDecl()->getCanonicalDecl())))
1865
Output.addDecl(Context, I.getDecl(), I.getAccess());
1866
}
1867
}
1868
1869
/// getVisibleConversionFunctions - get all conversion functions visible
1870
/// in current class; including conversion function templates.
1871
llvm::iterator_range<CXXRecordDecl::conversion_iterator>
1872
CXXRecordDecl::getVisibleConversionFunctions() const {
1873
ASTContext &Ctx = getASTContext();
1874
1875
ASTUnresolvedSet *Set;
1876
if (bases_begin() == bases_end()) {
1877
// If root class, all conversions are visible.
1878
Set = &data().Conversions.get(Ctx);
1879
} else {
1880
Set = &data().VisibleConversions.get(Ctx);
1881
// If visible conversion list is not evaluated, evaluate it.
1882
if (!data().ComputedVisibleConversions) {
1883
CollectVisibleConversions(Ctx, this, *Set);
1884
data().ComputedVisibleConversions = true;
1885
}
1886
}
1887
return llvm::make_range(Set->begin(), Set->end());
1888
}
1889
1890
void CXXRecordDecl::removeConversion(const NamedDecl *ConvDecl) {
1891
// This operation is O(N) but extremely rare. Sema only uses it to
1892
// remove UsingShadowDecls in a class that were followed by a direct
1893
// declaration, e.g.:
1894
// class A : B {
1895
// using B::operator int;
1896
// operator int();
1897
// };
1898
// This is uncommon by itself and even more uncommon in conjunction
1899
// with sufficiently large numbers of directly-declared conversions
1900
// that asymptotic behavior matters.
1901
1902
ASTUnresolvedSet &Convs = data().Conversions.get(getASTContext());
1903
for (unsigned I = 0, E = Convs.size(); I != E; ++I) {
1904
if (Convs[I].getDecl() == ConvDecl) {
1905
Convs.erase(I);
1906
assert(!llvm::is_contained(Convs, ConvDecl) &&
1907
"conversion was found multiple times in unresolved set");
1908
return;
1909
}
1910
}
1911
1912
llvm_unreachable("conversion not found in set!");
1913
}
1914
1915
CXXRecordDecl *CXXRecordDecl::getInstantiatedFromMemberClass() const {
1916
if (MemberSpecializationInfo *MSInfo = getMemberSpecializationInfo())
1917
return cast<CXXRecordDecl>(MSInfo->getInstantiatedFrom());
1918
1919
return nullptr;
1920
}
1921
1922
MemberSpecializationInfo *CXXRecordDecl::getMemberSpecializationInfo() const {
1923
return TemplateOrInstantiation.dyn_cast<MemberSpecializationInfo *>();
1924
}
1925
1926
void
1927
CXXRecordDecl::setInstantiationOfMemberClass(CXXRecordDecl *RD,
1928
TemplateSpecializationKind TSK) {
1929
assert(TemplateOrInstantiation.isNull() &&
1930
"Previous template or instantiation?");
1931
assert(!isa<ClassTemplatePartialSpecializationDecl>(this));
1932
TemplateOrInstantiation
1933
= new (getASTContext()) MemberSpecializationInfo(RD, TSK);
1934
}
1935
1936
ClassTemplateDecl *CXXRecordDecl::getDescribedClassTemplate() const {
1937
return TemplateOrInstantiation.dyn_cast<ClassTemplateDecl *>();
1938
}
1939
1940
void CXXRecordDecl::setDescribedClassTemplate(ClassTemplateDecl *Template) {
1941
TemplateOrInstantiation = Template;
1942
}
1943
1944
TemplateSpecializationKind CXXRecordDecl::getTemplateSpecializationKind() const{
1945
if (const auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(this))
1946
return Spec->getSpecializationKind();
1947
1948
if (MemberSpecializationInfo *MSInfo = getMemberSpecializationInfo())
1949
return MSInfo->getTemplateSpecializationKind();
1950
1951
return TSK_Undeclared;
1952
}
1953
1954
void
1955
CXXRecordDecl::setTemplateSpecializationKind(TemplateSpecializationKind TSK) {
1956
if (auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(this)) {
1957
Spec->setSpecializationKind(TSK);
1958
return;
1959
}
1960
1961
if (MemberSpecializationInfo *MSInfo = getMemberSpecializationInfo()) {
1962
MSInfo->setTemplateSpecializationKind(TSK);
1963
return;
1964
}
1965
1966
llvm_unreachable("Not a class template or member class specialization");
1967
}
1968
1969
const CXXRecordDecl *CXXRecordDecl::getTemplateInstantiationPattern() const {
1970
auto GetDefinitionOrSelf =
1971
[](const CXXRecordDecl *D) -> const CXXRecordDecl * {
1972
if (auto *Def = D->getDefinition())
1973
return Def;
1974
return D;
1975
};
1976
1977
// If it's a class template specialization, find the template or partial
1978
// specialization from which it was instantiated.
1979
if (auto *TD = dyn_cast<ClassTemplateSpecializationDecl>(this)) {
1980
auto From = TD->getInstantiatedFrom();
1981
if (auto *CTD = From.dyn_cast<ClassTemplateDecl *>()) {
1982
while (auto *NewCTD = CTD->getInstantiatedFromMemberTemplate()) {
1983
if (NewCTD->isMemberSpecialization())
1984
break;
1985
CTD = NewCTD;
1986
}
1987
return GetDefinitionOrSelf(CTD->getTemplatedDecl());
1988
}
1989
if (auto *CTPSD =
1990
From.dyn_cast<ClassTemplatePartialSpecializationDecl *>()) {
1991
while (auto *NewCTPSD = CTPSD->getInstantiatedFromMember()) {
1992
if (NewCTPSD->isMemberSpecialization())
1993
break;
1994
CTPSD = NewCTPSD;
1995
}
1996
return GetDefinitionOrSelf(CTPSD);
1997
}
1998
}
1999
2000
if (MemberSpecializationInfo *MSInfo = getMemberSpecializationInfo()) {
2001
if (isTemplateInstantiation(MSInfo->getTemplateSpecializationKind())) {
2002
const CXXRecordDecl *RD = this;
2003
while (auto *NewRD = RD->getInstantiatedFromMemberClass())
2004
RD = NewRD;
2005
return GetDefinitionOrSelf(RD);
2006
}
2007
}
2008
2009
assert(!isTemplateInstantiation(this->getTemplateSpecializationKind()) &&
2010
"couldn't find pattern for class template instantiation");
2011
return nullptr;
2012
}
2013
2014
CXXDestructorDecl *CXXRecordDecl::getDestructor() const {
2015
ASTContext &Context = getASTContext();
2016
QualType ClassType = Context.getTypeDeclType(this);
2017
2018
DeclarationName Name
2019
= Context.DeclarationNames.getCXXDestructorName(
2020
Context.getCanonicalType(ClassType));
2021
2022
DeclContext::lookup_result R = lookup(Name);
2023
2024
// If a destructor was marked as not selected, we skip it. We don't always
2025
// have a selected destructor: dependent types, unnamed structs.
2026
for (auto *Decl : R) {
2027
auto* DD = dyn_cast<CXXDestructorDecl>(Decl);
2028
if (DD && !DD->isIneligibleOrNotSelected())
2029
return DD;
2030
}
2031
return nullptr;
2032
}
2033
2034
static bool isDeclContextInNamespace(const DeclContext *DC) {
2035
while (!DC->isTranslationUnit()) {
2036
if (DC->isNamespace())
2037
return true;
2038
DC = DC->getParent();
2039
}
2040
return false;
2041
}
2042
2043
bool CXXRecordDecl::isInterfaceLike() const {
2044
assert(hasDefinition() && "checking for interface-like without a definition");
2045
// All __interfaces are inheritently interface-like.
2046
if (isInterface())
2047
return true;
2048
2049
// Interface-like types cannot have a user declared constructor, destructor,
2050
// friends, VBases, conversion functions, or fields. Additionally, lambdas
2051
// cannot be interface types.
2052
if (isLambda() || hasUserDeclaredConstructor() ||
2053
hasUserDeclaredDestructor() || !field_empty() || hasFriends() ||
2054
getNumVBases() > 0 || conversion_end() - conversion_begin() > 0)
2055
return false;
2056
2057
// No interface-like type can have a method with a definition.
2058
for (const auto *const Method : methods())
2059
if (Method->isDefined() && !Method->isImplicit())
2060
return false;
2061
2062
// Check "Special" types.
2063
const auto *Uuid = getAttr<UuidAttr>();
2064
// MS SDK declares IUnknown/IDispatch both in the root of a TU, or in an
2065
// extern C++ block directly in the TU. These are only valid if in one
2066
// of these two situations.
2067
if (Uuid && isStruct() && !getDeclContext()->isExternCContext() &&
2068
!isDeclContextInNamespace(getDeclContext()) &&
2069
((getName() == "IUnknown" &&
2070
Uuid->getGuid() == "00000000-0000-0000-C000-000000000046") ||
2071
(getName() == "IDispatch" &&
2072
Uuid->getGuid() == "00020400-0000-0000-C000-000000000046"))) {
2073
if (getNumBases() > 0)
2074
return false;
2075
return true;
2076
}
2077
2078
// FIXME: Any access specifiers is supposed to make this no longer interface
2079
// like.
2080
2081
// If this isn't a 'special' type, it must have a single interface-like base.
2082
if (getNumBases() != 1)
2083
return false;
2084
2085
const auto BaseSpec = *bases_begin();
2086
if (BaseSpec.isVirtual() || BaseSpec.getAccessSpecifier() != AS_public)
2087
return false;
2088
const auto *Base = BaseSpec.getType()->getAsCXXRecordDecl();
2089
if (Base->isInterface() || !Base->isInterfaceLike())
2090
return false;
2091
return true;
2092
}
2093
2094
void CXXRecordDecl::completeDefinition() {
2095
completeDefinition(nullptr);
2096
}
2097
2098
static bool hasPureVirtualFinalOverrider(
2099
const CXXRecordDecl &RD, const CXXFinalOverriderMap *FinalOverriders) {
2100
if (!FinalOverriders) {
2101
CXXFinalOverriderMap MyFinalOverriders;
2102
RD.getFinalOverriders(MyFinalOverriders);
2103
return hasPureVirtualFinalOverrider(RD, &MyFinalOverriders);
2104
}
2105
2106
for (const CXXFinalOverriderMap::value_type &
2107
OverridingMethodsEntry : *FinalOverriders) {
2108
for (const auto &[_, SubobjOverrides] : OverridingMethodsEntry.second) {
2109
assert(SubobjOverrides.size() > 0 &&
2110
"All virtual functions have overriding virtual functions");
2111
2112
if (SubobjOverrides.front().Method->isPureVirtual())
2113
return true;
2114
}
2115
}
2116
return false;
2117
}
2118
2119
void CXXRecordDecl::completeDefinition(CXXFinalOverriderMap *FinalOverriders) {
2120
RecordDecl::completeDefinition();
2121
2122
// If the class may be abstract (but hasn't been marked as such), check for
2123
// any pure final overriders.
2124
//
2125
// C++ [class.abstract]p4:
2126
// A class is abstract if it contains or inherits at least one
2127
// pure virtual function for which the final overrider is pure
2128
// virtual.
2129
if (mayBeAbstract() && hasPureVirtualFinalOverrider(*this, FinalOverriders))
2130
markAbstract();
2131
2132
// Set access bits correctly on the directly-declared conversions.
2133
for (conversion_iterator I = conversion_begin(), E = conversion_end();
2134
I != E; ++I)
2135
I.setAccess((*I)->getAccess());
2136
}
2137
2138
bool CXXRecordDecl::mayBeAbstract() const {
2139
if (data().Abstract || isInvalidDecl() || !data().Polymorphic ||
2140
isDependentContext())
2141
return false;
2142
2143
for (const auto &B : bases()) {
2144
const auto *BaseDecl =
2145
cast<CXXRecordDecl>(B.getType()->castAs<RecordType>()->getDecl());
2146
if (BaseDecl->isAbstract())
2147
return true;
2148
}
2149
2150
return false;
2151
}
2152
2153
bool CXXRecordDecl::isEffectivelyFinal() const {
2154
auto *Def = getDefinition();
2155
if (!Def)
2156
return false;
2157
if (Def->hasAttr<FinalAttr>())
2158
return true;
2159
if (const auto *Dtor = Def->getDestructor())
2160
if (Dtor->hasAttr<FinalAttr>())
2161
return true;
2162
return false;
2163
}
2164
2165
void CXXDeductionGuideDecl::anchor() {}
2166
2167
bool ExplicitSpecifier::isEquivalent(const ExplicitSpecifier Other) const {
2168
if ((getKind() != Other.getKind() ||
2169
getKind() == ExplicitSpecKind::Unresolved)) {
2170
if (getKind() == ExplicitSpecKind::Unresolved &&
2171
Other.getKind() == ExplicitSpecKind::Unresolved) {
2172
ODRHash SelfHash, OtherHash;
2173
SelfHash.AddStmt(getExpr());
2174
OtherHash.AddStmt(Other.getExpr());
2175
return SelfHash.CalculateHash() == OtherHash.CalculateHash();
2176
} else
2177
return false;
2178
}
2179
return true;
2180
}
2181
2182
ExplicitSpecifier ExplicitSpecifier::getFromDecl(FunctionDecl *Function) {
2183
switch (Function->getDeclKind()) {
2184
case Decl::Kind::CXXConstructor:
2185
return cast<CXXConstructorDecl>(Function)->getExplicitSpecifier();
2186
case Decl::Kind::CXXConversion:
2187
return cast<CXXConversionDecl>(Function)->getExplicitSpecifier();
2188
case Decl::Kind::CXXDeductionGuide:
2189
return cast<CXXDeductionGuideDecl>(Function)->getExplicitSpecifier();
2190
default:
2191
return {};
2192
}
2193
}
2194
2195
CXXDeductionGuideDecl *CXXDeductionGuideDecl::Create(
2196
ASTContext &C, DeclContext *DC, SourceLocation StartLoc,
2197
ExplicitSpecifier ES, const DeclarationNameInfo &NameInfo, QualType T,
2198
TypeSourceInfo *TInfo, SourceLocation EndLocation, CXXConstructorDecl *Ctor,
2199
DeductionCandidate Kind) {
2200
return new (C, DC) CXXDeductionGuideDecl(C, DC, StartLoc, ES, NameInfo, T,
2201
TInfo, EndLocation, Ctor, Kind);
2202
}
2203
2204
CXXDeductionGuideDecl *
2205
CXXDeductionGuideDecl::CreateDeserialized(ASTContext &C, GlobalDeclID ID) {
2206
return new (C, ID) CXXDeductionGuideDecl(
2207
C, nullptr, SourceLocation(), ExplicitSpecifier(), DeclarationNameInfo(),
2208
QualType(), nullptr, SourceLocation(), nullptr,
2209
DeductionCandidate::Normal);
2210
}
2211
2212
RequiresExprBodyDecl *RequiresExprBodyDecl::Create(
2213
ASTContext &C, DeclContext *DC, SourceLocation StartLoc) {
2214
return new (C, DC) RequiresExprBodyDecl(C, DC, StartLoc);
2215
}
2216
2217
RequiresExprBodyDecl *
2218
RequiresExprBodyDecl::CreateDeserialized(ASTContext &C, GlobalDeclID ID) {
2219
return new (C, ID) RequiresExprBodyDecl(C, nullptr, SourceLocation());
2220
}
2221
2222
void CXXMethodDecl::anchor() {}
2223
2224
bool CXXMethodDecl::isStatic() const {
2225
const CXXMethodDecl *MD = getCanonicalDecl();
2226
2227
if (MD->getStorageClass() == SC_Static)
2228
return true;
2229
2230
OverloadedOperatorKind OOK = getDeclName().getCXXOverloadedOperator();
2231
return isStaticOverloadedOperator(OOK);
2232
}
2233
2234
static bool recursivelyOverrides(const CXXMethodDecl *DerivedMD,
2235
const CXXMethodDecl *BaseMD) {
2236
for (const CXXMethodDecl *MD : DerivedMD->overridden_methods()) {
2237
if (MD->getCanonicalDecl() == BaseMD->getCanonicalDecl())
2238
return true;
2239
if (recursivelyOverrides(MD, BaseMD))
2240
return true;
2241
}
2242
return false;
2243
}
2244
2245
CXXMethodDecl *
2246
CXXMethodDecl::getCorrespondingMethodDeclaredInClass(const CXXRecordDecl *RD,
2247
bool MayBeBase) {
2248
if (this->getParent()->getCanonicalDecl() == RD->getCanonicalDecl())
2249
return this;
2250
2251
// Lookup doesn't work for destructors, so handle them separately.
2252
if (isa<CXXDestructorDecl>(this)) {
2253
CXXMethodDecl *MD = RD->getDestructor();
2254
if (MD) {
2255
if (recursivelyOverrides(MD, this))
2256
return MD;
2257
if (MayBeBase && recursivelyOverrides(this, MD))
2258
return MD;
2259
}
2260
return nullptr;
2261
}
2262
2263
for (auto *ND : RD->lookup(getDeclName())) {
2264
auto *MD = dyn_cast<CXXMethodDecl>(ND);
2265
if (!MD)
2266
continue;
2267
if (recursivelyOverrides(MD, this))
2268
return MD;
2269
if (MayBeBase && recursivelyOverrides(this, MD))
2270
return MD;
2271
}
2272
2273
return nullptr;
2274
}
2275
2276
CXXMethodDecl *
2277
CXXMethodDecl::getCorrespondingMethodInClass(const CXXRecordDecl *RD,
2278
bool MayBeBase) {
2279
if (auto *MD = getCorrespondingMethodDeclaredInClass(RD, MayBeBase))
2280
return MD;
2281
2282
llvm::SmallVector<CXXMethodDecl*, 4> FinalOverriders;
2283
auto AddFinalOverrider = [&](CXXMethodDecl *D) {
2284
// If this function is overridden by a candidate final overrider, it is not
2285
// a final overrider.
2286
for (CXXMethodDecl *OtherD : FinalOverriders) {
2287
if (declaresSameEntity(D, OtherD) || recursivelyOverrides(OtherD, D))
2288
return;
2289
}
2290
2291
// Other candidate final overriders might be overridden by this function.
2292
llvm::erase_if(FinalOverriders, [&](CXXMethodDecl *OtherD) {
2293
return recursivelyOverrides(D, OtherD);
2294
});
2295
2296
FinalOverriders.push_back(D);
2297
};
2298
2299
for (const auto &I : RD->bases()) {
2300
const RecordType *RT = I.getType()->getAs<RecordType>();
2301
if (!RT)
2302
continue;
2303
const auto *Base = cast<CXXRecordDecl>(RT->getDecl());
2304
if (CXXMethodDecl *D = this->getCorrespondingMethodInClass(Base))
2305
AddFinalOverrider(D);
2306
}
2307
2308
return FinalOverriders.size() == 1 ? FinalOverriders.front() : nullptr;
2309
}
2310
2311
CXXMethodDecl *
2312
CXXMethodDecl::Create(ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc,
2313
const DeclarationNameInfo &NameInfo, QualType T,
2314
TypeSourceInfo *TInfo, StorageClass SC, bool UsesFPIntrin,
2315
bool isInline, ConstexprSpecKind ConstexprKind,
2316
SourceLocation EndLocation,
2317
Expr *TrailingRequiresClause) {
2318
return new (C, RD) CXXMethodDecl(
2319
CXXMethod, C, RD, StartLoc, NameInfo, T, TInfo, SC, UsesFPIntrin,
2320
isInline, ConstexprKind, EndLocation, TrailingRequiresClause);
2321
}
2322
2323
CXXMethodDecl *CXXMethodDecl::CreateDeserialized(ASTContext &C,
2324
GlobalDeclID ID) {
2325
return new (C, ID) CXXMethodDecl(
2326
CXXMethod, C, nullptr, SourceLocation(), DeclarationNameInfo(),
2327
QualType(), nullptr, SC_None, false, false,
2328
ConstexprSpecKind::Unspecified, SourceLocation(), nullptr);
2329
}
2330
2331
CXXMethodDecl *CXXMethodDecl::getDevirtualizedMethod(const Expr *Base,
2332
bool IsAppleKext) {
2333
assert(isVirtual() && "this method is expected to be virtual");
2334
2335
// When building with -fapple-kext, all calls must go through the vtable since
2336
// the kernel linker can do runtime patching of vtables.
2337
if (IsAppleKext)
2338
return nullptr;
2339
2340
// If the member function is marked 'final', we know that it can't be
2341
// overridden and can therefore devirtualize it unless it's pure virtual.
2342
if (hasAttr<FinalAttr>())
2343
return isPureVirtual() ? nullptr : this;
2344
2345
// If Base is unknown, we cannot devirtualize.
2346
if (!Base)
2347
return nullptr;
2348
2349
// If the base expression (after skipping derived-to-base conversions) is a
2350
// class prvalue, then we can devirtualize.
2351
Base = Base->getBestDynamicClassTypeExpr();
2352
if (Base->isPRValue() && Base->getType()->isRecordType())
2353
return this;
2354
2355
// If we don't even know what we would call, we can't devirtualize.
2356
const CXXRecordDecl *BestDynamicDecl = Base->getBestDynamicClassType();
2357
if (!BestDynamicDecl)
2358
return nullptr;
2359
2360
// There may be a method corresponding to MD in a derived class.
2361
CXXMethodDecl *DevirtualizedMethod =
2362
getCorrespondingMethodInClass(BestDynamicDecl);
2363
2364
// If there final overrider in the dynamic type is ambiguous, we can't
2365
// devirtualize this call.
2366
if (!DevirtualizedMethod)
2367
return nullptr;
2368
2369
// If that method is pure virtual, we can't devirtualize. If this code is
2370
// reached, the result would be UB, not a direct call to the derived class
2371
// function, and we can't assume the derived class function is defined.
2372
if (DevirtualizedMethod->isPureVirtual())
2373
return nullptr;
2374
2375
// If that method is marked final, we can devirtualize it.
2376
if (DevirtualizedMethod->hasAttr<FinalAttr>())
2377
return DevirtualizedMethod;
2378
2379
// Similarly, if the class itself or its destructor is marked 'final',
2380
// the class can't be derived from and we can therefore devirtualize the
2381
// member function call.
2382
if (BestDynamicDecl->isEffectivelyFinal())
2383
return DevirtualizedMethod;
2384
2385
if (const auto *DRE = dyn_cast<DeclRefExpr>(Base)) {
2386
if (const auto *VD = dyn_cast<VarDecl>(DRE->getDecl()))
2387
if (VD->getType()->isRecordType())
2388
// This is a record decl. We know the type and can devirtualize it.
2389
return DevirtualizedMethod;
2390
2391
return nullptr;
2392
}
2393
2394
// We can devirtualize calls on an object accessed by a class member access
2395
// expression, since by C++11 [basic.life]p6 we know that it can't refer to
2396
// a derived class object constructed in the same location.
2397
if (const auto *ME = dyn_cast<MemberExpr>(Base)) {
2398
const ValueDecl *VD = ME->getMemberDecl();
2399
return VD->getType()->isRecordType() ? DevirtualizedMethod : nullptr;
2400
}
2401
2402
// Likewise for calls on an object accessed by a (non-reference) pointer to
2403
// member access.
2404
if (auto *BO = dyn_cast<BinaryOperator>(Base)) {
2405
if (BO->isPtrMemOp()) {
2406
auto *MPT = BO->getRHS()->getType()->castAs<MemberPointerType>();
2407
if (MPT->getPointeeType()->isRecordType())
2408
return DevirtualizedMethod;
2409
}
2410
}
2411
2412
// We can't devirtualize the call.
2413
return nullptr;
2414
}
2415
2416
bool CXXMethodDecl::isUsualDeallocationFunction(
2417
SmallVectorImpl<const FunctionDecl *> &PreventedBy) const {
2418
assert(PreventedBy.empty() && "PreventedBy is expected to be empty");
2419
if (getOverloadedOperator() != OO_Delete &&
2420
getOverloadedOperator() != OO_Array_Delete)
2421
return false;
2422
2423
// C++ [basic.stc.dynamic.deallocation]p2:
2424
// A template instance is never a usual deallocation function,
2425
// regardless of its signature.
2426
if (getPrimaryTemplate())
2427
return false;
2428
2429
// C++ [basic.stc.dynamic.deallocation]p2:
2430
// If a class T has a member deallocation function named operator delete
2431
// with exactly one parameter, then that function is a usual (non-placement)
2432
// deallocation function. [...]
2433
if (getNumParams() == 1)
2434
return true;
2435
unsigned UsualParams = 1;
2436
2437
// C++ P0722:
2438
// A destroying operator delete is a usual deallocation function if
2439
// removing the std::destroying_delete_t parameter and changing the
2440
// first parameter type from T* to void* results in the signature of
2441
// a usual deallocation function.
2442
if (isDestroyingOperatorDelete())
2443
++UsualParams;
2444
2445
// C++ <=14 [basic.stc.dynamic.deallocation]p2:
2446
// [...] If class T does not declare such an operator delete but does
2447
// declare a member deallocation function named operator delete with
2448
// exactly two parameters, the second of which has type std::size_t (18.1),
2449
// then this function is a usual deallocation function.
2450
//
2451
// C++17 says a usual deallocation function is one with the signature
2452
// (void* [, size_t] [, std::align_val_t] [, ...])
2453
// and all such functions are usual deallocation functions. It's not clear
2454
// that allowing varargs functions was intentional.
2455
ASTContext &Context = getASTContext();
2456
if (UsualParams < getNumParams() &&
2457
Context.hasSameUnqualifiedType(getParamDecl(UsualParams)->getType(),
2458
Context.getSizeType()))
2459
++UsualParams;
2460
2461
if (UsualParams < getNumParams() &&
2462
getParamDecl(UsualParams)->getType()->isAlignValT())
2463
++UsualParams;
2464
2465
if (UsualParams != getNumParams())
2466
return false;
2467
2468
// In C++17 onwards, all potential usual deallocation functions are actual
2469
// usual deallocation functions. Honor this behavior when post-C++14
2470
// deallocation functions are offered as extensions too.
2471
// FIXME(EricWF): Destroying Delete should be a language option. How do we
2472
// handle when destroying delete is used prior to C++17?
2473
if (Context.getLangOpts().CPlusPlus17 ||
2474
Context.getLangOpts().AlignedAllocation ||
2475
isDestroyingOperatorDelete())
2476
return true;
2477
2478
// This function is a usual deallocation function if there are no
2479
// single-parameter deallocation functions of the same kind.
2480
DeclContext::lookup_result R = getDeclContext()->lookup(getDeclName());
2481
bool Result = true;
2482
for (const auto *D : R) {
2483
if (const auto *FD = dyn_cast<FunctionDecl>(D)) {
2484
if (FD->getNumParams() == 1) {
2485
PreventedBy.push_back(FD);
2486
Result = false;
2487
}
2488
}
2489
}
2490
return Result;
2491
}
2492
2493
bool CXXMethodDecl::isExplicitObjectMemberFunction() const {
2494
// C++2b [dcl.fct]p6:
2495
// An explicit object member function is a non-static member
2496
// function with an explicit object parameter
2497
return !isStatic() && hasCXXExplicitFunctionObjectParameter();
2498
}
2499
2500
bool CXXMethodDecl::isImplicitObjectMemberFunction() const {
2501
return !isStatic() && !hasCXXExplicitFunctionObjectParameter();
2502
}
2503
2504
bool CXXMethodDecl::isCopyAssignmentOperator() const {
2505
// C++0x [class.copy]p17:
2506
// A user-declared copy assignment operator X::operator= is a non-static
2507
// non-template member function of class X with exactly one parameter of
2508
// type X, X&, const X&, volatile X& or const volatile X&.
2509
if (/*operator=*/getOverloadedOperator() != OO_Equal ||
2510
/*non-static*/ isStatic() ||
2511
2512
/*non-template*/ getPrimaryTemplate() || getDescribedFunctionTemplate() ||
2513
getNumExplicitParams() != 1)
2514
return false;
2515
2516
QualType ParamType = getNonObjectParameter(0)->getType();
2517
if (const auto *Ref = ParamType->getAs<LValueReferenceType>())
2518
ParamType = Ref->getPointeeType();
2519
2520
ASTContext &Context = getASTContext();
2521
QualType ClassType
2522
= Context.getCanonicalType(Context.getTypeDeclType(getParent()));
2523
return Context.hasSameUnqualifiedType(ClassType, ParamType);
2524
}
2525
2526
bool CXXMethodDecl::isMoveAssignmentOperator() const {
2527
// C++0x [class.copy]p19:
2528
// A user-declared move assignment operator X::operator= is a non-static
2529
// non-template member function of class X with exactly one parameter of type
2530
// X&&, const X&&, volatile X&&, or const volatile X&&.
2531
if (getOverloadedOperator() != OO_Equal || isStatic() ||
2532
getPrimaryTemplate() || getDescribedFunctionTemplate() ||
2533
getNumExplicitParams() != 1)
2534
return false;
2535
2536
QualType ParamType = getNonObjectParameter(0)->getType();
2537
if (!ParamType->isRValueReferenceType())
2538
return false;
2539
ParamType = ParamType->getPointeeType();
2540
2541
ASTContext &Context = getASTContext();
2542
QualType ClassType
2543
= Context.getCanonicalType(Context.getTypeDeclType(getParent()));
2544
return Context.hasSameUnqualifiedType(ClassType, ParamType);
2545
}
2546
2547
void CXXMethodDecl::addOverriddenMethod(const CXXMethodDecl *MD) {
2548
assert(MD->isCanonicalDecl() && "Method is not canonical!");
2549
assert(!MD->getParent()->isDependentContext() &&
2550
"Can't add an overridden method to a class template!");
2551
assert(MD->isVirtual() && "Method is not virtual!");
2552
2553
getASTContext().addOverriddenMethod(this, MD);
2554
}
2555
2556
CXXMethodDecl::method_iterator CXXMethodDecl::begin_overridden_methods() const {
2557
if (isa<CXXConstructorDecl>(this)) return nullptr;
2558
return getASTContext().overridden_methods_begin(this);
2559
}
2560
2561
CXXMethodDecl::method_iterator CXXMethodDecl::end_overridden_methods() const {
2562
if (isa<CXXConstructorDecl>(this)) return nullptr;
2563
return getASTContext().overridden_methods_end(this);
2564
}
2565
2566
unsigned CXXMethodDecl::size_overridden_methods() const {
2567
if (isa<CXXConstructorDecl>(this)) return 0;
2568
return getASTContext().overridden_methods_size(this);
2569
}
2570
2571
CXXMethodDecl::overridden_method_range
2572
CXXMethodDecl::overridden_methods() const {
2573
if (isa<CXXConstructorDecl>(this))
2574
return overridden_method_range(nullptr, nullptr);
2575
return getASTContext().overridden_methods(this);
2576
}
2577
2578
static QualType getThisObjectType(ASTContext &C, const FunctionProtoType *FPT,
2579
const CXXRecordDecl *Decl) {
2580
QualType ClassTy = C.getTypeDeclType(Decl);
2581
return C.getQualifiedType(ClassTy, FPT->getMethodQuals());
2582
}
2583
2584
QualType CXXMethodDecl::getThisType(const FunctionProtoType *FPT,
2585
const CXXRecordDecl *Decl) {
2586
ASTContext &C = Decl->getASTContext();
2587
QualType ObjectTy = ::getThisObjectType(C, FPT, Decl);
2588
2589
// Unlike 'const' and 'volatile', a '__restrict' qualifier must be
2590
// attached to the pointer type, not the pointee.
2591
bool Restrict = FPT->getMethodQuals().hasRestrict();
2592
if (Restrict)
2593
ObjectTy.removeLocalRestrict();
2594
2595
ObjectTy = C.getLangOpts().HLSL ? C.getLValueReferenceType(ObjectTy)
2596
: C.getPointerType(ObjectTy);
2597
2598
if (Restrict)
2599
ObjectTy.addRestrict();
2600
return ObjectTy;
2601
}
2602
2603
QualType CXXMethodDecl::getThisType() const {
2604
// C++ 9.3.2p1: The type of this in a member function of a class X is X*.
2605
// If the member function is declared const, the type of this is const X*,
2606
// if the member function is declared volatile, the type of this is
2607
// volatile X*, and if the member function is declared const volatile,
2608
// the type of this is const volatile X*.
2609
assert(isInstance() && "No 'this' for static methods!");
2610
return CXXMethodDecl::getThisType(getType()->castAs<FunctionProtoType>(),
2611
getParent());
2612
}
2613
2614
QualType CXXMethodDecl::getFunctionObjectParameterReferenceType() const {
2615
if (isExplicitObjectMemberFunction())
2616
return parameters()[0]->getType();
2617
2618
ASTContext &C = getParentASTContext();
2619
const FunctionProtoType *FPT = getType()->castAs<FunctionProtoType>();
2620
QualType Type = ::getThisObjectType(C, FPT, getParent());
2621
RefQualifierKind RK = FPT->getRefQualifier();
2622
if (RK == RefQualifierKind::RQ_RValue)
2623
return C.getRValueReferenceType(Type);
2624
return C.getLValueReferenceType(Type);
2625
}
2626
2627
bool CXXMethodDecl::hasInlineBody() const {
2628
// If this function is a template instantiation, look at the template from
2629
// which it was instantiated.
2630
const FunctionDecl *CheckFn = getTemplateInstantiationPattern();
2631
if (!CheckFn)
2632
CheckFn = this;
2633
2634
const FunctionDecl *fn;
2635
return CheckFn->isDefined(fn) && !fn->isOutOfLine() &&
2636
(fn->doesThisDeclarationHaveABody() || fn->willHaveBody());
2637
}
2638
2639
bool CXXMethodDecl::isLambdaStaticInvoker() const {
2640
const CXXRecordDecl *P = getParent();
2641
return P->isLambda() && getDeclName().isIdentifier() &&
2642
getName() == getLambdaStaticInvokerName();
2643
}
2644
2645
CXXCtorInitializer::CXXCtorInitializer(ASTContext &Context,
2646
TypeSourceInfo *TInfo, bool IsVirtual,
2647
SourceLocation L, Expr *Init,
2648
SourceLocation R,
2649
SourceLocation EllipsisLoc)
2650
: Initializee(TInfo), Init(Init), MemberOrEllipsisLocation(EllipsisLoc),
2651
LParenLoc(L), RParenLoc(R), IsDelegating(false), IsVirtual(IsVirtual),
2652
IsWritten(false), SourceOrder(0) {}
2653
2654
CXXCtorInitializer::CXXCtorInitializer(ASTContext &Context, FieldDecl *Member,
2655
SourceLocation MemberLoc,
2656
SourceLocation L, Expr *Init,
2657
SourceLocation R)
2658
: Initializee(Member), Init(Init), MemberOrEllipsisLocation(MemberLoc),
2659
LParenLoc(L), RParenLoc(R), IsDelegating(false), IsVirtual(false),
2660
IsWritten(false), SourceOrder(0) {}
2661
2662
CXXCtorInitializer::CXXCtorInitializer(ASTContext &Context,
2663
IndirectFieldDecl *Member,
2664
SourceLocation MemberLoc,
2665
SourceLocation L, Expr *Init,
2666
SourceLocation R)
2667
: Initializee(Member), Init(Init), MemberOrEllipsisLocation(MemberLoc),
2668
LParenLoc(L), RParenLoc(R), IsDelegating(false), IsVirtual(false),
2669
IsWritten(false), SourceOrder(0) {}
2670
2671
CXXCtorInitializer::CXXCtorInitializer(ASTContext &Context,
2672
TypeSourceInfo *TInfo,
2673
SourceLocation L, Expr *Init,
2674
SourceLocation R)
2675
: Initializee(TInfo), Init(Init), LParenLoc(L), RParenLoc(R),
2676
IsDelegating(true), IsVirtual(false), IsWritten(false), SourceOrder(0) {}
2677
2678
int64_t CXXCtorInitializer::getID(const ASTContext &Context) const {
2679
return Context.getAllocator()
2680
.identifyKnownAlignedObject<CXXCtorInitializer>(this);
2681
}
2682
2683
TypeLoc CXXCtorInitializer::getBaseClassLoc() const {
2684
if (isBaseInitializer())
2685
return Initializee.get<TypeSourceInfo*>()->getTypeLoc();
2686
else
2687
return {};
2688
}
2689
2690
const Type *CXXCtorInitializer::getBaseClass() const {
2691
if (isBaseInitializer())
2692
return Initializee.get<TypeSourceInfo*>()->getType().getTypePtr();
2693
else
2694
return nullptr;
2695
}
2696
2697
SourceLocation CXXCtorInitializer::getSourceLocation() const {
2698
if (isInClassMemberInitializer())
2699
return getAnyMember()->getLocation();
2700
2701
if (isAnyMemberInitializer())
2702
return getMemberLocation();
2703
2704
if (const auto *TSInfo = Initializee.get<TypeSourceInfo *>())
2705
return TSInfo->getTypeLoc().getBeginLoc();
2706
2707
return {};
2708
}
2709
2710
SourceRange CXXCtorInitializer::getSourceRange() const {
2711
if (isInClassMemberInitializer()) {
2712
FieldDecl *D = getAnyMember();
2713
if (Expr *I = D->getInClassInitializer())
2714
return I->getSourceRange();
2715
return {};
2716
}
2717
2718
return SourceRange(getSourceLocation(), getRParenLoc());
2719
}
2720
2721
CXXConstructorDecl::CXXConstructorDecl(
2722
ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc,
2723
const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo,
2724
ExplicitSpecifier ES, bool UsesFPIntrin, bool isInline,
2725
bool isImplicitlyDeclared, ConstexprSpecKind ConstexprKind,
2726
InheritedConstructor Inherited, Expr *TrailingRequiresClause)
2727
: CXXMethodDecl(CXXConstructor, C, RD, StartLoc, NameInfo, T, TInfo,
2728
SC_None, UsesFPIntrin, isInline, ConstexprKind,
2729
SourceLocation(), TrailingRequiresClause) {
2730
setNumCtorInitializers(0);
2731
setInheritingConstructor(static_cast<bool>(Inherited));
2732
setImplicit(isImplicitlyDeclared);
2733
CXXConstructorDeclBits.HasTrailingExplicitSpecifier = ES.getExpr() ? 1 : 0;
2734
if (Inherited)
2735
*getTrailingObjects<InheritedConstructor>() = Inherited;
2736
setExplicitSpecifier(ES);
2737
}
2738
2739
void CXXConstructorDecl::anchor() {}
2740
2741
CXXConstructorDecl *CXXConstructorDecl::CreateDeserialized(ASTContext &C,
2742
GlobalDeclID ID,
2743
uint64_t AllocKind) {
2744
bool hasTrailingExplicit = static_cast<bool>(AllocKind & TAKHasTailExplicit);
2745
bool isInheritingConstructor =
2746
static_cast<bool>(AllocKind & TAKInheritsConstructor);
2747
unsigned Extra =
2748
additionalSizeToAlloc<InheritedConstructor, ExplicitSpecifier>(
2749
isInheritingConstructor, hasTrailingExplicit);
2750
auto *Result = new (C, ID, Extra) CXXConstructorDecl(
2751
C, nullptr, SourceLocation(), DeclarationNameInfo(), QualType(), nullptr,
2752
ExplicitSpecifier(), false, false, false, ConstexprSpecKind::Unspecified,
2753
InheritedConstructor(), nullptr);
2754
Result->setInheritingConstructor(isInheritingConstructor);
2755
Result->CXXConstructorDeclBits.HasTrailingExplicitSpecifier =
2756
hasTrailingExplicit;
2757
Result->setExplicitSpecifier(ExplicitSpecifier());
2758
return Result;
2759
}
2760
2761
CXXConstructorDecl *CXXConstructorDecl::Create(
2762
ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc,
2763
const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo,
2764
ExplicitSpecifier ES, bool UsesFPIntrin, bool isInline,
2765
bool isImplicitlyDeclared, ConstexprSpecKind ConstexprKind,
2766
InheritedConstructor Inherited, Expr *TrailingRequiresClause) {
2767
assert(NameInfo.getName().getNameKind()
2768
== DeclarationName::CXXConstructorName &&
2769
"Name must refer to a constructor");
2770
unsigned Extra =
2771
additionalSizeToAlloc<InheritedConstructor, ExplicitSpecifier>(
2772
Inherited ? 1 : 0, ES.getExpr() ? 1 : 0);
2773
return new (C, RD, Extra) CXXConstructorDecl(
2774
C, RD, StartLoc, NameInfo, T, TInfo, ES, UsesFPIntrin, isInline,
2775
isImplicitlyDeclared, ConstexprKind, Inherited, TrailingRequiresClause);
2776
}
2777
2778
CXXConstructorDecl::init_const_iterator CXXConstructorDecl::init_begin() const {
2779
return CtorInitializers.get(getASTContext().getExternalSource());
2780
}
2781
2782
CXXConstructorDecl *CXXConstructorDecl::getTargetConstructor() const {
2783
assert(isDelegatingConstructor() && "Not a delegating constructor!");
2784
Expr *E = (*init_begin())->getInit()->IgnoreImplicit();
2785
if (const auto *Construct = dyn_cast<CXXConstructExpr>(E))
2786
return Construct->getConstructor();
2787
2788
return nullptr;
2789
}
2790
2791
bool CXXConstructorDecl::isDefaultConstructor() const {
2792
// C++ [class.default.ctor]p1:
2793
// A default constructor for a class X is a constructor of class X for
2794
// which each parameter that is not a function parameter pack has a default
2795
// argument (including the case of a constructor with no parameters)
2796
return getMinRequiredArguments() == 0;
2797
}
2798
2799
bool
2800
CXXConstructorDecl::isCopyConstructor(unsigned &TypeQuals) const {
2801
return isCopyOrMoveConstructor(TypeQuals) &&
2802
getParamDecl(0)->getType()->isLValueReferenceType();
2803
}
2804
2805
bool CXXConstructorDecl::isMoveConstructor(unsigned &TypeQuals) const {
2806
return isCopyOrMoveConstructor(TypeQuals) &&
2807
getParamDecl(0)->getType()->isRValueReferenceType();
2808
}
2809
2810
/// Determine whether this is a copy or move constructor.
2811
bool CXXConstructorDecl::isCopyOrMoveConstructor(unsigned &TypeQuals) const {
2812
// C++ [class.copy]p2:
2813
// A non-template constructor for class X is a copy constructor
2814
// if its first parameter is of type X&, const X&, volatile X& or
2815
// const volatile X&, and either there are no other parameters
2816
// or else all other parameters have default arguments (8.3.6).
2817
// C++0x [class.copy]p3:
2818
// A non-template constructor for class X is a move constructor if its
2819
// first parameter is of type X&&, const X&&, volatile X&&, or
2820
// const volatile X&&, and either there are no other parameters or else
2821
// all other parameters have default arguments.
2822
if (!hasOneParamOrDefaultArgs() || getPrimaryTemplate() != nullptr ||
2823
getDescribedFunctionTemplate() != nullptr)
2824
return false;
2825
2826
const ParmVarDecl *Param = getParamDecl(0);
2827
2828
// Do we have a reference type?
2829
const auto *ParamRefType = Param->getType()->getAs<ReferenceType>();
2830
if (!ParamRefType)
2831
return false;
2832
2833
// Is it a reference to our class type?
2834
ASTContext &Context = getASTContext();
2835
2836
CanQualType PointeeType
2837
= Context.getCanonicalType(ParamRefType->getPointeeType());
2838
CanQualType ClassTy
2839
= Context.getCanonicalType(Context.getTagDeclType(getParent()));
2840
if (PointeeType.getUnqualifiedType() != ClassTy)
2841
return false;
2842
2843
// FIXME: other qualifiers?
2844
2845
// We have a copy or move constructor.
2846
TypeQuals = PointeeType.getCVRQualifiers();
2847
return true;
2848
}
2849
2850
bool CXXConstructorDecl::isConvertingConstructor(bool AllowExplicit) const {
2851
// C++ [class.conv.ctor]p1:
2852
// A constructor declared without the function-specifier explicit
2853
// that can be called with a single parameter specifies a
2854
// conversion from the type of its first parameter to the type of
2855
// its class. Such a constructor is called a converting
2856
// constructor.
2857
if (isExplicit() && !AllowExplicit)
2858
return false;
2859
2860
// FIXME: This has nothing to do with the definition of converting
2861
// constructor, but is convenient for how we use this function in overload
2862
// resolution.
2863
return getNumParams() == 0
2864
? getType()->castAs<FunctionProtoType>()->isVariadic()
2865
: getMinRequiredArguments() <= 1;
2866
}
2867
2868
bool CXXConstructorDecl::isSpecializationCopyingObject() const {
2869
if (!hasOneParamOrDefaultArgs() || getDescribedFunctionTemplate() != nullptr)
2870
return false;
2871
2872
const ParmVarDecl *Param = getParamDecl(0);
2873
2874
ASTContext &Context = getASTContext();
2875
CanQualType ParamType = Context.getCanonicalType(Param->getType());
2876
2877
// Is it the same as our class type?
2878
CanQualType ClassTy
2879
= Context.getCanonicalType(Context.getTagDeclType(getParent()));
2880
if (ParamType.getUnqualifiedType() != ClassTy)
2881
return false;
2882
2883
return true;
2884
}
2885
2886
void CXXDestructorDecl::anchor() {}
2887
2888
CXXDestructorDecl *CXXDestructorDecl::CreateDeserialized(ASTContext &C,
2889
GlobalDeclID ID) {
2890
return new (C, ID) CXXDestructorDecl(
2891
C, nullptr, SourceLocation(), DeclarationNameInfo(), QualType(), nullptr,
2892
false, false, false, ConstexprSpecKind::Unspecified, nullptr);
2893
}
2894
2895
CXXDestructorDecl *CXXDestructorDecl::Create(
2896
ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc,
2897
const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo,
2898
bool UsesFPIntrin, bool isInline, bool isImplicitlyDeclared,
2899
ConstexprSpecKind ConstexprKind, Expr *TrailingRequiresClause) {
2900
assert(NameInfo.getName().getNameKind()
2901
== DeclarationName::CXXDestructorName &&
2902
"Name must refer to a destructor");
2903
return new (C, RD) CXXDestructorDecl(
2904
C, RD, StartLoc, NameInfo, T, TInfo, UsesFPIntrin, isInline,
2905
isImplicitlyDeclared, ConstexprKind, TrailingRequiresClause);
2906
}
2907
2908
void CXXDestructorDecl::setOperatorDelete(FunctionDecl *OD, Expr *ThisArg) {
2909
auto *First = cast<CXXDestructorDecl>(getFirstDecl());
2910
if (OD && !First->OperatorDelete) {
2911
First->OperatorDelete = OD;
2912
First->OperatorDeleteThisArg = ThisArg;
2913
if (auto *L = getASTMutationListener())
2914
L->ResolvedOperatorDelete(First, OD, ThisArg);
2915
}
2916
}
2917
2918
void CXXConversionDecl::anchor() {}
2919
2920
CXXConversionDecl *CXXConversionDecl::CreateDeserialized(ASTContext &C,
2921
GlobalDeclID ID) {
2922
return new (C, ID) CXXConversionDecl(
2923
C, nullptr, SourceLocation(), DeclarationNameInfo(), QualType(), nullptr,
2924
false, false, ExplicitSpecifier(), ConstexprSpecKind::Unspecified,
2925
SourceLocation(), nullptr);
2926
}
2927
2928
CXXConversionDecl *CXXConversionDecl::Create(
2929
ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc,
2930
const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo,
2931
bool UsesFPIntrin, bool isInline, ExplicitSpecifier ES,
2932
ConstexprSpecKind ConstexprKind, SourceLocation EndLocation,
2933
Expr *TrailingRequiresClause) {
2934
assert(NameInfo.getName().getNameKind()
2935
== DeclarationName::CXXConversionFunctionName &&
2936
"Name must refer to a conversion function");
2937
return new (C, RD) CXXConversionDecl(
2938
C, RD, StartLoc, NameInfo, T, TInfo, UsesFPIntrin, isInline, ES,
2939
ConstexprKind, EndLocation, TrailingRequiresClause);
2940
}
2941
2942
bool CXXConversionDecl::isLambdaToBlockPointerConversion() const {
2943
return isImplicit() && getParent()->isLambda() &&
2944
getConversionType()->isBlockPointerType();
2945
}
2946
2947
LinkageSpecDecl::LinkageSpecDecl(DeclContext *DC, SourceLocation ExternLoc,
2948
SourceLocation LangLoc,
2949
LinkageSpecLanguageIDs lang, bool HasBraces)
2950
: Decl(LinkageSpec, DC, LangLoc), DeclContext(LinkageSpec),
2951
ExternLoc(ExternLoc), RBraceLoc(SourceLocation()) {
2952
setLanguage(lang);
2953
LinkageSpecDeclBits.HasBraces = HasBraces;
2954
}
2955
2956
void LinkageSpecDecl::anchor() {}
2957
2958
LinkageSpecDecl *LinkageSpecDecl::Create(ASTContext &C, DeclContext *DC,
2959
SourceLocation ExternLoc,
2960
SourceLocation LangLoc,
2961
LinkageSpecLanguageIDs Lang,
2962
bool HasBraces) {
2963
return new (C, DC) LinkageSpecDecl(DC, ExternLoc, LangLoc, Lang, HasBraces);
2964
}
2965
2966
LinkageSpecDecl *LinkageSpecDecl::CreateDeserialized(ASTContext &C,
2967
GlobalDeclID ID) {
2968
return new (C, ID)
2969
LinkageSpecDecl(nullptr, SourceLocation(), SourceLocation(),
2970
LinkageSpecLanguageIDs::C, false);
2971
}
2972
2973
void UsingDirectiveDecl::anchor() {}
2974
2975
UsingDirectiveDecl *UsingDirectiveDecl::Create(ASTContext &C, DeclContext *DC,
2976
SourceLocation L,
2977
SourceLocation NamespaceLoc,
2978
NestedNameSpecifierLoc QualifierLoc,
2979
SourceLocation IdentLoc,
2980
NamedDecl *Used,
2981
DeclContext *CommonAncestor) {
2982
if (auto *NS = dyn_cast_or_null<NamespaceDecl>(Used))
2983
Used = NS->getFirstDecl();
2984
return new (C, DC) UsingDirectiveDecl(DC, L, NamespaceLoc, QualifierLoc,
2985
IdentLoc, Used, CommonAncestor);
2986
}
2987
2988
UsingDirectiveDecl *UsingDirectiveDecl::CreateDeserialized(ASTContext &C,
2989
GlobalDeclID ID) {
2990
return new (C, ID) UsingDirectiveDecl(nullptr, SourceLocation(),
2991
SourceLocation(),
2992
NestedNameSpecifierLoc(),
2993
SourceLocation(), nullptr, nullptr);
2994
}
2995
2996
NamespaceDecl *UsingDirectiveDecl::getNominatedNamespace() {
2997
if (auto *NA = dyn_cast_or_null<NamespaceAliasDecl>(NominatedNamespace))
2998
return NA->getNamespace();
2999
return cast_or_null<NamespaceDecl>(NominatedNamespace);
3000
}
3001
3002
NamespaceDecl::NamespaceDecl(ASTContext &C, DeclContext *DC, bool Inline,
3003
SourceLocation StartLoc, SourceLocation IdLoc,
3004
IdentifierInfo *Id, NamespaceDecl *PrevDecl,
3005
bool Nested)
3006
: NamedDecl(Namespace, DC, IdLoc, Id), DeclContext(Namespace),
3007
redeclarable_base(C), LocStart(StartLoc) {
3008
setInline(Inline);
3009
setNested(Nested);
3010
setPreviousDecl(PrevDecl);
3011
}
3012
3013
NamespaceDecl *NamespaceDecl::Create(ASTContext &C, DeclContext *DC,
3014
bool Inline, SourceLocation StartLoc,
3015
SourceLocation IdLoc, IdentifierInfo *Id,
3016
NamespaceDecl *PrevDecl, bool Nested) {
3017
return new (C, DC)
3018
NamespaceDecl(C, DC, Inline, StartLoc, IdLoc, Id, PrevDecl, Nested);
3019
}
3020
3021
NamespaceDecl *NamespaceDecl::CreateDeserialized(ASTContext &C,
3022
GlobalDeclID ID) {
3023
return new (C, ID) NamespaceDecl(C, nullptr, false, SourceLocation(),
3024
SourceLocation(), nullptr, nullptr, false);
3025
}
3026
3027
NamespaceDecl *NamespaceDecl::getNextRedeclarationImpl() {
3028
return getNextRedeclaration();
3029
}
3030
3031
NamespaceDecl *NamespaceDecl::getPreviousDeclImpl() {
3032
return getPreviousDecl();
3033
}
3034
3035
NamespaceDecl *NamespaceDecl::getMostRecentDeclImpl() {
3036
return getMostRecentDecl();
3037
}
3038
3039
void NamespaceAliasDecl::anchor() {}
3040
3041
NamespaceAliasDecl *NamespaceAliasDecl::getNextRedeclarationImpl() {
3042
return getNextRedeclaration();
3043
}
3044
3045
NamespaceAliasDecl *NamespaceAliasDecl::getPreviousDeclImpl() {
3046
return getPreviousDecl();
3047
}
3048
3049
NamespaceAliasDecl *NamespaceAliasDecl::getMostRecentDeclImpl() {
3050
return getMostRecentDecl();
3051
}
3052
3053
NamespaceAliasDecl *NamespaceAliasDecl::Create(ASTContext &C, DeclContext *DC,
3054
SourceLocation UsingLoc,
3055
SourceLocation AliasLoc,
3056
IdentifierInfo *Alias,
3057
NestedNameSpecifierLoc QualifierLoc,
3058
SourceLocation IdentLoc,
3059
NamedDecl *Namespace) {
3060
// FIXME: Preserve the aliased namespace as written.
3061
if (auto *NS = dyn_cast_or_null<NamespaceDecl>(Namespace))
3062
Namespace = NS->getFirstDecl();
3063
return new (C, DC) NamespaceAliasDecl(C, DC, UsingLoc, AliasLoc, Alias,
3064
QualifierLoc, IdentLoc, Namespace);
3065
}
3066
3067
NamespaceAliasDecl *NamespaceAliasDecl::CreateDeserialized(ASTContext &C,
3068
GlobalDeclID ID) {
3069
return new (C, ID) NamespaceAliasDecl(C, nullptr, SourceLocation(),
3070
SourceLocation(), nullptr,
3071
NestedNameSpecifierLoc(),
3072
SourceLocation(), nullptr);
3073
}
3074
3075
void LifetimeExtendedTemporaryDecl::anchor() {}
3076
3077
/// Retrieve the storage duration for the materialized temporary.
3078
StorageDuration LifetimeExtendedTemporaryDecl::getStorageDuration() const {
3079
const ValueDecl *ExtendingDecl = getExtendingDecl();
3080
if (!ExtendingDecl)
3081
return SD_FullExpression;
3082
// FIXME: This is not necessarily correct for a temporary materialized
3083
// within a default initializer.
3084
if (isa<FieldDecl>(ExtendingDecl))
3085
return SD_Automatic;
3086
// FIXME: This only works because storage class specifiers are not allowed
3087
// on decomposition declarations.
3088
if (isa<BindingDecl>(ExtendingDecl))
3089
return ExtendingDecl->getDeclContext()->isFunctionOrMethod() ? SD_Automatic
3090
: SD_Static;
3091
return cast<VarDecl>(ExtendingDecl)->getStorageDuration();
3092
}
3093
3094
APValue *LifetimeExtendedTemporaryDecl::getOrCreateValue(bool MayCreate) const {
3095
assert(getStorageDuration() == SD_Static &&
3096
"don't need to cache the computed value for this temporary");
3097
if (MayCreate && !Value) {
3098
Value = (new (getASTContext()) APValue);
3099
getASTContext().addDestruction(Value);
3100
}
3101
assert(Value && "may not be null");
3102
return Value;
3103
}
3104
3105
void UsingShadowDecl::anchor() {}
3106
3107
UsingShadowDecl::UsingShadowDecl(Kind K, ASTContext &C, DeclContext *DC,
3108
SourceLocation Loc, DeclarationName Name,
3109
BaseUsingDecl *Introducer, NamedDecl *Target)
3110
: NamedDecl(K, DC, Loc, Name), redeclarable_base(C),
3111
UsingOrNextShadow(Introducer) {
3112
if (Target) {
3113
assert(!isa<UsingShadowDecl>(Target));
3114
setTargetDecl(Target);
3115
}
3116
setImplicit();
3117
}
3118
3119
UsingShadowDecl::UsingShadowDecl(Kind K, ASTContext &C, EmptyShell Empty)
3120
: NamedDecl(K, nullptr, SourceLocation(), DeclarationName()),
3121
redeclarable_base(C) {}
3122
3123
UsingShadowDecl *UsingShadowDecl::CreateDeserialized(ASTContext &C,
3124
GlobalDeclID ID) {
3125
return new (C, ID) UsingShadowDecl(UsingShadow, C, EmptyShell());
3126
}
3127
3128
BaseUsingDecl *UsingShadowDecl::getIntroducer() const {
3129
const UsingShadowDecl *Shadow = this;
3130
while (const auto *NextShadow =
3131
dyn_cast<UsingShadowDecl>(Shadow->UsingOrNextShadow))
3132
Shadow = NextShadow;
3133
return cast<BaseUsingDecl>(Shadow->UsingOrNextShadow);
3134
}
3135
3136
void ConstructorUsingShadowDecl::anchor() {}
3137
3138
ConstructorUsingShadowDecl *
3139
ConstructorUsingShadowDecl::Create(ASTContext &C, DeclContext *DC,
3140
SourceLocation Loc, UsingDecl *Using,
3141
NamedDecl *Target, bool IsVirtual) {
3142
return new (C, DC) ConstructorUsingShadowDecl(C, DC, Loc, Using, Target,
3143
IsVirtual);
3144
}
3145
3146
ConstructorUsingShadowDecl *
3147
ConstructorUsingShadowDecl::CreateDeserialized(ASTContext &C, GlobalDeclID ID) {
3148
return new (C, ID) ConstructorUsingShadowDecl(C, EmptyShell());
3149
}
3150
3151
CXXRecordDecl *ConstructorUsingShadowDecl::getNominatedBaseClass() const {
3152
return getIntroducer()->getQualifier()->getAsRecordDecl();
3153
}
3154
3155
void BaseUsingDecl::anchor() {}
3156
3157
void BaseUsingDecl::addShadowDecl(UsingShadowDecl *S) {
3158
assert(!llvm::is_contained(shadows(), S) && "declaration already in set");
3159
assert(S->getIntroducer() == this);
3160
3161
if (FirstUsingShadow.getPointer())
3162
S->UsingOrNextShadow = FirstUsingShadow.getPointer();
3163
FirstUsingShadow.setPointer(S);
3164
}
3165
3166
void BaseUsingDecl::removeShadowDecl(UsingShadowDecl *S) {
3167
assert(llvm::is_contained(shadows(), S) && "declaration not in set");
3168
assert(S->getIntroducer() == this);
3169
3170
// Remove S from the shadow decl chain. This is O(n) but hopefully rare.
3171
3172
if (FirstUsingShadow.getPointer() == S) {
3173
FirstUsingShadow.setPointer(
3174
dyn_cast<UsingShadowDecl>(S->UsingOrNextShadow));
3175
S->UsingOrNextShadow = this;
3176
return;
3177
}
3178
3179
UsingShadowDecl *Prev = FirstUsingShadow.getPointer();
3180
while (Prev->UsingOrNextShadow != S)
3181
Prev = cast<UsingShadowDecl>(Prev->UsingOrNextShadow);
3182
Prev->UsingOrNextShadow = S->UsingOrNextShadow;
3183
S->UsingOrNextShadow = this;
3184
}
3185
3186
void UsingDecl::anchor() {}
3187
3188
UsingDecl *UsingDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation UL,
3189
NestedNameSpecifierLoc QualifierLoc,
3190
const DeclarationNameInfo &NameInfo,
3191
bool HasTypename) {
3192
return new (C, DC) UsingDecl(DC, UL, QualifierLoc, NameInfo, HasTypename);
3193
}
3194
3195
UsingDecl *UsingDecl::CreateDeserialized(ASTContext &C, GlobalDeclID ID) {
3196
return new (C, ID) UsingDecl(nullptr, SourceLocation(),
3197
NestedNameSpecifierLoc(), DeclarationNameInfo(),
3198
false);
3199
}
3200
3201
SourceRange UsingDecl::getSourceRange() const {
3202
SourceLocation Begin = isAccessDeclaration()
3203
? getQualifierLoc().getBeginLoc() : UsingLocation;
3204
return SourceRange(Begin, getNameInfo().getEndLoc());
3205
}
3206
3207
void UsingEnumDecl::anchor() {}
3208
3209
UsingEnumDecl *UsingEnumDecl::Create(ASTContext &C, DeclContext *DC,
3210
SourceLocation UL,
3211
SourceLocation EL,
3212
SourceLocation NL,
3213
TypeSourceInfo *EnumType) {
3214
assert(isa<EnumDecl>(EnumType->getType()->getAsTagDecl()));
3215
return new (C, DC)
3216
UsingEnumDecl(DC, EnumType->getType()->getAsTagDecl()->getDeclName(), UL, EL, NL, EnumType);
3217
}
3218
3219
UsingEnumDecl *UsingEnumDecl::CreateDeserialized(ASTContext &C,
3220
GlobalDeclID ID) {
3221
return new (C, ID)
3222
UsingEnumDecl(nullptr, DeclarationName(), SourceLocation(),
3223
SourceLocation(), SourceLocation(), nullptr);
3224
}
3225
3226
SourceRange UsingEnumDecl::getSourceRange() const {
3227
return SourceRange(UsingLocation, EnumType->getTypeLoc().getEndLoc());
3228
}
3229
3230
void UsingPackDecl::anchor() {}
3231
3232
UsingPackDecl *UsingPackDecl::Create(ASTContext &C, DeclContext *DC,
3233
NamedDecl *InstantiatedFrom,
3234
ArrayRef<NamedDecl *> UsingDecls) {
3235
size_t Extra = additionalSizeToAlloc<NamedDecl *>(UsingDecls.size());
3236
return new (C, DC, Extra) UsingPackDecl(DC, InstantiatedFrom, UsingDecls);
3237
}
3238
3239
UsingPackDecl *UsingPackDecl::CreateDeserialized(ASTContext &C, GlobalDeclID ID,
3240
unsigned NumExpansions) {
3241
size_t Extra = additionalSizeToAlloc<NamedDecl *>(NumExpansions);
3242
auto *Result =
3243
new (C, ID, Extra) UsingPackDecl(nullptr, nullptr, std::nullopt);
3244
Result->NumExpansions = NumExpansions;
3245
auto *Trail = Result->getTrailingObjects<NamedDecl *>();
3246
for (unsigned I = 0; I != NumExpansions; ++I)
3247
new (Trail + I) NamedDecl*(nullptr);
3248
return Result;
3249
}
3250
3251
void UnresolvedUsingValueDecl::anchor() {}
3252
3253
UnresolvedUsingValueDecl *
3254
UnresolvedUsingValueDecl::Create(ASTContext &C, DeclContext *DC,
3255
SourceLocation UsingLoc,
3256
NestedNameSpecifierLoc QualifierLoc,
3257
const DeclarationNameInfo &NameInfo,
3258
SourceLocation EllipsisLoc) {
3259
return new (C, DC) UnresolvedUsingValueDecl(DC, C.DependentTy, UsingLoc,
3260
QualifierLoc, NameInfo,
3261
EllipsisLoc);
3262
}
3263
3264
UnresolvedUsingValueDecl *
3265
UnresolvedUsingValueDecl::CreateDeserialized(ASTContext &C, GlobalDeclID ID) {
3266
return new (C, ID) UnresolvedUsingValueDecl(nullptr, QualType(),
3267
SourceLocation(),
3268
NestedNameSpecifierLoc(),
3269
DeclarationNameInfo(),
3270
SourceLocation());
3271
}
3272
3273
SourceRange UnresolvedUsingValueDecl::getSourceRange() const {
3274
SourceLocation Begin = isAccessDeclaration()
3275
? getQualifierLoc().getBeginLoc() : UsingLocation;
3276
return SourceRange(Begin, getNameInfo().getEndLoc());
3277
}
3278
3279
void UnresolvedUsingTypenameDecl::anchor() {}
3280
3281
UnresolvedUsingTypenameDecl *
3282
UnresolvedUsingTypenameDecl::Create(ASTContext &C, DeclContext *DC,
3283
SourceLocation UsingLoc,
3284
SourceLocation TypenameLoc,
3285
NestedNameSpecifierLoc QualifierLoc,
3286
SourceLocation TargetNameLoc,
3287
DeclarationName TargetName,
3288
SourceLocation EllipsisLoc) {
3289
return new (C, DC) UnresolvedUsingTypenameDecl(
3290
DC, UsingLoc, TypenameLoc, QualifierLoc, TargetNameLoc,
3291
TargetName.getAsIdentifierInfo(), EllipsisLoc);
3292
}
3293
3294
UnresolvedUsingTypenameDecl *
3295
UnresolvedUsingTypenameDecl::CreateDeserialized(ASTContext &C,
3296
GlobalDeclID ID) {
3297
return new (C, ID) UnresolvedUsingTypenameDecl(
3298
nullptr, SourceLocation(), SourceLocation(), NestedNameSpecifierLoc(),
3299
SourceLocation(), nullptr, SourceLocation());
3300
}
3301
3302
UnresolvedUsingIfExistsDecl *
3303
UnresolvedUsingIfExistsDecl::Create(ASTContext &Ctx, DeclContext *DC,
3304
SourceLocation Loc, DeclarationName Name) {
3305
return new (Ctx, DC) UnresolvedUsingIfExistsDecl(DC, Loc, Name);
3306
}
3307
3308
UnresolvedUsingIfExistsDecl *
3309
UnresolvedUsingIfExistsDecl::CreateDeserialized(ASTContext &Ctx,
3310
GlobalDeclID ID) {
3311
return new (Ctx, ID)
3312
UnresolvedUsingIfExistsDecl(nullptr, SourceLocation(), DeclarationName());
3313
}
3314
3315
UnresolvedUsingIfExistsDecl::UnresolvedUsingIfExistsDecl(DeclContext *DC,
3316
SourceLocation Loc,
3317
DeclarationName Name)
3318
: NamedDecl(Decl::UnresolvedUsingIfExists, DC, Loc, Name) {}
3319
3320
void UnresolvedUsingIfExistsDecl::anchor() {}
3321
3322
void StaticAssertDecl::anchor() {}
3323
3324
StaticAssertDecl *StaticAssertDecl::Create(ASTContext &C, DeclContext *DC,
3325
SourceLocation StaticAssertLoc,
3326
Expr *AssertExpr, Expr *Message,
3327
SourceLocation RParenLoc,
3328
bool Failed) {
3329
return new (C, DC) StaticAssertDecl(DC, StaticAssertLoc, AssertExpr, Message,
3330
RParenLoc, Failed);
3331
}
3332
3333
StaticAssertDecl *StaticAssertDecl::CreateDeserialized(ASTContext &C,
3334
GlobalDeclID ID) {
3335
return new (C, ID) StaticAssertDecl(nullptr, SourceLocation(), nullptr,
3336
nullptr, SourceLocation(), false);
3337
}
3338
3339
VarDecl *ValueDecl::getPotentiallyDecomposedVarDecl() {
3340
assert((isa<VarDecl, BindingDecl>(this)) &&
3341
"expected a VarDecl or a BindingDecl");
3342
if (auto *Var = llvm::dyn_cast<VarDecl>(this))
3343
return Var;
3344
if (auto *BD = llvm::dyn_cast<BindingDecl>(this))
3345
return llvm::dyn_cast<VarDecl>(BD->getDecomposedDecl());
3346
return nullptr;
3347
}
3348
3349
void BindingDecl::anchor() {}
3350
3351
BindingDecl *BindingDecl::Create(ASTContext &C, DeclContext *DC,
3352
SourceLocation IdLoc, IdentifierInfo *Id) {
3353
return new (C, DC) BindingDecl(DC, IdLoc, Id);
3354
}
3355
3356
BindingDecl *BindingDecl::CreateDeserialized(ASTContext &C, GlobalDeclID ID) {
3357
return new (C, ID) BindingDecl(nullptr, SourceLocation(), nullptr);
3358
}
3359
3360
VarDecl *BindingDecl::getHoldingVar() const {
3361
Expr *B = getBinding();
3362
if (!B)
3363
return nullptr;
3364
auto *DRE = dyn_cast<DeclRefExpr>(B->IgnoreImplicit());
3365
if (!DRE)
3366
return nullptr;
3367
3368
auto *VD = cast<VarDecl>(DRE->getDecl());
3369
assert(VD->isImplicit() && "holding var for binding decl not implicit");
3370
return VD;
3371
}
3372
3373
void DecompositionDecl::anchor() {}
3374
3375
DecompositionDecl *DecompositionDecl::Create(ASTContext &C, DeclContext *DC,
3376
SourceLocation StartLoc,
3377
SourceLocation LSquareLoc,
3378
QualType T, TypeSourceInfo *TInfo,
3379
StorageClass SC,
3380
ArrayRef<BindingDecl *> Bindings) {
3381
size_t Extra = additionalSizeToAlloc<BindingDecl *>(Bindings.size());
3382
return new (C, DC, Extra)
3383
DecompositionDecl(C, DC, StartLoc, LSquareLoc, T, TInfo, SC, Bindings);
3384
}
3385
3386
DecompositionDecl *DecompositionDecl::CreateDeserialized(ASTContext &C,
3387
GlobalDeclID ID,
3388
unsigned NumBindings) {
3389
size_t Extra = additionalSizeToAlloc<BindingDecl *>(NumBindings);
3390
auto *Result = new (C, ID, Extra)
3391
DecompositionDecl(C, nullptr, SourceLocation(), SourceLocation(),
3392
QualType(), nullptr, StorageClass(), std::nullopt);
3393
// Set up and clean out the bindings array.
3394
Result->NumBindings = NumBindings;
3395
auto *Trail = Result->getTrailingObjects<BindingDecl *>();
3396
for (unsigned I = 0; I != NumBindings; ++I)
3397
new (Trail + I) BindingDecl*(nullptr);
3398
return Result;
3399
}
3400
3401
void DecompositionDecl::printName(llvm::raw_ostream &OS,
3402
const PrintingPolicy &Policy) const {
3403
OS << '[';
3404
bool Comma = false;
3405
for (const auto *B : bindings()) {
3406
if (Comma)
3407
OS << ", ";
3408
B->printName(OS, Policy);
3409
Comma = true;
3410
}
3411
OS << ']';
3412
}
3413
3414
void MSPropertyDecl::anchor() {}
3415
3416
MSPropertyDecl *MSPropertyDecl::Create(ASTContext &C, DeclContext *DC,
3417
SourceLocation L, DeclarationName N,
3418
QualType T, TypeSourceInfo *TInfo,
3419
SourceLocation StartL,
3420
IdentifierInfo *Getter,
3421
IdentifierInfo *Setter) {
3422
return new (C, DC) MSPropertyDecl(DC, L, N, T, TInfo, StartL, Getter, Setter);
3423
}
3424
3425
MSPropertyDecl *MSPropertyDecl::CreateDeserialized(ASTContext &C,
3426
GlobalDeclID ID) {
3427
return new (C, ID) MSPropertyDecl(nullptr, SourceLocation(),
3428
DeclarationName(), QualType(), nullptr,
3429
SourceLocation(), nullptr, nullptr);
3430
}
3431
3432
void MSGuidDecl::anchor() {}
3433
3434
MSGuidDecl::MSGuidDecl(DeclContext *DC, QualType T, Parts P)
3435
: ValueDecl(Decl::MSGuid, DC, SourceLocation(), DeclarationName(), T),
3436
PartVal(P) {}
3437
3438
MSGuidDecl *MSGuidDecl::Create(const ASTContext &C, QualType T, Parts P) {
3439
DeclContext *DC = C.getTranslationUnitDecl();
3440
return new (C, DC) MSGuidDecl(DC, T, P);
3441
}
3442
3443
MSGuidDecl *MSGuidDecl::CreateDeserialized(ASTContext &C, GlobalDeclID ID) {
3444
return new (C, ID) MSGuidDecl(nullptr, QualType(), Parts());
3445
}
3446
3447
void MSGuidDecl::printName(llvm::raw_ostream &OS,
3448
const PrintingPolicy &) const {
3449
OS << llvm::format("GUID{%08" PRIx32 "-%04" PRIx16 "-%04" PRIx16 "-",
3450
PartVal.Part1, PartVal.Part2, PartVal.Part3);
3451
unsigned I = 0;
3452
for (uint8_t Byte : PartVal.Part4And5) {
3453
OS << llvm::format("%02" PRIx8, Byte);
3454
if (++I == 2)
3455
OS << '-';
3456
}
3457
OS << '}';
3458
}
3459
3460
/// Determine if T is a valid 'struct _GUID' of the shape that we expect.
3461
static bool isValidStructGUID(ASTContext &Ctx, QualType T) {
3462
// FIXME: We only need to check this once, not once each time we compute a
3463
// GUID APValue.
3464
using MatcherRef = llvm::function_ref<bool(QualType)>;
3465
3466
auto IsInt = [&Ctx](unsigned N) {
3467
return [&Ctx, N](QualType T) {
3468
return T->isUnsignedIntegerOrEnumerationType() &&
3469
Ctx.getIntWidth(T) == N;
3470
};
3471
};
3472
3473
auto IsArray = [&Ctx](MatcherRef Elem, unsigned N) {
3474
return [&Ctx, Elem, N](QualType T) {
3475
const ConstantArrayType *CAT = Ctx.getAsConstantArrayType(T);
3476
return CAT && CAT->getSize() == N && Elem(CAT->getElementType());
3477
};
3478
};
3479
3480
auto IsStruct = [](std::initializer_list<MatcherRef> Fields) {
3481
return [Fields](QualType T) {
3482
const RecordDecl *RD = T->getAsRecordDecl();
3483
if (!RD || RD->isUnion())
3484
return false;
3485
RD = RD->getDefinition();
3486
if (!RD)
3487
return false;
3488
if (auto *CXXRD = dyn_cast<CXXRecordDecl>(RD))
3489
if (CXXRD->getNumBases())
3490
return false;
3491
auto MatcherIt = Fields.begin();
3492
for (const FieldDecl *FD : RD->fields()) {
3493
if (FD->isUnnamedBitField())
3494
continue;
3495
if (FD->isBitField() || MatcherIt == Fields.end() ||
3496
!(*MatcherIt)(FD->getType()))
3497
return false;
3498
++MatcherIt;
3499
}
3500
return MatcherIt == Fields.end();
3501
};
3502
};
3503
3504
// We expect an {i32, i16, i16, [8 x i8]}.
3505
return IsStruct({IsInt(32), IsInt(16), IsInt(16), IsArray(IsInt(8), 8)})(T);
3506
}
3507
3508
APValue &MSGuidDecl::getAsAPValue() const {
3509
if (APVal.isAbsent() && isValidStructGUID(getASTContext(), getType())) {
3510
using llvm::APInt;
3511
using llvm::APSInt;
3512
APVal = APValue(APValue::UninitStruct(), 0, 4);
3513
APVal.getStructField(0) = APValue(APSInt(APInt(32, PartVal.Part1), true));
3514
APVal.getStructField(1) = APValue(APSInt(APInt(16, PartVal.Part2), true));
3515
APVal.getStructField(2) = APValue(APSInt(APInt(16, PartVal.Part3), true));
3516
APValue &Arr = APVal.getStructField(3) =
3517
APValue(APValue::UninitArray(), 8, 8);
3518
for (unsigned I = 0; I != 8; ++I) {
3519
Arr.getArrayInitializedElt(I) =
3520
APValue(APSInt(APInt(8, PartVal.Part4And5[I]), true));
3521
}
3522
// Register this APValue to be destroyed if necessary. (Note that the
3523
// MSGuidDecl destructor is never run.)
3524
getASTContext().addDestruction(&APVal);
3525
}
3526
3527
return APVal;
3528
}
3529
3530
void UnnamedGlobalConstantDecl::anchor() {}
3531
3532
UnnamedGlobalConstantDecl::UnnamedGlobalConstantDecl(const ASTContext &C,
3533
DeclContext *DC,
3534
QualType Ty,
3535
const APValue &Val)
3536
: ValueDecl(Decl::UnnamedGlobalConstant, DC, SourceLocation(),
3537
DeclarationName(), Ty),
3538
Value(Val) {
3539
// Cleanup the embedded APValue if required (note that our destructor is never
3540
// run)
3541
if (Value.needsCleanup())
3542
C.addDestruction(&Value);
3543
}
3544
3545
UnnamedGlobalConstantDecl *
3546
UnnamedGlobalConstantDecl::Create(const ASTContext &C, QualType T,
3547
const APValue &Value) {
3548
DeclContext *DC = C.getTranslationUnitDecl();
3549
return new (C, DC) UnnamedGlobalConstantDecl(C, DC, T, Value);
3550
}
3551
3552
UnnamedGlobalConstantDecl *
3553
UnnamedGlobalConstantDecl::CreateDeserialized(ASTContext &C, GlobalDeclID ID) {
3554
return new (C, ID)
3555
UnnamedGlobalConstantDecl(C, nullptr, QualType(), APValue());
3556
}
3557
3558
void UnnamedGlobalConstantDecl::printName(llvm::raw_ostream &OS,
3559
const PrintingPolicy &) const {
3560
OS << "unnamed-global-constant";
3561
}
3562
3563
static const char *getAccessName(AccessSpecifier AS) {
3564
switch (AS) {
3565
case AS_none:
3566
llvm_unreachable("Invalid access specifier!");
3567
case AS_public:
3568
return "public";
3569
case AS_private:
3570
return "private";
3571
case AS_protected:
3572
return "protected";
3573
}
3574
llvm_unreachable("Invalid access specifier!");
3575
}
3576
3577
const StreamingDiagnostic &clang::operator<<(const StreamingDiagnostic &DB,
3578
AccessSpecifier AS) {
3579
return DB << getAccessName(AS);
3580
}
3581
3582