39#include "llvm/ADT/SmallPtrSet.h"
40#include "llvm/ADT/SmallVector.h"
41#include "llvm/ADT/iterator_range.h"
42#include "llvm/Support/Casting.h"
43#include "llvm/Support/ErrorHandling.h"
44#include "llvm/Support/Format.h"
45#include "llvm/Support/raw_ostream.h"
57void 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");
72 Impl.Decls.setLazy(
false);
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), IsHLSLIntangible(
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;
433 if (BaseClassDecl->isHLSLIntangible())
434 data().IsHLSLIntangible =
true;
441 if (!BaseClassDecl->hasCopyAssignmentWithConstParam())
442 data().ImplicitCopyAssignmentHasConstParam =
false;
446 if (BaseClassDecl->hasObjectMember())
449 if (BaseClassDecl->hasVolatileMember())
452 if (BaseClassDecl->getArgPassingRestrictions() ==
457 if (BaseClassDecl->hasMutableFields())
458 data().HasMutableFields =
true;
460 if (BaseClassDecl->hasUninitializedReferenceMember())
461 data().HasUninitializedReferenceMember =
true;
463 if (!BaseClassDecl->allowConstDefaultInit())
464 data().HasUninitializedFields =
true;
466 addedClassSubobject(BaseClassDecl);
477 data().IsStandardLayout =
false;
479 if (VBases.empty()) {
480 data().IsParsingBaseSpecifiers =
false;
486 data().NumVBases = VBases.size();
487 for (
int I = 0,
E = VBases.size(); I !=
E; ++I) {
491 data().getVBases()[I] = *VBases[I];
494 data().IsParsingBaseSpecifiers =
false;
498 assert(
hasDefinition() &&
"ODRHash only for records with definitions");
501 if (DefinitionData->HasODRHash)
502 return DefinitionData->ODRHash;
507 DefinitionData->HasODRHash =
true;
510 return DefinitionData->ODRHash;
513void CXXRecordDecl::addedClassSubobject(
CXXRecordDecl *Subobj) {
521 data().NeedOverloadResolutionForCopyConstructor =
true;
523 data().NeedOverloadResolutionForMoveConstructor =
true;
532 data().NeedOverloadResolutionForCopyAssignment =
true;
534 data().NeedOverloadResolutionForMoveAssignment =
true;
544 data().NeedOverloadResolutionForCopyConstructor =
true;
545 data().NeedOverloadResolutionForMoveConstructor =
true;
546 data().NeedOverloadResolutionForDestructor =
true;
555 data().DefaultedDestructorIsConstexpr =
562 if (!Subobj->data().StructuralIfLiteral)
563 data().StructuralIfLiteral =
false;
569 "getStandardLayoutBaseWithFields called on a non-standard-layout type");
570#ifdef EXPENSIVE_CHECKS
572 unsigned NumberOfBasesWithFields = 0;
574 ++NumberOfBasesWithFields;
577 if (!
Base->field_empty())
578 ++NumberOfBasesWithFields;
580 UniqueBases.insert(
Base->getCanonicalDecl()).second &&
581 "Standard layout struct has multiple base classes of the same type");
584 assert(NumberOfBasesWithFields <= 1 &&
585 "Standard layout struct has fields declared in more than one class");
592 if (!
Base->field_empty()) {
644void CXXRecordDecl::markedVirtualFunctionPure() {
647 data().Abstract =
true;
650bool CXXRecordDecl::hasSubobjectAtOffsetZeroOfEmptyBaseType(
661 RD = RD->getCanonicalDecl();
669 if (!RD->data().HasBasesWithFields) {
688 if (M.insert(RD).second)
689 WorkList.push_back(RD);
696 while (!WorkList.empty()) {
706 bool IsFirstField =
true;
707 for (
auto *FD :
X->fields()) {
710 if (FD->isUnnamedBitField())
713 if (!IsFirstField && !FD->isZeroSize(Ctx))
716 if (FD->isInvalidDecl())
726 IsFirstField =
false;
734 assert(
isLambda() &&
"not a lambda");
751void CXXRecordDecl::addedMember(
Decl *
D) {
752 if (!
D->
isImplicit() && !isa<FieldDecl>(
D) && !isa<IndirectFieldDecl>(
D) &&
756 data().HasOnlyCMembers =
false;
762 auto *FunTmpl = dyn_cast<FunctionTemplateDecl>(
D);
764 D = FunTmpl->getTemplatedDecl();
767 Decl *DUnderlying =
D;
768 if (
auto *ND = dyn_cast<NamedDecl>(DUnderlying)) {
769 DUnderlying = ND->getUnderlyingDecl();
770 if (
auto *UnderlyingFunTmpl = dyn_cast<FunctionTemplateDecl>(DUnderlying))
771 DUnderlying = UnderlyingFunTmpl->getTemplatedDecl();
774 if (
const auto *Method = dyn_cast<CXXMethodDecl>(
D)) {
775 if (Method->isVirtual()) {
778 data().Aggregate =
false;
782 data().PlainOldData =
false;
786 data().Empty =
false;
791 data().Polymorphic =
true;
797 data().HasTrivialSpecialMembers &= SMF_Destructor;
798 data().HasTrivialSpecialMembersForCall &= SMF_Destructor;
803 data().IsStandardLayout =
false;
804 data().IsCXX11StandardLayout =
false;
818 if (
const auto *Constructor = dyn_cast<CXXConstructorDecl>(
D)) {
825 data().UserDeclaredConstructor =
true;
835 data().PlainOldData =
false;
840 SMKind |= SMF_DefaultConstructor;
843 data().UserProvidedDefaultConstructor =
true;
845 data().HasConstexprDefaultConstructor =
true;
847 data().HasDefaultedDefaultConstructor =
true;
853 SMKind |= SMF_CopyConstructor;
856 data().HasDeclaredCopyConstructorWithConstParam =
true;
858 SMKind |= SMF_MoveConstructor;
870 data().Aggregate =
false;
875 if (
const auto *Constructor = dyn_cast<CXXConstructorDecl>(DUnderlying)) {
883 data().HasConstexprNonCopyMoveConstructor =
true;
884 if (!isa<CXXConstructorDecl>(
D) &&
Constructor->isDefaultConstructor())
885 data().HasInheritedDefaultConstructor =
true;
889 if (
const auto *Method = dyn_cast<CXXMethodDecl>(
D)) {
890 if (isa<CXXDestructorDecl>(
D))
891 SMKind |= SMF_Destructor;
893 if (Method->isCopyAssignmentOperator()) {
894 SMKind |= SMF_CopyAssignment;
896 const auto *ParamTy =
897 Method->getNonObjectParameter(0)->getType()->getAs<
ReferenceType>();
898 if (!ParamTy || ParamTy->getPointeeType().isConstQualified())
899 data().HasDeclaredCopyAssignmentWithConstParam =
true;
902 if (Method->isMoveAssignmentOperator())
903 SMKind |= SMF_MoveAssignment;
906 if (
auto *Conversion = dyn_cast<CXXConversionDecl>(
D)) {
915 if (Conversion->getPrimaryTemplate()) {
921 FunTmpl ? cast<NamedDecl>(FunTmpl) :
cast<
NamedDecl>(Conversion);
926 Conversions.
addDecl(Ctx, Primary, AS);
933 data().HasTrivialSpecialMembers &=
934 data().DeclaredSpecialMembers | ~SMKind;
935 data().HasTrivialSpecialMembersForCall &=
936 data().DeclaredSpecialMembers | ~SMKind;
940 data().DeclaredSpecialMembers |= SMKind;
941 if (!Method->isImplicit()) {
942 data().UserDeclaredSpecialMembers |= SMKind;
945 if ((!Method->isDeleted() && !Method->isDefaulted() &&
946 SMKind != SMF_MoveAssignment) ||
960 data().PlainOldData =
false;
968 if (!Method->isIneligibleOrNotSelected()) {
977 if (
const auto *Field = dyn_cast<FieldDecl>(
D)) {
985 if (data().HasBasesWithFields)
986 data().IsStandardLayout =
false;
992 if (
Field->isUnnamedBitField()) {
996 if (data().
Empty && !
Field->isZeroLengthBitField(Context) &&
999 data().Empty =
false;
1007 if (data().HasBasesWithNonStaticDataMembers)
1008 data().IsCXX11StandardLayout =
false;
1016 data().Aggregate =
false;
1017 data().PlainOldData =
false;
1022 data().StructuralIfLiteral =
false;
1027 bool IsFirstField = !data().HasPrivateFields &&
1028 !data().HasProtectedFields && !data().HasPublicFields;
1035 case AS_private: data().HasPrivateFields =
true;
break;
1036 case AS_protected: data().HasProtectedFields =
true;
break;
1037 case AS_public: data().HasPublicFields =
true;
break;
1038 case AS_none: llvm_unreachable(
"Invalid access specifier");
1040 if ((data().HasPrivateFields + data().HasProtectedFields +
1041 data().HasPublicFields) > 1) {
1042 data().IsStandardLayout =
false;
1043 data().IsCXX11StandardLayout =
false;
1047 if (
Field->isMutable()) {
1048 data().HasMutableFields =
true;
1053 data().StructuralIfLiteral =
false;
1060 data().HasVariantMembers =
true;
1062 if (
isUnion() && IsFirstField)
1063 data().HasUninitializedFields =
true;
1074 if (
T.hasNonTrivialObjCLifetime()) {
1082 struct DefinitionData &
Data = data();
1083 Data.PlainOldData =
false;
1084 Data.HasTrivialSpecialMembers = 0;
1090 data().HasTrivialSpecialMembersForCall = 0;
1096 Data.HasIrrelevantDestructor =
false;
1099 data().DefaultedCopyConstructorIsDeleted =
true;
1100 data().DefaultedMoveConstructorIsDeleted =
true;
1101 data().DefaultedCopyAssignmentIsDeleted =
true;
1102 data().DefaultedMoveAssignmentIsDeleted =
true;
1103 data().DefaultedDestructorIsDeleted =
true;
1104 data().NeedOverloadResolutionForCopyConstructor =
true;
1105 data().NeedOverloadResolutionForMoveConstructor =
true;
1106 data().NeedOverloadResolutionForCopyAssignment =
true;
1107 data().NeedOverloadResolutionForMoveAssignment =
true;
1108 data().NeedOverloadResolutionForDestructor =
true;
1110 }
else if (!Context.
getLangOpts().ObjCAutoRefCount) {
1113 }
else if (!
T.isCXX98PODType(Context))
1114 data().PlainOldData =
false;
1117 if (!
Field->hasInClassInitializer())
1118 data().HasUninitializedReferenceMember =
true;
1123 data().IsStandardLayout =
false;
1124 data().IsCXX11StandardLayout =
false;
1130 data().DefaultedCopyConstructorIsDeleted =
true;
1134 if (
Field->hasInClassInitializer())
1135 data().HasUninitializedFields =
false;
1136 }
else if (!
Field->hasInClassInitializer() && !
Field->isMutable()) {
1138 if (FieldType->hasDefinition() && !FieldType->allowConstDefaultInit())
1139 data().HasUninitializedFields =
true;
1141 data().HasUninitializedFields =
true;
1147 data().HasNonLiteralTypeFieldsOrBases =
true;
1149 if (
Field->hasInClassInitializer() ||
1150 (
Field->isAnonymousStructOrUnion() &&
1151 Field->getType()->getAsCXXRecordDecl()->hasInClassInitializer())) {
1152 data().HasInClassInitializer =
true;
1157 data().HasTrivialSpecialMembers &= ~SMF_DefaultConstructor;
1165 data().Aggregate =
false;
1169 data().PlainOldData =
false;
1177 data().DefaultedCopyAssignmentIsDeleted =
true;
1178 data().DefaultedMoveAssignmentIsDeleted =
true;
1183 bool IsZeroSize =
Field->isZeroSize(Context);
1186 auto *FieldRec = cast<CXXRecordDecl>(RecordTy->getDecl());
1187 if (FieldRec->getDefinition()) {
1188 addedClassSubobject(FieldRec);
1196 data().NeedOverloadResolutionForCopyConstructor =
true;
1197 data().NeedOverloadResolutionForMoveConstructor =
true;
1198 data().NeedOverloadResolutionForCopyAssignment =
true;
1199 data().NeedOverloadResolutionForMoveAssignment =
true;
1208 if (FieldRec->hasNonTrivialCopyConstructor())
1209 data().DefaultedCopyConstructorIsDeleted =
true;
1210 if (FieldRec->hasNonTrivialMoveConstructor())
1211 data().DefaultedMoveConstructorIsDeleted =
true;
1212 if (FieldRec->hasNonTrivialCopyAssignment())
1213 data().DefaultedCopyAssignmentIsDeleted =
true;
1214 if (FieldRec->hasNonTrivialMoveAssignment())
1215 data().DefaultedMoveAssignmentIsDeleted =
true;
1216 if (FieldRec->hasNonTrivialDestructor()) {
1217 data().DefaultedDestructorIsDeleted =
true;
1221 data().DefaultedDestructorIsConstexpr =
true;
1227 if (
Field->isAnonymousStructOrUnion()) {
1228 data().NeedOverloadResolutionForCopyConstructor |=
1229 FieldRec->data().NeedOverloadResolutionForCopyConstructor;
1230 data().NeedOverloadResolutionForMoveConstructor |=
1231 FieldRec->data().NeedOverloadResolutionForMoveConstructor;
1232 data().NeedOverloadResolutionForCopyAssignment |=
1233 FieldRec->data().NeedOverloadResolutionForCopyAssignment;
1234 data().NeedOverloadResolutionForMoveAssignment |=
1235 FieldRec->data().NeedOverloadResolutionForMoveAssignment;
1236 data().NeedOverloadResolutionForDestructor |=
1237 FieldRec->data().NeedOverloadResolutionForDestructor;
1245 if (!FieldRec->hasTrivialDefaultConstructor())
1246 data().HasTrivialSpecialMembers &= ~SMF_DefaultConstructor;
1254 if (!FieldRec->hasTrivialCopyConstructor())
1255 data().HasTrivialSpecialMembers &= ~SMF_CopyConstructor;
1257 if (!FieldRec->hasTrivialCopyConstructorForCall())
1258 data().HasTrivialSpecialMembersForCall &= ~SMF_CopyConstructor;
1263 if (!FieldRec->hasTrivialMoveConstructor())
1264 data().HasTrivialSpecialMembers &= ~SMF_MoveConstructor;
1266 if (!FieldRec->hasTrivialMoveConstructorForCall())
1267 data().HasTrivialSpecialMembersForCall &= ~SMF_MoveConstructor;
1275 if (!FieldRec->hasTrivialCopyAssignment())
1276 data().HasTrivialSpecialMembers &= ~SMF_CopyAssignment;
1280 if (!FieldRec->hasTrivialMoveAssignment())
1281 data().HasTrivialSpecialMembers &= ~SMF_MoveAssignment;
1283 if (!FieldRec->hasTrivialDestructor())
1284 data().HasTrivialSpecialMembers &= ~SMF_Destructor;
1285 if (!FieldRec->hasTrivialDestructorForCall())
1286 data().HasTrivialSpecialMembersForCall &= ~SMF_Destructor;
1287 if (!FieldRec->hasIrrelevantDestructor())
1288 data().HasIrrelevantDestructor =
false;
1289 if (FieldRec->isAnyDestructorNoReturn())
1290 data().IsAnyDestructorNoReturn =
true;
1291 if (FieldRec->hasObjectMember())
1293 if (FieldRec->hasVolatileMember())
1295 if (FieldRec->getArgPassingRestrictions() ==
1303 if (!FieldRec->isStandardLayout())
1304 data().IsStandardLayout =
false;
1305 if (!FieldRec->isCXX11StandardLayout())
1306 data().IsCXX11StandardLayout =
false;
1312 if (data().IsStandardLayout &&
1313 (
isUnion() || IsFirstField || IsZeroSize) &&
1314 hasSubobjectAtOffsetZeroOfEmptyBaseType(Context, FieldRec))
1315 data().IsStandardLayout =
false;
1321 if (data().IsCXX11StandardLayout && IsFirstField) {
1324 for (
const auto &BI :
bases()) {
1326 data().IsCXX11StandardLayout =
false;
1333 if (FieldRec->hasMutableFields())
1334 data().HasMutableFields =
true;
1336 if (
Field->isMutable()) {
1340 data().NeedOverloadResolutionForCopyConstructor =
true;
1341 data().NeedOverloadResolutionForCopyAssignment =
true;
1351 if (!
Field->hasInClassInitializer() &&
1352 !FieldRec->hasConstexprDefaultConstructor() && !
isUnion())
1355 data().DefaultedDefaultConstructorIsConstexpr =
1363 if (!FieldRec->hasCopyConstructorWithConstParam())
1364 data().ImplicitCopyConstructorCanHaveConstParamForNonVBase =
false;
1372 if (!FieldRec->hasCopyAssignmentWithConstParam())
1373 data().ImplicitCopyAssignmentHasConstParam =
false;
1375 if (FieldRec->hasUninitializedReferenceMember() &&
1376 !
Field->hasInClassInitializer())
1377 data().HasUninitializedReferenceMember =
true;
1382 if (FieldRec->hasVariantMembers() &&
1383 Field->isAnonymousStructOrUnion())
1384 data().HasVariantMembers =
true;
1391 data().DefaultedDefaultConstructorIsConstexpr =
false;
1398 if (
T.isConstQualified()) {
1399 data().DefaultedCopyAssignmentIsDeleted =
true;
1400 data().DefaultedMoveAssignmentIsDeleted =
true;
1409 data().StructuralIfLiteral =
false;
1415 if (data().
Empty && !IsZeroSize)
1416 data().Empty =
false;
1419 const Type *Ty =
Field->getType()->getUnqualifiedDesugaredType();
1420 while (isa<ConstantArrayType>(Ty))
1424 if (
const RecordType *RT = dyn_cast<RecordType>(Ty))
1425 data().IsHLSLIntangible |= RT->getAsCXXRecordDecl()->isHLSLIntangible();
1433 if (
auto *Shadow = dyn_cast<UsingShadowDecl>(
D)) {
1434 if (Shadow->getDeclName().getNameKind()
1437 data().Conversions.get(Ctx).addDecl(Ctx, Shadow, Shadow->getAccess());
1441 if (
const auto *Using = dyn_cast<UsingDecl>(
D)) {
1442 if (
Using->getDeclName().getNameKind() ==
1444 data().HasInheritedConstructor =
true;
1447 data().Aggregate =
false;
1450 if (
Using->getDeclName().getCXXOverloadedOperator() == OO_Equal)
1451 data().HasInheritedAssignment =
true;
1467 bool HasAtLeastOneLiteralMember =
1469 return !
D->getType().isVolatileQualified() &&
1472 if (!HasAtLeastOneLiteralMember)
1491 if (
const auto *DD = dyn_cast<CXXDestructorDecl>(MD)) {
1492 if (DD->isUserProvided())
1493 data().HasIrrelevantDestructor =
false;
1500 if (DD->isVirtual()) {
1501 data().HasTrivialSpecialMembers &= ~SMF_Destructor;
1502 data().HasTrivialSpecialMembersForCall &= ~SMF_Destructor;
1505 if (DD->isNoReturn())
1506 data().IsAnyDestructorNoReturn =
true;
1515 data().HasTrivialSpecialMembers |= SMKind;
1516 data().HasTrivialSpecialMembersForCall |= SMKind;
1518 data().HasTrivialSpecialMembersForCall |= SMKind;
1519 data().DeclaredNonTrivialSpecialMembers |= SMKind;
1521 data().DeclaredNonTrivialSpecialMembers |= SMKind;
1528 data().DeclaredNonTrivialSpecialMembersForCall |= SMKind;
1536 unsigned SMKind = 0;
1538 if (
const auto *Constructor = dyn_cast<CXXConstructorDecl>(
D)) {
1539 if (Constructor->isDefaultConstructor()) {
1540 SMKind |= SMF_DefaultConstructor;
1541 if (Constructor->isConstexpr())
1542 data().HasConstexprDefaultConstructor =
true;
1544 if (Constructor->isCopyConstructor())
1545 SMKind |= SMF_CopyConstructor;
1546 else if (Constructor->isMoveConstructor())
1547 SMKind |= SMF_MoveConstructor;
1548 else if (Constructor->isConstexpr())
1550 data().HasConstexprNonCopyMoveConstructor =
true;
1551 }
else if (isa<CXXDestructorDecl>(
D)) {
1552 SMKind |= SMF_Destructor;
1554 data().HasIrrelevantDestructor =
false;
1555 }
else if (
D->isCopyAssignmentOperator())
1556 SMKind |= SMF_CopyAssignment;
1557 else if (
D->isMoveAssignmentOperator())
1558 SMKind |= SMF_MoveAssignment;
1562 if (!
D->isIneligibleOrNotSelected()) {
1564 data().HasTrivialSpecialMembers |= SMKind;
1566 data().DeclaredNonTrivialSpecialMembers |= SMKind;
1570void CXXRecordDecl::LambdaDefinitionData::AddCaptureList(
ASTContext &Ctx,
1572 Captures.push_back(CaptureList);
1573 if (Captures.size() == 2) {
1581 CXXRecordDecl::LambdaDefinitionData &
Data = getLambdaData();
1584 Data.NumCaptures = Captures.size();
1585 Data.NumExplicitCaptures = 0;
1588 Data.AddCaptureList(Context, ToCapture);
1591 ++
Data.NumExplicitCaptures;
1598 Data.DefaultedCopyAssignmentIsDeleted =
true;
1602 unsigned SMKind = 0;
1604 if (
const auto *Constructor = dyn_cast<CXXConstructorDecl>(
D)) {
1605 if (Constructor->isCopyConstructor())
1606 SMKind = SMF_CopyConstructor;
1607 else if (Constructor->isMoveConstructor())
1608 SMKind = SMF_MoveConstructor;
1609 }
else if (isa<CXXDestructorDecl>(
D))
1610 SMKind = SMF_Destructor;
1612 if (
D->isTrivialForCall())
1613 data().HasTrivialSpecialMembersForCall |= SMKind;
1615 data().DeclaredNonTrivialSpecialMembersForCall |= SMKind;
1621 !TemplateOrInstantiation.isNull())
1626 return isPOD() && data().HasOnlyCMembers;
1631 return getLambdaData().IsGenericLambda;
1643 if (!RD.
isLambda())
return nullptr;
1648 assert(!Calls.
empty() &&
"Missing lambda call operator!");
1650 "More than one lambda call operator!");
1675 auto *MD = cast<NamedDecl>(
D);
1676 if (MD->getOwningModule() == M)
1680 llvm_unreachable(
"Couldn't find our call operator!");
1685 return dyn_cast_or_null<FunctionTemplateDecl>(CallOp);
1691 if (CallOp ==
nullptr)
1694 if (
const auto *CallOpTmpl = dyn_cast<FunctionTemplateDecl>(CallOp))
1695 return cast<CXXMethodDecl>(CallOpTmpl->getTemplatedDecl());
1697 return cast<CXXMethodDecl>(CallOp);
1708 assert(RD.
isLambda() &&
"Must be a lambda");
1715 if (
const auto *InvokerTemplate = dyn_cast<FunctionTemplateDecl>(ND))
1716 return cast<CXXMethodDecl>(InvokerTemplate->getTemplatedDecl());
1717 return cast<CXXMethodDecl>(ND);
1727 cast<ValueDecl>(ND->getAsFunction())->getType()->castAs<
FunctionType>();
1728 if (FTy->getCallConv() == CC)
1736 llvm::DenseMap<const ValueDecl *, FieldDecl *> &Captures,
1739 ThisCapture =
nullptr;
1741 LambdaDefinitionData &Lambda = getLambdaData();
1745 C != CEnd; ++
C, ++Field) {
1746 if (
C->capturesThis())
1747 ThisCapture = *Field;
1748 else if (
C->capturesVariable())
1749 Captures[
C->getCapturedVar()] = *Field;
1760 return Tmpl->getTemplateParameters();
1770 assert(std::is_partitioned(List->begin(), List->end(),
1771 [](
const NamedDecl *
D) { return !D->isImplicit(); })
1772 &&
"Explicit template params should be ordered before implicit ones");
1774 const auto ExplicitEnd = llvm::partition_point(
1780 assert(
isLambda() &&
"Not a lambda closure type!");
1782 return getLambdaData().ContextDecl.get(Source);
1786 assert(
isLambda() &&
"Not a lambda closure type!");
1792 getLambdaData().ContextDecl = Numbering.
ContextDecl;
1797 assert(
isLambda() &&
"Not a lambda closure type!");
1798 return getASTContext().DeviceLambdaManglingNumbers.lookup(
this);
1804 ->getConversionType();
1836 if (ConvI != ConvE) {
1837 HiddenTypesBuffer = ParentHiddenTypes;
1838 HiddenTypes = &HiddenTypesBuffer;
1842 bool Hidden = ParentHiddenTypes.count(ConvType);
1844 HiddenTypesBuffer.insert(ConvType);
1848 if (Hidden && InVirtual)
1849 HiddenVBaseCs.insert(cast<NamedDecl>(I.getDecl()->getCanonicalDecl()));
1857 VOutput.
addDecl(I.getDecl(), IAccess);
1859 Output.
addDecl(Context, I.getDecl(), IAccess);
1865 for (
const auto &I :
Record->bases()) {
1866 const auto *RT = I.getType()->getAs<
RecordType>();
1871 bool BaseInVirtual = InVirtual || I.isVirtual();
1873 auto *
Base = cast<CXXRecordDecl>(RT->getDecl());
1875 *HiddenTypes, Output, VOutput, HiddenVBaseCs);
1902 Output.
append(Context, ConvI, ConvE);
1903 for (; ConvI != ConvE; ++ConvI)
1907 for (
const auto &I :
Record->bases()) {
1908 const auto *RT = I.getType()->getAs<
RecordType>();
1912 I.isVirtual(), I.getAccessSpecifier(),
1913 HiddenTypes, Output, VBaseCs, HiddenVBaseCs);
1919 if (!HiddenVBaseCs.count(cast<NamedDecl>(I.getDecl()->getCanonicalDecl())))
1920 Output.
addDecl(Context, I.getDecl(), I.getAccess());
1926llvm::iterator_range<CXXRecordDecl::conversion_iterator>
1933 Set = &data().Conversions.get(Ctx);
1935 Set = &data().VisibleConversions.get(Ctx);
1937 if (!data().ComputedVisibleConversions) {
1939 data().ComputedVisibleConversions =
true;
1942 return llvm::make_range(
Set->begin(),
Set->end());
1958 for (
unsigned I = 0,
E = Convs.
size(); I !=
E; ++I) {
1959 if (Convs[I].getDecl() == ConvDecl) {
1961 assert(!llvm::is_contained(Convs, ConvDecl) &&
1962 "conversion was found multiple times in unresolved set");
1967 llvm_unreachable(
"conversion not found in set!");
1972 return cast<CXXRecordDecl>(MSInfo->getInstantiatedFrom());
1984 assert(TemplateOrInstantiation.isNull() &&
1985 "Previous template or instantiation?");
1986 assert(!isa<ClassTemplatePartialSpecializationDecl>(
this));
1987 TemplateOrInstantiation
1996 TemplateOrInstantiation = Template;
2000 if (
const auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(
this))
2001 return Spec->getSpecializationKind();
2004 return MSInfo->getTemplateSpecializationKind();
2011 if (
auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(
this)) {
2012 Spec->setSpecializationKind(TSK);
2017 MSInfo->setTemplateSpecializationKind(TSK);
2021 llvm_unreachable(
"Not a class template or member class specialization");
2025 auto GetDefinitionOrSelf =
2027 if (
auto *Def =
D->getDefinition())
2034 if (
auto *TD = dyn_cast<ClassTemplateSpecializationDecl>(
this)) {
2035 auto From = TD->getInstantiatedFrom();
2037 while (
auto *NewCTD = CTD->getInstantiatedFromMemberTemplate()) {
2038 if (NewCTD->isMemberSpecialization())
2042 return GetDefinitionOrSelf(CTD->getTemplatedDecl());
2046 while (
auto *NewCTPSD = CTPSD->getInstantiatedFromMember()) {
2047 if (NewCTPSD->isMemberSpecialization())
2051 return GetDefinitionOrSelf(CTPSD);
2060 return GetDefinitionOrSelf(RD);
2065 "couldn't find pattern for class template instantiation");
2081 for (
auto *
Decl : R) {
2082 auto* DD = dyn_cast<CXXDestructorDecl>(
Decl);
2083 if (DD && !DD->isIneligibleOrNotSelected())
2099 assert(
hasDefinition() &&
"checking for interface-like without a definition");
2113 for (
const auto *
const Method :
methods())
2114 if (Method->isDefined() && !Method->isImplicit())
2118 const auto *Uuid = getAttr<UuidAttr>();
2125 Uuid->getGuid() ==
"00000000-0000-0000-C000-000000000046") ||
2127 Uuid->getGuid() ==
"00020400-0000-0000-C000-000000000046"))) {
2141 if (BaseSpec.isVirtual() || BaseSpec.getAccessSpecifier() !=
AS_public)
2143 const auto *
Base = BaseSpec.getType()->getAsCXXRecordDecl();
2144 if (
Base->isInterface() || !
Base->isInterfaceLike())
2155 if (!FinalOverriders) {
2161 for (
const CXXFinalOverriderMap::value_type &
2162 OverridingMethodsEntry : *FinalOverriders) {
2163 for (
const auto &[_, SubobjOverrides] : OverridingMethodsEntry.second) {
2164 assert(SubobjOverrides.size() > 0 &&
2165 "All virtual functions have overriding virtual functions");
2167 if (SubobjOverrides.front().Method->isPureVirtual())
2190 I.setAccess((*I)->getAccess());
2194 if (data().Abstract ||
isInvalidDecl() || !data().Polymorphic ||
2198 for (
const auto &B :
bases()) {
2199 const auto *BaseDecl =
2201 if (BaseDecl->isAbstract())
2212 if (Def->hasAttr<FinalAttr>())
2214 if (
const auto *Dtor = Def->getDestructor())
2215 if (Dtor->hasAttr<FinalAttr>())
2220void CXXDeductionGuideDecl::anchor() {}
2239 case Decl::Kind::CXXConstructor:
2240 return cast<CXXConstructorDecl>(
Function)->getExplicitSpecifier();
2241 case Decl::Kind::CXXConversion:
2242 return cast<CXXConversionDecl>(
Function)->getExplicitSpecifier();
2243 case Decl::Kind::CXXDeductionGuide:
2244 return cast<CXXDeductionGuideDecl>(
Function)->getExplicitSpecifier();
2257 EndLocation, Ctor,
Kind, TrailingRequiresClause);
2278void CXXMethodDecl::anchor() {}
2308 if (isa<CXXDestructorDecl>(
this)) {
2320 auto *MD = dyn_cast<CXXMethodDecl>(ND);
2348 llvm::erase_if(FinalOverriders, [&](
CXXMethodDecl *OtherD) {
2352 FinalOverriders.push_back(
D);
2355 for (
const auto &I : RD->
bases()) {
2359 const auto *
Base = cast<CXXRecordDecl>(RT->
getDecl());
2361 AddFinalOverrider(
D);
2364 return FinalOverriders.size() == 1 ? FinalOverriders.front() :
nullptr;
2373 Expr *TrailingRequiresClause) {
2375 CXXMethod,
C, RD, StartLoc, NameInfo,
T, TInfo, SC,
UsesFPIntrin,
2376 isInline, ConstexprKind, EndLocation, TrailingRequiresClause);
2389 assert(
isVirtual() &&
"this method is expected to be virtual");
2398 if (hasAttr<FinalAttr>())
2407 Base =
Base->getBestDynamicClassTypeExpr();
2408 if (
Base->isPRValue() &&
Base->getType()->isRecordType())
2413 if (!BestDynamicDecl)
2422 if (!DevirtualizedMethod)
2432 if (DevirtualizedMethod->
hasAttr<FinalAttr>())
2433 return DevirtualizedMethod;
2439 return DevirtualizedMethod;
2441 if (
const auto *DRE = dyn_cast<DeclRefExpr>(
Base)) {
2442 if (
const auto *VD = dyn_cast<VarDecl>(DRE->getDecl()))
2443 if (VD->getType()->isRecordType())
2445 return DevirtualizedMethod;
2453 if (
const auto *ME = dyn_cast<MemberExpr>(
Base)) {
2454 const ValueDecl *VD = ME->getMemberDecl();
2460 if (
auto *BO = dyn_cast<BinaryOperator>(
Base)) {
2461 if (BO->isPtrMemOp()) {
2463 if (MPT->getPointeeType()->isRecordType())
2464 return DevirtualizedMethod;
2474 assert(PreventedBy.empty() &&
"PreventedBy is expected to be empty");
2491 unsigned UsualParams = 1;
2538 for (
const auto *
D : R) {
2539 if (
const auto *FD = dyn_cast<FunctionDecl>(
D)) {
2540 if (FD->getNumParams() == 1) {
2541 PreventedBy.push_back(FD);
2605 assert(MD->
isVirtual() &&
"Method is not virtual!");
2611 if (isa<CXXConstructorDecl>(
this))
return nullptr;
2616 if (isa<CXXConstructorDecl>(
this))
return nullptr;
2621 if (isa<CXXConstructorDecl>(
this))
return 0;
2627 if (isa<CXXConstructorDecl>(
this))
2649 ObjectTy =
C.getLangOpts().HLSL ?
C.getLValueReferenceType(ObjectTy)
2650 :
C.getPointerType(ObjectTy);
2663 assert(
isInstance() &&
"No 'this' for static methods!");
2677 return C.getRValueReferenceType(
Type);
2678 return C.getLValueReferenceType(
Type);
2704 : Initializee(TInfo),
Init(
Init), MemberOrEllipsisLocation(EllipsisLoc),
2705 LParenLoc(L), RParenLoc(R), IsDelegating(
false), IsVirtual(IsVirtual),
2706 IsWritten(
false), SourceOrder(0) {}
2712 : Initializee(
Member),
Init(
Init), MemberOrEllipsisLocation(MemberLoc),
2713 LParenLoc(L), RParenLoc(R), IsDelegating(
false), IsVirtual(
false),
2714 IsWritten(
false), SourceOrder(0) {}
2721 : Initializee(
Member),
Init(
Init), MemberOrEllipsisLocation(MemberLoc),
2722 LParenLoc(L), RParenLoc(R), IsDelegating(
false), IsVirtual(
false),
2723 IsWritten(
false), SourceOrder(0) {}
2729 : Initializee(TInfo),
Init(
Init), LParenLoc(L), RParenLoc(R),
2730 IsDelegating(
true), IsVirtual(
false), IsWritten(
false), SourceOrder(0) {}
2739 return cast<TypeSourceInfo *>(Initializee)->getTypeLoc();
2746 return cast<TypeSourceInfo *>(Initializee)->getType().getTypePtr();
2758 if (
const auto *TSInfo = cast<TypeSourceInfo *>(Initializee))
2759 return TSInfo->getTypeLoc().getBeginLoc();
2767 if (
Expr *I =
D->getInClassInitializer())
2768 return I->getSourceRange();
2775CXXConstructorDecl::CXXConstructorDecl(
2782 SC_None, UsesFPIntrin, isInline, ConstexprKind,
2784 setNumCtorInitializers(0);
2785 setInheritingConstructor(
static_cast<bool>(Inherited));
2786 setImplicit(isImplicitlyDeclared);
2787 CXXConstructorDeclBits.HasTrailingExplicitSpecifier = ES.
getExpr() ? 1 : 0;
2789 *getTrailingObjects<InheritedConstructor>() = Inherited;
2790 setExplicitSpecifier(ES);
2793void CXXConstructorDecl::anchor() {}
2797 uint64_t AllocKind) {
2798 bool hasTrailingExplicit =
static_cast<bool>(AllocKind & TAKHasTailExplicit);
2800 static_cast<bool>(AllocKind & TAKInheritsConstructor);
2802 additionalSizeToAlloc<InheritedConstructor, ExplicitSpecifier>(
2809 Result->CXXConstructorDeclBits.HasTrailingExplicitSpecifier =
2810 hasTrailingExplicit;
2823 "Name must refer to a constructor");
2825 additionalSizeToAlloc<InheritedConstructor, ExplicitSpecifier>(
2826 Inherited ? 1 : 0, ES.
getExpr() ? 1 : 0);
2829 isImplicitlyDeclared, ConstexprKind, Inherited, TrailingRequiresClause);
2839 if (
const auto *Construct = dyn_cast<CXXConstructExpr>(
E))
2840 return Construct->getConstructor();
2940void CXXDestructorDecl::anchor() {}
2952 bool UsesFPIntrin,
bool isInline,
bool isImplicitlyDeclared,
2956 "Name must refer to a destructor");
2959 isImplicitlyDeclared, ConstexprKind, TrailingRequiresClause);
2964 if (OD && !
First->OperatorDelete) {
2965 First->OperatorDelete = OD;
2966 First->OperatorDeleteThisArg = ThisArg;
2968 L->ResolvedOperatorDelete(
First, OD, ThisArg);
2972void CXXConversionDecl::anchor() {}
2987 Expr *TrailingRequiresClause) {
2990 "Name must refer to a conversion function");
2993 ConstexprKind, EndLocation, TrailingRequiresClause);
3010void LinkageSpecDecl::anchor() {}
3017 return new (
C, DC)
LinkageSpecDecl(DC, ExternLoc, LangLoc, Lang, HasBraces);
3027void UsingDirectiveDecl::anchor() {}
3036 if (
auto *NS = dyn_cast_or_null<NamespaceDecl>(
Used))
3037 Used = NS->getFirstDecl();
3039 IdentLoc,
Used, CommonAncestor);
3051 if (
auto *NA = dyn_cast_or_null<NamespaceAliasDecl>(NominatedNamespace))
3052 return NA->getNamespace();
3053 return cast_or_null<NamespaceDecl>(NominatedNamespace);
3061 redeclarable_base(
C), LocStart(StartLoc) {
3064 setPreviousDecl(PrevDecl);
3093void NamespaceAliasDecl::anchor() {}
3115 if (
auto *NS = dyn_cast_or_null<NamespaceDecl>(Namespace))
3116 Namespace = NS->getFirstDecl();
3118 QualifierLoc, IdentLoc, Namespace);
3129void LifetimeExtendedTemporaryDecl::anchor() {}
3138 if (isa<FieldDecl>(ExtendingDecl))
3142 if (isa<BindingDecl>(ExtendingDecl))
3145 return cast<VarDecl>(ExtendingDecl)->getStorageDuration();
3150 "don't need to cache the computed value for this temporary");
3151 if (MayCreate && !
Value) {
3155 assert(
Value &&
"may not be null");
3159void UsingShadowDecl::anchor() {}
3165 UsingOrNextShadow(Introducer) {
3167 assert(!isa<UsingShadowDecl>(
Target));
3184 while (
const auto *NextShadow =
3185 dyn_cast<UsingShadowDecl>(Shadow->UsingOrNextShadow))
3186 Shadow = NextShadow;
3187 return cast<BaseUsingDecl>(Shadow->UsingOrNextShadow);
3190void ConstructorUsingShadowDecl::anchor() {}
3209void BaseUsingDecl::anchor() {}
3212 assert(!llvm::is_contained(
shadows(), S) &&
"declaration already in set");
3213 assert(S->getIntroducer() ==
this);
3215 if (FirstUsingShadow.getPointer())
3216 S->UsingOrNextShadow = FirstUsingShadow.getPointer();
3217 FirstUsingShadow.setPointer(S);
3221 assert(llvm::is_contained(
shadows(), S) &&
"declaration not in set");
3222 assert(S->getIntroducer() ==
this);
3226 if (FirstUsingShadow.getPointer() == S) {
3227 FirstUsingShadow.setPointer(
3228 dyn_cast<UsingShadowDecl>(S->UsingOrNextShadow));
3229 S->UsingOrNextShadow =
this;
3234 while (Prev->UsingOrNextShadow != S)
3235 Prev = cast<UsingShadowDecl>(Prev->UsingOrNextShadow);
3236 Prev->UsingOrNextShadow = S->UsingOrNextShadow;
3237 S->UsingOrNextShadow =
this;
3240void UsingDecl::anchor() {}
3246 return new (
C, DC)
UsingDecl(DC, UL, QualifierLoc, NameInfo, HasTypename);
3261void UsingEnumDecl::anchor() {}
3284void UsingPackDecl::anchor() {}
3289 size_t Extra = additionalSizeToAlloc<NamedDecl *>(UsingDecls.size());
3290 return new (
C, DC, Extra)
UsingPackDecl(DC, InstantiatedFrom, UsingDecls);
3294 unsigned NumExpansions) {
3295 size_t Extra = additionalSizeToAlloc<NamedDecl *>(NumExpansions);
3297 Result->NumExpansions = NumExpansions;
3299 for (
unsigned I = 0; I != NumExpansions; ++I)
3304void UnresolvedUsingValueDecl::anchor() {}
3313 QualifierLoc, NameInfo,
3332void UnresolvedUsingTypenameDecl::anchor() {}
3343 DC, UsingLoc, TypenameLoc, QualifierLoc, TargetNameLoc,
3364 return new (Ctx,
ID)
3368UnresolvedUsingIfExistsDecl::UnresolvedUsingIfExistsDecl(
DeclContext *DC,
3373void UnresolvedUsingIfExistsDecl::anchor() {}
3375void StaticAssertDecl::anchor() {}
3393 assert((isa<VarDecl, BindingDecl>(
this)) &&
3394 "expected a VarDecl or a BindingDecl");
3395 if (
auto *Var = llvm::dyn_cast<VarDecl>(
this))
3397 if (
auto *BD = llvm::dyn_cast<BindingDecl>(
this))
3398 return llvm::dyn_cast<VarDecl>(BD->getDecomposedDecl());
3402void BindingDecl::anchor() {}
3421 auto *VD = cast<VarDecl>(DRE->getDecl());
3422 assert(VD->isImplicit() &&
"holding var for binding decl not implicit");
3426void DecompositionDecl::anchor() {}
3434 size_t Extra = additionalSizeToAlloc<BindingDecl *>(
Bindings.size());
3435 return new (
C, DC, Extra)
3441 unsigned NumBindings) {
3442 size_t Extra = additionalSizeToAlloc<BindingDecl *>(NumBindings);
3447 Result->NumBindings = NumBindings;
3449 for (
unsigned I = 0; I != NumBindings; ++I)
3461 B->printName(OS, Policy);
3467void MSPropertyDecl::anchor() {}
3475 return new (
C, DC)
MSPropertyDecl(DC, L, N,
T, TInfo, StartL, Getter, Setter);
3485void MSGuidDecl::anchor() {}
3502 OS << llvm::format(
"GUID{%08" PRIx32
"-%04" PRIx16
"-%04" PRIx16
"-",
3505 for (uint8_t Byte : PartVal.
Part4And5) {
3506 OS << llvm::format(
"%02" PRIx8, Byte);
3519 auto IsInt = [&Ctx](
unsigned N) {
3526 auto IsArray = [&Ctx](MatcherRef Elem,
unsigned N) {
3533 auto IsStruct = [](std::initializer_list<MatcherRef> Fields) {
3541 if (
auto *CXXRD = dyn_cast<CXXRecordDecl>(RD))
3542 if (CXXRD->getNumBases())
3544 auto MatcherIt = Fields.begin();
3546 if (FD->isUnnamedBitField())
3548 if (FD->isBitField() || MatcherIt == Fields.end() ||
3549 !(*MatcherIt)(FD->getType()))
3553 return MatcherIt == Fields.end();
3558 return IsStruct({IsInt(32), IsInt(16), IsInt(16), IsArray(IsInt(8), 8)})(
T);
3571 for (
unsigned I = 0; I != 8; ++I) {
3583void UnnamedGlobalConstantDecl::anchor() {}
3585UnnamedGlobalConstantDecl::UnnamedGlobalConstantDecl(
const ASTContext &
C,
3594 if (
Value.needsCleanup())
3595 C.addDestruction(&
Value);
3613 OS <<
"unnamed-global-constant";
3619 llvm_unreachable(
"Invalid access specifier!");
3627 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.
enum clang::sema::@1714::IndirectLocalPathEntry::EntryKind Kind
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 hasPureVirtualFinalOverrider(const CXXRecordDecl &RD, const CXXFinalOverriderMap *FinalOverriders)
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.
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 * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
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, Expr *TrailingRequiresClause=nullptr)
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.
bool isStandardLayout() const
Determine whether this class is standard-layout per C++ [class]p7.
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.
const CXXRecordDecl * getStandardLayoutBaseWithFields() const
If this is a standard-layout class or union, any and all data members will be declared in the same ty...
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.
Module * getOwningModule() const
Get the module that owns this declaration (for visibility purposes).
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)
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
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.
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.
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.
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...
Describes a module or submodule.
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.
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)
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.
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
bool isHLSLBuiltinIntangibleType() const
const T * castAs() const
Member-template castAs<specific type>.
bool isReferenceType() const
const Type * getArrayElementTypeNoTypeQual() const
If this is an array type, return the element type of the array, potentially with type qualifiers miss...
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...
bool isHLSLAttributedResourceType() const
const T * getAs() const
Member-template getAs<specific type>'.
const Type * getUnqualifiedDesugaredType() const
Return the specified type with any "sugar" removed from the type, removing any typedefs,...
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...
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.