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() {}
64void LazyASTUnresolvedSet::getFromExternalSource(
ASTContext &
C)
const {
66 assert(Impl.Decls.isLazy() &&
"getFromExternalSource for non-lazy set");
67 assert(Source &&
"getFromExternalSource with no external source");
71 reinterpret_cast<uintptr_t>(I.getDecl()) >> 2)));
72 Impl.Decls.setLazy(
false);
75CXXRecordDecl::DefinitionData::DefinitionData(
CXXRecordDecl *D)
76 : UserDeclaredConstructor(
false), UserDeclaredSpecialMembers(0),
78 Abstract(
false), IsStandardLayout(
true), IsCXX11StandardLayout(
true),
79 HasBasesWithFields(
false), HasBasesWithNonStaticDataMembers(
false),
80 HasPrivateFields(
false), HasProtectedFields(
false),
81 HasPublicFields(
false), HasMutableFields(
false), HasVariantMembers(
false),
82 HasOnlyCMembers(
true), HasInitMethod(
false), HasInClassInitializer(
false),
83 HasUninitializedReferenceMember(
false), HasUninitializedFields(
false),
84 HasInheritedConstructor(
false), HasInheritedDefaultConstructor(
false),
85 HasInheritedAssignment(
false),
86 NeedOverloadResolutionForCopyConstructor(
false),
87 NeedOverloadResolutionForMoveConstructor(
false),
88 NeedOverloadResolutionForCopyAssignment(
false),
89 NeedOverloadResolutionForMoveAssignment(
false),
90 NeedOverloadResolutionForDestructor(
false),
91 DefaultedCopyConstructorIsDeleted(
false),
92 DefaultedMoveConstructorIsDeleted(
false),
93 DefaultedCopyAssignmentIsDeleted(
false),
94 DefaultedMoveAssignmentIsDeleted(
false),
95 DefaultedDestructorIsDeleted(
false), HasTrivialSpecialMembers(SMF_All),
96 HasTrivialSpecialMembersForCall(SMF_All),
97 DeclaredNonTrivialSpecialMembers(0),
98 DeclaredNonTrivialSpecialMembersForCall(0), HasIrrelevantDestructor(
true),
99 HasConstexprNonCopyMoveConstructor(
false),
100 HasDefaultedDefaultConstructor(
false),
101 DefaultedDefaultConstructorIsConstexpr(
true),
102 HasConstexprDefaultConstructor(
false),
103 DefaultedDestructorIsConstexpr(
true),
104 HasNonLiteralTypeFieldsOrBases(
false), StructuralIfLiteral(
true),
105 UserProvidedDefaultConstructor(
false), DeclaredSpecialMembers(0),
106 ImplicitCopyConstructorCanHaveConstParamForVBase(
true),
107 ImplicitCopyConstructorCanHaveConstParamForNonVBase(
true),
108 ImplicitCopyAssignmentHasConstParam(
true),
109 HasDeclaredCopyConstructorWithConstParam(
false),
110 HasDeclaredCopyAssignmentWithConstParam(
false),
111 IsAnyDestructorNoReturn(
false), IsLambda(
false),
112 IsParsingBaseSpecifiers(
false), ComputedVisibleConversions(
false),
116 return Bases.get(
Definition->getASTContext().getExternalSource());
120 return VBases.get(
Definition->getASTContext().getExternalSource());
128 DefinitionData(PrevDecl ? PrevDecl->DefinitionData
135 bool DelayTypeCreation) {
141 if (!DelayTypeCreation)
142 C.getTypeDeclType(R, PrevDecl);
149 unsigned DependencyKind,
bool IsGeneric,
152 Loc,
nullptr,
nullptr);
154 R->DefinitionData =
new (
C)
struct LambdaDefinitionData(
155 R, Info, DependencyKind, IsGeneric, CaptureDefault);
156 R->setMayHaveOutOfDateDef(
false);
157 R->setImplicit(
true);
159 C.getTypeDeclType(R,
nullptr);
165 auto *R =
new (
C, ID)
178 while (!WorkList.empty()) {
183 if (
const CXXRecordDecl *B = BaseSpec.getType()->getAsCXXRecordDecl()) {
184 if (!SeenBaseTypes.insert(B).second)
186 WorkList.push_back(B);
198 if (!data().Bases.isOffset() && data().NumBases > 0)
199 C.Deallocate(data().getBases());
202 if (!
C.getLangOpts().CPlusPlus17) {
205 data().Aggregate =
false;
210 data().PlainOldData =
false;
220 data().NumBases = NumBases;
221 for (
unsigned i = 0; i < NumBases; ++i) {
222 data().getBases()[i] = *Bases[i];
229 auto *BaseClassDecl =
237 if (BaseClassDecl->data().HasBasesWithFields ||
238 !BaseClassDecl->field_empty()) {
239 if (data().HasBasesWithFields)
241 data().IsStandardLayout =
false;
242 data().HasBasesWithFields =
true;
249 if (BaseClassDecl->data().HasBasesWithNonStaticDataMembers ||
250 BaseClassDecl->hasDirectFields()) {
251 if (data().HasBasesWithNonStaticDataMembers)
252 data().IsCXX11StandardLayout =
false;
253 data().HasBasesWithNonStaticDataMembers =
true;
256 if (!BaseClassDecl->isEmpty()) {
260 data().Empty =
false;
266 data().Aggregate =
false;
271 data().StructuralIfLiteral =
false;
277 if (BaseClassDecl->isPolymorphic()) {
278 data().Polymorphic =
true;
281 data().Aggregate =
false;
287 if (!BaseClassDecl->isStandardLayout())
288 data().IsStandardLayout =
false;
289 if (!BaseClassDecl->isCXX11StandardLayout())
290 data().IsCXX11StandardLayout =
false;
294 data().HasNonLiteralTypeFieldsOrBases =
true;
297 for (
const auto &VBase : BaseClassDecl->vbases()) {
299 if (SeenVBaseTypes.insert(
C.getCanonicalType(VBase.getType())).second) {
300 VBases.push_back(&VBase);
307 if (
CXXRecordDecl *VBaseDecl = VBase.getType()->getAsCXXRecordDecl())
308 if (!VBaseDecl->hasCopyConstructorWithConstParam())
309 data().ImplicitCopyConstructorCanHaveConstParamForVBase =
false;
313 data().Aggregate =
false;
317 if (
Base->isVirtual()) {
319 if (SeenVBaseTypes.insert(
C.getCanonicalType(BaseType)).second)
320 VBases.push_back(
Base);
325 data().Empty =
false;
329 data().Aggregate =
false;
335 data().HasTrivialSpecialMembers &= SMF_Destructor;
336 data().HasTrivialSpecialMembersForCall &= SMF_Destructor;
341 data().IsStandardLayout =
false;
342 data().IsCXX11StandardLayout =
false;
348 data().DefaultedDefaultConstructorIsConstexpr =
false;
349 data().DefaultedDestructorIsConstexpr =
false;
356 if (!BaseClassDecl->hasCopyConstructorWithConstParam())
357 data().ImplicitCopyConstructorCanHaveConstParamForVBase =
false;
363 if (!BaseClassDecl->hasTrivialDefaultConstructor())
364 data().HasTrivialSpecialMembers &= ~SMF_DefaultConstructor;
371 if (!BaseClassDecl->hasTrivialCopyConstructor())
372 data().HasTrivialSpecialMembers &= ~SMF_CopyConstructor;
374 if (!BaseClassDecl->hasTrivialCopyConstructorForCall())
375 data().HasTrivialSpecialMembersForCall &= ~SMF_CopyConstructor;
381 if (!BaseClassDecl->hasTrivialMoveConstructor())
382 data().HasTrivialSpecialMembers &= ~SMF_MoveConstructor;
384 if (!BaseClassDecl->hasTrivialMoveConstructorForCall())
385 data().HasTrivialSpecialMembersForCall &= ~SMF_MoveConstructor;
392 if (!BaseClassDecl->hasTrivialCopyAssignment())
393 data().HasTrivialSpecialMembers &= ~SMF_CopyAssignment;
398 if (!BaseClassDecl->hasTrivialMoveAssignment())
399 data().HasTrivialSpecialMembers &= ~SMF_MoveAssignment;
405 if (!BaseClassDecl->hasConstexprDefaultConstructor())
406 data().DefaultedDefaultConstructorIsConstexpr =
407 C.getLangOpts().CPlusPlus23;
414 if (!BaseClassDecl->hasCopyConstructorWithConstParam())
415 data().ImplicitCopyConstructorCanHaveConstParamForNonVBase =
false;
421 if (!BaseClassDecl->hasTrivialDestructor())
422 data().HasTrivialSpecialMembers &= ~SMF_Destructor;
424 if (!BaseClassDecl->hasTrivialDestructorForCall())
425 data().HasTrivialSpecialMembersForCall &= ~SMF_Destructor;
427 if (!BaseClassDecl->hasIrrelevantDestructor())
428 data().HasIrrelevantDestructor =
false;
430 if (BaseClassDecl->isAnyDestructorNoReturn())
431 data().IsAnyDestructorNoReturn =
true;
438 if (!BaseClassDecl->hasCopyAssignmentWithConstParam())
439 data().ImplicitCopyAssignmentHasConstParam =
false;
443 if (BaseClassDecl->hasObjectMember())
446 if (BaseClassDecl->hasVolatileMember())
449 if (BaseClassDecl->getArgPassingRestrictions() ==
454 if (BaseClassDecl->hasMutableFields())
455 data().HasMutableFields =
true;
457 if (BaseClassDecl->hasUninitializedReferenceMember())
458 data().HasUninitializedReferenceMember =
true;
460 if (!BaseClassDecl->allowConstDefaultInit())
461 data().HasUninitializedFields =
true;
463 addedClassSubobject(BaseClassDecl);
474 data().IsStandardLayout =
false;
476 if (VBases.empty()) {
477 data().IsParsingBaseSpecifiers =
false;
483 data().NumVBases = VBases.size();
484 for (
int I = 0, E = VBases.size(); I != E; ++I) {
488 data().getVBases()[I] = *VBases[I];
491 data().IsParsingBaseSpecifiers =
false;
495 assert(
hasDefinition() &&
"ODRHash only for records with definitions");
498 if (DefinitionData->HasODRHash)
499 return DefinitionData->ODRHash;
504 DefinitionData->HasODRHash =
true;
507 return DefinitionData->ODRHash;
510void CXXRecordDecl::addedClassSubobject(
CXXRecordDecl *Subobj) {
518 data().NeedOverloadResolutionForCopyConstructor =
true;
520 data().NeedOverloadResolutionForMoveConstructor =
true;
529 data().NeedOverloadResolutionForCopyAssignment =
true;
531 data().NeedOverloadResolutionForMoveAssignment =
true;
541 data().NeedOverloadResolutionForCopyConstructor =
true;
542 data().NeedOverloadResolutionForMoveConstructor =
true;
543 data().NeedOverloadResolutionForDestructor =
true;
552 data().DefaultedDestructorIsConstexpr =
559 if (!Subobj->data().StructuralIfLiteral)
560 data().StructuralIfLiteral =
false;
605void CXXRecordDecl::markedVirtualFunctionPure() {
608 data().Abstract =
true;
611bool CXXRecordDecl::hasSubobjectAtOffsetZeroOfEmptyBaseType(
622 RD = RD->getCanonicalDecl();
630 if (!RD->data().HasBasesWithFields) {
649 if (M.insert(RD).second)
650 WorkList.push_back(RD);
657 while (!WorkList.empty()) {
667 bool IsFirstField =
true;
668 for (
auto *FD :
X->fields()) {
671 if (FD->isUnnamedBitfield())
674 if (!IsFirstField && !FD->isZeroSize(Ctx))
684 IsFirstField =
false;
692 assert(
isLambda() &&
"not a lambda");
709void CXXRecordDecl::addedMember(
Decl *D) {
710 if (!D->
isImplicit() && !isa<FieldDecl>(D) && !isa<IndirectFieldDecl>(D) &&
714 data().HasOnlyCMembers =
false;
720 auto *FunTmpl = dyn_cast<FunctionTemplateDecl>(D);
722 D = FunTmpl->getTemplatedDecl();
725 Decl *DUnderlying = D;
726 if (
auto *ND = dyn_cast<NamedDecl>(DUnderlying)) {
727 DUnderlying = ND->getUnderlyingDecl();
728 if (
auto *UnderlyingFunTmpl = dyn_cast<FunctionTemplateDecl>(DUnderlying))
729 DUnderlying = UnderlyingFunTmpl->getTemplatedDecl();
732 if (
const auto *Method = dyn_cast<CXXMethodDecl>(D)) {
733 if (Method->isVirtual()) {
736 data().Aggregate =
false;
740 data().PlainOldData =
false;
744 data().Empty =
false;
749 data().Polymorphic =
true;
755 data().HasTrivialSpecialMembers &= SMF_Destructor;
756 data().HasTrivialSpecialMembersForCall &= SMF_Destructor;
761 data().IsStandardLayout =
false;
762 data().IsCXX11StandardLayout =
false;
770 L->AddedCXXImplicitMember(data().
Definition, D);
776 if (
const auto *Constructor = dyn_cast<CXXConstructorDecl>(D)) {
783 data().UserDeclaredConstructor =
true;
793 data().PlainOldData =
false;
798 SMKind |= SMF_DefaultConstructor;
801 data().UserProvidedDefaultConstructor =
true;
803 data().HasConstexprDefaultConstructor =
true;
805 data().HasDefaultedDefaultConstructor =
true;
811 SMKind |= SMF_CopyConstructor;
814 data().HasDeclaredCopyConstructorWithConstParam =
true;
816 SMKind |= SMF_MoveConstructor;
828 data().Aggregate =
false;
833 if (
const auto *Constructor = dyn_cast<CXXConstructorDecl>(DUnderlying)) {
841 data().HasConstexprNonCopyMoveConstructor =
true;
842 if (!isa<CXXConstructorDecl>(D) &&
Constructor->isDefaultConstructor())
843 data().HasInheritedDefaultConstructor =
true;
847 if (
const auto *Method = dyn_cast<CXXMethodDecl>(D)) {
848 if (isa<CXXDestructorDecl>(D))
849 SMKind |= SMF_Destructor;
851 if (Method->isCopyAssignmentOperator()) {
852 SMKind |= SMF_CopyAssignment;
854 const auto *ParamTy =
855 Method->getNonObjectParameter(0)->getType()->getAs<
ReferenceType>();
856 if (!ParamTy || ParamTy->getPointeeType().isConstQualified())
857 data().HasDeclaredCopyAssignmentWithConstParam =
true;
860 if (Method->isMoveAssignmentOperator())
861 SMKind |= SMF_MoveAssignment;
864 if (
auto *Conversion = dyn_cast<CXXConversionDecl>(D)) {
873 if (Conversion->getPrimaryTemplate()) {
879 FunTmpl ? cast<NamedDecl>(FunTmpl) :
cast<
NamedDecl>(Conversion);
884 Conversions.
addDecl(Ctx, Primary, AS);
891 data().HasTrivialSpecialMembers &=
892 data().DeclaredSpecialMembers | ~SMKind;
893 data().HasTrivialSpecialMembersForCall &=
894 data().DeclaredSpecialMembers | ~SMKind;
898 data().DeclaredSpecialMembers |= SMKind;
899 if (!Method->isImplicit()) {
900 data().UserDeclaredSpecialMembers |= SMKind;
903 if ((!Method->isDeleted() && !Method->isDefaulted() &&
904 SMKind != SMF_MoveAssignment) ||
918 data().PlainOldData =
false;
926 if (!Method->isIneligibleOrNotSelected()) {
935 if (
const auto *Field = dyn_cast<FieldDecl>(D)) {
943 if (data().HasBasesWithFields)
944 data().IsStandardLayout =
false;
950 if (
Field->isUnnamedBitfield()) {
954 if (data().Empty && !
Field->isZeroLengthBitField(Context) &&
957 data().Empty =
false;
965 if (data().HasBasesWithNonStaticDataMembers)
966 data().IsCXX11StandardLayout =
false;
974 data().Aggregate =
false;
975 data().PlainOldData =
false;
980 data().StructuralIfLiteral =
false;
985 bool IsFirstField = !data().HasPrivateFields &&
986 !data().HasProtectedFields && !data().HasPublicFields;
993 case AS_private: data().HasPrivateFields =
true;
break;
994 case AS_protected: data().HasProtectedFields =
true;
break;
995 case AS_public: data().HasPublicFields =
true;
break;
996 case AS_none: llvm_unreachable(
"Invalid access specifier");
998 if ((data().HasPrivateFields + data().HasProtectedFields +
999 data().HasPublicFields) > 1) {
1000 data().IsStandardLayout =
false;
1001 data().IsCXX11StandardLayout =
false;
1005 if (
Field->isMutable()) {
1006 data().HasMutableFields =
true;
1011 data().StructuralIfLiteral =
false;
1018 data().HasVariantMembers =
true;
1037 struct DefinitionData &
Data = data();
1038 Data.PlainOldData =
false;
1039 Data.HasTrivialSpecialMembers = 0;
1045 data().HasTrivialSpecialMembersForCall = 0;
1051 Data.HasIrrelevantDestructor =
false;
1054 data().DefaultedCopyConstructorIsDeleted =
true;
1055 data().DefaultedMoveConstructorIsDeleted =
true;
1056 data().DefaultedCopyAssignmentIsDeleted =
true;
1057 data().DefaultedMoveAssignmentIsDeleted =
true;
1058 data().DefaultedDestructorIsDeleted =
true;
1059 data().NeedOverloadResolutionForCopyConstructor =
true;
1060 data().NeedOverloadResolutionForMoveConstructor =
true;
1061 data().NeedOverloadResolutionForCopyAssignment =
true;
1062 data().NeedOverloadResolutionForMoveAssignment =
true;
1063 data().NeedOverloadResolutionForDestructor =
true;
1065 }
else if (!Context.
getLangOpts().ObjCAutoRefCount) {
1069 data().PlainOldData =
false;
1072 if (!
Field->hasInClassInitializer())
1073 data().HasUninitializedReferenceMember =
true;
1078 data().IsStandardLayout =
false;
1079 data().IsCXX11StandardLayout =
false;
1085 data().DefaultedCopyConstructorIsDeleted =
true;
1088 if (!
Field->hasInClassInitializer() && !
Field->isMutable()) {
1090 if (FieldType->hasDefinition() && !FieldType->allowConstDefaultInit())
1091 data().HasUninitializedFields =
true;
1093 data().HasUninitializedFields =
true;
1099 data().HasNonLiteralTypeFieldsOrBases =
true;
1101 if (
Field->hasInClassInitializer() ||
1102 (
Field->isAnonymousStructOrUnion() &&
1103 Field->getType()->getAsCXXRecordDecl()->hasInClassInitializer())) {
1104 data().HasInClassInitializer =
true;
1109 data().HasTrivialSpecialMembers &= ~SMF_DefaultConstructor;
1117 data().Aggregate =
false;
1121 data().PlainOldData =
false;
1129 data().DefaultedCopyAssignmentIsDeleted =
true;
1130 data().DefaultedMoveAssignmentIsDeleted =
true;
1135 bool IsZeroSize =
Field->isZeroSize(Context);
1138 auto *FieldRec = cast<CXXRecordDecl>(RecordTy->getDecl());
1139 if (FieldRec->getDefinition()) {
1140 addedClassSubobject(FieldRec);
1148 data().NeedOverloadResolutionForCopyConstructor =
true;
1149 data().NeedOverloadResolutionForMoveConstructor =
true;
1150 data().NeedOverloadResolutionForCopyAssignment =
true;
1151 data().NeedOverloadResolutionForMoveAssignment =
true;
1160 if (FieldRec->hasNonTrivialCopyConstructor())
1161 data().DefaultedCopyConstructorIsDeleted =
true;
1162 if (FieldRec->hasNonTrivialMoveConstructor())
1163 data().DefaultedMoveConstructorIsDeleted =
true;
1164 if (FieldRec->hasNonTrivialCopyAssignment())
1165 data().DefaultedCopyAssignmentIsDeleted =
true;
1166 if (FieldRec->hasNonTrivialMoveAssignment())
1167 data().DefaultedMoveAssignmentIsDeleted =
true;
1168 if (FieldRec->hasNonTrivialDestructor())
1169 data().DefaultedDestructorIsDeleted =
true;
1174 if (
Field->isAnonymousStructOrUnion()) {
1175 data().NeedOverloadResolutionForCopyConstructor |=
1176 FieldRec->data().NeedOverloadResolutionForCopyConstructor;
1177 data().NeedOverloadResolutionForMoveConstructor |=
1178 FieldRec->data().NeedOverloadResolutionForMoveConstructor;
1179 data().NeedOverloadResolutionForCopyAssignment |=
1180 FieldRec->data().NeedOverloadResolutionForCopyAssignment;
1181 data().NeedOverloadResolutionForMoveAssignment |=
1182 FieldRec->data().NeedOverloadResolutionForMoveAssignment;
1183 data().NeedOverloadResolutionForDestructor |=
1184 FieldRec->data().NeedOverloadResolutionForDestructor;
1192 if (!FieldRec->hasTrivialDefaultConstructor())
1193 data().HasTrivialSpecialMembers &= ~SMF_DefaultConstructor;
1201 if (!FieldRec->hasTrivialCopyConstructor())
1202 data().HasTrivialSpecialMembers &= ~SMF_CopyConstructor;
1204 if (!FieldRec->hasTrivialCopyConstructorForCall())
1205 data().HasTrivialSpecialMembersForCall &= ~SMF_CopyConstructor;
1210 if (!FieldRec->hasTrivialMoveConstructor())
1211 data().HasTrivialSpecialMembers &= ~SMF_MoveConstructor;
1213 if (!FieldRec->hasTrivialMoveConstructorForCall())
1214 data().HasTrivialSpecialMembersForCall &= ~SMF_MoveConstructor;
1222 if (!FieldRec->hasTrivialCopyAssignment())
1223 data().HasTrivialSpecialMembers &= ~SMF_CopyAssignment;
1227 if (!FieldRec->hasTrivialMoveAssignment())
1228 data().HasTrivialSpecialMembers &= ~SMF_MoveAssignment;
1230 if (!FieldRec->hasTrivialDestructor())
1231 data().HasTrivialSpecialMembers &= ~SMF_Destructor;
1232 if (!FieldRec->hasTrivialDestructorForCall())
1233 data().HasTrivialSpecialMembersForCall &= ~SMF_Destructor;
1234 if (!FieldRec->hasIrrelevantDestructor())
1235 data().HasIrrelevantDestructor =
false;
1236 if (FieldRec->isAnyDestructorNoReturn())
1237 data().IsAnyDestructorNoReturn =
true;
1238 if (FieldRec->hasObjectMember())
1240 if (FieldRec->hasVolatileMember())
1242 if (FieldRec->getArgPassingRestrictions() ==
1250 if (!FieldRec->isStandardLayout())
1251 data().IsStandardLayout =
false;
1252 if (!FieldRec->isCXX11StandardLayout())
1253 data().IsCXX11StandardLayout =
false;
1259 if (data().IsStandardLayout &&
1260 (
isUnion() || IsFirstField || IsZeroSize) &&
1261 hasSubobjectAtOffsetZeroOfEmptyBaseType(Context, FieldRec))
1262 data().IsStandardLayout =
false;
1268 if (data().IsCXX11StandardLayout && IsFirstField) {
1271 for (
const auto &BI :
bases()) {
1273 data().IsCXX11StandardLayout =
false;
1280 if (FieldRec->hasMutableFields())
1281 data().HasMutableFields =
true;
1283 if (
Field->isMutable()) {
1287 data().NeedOverloadResolutionForCopyConstructor =
true;
1288 data().NeedOverloadResolutionForCopyAssignment =
true;
1298 if (!
Field->hasInClassInitializer() &&
1299 !FieldRec->hasConstexprDefaultConstructor() && !
isUnion())
1302 data().DefaultedDefaultConstructorIsConstexpr =
1310 if (!FieldRec->hasCopyConstructorWithConstParam())
1311 data().ImplicitCopyConstructorCanHaveConstParamForNonVBase =
false;
1319 if (!FieldRec->hasCopyAssignmentWithConstParam())
1320 data().ImplicitCopyAssignmentHasConstParam =
false;
1322 if (FieldRec->hasUninitializedReferenceMember() &&
1323 !
Field->hasInClassInitializer())
1324 data().HasUninitializedReferenceMember =
true;
1329 if (FieldRec->hasVariantMembers() &&
1330 Field->isAnonymousStructOrUnion())
1331 data().HasVariantMembers =
true;
1338 data().DefaultedDefaultConstructorIsConstexpr =
false;
1346 data().DefaultedCopyAssignmentIsDeleted =
true;
1347 data().DefaultedMoveAssignmentIsDeleted =
true;
1356 data().StructuralIfLiteral =
false;
1362 if (data().Empty && !IsZeroSize)
1363 data().Empty =
false;
1367 if (
auto *Shadow = dyn_cast<UsingShadowDecl>(D)) {
1368 if (Shadow->getDeclName().getNameKind()
1371 data().Conversions.get(Ctx).addDecl(Ctx, Shadow, Shadow->getAccess());
1375 if (
const auto *Using = dyn_cast<UsingDecl>(D)) {
1376 if (
Using->getDeclName().getNameKind() ==
1378 data().HasInheritedConstructor =
true;
1381 data().Aggregate =
false;
1384 if (
Using->getDeclName().getCXXOverloadedOperator() == OO_Equal)
1385 data().HasInheritedAssignment =
true;
1401 bool HasAtLeastOneLiteralMember =
1403 return !D->
getType().isVolatileQualified() &&
1406 if (!HasAtLeastOneLiteralMember)
1425 if (
const auto *DD = dyn_cast<CXXDestructorDecl>(MD)) {
1426 if (DD->isUserProvided())
1427 data().HasIrrelevantDestructor =
false;
1434 if (DD->isVirtual()) {
1435 data().HasTrivialSpecialMembers &= ~SMF_Destructor;
1436 data().HasTrivialSpecialMembersForCall &= ~SMF_Destructor;
1439 if (DD->isNoReturn())
1440 data().IsAnyDestructorNoReturn =
true;
1449 data().HasTrivialSpecialMembers |= SMKind;
1450 data().HasTrivialSpecialMembersForCall |= SMKind;
1452 data().HasTrivialSpecialMembersForCall |= SMKind;
1453 data().DeclaredNonTrivialSpecialMembers |= SMKind;
1455 data().DeclaredNonTrivialSpecialMembers |= SMKind;
1462 data().DeclaredNonTrivialSpecialMembersForCall |= SMKind;
1470 unsigned SMKind = 0;
1472 if (
const auto *Constructor = dyn_cast<CXXConstructorDecl>(D)) {
1473 if (Constructor->isDefaultConstructor()) {
1474 SMKind |= SMF_DefaultConstructor;
1475 if (Constructor->isConstexpr())
1476 data().HasConstexprDefaultConstructor =
true;
1478 if (Constructor->isCopyConstructor())
1479 SMKind |= SMF_CopyConstructor;
1480 else if (Constructor->isMoveConstructor())
1481 SMKind |= SMF_MoveConstructor;
1482 else if (Constructor->isConstexpr())
1484 data().HasConstexprNonCopyMoveConstructor =
true;
1485 }
else if (isa<CXXDestructorDecl>(D)) {
1486 SMKind |= SMF_Destructor;
1488 data().HasIrrelevantDestructor =
false;
1490 SMKind |= SMF_CopyAssignment;
1492 SMKind |= SMF_MoveAssignment;
1498 data().HasTrivialSpecialMembers |= SMKind;
1500 data().DeclaredNonTrivialSpecialMembers |= SMKind;
1504void CXXRecordDecl::LambdaDefinitionData::AddCaptureList(
ASTContext &Ctx,
1506 Captures.push_back(CaptureList);
1507 if (Captures.size() == 2) {
1515 CXXRecordDecl::LambdaDefinitionData &
Data = getLambdaData();
1518 Data.NumCaptures = Captures.size();
1519 Data.NumExplicitCaptures = 0;
1522 Data.AddCaptureList(Context, ToCapture);
1523 for (
unsigned I = 0, N = Captures.size(); I != N; ++I) {
1524 if (Captures[I].isExplicit())
1525 ++
Data.NumExplicitCaptures;
1532 Data.DefaultedCopyAssignmentIsDeleted =
true;
1536 unsigned SMKind = 0;
1538 if (
const auto *Constructor = dyn_cast<CXXConstructorDecl>(D)) {
1539 if (Constructor->isCopyConstructor())
1540 SMKind = SMF_CopyConstructor;
1541 else if (Constructor->isMoveConstructor())
1542 SMKind = SMF_MoveConstructor;
1543 }
else if (isa<CXXDestructorDecl>(D))
1544 SMKind = SMF_Destructor;
1547 data().HasTrivialSpecialMembersForCall |= SMKind;
1549 data().DeclaredNonTrivialSpecialMembersForCall |= SMKind;
1555 !TemplateOrInstantiation.isNull())
1560 return isPOD() && data().HasOnlyCMembers;
1565 return getLambdaData().IsGenericLambda;
1570 return llvm::all_of(R, [&](
NamedDecl *D) {
1577 if (!RD.
isLambda())
return nullptr;
1582 assert(!Calls.
empty() &&
"Missing lambda call operator!");
1584 "More than one lambda call operator!");
1585 return Calls.
front();
1590 return dyn_cast_or_null<FunctionTemplateDecl>(CallOp);
1596 if (CallOp ==
nullptr)
1599 if (
const auto *CallOpTmpl = dyn_cast<FunctionTemplateDecl>(CallOp))
1600 return cast<CXXMethodDecl>(CallOpTmpl->getTemplatedDecl());
1602 return cast<CXXMethodDecl>(CallOp);
1613 assert(RD.
isLambda() &&
"Must be a lambda");
1620 if (
const auto *InvokerTemplate = dyn_cast<FunctionTemplateDecl>(ND))
1621 return cast<CXXMethodDecl>(InvokerTemplate->getTemplatedDecl());
1622 return cast<CXXMethodDecl>(ND);
1632 cast<ValueDecl>(ND->getAsFunction())->getType()->castAs<
FunctionType>();
1633 if (FTy->getCallConv() == CC)
1641 llvm::DenseMap<const ValueDecl *, FieldDecl *> &Captures,
1644 ThisCapture =
nullptr;
1646 LambdaDefinitionData &Lambda = getLambdaData();
1650 C != CEnd; ++
C, ++Field) {
1651 if (
C->capturesThis())
1652 ThisCapture = *Field;
1653 else if (
C->capturesVariable())
1654 Captures[
C->getCapturedVar()] = *Field;
1665 return Tmpl->getTemplateParameters();
1675 assert(std::is_partitioned(List->begin(), List->end(),
1676 [](
const NamedDecl *D) { return !D->isImplicit(); })
1677 &&
"Explicit template params should be ordered before implicit ones");
1679 const auto ExplicitEnd = llvm::partition_point(
1685 assert(
isLambda() &&
"Not a lambda closure type!");
1687 return getLambdaData().ContextDecl.get(Source);
1691 assert(
isLambda() &&
"Not a lambda closure type!");
1697 getLambdaData().ContextDecl = Numbering.
ContextDecl;
1702 assert(
isLambda() &&
"Not a lambda closure type!");
1703 return getASTContext().DeviceLambdaManglingNumbers.lookup(
this);
1709 ->getConversionType();
1741 if (ConvI != ConvE) {
1742 HiddenTypesBuffer = ParentHiddenTypes;
1743 HiddenTypes = &HiddenTypesBuffer;
1747 bool Hidden = ParentHiddenTypes.count(ConvType);
1749 HiddenTypesBuffer.insert(ConvType);
1753 if (Hidden && InVirtual)
1754 HiddenVBaseCs.insert(cast<NamedDecl>(I.getDecl()->getCanonicalDecl()));
1762 VOutput.
addDecl(I.getDecl(), IAccess);
1764 Output.
addDecl(Context, I.getDecl(), IAccess);
1770 for (
const auto &I :
Record->bases()) {
1771 const auto *RT = I.getType()->getAs<
RecordType>();
1776 bool BaseInVirtual = InVirtual || I.isVirtual();
1778 auto *
Base = cast<CXXRecordDecl>(RT->getDecl());
1780 *HiddenTypes, Output, VOutput, HiddenVBaseCs);
1807 Output.
append(Context, ConvI, ConvE);
1808 for (; ConvI != ConvE; ++ConvI)
1812 for (
const auto &I :
Record->bases()) {
1813 const auto *RT = I.getType()->getAs<
RecordType>();
1817 I.isVirtual(), I.getAccessSpecifier(),
1818 HiddenTypes, Output, VBaseCs, HiddenVBaseCs);
1824 if (!HiddenVBaseCs.count(cast<NamedDecl>(I.getDecl()->getCanonicalDecl())))
1825 Output.
addDecl(Context, I.getDecl(), I.getAccess());
1831llvm::iterator_range<CXXRecordDecl::conversion_iterator>
1838 Set = &data().Conversions.get(Ctx);
1840 Set = &data().VisibleConversions.get(Ctx);
1842 if (!data().ComputedVisibleConversions) {
1844 data().ComputedVisibleConversions =
true;
1847 return llvm::make_range(
Set->begin(),
Set->end());
1863 for (
unsigned I = 0, E = Convs.
size(); I != E; ++I) {
1864 if (Convs[I].getDecl() == ConvDecl) {
1866 assert(!llvm::is_contained(Convs, ConvDecl) &&
1867 "conversion was found multiple times in unresolved set");
1872 llvm_unreachable(
"conversion not found in set!");
1877 return cast<CXXRecordDecl>(MSInfo->getInstantiatedFrom());
1889 assert(TemplateOrInstantiation.isNull() &&
1890 "Previous template or instantiation?");
1891 assert(!isa<ClassTemplatePartialSpecializationDecl>(
this));
1892 TemplateOrInstantiation
1901 TemplateOrInstantiation = Template;
1905 if (
const auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(
this))
1906 return Spec->getSpecializationKind();
1909 return MSInfo->getTemplateSpecializationKind();
1916 if (
auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(
this)) {
1917 Spec->setSpecializationKind(TSK);
1922 MSInfo->setTemplateSpecializationKind(TSK);
1926 llvm_unreachable(
"Not a class template or member class specialization");
1930 auto GetDefinitionOrSelf =
1932 if (
auto *Def = D->getDefinition())
1939 if (
auto *TD = dyn_cast<ClassTemplateSpecializationDecl>(
this)) {
1940 auto From = TD->getInstantiatedFrom();
1942 while (
auto *NewCTD = CTD->getInstantiatedFromMemberTemplate()) {
1943 if (NewCTD->isMemberSpecialization())
1947 return GetDefinitionOrSelf(CTD->getTemplatedDecl());
1951 while (
auto *NewCTPSD = CTPSD->getInstantiatedFromMember()) {
1952 if (NewCTPSD->isMemberSpecialization())
1956 return GetDefinitionOrSelf(CTPSD);
1965 return GetDefinitionOrSelf(RD);
1970 "couldn't find pattern for class template instantiation");
1986 for (
auto *
Decl : R) {
1987 auto* DD = dyn_cast<CXXDestructorDecl>(
Decl);
1988 if (DD && !DD->isIneligibleOrNotSelected())
2004 assert(
hasDefinition() &&
"checking for interface-like without a definition");
2018 for (
const auto *
const Method :
methods())
2019 if (Method->isDefined() && !Method->isImplicit())
2023 const auto *Uuid = getAttr<UuidAttr>();
2030 Uuid->getGuid() ==
"00000000-0000-0000-C000-000000000046") ||
2032 Uuid->getGuid() ==
"00020400-0000-0000-C000-000000000046"))) {
2046 if (BaseSpec.isVirtual() || BaseSpec.getAccessSpecifier() !=
AS_public)
2048 const auto *
Base = BaseSpec.getType()->getAsCXXRecordDecl();
2049 if (
Base->isInterface() || !
Base->isInterfaceLike())
2065 if (!FinalOverriders) {
2067 FinalOverriders = &MyFinalOverriders;
2071 for (CXXFinalOverriderMap::iterator M = FinalOverriders->begin(),
2072 MEnd = FinalOverriders->end();
2073 M != MEnd && !Done; ++M) {
2075 SOEnd = M->second.end();
2076 SO != SOEnd && !Done; ++SO) {
2077 assert(SO->second.size() > 0 &&
2078 "All virtual functions have overriding virtual functions");
2084 if (SO->second.front().Method->isPureVirtual()) {
2085 data().Abstract =
true;
2096 I.setAccess((*I)->getAccess());
2100 if (data().Abstract ||
isInvalidDecl() || !data().Polymorphic ||
2104 for (
const auto &B :
bases()) {
2105 const auto *BaseDecl =
2107 if (BaseDecl->isAbstract())
2118 if (Def->hasAttr<FinalAttr>())
2120 if (
const auto *Dtor = Def->getDestructor())
2121 if (Dtor->hasAttr<FinalAttr>())
2126void CXXDeductionGuideDecl::anchor() {}
2145 case Decl::Kind::CXXConstructor:
2146 return cast<CXXConstructorDecl>(
Function)->getExplicitSpecifier();
2147 case Decl::Kind::CXXConversion:
2148 return cast<CXXConversionDecl>(
Function)->getExplicitSpecifier();
2149 case Decl::Kind::CXXDeductionGuide:
2150 return cast<CXXDeductionGuideDecl>(
Function)->getExplicitSpecifier();
2162 TInfo, EndLocation, Ctor, Kind);
2183void CXXMethodDecl::anchor() {}
2213 if (isa<CXXDestructorDecl>(
this)) {
2225 auto *MD = dyn_cast<CXXMethodDecl>(ND);
2253 llvm::erase_if(FinalOverriders, [&](
CXXMethodDecl *OtherD) {
2257 FinalOverriders.push_back(D);
2260 for (
const auto &I : RD->
bases()) {
2264 const auto *
Base = cast<CXXRecordDecl>(RT->
getDecl());
2266 AddFinalOverrider(D);
2269 return FinalOverriders.size() == 1 ? FinalOverriders.front() :
nullptr;
2278 Expr *TrailingRequiresClause) {
2280 CXXMethod,
C, RD, StartLoc, NameInfo, T, TInfo, SC,
UsesFPIntrin,
2281 isInline, ConstexprKind, EndLocation, TrailingRequiresClause);
2293 assert(
isVirtual() &&
"this method is expected to be virtual");
2302 if (hasAttr<FinalAttr>())
2311 Base =
Base->getBestDynamicClassTypeExpr();
2312 if (
Base->isPRValue() &&
Base->getType()->isRecordType())
2317 if (!BestDynamicDecl)
2326 if (!DevirtualizedMethod)
2336 if (DevirtualizedMethod->
hasAttr<FinalAttr>())
2337 return DevirtualizedMethod;
2343 return DevirtualizedMethod;
2345 if (
const auto *DRE = dyn_cast<DeclRefExpr>(
Base)) {
2346 if (
const auto *VD = dyn_cast<VarDecl>(DRE->getDecl()))
2347 if (VD->getType()->isRecordType())
2349 return DevirtualizedMethod;
2357 if (
const auto *ME = dyn_cast<MemberExpr>(
Base)) {
2358 const ValueDecl *VD = ME->getMemberDecl();
2364 if (
auto *BO = dyn_cast<BinaryOperator>(
Base)) {
2365 if (BO->isPtrMemOp()) {
2367 if (MPT->getPointeeType()->isRecordType())
2368 return DevirtualizedMethod;
2378 assert(PreventedBy.empty() &&
"PreventedBy is expected to be empty");
2395 unsigned UsualParams = 1;
2442 for (
const auto *D : R) {
2443 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
2444 if (FD->getNumParams() == 1) {
2445 PreventedBy.push_back(FD);
2510 "Can't add an overridden method to a class template!");
2511 assert(MD->
isVirtual() &&
"Method is not virtual!");
2517 if (isa<CXXConstructorDecl>(
this))
return nullptr;
2522 if (isa<CXXConstructorDecl>(
this))
return nullptr;
2527 if (isa<CXXConstructorDecl>(
this))
return 0;
2533 if (isa<CXXConstructorDecl>(
this))
2555 ObjectTy =
C.getLangOpts().HLSL ?
C.getLValueReferenceType(ObjectTy)
2556 :
C.getPointerType(ObjectTy);
2569 assert(
isInstance() &&
"No 'this' for static methods!");
2583 return C.getRValueReferenceType(
Type);
2584 return C.getLValueReferenceType(
Type);
2610 : Initializee(TInfo),
Init(
Init), MemberOrEllipsisLocation(EllipsisLoc),
2611 LParenLoc(L), RParenLoc(R), IsDelegating(
false), IsVirtual(IsVirtual),
2612 IsWritten(
false), SourceOrder(0) {}
2618 : Initializee(
Member),
Init(
Init), MemberOrEllipsisLocation(MemberLoc),
2619 LParenLoc(L), RParenLoc(R), IsDelegating(
false), IsVirtual(
false),
2620 IsWritten(
false), SourceOrder(0) {}
2627 : Initializee(
Member),
Init(
Init), MemberOrEllipsisLocation(MemberLoc),
2628 LParenLoc(L), RParenLoc(R), IsDelegating(
false), IsVirtual(
false),
2629 IsWritten(
false), SourceOrder(0) {}
2635 : Initializee(TInfo),
Init(
Init), LParenLoc(L), RParenLoc(R),
2636 IsDelegating(
true), IsVirtual(
false), IsWritten(
false), SourceOrder(0) {}
2652 return Initializee.get<
TypeSourceInfo*>()->getType().getTypePtr();
2665 return TSInfo->getTypeLoc().getBeginLoc();
2674 return I->getSourceRange();
2681CXXConstructorDecl::CXXConstructorDecl(
2687 :
CXXMethodDecl(CXXConstructor,
C, RD, StartLoc, NameInfo, T, TInfo,
2688 SC_None, UsesFPIntrin, isInline, ConstexprKind,
2690 setNumCtorInitializers(0);
2691 setInheritingConstructor(
static_cast<bool>(Inherited));
2692 setImplicit(isImplicitlyDeclared);
2693 CXXConstructorDeclBits.HasTrailingExplicitSpecifier = ES.
getExpr() ? 1 : 0;
2695 *getTrailingObjects<InheritedConstructor>() = Inherited;
2696 setExplicitSpecifier(ES);
2699void CXXConstructorDecl::anchor() {}
2703 uint64_t AllocKind) {
2704 bool hasTrailingExplicit =
static_cast<bool>(AllocKind & TAKHasTailExplicit);
2706 static_cast<bool>(AllocKind & TAKInheritsConstructor);
2708 additionalSizeToAlloc<InheritedConstructor, ExplicitSpecifier>(
2715 Result->CXXConstructorDeclBits.HasTrailingExplicitSpecifier =
2716 hasTrailingExplicit;
2729 "Name must refer to a constructor");
2731 additionalSizeToAlloc<InheritedConstructor, ExplicitSpecifier>(
2732 Inherited ? 1 : 0, ES.
getExpr() ? 1 : 0);
2734 C, RD, StartLoc, NameInfo, T, TInfo, ES,
UsesFPIntrin, isInline,
2735 isImplicitlyDeclared, ConstexprKind, Inherited, TrailingRequiresClause);
2745 if (
const auto *Construct = dyn_cast<CXXConstructExpr>(E))
2746 return Construct->getConstructor();
2846void CXXDestructorDecl::anchor() {}
2858 bool UsesFPIntrin,
bool isInline,
bool isImplicitlyDeclared,
2862 "Name must refer to a destructor");
2864 C, RD, StartLoc, NameInfo, T, TInfo,
UsesFPIntrin, isInline,
2865 isImplicitlyDeclared, ConstexprKind, TrailingRequiresClause);
2870 if (OD && !
First->OperatorDelete) {
2871 First->OperatorDelete = OD;
2872 First->OperatorDeleteThisArg = ThisArg;
2874 L->ResolvedOperatorDelete(
First, OD, ThisArg);
2878void CXXConversionDecl::anchor() {}
2893 Expr *TrailingRequiresClause) {
2896 "Name must refer to a conversion function");
2898 C, RD, StartLoc, NameInfo, T, TInfo,
UsesFPIntrin, isInline, ES,
2899 ConstexprKind, EndLocation, TrailingRequiresClause);
2916void LinkageSpecDecl::anchor() {}
2923 return new (
C, DC)
LinkageSpecDecl(DC, ExternLoc, LangLoc, Lang, HasBraces);
2933void UsingDirectiveDecl::anchor() {}
2942 if (
auto *NS = dyn_cast_or_null<NamespaceDecl>(
Used))
2943 Used = NS->getOriginalNamespace();
2945 IdentLoc,
Used, CommonAncestor);
2957 if (
auto *NA = dyn_cast_or_null<NamespaceAliasDecl>(NominatedNamespace))
2958 return NA->getNamespace();
2959 return cast_or_null<NamespaceDecl>(NominatedNamespace);
2967 redeclarable_base(
C), LocStart(StartLoc) {
2973 AnonOrFirstNamespaceAndFlags = {
nullptr, Flags};
2974 setPreviousDecl(PrevDecl);
2997 return AnonOrFirstNamespaceAndFlags.getPointer();
3004 return AnonOrFirstNamespaceAndFlags.getPointer();
3021void NamespaceAliasDecl::anchor() {}
3043 if (
auto *NS = dyn_cast_or_null<NamespaceDecl>(Namespace))
3044 Namespace = NS->getOriginalNamespace();
3046 QualifierLoc, IdentLoc, Namespace);
3057void LifetimeExtendedTemporaryDecl::anchor() {}
3066 if (isa<FieldDecl>(ExtendingDecl))
3070 if (isa<BindingDecl>(ExtendingDecl))
3073 return cast<VarDecl>(ExtendingDecl)->getStorageDuration();
3078 "don't need to cache the computed value for this temporary");
3079 if (MayCreate && !
Value) {
3083 assert(
Value &&
"may not be null");
3087void UsingShadowDecl::anchor() {}
3093 UsingOrNextShadow(Introducer) {
3095 assert(!isa<UsingShadowDecl>(
Target));
3112 while (
const auto *NextShadow =
3113 dyn_cast<UsingShadowDecl>(Shadow->UsingOrNextShadow))
3114 Shadow = NextShadow;
3115 return cast<BaseUsingDecl>(Shadow->UsingOrNextShadow);
3118void ConstructorUsingShadowDecl::anchor() {}
3137void BaseUsingDecl::anchor() {}
3140 assert(!llvm::is_contained(
shadows(), S) &&
"declaration already in set");
3141 assert(S->getIntroducer() ==
this);
3143 if (FirstUsingShadow.getPointer())
3144 S->UsingOrNextShadow = FirstUsingShadow.getPointer();
3145 FirstUsingShadow.setPointer(S);
3149 assert(llvm::is_contained(
shadows(), S) &&
"declaration not in set");
3150 assert(S->getIntroducer() ==
this);
3154 if (FirstUsingShadow.getPointer() == S) {
3155 FirstUsingShadow.setPointer(
3156 dyn_cast<UsingShadowDecl>(S->UsingOrNextShadow));
3157 S->UsingOrNextShadow =
this;
3162 while (Prev->UsingOrNextShadow != S)
3163 Prev = cast<UsingShadowDecl>(Prev->UsingOrNextShadow);
3164 Prev->UsingOrNextShadow = S->UsingOrNextShadow;
3165 S->UsingOrNextShadow =
this;
3168void UsingDecl::anchor() {}
3174 return new (
C, DC)
UsingDecl(DC, UL, QualifierLoc, NameInfo, HasTypename);
3189void UsingEnumDecl::anchor() {}
3211void UsingPackDecl::anchor() {}
3216 size_t Extra = additionalSizeToAlloc<NamedDecl *>(UsingDecls.size());
3217 return new (
C, DC, Extra)
UsingPackDecl(DC, InstantiatedFrom, UsingDecls);
3221 unsigned NumExpansions) {
3222 size_t Extra = additionalSizeToAlloc<NamedDecl *>(NumExpansions);
3225 Result->NumExpansions = NumExpansions;
3227 for (
unsigned I = 0; I != NumExpansions; ++I)
3232void UnresolvedUsingValueDecl::anchor() {}
3241 QualifierLoc, NameInfo,
3260void UnresolvedUsingTypenameDecl::anchor() {}
3271 DC, UsingLoc, TypenameLoc, QualifierLoc, TargetNameLoc,
3290 return new (Ctx,
ID)
3294UnresolvedUsingIfExistsDecl::UnresolvedUsingIfExistsDecl(
DeclContext *DC,
3297 :
NamedDecl(
Decl::UnresolvedUsingIfExists, DC, Loc, Name) {}
3299void UnresolvedUsingIfExistsDecl::anchor() {}
3301void StaticAssertDecl::anchor() {}
3319 assert((isa<VarDecl, BindingDecl>(
this)) &&
3320 "expected a VarDecl or a BindingDecl");
3321 if (
auto *Var = llvm::dyn_cast<VarDecl>(
this))
3323 if (
auto *BD = llvm::dyn_cast<BindingDecl>(
this))
3324 return llvm::dyn_cast<VarDecl>(BD->getDecomposedDecl());
3328void BindingDecl::anchor() {}
3347 auto *VD = cast<VarDecl>(DRE->getDecl());
3348 assert(VD->isImplicit() &&
"holding var for binding decl not implicit");
3352void DecompositionDecl::anchor() {}
3360 size_t Extra = additionalSizeToAlloc<BindingDecl *>(
Bindings.size());
3361 return new (
C, DC, Extra)
3367 unsigned NumBindings) {
3368 size_t Extra = additionalSizeToAlloc<BindingDecl *>(NumBindings);
3373 Result->NumBindings = NumBindings;
3375 for (
unsigned I = 0; I != NumBindings; ++I)
3387 B->printName(OS, Policy);
3393void MSPropertyDecl::anchor() {}
3401 return new (
C, DC)
MSPropertyDecl(DC, L, N, T, TInfo, StartL, Getter, Setter);
3411void MSGuidDecl::anchor() {}
3428 OS << llvm::format(
"GUID{%08" PRIx32
"-%04" PRIx16
"-%04" PRIx16
"-",
3431 for (uint8_t Byte : PartVal.
Part4And5) {
3432 OS << llvm::format(
"%02" PRIx8, Byte);
3445 auto IsInt = [&Ctx](
unsigned N) {
3452 auto IsArray = [&Ctx](MatcherRef Elem,
unsigned N) {
3453 return [&Ctx, Elem, N](
QualType T) {
3459 auto IsStruct = [](std::initializer_list<MatcherRef> Fields) {
3467 if (
auto *CXXRD = dyn_cast<CXXRecordDecl>(RD))
3468 if (CXXRD->getNumBases())
3470 auto MatcherIt = Fields.begin();
3472 if (FD->isUnnamedBitfield())
continue;
3473 if (FD->isBitField() || MatcherIt == Fields.end() ||
3474 !(*MatcherIt)(FD->getType()))
3478 return MatcherIt == Fields.end();
3483 return IsStruct({IsInt(32), IsInt(16), IsInt(16), IsArray(IsInt(8), 8)})(T);
3496 for (
unsigned I = 0; I != 8; ++I) {
3508void UnnamedGlobalConstantDecl::anchor() {}
3510UnnamedGlobalConstantDecl::UnnamedGlobalConstantDecl(
const ASTContext &
C,
3519 if (
Value.needsCleanup())
3520 C.addDestruction(&
Value);
3531UnnamedGlobalConstantDecl::CreateDeserialized(
ASTContext &
C,
unsigned ID) {
3538 OS <<
"unnamed-global-constant";
3544 llvm_unreachable(
"Invalid access specifier!");
3552 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, unsigned 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.
static BindingDecl * CreateDeserialized(ASTContext &C, unsigned ID)
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 * 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.
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...
static CXXConstructorDecl * CreateDeserialized(ASTContext &C, unsigned ID, uint64_t AllocKind)
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, unsigned 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, unsigned 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)
void setOperatorDelete(FunctionDecl *OD, Expr *ThisArg)
static CXXDestructorDecl * CreateDeserialized(ASTContext &C, unsigned ID)
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
static CXXMethodDecl * CreateDeserialized(ASTContext &C, unsigned ID)
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...
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)
static CXXRecordDecl * CreateDeserialized(const ASTContext &C, unsigned ID)
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.
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.
const llvm::APInt & getSize() const
Represents a shadow constructor declaration introduced into a class by a C++11 using-declaration that...
UsingDecl * getIntroducer() const
Override the UsingShadowDecl's getIntroducer, returning the UsingDecl that introduced this.
static ConstructorUsingShadowDecl * CreateDeserialized(ASTContext &C, unsigned ID)
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, unsigned 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(uint32_t 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, unsigned 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, unsigned 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 * Create(ASTContext &C, DeclContext *DC, SourceLocation NamespaceLoc, SourceLocation AliasLoc, IdentifierInfo *Alias, NestedNameSpecifierLoc QualifierLoc, SourceLocation IdentLoc, NamedDecl *Namespace)
static NamespaceAliasDecl * CreateDeserialized(ASTContext &C, unsigned ID)
Represent a C++ namespace.
static NamespaceDecl * CreateDeserialized(ASTContext &C, unsigned ID)
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)
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.
bool isVolatileQualified() const
Determine whether this type is volatile-qualified.
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this type.
bool isCXX98PODType(const ASTContext &Context) const
Return true if this is a POD type according to the rules of the C++98 standard, regardless of the cur...
bool isObjCGCStrong() const
true when Type is objc's strong.
void removeLocalRestrict()
bool isConstQualified() const
Determine whether this type is const-qualified.
unsigned getCVRQualifiers() const
Retrieve the set of CVR (const-volatile-restrict) qualifiers applied to this type.
bool hasNonTrivialObjCLifetime() const
@ 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.
ObjCLifetime getObjCLifetime() const
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 * CreateDeserialized(ASTContext &C, unsigned ID)
static RequiresExprBodyDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc)
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, unsigned 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 * Create(ASTContext &Ctx, DeclContext *DC, SourceLocation Loc, DeclarationName Name)
static UnresolvedUsingIfExistsDecl * CreateDeserialized(ASTContext &Ctx, unsigned ID)
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, unsigned 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.
static UnresolvedUsingValueDecl * CreateDeserialized(ASTContext &C, unsigned ID)
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)
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.
DeclarationNameInfo getNameInfo() const
static UsingDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation UsingL, NestedNameSpecifierLoc QualifierLoc, const DeclarationNameInfo &NameInfo, bool HasTypenameKeyword)
static UsingDecl * CreateDeserialized(ASTContext &C, unsigned ID)
NestedNameSpecifier * getQualifier() const
Retrieve the nested-name-specifier that qualifies the name.
Represents C++ using-directive.
static UsingDirectiveDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation UsingLoc, SourceLocation NamespaceLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation IdentLoc, NamedDecl *Nominated, DeclContext *CommonAncestor)
static UsingDirectiveDecl * CreateDeserialized(ASTContext &C, unsigned ID)
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, unsigned 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 * Create(ASTContext &C, DeclContext *DC, NamedDecl *InstantiatedFrom, ArrayRef< NamedDecl * > UsingDecls)
static UsingPackDecl * CreateDeserialized(ASTContext &C, unsigned ID, unsigned NumExpansions)
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.
static UsingShadowDecl * CreateDeserialized(ASTContext &C, unsigned ID)
UsingShadowDecl(Kind K, ASTContext &C, DeclContext *DC, SourceLocation Loc, DeclarationName Name, BaseUsingDecl *Introducer, NamedDecl *Target)
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()
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.