39 #include "llvm/ADT/None.h"
40 #include "llvm/ADT/SmallPtrSet.h"
41 #include "llvm/ADT/SmallVector.h"
42 #include "llvm/ADT/iterator_range.h"
43 #include "llvm/Support/Casting.h"
44 #include "llvm/Support/ErrorHandling.h"
45 #include "llvm/Support/Format.h"
46 #include "llvm/Support/raw_ostream.h"
52 using namespace clang;
58 void AccessSpecDecl::anchor() {}
64 void 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);
75 CXXRecordDecl::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), HasInClassInitializer(
false),
83 HasUninitializedReferenceMember(
false), HasUninitializedFields(
false),
84 HasInheritedConstructor(
false),
85 HasInheritedDefaultConstructor(
false),
86 HasInheritedAssignment(
false),
87 NeedOverloadResolutionForCopyConstructor(
false),
88 NeedOverloadResolutionForMoveConstructor(
false),
89 NeedOverloadResolutionForCopyAssignment(
false),
90 NeedOverloadResolutionForMoveAssignment(
false),
91 NeedOverloadResolutionForDestructor(
false),
92 DefaultedCopyConstructorIsDeleted(
false),
93 DefaultedMoveConstructorIsDeleted(
false),
94 DefaultedCopyAssignmentIsDeleted(
false),
95 DefaultedMoveAssignmentIsDeleted(
false),
96 DefaultedDestructorIsDeleted(
false), HasTrivialSpecialMembers(SMF_All),
97 HasTrivialSpecialMembersForCall(SMF_All),
98 DeclaredNonTrivialSpecialMembers(0),
99 DeclaredNonTrivialSpecialMembersForCall(0), HasIrrelevantDestructor(
true),
100 HasConstexprNonCopyMoveConstructor(
false),
101 HasDefaultedDefaultConstructor(
false),
102 DefaultedDefaultConstructorIsConstexpr(
true),
103 HasConstexprDefaultConstructor(
false),
104 DefaultedDestructorIsConstexpr(
true),
105 HasNonLiteralTypeFieldsOrBases(
false), StructuralIfLiteral(
true),
106 UserProvidedDefaultConstructor(
false), DeclaredSpecialMembers(0),
107 ImplicitCopyConstructorCanHaveConstParamForVBase(
true),
108 ImplicitCopyConstructorCanHaveConstParamForNonVBase(
true),
109 ImplicitCopyAssignmentHasConstParam(
true),
110 HasDeclaredCopyConstructorWithConstParam(
false),
111 HasDeclaredCopyAssignmentWithConstParam(
false), IsLambda(
false),
112 IsParsingBaseSpecifiers(
false), ComputedVisibleConversions(
false),
113 HasODRHash(
false), Definition(D) {}
116 return Bases.get(
Definition->getASTContext().getExternalSource());
119 CXXBaseSpecifier *CXXRecordDecl::DefinitionData::getVBasesSlowCase()
const {
120 return VBases.get(
Definition->getASTContext().getExternalSource());
127 :
RecordDecl(K, TK, C, DC, StartLoc, IdLoc,
Id, PrevDecl),
128 DefinitionData(PrevDecl ? PrevDecl->DefinitionData
135 bool DelayTypeCreation) {
136 auto *R =
new (C, DC)
CXXRecordDecl(CXXRecord, TK, C, DC, StartLoc, IdLoc,
Id,
138 R->setMayHaveOutOfDateDef(C.getLangOpts().Modules);
141 if (!DelayTypeCreation)
142 C.getTypeDeclType(R, PrevDecl);
149 bool Dependent,
bool IsGeneric,
153 R->setBeingDefined(
true);
155 new (C)
struct LambdaDefinitionData(R, Info, Dependent, IsGeneric,
157 R->setMayHaveOutOfDateDef(
false);
158 R->setImplicit(
true);
159 C.getTypeDeclType(R,
nullptr);
168 R->setMayHaveOutOfDateDef(
false);
178 while (!WorkList.empty()) {
181 if (
const CXXRecordDecl *B = BaseSpec.getType()->getAsCXXRecordDecl()) {
182 if (!SeenBaseTypes.insert(B).second)
184 WorkList.push_back(B);
196 if (!data().Bases.isOffset() && data().NumBases > 0)
197 C.Deallocate(data().getBases());
200 if (!C.getLangOpts().CPlusPlus17) {
203 data().Aggregate =
false;
208 data().PlainOldData =
false;
218 data().NumBases = NumBases;
219 for (
unsigned i = 0; i < NumBases; ++i) {
220 data().getBases()[i] = *Bases[i];
227 auto *BaseClassDecl =
235 if (BaseClassDecl->data().HasBasesWithFields ||
236 !BaseClassDecl->field_empty()) {
237 if (data().HasBasesWithFields)
239 data().IsStandardLayout =
false;
240 data().HasBasesWithFields =
true;
247 if (BaseClassDecl->data().HasBasesWithNonStaticDataMembers ||
248 BaseClassDecl->hasDirectFields()) {
249 if (data().HasBasesWithNonStaticDataMembers)
250 data().IsCXX11StandardLayout =
false;
251 data().HasBasesWithNonStaticDataMembers =
true;
254 if (!BaseClassDecl->isEmpty()) {
258 data().Empty =
false;
264 data().Aggregate =
false;
269 data().StructuralIfLiteral =
false;
275 if (BaseClassDecl->isPolymorphic()) {
276 data().Polymorphic =
true;
279 data().Aggregate =
false;
285 if (!BaseClassDecl->isStandardLayout())
286 data().IsStandardLayout =
false;
287 if (!BaseClassDecl->isCXX11StandardLayout())
288 data().IsCXX11StandardLayout =
false;
292 data().HasNonLiteralTypeFieldsOrBases =
true;
295 for (
const auto &VBase : BaseClassDecl->vbases()) {
297 if (SeenVBaseTypes.insert(C.getCanonicalType(VBase.getType())).second) {
298 VBases.push_back(&VBase);
305 if (
CXXRecordDecl *VBaseDecl = VBase.getType()->getAsCXXRecordDecl())
306 if (!VBaseDecl->hasCopyConstructorWithConstParam())
307 data().ImplicitCopyConstructorCanHaveConstParamForVBase =
false;
311 data().Aggregate =
false;
315 if (
Base->isVirtual()) {
317 if (SeenVBaseTypes.insert(C.getCanonicalType(BaseType)).second)
318 VBases.push_back(
Base);
323 data().Empty =
false;
327 data().Aggregate =
false;
333 data().HasTrivialSpecialMembers &= SMF_Destructor;
334 data().HasTrivialSpecialMembersForCall &= SMF_Destructor;
339 data().IsStandardLayout =
false;
340 data().IsCXX11StandardLayout =
false;
346 data().DefaultedDefaultConstructorIsConstexpr =
false;
347 data().DefaultedDestructorIsConstexpr =
false;
354 if (!BaseClassDecl->hasCopyConstructorWithConstParam())
355 data().ImplicitCopyConstructorCanHaveConstParamForVBase =
false;
361 if (!BaseClassDecl->hasTrivialDefaultConstructor())
362 data().HasTrivialSpecialMembers &= ~SMF_DefaultConstructor;
369 if (!BaseClassDecl->hasTrivialCopyConstructor())
370 data().HasTrivialSpecialMembers &= ~SMF_CopyConstructor;
372 if (!BaseClassDecl->hasTrivialCopyConstructorForCall())
373 data().HasTrivialSpecialMembersForCall &= ~SMF_CopyConstructor;
379 if (!BaseClassDecl->hasTrivialMoveConstructor())
380 data().HasTrivialSpecialMembers &= ~SMF_MoveConstructor;
382 if (!BaseClassDecl->hasTrivialMoveConstructorForCall())
383 data().HasTrivialSpecialMembersForCall &= ~SMF_MoveConstructor;
390 if (!BaseClassDecl->hasTrivialCopyAssignment())
391 data().HasTrivialSpecialMembers &= ~SMF_CopyAssignment;
396 if (!BaseClassDecl->hasTrivialMoveAssignment())
397 data().HasTrivialSpecialMembers &= ~SMF_MoveAssignment;
403 if (!BaseClassDecl->hasConstexprDefaultConstructor())
404 data().DefaultedDefaultConstructorIsConstexpr =
false;
411 if (!BaseClassDecl->hasCopyConstructorWithConstParam())
412 data().ImplicitCopyConstructorCanHaveConstParamForNonVBase =
false;
418 if (!BaseClassDecl->hasTrivialDestructor())
419 data().HasTrivialSpecialMembers &= ~SMF_Destructor;
421 if (!BaseClassDecl->hasTrivialDestructorForCall())
422 data().HasTrivialSpecialMembersForCall &= ~SMF_Destructor;
424 if (!BaseClassDecl->hasIrrelevantDestructor())
425 data().HasIrrelevantDestructor =
false;
432 if (!BaseClassDecl->hasCopyAssignmentWithConstParam())
433 data().ImplicitCopyAssignmentHasConstParam =
false;
437 if (BaseClassDecl->hasObjectMember())
440 if (BaseClassDecl->hasVolatileMember())
443 if (BaseClassDecl->getArgPassingRestrictions() ==
448 if (BaseClassDecl->hasMutableFields())
449 data().HasMutableFields =
true;
451 if (BaseClassDecl->hasUninitializedReferenceMember())
452 data().HasUninitializedReferenceMember =
true;
454 if (!BaseClassDecl->allowConstDefaultInit())
455 data().HasUninitializedFields =
true;
457 addedClassSubobject(BaseClassDecl);
468 data().IsStandardLayout =
false;
470 if (VBases.empty()) {
471 data().IsParsingBaseSpecifiers =
false;
477 data().NumVBases = VBases.size();
478 for (
int I = 0, E = VBases.size(); I != E; ++I) {
482 data().getVBases()[I] = *VBases[I];
485 data().IsParsingBaseSpecifiers =
false;
489 assert(
hasDefinition() &&
"ODRHash only for records with definitions");
492 if (DefinitionData->HasODRHash)
493 return DefinitionData->ODRHash;
498 DefinitionData->HasODRHash =
true;
501 return DefinitionData->ODRHash;
504 void CXXRecordDecl::addedClassSubobject(
CXXRecordDecl *Subobj) {
512 data().NeedOverloadResolutionForCopyConstructor =
true;
514 data().NeedOverloadResolutionForMoveConstructor =
true;
523 data().NeedOverloadResolutionForCopyAssignment =
true;
525 data().NeedOverloadResolutionForMoveAssignment =
true;
535 data().NeedOverloadResolutionForCopyConstructor =
true;
536 data().NeedOverloadResolutionForMoveConstructor =
true;
537 data().NeedOverloadResolutionForDestructor =
true;
546 data().DefaultedDestructorIsConstexpr =
false;
552 if (!Subobj->data().StructuralIfLiteral)
553 data().StructuralIfLiteral =
false;
585 void CXXRecordDecl::markedVirtualFunctionPure() {
588 data().Abstract =
true;
591 bool CXXRecordDecl::hasSubobjectAtOffsetZeroOfEmptyBaseType(
602 RD = RD->getCanonicalDecl();
610 if (!RD->data().HasBasesWithFields) {
629 if (M.insert(RD).second)
630 WorkList.push_back(RD);
637 while (!WorkList.empty()) {
647 bool IsFirstField =
true;
648 for (
auto *FD :
X->fields()) {
651 if (FD->isUnnamedBitfield())
654 if (!IsFirstField && !FD->isZeroSize(Ctx))
664 IsFirstField =
false;
672 assert(
isLambda() &&
"not a lambda");
689 void CXXRecordDecl::addedMember(
Decl *D) {
691 !isa<FieldDecl>(D) &&
692 !isa<IndirectFieldDecl>(D) &&
693 (!isa<TagDecl>(D) || cast<TagDecl>(D)->getTagKind() ==
TTK_Class ||
695 data().HasOnlyCMembers =
false;
701 auto *FunTmpl = dyn_cast<FunctionTemplateDecl>(D);
703 D = FunTmpl->getTemplatedDecl();
706 Decl *DUnderlying = D;
707 if (
auto *ND = dyn_cast<NamedDecl>(DUnderlying)) {
708 DUnderlying = ND->getUnderlyingDecl();
709 if (
auto *UnderlyingFunTmpl = dyn_cast<FunctionTemplateDecl>(DUnderlying))
710 DUnderlying = UnderlyingFunTmpl->getTemplatedDecl();
713 if (
const auto *Method = dyn_cast<CXXMethodDecl>(D)) {
714 if (Method->isVirtual()) {
717 data().Aggregate =
false;
721 data().PlainOldData =
false;
725 data().Empty =
false;
730 data().Polymorphic =
true;
736 data().HasTrivialSpecialMembers &= SMF_Destructor;
737 data().HasTrivialSpecialMembersForCall &= SMF_Destructor;
742 data().IsStandardLayout =
false;
743 data().IsCXX11StandardLayout =
false;
751 L->AddedCXXImplicitMember(data().Definition, D);
757 if (
const auto *Constructor = dyn_cast<CXXConstructorDecl>(D)) {
764 data().UserDeclaredConstructor =
true;
771 data().PlainOldData =
false;
775 SMKind |= SMF_DefaultConstructor;
778 data().UserProvidedDefaultConstructor =
true;
780 data().HasConstexprDefaultConstructor =
true;
782 data().HasDefaultedDefaultConstructor =
true;
788 SMKind |= SMF_CopyConstructor;
791 data().HasDeclaredCopyConstructorWithConstParam =
true;
793 SMKind |= SMF_MoveConstructor;
805 data().Aggregate =
false;
810 if (
const auto *Constructor = dyn_cast<CXXConstructorDecl>(DUnderlying)) {
818 data().HasConstexprNonCopyMoveConstructor =
true;
819 if (!isa<CXXConstructorDecl>(D) &&
Constructor->isDefaultConstructor())
820 data().HasInheritedDefaultConstructor =
true;
824 if (
const auto *DD = dyn_cast<CXXDestructorDecl>(D)) {
825 SMKind |= SMF_Destructor;
827 if (DD->isUserProvided())
828 data().HasIrrelevantDestructor =
false;
835 if (DD->isVirtual()) {
836 data().HasTrivialSpecialMembers &= ~SMF_Destructor;
837 data().HasTrivialSpecialMembersForCall &= ~SMF_Destructor;
842 if (
const auto *Method = dyn_cast<CXXMethodDecl>(D)) {
843 if (Method->isCopyAssignmentOperator()) {
844 SMKind |= SMF_CopyAssignment;
846 const auto *ParamTy =
848 if (!ParamTy || ParamTy->getPointeeType().isConstQualified())
849 data().HasDeclaredCopyAssignmentWithConstParam =
true;
852 if (Method->isMoveAssignmentOperator())
853 SMKind |= SMF_MoveAssignment;
856 if (
auto *Conversion = dyn_cast<CXXConversionDecl>(D)) {
865 if (Conversion->getPrimaryTemplate()) {
871 FunTmpl ? cast<NamedDecl>(FunTmpl) :
cast<
NamedDecl>(Conversion);
876 Conversions.
addDecl(Ctx, Primary, AS);
883 data().HasTrivialSpecialMembers &=
884 data().DeclaredSpecialMembers | ~SMKind;
885 data().HasTrivialSpecialMembersForCall &=
886 data().DeclaredSpecialMembers | ~SMKind;
888 if (!Method->isImplicit() && !Method->isUserProvided()) {
892 }
else if (Method->isTrivial()) {
893 data().HasTrivialSpecialMembers |= SMKind;
894 data().HasTrivialSpecialMembersForCall |= SMKind;
895 }
else if (Method->isTrivialForCall()) {
896 data().HasTrivialSpecialMembersForCall |= SMKind;
897 data().DeclaredNonTrivialSpecialMembers |= SMKind;
899 data().DeclaredNonTrivialSpecialMembers |= SMKind;
905 if (!Method->isUserProvided())
906 data().DeclaredNonTrivialSpecialMembersForCall |= SMKind;
911 data().DeclaredSpecialMembers |= SMKind;
913 if (!Method->isImplicit()) {
914 data().UserDeclaredSpecialMembers |= SMKind;
927 data().PlainOldData =
false;
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->hasObjectMember())
1238 if (FieldRec->hasVolatileMember())
1240 if (FieldRec->getArgPassingRestrictions() ==
1248 if (!FieldRec->isStandardLayout())
1249 data().IsStandardLayout =
false;
1250 if (!FieldRec->isCXX11StandardLayout())
1251 data().IsCXX11StandardLayout =
false;
1257 if (data().IsStandardLayout &&
1258 (
isUnion() || IsFirstField || IsZeroSize) &&
1259 hasSubobjectAtOffsetZeroOfEmptyBaseType(Context, FieldRec))
1260 data().IsStandardLayout =
false;
1266 if (data().IsCXX11StandardLayout && IsFirstField) {
1269 for (
const auto &BI :
bases()) {
1271 data().IsCXX11StandardLayout =
false;
1278 if (FieldRec->hasMutableFields())
1279 data().HasMutableFields =
true;
1281 if (
Field->isMutable()) {
1285 data().NeedOverloadResolutionForCopyConstructor =
true;
1286 data().NeedOverloadResolutionForCopyAssignment =
true;
1296 if (!
Field->hasInClassInitializer() &&
1297 !FieldRec->hasConstexprDefaultConstructor() && !
isUnion())
1300 data().DefaultedDefaultConstructorIsConstexpr =
false;
1307 if (!FieldRec->hasCopyConstructorWithConstParam())
1308 data().ImplicitCopyConstructorCanHaveConstParamForNonVBase =
false;
1316 if (!FieldRec->hasCopyAssignmentWithConstParam())
1317 data().ImplicitCopyAssignmentHasConstParam =
false;
1319 if (FieldRec->hasUninitializedReferenceMember() &&
1320 !
Field->hasInClassInitializer())
1321 data().HasUninitializedReferenceMember =
true;
1326 if (FieldRec->hasVariantMembers() &&
1327 Field->isAnonymousStructOrUnion())
1328 data().HasVariantMembers =
true;
1335 data().DefaultedDefaultConstructorIsConstexpr =
false;
1343 data().DefaultedCopyAssignmentIsDeleted =
true;
1344 data().DefaultedMoveAssignmentIsDeleted =
true;
1353 data().StructuralIfLiteral =
false;
1359 if (data().Empty && !IsZeroSize)
1360 data().Empty =
false;
1364 if (
auto *Shadow = dyn_cast<UsingShadowDecl>(D)) {
1365 if (Shadow->getDeclName().getNameKind()
1368 data().Conversions.get(Ctx).addDecl(Ctx, Shadow, Shadow->getAccess());
1372 if (
const auto *Using = dyn_cast<UsingDecl>(D)) {
1373 if (
Using->getDeclName().getNameKind() ==
1375 data().HasInheritedConstructor =
true;
1378 data().Aggregate =
false;
1381 if (
Using->getDeclName().getCXXOverloadedOperator() == OO_Equal)
1382 data().HasInheritedAssignment =
true;
1390 unsigned SMKind = 0;
1392 if (
const auto *Constructor = dyn_cast<CXXConstructorDecl>(D)) {
1393 if (Constructor->isDefaultConstructor()) {
1394 SMKind |= SMF_DefaultConstructor;
1395 if (Constructor->isConstexpr())
1396 data().HasConstexprDefaultConstructor =
true;
1398 if (Constructor->isCopyConstructor())
1399 SMKind |= SMF_CopyConstructor;
1400 else if (Constructor->isMoveConstructor())
1401 SMKind |= SMF_MoveConstructor;
1402 else if (Constructor->isConstexpr())
1404 data().HasConstexprNonCopyMoveConstructor =
true;
1405 }
else if (isa<CXXDestructorDecl>(D)) {
1406 SMKind |= SMF_Destructor;
1408 data().HasIrrelevantDestructor =
false;
1410 SMKind |= SMF_CopyAssignment;
1412 SMKind |= SMF_MoveAssignment;
1417 data().HasTrivialSpecialMembers |= SMKind;
1419 data().DeclaredNonTrivialSpecialMembers |= SMKind;
1424 CXXRecordDecl::LambdaDefinitionData &Data = getLambdaData();
1427 Data.NumCaptures = Captures.size();
1428 Data.NumExplicitCaptures = 0;
1432 for (
unsigned I = 0, N = Captures.size(); I != N; ++I) {
1433 if (Captures[I].isExplicit())
1434 ++Data.NumExplicitCaptures;
1436 *ToCapture++ = Captures[I];
1440 Data.DefaultedCopyAssignmentIsDeleted =
true;
1444 unsigned SMKind = 0;
1446 if (
const auto *Constructor = dyn_cast<CXXConstructorDecl>(D)) {
1447 if (Constructor->isCopyConstructor())
1448 SMKind = SMF_CopyConstructor;
1449 else if (Constructor->isMoveConstructor())
1450 SMKind = SMF_MoveConstructor;
1451 }
else if (isa<CXXDestructorDecl>(D))
1452 SMKind = SMF_Destructor;
1455 data().HasTrivialSpecialMembersForCall |= SMKind;
1457 data().DeclaredNonTrivialSpecialMembersForCall |= SMKind;
1462 !TemplateOrInstantiation.isNull())
1467 return isPOD() && data().HasOnlyCMembers;
1472 return getLambdaData().IsGenericLambda;
1485 if (!RD.
isLambda())
return nullptr;
1490 assert(!Calls.
empty() &&
"Missing lambda call operator!");
1492 "More than one lambda call operator!");
1493 return Calls.
front();
1498 return dyn_cast_or_null<FunctionTemplateDecl>(CallOp);
1504 if (CallOp ==
nullptr)
1507 if (
const auto *CallOpTmpl = dyn_cast<FunctionTemplateDecl>(CallOp))
1508 return cast<CXXMethodDecl>(CallOpTmpl->getTemplatedDecl());
1510 return cast<CXXMethodDecl>(CallOp);
1521 assert(RD.
isLambda() &&
"Must be a lambda");
1528 if (
const auto *InvokerTemplate = dyn_cast<FunctionTemplateDecl>(ND))
1529 return cast<CXXMethodDecl>(InvokerTemplate->getTemplatedDecl());
1530 return cast<CXXMethodDecl>(ND);
1540 cast<ValueDecl>(ND->getAsFunction())->getType()->castAs<
FunctionType>();
1541 if (FTy->getCallConv() == CC)
1549 llvm::DenseMap<const VarDecl *, FieldDecl *> &Captures,
1552 ThisCapture =
nullptr;
1554 LambdaDefinitionData &Lambda = getLambdaData();
1556 for (
const LambdaCapture *
C = Lambda.Captures, *CEnd =
C + Lambda.NumCaptures;
1557 C != CEnd; ++
C, ++Field) {
1558 if (
C->capturesThis())
1559 ThisCapture = *Field;
1560 else if (
C->capturesVariable())
1561 Captures[
C->getCapturedVar()] = *Field;
1571 return Tmpl->getTemplateParameters();
1581 assert(std::is_partitioned(List->begin(), List->end(),
1582 [](
const NamedDecl *D) { return !D->isImplicit(); })
1583 &&
"Explicit template params should be ordered before implicit ones");
1585 const auto ExplicitEnd = llvm::partition_point(
1587 return llvm::makeArrayRef(List->begin(), ExplicitEnd);
1591 assert(
isLambda() &&
"Not a lambda closure type!");
1593 return getLambdaData().ContextDecl.get(Source);
1597 assert(
isLambda() &&
"Not a lambda closure type!");
1603 assert(
isLambda() &&
"Not a lambda closure type!");
1604 auto I =
getASTContext().DeviceLambdaManglingNumbers.find(
this);
1613 ->getConversionType();
1645 if (ConvI != ConvE) {
1646 HiddenTypesBuffer = ParentHiddenTypes;
1647 HiddenTypes = &HiddenTypesBuffer;
1651 bool Hidden = ParentHiddenTypes.count(ConvType);
1653 HiddenTypesBuffer.insert(ConvType);
1657 if (Hidden && InVirtual)
1658 HiddenVBaseCs.insert(cast<NamedDecl>(I.getDecl()->getCanonicalDecl()));
1666 VOutput.
addDecl(I.getDecl(), IAccess);
1668 Output.
addDecl(Context, I.getDecl(), IAccess);
1674 for (
const auto &I : Record->
bases()) {
1675 const auto *RT = I.getType()->getAs<
RecordType>();
1680 bool BaseInVirtual = InVirtual || I.isVirtual();
1682 auto *
Base = cast<CXXRecordDecl>(RT->getDecl());
1684 *HiddenTypes, Output, VOutput, HiddenVBaseCs);
1711 Output.
append(Context, ConvI, ConvE);
1712 for (; ConvI != ConvE; ++ConvI)
1716 for (
const auto &I : Record->
bases()) {
1717 const auto *RT = I.getType()->getAs<
RecordType>();
1721 I.isVirtual(), I.getAccessSpecifier(),
1722 HiddenTypes, Output, VBaseCs, HiddenVBaseCs);
1728 if (!HiddenVBaseCs.count(cast<NamedDecl>(I.getDecl()->getCanonicalDecl())))
1729 Output.
addDecl(Context, I.getDecl(), I.getAccess());
1735 llvm::iterator_range<CXXRecordDecl::conversion_iterator>
1742 Set = &data().Conversions.get(Ctx);
1744 Set = &data().VisibleConversions.get(Ctx);
1746 if (!data().ComputedVisibleConversions) {
1748 data().ComputedVisibleConversions =
true;
1751 return llvm::make_range(Set->
begin(), Set->
end());
1767 for (
unsigned I = 0, E = Convs.
size(); I != E; ++I) {
1768 if (Convs[I].getDecl() == ConvDecl) {
1770 assert(llvm::find(Convs, ConvDecl) == Convs.
end() &&
1771 "conversion was found multiple times in unresolved set");
1776 llvm_unreachable(
"conversion not found in set!");
1781 return cast<CXXRecordDecl>(MSInfo->getInstantiatedFrom());
1793 assert(TemplateOrInstantiation.isNull() &&
1794 "Previous template or instantiation?");
1795 assert(!isa<ClassTemplatePartialSpecializationDecl>(
this));
1796 TemplateOrInstantiation
1805 TemplateOrInstantiation = Template;
1809 if (
const auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(
this))
1810 return Spec->getSpecializationKind();
1813 return MSInfo->getTemplateSpecializationKind();
1820 if (
auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(
this)) {
1821 Spec->setSpecializationKind(TSK);
1826 MSInfo->setTemplateSpecializationKind(TSK);
1830 llvm_unreachable(
"Not a class template or member class specialization");
1834 auto GetDefinitionOrSelf =
1836 if (
auto *Def = D->getDefinition())
1843 if (
auto *TD = dyn_cast<ClassTemplateSpecializationDecl>(
this)) {
1844 auto From = TD->getInstantiatedFrom();
1846 while (
auto *NewCTD = CTD->getInstantiatedFromMemberTemplate()) {
1847 if (NewCTD->isMemberSpecialization())
1851 return GetDefinitionOrSelf(CTD->getTemplatedDecl());
1855 while (
auto *NewCTPSD = CTPSD->getInstantiatedFromMember()) {
1856 if (NewCTPSD->isMemberSpecialization())
1860 return GetDefinitionOrSelf(CTPSD);
1869 return GetDefinitionOrSelf(RD);
1874 "couldn't find pattern for class template instantiation");
1888 return R.
empty() ? nullptr : dyn_cast<CXXDestructorDecl>(R.
front());
1894 if (Destructor->isNoReturn())
1900 if (RD->isAnyDestructorNoReturn())
1904 for (
const auto *Field :
fields())
1906 Field->getType()->getBaseElementTypeUnsafe()->getAsCXXRecordDecl())
1907 if (RD->isAnyDestructorNoReturn())
1924 assert(
hasDefinition() &&
"checking for interface-like without a definition");
1938 for (
const auto *
const Method :
methods())
1939 if (Method->isDefined() && !Method->isImplicit())
1943 const auto *Uuid = getAttr<UuidAttr>();
1950 Uuid->getGuid() ==
"00000000-0000-0000-C000-000000000046") ||
1952 Uuid->getGuid() ==
"00020400-0000-0000-C000-000000000046"))) {
1966 if (BaseSpec.isVirtual() || BaseSpec.getAccessSpecifier() !=
AS_public)
1968 const auto *
Base = BaseSpec.getType()->getAsCXXRecordDecl();
1969 if (
Base->isInterface() || !
Base->isInterfaceLike())
1985 if (!FinalOverriders) {
1987 FinalOverriders = &MyFinalOverriders;
1991 for (CXXFinalOverriderMap::iterator M = FinalOverriders->begin(),
1992 MEnd = FinalOverriders->end();
1993 M != MEnd && !Done; ++M) {
1995 SOEnd = M->second.end();
1996 SO != SOEnd && !Done; ++SO) {
1997 assert(SO->second.size() > 0 &&
1998 "All virtual functions have overriding virtual functions");
2004 if (SO->second.front().Method->isPure()) {
2005 data().Abstract =
true;
2016 I.setAccess((*I)->getAccess());
2020 if (data().Abstract ||
isInvalidDecl() || !data().Polymorphic ||
2024 for (
const auto &B :
bases()) {
2025 const auto *BaseDecl =
2027 if (BaseDecl->isAbstract())
2038 if (Def->hasAttr<FinalAttr>())
2040 if (
const auto *Dtor = Def->getDestructor())
2041 if (Dtor->hasAttr<FinalAttr>())
2046 void CXXDeductionGuideDecl::anchor() {}
2064 switch (Function->getDeclKind()) {
2065 case Decl::Kind::CXXConstructor:
2066 return cast<CXXConstructorDecl>(Function)->getExplicitSpecifier();
2067 case Decl::Kind::CXXConversion:
2068 return cast<CXXConversionDecl>(Function)->getExplicitSpecifier();
2069 case Decl::Kind::CXXDeductionGuide:
2070 return cast<CXXDeductionGuideDecl>(Function)->getExplicitSpecifier();
2081 TInfo, EndLocation);
2101 void CXXMethodDecl::anchor() {}
2131 if (isa<CXXDestructorDecl>(
this)) {
2143 auto *MD = dyn_cast<CXXMethodDecl>(ND);
2171 FinalOverriders.erase(
2172 std::remove_if(FinalOverriders.begin(), FinalOverriders.end(),
2174 return recursivelyOverrides(D, OtherD);
2176 FinalOverriders.end());
2178 FinalOverriders.push_back(D);
2181 for (
const auto &I : RD->
bases()) {
2185 const auto *
Base = cast<CXXRecordDecl>(RT->
getDecl());
2187 AddFinalOverrider(D);
2190 return FinalOverriders.size() == 1 ? FinalOverriders.front() :
nullptr;
2200 Expr *TrailingRequiresClause) {
2202 CXXMethodDecl(CXXMethod,
C, RD, StartLoc, NameInfo, T, TInfo, SC,
2203 isInline, ConstexprKind, EndLocation,
2204 TrailingRequiresClause);
2216 assert(
isVirtual() &&
"this method is expected to be virtual");
2225 if (hasAttr<FinalAttr>())
2226 return isPure() ? nullptr :
this;
2234 Base =
Base->getBestDynamicClassTypeExpr();
2235 if (
Base->isRValue() &&
Base->getType()->isRecordType())
2240 if (!BestDynamicDecl)
2249 if (!DevirtualizedMethod)
2255 if (DevirtualizedMethod->
isPure())
2259 if (DevirtualizedMethod->
hasAttr<FinalAttr>())
2260 return DevirtualizedMethod;
2266 return DevirtualizedMethod;
2268 if (
const auto *DRE = dyn_cast<DeclRefExpr>(
Base)) {
2269 if (
const auto *VD = dyn_cast<VarDecl>(DRE->getDecl()))
2270 if (VD->getType()->isRecordType())
2272 return DevirtualizedMethod;
2280 if (
const auto *ME = dyn_cast<MemberExpr>(
Base)) {
2281 const ValueDecl *VD = ME->getMemberDecl();
2287 if (
auto *BO = dyn_cast<BinaryOperator>(
Base)) {
2288 if (BO->isPtrMemOp()) {
2290 if (MPT->getPointeeType()->isRecordType())
2291 return DevirtualizedMethod;
2301 assert(PreventedBy.empty() &&
"PreventedBy is expected to be empty");
2318 unsigned UsualParams = 1;
2365 for (
const auto *D : R) {
2366 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
2367 if (FD->getNumParams() == 1) {
2368 PreventedBy.push_back(FD);
2408 if (!isa<RValueReferenceType>(ParamType))
2421 "Can't add an overridden method to a class template!");
2422 assert(MD->
isVirtual() &&
"Method is not virtual!");
2428 if (isa<CXXConstructorDecl>(
this))
return nullptr;
2433 if (isa<CXXConstructorDecl>(
this))
return nullptr;
2438 if (isa<CXXConstructorDecl>(
this))
return 0;
2444 if (isa<CXXConstructorDecl>(
this))
2459 return C.getPointerType(ObjectTy);
2474 assert(
isInstance() &&
"No 'this' for static methods!");
2481 assert(
isInstance() &&
"No 'this' for static methods!");
2509 : Initializee(TInfo), Init(Init), MemberOrEllipsisLocation(EllipsisLoc),
2510 LParenLoc(L), RParenLoc(R), IsDelegating(
false), IsVirtual(IsVirtual),
2511 IsWritten(
false), SourceOrder(0) {}
2517 : Initializee(
Member), Init(Init), MemberOrEllipsisLocation(MemberLoc),
2518 LParenLoc(L), RParenLoc(R), IsDelegating(
false), IsVirtual(
false),
2519 IsWritten(
false), SourceOrder(0) {}
2526 : Initializee(
Member), Init(Init), MemberOrEllipsisLocation(MemberLoc),
2527 LParenLoc(L), RParenLoc(R), IsDelegating(
false), IsVirtual(
false),
2528 IsWritten(
false), SourceOrder(0) {}
2534 : Initializee(TInfo), Init(Init), LParenLoc(L), RParenLoc(R),
2535 IsDelegating(
true), IsVirtual(
false), IsWritten(
false), SourceOrder(0) {}
2551 return Initializee.get<
TypeSourceInfo*>()->getType().getTypePtr();
2564 return TSInfo->getTypeLoc().getLocalSourceRange().getBegin();
2573 return I->getSourceRange();
2580 CXXConstructorDecl::CXXConstructorDecl(
2585 Expr *TrailingRequiresClause)
2586 :
CXXMethodDecl(CXXConstructor,
C, RD, StartLoc, NameInfo, T, TInfo,
2588 TrailingRequiresClause) {
2589 setNumCtorInitializers(0);
2590 setInheritingConstructor(
static_cast<bool>(Inherited));
2591 setImplicit(isImplicitlyDeclared);
2592 CXXConstructorDeclBits.HasTrailingExplicitSpecifier = ES.
getExpr() ? 1 : 0;
2594 *getTrailingObjects<InheritedConstructor>() = Inherited;
2595 setExplicitSpecifier(ES);
2598 void CXXConstructorDecl::anchor() {}
2602 uint64_t AllocKind) {
2603 bool hasTraillingExplicit =
static_cast<bool>(AllocKind & TAKHasTailExplicit);
2605 static_cast<bool>(AllocKind & TAKInheritsConstructor);
2607 additionalSizeToAlloc<InheritedConstructor, ExplicitSpecifier>(
2614 Result->CXXConstructorDeclBits.HasTrailingExplicitSpecifier =
2615 hasTraillingExplicit;
2625 Expr *TrailingRequiresClause) {
2628 "Name must refer to a constructor");
2630 additionalSizeToAlloc<InheritedConstructor, ExplicitSpecifier>(
2631 Inherited ? 1 : 0, ES.
getExpr() ? 1 : 0);
2632 return new (
C, RD, Extra)
2634 isImplicitlyDeclared, ConstexprKind, Inherited,
2635 TrailingRequiresClause);
2645 if (
const auto *Construct = dyn_cast<CXXConstructExpr>(E))
2646 return Construct->getConstructor();
2746 void CXXDestructorDecl::anchor() {}
2759 Expr *TrailingRequiresClause) {
2762 "Name must refer to a destructor");
2765 isImplicitlyDeclared, ConstexprKind,
2766 TrailingRequiresClause);
2771 if (OD && !
First->OperatorDelete) {
2772 First->OperatorDelete = OD;
2773 First->OperatorDeleteThisArg = ThisArg;
2775 L->ResolvedOperatorDelete(
First, OD, ThisArg);
2779 void CXXConversionDecl::anchor() {}
2796 "Name must refer to a conversion function");
2799 ConstexprKind, EndLocation, TrailingRequiresClause);
2816 void LinkageSpecDecl::anchor() {}
2824 return new (
C, DC)
LinkageSpecDecl(DC, ExternLoc, LangLoc, Lang, HasBraces);
2833 void UsingDirectiveDecl::anchor() {}
2842 if (
auto *NS = dyn_cast_or_null<NamespaceDecl>(
Used))
2843 Used = NS->getOriginalNamespace();
2845 IdentLoc,
Used, CommonAncestor);
2857 if (
auto *NA = dyn_cast_or_null<NamespaceAliasDecl>(NominatedNamespace))
2858 return NA->getNamespace();
2859 return cast_or_null<NamespaceDecl>(NominatedNamespace);
2866 redeclarable_base(
C), LocStart(StartLoc),
2867 AnonOrFirstNamespaceAndInline(nullptr, Inline) {
2868 setPreviousDecl(PrevDecl);
2891 return AnonOrFirstNamespaceAndInline.getPointer();
2898 return AnonOrFirstNamespaceAndInline.getPointer();
2915 void NamespaceAliasDecl::anchor() {}
2937 if (
auto *NS = dyn_cast_or_null<NamespaceDecl>(Namespace))
2938 Namespace = NS->getOriginalNamespace();
2940 QualifierLoc, IdentLoc, Namespace);
2951 void LifetimeExtendedTemporaryDecl::anchor() {}
2960 if (isa<FieldDecl>(ExtendingDecl))
2964 if (isa<BindingDecl>(ExtendingDecl))
2967 return cast<VarDecl>(ExtendingDecl)->getStorageDuration();
2972 "don't need to cache the computed value for this temporary");
2973 if (MayCreate && !
Value) {
2977 assert(
Value &&
"may not be null");
2981 void UsingShadowDecl::anchor() {}
3004 while (
const auto *NextShadow =
3005 dyn_cast<UsingShadowDecl>(Shadow->UsingOrNextShadow))
3006 Shadow = NextShadow;
3007 return cast<UsingDecl>(Shadow->UsingOrNextShadow);
3010 void ConstructorUsingShadowDecl::anchor() {}
3029 void UsingDecl::anchor() {}
3033 "declaration already in set");
3034 assert(S->getUsingDecl() ==
this);
3036 if (FirstUsingShadow.getPointer())
3037 S->UsingOrNextShadow = FirstUsingShadow.getPointer();
3038 FirstUsingShadow.setPointer(S);
3043 "declaration not in set");
3044 assert(S->getUsingDecl() ==
this);
3048 if (FirstUsingShadow.getPointer() == S) {
3049 FirstUsingShadow.setPointer(
3050 dyn_cast<UsingShadowDecl>(S->UsingOrNextShadow));
3051 S->UsingOrNextShadow =
this;
3056 while (Prev->UsingOrNextShadow != S)
3057 Prev = cast<UsingShadowDecl>(Prev->UsingOrNextShadow);
3058 Prev->UsingOrNextShadow = S->UsingOrNextShadow;
3059 S->UsingOrNextShadow =
this;
3066 return new (
C, DC)
UsingDecl(DC, UL, QualifierLoc, NameInfo, HasTypename);
3081 void UsingPackDecl::anchor() {}
3086 size_t Extra = additionalSizeToAlloc<NamedDecl *>(UsingDecls.size());
3087 return new (
C, DC, Extra)
UsingPackDecl(DC, InstantiatedFrom, UsingDecls);
3091 unsigned NumExpansions) {
3092 size_t Extra = additionalSizeToAlloc<NamedDecl *>(NumExpansions);
3094 Result->NumExpansions = NumExpansions;
3095 auto *Trail = Result->getTrailingObjects<
NamedDecl *>();
3096 for (
unsigned I = 0; I != NumExpansions; ++I)
3101 void UnresolvedUsingValueDecl::anchor() {}
3110 QualifierLoc, NameInfo,
3129 void UnresolvedUsingTypenameDecl::anchor() {}
3140 DC, UsingLoc, TypenameLoc, QualifierLoc, TargetNameLoc,
3151 void StaticAssertDecl::anchor() {}
3169 void BindingDecl::anchor() {}
3183 return cast_or_null<ValueDecl>(Decomp.
get(Source));
3194 auto *VD = cast<VarDecl>(DRE->getDecl());
3195 assert(VD->isImplicit() &&
"holding var for binding decl not implicit");
3199 void DecompositionDecl::anchor() {}
3207 size_t Extra = additionalSizeToAlloc<BindingDecl *>(Bindings.size());
3208 return new (
C, DC, Extra)
3214 unsigned NumBindings) {
3215 size_t Extra = additionalSizeToAlloc<BindingDecl *>(NumBindings);
3216 auto *Result =
new (
C,
ID, Extra)
3220 Result->NumBindings = NumBindings;
3221 auto *Trail = Result->getTrailingObjects<
BindingDecl *>();
3222 for (
unsigned I = 0; I != NumBindings; ++I)
3239 void MSPropertyDecl::anchor() {}
3247 return new (
C, DC)
MSPropertyDecl(DC, L, N, T, TInfo, StartL, Getter, Setter);
3257 void MSGuidDecl::anchor() {}
3261 PartVal(
P), APVal() {}
3273 OS << llvm::format(
"GUID{%08" PRIx32
"-%04" PRIx16
"-%04" PRIx16
"-",
3276 for (uint8_t Byte : PartVal.
Part4And5) {
3277 OS << llvm::format(
"%02" PRIx8, Byte);
3290 auto IsInt = [&Ctx](
unsigned N) {
3297 auto IsArray = [&Ctx](MatcherRef Elem,
unsigned N) {
3298 return [&Ctx, Elem, N](
QualType T) {
3304 auto IsStruct = [](std::initializer_list<MatcherRef> Fields) {
3312 if (
auto *CXXRD = dyn_cast<CXXRecordDecl>(RD))
3313 if (CXXRD->getNumBases())
3315 auto MatcherIt = Fields.begin();
3317 if (FD->isUnnamedBitfield())
continue;
3318 if (FD->isBitField() || MatcherIt == Fields.end() ||
3319 !(*MatcherIt)(FD->getType()))
3323 return MatcherIt == Fields.end();
3328 return IsStruct({IsInt(32), IsInt(16), IsInt(16), IsArray(IsInt(8), 8)})(T);
3341 for (
unsigned I = 0; I != 8; ++I) {
3356 llvm_unreachable(
"Invalid access specifier!");
3364 llvm_unreachable(
"Invalid access specifier!");