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"
58void AccessSpecDecl::anchor() {}
65void LazyASTUnresolvedSet::getFromExternalSource(
ASTContext &
C)
const {
67 assert(Impl.Decls.isLazy() &&
"getFromExternalSource for non-lazy set");
68 assert(Source &&
"getFromExternalSource with no external source");
73 Impl.Decls.setLazy(
false);
76CXXRecordDecl::DefinitionData::DefinitionData(
CXXRecordDecl *D)
77 : UserDeclaredConstructor(
false), UserDeclaredSpecialMembers(0),
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),
117 return Bases.get(
Definition->getASTContext().getExternalSource());
121 return VBases.get(
Definition->getASTContext().getExternalSource());
129 DefinitionData(PrevDecl ? PrevDecl->DefinitionData
136 bool DelayTypeCreation) {
142 if (!DelayTypeCreation)
143 C.getTypeDeclType(R, PrevDecl);
150 unsigned DependencyKind,
bool IsGeneric,
153 Loc,
nullptr,
nullptr);
155 R->DefinitionData =
new (
C)
struct LambdaDefinitionData(
156 R, Info, DependencyKind, IsGeneric, CaptureDefault);
157 R->setMayHaveOutOfDateDef(
false);
158 R->setImplicit(
true);
160 C.getTypeDeclType(R,
nullptr);
166 auto *R =
new (
C, ID)
179 while (!WorkList.empty()) {
184 if (
const CXXRecordDecl *B = BaseSpec.getType()->getAsCXXRecordDecl()) {
185 if (!SeenBaseTypes.insert(B).second)
187 WorkList.push_back(B);
199 if (!data().Bases.isOffset() && data().NumBases > 0)
200 C.Deallocate(data().getBases());
203 if (!
C.getLangOpts().CPlusPlus17) {
206 data().Aggregate =
false;
211 data().PlainOldData =
false;
221 data().NumBases = NumBases;
222 for (
unsigned i = 0; i < NumBases; ++i) {
223 data().getBases()[i] = *Bases[i];
230 auto *BaseClassDecl =
238 if (BaseClassDecl->data().HasBasesWithFields ||
239 !BaseClassDecl->field_empty()) {
240 if (data().HasBasesWithFields)
242 data().IsStandardLayout =
false;
243 data().HasBasesWithFields =
true;
250 if (BaseClassDecl->data().HasBasesWithNonStaticDataMembers ||
251 BaseClassDecl->hasDirectFields()) {
252 if (data().HasBasesWithNonStaticDataMembers)
253 data().IsCXX11StandardLayout =
false;
254 data().HasBasesWithNonStaticDataMembers =
true;
257 if (!BaseClassDecl->isEmpty()) {
261 data().Empty =
false;
267 data().Aggregate =
false;
272 data().StructuralIfLiteral =
false;
278 if (BaseClassDecl->isPolymorphic()) {
279 data().Polymorphic =
true;
282 data().Aggregate =
false;
288 if (!BaseClassDecl->isStandardLayout())
289 data().IsStandardLayout =
false;
290 if (!BaseClassDecl->isCXX11StandardLayout())
291 data().IsCXX11StandardLayout =
false;
295 data().HasNonLiteralTypeFieldsOrBases =
true;
298 for (
const auto &VBase : BaseClassDecl->vbases()) {
300 if (SeenVBaseTypes.insert(
C.getCanonicalType(VBase.getType())).second) {
301 VBases.push_back(&VBase);
308 if (
CXXRecordDecl *VBaseDecl = VBase.getType()->getAsCXXRecordDecl())
309 if (!VBaseDecl->hasCopyConstructorWithConstParam())
310 data().ImplicitCopyConstructorCanHaveConstParamForVBase =
false;
314 data().Aggregate =
false;
318 if (
Base->isVirtual()) {
320 if (SeenVBaseTypes.insert(
C.getCanonicalType(BaseType)).second)
321 VBases.push_back(
Base);
326 data().Empty =
false;
330 data().Aggregate =
false;
336 data().HasTrivialSpecialMembers &= SMF_Destructor;
337 data().HasTrivialSpecialMembersForCall &= SMF_Destructor;
342 data().IsStandardLayout =
false;
343 data().IsCXX11StandardLayout =
false;
349 data().DefaultedDefaultConstructorIsConstexpr =
false;
350 data().DefaultedDestructorIsConstexpr =
false;
357 if (!BaseClassDecl->hasCopyConstructorWithConstParam())
358 data().ImplicitCopyConstructorCanHaveConstParamForVBase =
false;
364 if (!BaseClassDecl->hasTrivialDefaultConstructor())
365 data().HasTrivialSpecialMembers &= ~SMF_DefaultConstructor;
372 if (!BaseClassDecl->hasTrivialCopyConstructor())
373 data().HasTrivialSpecialMembers &= ~SMF_CopyConstructor;
375 if (!BaseClassDecl->hasTrivialCopyConstructorForCall())
376 data().HasTrivialSpecialMembersForCall &= ~SMF_CopyConstructor;
382 if (!BaseClassDecl->hasTrivialMoveConstructor())
383 data().HasTrivialSpecialMembers &= ~SMF_MoveConstructor;
385 if (!BaseClassDecl->hasTrivialMoveConstructorForCall())
386 data().HasTrivialSpecialMembersForCall &= ~SMF_MoveConstructor;
393 if (!BaseClassDecl->hasTrivialCopyAssignment())
394 data().HasTrivialSpecialMembers &= ~SMF_CopyAssignment;
399 if (!BaseClassDecl->hasTrivialMoveAssignment())
400 data().HasTrivialSpecialMembers &= ~SMF_MoveAssignment;
406 if (!BaseClassDecl->hasConstexprDefaultConstructor())
407 data().DefaultedDefaultConstructorIsConstexpr =
408 C.getLangOpts().CPlusPlus23;
415 if (!BaseClassDecl->hasCopyConstructorWithConstParam())
416 data().ImplicitCopyConstructorCanHaveConstParamForNonVBase =
false;
422 if (!BaseClassDecl->hasTrivialDestructor())
423 data().HasTrivialSpecialMembers &= ~SMF_Destructor;
425 if (!BaseClassDecl->hasTrivialDestructorForCall())
426 data().HasTrivialSpecialMembersForCall &= ~SMF_Destructor;
428 if (!BaseClassDecl->hasIrrelevantDestructor())
429 data().HasIrrelevantDestructor =
false;
431 if (BaseClassDecl->isAnyDestructorNoReturn())
432 data().IsAnyDestructorNoReturn =
true;
439 if (!BaseClassDecl->hasCopyAssignmentWithConstParam())
440 data().ImplicitCopyAssignmentHasConstParam =
false;
444 if (BaseClassDecl->hasObjectMember())
447 if (BaseClassDecl->hasVolatileMember())
450 if (BaseClassDecl->getArgPassingRestrictions() ==
455 if (BaseClassDecl->hasMutableFields())
456 data().HasMutableFields =
true;
458 if (BaseClassDecl->hasUninitializedReferenceMember())
459 data().HasUninitializedReferenceMember =
true;
461 if (!BaseClassDecl->allowConstDefaultInit())
462 data().HasUninitializedFields =
true;
464 addedClassSubobject(BaseClassDecl);
475 data().IsStandardLayout =
false;
477 if (VBases.empty()) {
478 data().IsParsingBaseSpecifiers =
false;
484 data().NumVBases = VBases.size();
485 for (
int I = 0, E = VBases.size(); I != E; ++I) {
489 data().getVBases()[I] = *VBases[I];
492 data().IsParsingBaseSpecifiers =
false;
496 assert(
hasDefinition() &&
"ODRHash only for records with definitions");
499 if (DefinitionData->HasODRHash)
500 return DefinitionData->ODRHash;
505 DefinitionData->HasODRHash =
true;
508 return DefinitionData->ODRHash;
511void CXXRecordDecl::addedClassSubobject(
CXXRecordDecl *Subobj) {
519 data().NeedOverloadResolutionForCopyConstructor =
true;
521 data().NeedOverloadResolutionForMoveConstructor =
true;
530 data().NeedOverloadResolutionForCopyAssignment =
true;
532 data().NeedOverloadResolutionForMoveAssignment =
true;
542 data().NeedOverloadResolutionForCopyConstructor =
true;
543 data().NeedOverloadResolutionForMoveConstructor =
true;
544 data().NeedOverloadResolutionForDestructor =
true;
553 data().DefaultedDestructorIsConstexpr =
560 if (!Subobj->data().StructuralIfLiteral)
561 data().StructuralIfLiteral =
false;
606void CXXRecordDecl::markedVirtualFunctionPure() {
609 data().Abstract =
true;
612bool CXXRecordDecl::hasSubobjectAtOffsetZeroOfEmptyBaseType(
623 RD = RD->getCanonicalDecl();
631 if (!RD->data().HasBasesWithFields) {
650 if (M.insert(RD).second)
651 WorkList.push_back(RD);
658 while (!WorkList.empty()) {
668 bool IsFirstField =
true;
669 for (
auto *FD :
X->fields()) {
672 if (FD->isUnnamedBitField())
675 if (!IsFirstField && !FD->isZeroSize(Ctx))
685 IsFirstField =
false;
693 assert(
isLambda() &&
"not a lambda");
710void CXXRecordDecl::addedMember(
Decl *D) {
711 if (!D->
isImplicit() && !isa<FieldDecl>(D) && !isa<IndirectFieldDecl>(D) &&
715 data().HasOnlyCMembers =
false;
721 auto *FunTmpl = dyn_cast<FunctionTemplateDecl>(D);
723 D = FunTmpl->getTemplatedDecl();
726 Decl *DUnderlying = D;
727 if (
auto *ND = dyn_cast<NamedDecl>(DUnderlying)) {
728 DUnderlying = ND->getUnderlyingDecl();
729 if (
auto *UnderlyingFunTmpl = dyn_cast<FunctionTemplateDecl>(DUnderlying))
730 DUnderlying = UnderlyingFunTmpl->getTemplatedDecl();
733 if (
const auto *Method = dyn_cast<CXXMethodDecl>(D)) {
734 if (Method->isVirtual()) {
737 data().Aggregate =
false;
741 data().PlainOldData =
false;
745 data().Empty =
false;
750 data().Polymorphic =
true;
756 data().HasTrivialSpecialMembers &= SMF_Destructor;
757 data().HasTrivialSpecialMembersForCall &= SMF_Destructor;
762 data().IsStandardLayout =
false;
763 data().IsCXX11StandardLayout =
false;
771 L->AddedCXXImplicitMember(data().
Definition, D);
777 if (
const auto *Constructor = dyn_cast<CXXConstructorDecl>(D)) {
784 data().UserDeclaredConstructor =
true;
794 data().PlainOldData =
false;
799 SMKind |= SMF_DefaultConstructor;
802 data().UserProvidedDefaultConstructor =
true;
804 data().HasConstexprDefaultConstructor =
true;
806 data().HasDefaultedDefaultConstructor =
true;
812 SMKind |= SMF_CopyConstructor;
815 data().HasDeclaredCopyConstructorWithConstParam =
true;
817 SMKind |= SMF_MoveConstructor;
829 data().Aggregate =
false;
834 if (
const auto *Constructor = dyn_cast<CXXConstructorDecl>(DUnderlying)) {
842 data().HasConstexprNonCopyMoveConstructor =
true;
843 if (!isa<CXXConstructorDecl>(D) &&
Constructor->isDefaultConstructor())
844 data().HasInheritedDefaultConstructor =
true;
848 if (
const auto *Method = dyn_cast<CXXMethodDecl>(D)) {
849 if (isa<CXXDestructorDecl>(D))
850 SMKind |= SMF_Destructor;
852 if (Method->isCopyAssignmentOperator()) {
853 SMKind |= SMF_CopyAssignment;
855 const auto *ParamTy =
856 Method->getNonObjectParameter(0)->getType()->getAs<
ReferenceType>();
857 if (!ParamTy || ParamTy->getPointeeType().isConstQualified())
858 data().HasDeclaredCopyAssignmentWithConstParam =
true;
861 if (Method->isMoveAssignmentOperator())
862 SMKind |= SMF_MoveAssignment;
865 if (
auto *Conversion = dyn_cast<CXXConversionDecl>(D)) {
874 if (Conversion->getPrimaryTemplate()) {
880 FunTmpl ? cast<NamedDecl>(FunTmpl) :
cast<
NamedDecl>(Conversion);
885 Conversions.
addDecl(Ctx, Primary, AS);
892 data().HasTrivialSpecialMembers &=
893 data().DeclaredSpecialMembers | ~SMKind;
894 data().HasTrivialSpecialMembersForCall &=
895 data().DeclaredSpecialMembers | ~SMKind;
899 data().DeclaredSpecialMembers |= SMKind;
900 if (!Method->isImplicit()) {
901 data().UserDeclaredSpecialMembers |= SMKind;
904 if ((!Method->isDeleted() && !Method->isDefaulted() &&
905 SMKind != SMF_MoveAssignment) ||
919 data().PlainOldData =
false;
927 if (!Method->isIneligibleOrNotSelected()) {
936 if (
const auto *Field = dyn_cast<FieldDecl>(D)) {
944 if (data().HasBasesWithFields)
945 data().IsStandardLayout =
false;
951 if (
Field->isUnnamedBitField()) {
955 if (data().Empty && !
Field->isZeroLengthBitField(Context) &&
958 data().Empty =
false;
966 if (data().HasBasesWithNonStaticDataMembers)
967 data().IsCXX11StandardLayout =
false;
975 data().Aggregate =
false;
976 data().PlainOldData =
false;
981 data().StructuralIfLiteral =
false;
986 bool IsFirstField = !data().HasPrivateFields &&
987 !data().HasProtectedFields && !data().HasPublicFields;
994 case AS_private: data().HasPrivateFields =
true;
break;
995 case AS_protected: data().HasProtectedFields =
true;
break;
996 case AS_public: data().HasPublicFields =
true;
break;
997 case AS_none: llvm_unreachable(
"Invalid access specifier");
999 if ((data().HasPrivateFields + data().HasProtectedFields +
1000 data().HasPublicFields) > 1) {
1001 data().IsStandardLayout =
false;
1002 data().IsCXX11StandardLayout =
false;
1006 if (
Field->isMutable()) {
1007 data().HasMutableFields =
true;
1012 data().StructuralIfLiteral =
false;
1019 data().HasVariantMembers =
true;
1030 if (
T.hasNonTrivialObjCLifetime()) {
1038 struct DefinitionData &
Data = data();
1039 Data.PlainOldData =
false;
1040 Data.HasTrivialSpecialMembers = 0;
1046 data().HasTrivialSpecialMembersForCall = 0;
1052 Data.HasIrrelevantDestructor =
false;
1055 data().DefaultedCopyConstructorIsDeleted =
true;
1056 data().DefaultedMoveConstructorIsDeleted =
true;
1057 data().DefaultedCopyAssignmentIsDeleted =
true;
1058 data().DefaultedMoveAssignmentIsDeleted =
true;
1059 data().DefaultedDestructorIsDeleted =
true;
1060 data().NeedOverloadResolutionForCopyConstructor =
true;
1061 data().NeedOverloadResolutionForMoveConstructor =
true;
1062 data().NeedOverloadResolutionForCopyAssignment =
true;
1063 data().NeedOverloadResolutionForMoveAssignment =
true;
1064 data().NeedOverloadResolutionForDestructor =
true;
1066 }
else if (!Context.
getLangOpts().ObjCAutoRefCount) {
1069 }
else if (!
T.isCXX98PODType(Context))
1070 data().PlainOldData =
false;
1073 if (!
Field->hasInClassInitializer())
1074 data().HasUninitializedReferenceMember =
true;
1079 data().IsStandardLayout =
false;
1080 data().IsCXX11StandardLayout =
false;
1086 data().DefaultedCopyConstructorIsDeleted =
true;
1089 if (!
Field->hasInClassInitializer() && !
Field->isMutable()) {
1091 if (FieldType->hasDefinition() && !FieldType->allowConstDefaultInit())
1092 data().HasUninitializedFields =
true;
1094 data().HasUninitializedFields =
true;
1100 data().HasNonLiteralTypeFieldsOrBases =
true;
1102 if (
Field->hasInClassInitializer() ||
1103 (
Field->isAnonymousStructOrUnion() &&
1104 Field->getType()->getAsCXXRecordDecl()->hasInClassInitializer())) {
1105 data().HasInClassInitializer =
true;
1110 data().HasTrivialSpecialMembers &= ~SMF_DefaultConstructor;
1118 data().Aggregate =
false;
1122 data().PlainOldData =
false;
1130 data().DefaultedCopyAssignmentIsDeleted =
true;
1131 data().DefaultedMoveAssignmentIsDeleted =
true;
1136 bool IsZeroSize =
Field->isZeroSize(Context);
1139 auto *FieldRec = cast<CXXRecordDecl>(RecordTy->getDecl());
1140 if (FieldRec->getDefinition()) {
1141 addedClassSubobject(FieldRec);
1149 data().NeedOverloadResolutionForCopyConstructor =
true;
1150 data().NeedOverloadResolutionForMoveConstructor =
true;
1151 data().NeedOverloadResolutionForCopyAssignment =
true;
1152 data().NeedOverloadResolutionForMoveAssignment =
true;
1161 if (FieldRec->hasNonTrivialCopyConstructor())
1162 data().DefaultedCopyConstructorIsDeleted =
true;
1163 if (FieldRec->hasNonTrivialMoveConstructor())
1164 data().DefaultedMoveConstructorIsDeleted =
true;
1165 if (FieldRec->hasNonTrivialCopyAssignment())
1166 data().DefaultedCopyAssignmentIsDeleted =
true;
1167 if (FieldRec->hasNonTrivialMoveAssignment())
1168 data().DefaultedMoveAssignmentIsDeleted =
true;
1169 if (FieldRec->hasNonTrivialDestructor())
1170 data().DefaultedDestructorIsDeleted =
true;
1175 if (
Field->isAnonymousStructOrUnion()) {
1176 data().NeedOverloadResolutionForCopyConstructor |=
1177 FieldRec->data().NeedOverloadResolutionForCopyConstructor;
1178 data().NeedOverloadResolutionForMoveConstructor |=
1179 FieldRec->data().NeedOverloadResolutionForMoveConstructor;
1180 data().NeedOverloadResolutionForCopyAssignment |=
1181 FieldRec->data().NeedOverloadResolutionForCopyAssignment;
1182 data().NeedOverloadResolutionForMoveAssignment |=
1183 FieldRec->data().NeedOverloadResolutionForMoveAssignment;
1184 data().NeedOverloadResolutionForDestructor |=
1185 FieldRec->data().NeedOverloadResolutionForDestructor;
1193 if (!FieldRec->hasTrivialDefaultConstructor())
1194 data().HasTrivialSpecialMembers &= ~SMF_DefaultConstructor;
1202 if (!FieldRec->hasTrivialCopyConstructor())
1203 data().HasTrivialSpecialMembers &= ~SMF_CopyConstructor;
1205 if (!FieldRec->hasTrivialCopyConstructorForCall())
1206 data().HasTrivialSpecialMembersForCall &= ~SMF_CopyConstructor;
1211 if (!FieldRec->hasTrivialMoveConstructor())
1212 data().HasTrivialSpecialMembers &= ~SMF_MoveConstructor;
1214 if (!FieldRec->hasTrivialMoveConstructorForCall())
1215 data().HasTrivialSpecialMembersForCall &= ~SMF_MoveConstructor;
1223 if (!FieldRec->hasTrivialCopyAssignment())
1224 data().HasTrivialSpecialMembers &= ~SMF_CopyAssignment;
1228 if (!FieldRec->hasTrivialMoveAssignment())
1229 data().HasTrivialSpecialMembers &= ~SMF_MoveAssignment;
1231 if (!FieldRec->hasTrivialDestructor())
1232 data().HasTrivialSpecialMembers &= ~SMF_Destructor;
1233 if (!FieldRec->hasTrivialDestructorForCall())
1234 data().HasTrivialSpecialMembersForCall &= ~SMF_Destructor;
1235 if (!FieldRec->hasIrrelevantDestructor())
1236 data().HasIrrelevantDestructor =
false;
1237 if (FieldRec->isAnyDestructorNoReturn())
1238 data().IsAnyDestructorNoReturn =
true;
1239 if (FieldRec->hasObjectMember())
1241 if (FieldRec->hasVolatileMember())
1243 if (FieldRec->getArgPassingRestrictions() ==
1251 if (!FieldRec->isStandardLayout())
1252 data().IsStandardLayout =
false;
1253 if (!FieldRec->isCXX11StandardLayout())
1254 data().IsCXX11StandardLayout =
false;
1260 if (data().IsStandardLayout &&
1261 (
isUnion() || IsFirstField || IsZeroSize) &&
1262 hasSubobjectAtOffsetZeroOfEmptyBaseType(Context, FieldRec))
1263 data().IsStandardLayout =
false;
1269 if (data().IsCXX11StandardLayout && IsFirstField) {
1272 for (
const auto &BI :
bases()) {
1274 data().IsCXX11StandardLayout =
false;
1281 if (FieldRec->hasMutableFields())
1282 data().HasMutableFields =
true;
1284 if (
Field->isMutable()) {
1288 data().NeedOverloadResolutionForCopyConstructor =
true;
1289 data().NeedOverloadResolutionForCopyAssignment =
true;
1299 if (!
Field->hasInClassInitializer() &&
1300 !FieldRec->hasConstexprDefaultConstructor() && !
isUnion())
1303 data().DefaultedDefaultConstructorIsConstexpr =
1311 if (!FieldRec->hasCopyConstructorWithConstParam())
1312 data().ImplicitCopyConstructorCanHaveConstParamForNonVBase =
false;
1320 if (!FieldRec->hasCopyAssignmentWithConstParam())
1321 data().ImplicitCopyAssignmentHasConstParam =
false;
1323 if (FieldRec->hasUninitializedReferenceMember() &&
1324 !
Field->hasInClassInitializer())
1325 data().HasUninitializedReferenceMember =
true;
1330 if (FieldRec->hasVariantMembers() &&
1331 Field->isAnonymousStructOrUnion())
1332 data().HasVariantMembers =
true;
1339 data().DefaultedDefaultConstructorIsConstexpr =
false;
1346 if (
T.isConstQualified()) {
1347 data().DefaultedCopyAssignmentIsDeleted =
true;
1348 data().DefaultedMoveAssignmentIsDeleted =
true;
1357 data().StructuralIfLiteral =
false;
1363 if (data().Empty && !IsZeroSize)
1364 data().Empty =
false;
1368 if (
auto *Shadow = dyn_cast<UsingShadowDecl>(D)) {
1369 if (Shadow->getDeclName().getNameKind()
1372 data().Conversions.get(Ctx).addDecl(Ctx, Shadow, Shadow->getAccess());
1376 if (
const auto *Using = dyn_cast<UsingDecl>(D)) {
1377 if (
Using->getDeclName().getNameKind() ==
1379 data().HasInheritedConstructor =
true;
1382 data().Aggregate =
false;
1385 if (
Using->getDeclName().getCXXOverloadedOperator() == OO_Equal)
1386 data().HasInheritedAssignment =
true;
1402 bool HasAtLeastOneLiteralMember =
1404 return !D->
getType().isVolatileQualified() &&
1407 if (!HasAtLeastOneLiteralMember)
1426 if (
const auto *DD = dyn_cast<CXXDestructorDecl>(MD)) {
1427 if (DD->isUserProvided())
1428 data().HasIrrelevantDestructor =
false;
1435 if (DD->isVirtual()) {
1436 data().HasTrivialSpecialMembers &= ~SMF_Destructor;
1437 data().HasTrivialSpecialMembersForCall &= ~SMF_Destructor;
1440 if (DD->isNoReturn())
1441 data().IsAnyDestructorNoReturn =
true;
1450 data().HasTrivialSpecialMembers |= SMKind;
1451 data().HasTrivialSpecialMembersForCall |= SMKind;
1453 data().HasTrivialSpecialMembersForCall |= SMKind;
1454 data().DeclaredNonTrivialSpecialMembers |= SMKind;
1456 data().DeclaredNonTrivialSpecialMembers |= SMKind;
1463 data().DeclaredNonTrivialSpecialMembersForCall |= SMKind;
1471 unsigned SMKind = 0;
1473 if (
const auto *Constructor = dyn_cast<CXXConstructorDecl>(D)) {
1474 if (Constructor->isDefaultConstructor()) {
1475 SMKind |= SMF_DefaultConstructor;
1476 if (Constructor->isConstexpr())
1477 data().HasConstexprDefaultConstructor =
true;
1479 if (Constructor->isCopyConstructor())
1480 SMKind |= SMF_CopyConstructor;
1481 else if (Constructor->isMoveConstructor())
1482 SMKind |= SMF_MoveConstructor;
1483 else if (Constructor->isConstexpr())
1485 data().HasConstexprNonCopyMoveConstructor =
true;
1486 }
else if (isa<CXXDestructorDecl>(D)) {
1487 SMKind |= SMF_Destructor;
1489 data().HasIrrelevantDestructor =
false;
1491 SMKind |= SMF_CopyAssignment;
1493 SMKind |= SMF_MoveAssignment;
1499 data().HasTrivialSpecialMembers |= SMKind;
1501 data().DeclaredNonTrivialSpecialMembers |= SMKind;
1505void CXXRecordDecl::LambdaDefinitionData::AddCaptureList(
ASTContext &Ctx,
1507 Captures.push_back(CaptureList);
1508 if (Captures.size() == 2) {
1516 CXXRecordDecl::LambdaDefinitionData &
Data = getLambdaData();
1519 Data.NumCaptures = Captures.size();
1520 Data.NumExplicitCaptures = 0;
1523 Data.AddCaptureList(Context, ToCapture);
1524 for (
unsigned I = 0, N = Captures.size(); I != N; ++I) {
1525 if (Captures[I].isExplicit())
1526 ++
Data.NumExplicitCaptures;
1533 Data.DefaultedCopyAssignmentIsDeleted =
true;
1537 unsigned SMKind = 0;
1539 if (
const auto *Constructor = dyn_cast<CXXConstructorDecl>(D)) {
1540 if (Constructor->isCopyConstructor())
1541 SMKind = SMF_CopyConstructor;
1542 else if (Constructor->isMoveConstructor())
1543 SMKind = SMF_MoveConstructor;
1544 }
else if (isa<CXXDestructorDecl>(D))
1545 SMKind = SMF_Destructor;
1548 data().HasTrivialSpecialMembersForCall |= SMKind;
1550 data().DeclaredNonTrivialSpecialMembersForCall |= SMKind;
1556 !TemplateOrInstantiation.isNull())
1561 return isPOD() && data().HasOnlyCMembers;
1566 return getLambdaData().IsGenericLambda;
1571 return llvm::all_of(R, [&](
NamedDecl *D) {
1578 if (!RD.
isLambda())
return nullptr;
1583 assert(!Calls.
empty() &&
"Missing lambda call operator!");
1585 "More than one lambda call operator!");
1586 return Calls.
front();
1591 return dyn_cast_or_null<FunctionTemplateDecl>(CallOp);
1597 if (CallOp ==
nullptr)
1600 if (
const auto *CallOpTmpl = dyn_cast<FunctionTemplateDecl>(CallOp))
1601 return cast<CXXMethodDecl>(CallOpTmpl->getTemplatedDecl());
1603 return cast<CXXMethodDecl>(CallOp);
1614 assert(RD.
isLambda() &&
"Must be a lambda");
1621 if (
const auto *InvokerTemplate = dyn_cast<FunctionTemplateDecl>(ND))
1622 return cast<CXXMethodDecl>(InvokerTemplate->getTemplatedDecl());
1623 return cast<CXXMethodDecl>(ND);
1633 cast<ValueDecl>(ND->getAsFunction())->getType()->castAs<
FunctionType>();
1634 if (FTy->getCallConv() == CC)
1642 llvm::DenseMap<const ValueDecl *, FieldDecl *> &Captures,
1645 ThisCapture =
nullptr;
1647 LambdaDefinitionData &Lambda = getLambdaData();
1651 C != CEnd; ++
C, ++Field) {
1652 if (
C->capturesThis())
1653 ThisCapture = *Field;
1654 else if (
C->capturesVariable())
1655 Captures[
C->getCapturedVar()] = *Field;
1666 return Tmpl->getTemplateParameters();
1676 assert(std::is_partitioned(List->begin(), List->end(),
1677 [](
const NamedDecl *D) { return !D->isImplicit(); })
1678 &&
"Explicit template params should be ordered before implicit ones");
1680 const auto ExplicitEnd = llvm::partition_point(
1686 assert(
isLambda() &&
"Not a lambda closure type!");
1688 return getLambdaData().ContextDecl.get(Source);
1692 assert(
isLambda() &&
"Not a lambda closure type!");
1698 getLambdaData().ContextDecl = Numbering.
ContextDecl;
1703 assert(
isLambda() &&
"Not a lambda closure type!");
1704 return getASTContext().DeviceLambdaManglingNumbers.lookup(
this);
1710 ->getConversionType();
1742 if (ConvI != ConvE) {
1743 HiddenTypesBuffer = ParentHiddenTypes;
1744 HiddenTypes = &HiddenTypesBuffer;
1748 bool Hidden = ParentHiddenTypes.count(ConvType);
1750 HiddenTypesBuffer.insert(ConvType);
1754 if (Hidden && InVirtual)
1755 HiddenVBaseCs.insert(cast<NamedDecl>(I.getDecl()->getCanonicalDecl()));
1763 VOutput.
addDecl(I.getDecl(), IAccess);
1765 Output.
addDecl(Context, I.getDecl(), IAccess);
1771 for (
const auto &I :
Record->bases()) {
1772 const auto *RT = I.getType()->getAs<
RecordType>();
1777 bool BaseInVirtual = InVirtual || I.isVirtual();
1779 auto *
Base = cast<CXXRecordDecl>(RT->getDecl());
1781 *HiddenTypes, Output, VOutput, HiddenVBaseCs);
1808 Output.
append(Context, ConvI, ConvE);
1809 for (; ConvI != ConvE; ++ConvI)
1813 for (
const auto &I :
Record->bases()) {
1814 const auto *RT = I.getType()->getAs<
RecordType>();
1818 I.isVirtual(), I.getAccessSpecifier(),
1819 HiddenTypes, Output, VBaseCs, HiddenVBaseCs);
1825 if (!HiddenVBaseCs.count(cast<NamedDecl>(I.getDecl()->getCanonicalDecl())))
1826 Output.
addDecl(Context, I.getDecl(), I.getAccess());
1832llvm::iterator_range<CXXRecordDecl::conversion_iterator>
1839 Set = &data().Conversions.get(Ctx);
1841 Set = &data().VisibleConversions.get(Ctx);
1843 if (!data().ComputedVisibleConversions) {
1845 data().ComputedVisibleConversions =
true;
1848 return llvm::make_range(
Set->begin(),
Set->end());
1864 for (
unsigned I = 0, E = Convs.
size(); I != E; ++I) {
1865 if (Convs[I].getDecl() == ConvDecl) {
1867 assert(!llvm::is_contained(Convs, ConvDecl) &&
1868 "conversion was found multiple times in unresolved set");
1873 llvm_unreachable(
"conversion not found in set!");
1878 return cast<CXXRecordDecl>(MSInfo->getInstantiatedFrom());
1890 assert(TemplateOrInstantiation.isNull() &&
1891 "Previous template or instantiation?");
1892 assert(!isa<ClassTemplatePartialSpecializationDecl>(
this));
1893 TemplateOrInstantiation
1902 TemplateOrInstantiation = Template;
1906 if (
const auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(
this))
1907 return Spec->getSpecializationKind();
1910 return MSInfo->getTemplateSpecializationKind();
1917 if (
auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(
this)) {
1918 Spec->setSpecializationKind(TSK);
1923 MSInfo->setTemplateSpecializationKind(TSK);
1927 llvm_unreachable(
"Not a class template or member class specialization");
1931 auto GetDefinitionOrSelf =
1933 if (
auto *Def = D->getDefinition())
1940 if (
auto *TD = dyn_cast<ClassTemplateSpecializationDecl>(
this)) {
1941 auto From = TD->getInstantiatedFrom();
1943 while (
auto *NewCTD = CTD->getInstantiatedFromMemberTemplate()) {
1944 if (NewCTD->isMemberSpecialization())
1948 return GetDefinitionOrSelf(CTD->getTemplatedDecl());
1952 while (
auto *NewCTPSD = CTPSD->getInstantiatedFromMember()) {
1953 if (NewCTPSD->isMemberSpecialization())
1957 return GetDefinitionOrSelf(CTPSD);
1966 return GetDefinitionOrSelf(RD);
1971 "couldn't find pattern for class template instantiation");
1987 for (
auto *
Decl : R) {
1988 auto* DD = dyn_cast<CXXDestructorDecl>(
Decl);
1989 if (DD && !DD->isIneligibleOrNotSelected())
2005 assert(
hasDefinition() &&
"checking for interface-like without a definition");
2019 for (
const auto *
const Method :
methods())
2020 if (Method->isDefined() && !Method->isImplicit())
2024 const auto *Uuid = getAttr<UuidAttr>();
2031 Uuid->getGuid() ==
"00000000-0000-0000-C000-000000000046") ||
2033 Uuid->getGuid() ==
"00020400-0000-0000-C000-000000000046"))) {
2047 if (BaseSpec.isVirtual() || BaseSpec.getAccessSpecifier() !=
AS_public)
2049 const auto *
Base = BaseSpec.getType()->getAsCXXRecordDecl();
2050 if (
Base->isInterface() || !
Base->isInterfaceLike())
2066 if (!FinalOverriders) {
2068 FinalOverriders = &MyFinalOverriders;
2072 for (CXXFinalOverriderMap::iterator M = FinalOverriders->begin(),
2073 MEnd = FinalOverriders->end();
2074 M != MEnd && !Done; ++M) {
2076 SOEnd = M->second.end();
2077 SO != SOEnd && !Done; ++SO) {
2078 assert(SO->second.size() > 0 &&
2079 "All virtual functions have overriding virtual functions");
2085 if (SO->second.front().Method->isPureVirtual()) {
2086 data().Abstract =
true;
2097 I.setAccess((*I)->getAccess());
2101 if (data().Abstract ||
isInvalidDecl() || !data().Polymorphic ||
2105 for (
const auto &B :
bases()) {
2106 const auto *BaseDecl =
2108 if (BaseDecl->isAbstract())
2119 if (Def->hasAttr<FinalAttr>())
2121 if (
const auto *Dtor = Def->getDestructor())
2122 if (Dtor->hasAttr<FinalAttr>())
2127void CXXDeductionGuideDecl::anchor() {}
2146 case Decl::Kind::CXXConstructor:
2147 return cast<CXXConstructorDecl>(
Function)->getExplicitSpecifier();
2148 case Decl::Kind::CXXConversion:
2149 return cast<CXXConversionDecl>(
Function)->getExplicitSpecifier();
2150 case Decl::Kind::CXXDeductionGuide:
2151 return cast<CXXDeductionGuideDecl>(
Function)->getExplicitSpecifier();
2163 TInfo, EndLocation, Ctor, Kind);
2184void CXXMethodDecl::anchor() {}
2214 if (isa<CXXDestructorDecl>(
this)) {
2226 auto *MD = dyn_cast<CXXMethodDecl>(ND);
2254 llvm::erase_if(FinalOverriders, [&](
CXXMethodDecl *OtherD) {
2258 FinalOverriders.push_back(D);
2261 for (
const auto &I : RD->
bases()) {
2265 const auto *
Base = cast<CXXRecordDecl>(RT->
getDecl());
2267 AddFinalOverrider(D);
2270 return FinalOverriders.size() == 1 ? FinalOverriders.front() :
nullptr;
2279 Expr *TrailingRequiresClause) {
2281 CXXMethod,
C, RD, StartLoc, NameInfo,
T, TInfo, SC,
UsesFPIntrin,
2282 isInline, ConstexprKind, EndLocation, TrailingRequiresClause);
2295 assert(
isVirtual() &&
"this method is expected to be virtual");
2304 if (hasAttr<FinalAttr>())
2313 Base =
Base->getBestDynamicClassTypeExpr();
2314 if (
Base->isPRValue() &&
Base->getType()->isRecordType())
2319 if (!BestDynamicDecl)
2328 if (!DevirtualizedMethod)
2338 if (DevirtualizedMethod->
hasAttr<FinalAttr>())
2339 return DevirtualizedMethod;
2345 return DevirtualizedMethod;
2347 if (
const auto *DRE = dyn_cast<DeclRefExpr>(
Base)) {
2348 if (
const auto *VD = dyn_cast<VarDecl>(DRE->getDecl()))
2349 if (VD->getType()->isRecordType())
2351 return DevirtualizedMethod;
2359 if (
const auto *ME = dyn_cast<MemberExpr>(
Base)) {
2360 const ValueDecl *VD = ME->getMemberDecl();
2366 if (
auto *BO = dyn_cast<BinaryOperator>(
Base)) {
2367 if (BO->isPtrMemOp()) {
2369 if (MPT->getPointeeType()->isRecordType())
2370 return DevirtualizedMethod;
2380 assert(PreventedBy.empty() &&
"PreventedBy is expected to be empty");
2397 unsigned UsualParams = 1;
2444 for (
const auto *D : R) {
2445 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
2446 if (FD->getNumParams() == 1) {
2447 PreventedBy.push_back(FD);
2512 "Can't add an overridden method to a class template!");
2513 assert(MD->
isVirtual() &&
"Method is not virtual!");
2519 if (isa<CXXConstructorDecl>(
this))
return nullptr;
2524 if (isa<CXXConstructorDecl>(
this))
return nullptr;
2529 if (isa<CXXConstructorDecl>(
this))
return 0;
2535 if (isa<CXXConstructorDecl>(
this))
2557 ObjectTy =
C.getLangOpts().HLSL ?
C.getLValueReferenceType(ObjectTy)
2558 :
C.getPointerType(ObjectTy);
2571 assert(
isInstance() &&
"No 'this' for static methods!");
2585 return C.getRValueReferenceType(
Type);
2586 return C.getLValueReferenceType(
Type);
2612 : Initializee(TInfo),
Init(
Init), MemberOrEllipsisLocation(EllipsisLoc),
2613 LParenLoc(L), RParenLoc(R), IsDelegating(
false), IsVirtual(IsVirtual),
2614 IsWritten(
false), SourceOrder(0) {}
2620 : Initializee(
Member),
Init(
Init), MemberOrEllipsisLocation(MemberLoc),
2621 LParenLoc(L), RParenLoc(R), IsDelegating(
false), IsVirtual(
false),
2622 IsWritten(
false), SourceOrder(0) {}
2629 : Initializee(
Member),
Init(
Init), MemberOrEllipsisLocation(MemberLoc),
2630 LParenLoc(L), RParenLoc(R), IsDelegating(
false), IsVirtual(
false),
2631 IsWritten(
false), SourceOrder(0) {}
2637 : Initializee(TInfo),
Init(
Init), LParenLoc(L), RParenLoc(R),
2638 IsDelegating(
true), IsVirtual(
false), IsWritten(
false), SourceOrder(0) {}
2654 return Initializee.get<
TypeSourceInfo*>()->getType().getTypePtr();
2667 return TSInfo->getTypeLoc().getBeginLoc();
2676 return I->getSourceRange();
2683CXXConstructorDecl::CXXConstructorDecl(
2690 SC_None, UsesFPIntrin, isInline, ConstexprKind,
2692 setNumCtorInitializers(0);
2693 setInheritingConstructor(
static_cast<bool>(Inherited));
2694 setImplicit(isImplicitlyDeclared);
2695 CXXConstructorDeclBits.HasTrailingExplicitSpecifier = ES.
getExpr() ? 1 : 0;
2697 *getTrailingObjects<InheritedConstructor>() = Inherited;
2698 setExplicitSpecifier(ES);
2701void CXXConstructorDecl::anchor() {}
2705 uint64_t AllocKind) {
2706 bool hasTrailingExplicit =
static_cast<bool>(AllocKind & TAKHasTailExplicit);
2708 static_cast<bool>(AllocKind & TAKInheritsConstructor);
2710 additionalSizeToAlloc<InheritedConstructor, ExplicitSpecifier>(
2717 Result->CXXConstructorDeclBits.HasTrailingExplicitSpecifier =
2718 hasTrailingExplicit;
2731 "Name must refer to a constructor");
2733 additionalSizeToAlloc<InheritedConstructor, ExplicitSpecifier>(
2734 Inherited ? 1 : 0, ES.
getExpr() ? 1 : 0);
2737 isImplicitlyDeclared, ConstexprKind, Inherited, TrailingRequiresClause);
2747 if (
const auto *Construct = dyn_cast<CXXConstructExpr>(E))
2748 return Construct->getConstructor();
2848void CXXDestructorDecl::anchor() {}
2860 bool UsesFPIntrin,
bool isInline,
bool isImplicitlyDeclared,
2864 "Name must refer to a destructor");
2867 isImplicitlyDeclared, ConstexprKind, TrailingRequiresClause);
2872 if (OD && !
First->OperatorDelete) {
2873 First->OperatorDelete = OD;
2874 First->OperatorDeleteThisArg = ThisArg;
2876 L->ResolvedOperatorDelete(
First, OD, ThisArg);
2880void CXXConversionDecl::anchor() {}
2895 Expr *TrailingRequiresClause) {
2898 "Name must refer to a conversion function");
2901 ConstexprKind, EndLocation, TrailingRequiresClause);
2918void LinkageSpecDecl::anchor() {}
2925 return new (
C, DC)
LinkageSpecDecl(DC, ExternLoc, LangLoc, Lang, HasBraces);
2935void UsingDirectiveDecl::anchor() {}
2944 if (
auto *NS = dyn_cast_or_null<NamespaceDecl>(
Used))
2945 Used = NS->getOriginalNamespace();
2947 IdentLoc,
Used, CommonAncestor);
2959 if (
auto *NA = dyn_cast_or_null<NamespaceAliasDecl>(NominatedNamespace))
2960 return NA->getNamespace();
2961 return cast_or_null<NamespaceDecl>(NominatedNamespace);
2969 redeclarable_base(
C), LocStart(StartLoc) {
2975 AnonOrFirstNamespaceAndFlags = {
nullptr, Flags};
2976 setPreviousDecl(PrevDecl);
3000 return AnonOrFirstNamespaceAndFlags.getPointer();
3007 return AnonOrFirstNamespaceAndFlags.getPointer();
3024void NamespaceAliasDecl::anchor() {}
3046 if (
auto *NS = dyn_cast_or_null<NamespaceDecl>(Namespace))
3047 Namespace = NS->getOriginalNamespace();
3049 QualifierLoc, IdentLoc, Namespace);
3060void LifetimeExtendedTemporaryDecl::anchor() {}
3069 if (isa<FieldDecl>(ExtendingDecl))
3073 if (isa<BindingDecl>(ExtendingDecl))
3076 return cast<VarDecl>(ExtendingDecl)->getStorageDuration();
3081 "don't need to cache the computed value for this temporary");
3082 if (MayCreate && !
Value) {
3086 assert(
Value &&
"may not be null");
3090void UsingShadowDecl::anchor() {}
3096 UsingOrNextShadow(Introducer) {
3098 assert(!isa<UsingShadowDecl>(
Target));
3115 while (
const auto *NextShadow =
3116 dyn_cast<UsingShadowDecl>(Shadow->UsingOrNextShadow))
3117 Shadow = NextShadow;
3118 return cast<BaseUsingDecl>(Shadow->UsingOrNextShadow);
3121void ConstructorUsingShadowDecl::anchor() {}
3140void BaseUsingDecl::anchor() {}
3143 assert(!llvm::is_contained(
shadows(), S) &&
"declaration already in set");
3144 assert(S->getIntroducer() ==
this);
3146 if (FirstUsingShadow.getPointer())
3147 S->UsingOrNextShadow = FirstUsingShadow.getPointer();
3148 FirstUsingShadow.setPointer(S);
3152 assert(llvm::is_contained(
shadows(), S) &&
"declaration not in set");
3153 assert(S->getIntroducer() ==
this);
3157 if (FirstUsingShadow.getPointer() == S) {
3158 FirstUsingShadow.setPointer(
3159 dyn_cast<UsingShadowDecl>(S->UsingOrNextShadow));
3160 S->UsingOrNextShadow =
this;
3165 while (Prev->UsingOrNextShadow != S)
3166 Prev = cast<UsingShadowDecl>(Prev->UsingOrNextShadow);
3167 Prev->UsingOrNextShadow = S->UsingOrNextShadow;
3168 S->UsingOrNextShadow =
this;
3171void UsingDecl::anchor() {}
3177 return new (
C, DC)
UsingDecl(DC, UL, QualifierLoc, NameInfo, HasTypename);
3192void UsingEnumDecl::anchor() {}
3215void UsingPackDecl::anchor() {}
3220 size_t Extra = additionalSizeToAlloc<NamedDecl *>(UsingDecls.size());
3221 return new (
C, DC, Extra)
UsingPackDecl(DC, InstantiatedFrom, UsingDecls);
3225 unsigned NumExpansions) {
3226 size_t Extra = additionalSizeToAlloc<NamedDecl *>(NumExpansions);
3229 Result->NumExpansions = NumExpansions;
3231 for (
unsigned I = 0; I != NumExpansions; ++I)
3236void UnresolvedUsingValueDecl::anchor() {}
3245 QualifierLoc, NameInfo,
3264void UnresolvedUsingTypenameDecl::anchor() {}
3275 DC, UsingLoc, TypenameLoc, QualifierLoc, TargetNameLoc,
3296 return new (Ctx,
ID)
3300UnresolvedUsingIfExistsDecl::UnresolvedUsingIfExistsDecl(
DeclContext *DC,
3305void UnresolvedUsingIfExistsDecl::anchor() {}
3307void StaticAssertDecl::anchor() {}
3325 assert((isa<VarDecl, BindingDecl>(
this)) &&
3326 "expected a VarDecl or a BindingDecl");
3327 if (
auto *Var = llvm::dyn_cast<VarDecl>(
this))
3329 if (
auto *BD = llvm::dyn_cast<BindingDecl>(
this))
3330 return llvm::dyn_cast<VarDecl>(BD->getDecomposedDecl());
3334void BindingDecl::anchor() {}
3353 auto *VD = cast<VarDecl>(DRE->getDecl());
3354 assert(VD->isImplicit() &&
"holding var for binding decl not implicit");
3358void DecompositionDecl::anchor() {}
3366 size_t Extra = additionalSizeToAlloc<BindingDecl *>(
Bindings.size());
3367 return new (
C, DC, Extra)
3373 unsigned NumBindings) {
3374 size_t Extra = additionalSizeToAlloc<BindingDecl *>(NumBindings);
3379 Result->NumBindings = NumBindings;
3381 for (
unsigned I = 0; I != NumBindings; ++I)
3393 B->printName(OS, Policy);
3399void MSPropertyDecl::anchor() {}
3407 return new (
C, DC)
MSPropertyDecl(DC, L, N,
T, TInfo, StartL, Getter, Setter);
3417void MSGuidDecl::anchor() {}
3434 OS << llvm::format(
"GUID{%08" PRIx32
"-%04" PRIx16
"-%04" PRIx16
"-",
3437 for (uint8_t Byte : PartVal.
Part4And5) {
3438 OS << llvm::format(
"%02" PRIx8, Byte);
3451 auto IsInt = [&Ctx](
unsigned N) {
3458 auto IsArray = [&Ctx](MatcherRef Elem,
unsigned N) {
3465 auto IsStruct = [](std::initializer_list<MatcherRef> Fields) {
3473 if (
auto *CXXRD = dyn_cast<CXXRecordDecl>(RD))
3474 if (CXXRD->getNumBases())
3476 auto MatcherIt = Fields.begin();
3478 if (FD->isUnnamedBitField())
3480 if (FD->isBitField() || MatcherIt == Fields.end() ||
3481 !(*MatcherIt)(FD->getType()))
3485 return MatcherIt == Fields.end();
3490 return IsStruct({IsInt(32), IsInt(16), IsInt(16), IsArray(IsInt(8), 8)})(
T);
3503 for (
unsigned I = 0; I != 8; ++I) {
3515void UnnamedGlobalConstantDecl::anchor() {}
3517UnnamedGlobalConstantDecl::UnnamedGlobalConstantDecl(
const ASTContext &
C,
3526 if (
Value.needsCleanup())
3527 C.addDestruction(&
Value);
3545 OS <<
"unnamed-global-constant";
3551 llvm_unreachable(
"Invalid access specifier!");
3559 llvm_unreachable(
"Invalid access specifier!");
Defines the clang::ASTContext interface.
ASTImporterLookupTable & LT
This file provides some common utility functions for processing Lambda related AST Constructs.
Defines the Diagnostic-related interfaces.
static void CollectVisibleConversions(ASTContext &Context, const CXXRecordDecl *Record, bool InVirtual, AccessSpecifier Access, const llvm::SmallPtrSet< CanQualType, 8 > &ParentHiddenTypes, ASTUnresolvedSet &Output, UnresolvedSetImpl &VOutput, llvm::SmallPtrSet< NamedDecl *, 8 > &HiddenVBaseCs)
Collect the visible conversions of a base class.
static const char * getAccessName(AccessSpecifier AS)
static bool recursivelyOverrides(const CXXMethodDecl *DerivedMD, const CXXMethodDecl *BaseMD)
static bool isValidStructGUID(ASTContext &Ctx, QualType T)
Determine if T is a valid 'struct _GUID' of the shape that we expect.
static DeclContext::lookup_result getLambdaStaticInvokers(const CXXRecordDecl &RD)
static NamedDecl * getLambdaCallOperatorHelper(const CXXRecordDecl &RD)
static QualType getThisObjectType(ASTContext &C, const FunctionProtoType *FPT, const CXXRecordDecl *Decl)
static bool allLookupResultsAreTheSame(const DeclContext::lookup_result &R)
static bool isDeclContextInNamespace(const DeclContext *DC)
static bool hasRepeatedBaseClass(const CXXRecordDecl *StartRD)
Determine whether a class has a repeated base class.
static CanQualType GetConversionType(ASTContext &Context, NamedDecl *Conv)
static CXXMethodDecl * getInvokerAsMethod(NamedDecl *ND)
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the C++ template declaration subclasses.
Defines the clang::Expr interface and subclasses for C++ expressions.
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines the LambdaCapture class.
Defines the clang::LangOptions interface.
llvm::MachO::Target Target
llvm::MachO::Record Record
This file contains the declaration of the ODRHash class, which calculates a hash based on AST nodes,...
Defines an enumeration for C++ overloaded operators.
Implements a partial diagnostic that can be emitted anwyhere in a DiagnosticBuilder stream.
Defines the clang::SourceLocation class and associated facilities.
Defines various enumerations that describe declaration and type specifiers.
Defines the clang::TypeLoc interface and its subclasses.
C Language Family Type Representation.
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
APValue & getArrayInitializedElt(unsigned I)
APValue & getStructField(unsigned i)
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
const ConstantArrayType * getAsConstantArrayType(QualType T) const
unsigned getIntWidth(QualType T) const
QualType getTagDeclType(const TagDecl *Decl) const
Return the unique reference to the type for the specified TagDecl (struct/union/class/enum) decl.
DeclarationNameTable DeclarationNames
CanQualType getCanonicalType(QualType T) const
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
overridden_method_range overridden_methods(const CXXMethodDecl *Method) const
QualType getTypeDeclType(const TypeDecl *Decl, const TypeDecl *PrevDecl=nullptr) const
Return the unique reference to the type for the specified type declaration.
const LangOptions & getLangOpts() const
QualType getBaseElementType(const ArrayType *VAT) const
Return the innermost element type of an array type.
overridden_cxx_method_iterator overridden_methods_end(const CXXMethodDecl *Method) const
llvm::BumpPtrAllocator & getAllocator() const
void addOverriddenMethod(const CXXMethodDecl *Method, const CXXMethodDecl *Overridden)
Note that the given C++ Method overrides the given Overridden method.
CanQualType getSizeType() const
Return the unique type for "size_t" (C99 7.17), defined in <stddef.h>.
bool hasSameUnqualifiedType(QualType T1, QualType T2) const
Determine whether the given types are equivalent after cvr-qualifiers have been removed.
void * Allocate(size_t Size, unsigned Align=8) const
unsigned overridden_methods_size(const CXXMethodDecl *Method) const
overridden_cxx_method_iterator overridden_methods_begin(const CXXMethodDecl *Method) const
const TargetInfo & getTargetInfo() const
void addDestruction(T *Ptr) const
If T isn't trivially destructible, calls AddDeallocation to register it for destruction.
ExternalASTSource * getExternalSource() const
Retrieve a pointer to the external AST source associated with this AST context, if any.
An abstract interface that should be implemented by listeners that want to be notified when an AST en...
An UnresolvedSet-like class which uses the ASTContext's allocator.
void append(ASTContext &C, iterator I, iterator E)
bool replace(const NamedDecl *Old, NamedDecl *New, AccessSpecifier AS)
Replaces the given declaration with the new one, once.
void addDecl(ASTContext &C, NamedDecl *D, AccessSpecifier AS)
Represents an access specifier followed by colon ':'.
static AccessSpecDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
QualType getElementType() const
Represents a C++ declaration that introduces decls from somewhere else.
void addShadowDecl(UsingShadowDecl *S)
shadow_range shadows() const
void removeShadowDecl(UsingShadowDecl *S)
A binding in a decomposition declaration.
VarDecl * getHoldingVar() const
Get the variable (if any) that holds the value of evaluating the binding.
Expr * getBinding() const
Get the expression to which this declaration is bound.
static BindingDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
static BindingDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation IdLoc, IdentifierInfo *Id)
Represents a base class of a C++ class.
Represents a C++ constructor within a class.
bool isExplicit() const
Return true if the declaration is already resolved to be explicit.
init_iterator init_begin()
Retrieve an iterator to the first initializer.
CXXConstructorDecl * getTargetConstructor() const
When this constructor delegates to another, retrieve the target.
static CXXConstructorDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, uint64_t AllocKind)
bool isDefaultConstructor() const
Whether this constructor is a default constructor (C++ [class.ctor]p5), which can be used to default-...
bool isDelegatingConstructor() const
Determine whether this constructor is a delegating constructor.
bool isSpecializationCopyingObject() const
Determine whether this is a member template specialization that would copy the object to itself.
bool isMoveConstructor() const
Determine whether this constructor is a move constructor (C++11 [class.copy]p3), which can be used to...
bool isCopyOrMoveConstructor() const
Determine whether this a copy or move constructor.
static CXXConstructorDecl * Create(ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, ExplicitSpecifier ES, bool UsesFPIntrin, bool isInline, bool isImplicitlyDeclared, ConstexprSpecKind ConstexprKind, InheritedConstructor Inherited=InheritedConstructor(), Expr *TrailingRequiresClause=nullptr)
bool isInheritingConstructor() const
Determine whether this is an implicit constructor synthesized to model a call to a constructor inheri...
CXXCtorInitializer *const * init_const_iterator
Iterates through the member/base initializer list.
bool isConvertingConstructor(bool AllowExplicit) const
Whether this constructor is a converting constructor (C++ [class.conv.ctor]), which can be used for u...
bool isCopyConstructor() const
Whether this constructor is a copy constructor (C++ [class.copy]p2, which can be used to copy the cla...
Represents a C++ conversion function within a class.
bool isLambdaToBlockPointerConversion() const
Determine whether this conversion function is a conversion from a lambda closure type to a block poin...
static CXXConversionDecl * Create(ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, bool UsesFPIntrin, bool isInline, ExplicitSpecifier ES, ConstexprSpecKind ConstexprKind, SourceLocation EndLocation, Expr *TrailingRequiresClause=nullptr)
QualType getConversionType() const
Returns the type that this conversion function is converting to.
static CXXConversionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a C++ base or member initializer.
SourceLocation getRParenLoc() const
SourceRange getSourceRange() const LLVM_READONLY
Determine the source range covering the entire initializer.
SourceLocation getSourceLocation() const
Determine the source location of the initializer.
bool isAnyMemberInitializer() const
bool isBaseInitializer() const
Determine whether this initializer is initializing a base class.
int64_t getID(const ASTContext &Context) const
bool isInClassMemberInitializer() const
Determine whether this initializer is an implicit initializer generated for a field with an initializ...
const Type * getBaseClass() const
If this is a base class initializer, returns the type of the base class.
SourceLocation getMemberLocation() const
FieldDecl * getAnyMember() const
TypeLoc getBaseClassLoc() const
If this is a base class initializer, returns the type of the base class with location information.
CXXCtorInitializer(ASTContext &Context, TypeSourceInfo *TInfo, bool IsVirtual, SourceLocation L, Expr *Init, SourceLocation R, SourceLocation EllipsisLoc)
Creates a new base-class initializer.
Represents a C++ deduction guide declaration.
static CXXDeductionGuideDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, ExplicitSpecifier ES, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, SourceLocation EndLocation, CXXConstructorDecl *Ctor=nullptr, DeductionCandidate Kind=DeductionCandidate::Normal)
static CXXDeductionGuideDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a C++ destructor within a class.
static CXXDestructorDecl * Create(ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, bool UsesFPIntrin, bool isInline, bool isImplicitlyDeclared, ConstexprSpecKind ConstexprKind, Expr *TrailingRequiresClause=nullptr)
static CXXDestructorDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setOperatorDelete(FunctionDecl *OD, Expr *ThisArg)
A mapping from each virtual member function to its set of final overriders.
Represents a static or instance method of a struct/union/class.
bool isExplicitObjectMemberFunction() const
[C++2b][dcl.fct]/p7 An explicit object member function is a non-static member function with an explic...
CXXMethodDecl * getCorrespondingMethodDeclaredInClass(const CXXRecordDecl *RD, bool MayBeBase=false)
Find if RD declares a function that overrides this function, and if so, return it.
bool isImplicitObjectMemberFunction() const
[C++2b][dcl.fct]/p7 An implicit object member function is a non-static member function without an exp...
void addOverriddenMethod(const CXXMethodDecl *MD)
bool hasInlineBody() const
bool isUsualDeallocationFunction(SmallVectorImpl< const FunctionDecl * > &PreventedBy) const
Determine whether this is a usual deallocation function (C++ [basic.stc.dynamic.deallocation]p2),...
unsigned getNumExplicitParams() const
overridden_method_range overridden_methods() const
unsigned size_overridden_methods() const
const CXXMethodDecl *const * method_iterator
QualType getFunctionObjectParameterReferenceType() const
Return the type of the object pointed by this.
method_iterator begin_overridden_methods() const
const CXXRecordDecl * getParent() const
Return the parent of this method declaration, which is the class in which this method is defined.
QualType getThisType() const
Return the type of the this pointer.
bool isMoveAssignmentOperator() const
Determine whether this is a move assignment operator.
static CXXMethodDecl * Create(ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, StorageClass SC, bool UsesFPIntrin, bool isInline, ConstexprSpecKind ConstexprKind, SourceLocation EndLocation, Expr *TrailingRequiresClause=nullptr)
CXXMethodDecl * getDevirtualizedMethod(const Expr *Base, bool IsAppleKext)
If it's possible to devirtualize a call to this method, return the called function.
static bool isStaticOverloadedOperator(OverloadedOperatorKind OOK)
Returns true if the given operator is implicitly static in a record context.
CXXMethodDecl * getCorrespondingMethodInClass(const CXXRecordDecl *RD, bool MayBeBase=false)
Find the method in RD that corresponds to this one.
llvm::iterator_range< llvm::TinyPtrVector< const CXXMethodDecl * >::const_iterator > overridden_method_range
bool isCopyAssignmentOperator() const
Determine whether this is a copy-assignment operator, regardless of whether it was declared implicitl...
static CXXMethodDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
method_iterator end_overridden_methods() const
CXXMethodDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
bool isLambdaStaticInvoker() const
Determine whether this is a lambda closure type's static member function that is used for the result ...
Represents a C++ struct/union/class.
Decl * getLambdaContextDecl() const
Retrieve the declaration that provides additional context for a lambda, when the normal declaration c...
bool mayBeAbstract() const
Determine whether this class may end up being abstract, even though it is not yet known to be abstrac...
bool isTriviallyCopyable() const
Determine whether this class is considered trivially copyable per (C++11 [class]p6).
bool hasNonTrivialCopyAssignment() const
Determine whether this class has a non-trivial copy assignment operator (C++ [class....
TemplateParameterList * getGenericLambdaTemplateParameterList() const
Retrieve the generic lambda's template parameter list.
bool isEffectivelyFinal() const
Determine whether it's impossible for a class to be derived from this class.
bool hasSimpleMoveConstructor() const
true if we know for sure that this class has a single, accessible, unambiguous move constructor that ...
bool isAggregate() const
Determine whether this class is an aggregate (C++ [dcl.init.aggr]), which is a class with no user-dec...
bool hasTrivialDefaultConstructor() const
Determine whether this class has a trivial default constructor (C++11 [class.ctor]p5).
void setBases(CXXBaseSpecifier const *const *Bases, unsigned NumBases)
Sets the base classes of this struct or class.
bool isGenericLambda() const
Determine whether this class describes a generic lambda function object (i.e.
base_class_iterator bases_end()
bool hasTrivialDestructor() const
Determine whether this class has a trivial destructor (C++ [class.dtor]p3)
bool hasUserDeclaredDestructor() const
Determine whether this class has a user-declared destructor.
CXXRecordDecl * getInstantiatedFromMemberClass() const
If this record is an instantiation of a member class, retrieves the member class from which it was in...
void completeDefinition() override
Indicates that the definition of this class is now complete.
bool isLiteral() const
Determine whether this class is a literal type.
bool defaultedDestructorIsConstexpr() const
Determine whether a defaulted default constructor for this class would be constexpr.
void setCaptures(ASTContext &Context, ArrayRef< LambdaCapture > Captures)
Set the captures for this lambda closure type.
unsigned getDeviceLambdaManglingNumber() const
Retrieve the device side mangling number.
bool hasAnyDependentBases() const
Determine whether this class has any dependent base classes which are not the current instantiation.
void setTrivialForCallFlags(CXXMethodDecl *MD)
bool isLambda() const
Determine whether this class describes a lambda function object.
void addedSelectedDestructor(CXXDestructorDecl *DD)
Notify the class that this destructor is now selected.
bool hasFriends() const
Determines whether this record has any friends.
method_range methods() const
CXXRecordDecl * getDefinition() const
static AccessSpecifier MergeAccess(AccessSpecifier PathAccess, AccessSpecifier DeclAccess)
Calculates the access of a decl that is reached along a path.
void getCaptureFields(llvm::DenseMap< const ValueDecl *, FieldDecl * > &Captures, FieldDecl *&ThisCapture) const
For a closure type, retrieve the mapping from captured variables and this to the non-static data memb...
bool hasConstexprNonCopyMoveConstructor() const
Determine whether this class has at least one constexpr constructor other than the copy or move const...
static CXXRecordDecl * CreateLambda(const ASTContext &C, DeclContext *DC, TypeSourceInfo *Info, SourceLocation Loc, unsigned DependencyKind, bool IsGeneric, LambdaCaptureDefault CaptureDefault)
llvm::iterator_range< conversion_iterator > getVisibleConversionFunctions() const
Get all conversion functions visible in current class, including conversion function templates.
bool hasConstexprDestructor() const
Determine whether this class has a constexpr destructor.
unsigned getNumBases() const
Retrieves the number of base classes of this class.
bool hasNonLiteralTypeFieldsOrBases() const
Determine whether this class has a non-literal or/ volatile type non-static data member or base class...
static CXXRecordDecl * Create(const ASTContext &C, TagKind TK, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, CXXRecordDecl *PrevDecl=nullptr, bool DelayTypeCreation=false)
bool isTriviallyCopyConstructible() const
Determine whether this class is considered trivially copyable per.
bool isCapturelessLambda() const
const CXXRecordDecl * getTemplateInstantiationPattern() const
Retrieve the record declaration from which this record could be instantiated.
bool lambdaIsDefaultConstructibleAndAssignable() const
Determine whether this lambda should have an implicit default constructor and copy and move assignmen...
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine whether this particular class is a specialization or instantiation of a class template or m...
base_class_iterator bases_begin()
FunctionTemplateDecl * getDependentLambdaCallOperator() const
Retrieve the dependent lambda call operator of the closure type if this is a templated closure type.
void addedEligibleSpecialMemberFunction(const CXXMethodDecl *MD, unsigned SMKind)
Notify the class that an eligible SMF has been added.
conversion_iterator conversion_end() const
void finishedDefaultedOrDeletedMember(CXXMethodDecl *MD)
Indicates that the declaration of a defaulted or deleted special member function is now complete.
CXXRecordDecl(Kind K, TagKind TK, const ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, CXXRecordDecl *PrevDecl)
bool isCLike() const
True if this class is C-like, without C++-specific features, e.g.
void setInstantiationOfMemberClass(CXXRecordDecl *RD, TemplateSpecializationKind TSK)
Specify that this record is an instantiation of the member class RD.
static CXXRecordDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID)
bool hasSimpleMoveAssignment() const
true if we know for sure that this class has a single, accessible, unambiguous move assignment operat...
bool hasNonTrivialMoveConstructor() const
Determine whether this class has a non-trivial move constructor (C++11 [class.copy]p12)
bool hasUserDeclaredConstructor() const
Determine whether this class has any user-declared constructors.
unsigned getODRHash() const
bool hasDefinition() const
ArrayRef< NamedDecl * > getLambdaExplicitTemplateParameters() const
Retrieve the lambda template parameters that were specified explicitly.
ClassTemplateDecl * getDescribedClassTemplate() const
Retrieves the class template that is described by this class declaration.
bool isPOD() const
Whether this class is a POD-type (C++ [class]p4)
void getFinalOverriders(CXXFinalOverriderMap &FinaOverriders) const
Retrieve the final overriders for each virtual member function in the class hierarchy where this clas...
void removeConversion(const NamedDecl *Old)
Removes a conversion function from this class.
bool hasSimpleCopyConstructor() const
true if we know for sure that this class has a single, accessible, unambiguous copy constructor that ...
CXXDestructorDecl * getDestructor() const
Returns the destructor decl for this class.
bool hasNonTrivialMoveAssignment() const
Determine whether this class has a non-trivial move assignment operator (C++11 [class....
CXXMethodDecl * getLambdaStaticInvoker() const
Retrieve the lambda static invoker, the address of which is returned by the conversion operator,...
bool hasSimpleDestructor() const
true if we know for sure that this class has an accessible destructor that is not deleted.
void setDescribedClassTemplate(ClassTemplateDecl *Template)
bool isInterfaceLike() const
void setLambdaNumbering(LambdaNumbering Numbering)
Set the mangling numbers and context declaration for a lambda class.
bool forallBases(ForallBasesCallback BaseMatches) const
Determines if the given callback holds for all the direct or indirect base classes of this type.
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this class is an instantiation of a member class of a class template specialization,...
bool hasNonTrivialCopyConstructor() const
Determine whether this class has a non-trivial copy constructor (C++ [class.copy]p6,...
CXXMethodDecl * getLambdaCallOperator() const
Retrieve the lambda call operator of the closure type if this is a closure type.
bool hasSimpleCopyAssignment() const
true if we know for sure that this class has a single, accessible, unambiguous copy assignment operat...
CXXRecordDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
void setTemplateSpecializationKind(TemplateSpecializationKind TSK)
Set the kind of specialization or template instantiation this is.
unsigned getNumVBases() const
Retrieves the number of virtual base classes of this class.
conversion_iterator conversion_begin() const
unsigned getCVRQualifiers() const
Retrieve the const/volatile/restrict qualifiers.
CanQual< T > getUnqualifiedType() const
Retrieve the unqualified form of this type.
Declaration of a class template.
Represents the canonical version of C arrays with a specified constant size.
llvm::APInt getSize() const
Return the constant array size as an APInt.
Represents a shadow constructor declaration introduced into a class by a C++11 using-declaration that...
static ConstructorUsingShadowDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
UsingDecl * getIntroducer() const
Override the UsingShadowDecl's getIntroducer, returning the UsingDecl that introduced this.
static ConstructorUsingShadowDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation Loc, UsingDecl *Using, NamedDecl *Target, bool IsVirtual)
CXXRecordDecl * getNominatedBaseClass() const
Get the base class that was named in the using declaration.
The results of name lookup within a DeclContext.
specific_decl_iterator - Iterates over a subrange of declarations stored in a DeclContext,...
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
DeclContext * getParent()
getParent - Returns the containing DeclContext.
ASTContext & getParentASTContext() const
bool isDependentContext() const
Determines whether this context is dependent on a template parameter.
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
bool isTranslationUnit() const
bool isFunctionOrMethod() const
bool isExternCContext() const
Determines whether this context or some of its ancestors is a linkage specification context that spec...
LinkageSpecDeclBitfields LinkageSpecDeclBits
Decl - This represents one declaration (or definition), e.g.
Decl * getPreviousDecl()
Retrieve the previous declaration that declares the same entity as this declaration,...
SourceLocation getEndLoc() const LLVM_READONLY
FriendObjectKind getFriendObjectKind() const
Determines whether this declaration is the object of a friend declaration and, if so,...
ASTContext & getASTContext() const LLVM_READONLY
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
ASTMutationListener * getASTMutationListener() const
Kind
Lists the kind of concrete classes of Decl.
bool isCanonicalDecl() const
Whether this particular Decl is a canonical one.
FunctionDecl * getAsFunction() LLVM_READONLY
Returns the function itself, or the templated function if this is a function template.
bool isInvalidDecl() const
SourceLocation getLocation() const
void setImplicit(bool I=true)
DeclContext * getDeclContext()
AccessSpecifier getAccess() const
const LangOptions & getLangOpts() const LLVM_READONLY
Helper to get the language options from the ASTContext.
The name of a declaration.
IdentifierInfo * getAsIdentifierInfo() const
Retrieve the IdentifierInfo * stored in this declaration name, or null if this declaration name isn't...
OverloadedOperatorKind getCXXOverloadedOperator() const
If this name is the name of an overloadable operator in C++ (e.g., operator+), retrieve the kind of o...
@ CXXConversionFunctionName
NameKind getNameKind() const
Determine what kind of name this is.
bool isIdentifier() const
Predicate functions for querying what type of name this is.
A decomposition declaration.
void printName(raw_ostream &OS, const PrintingPolicy &Policy) const override
Pretty-print the unqualified name of this declaration.
ArrayRef< BindingDecl * > bindings() const
static DecompositionDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation LSquareLoc, QualType T, TypeSourceInfo *TInfo, StorageClass S, ArrayRef< BindingDecl * > Bindings)
static DecompositionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumBindings)
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of enums.
Store information needed for an explicit specifier.
ExplicitSpecKind getKind() const
const Expr * getExpr() const
static ExplicitSpecifier getFromDecl(FunctionDecl *Function)
bool isEquivalent(const ExplicitSpecifier Other) const
Check for equivalence of explicit specifiers.
This represents one expression.
Expr * IgnoreImplicit() LLVM_READONLY
Skip past any implicit AST nodes which might surround this expression until reaching a fixed point.
Abstract interface for external sources of AST nodes.
virtual Decl * GetExternalDecl(GlobalDeclID ID)
Resolve a declaration ID into a declaration, potentially building a new declaration.
Represents a member of a struct/union/class.
Expr * getInClassInitializer() const
Get the C++11 default member initializer for this member, or null if one has not been set.
Represents a function declaration or definition.
const ParmVarDecl * getParamDecl(unsigned i) const
bool isTrivialForCall() const
unsigned getMinRequiredArguments() const
Returns the minimum number of arguments needed to call this function.
FunctionTemplateDecl * getDescribedFunctionTemplate() const
Retrieves the function template that is described by this function declaration.
bool isDestroyingOperatorDelete() const
Determine whether this is a destroying operator delete.
bool hasCXXExplicitFunctionObjectParameter() const
bool UsesFPIntrin() const
Determine whether the function was declared in source context that requires constrained FP intrinsics...
ArrayRef< ParmVarDecl * > parameters() const
FunctionDecl * getTemplateInstantiationPattern(bool ForDefinition=true) const
Retrieve the function declaration from which this function could be instantiated, if it is an instant...
bool isTrivial() const
Whether this function is "trivial" in some specialized C++ senses.
FunctionTemplateDecl * getPrimaryTemplate() const
Retrieve the primary template that this function template specialization either specializes or was in...
const ParmVarDecl * getNonObjectParameter(unsigned I) const
bool isVariadic() const
Whether this function is variadic.
bool doesThisDeclarationHaveABody() const
Returns whether this specific declaration of the function has a body.
bool isDeleted() const
Whether this function has been deleted.
StorageClass getStorageClass() const
Returns the storage class as written in the source.
bool isOutOfLine() const override
Determine whether this is or was instantiated from an out-of-line definition of a member function.
bool isPureVirtual() const
Whether this virtual function is pure, i.e.
bool isIneligibleOrNotSelected() const
void setIneligibleOrNotSelected(bool II)
OverloadedOperatorKind getOverloadedOperator() const
getOverloadedOperator - Which C++ overloaded operator this function represents, if any.
bool isUserProvided() const
True if this method is user-declared and was not deleted or defaulted on its first declaration.
bool hasOneParamOrDefaultArgs() const
Determine whether this function has a single parameter, or multiple parameters where all but the firs...
unsigned getNumParams() const
Return the number of parameters this function must have based on its FunctionType.
bool isDefined(const FunctionDecl *&Definition, bool CheckForPendingFriendDefinition=false) const
Returns true if the function has a definition that does not need to be instantiated.
bool willHaveBody() const
True if this function will eventually have a body, once it's fully parsed.
Represents a prototype with parameter type info, e.g.
Qualifiers getMethodQuals() const
RefQualifierKind getRefQualifier() const
Retrieve the ref-qualifier associated with this function type.
Declaration of a template function.
FunctionType - C99 6.7.5.3 - Function Declarators.
One of these records is kept for each identifier that is lexed.
IdentifierInfo & get(StringRef Name)
Return the identifier token info for the specified named identifier.
Represents a field injected from an anonymous union/struct into the parent scope.
Description of a constructor that was inherited from a base class.
An lvalue reference type, per C++11 [dcl.ref].
Describes the capture of a variable or of this, or of a C++1y init-capture.
@ Ver6
Attempt to be ABI-compatible with code generated by Clang 6.0.x (SVN r321711).
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
APValue * getOrCreateValue(bool MayCreate) const
Get the storage for the constant value of a materialized temporary of static storage duration.
StorageDuration getStorageDuration() const
Retrieve the storage duration for the materialized temporary.
ValueDecl * getExtendingDecl()
Represents a linkage specification.
static LinkageSpecDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation ExternLoc, SourceLocation LangLoc, LinkageSpecLanguageIDs Lang, bool HasBraces)
static LinkageSpecDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
APValue & getAsAPValue() const
Get the value of this MSGuidDecl as an APValue.
void printName(llvm::raw_ostream &OS, const PrintingPolicy &Policy) const override
Print this UUID in a human-readable format.
An instance of this class represents the declaration of a property member.
static MSPropertyDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName N, QualType T, TypeSourceInfo *TInfo, SourceLocation StartL, IdentifierInfo *Getter, IdentifierInfo *Setter)
static MSPropertyDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
A pointer to member type per C++ 8.3.3 - Pointers to members.
Provides information a specialization of a member of a class template, which may be a member function...
This represents a decl that may have a name.
NamedDecl * getUnderlyingDecl()
Looks through UsingDecls and ObjCCompatibleAliasDecls for the underlying named decl.
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
NamedDecl * getMostRecentDecl()
Represents a C++ namespace alias.
static NamespaceAliasDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
static NamespaceAliasDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation NamespaceLoc, SourceLocation AliasLoc, IdentifierInfo *Alias, NestedNameSpecifierLoc QualifierLoc, SourceLocation IdentLoc, NamedDecl *Namespace)
Represent a C++ namespace.
bool isOriginalNamespace() const
Return true if this declaration is an original (first) declaration of the namespace.
NamespaceDecl * getOriginalNamespace()
Get the original (first) namespace declaration.
static NamespaceDecl * Create(ASTContext &C, DeclContext *DC, bool Inline, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, NamespaceDecl *PrevDecl, bool Nested)
static NamespaceDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
A C++ nested-name-specifier augmented with source location information.
SourceLocation getBeginLoc() const
Retrieve the location of the beginning of this nested-name-specifier.
CXXRecordDecl * getAsRecordDecl() const
Retrieve the record declaration stored in this nested name specifier.
void AddStmt(const Stmt *S)
void AddCXXRecordDecl(const CXXRecordDecl *Record)
MapType::iterator iterator
Represents a parameter to a function.
A (possibly-)qualified type.
void addRestrict()
Add the restrict qualifier to this QualType.
void removeLocalRestrict()
@ OCL_Strong
Assigning into this object requires the old value to be released and the new value to be retained.
@ OCL_Weak
Reading or writing from this object requires a barrier call.
Represents a struct/union/class.
void setArgPassingRestrictions(RecordArgPassingKind Kind)
field_iterator field_end() const
field_range fields() const
void setHasObjectMember(bool val)
void setHasVolatileMember(bool val)
virtual void completeDefinition()
Note that the definition of this type is now complete.
RecordDecl * getDefinition() const
Returns the RecordDecl that actually defines this struct/union/class.
field_iterator field_begin() const
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of structs/unions/cl...
RecordDecl * getDecl() const
FunctionDecl * getFirstDecl()
Return the first declaration of this declaration or itself if this is the only declaration.
NamespaceDecl * getNextRedeclaration() const
NamespaceDecl * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
bool isFirstDecl() const
True if this is the first declaration in its redeclaration chain.
Base for LValueReferenceType and RValueReferenceType.
Represents the body of a requires-expression.
static RequiresExprBodyDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc)
static RequiresExprBodyDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Encodes a location in the source.
A trivial tuple used to represent a source range.
Represents a C++11 static_assert declaration.
static StaticAssertDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StaticAssertLoc, Expr *AssertExpr, Expr *Message, SourceLocation RParenLoc, bool Failed)
static StaticAssertDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
The streaming interface shared between DiagnosticBuilder and PartialDiagnostic.
bool isBeingDefined() const
Return true if this decl is currently being defined.
void setMayHaveOutOfDateDef(bool V=true)
Indicates whether it is possible for declarations of this kind to have an out-of-date definition.
void setBeingDefined(bool V=true)
True if this decl is currently being defined.
TagKind getTagKind() const
Exposes information about the current target.
virtual bool areDefaultedSMFStillPOD(const LangOptions &) const
Controls whether explicitly defaulted (= default) special member functions disqualify something from ...
Stores a list of template parameters for a TemplateDecl and its derived classes.
const Type * getTypeForDecl() const
Base wrapper for a particular "section" of type source info.
A container of type source information.
The base class of the type hierarchy.
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
bool isBlockPointerType() const
bool isLiteralType(const ASTContext &Ctx) const
Return true if this is a literal type (C++11 [basic.types]p10)
bool isUnsignedIntegerOrEnumerationType() const
Determines whether this is an integer type that is unsigned or an enumeration types whose underlying ...
bool isRValueReferenceType() const
const T * castAs() const
Member-template castAs<specific type>.
bool isReferenceType() const
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isLValueReferenceType() const
bool isStructuralType() const
Determine if this type is a structural type, per C++20 [temp.param]p7.
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
const T * getAs() const
Member-template getAs<specific type>'.
bool isRecordType() const
bool isObjCRetainableType() const
TagDecl * getAsTagDecl() const
Retrieves the TagDecl that this type refers to, either because the type is a TagType or because it is...
RecordDecl * getAsRecordDecl() const
Retrieves the RecordDecl this type refers to.
An artificial decl, representing a global anonymous constant value which is uniquified by value withi...
void printName(llvm::raw_ostream &OS, const PrintingPolicy &Policy) const override
Print this in a human-readable format.
A set of unresolved declarations.
void addDecl(NamedDecl *D)
The iterator over UnresolvedSets.
NamedDecl * getDecl() const
A set of unresolved declarations.
This node is generated when a using-declaration that was annotated with attribute((using_if_exists)) ...
static UnresolvedUsingIfExistsDecl * CreateDeserialized(ASTContext &Ctx, GlobalDeclID ID)
static UnresolvedUsingIfExistsDecl * Create(ASTContext &Ctx, DeclContext *DC, SourceLocation Loc, DeclarationName Name)
Represents a dependent using declaration which was marked with typename.
static UnresolvedUsingTypenameDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation UsingLoc, SourceLocation TypenameLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation TargetNameLoc, DeclarationName TargetName, SourceLocation EllipsisLoc)
static UnresolvedUsingTypenameDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a dependent using declaration which was not marked with typename.
bool isAccessDeclaration() const
Return true if it is a C++03 access declaration (no 'using').
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier that qualifies the name, with source-location information.
DeclarationNameInfo getNameInfo() const
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
static UnresolvedUsingValueDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation UsingLoc, NestedNameSpecifierLoc QualifierLoc, const DeclarationNameInfo &NameInfo, SourceLocation EllipsisLoc)
static UnresolvedUsingValueDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a C++ using-declaration.
bool isAccessDeclaration() const
Return true if it is a C++03 access declaration (no 'using').
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier that qualifies the name, with source-location information.
static UsingDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
DeclarationNameInfo getNameInfo() const
static UsingDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation UsingL, NestedNameSpecifierLoc QualifierLoc, const DeclarationNameInfo &NameInfo, bool HasTypenameKeyword)
NestedNameSpecifier * getQualifier() const
Retrieve the nested-name-specifier that qualifies the name.
Represents C++ using-directive.
static UsingDirectiveDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
static UsingDirectiveDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation UsingLoc, SourceLocation NamespaceLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation IdentLoc, NamedDecl *Nominated, DeclContext *CommonAncestor)
NamespaceDecl * getNominatedNamespace()
Returns the namespace nominated by this using-directive.
Represents a C++ using-enum-declaration.
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
static UsingEnumDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
static UsingEnumDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation UsingL, SourceLocation EnumL, SourceLocation NameL, TypeSourceInfo *EnumType)
Represents a pack of using declarations that a single using-declarator pack-expanded into.
static UsingPackDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumExpansions)
static UsingPackDecl * Create(ASTContext &C, DeclContext *DC, NamedDecl *InstantiatedFrom, ArrayRef< NamedDecl * > UsingDecls)
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
void setTargetDecl(NamedDecl *ND)
Sets the underlying declaration which has been brought into the local scope.
UsingShadowDecl(Kind K, ASTContext &C, DeclContext *DC, SourceLocation Loc, DeclarationName Name, BaseUsingDecl *Introducer, NamedDecl *Target)
static UsingShadowDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
BaseUsingDecl * getIntroducer() const
Gets the (written or instantiated) using declaration that introduced this declaration.
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
VarDecl * getPotentiallyDecomposedVarDecl()
Represents a variable declaration or definition.
Defines the clang::TargetInfo interface.
The JSON file list parser is used to communicate input to InstallAPI.
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
bool isTemplateInstantiation(TemplateSpecializationKind Kind)
Determine whether this template specialization kind refers to an instantiation of an entity (as oppos...
ConstexprSpecKind
Define the kind of constexpr specifier.
LinkageSpecLanguageIDs
Represents the language in a linkage specification.
RefQualifierKind
The kind of C++11 ref-qualifier associated with a function type.
@ RQ_RValue
An rvalue ref-qualifier was provided (&&).
StorageClass
Storage classes.
const StreamingDiagnostic & operator<<(const StreamingDiagnostic &DB, const ASTContext::SectionInfo &Section)
Insertion operator for diagnostics.
StorageDuration
The storage duration for an object (per C++ [basic.stc]).
@ SD_Static
Static storage duration.
@ SD_FullExpression
Full-expression storage duration (for temporaries).
@ SD_Automatic
Automatic storage duration (most local variables).
@ Result
The result type of a method or function.
TagTypeKind
The kind of a tag type.
@ Interface
The "__interface" keyword.
@ Struct
The "struct" keyword.
@ Class
The "class" keyword.
@ CanNeverPassInRegs
The argument of this type cannot be passed directly in registers.
LambdaCaptureDefault
The default, if any, capture method for a lambda expression.
StringRef getLambdaStaticInvokerName()
const FunctionProtoType * T
DeductionCandidate
Only used by CXXDeductionGuideDecl.
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
@ TSK_Undeclared
This template specialization was formed from a template-id but has not yet been declared,...
CallingConv
CallingConv - Specifies the calling convention that a function uses.
U cast(CodeGen::Address addr)
@ Other
Other implicit parameter.
AccessSpecifier
A C++ access specifier (public, private, protected), plus the special value "none" which means differ...
__UINTPTR_TYPE__ uintptr_t
An unsigned integer type with the property that any valid pointer to void can be converted to this ty...
Information about how a lambda is numbered within its context.
unsigned DeviceManglingNumber
bool HasKnownInternalLinkage
A placeholder type used to construct an empty shell of a decl-derived type that will be filled in lat...
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
DeclarationName getName() const
getName - Returns the embedded declaration name.
T * get(ExternalASTSource *Source) const
Retrieve the pointer to the AST node that this lazy pointer points to.
uint16_t Part2
...-89ab-...
uint32_t Part1
{01234567-...
uint16_t Part3
...-cdef-...
uint8_t Part4And5[8]
...-0123-456789abcdef}
Describes how types, statements, expressions, and declarations should be printed.