57#include "llvm/ADT/DenseMap.h"
58#include "llvm/ADT/FoldingSet.h"
59#include "llvm/ADT/SmallPtrSet.h"
60#include "llvm/ADT/SmallVector.h"
61#include "llvm/ADT/iterator_range.h"
62#include "llvm/Bitstream/BitstreamReader.h"
63#include "llvm/Support/ErrorHandling.h"
64#include "llvm/Support/SaveAndRestore.h"
73using namespace serialization;
81class RedeclarableResult {
88 : MergeWith(MergeWith), FirstID(FirstID), IsKeyDecl(IsKeyDecl) {}
94 bool isKeyDecl()
const {
return IsKeyDecl; }
98 Decl *getKnownMergeTarget()
const {
return MergeWith; }
116 template <
typename T>
120 template <
typename T>
122 RedeclarableResult &Redecl) {
124 D, Existing, Redecl.isKeyDecl() ? Redecl.getFirstID() :
GlobalDeclID());
131 struct CXXRecordDecl::DefinitionData &&NewDD);
133 struct ObjCInterfaceDecl::DefinitionData &&NewDD);
135 struct ObjCProtocolDecl::DefinitionData &&NewDD);
148 ASTReader::RecordLocation Loc;
154 TypeID DeferredTypeID = 0;
155 unsigned AnonymousDeclNumber = 0;
162 bool IsDeclMarkedUsed =
false;
164 uint64_t GetCurrentCursorOffset();
166 uint64_t ReadLocalOffset() {
167 uint64_t LocalOffset =
Record.readInt();
168 assert(LocalOffset <
Loc.Offset &&
"offset point after current record");
169 return LocalOffset ?
Loc.Offset - LocalOffset : 0;
172 uint64_t ReadGlobalOffset() {
173 uint64_t Local = ReadLocalOffset();
174 return Local ?
Record.getGlobalBitOffset(Local) : 0;
185 std::string readString() {
return Record.readString(); }
187 Decl *readDecl() {
return Record.readDecl(); }
189 template <
typename T>
T *readDeclAs() {
return Record.readDeclAs<
T>(); }
198 Module *readModule() {
return Record.getSubmodule(readSubmoduleID()); }
201 Decl *LambdaContext =
nullptr,
202 unsigned IndexInLambdaContext = 0);
203 void ReadCXXDefinitionData(
struct CXXRecordDecl::DefinitionData &
Data,
205 unsigned IndexInLambdaContext);
206 void ReadObjCDefinitionData(
struct ObjCInterfaceDecl::DefinitionData &
Data);
207 void ReadObjCDefinitionData(
struct ObjCProtocolDecl::DefinitionData &
Data);
228 class FindExistingResult {
232 bool AddResult =
false;
233 unsigned AnonymousDeclNumber = 0;
237 FindExistingResult(
ASTReader &Reader) : Reader(Reader) {}
240 unsigned AnonymousDeclNumber,
242 : Reader(Reader),
New(
New), Existing(Existing), AddResult(
true),
243 AnonymousDeclNumber(AnonymousDeclNumber),
244 TypedefNameForLinkage(TypedefNameForLinkage) {}
246 FindExistingResult(FindExistingResult &&
Other)
248 AddResult(
Other.AddResult),
249 AnonymousDeclNumber(
Other.AnonymousDeclNumber),
250 TypedefNameForLinkage(
Other.TypedefNameForLinkage) {
251 Other.AddResult =
false;
254 FindExistingResult &operator=(FindExistingResult &&) =
delete;
255 ~FindExistingResult();
259 void suppress() { AddResult =
false; }
261 operator NamedDecl *()
const {
return Existing; }
263 template <
typename T>
operator T *()
const {
264 return dyn_cast_or_null<T>(Existing);
270 FindExistingResult findExisting(
NamedDecl *
D);
277 ThisDeclID(thisDeclID), ThisDeclLoc(ThisDeclLoc) {}
279 template <
typename DeclT>
284 template <
typename DeclT>
294 template <
typename DeclT>
299 template <
typename DeclT>
304 llvm::BitstreamCursor &DeclsCursor,
bool IsPartial);
313 Cat->NextClassCategory = Next;
419 template <
typename T>
422 template <
typename T>
426 RedeclarableResult &Redecl);
462template <
typename DeclT>
class MergedRedeclIterator {
463 DeclT *Start =
nullptr;
464 DeclT *Canonical =
nullptr;
465 DeclT *Current =
nullptr;
468 MergedRedeclIterator() =
default;
469 MergedRedeclIterator(DeclT *Start) : Start(Start), Current(Start) {}
473 MergedRedeclIterator &operator++() {
474 if (Current->isFirstDecl()) {
476 Current = Current->getMostRecentDecl();
478 Current = Current->getPreviousDecl();
484 if (Current == Start || Current == Canonical)
489 friend bool operator!=(
const MergedRedeclIterator &A,
490 const MergedRedeclIterator &B) {
491 return A.Current != B.Current;
497template <
typename DeclT>
498static llvm::iterator_range<MergedRedeclIterator<DeclT>>
500 return llvm::make_range(MergedRedeclIterator<DeclT>(
D),
501 MergedRedeclIterator<DeclT>());
504uint64_t ASTDeclReader::GetCurrentCursorOffset() {
505 return Loc.F->DeclsCursor.GetCurrentBitNo() + Loc.F->GlobalBitOffset;
510 Reader.DefinitionSource[FD] =
511 Loc.F->Kind == ModuleKind::MK_MainFile ||
514 if (
auto *CD = dyn_cast<CXXConstructorDecl>(FD)) {
515 CD->setNumCtorInitializers(
Record.readInt());
516 if (CD->getNumCtorInitializers())
517 CD->CtorInitializers = ReadGlobalOffset();
520 Reader.PendingBodies[FD] = GetCurrentCursorOffset();
523 Reader.ThisDeclarationWasADefinitionSet.insert(FD);
532 IsDeclMarkedUsed =
false;
534 if (
auto *DD = dyn_cast<DeclaratorDecl>(
D)) {
535 if (
auto *TInfo = DD->getTypeSourceInfo())
536 Record.readTypeLoc(TInfo->getTypeLoc());
539 if (
auto *TD = dyn_cast<TypeDecl>(
D)) {
541 if (isa<TagDecl, TypedefDecl, TypeAliasDecl>(TD))
542 assert(DeferredTypeID == 0 &&
543 "Deferred type not used for TagDecls and Typedefs");
549 if (NamedDeclForTagDecl.
isValid())
550 cast<TagDecl>(
D)->TypedefNameDeclOrQualifier =
551 cast<TypedefNameDecl>(Reader.
GetDecl(NamedDeclForTagDecl));
552 }
else if (
auto *ID = dyn_cast<ObjCInterfaceDecl>(
D)) {
555 }
else if (
auto *FD = dyn_cast<FunctionDecl>(
D)) {
559 }
else if (
auto *VD = dyn_cast<VarDecl>(
D)) {
561 }
else if (
auto *FD = dyn_cast<FieldDecl>(
D)) {
562 if (FD->hasInClassInitializer() &&
Record.readInt()) {
563 FD->setLazyInClassInitializer(
LazyDeclStmtPtr(GetCurrentCursorOffset()));
570 auto ModuleOwnership =
574 IsDeclMarkedUsed |=
D->Used;
577 bool HasStandaloneLexicalDC = DeclBits.
getNextBit();
584 isa<ParmVarDecl, ObjCTypeParamDecl>(
D)) {
591 GlobalDeclID SemaDCIDForTemplateParmDecl = readDeclID();
594 if (LexicalDCIDForTemplateParmDecl.
isInvalid())
595 LexicalDCIDForTemplateParmDecl = SemaDCIDForTemplateParmDecl;
596 Reader.addPendingDeclContextInfo(
D,
597 SemaDCIDForTemplateParmDecl,
598 LexicalDCIDForTemplateParmDecl);
601 auto *SemaDC = readDeclAs<DeclContext>();
603 HasStandaloneLexicalDC ? readDeclAs<DeclContext>() :
nullptr;
609 if (
auto *RD = dyn_cast<CXXRecordDecl>(SemaDC))
610 MergedSemaDC = getOrFakePrimaryClassDefinition(Reader, RD);
612 MergedSemaDC = Reader.MergedDeclContexts.lookup(SemaDC);
615 D->setDeclContextsImpl(MergedSemaDC ? MergedSemaDC : SemaDC, LexicalDC,
622 Record.readAttributes(Attrs);
633 switch (ModuleOwnership) {
659 Reader.HiddenNamesMap[Owner].push_back(
D);
661 }
else if (ModulePrivate) {
670 std::string Arg = readString();
671 memcpy(
D->getTrailingObjects(), Arg.data(), Arg.size());
672 D->getTrailingObjects()[Arg.size()] =
'\0';
678 std::string Name = readString();
679 memcpy(
D->getTrailingObjects(), Name.data(), Name.size());
680 D->getTrailingObjects()[Name.size()] =
'\0';
682 D->ValueStart = Name.size() + 1;
683 std::string
Value = readString();
685 D->getTrailingObjects()[
D->ValueStart +
Value.size()] =
'\0';
689 llvm_unreachable(
"Translation units are not serialized");
695 AnonymousDeclNumber =
Record.readInt();
702 if (!isa<TagDecl, TypedefDecl, TypeAliasDecl>(TD))
703 DeferredTypeID =
Record.getGlobalTypeID(
Record.readInt());
730 if (
auto *
Template = readDeclAs<TypeAliasTemplateDecl>())
757 Record.readQualifierInfo(*Info);
758 TD->TypedefNameDeclOrQualifier = Info;
762 NamedDeclForTagDecl = readDeclID();
763 TypedefNameForLinkage =
Record.readIdentifier();
766 llvm_unreachable(
"unexpected tag info kind");
769 if (!isa<CXXRecordDecl>(TD))
783 ED->setNumPositiveBits(EnumDeclBits.
getNextBits(8));
784 ED->setNumNegativeBits(EnumDeclBits.
getNextBits(8));
789 ED->setHasODRHash(
true);
790 ED->ODRHash =
Record.readInt();
807 Reader.MergedDeclContexts.insert(std::make_pair(ED, OldDef));
814 Reader.PendingEnumOdrMergeFailures[OldDef].push_back(ED);
820 if (
auto *InstED = readDeclAs<EnumDecl>()) {
823 ED->setInstantiationOfMemberEnum(Reader.
getContext(), InstED, TSK);
852 RD->setODRHash(
Record.readInt());
858 RecordDecl *&OldDef = Reader.RecordDefinitions[Canon];
870 Reader.MergedDeclContexts.insert(std::make_pair(RD, OldDef));
874 Reader.PendingRecordOdrMergeFailures[OldDef].push_back(RD);
886 if (isa<FunctionDecl, VarDecl>(VD))
887 DeferredTypeID =
Record.getGlobalTypeID(
Record.readInt());
904 auto *Info =
new (Reader.
getContext()) DeclaratorDecl::ExtInfo();
905 Record.readQualifierInfo(*Info);
913 TSIType.
isNull() ?
nullptr
929 auto *
Template = readDeclAs<FunctionTemplateDecl>();
935 auto *InstFD = readDeclAs<FunctionDecl>();
938 FD->setInstantiationOfMemberFunction(Reader.
getContext(), InstFD, TSK);
943 auto *
Template = readDeclAs<FunctionTemplateDecl>();
948 Record.readTemplateArgumentList(TemplArgs,
true);
952 bool HasTemplateArgumentsAsWritten =
Record.readBool();
953 if (HasTemplateArgumentsAsWritten)
954 Record.readTemplateArgumentListInfo(TemplArgsWritten);
964 auto *FD = readDeclAs<FunctionDecl>();
975 HasTemplateArgumentsAsWritten ? &TemplArgsWritten :
nullptr, POI,
977 FD->TemplateOrSpecialization = FTInfo;
982 auto *CanonTemplate = readDeclAs<FunctionTemplateDecl>();
988 llvm::FoldingSetNodeID ID;
990 void *InsertPos =
nullptr;
998 "already deserialized this template specialization");
1007 unsigned NumCandidates =
Record.readInt();
1008 while (NumCandidates--)
1009 Candidates.
addDecl(readDeclAs<NamedDecl>());
1013 bool HasTemplateArgumentsAsWritten =
Record.readBool();
1014 if (HasTemplateArgumentsAsWritten)
1015 Record.readTemplateArgumentListInfo(TemplArgsWritten);
1019 HasTemplateArgumentsAsWritten ? &TemplArgsWritten :
nullptr);
1038 Reader.PendingDeducedFunctionTypes.push_back({FD, DeferredTypeID});
1060 const bool Pure = FunctionDeclBits.
getNextBit();
1081 FD->EndRangeLoc = readSourceLocation();
1085 FD->ODRHash =
Record.readInt();
1086 FD->setHasODRHash(
true);
1092 if (
auto Info =
Record.readInt()) {
1093 bool HasMessage = Info & 2;
1095 HasMessage ? cast<StringLiteral>(
Record.readExpr()) :
nullptr;
1097 unsigned NumLookups =
Record.readInt();
1099 for (
unsigned I = 0; I != NumLookups; ++I) {
1107 Reader.
getContext(), Lookups, DeletedMessage));
1118 auto merge = [
this, &Redecl, FD](
auto &&F) {
1119 auto *Existing = cast_or_null<FunctionDecl>(Redecl.getKnownMergeTarget());
1120 RedeclarableResult NewRedecl(Existing ? F(Existing) :
nullptr,
1121 Redecl.getFirstID(), Redecl.isKeyDecl());
1139 unsigned NumParams =
Record.readInt();
1141 Params.reserve(NumParams);
1142 for (
unsigned I = 0; I != NumParams; ++I)
1143 Params.push_back(readDeclAs<ParmVarDecl>());
1149 if (FD->
hasAttr<SYCLKernelEntryPointAttr>()) {
1150 auto *SKEPAttr = FD->
getAttr<SYCLKernelEntryPointAttr>();
1152 const SYCLKernelInfo *SKI =
C.findSYCLKernelInfo(SKEPAttr->getKernelName());
1158 diag::note_previous_declaration);
1159 SKEPAttr->setInvalidAttr();
1162 C.registerSYCLEntryPointFunction(FD);
1172 Reader.PendingBodies[MD] = GetCurrentCursorOffset();
1175 MD->
setCmdDecl(readDeclAs<ImplicitParamDecl>());
1188 readDeclAs<ObjCMethodDecl>());
1196 MD->DeclEndLoc = readSourceLocation();
1197 unsigned NumParams =
Record.readInt();
1199 Params.reserve(NumParams);
1200 for (
unsigned I = 0; I != NumParams; ++I)
1201 Params.push_back(readDeclAs<ParmVarDecl>());
1204 unsigned NumStoredSelLocs =
Record.readInt();
1206 SelLocs.reserve(NumStoredSelLocs);
1207 for (
unsigned i = 0; i != NumStoredSelLocs; ++i)
1208 SelLocs.push_back(readSourceLocation());
1210 MD->setParamsAndSelLocs(Reader.
getContext(), Params, SelLocs);
1216 D->Variance =
Record.readInt();
1218 D->VarianceLoc = readSourceLocation();
1219 D->ColonLoc = readSourceLocation();
1229 unsigned numParams =
Record.readInt();
1234 typeParams.reserve(numParams);
1235 for (
unsigned i = 0; i != numParams; ++i) {
1236 auto *typeParam = readDeclAs<ObjCTypeParamDecl>();
1240 typeParams.push_back(typeParam);
1247 typeParams, rAngleLoc);
1250void ASTDeclReader::ReadObjCDefinitionData(
1251 struct ObjCInterfaceDecl::DefinitionData &
Data) {
1253 Data.SuperClassTInfo = readTypeSourceInfo();
1255 Data.EndLoc = readSourceLocation();
1256 Data.HasDesignatedInitializers =
Record.readInt();
1258 Data.HasODRHash =
true;
1261 unsigned NumProtocols =
Record.readInt();
1263 Protocols.reserve(NumProtocols);
1264 for (
unsigned I = 0; I != NumProtocols; ++I)
1265 Protocols.push_back(readDeclAs<ObjCProtocolDecl>());
1267 ProtoLocs.reserve(NumProtocols);
1268 for (
unsigned I = 0; I != NumProtocols; ++I)
1269 ProtoLocs.push_back(readSourceLocation());
1270 Data.ReferencedProtocols.set(Protocols.data(), NumProtocols, ProtoLocs.data(),
1274 NumProtocols =
Record.readInt();
1276 Protocols.reserve(NumProtocols);
1277 for (
unsigned I = 0; I != NumProtocols; ++I)
1278 Protocols.push_back(readDeclAs<ObjCProtocolDecl>());
1279 Data.AllReferencedProtocols.set(Protocols.data(), NumProtocols,
1285 struct ObjCInterfaceDecl::DefinitionData &DD =
D->data();
1286 if (DD.Definition == NewDD.Definition)
1289 Reader.MergedDeclContexts.insert(
1290 std::make_pair(NewDD.Definition, DD.Definition));
1293 if (
D->getODRHash() != NewDD.ODRHash)
1294 Reader.PendingObjCInterfaceOdrMergeFailures[DD.Definition].push_back(
1295 {NewDD.Definition, &NewDD});
1301 DeferredTypeID =
Record.getGlobalTypeID(
Record.readInt());
1307 ID->allocateDefinitionData();
1309 ReadObjCDefinitionData(
ID->data());
1311 if (Canon->Data.getPointer()) {
1315 ID->Data = Canon->Data;
1319 ID->getCanonicalDecl()->Data =
ID->Data;
1322 ID->setIvarList(
nullptr);
1326 Reader.PendingDefinitions.insert(
ID);
1329 Reader.ObjCClassesLoaded.push_back(
ID);
1331 ID->Data =
ID->getCanonicalDecl()->Data;
1340 bool synth =
Record.readInt();
1355 if (PrevIvar && PrevIvar != IVD) {
1356 auto *ParentExt = dyn_cast<ObjCCategoryDecl>(IVD->
getDeclContext());
1357 auto *PrevParentExt =
1359 if (ParentExt && PrevParentExt) {
1363 .PendingObjCExtensionIvarRedeclarations[std::make_pair(ParentExt,
1365 .push_back(std::make_pair(IVD, PrevIvar));
1366 }
else if (ParentExt || PrevParentExt) {
1377void ASTDeclReader::ReadObjCDefinitionData(
1378 struct ObjCProtocolDecl::DefinitionData &
Data) {
1379 unsigned NumProtoRefs =
Record.readInt();
1381 ProtoRefs.reserve(NumProtoRefs);
1382 for (
unsigned I = 0; I != NumProtoRefs; ++I)
1383 ProtoRefs.push_back(readDeclAs<ObjCProtocolDecl>());
1385 ProtoLocs.reserve(NumProtoRefs);
1386 for (
unsigned I = 0; I != NumProtoRefs; ++I)
1387 ProtoLocs.push_back(readSourceLocation());
1388 Data.ReferencedProtocols.set(ProtoRefs.data(), NumProtoRefs,
1391 Data.HasODRHash =
true;
1396 struct ObjCProtocolDecl::DefinitionData &DD =
D->data();
1397 if (DD.Definition == NewDD.Definition)
1400 Reader.MergedDeclContexts.insert(
1401 std::make_pair(NewDD.Definition, DD.Definition));
1404 if (
D->getODRHash() != NewDD.ODRHash)
1405 Reader.PendingObjCProtocolOdrMergeFailures[DD.Definition].push_back(
1406 {NewDD.Definition, &NewDD});
1416 PD->allocateDefinitionData();
1418 ReadObjCDefinitionData(PD->data());
1421 if (Canon->Data.getPointer()) {
1425 PD->Data = Canon->Data;
1432 Reader.PendingDefinitions.insert(PD);
1451 Reader.CategoriesDeserialized.insert(CD);
1453 CD->ClassInterface = readDeclAs<ObjCInterfaceDecl>();
1455 unsigned NumProtoRefs =
Record.readInt();
1457 ProtoRefs.reserve(NumProtoRefs);
1458 for (
unsigned I = 0; I != NumProtoRefs; ++I)
1459 ProtoRefs.push_back(readDeclAs<ObjCProtocolDecl>());
1461 ProtoLocs.reserve(NumProtoRefs);
1462 for (
unsigned I = 0; I != NumProtoRefs; ++I)
1463 ProtoLocs.push_back(readSourceLocation());
1481 D->setAtLoc(readSourceLocation());
1482 D->setLParenLoc(readSourceLocation());
1487 D->setPropertyAttributesAsWritten(
1489 D->setPropertyImplementation(
1497 D->setGetterMethodDecl(readDeclAs<ObjCMethodDecl>());
1498 D->setSetterMethodDecl(readDeclAs<ObjCMethodDecl>());
1499 D->setPropertyIvarDecl(readDeclAs<ObjCIvarDecl>());
1504 D->setClassInterface(readDeclAs<ObjCInterfaceDecl>());
1509 D->CategoryNameLoc = readSourceLocation();
1514 D->setSuperClass(readDeclAs<ObjCInterfaceDecl>());
1515 D->SuperLoc = readSourceLocation();
1516 D->setIvarLBraceLoc(readSourceLocation());
1517 D->setIvarRBraceLoc(readSourceLocation());
1518 D->setHasNonZeroConstructors(
Record.readInt());
1519 D->setHasDestructors(
Record.readInt());
1520 D->NumIvarInitializers =
Record.readInt();
1521 if (
D->NumIvarInitializers)
1522 D->IvarInitializers = ReadGlobalOffset();
1527 D->setAtLoc(readSourceLocation());
1528 D->setPropertyDecl(readDeclAs<ObjCPropertyDecl>());
1529 D->PropertyIvarDecl = readDeclAs<ObjCIvarDecl>();
1530 D->IvarLoc = readSourceLocation();
1531 D->setGetterMethodDecl(readDeclAs<ObjCMethodDecl>());
1532 D->setSetterMethodDecl(readDeclAs<ObjCMethodDecl>());
1533 D->setGetterCXXConstructor(
Record.readExpr());
1534 D->setSetterCXXAssignment(
Record.readExpr());
1539 FD->Mutable =
Record.readInt();
1541 unsigned Bits =
Record.readInt();
1542 FD->StorageKind = Bits >> 1;
1543 if (FD->StorageKind == FieldDecl::ISK_CapturedVLAType)
1545 cast<VariableArrayType>(
Record.readType().getTypePtr());
1551 if (
auto *Tmpl = readDeclAs<FieldDecl>())
1559 PD->GetterId =
Record.readIdentifier();
1560 PD->SetterId =
Record.readIdentifier();
1565 D->PartVal.Part1 =
Record.readInt();
1566 D->PartVal.Part2 =
Record.readInt();
1567 D->PartVal.Part3 =
Record.readInt();
1568 for (
auto &
C :
D->PartVal.Part4And5)
1579 D->Value =
Record.readAPValue();
1583 Reader.
getContext().UnnamedGlobalConstantDecls.GetOrInsertNode(
D))
1589 D->Value =
Record.readAPValue();
1594 Reader.
getContext().TemplateParamObjectDecls.GetOrInsertNode(
D))
1601 FD->ChainingSize =
Record.readInt();
1602 assert(FD->ChainingSize >= 2 &&
"Anonymous chaining must be >= 2");
1605 for (
unsigned I = 0; I != FD->ChainingSize; ++I)
1606 FD->Chaining[I] = readDeclAs<NamedDecl>();
1617 bool DefGeneratedInModule = VarDeclBits.
getNextBit();
1622 bool HasDeducedType =
false;
1623 if (!isa<ParmVarDecl>(VD)) {
1650 Reader.PendingDeducedVarTypes.push_back({VD, DeferredTypeID});
1662 if (DefGeneratedInModule) {
1663 Reader.DefinitionSource[VD] =
1664 Loc.F->Kind == ModuleKind::MK_MainFile ||
1668 if (VD->
hasAttr<BlocksAttr>()) {
1675 VarNotTemplate = 0,
VarTemplate, StaticDataMemberSpecialization
1677 switch ((VarKind)
Record.readInt()) {
1678 case VarNotTemplate:
1681 if (!isa<ParmVarDecl>(VD) && !isa<ImplicitParamDecl>(VD) &&
1682 !isa<VarTemplateSpecializationDecl>(VD))
1689 case StaticDataMemberSpecialization: {
1690 auto *Tmpl = readDeclAs<VarDecl>();
1703 if (uint64_t Val =
Record.readInt()) {
1719 Eval->
Value = GetCurrentCursorOffset();
1730 unsigned scopeIndex =
Record.readInt();
1732 unsigned isObjCMethodParam = ParmVarDeclBits.
getNextBit();
1733 unsigned scopeDepth = ParmVarDeclBits.
getNextBits(7);
1734 unsigned declQualifier = ParmVarDeclBits.
getNextBits(7);
1735 if (isObjCMethodParam) {
1736 assert(scopeDepth == 0);
1749 PD->ExplicitObjectParameterIntroducerLoc =
Record.readSourceLocation();
1757 auto **BDs = DD->getTrailingObjects();
1758 for (
unsigned I = 0; I != DD->NumBindings; ++I) {
1759 BDs[I] = readDeclAs<BindingDecl>();
1760 BDs[I]->setDecomposedDecl(DD);
1766 BD->Binding =
Record.readExpr();
1777 D->Statement =
Record.readStmt();
1784 unsigned NumParams =
Record.readInt();
1786 Params.reserve(NumParams);
1787 for (
unsigned I = 0; I != NumParams; ++I)
1788 Params.push_back(readDeclAs<ParmVarDecl>());
1797 bool capturesCXXThis =
Record.readInt();
1798 unsigned numCaptures =
Record.readInt();
1800 captures.reserve(numCaptures);
1801 for (
unsigned i = 0; i != numCaptures; ++i) {
1802 auto *
decl = readDeclAs<VarDecl>();
1803 unsigned flags =
Record.readInt();
1804 bool byRef = (flags & 1);
1805 bool nested = (flags & 2);
1806 Expr *copyExpr = ((flags & 4) ?
Record.readExpr() :
nullptr);
1816 for (
unsigned I = 0; I <
D->NumParams; ++I)
1817 D->setParam(I, readDeclAs<ImplicitParamDecl>());
1818 D->setNothrow(
Record.readInt() != 0);
1819 D->setBody(cast_or_null<Stmt>(
Record.readStmt()));
1824 unsigned ContextParamPos =
Record.readInt();
1827 for (
unsigned I = 0; I < CD->NumParams; ++I) {
1828 if (I != ContextParamPos)
1829 CD->
setParam(I, readDeclAs<ImplicitParamDecl>());
1838 D->setExternLoc(readSourceLocation());
1839 D->setRBraceLoc(readSourceLocation());
1844 D->RBraceLoc = readSourceLocation();
1849 D->setLocStart(readSourceLocation());
1859 D->LocStart = readSourceLocation();
1860 D->RBraceLoc = readSourceLocation();
1867 if (Redecl.getFirstID() == ThisDeclID)
1868 AnonNamespace = readDeclID();
1872 if (AnonNamespace.
isValid()) {
1876 auto *Anon = cast<NamespaceDecl>(Reader.
GetDecl(AnonNamespace));
1878 D->setAnonymousNamespace(Anon);
1886 D->IsCBuffer =
Record.readBool();
1887 D->KwLoc = readSourceLocation();
1888 D->LBraceLoc = readSourceLocation();
1889 D->RBraceLoc = readSourceLocation();
1895 D->NamespaceLoc = readSourceLocation();
1896 D->IdentLoc = readSourceLocation();
1897 D->QualifierLoc =
Record.readNestedNameSpecifierLoc();
1898 D->Namespace = readDeclAs<NamespaceBaseDecl>();
1904 D->setUsingLoc(readSourceLocation());
1905 D->QualifierLoc =
Record.readNestedNameSpecifierLoc();
1906 D->DNLoc =
Record.readDeclarationNameLoc(
D->getDeclName());
1907 D->FirstUsingShadow.setPointer(readDeclAs<UsingShadowDecl>());
1908 D->setTypename(
Record.readInt());
1909 if (
auto *Pattern = readDeclAs<NamedDecl>())
1916 D->setUsingLoc(readSourceLocation());
1917 D->setEnumLoc(readSourceLocation());
1918 D->setEnumType(
Record.readTypeSourceInfo());
1919 D->FirstUsingShadow.setPointer(readDeclAs<UsingShadowDecl>());
1920 if (
auto *Pattern = readDeclAs<UsingEnumDecl>())
1927 D->InstantiatedFrom = readDeclAs<NamedDecl>();
1928 auto **Expansions =
D->getTrailingObjects();
1929 for (
unsigned I = 0; I !=
D->NumExpansions; ++I)
1930 Expansions[I] = readDeclAs<NamedDecl>();
1937 D->Underlying = readDeclAs<NamedDecl>();
1939 D->UsingOrNextShadow = readDeclAs<NamedDecl>();
1940 auto *Pattern = readDeclAs<UsingShadowDecl>();
1949 D->NominatedBaseClassShadowDecl = readDeclAs<ConstructorUsingShadowDecl>();
1950 D->ConstructedBaseClassShadowDecl = readDeclAs<ConstructorUsingShadowDecl>();
1951 D->IsVirtual =
Record.readInt();
1956 D->UsingLoc = readSourceLocation();
1957 D->NamespaceLoc = readSourceLocation();
1958 D->QualifierLoc =
Record.readNestedNameSpecifierLoc();
1959 D->NominatedNamespace = readDeclAs<NamedDecl>();
1960 D->CommonAncestor = readDeclAs<DeclContext>();
1965 D->setUsingLoc(readSourceLocation());
1966 D->QualifierLoc =
Record.readNestedNameSpecifierLoc();
1967 D->DNLoc =
Record.readDeclarationNameLoc(
D->getDeclName());
1968 D->EllipsisLoc = readSourceLocation();
1975 D->TypenameLocation = readSourceLocation();
1976 D->QualifierLoc =
Record.readNestedNameSpecifierLoc();
1977 D->EllipsisLoc = readSourceLocation();
1986void ASTDeclReader::ReadCXXDefinitionData(
1988 Decl *LambdaContext,
unsigned IndexInLambdaContext) {
1992#define FIELD(Name, Width, Merge) \
1993 if (!CXXRecordDeclBits.canGetNextNBits(Width)) \
1994 CXXRecordDeclBits.updateValue(Record.readInt()); \
1995 Data.Name = CXXRecordDeclBits.getNextBits(Width);
1997#include "clang/AST/CXXRecordDeclDefinitionBits.def"
2002 Data.HasODRHash =
true;
2005 Reader.DefinitionSource[
D] =
2006 Loc.F->Kind == ModuleKind::MK_MainFile ||
2011 Data.ComputedVisibleConversions =
Record.readInt();
2012 if (
Data.ComputedVisibleConversions)
2013 Record.readUnresolvedSet(
Data.VisibleConversions);
2014 assert(
Data.Definition &&
"Data.Definition should be already set!");
2016 if (!
Data.IsLambda) {
2017 assert(!LambdaContext && !IndexInLambdaContext &&
2018 "given lambda context for non-lambda");
2022 Data.Bases = ReadGlobalOffset();
2026 Data.VBases = ReadGlobalOffset();
2032 auto &Lambda =
static_cast<CXXRecordDecl::LambdaDefinitionData &
>(
Data);
2035 Lambda.DependencyKind = LambdaBits.getNextBits(2);
2036 Lambda.IsGenericLambda = LambdaBits.getNextBit();
2037 Lambda.CaptureDefault = LambdaBits.getNextBits(2);
2038 Lambda.NumCaptures = LambdaBits.getNextBits(15);
2039 Lambda.HasKnownInternalLinkage = LambdaBits.getNextBit();
2041 Lambda.NumExplicitCaptures =
Record.readInt();
2042 Lambda.ManglingNumber =
Record.readInt();
2043 if (
unsigned DeviceManglingNumber =
Record.readInt())
2044 Reader.
getContext().DeviceLambdaManglingNumbers[
D] = DeviceManglingNumber;
2045 Lambda.IndexInContext = IndexInLambdaContext;
2046 Lambda.ContextDecl = LambdaContext;
2048 if (Lambda.NumCaptures) {
2050 Lambda.NumCaptures);
2051 Lambda.AddCaptureList(Reader.
getContext(), ToCapture);
2053 Lambda.MethodTyInfo = readTypeSourceInfo();
2054 for (
unsigned I = 0, N = Lambda.NumCaptures; I != N; ++I) {
2057 bool IsImplicit = CaptureBits.getNextBit();
2070 auto *Var = readDeclAs<ValueDecl>();
2072 new (ToCapture)
Capture(
Loc, IsImplicit,
Kind, Var, EllipsisLoc);
2081 CXXRecordDecl *
D,
struct CXXRecordDecl::DefinitionData &&MergeDD) {
2082 assert(
D->DefinitionData &&
2083 "merging class definition into non-definition");
2084 auto &DD = *
D->DefinitionData;
2086 if (DD.Definition != MergeDD.Definition) {
2088 Reader.MergedDeclContexts.insert(std::make_pair(MergeDD.Definition,
2090 Reader.PendingDefinitions.erase(MergeDD.Definition);
2091 MergeDD.Definition->demoteThisDefinitionToDeclaration();
2093 assert(!Reader.Lookups.contains(MergeDD.Definition) &&
2094 "already loaded pending lookups for merged definition");
2097 auto PFDI = Reader.PendingFakeDefinitionData.find(&DD);
2098 if (PFDI != Reader.PendingFakeDefinitionData.end() &&
2099 PFDI->second == ASTReader::PendingFakeDefinitionKind::Fake) {
2102 assert(!DD.IsLambda && !MergeDD.IsLambda &&
"faked up lambda definition?");
2103 PFDI->second = ASTReader::PendingFakeDefinitionKind::FakeLoaded;
2107 auto *Def = DD.Definition;
2108 DD = std::move(MergeDD);
2109 DD.Definition = Def;
2113 bool DetectedOdrViolation =
false;
2115 #define FIELD(Name, Width, Merge) Merge(Name)
2116 #define MERGE_OR(Field) DD.Field |= MergeDD.Field;
2117 #define NO_MERGE(Field) \
2118 DetectedOdrViolation |= DD.Field != MergeDD.Field; \
2120 #include "clang/AST/CXXRecordDeclDefinitionBits.def"
2125 if (DD.NumBases != MergeDD.NumBases || DD.NumVBases != MergeDD.NumVBases)
2126 DetectedOdrViolation =
true;
2132 if (MergeDD.ComputedVisibleConversions && !DD.ComputedVisibleConversions) {
2133 DD.VisibleConversions = std::move(MergeDD.VisibleConversions);
2134 DD.ComputedVisibleConversions =
true;
2141 auto &Lambda1 =
static_cast<CXXRecordDecl::LambdaDefinitionData &
>(DD);
2142 auto &Lambda2 =
static_cast<CXXRecordDecl::LambdaDefinitionData &
>(MergeDD);
2143 DetectedOdrViolation |= Lambda1.DependencyKind != Lambda2.DependencyKind;
2144 DetectedOdrViolation |= Lambda1.IsGenericLambda != Lambda2.IsGenericLambda;
2145 DetectedOdrViolation |= Lambda1.CaptureDefault != Lambda2.CaptureDefault;
2146 DetectedOdrViolation |= Lambda1.NumCaptures != Lambda2.NumCaptures;
2147 DetectedOdrViolation |=
2148 Lambda1.NumExplicitCaptures != Lambda2.NumExplicitCaptures;
2149 DetectedOdrViolation |=
2150 Lambda1.HasKnownInternalLinkage != Lambda2.HasKnownInternalLinkage;
2151 DetectedOdrViolation |= Lambda1.ManglingNumber != Lambda2.ManglingNumber;
2153 if (Lambda1.NumCaptures && Lambda1.NumCaptures == Lambda2.NumCaptures) {
2154 for (
unsigned I = 0, N = Lambda1.NumCaptures; I != N; ++I) {
2159 Lambda1.AddCaptureList(Reader.
getContext(), Lambda2.Captures.front());
2167 if (
D->getODRHash() != MergeDD.ODRHash) {
2168 DetectedOdrViolation =
true;
2171 if (DetectedOdrViolation)
2172 Reader.PendingOdrMergeFailures[DD.Definition].push_back(
2173 {MergeDD.Definition, &MergeDD});
2177 Decl *LambdaContext,
2178 unsigned IndexInLambdaContext) {
2179 struct CXXRecordDecl::DefinitionData *DD;
2184 bool IsLambda =
Record.readInt();
2185 assert(!(IsLambda &&
Update) &&
2186 "lambda definition should not be added by update record");
2188 DD =
new (
C) CXXRecordDecl::LambdaDefinitionData(
2191 DD =
new (
C)
struct CXXRecordDecl::DefinitionData(
D);
2197 if (!Canon->DefinitionData)
2198 Canon->DefinitionData = DD;
2199 D->DefinitionData = Canon->DefinitionData;
2200 ReadCXXDefinitionData(*DD,
D, LambdaContext, IndexInLambdaContext);
2203 D->setCompleteDefinition(
true);
2208 if (Canon->DefinitionData != DD) {
2217 Reader.PendingDefinitions.insert(
D);
2226 CXXRecNotTemplate = 0,
2228 CXXRecMemberSpecialization,
2232 Decl *LambdaContext =
nullptr;
2233 unsigned IndexInLambdaContext = 0;
2235 switch ((CXXRecKind)
Record.readInt()) {
2236 case CXXRecNotTemplate:
2238 if (!isa<ClassTemplateSpecializationDecl>(
D))
2241 case CXXRecTemplate: {
2243 auto *
Template = readDeclAs<ClassTemplateDecl>();
2247 case CXXRecMemberSpecialization: {
2248 auto *RD = readDeclAs<CXXRecordDecl>();
2253 D->TemplateOrInstantiation = MSI;
2258 LambdaContext = readDecl();
2260 IndexInLambdaContext =
Record.readInt();
2262 MergeImpl.
mergeLambda(
D, Redecl, *LambdaContext, IndexInLambdaContext);
2271 bool WasDefinition =
Record.readInt();
2273 ReadCXXRecordDefinition(
D,
false, LambdaContext,
2274 IndexInLambdaContext);
2281 if (WasDefinition) {
2283 if (KeyFn.
isValid() &&
D->isCompleteDefinition())
2294 D->setExplicitSpecifier(
Record.readExplicitSpec());
2295 D->Ctor = readDeclAs<CXXConstructorDecl>();
2297 D->setDeductionCandidateKind(
2299 D->setSourceDeductionGuide(readDeclAs<CXXDeductionGuideDecl>());
2300 D->setSourceDeductionGuideKind(
2308 unsigned NumOverridenMethods =
Record.readInt();
2310 while (NumOverridenMethods--) {
2313 if (
auto *MD = readDeclAs<CXXMethodDecl>())
2319 Record.skipInts(NumOverridenMethods);
2326 D->setExplicitSpecifier(
Record.readExplicitSpec());
2327 if (
D->isInheritingConstructor()) {
2328 auto *Shadow = readDeclAs<ConstructorUsingShadowDecl>();
2329 auto *Ctor = readDeclAs<CXXConstructorDecl>();
2340 if (
auto *OperatorDelete = readDeclAs<FunctionDecl>()) {
2342 auto *ThisArg =
Record.readExpr();
2344 if (!Canon->OperatorDelete) {
2345 Canon->OperatorDelete = OperatorDelete;
2346 Canon->OperatorDeleteThisArg = ThisArg;
2352 D->setExplicitSpecifier(
Record.readExplicitSpec());
2358 D->ImportedModule = readModule();
2359 D->setImportComplete(
Record.readInt());
2360 auto *StoredLocs =
D->getTrailingObjects();
2361 for (
unsigned I = 0, N =
Record.back(); I != N; ++I)
2362 StoredLocs[I] = readSourceLocation();
2368 D->setColonLoc(readSourceLocation());
2374 D->Friend = readDeclAs<NamedDecl>();
2376 D->Friend = readTypeSourceInfo();
2377 for (
unsigned i = 0; i !=
D->NumTPLists; ++i)
2378 D->getTrailingObjects()[i] =
Record.readTemplateParameterList();
2380 D->UnsupportedFriend = (
Record.readInt() != 0);
2381 D->FriendLoc = readSourceLocation();
2382 D->EllipsisLoc = readSourceLocation();
2387 unsigned NumParams =
Record.readInt();
2388 D->NumParams = NumParams;
2390 for (
unsigned i = 0; i != NumParams; ++i)
2391 D->Params[i] =
Record.readTemplateParameterList();
2393 D->Friend = readDeclAs<NamedDecl>();
2395 D->Friend = readTypeSourceInfo();
2396 D->FriendLoc = readSourceLocation();
2402 assert(!
D->TemplateParams &&
"TemplateParams already set!");
2403 D->TemplateParams =
Record.readTemplateParameterList();
2404 D->init(readDeclAs<NamedDecl>());
2409 D->ConstraintExpr =
Record.readExpr();
2419 for (
unsigned I = 0; I <
D->NumTemplateArgs; ++I)
2420 Args.push_back(
Record.readTemplateArgument(
true));
2421 D->setTemplateArguments(Args);
2428 llvm::BitstreamCursor &DeclsCursor,
2430 uint64_t Offset = ReadLocalOffset();
2432 Reader.ReadSpecializations(M, DeclsCursor, Offset,
D, IsPartial);
2446 Reader.PendingDefinitions.insert(CanonD);
2452 if (ThisDeclID == Redecl.getFirstID()) {
2453 if (
auto *RTD = readDeclAs<RedeclarableTemplateDecl>()) {
2454 assert(RTD->getKind() ==
D->
getKind() &&
2455 "InstantiatedFromMemberTemplate kind mismatch");
2456 D->setInstantiatedFromMemberTemplate(RTD);
2458 D->setMemberSpecialization();
2472 if (ThisDeclID == Redecl.getFirstID()) {
2481 llvm_unreachable(
"BuiltinTemplates are not serialized");
2491 if (ThisDeclID == Redecl.getFirstID()) {
2504 if (
Decl *InstD = readDecl()) {
2505 if (
auto *CTD = dyn_cast<ClassTemplateDecl>(InstD)) {
2506 D->SpecializedTemplate = CTD;
2509 Record.readTemplateArgumentList(TemplArgs);
2514 SpecializedPartialSpecialization();
2515 PS->PartialSpecialization
2516 = cast<ClassTemplatePartialSpecializationDecl>(InstD);
2517 PS->TemplateArgs = ArgList;
2518 D->SpecializedTemplate = PS;
2523 Record.readTemplateArgumentList(TemplArgs,
true);
2525 D->PointOfInstantiation = readSourceLocation();
2527 D->StrictPackMatch =
Record.readBool();
2529 bool writtenAsCanonicalDecl =
Record.readInt();
2530 if (writtenAsCanonicalDecl) {
2531 auto *CanonPattern = readDeclAs<ClassTemplateDecl>();
2535 if (
auto *Partial = dyn_cast<ClassTemplatePartialSpecializationDecl>(
D)) {
2536 CanonSpec = CanonPattern->getCommonPtr()->PartialSpecializations
2537 .GetOrInsertNode(Partial);
2540 CanonPattern->getCommonPtr()->Specializations.GetOrInsertNode(
D);
2543 if (CanonSpec !=
D) {
2548 if (
auto *DDD =
D->DefinitionData) {
2549 if (CanonSpec->DefinitionData)
2552 CanonSpec->DefinitionData =
D->DefinitionData;
2554 D->DefinitionData = CanonSpec->DefinitionData;
2563 ExplicitInfo->TemplateKeywordLoc = readSourceLocation();
2564 D->ExplicitInfo = ExplicitInfo;
2568 D->setTemplateArgsAsWritten(
Record.readASTTemplateArgumentListInfo());
2578 D->TemplateParams = Params;
2583 if (ThisDeclID == Redecl.getFirstID()) {
2584 D->InstantiatedFromMember.setPointer(
2585 readDeclAs<ClassTemplatePartialSpecializationDecl>());
2586 D->InstantiatedFromMember.setInt(
Record.readInt());
2593 if (ThisDeclID == Redecl.getFirstID()) {
2607 if (
Decl *InstD = readDecl()) {
2608 if (
auto *VTD = dyn_cast<VarTemplateDecl>(InstD)) {
2609 D->SpecializedTemplate = VTD;
2612 Record.readTemplateArgumentList(TemplArgs);
2617 VarTemplateSpecializationDecl::SpecializedPartialSpecialization();
2618 PS->PartialSpecialization =
2619 cast<VarTemplatePartialSpecializationDecl>(InstD);
2620 PS->TemplateArgs = ArgList;
2621 D->SpecializedTemplate = PS;
2629 ExplicitInfo->TemplateKeywordLoc = readSourceLocation();
2630 D->ExplicitInfo = ExplicitInfo;
2634 D->setTemplateArgsAsWritten(
Record.readASTTemplateArgumentListInfo());
2637 Record.readTemplateArgumentList(TemplArgs,
true);
2639 D->PointOfInstantiation = readSourceLocation();
2641 D->IsCompleteDefinition =
Record.readInt();
2645 bool writtenAsCanonicalDecl =
Record.readInt();
2646 if (writtenAsCanonicalDecl) {
2647 auto *CanonPattern = readDeclAs<VarTemplateDecl>();
2650 if (
auto *Partial = dyn_cast<VarTemplatePartialSpecializationDecl>(
D)) {
2651 CanonSpec = CanonPattern->getCommonPtr()
2652 ->PartialSpecializations.GetOrInsertNode(Partial);
2655 CanonPattern->getCommonPtr()->Specializations.GetOrInsertNode(
D);
2674 D->TemplateParams = Params;
2679 if (ThisDeclID == Redecl.getFirstID()) {
2680 D->InstantiatedFromMember.setPointer(
2681 readDeclAs<VarTemplatePartialSpecializationDecl>());
2682 D->InstantiatedFromMember.setInt(
Record.readInt());
2689 D->setDeclaredWithTypename(
Record.readInt());
2691 bool TypeConstraintInitialized =
D->hasTypeConstraint() &&
Record.readBool();
2692 if (TypeConstraintInitialized) {
2695 CR =
Record.readConceptReference();
2696 Expr *ImmediatelyDeclaredConstraint =
Record.readExpr();
2699 D->setTypeConstraint(CR, ImmediatelyDeclaredConstraint, ArgPackSubstIndex);
2700 D->NumExpanded =
Record.readUnsignedOrNone();
2705 Record.readTemplateArgumentLoc());
2711 D->setDepth(
Record.readInt());
2712 D->setPosition(
Record.readInt());
2713 if (
D->hasPlaceholderTypeConstraint())
2714 D->setPlaceholderTypeConstraint(
Record.readExpr());
2715 if (
D->isExpandedParameterPack()) {
2716 auto TypesAndInfos =
2717 D->getTrailingObjects<std::pair<QualType, TypeSourceInfo *>>();
2718 for (
unsigned I = 0, N =
D->getNumExpansionTypes(); I != N; ++I) {
2720 TypesAndInfos[I].second = readTypeSourceInfo();
2724 D->ParameterPack =
Record.readInt();
2727 Record.readTemplateArgumentLoc());
2734 D->setDeclaredWithTypename(
Record.readBool());
2736 D->setDepth(
Record.readInt());
2737 D->setPosition(
Record.readInt());
2738 if (
D->isExpandedParameterPack()) {
2739 auto **
Data =
D->getTrailingObjects();
2740 for (
unsigned I = 0, N =
D->getNumExpansionTemplateParameters();
2742 Data[I] =
Record.readTemplateParameterList();
2745 D->ParameterPack =
Record.readInt();
2748 Record.readTemplateArgumentLoc());
2759 D->AssertExprAndFailed.setPointer(
Record.readExpr());
2760 D->AssertExprAndFailed.setInt(
Record.readInt());
2761 D->Message = cast_or_null<StringLiteral>(
Record.readExpr());
2762 D->RParenLoc = readSourceLocation();
2772 D->ExtendingDecl = readDeclAs<ValueDecl>();
2773 D->ExprWithTemporary =
Record.readStmt();
2778 D->ManglingNumber =
Record.readInt();
2790template <
typename T>
2793 Decl *MergeWith =
nullptr;
2795 bool IsKeyDecl = ThisDeclID == FirstDeclID;
2796 bool IsFirstLocalDecl =
false;
2798 uint64_t RedeclOffset = 0;
2803 FirstDeclID = ThisDeclID;
2805 IsFirstLocalDecl =
true;
2806 }
else if (
unsigned N =
Record.readInt()) {
2810 IsFirstLocalDecl =
true;
2817 for (
unsigned I = 0; I != N - 1; ++I)
2818 MergeWith = readDecl();
2820 RedeclOffset = ReadLocalOffset();
2827 auto *FirstDecl = cast_or_null<T>(Reader.
GetDecl(FirstDeclID));
2828 if (FirstDecl !=
D) {
2837 auto *DAsT =
static_cast<T *
>(
D);
2843 if (IsFirstLocalDecl)
2844 Reader.PendingDeclChains.push_back(std::make_pair(DAsT, RedeclOffset));
2846 return RedeclarableResult(MergeWith, FirstDeclID, IsKeyDecl);
2851template <
typename T>
2853 RedeclarableResult &Redecl) {
2862 auto *
D =
static_cast<T *
>(DBase);
2864 if (
auto *Existing = Redecl.getKnownMergeTarget())
2867 else if (FindExistingResult ExistingRes = findExisting(
D))
2868 if (
T *Existing = ExistingRes)
2879 Decl &Context,
unsigned IndexInContext) {
2888 if (
auto *Existing = Redecl.getKnownMergeTarget())
2894 NamedDecl *&Slot = Reader.LambdaDeclarationsForMerging[{
2895 Context.getCanonicalDecl(), IndexInContext}];
2903 RedeclarableResult &Redecl) {
2916 llvm_unreachable(
"bad assert_cast");
2924 auto *DPattern =
D->getTemplatedDecl();
2926 RedeclarableResult
Result(
2928 DPattern->getCanonicalDecl()->getGlobalID(), IsKeyDecl);
2930 if (
auto *DClass = dyn_cast<CXXRecordDecl>(DPattern)) {
2933 auto *ExistingClass =
2934 cast<CXXRecordDecl>(ExistingPattern)->getCanonicalDecl();
2935 if (
auto *DDD = DClass->DefinitionData) {
2936 if (ExistingClass->DefinitionData) {
2939 ExistingClass->DefinitionData = DClass->DefinitionData;
2942 Reader.PendingDefinitions.insert(DClass);
2945 DClass->DefinitionData = ExistingClass->DefinitionData;
2950 if (
auto *DFunction = dyn_cast<FunctionDecl>(DPattern))
2953 if (
auto *DVar = dyn_cast<VarDecl>(DPattern))
2955 if (
auto *DAlias = dyn_cast<TypeAliasDecl>(DPattern))
2958 llvm_unreachable(
"merged an unknown kind of redeclarable template");
2963template <
typename T>
2966 auto *
D =
static_cast<T *
>(DBase);
2967 T *ExistingCanon = Existing->getCanonicalDecl();
2969 if (ExistingCanon != DCanon) {
2974 D->First = ExistingCanon;
2975 ExistingCanon->Used |=
D->Used;
2978 bool IsKeyDecl = KeyDeclID.
isValid();
2981 if (
auto *DTemplate = dyn_cast<RedeclarableTemplateDecl>(
D))
2983 DTemplate, assert_cast<RedeclarableTemplateDecl *>(ExistingCanon),
2988 Reader.KeyDecls[ExistingCanon].push_back(KeyDeclID);
3001 if (isa<EnumConstantDecl, FieldDecl, IndirectFieldDecl>(ND))
3016 Reader.LETemporaryForMerging[std::make_pair(
3043 if (FindExistingResult ExistingRes = findExisting(
static_cast<T*
>(
D)))
3044 if (
T *Existing = ExistingRes)
3046 Existing->getCanonicalDecl());
3050 Record.readOMPChildren(
D->Data);
3055 Record.readOMPChildren(
D->Data);
3060 Record.readOMPChildren(
D->Data);
3069 D->setCombinerData(In, Out);
3071 D->setCombiner(Combiner);
3074 D->setInitializerData(Orig, Priv);
3077 D->setInitializer(
Init, IK);
3082 Record.readOMPChildren(
D->Data);
3084 D->VarName =
Record.readDeclarationName();
3095 D->DirectiveLoc =
Record.readSourceLocation();
3096 D->EndLoc =
Record.readSourceLocation();
3097 Record.readOpenACCClauseList(
D->Clauses);
3102 D->DirectiveLoc =
Record.readSourceLocation();
3103 D->EndLoc =
Record.readSourceLocation();
3104 D->ParensLoc =
Record.readSourceRange();
3105 D->FuncRef =
Record.readExpr();
3106 Record.readOpenACCClauseList(
D->Clauses);
3120 uint64_t readInt() {
3124 bool readBool() {
return Reader.
readBool(); }
3138 std::string readString() {
3150 VersionTuple readVersionTuple() {
3156 template <
typename T>
T *readDeclAs() {
return Reader.
readDeclAs<
T>(); }
3161 AttrReader
Record(*
this);
3176 unsigned ParsedKind =
Record.readInt();
3177 unsigned Syntax =
Record.readInt();
3178 unsigned SpellingIndex =
Record.readInt();
3179 bool IsAlignas = (ParsedKind == AttributeCommonInfo::AT_Aligned &&
3181 SpellingIndex == AlignedAttr::Keyword_alignas);
3182 bool IsRegularKeywordAttribute =
Record.readBool();
3187 IsAlignas, IsRegularKeywordAttribute});
3189#include "clang/Serialization/AttrPCHRead.inc"
3191 assert(
New &&
"Unable to decode attribute?");
3197 for (
unsigned I = 0,
E =
readInt(); I !=
E; ++I)
3212inline void ASTReader::LoadedDecl(
unsigned Index,
Decl *
D) {
3213 assert(!DeclsLoaded[Index] &&
"Decl loaded twice?");
3214 DeclsLoaded[Index] =
D;
3223bool ASTReader::isConsumerInterestedIn(
Decl *
D) {
3242 if (
const auto *Var = dyn_cast<VarDecl>(
D))
3243 return Var->isFileVarDecl() &&
3245 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(Var));
3246 if (
const auto *
Func = dyn_cast<FunctionDecl>(
D))
3247 return Func->doesThisDeclarationHaveABody() || PendingBodies.count(
D);
3257ASTReader::RecordLocation ASTReader::DeclCursorForID(
GlobalDeclID ID,
3261 unsigned LocalDeclIndex =
ID.getLocalDeclIndex();
3267ASTReader::RecordLocation ASTReader::getLocalBitOffset(uint64_t GlobalOffset) {
3268 auto I = GlobalBitOffsetsMap.find(GlobalOffset);
3270 assert(I != GlobalBitOffsetsMap.end() &&
"Corrupted global bit offsets map");
3271 return RecordLocation(I->second, GlobalOffset - I->second->GlobalBitOffset);
3279ASTDeclReader::getOrFakePrimaryClassDefinition(
ASTReader &Reader,
3282 auto *DD = RD->DefinitionData;
3291 DD =
new (Reader.
getContext())
struct CXXRecordDecl::DefinitionData(RD);
3293 RD->DefinitionData = DD;
3297 Reader.PendingFakeDefinitionData.insert(
3298 std::make_pair(DD, ASTReader::PendingFakeDefinitionKind::Fake));
3301 return DD->Definition;
3308 if (
auto *ND = dyn_cast<NamespaceDecl>(DC))
3309 return ND->getFirstDecl();
3311 if (
auto *RD = dyn_cast<CXXRecordDecl>(DC))
3312 return getOrFakePrimaryClassDefinition(Reader, RD);
3314 if (
auto *RD = dyn_cast<RecordDecl>(DC))
3317 if (
auto *ED = dyn_cast<EnumDecl>(DC))
3320 if (
auto *OID = dyn_cast<ObjCInterfaceDecl>(DC))
3325 if (
auto *TU = dyn_cast<TranslationUnitDecl>(DC))
3331ASTDeclReader::FindExistingResult::~FindExistingResult() {
3334 if (TypedefNameForLinkage) {
3336 Reader.ImportedTypedefNamesForLinkage.insert(
3337 std::make_pair(std::make_pair(DC, TypedefNameForLinkage),
New));
3341 if (!AddResult || Existing)
3347 setAnonymousDeclForMerging(Reader,
New->getLexicalDeclContext(),
3348 AnonymousDeclNumber,
New);
3352 Reader.PendingFakeLookupResults[Name.getAsIdentifierInfo()]
3354 }
else if (
DeclContext *MergeDC = getPrimaryContextForMerging(Reader, DC)) {
3357 MergeDC->makeDeclVisibleInContextImpl(
New,
true);
3365 bool IsTypedefNameForLinkage) {
3366 if (!IsTypedefNameForLinkage)
3372 if (
Found->isFromASTFile())
3375 if (
auto *TND = dyn_cast<TypedefNameDecl>(
Found))
3376 return TND->getAnonDeclWithTypedefName(
true);
3385ASTDeclReader::getPrimaryDCForAnonymousDecl(
DeclContext *LexicalDC) {
3387 if (
auto *RD = dyn_cast<CXXRecordDecl>(LexicalDC)) {
3389 return DD ? DD->Definition :
nullptr;
3390 }
else if (
auto *OID = dyn_cast<ObjCInterfaceDecl>(LexicalDC)) {
3391 return OID->getCanonicalDecl()->getDefinition();
3398 if (
auto *FD = dyn_cast<FunctionDecl>(
D))
3399 if (FD->isThisDeclarationADefinition())
3401 if (
auto *MD = dyn_cast<ObjCMethodDecl>(
D))
3402 if (MD->isThisDeclarationADefinition())
3404 if (
auto *RD = dyn_cast<RecordDecl>(
D))
3421 auto &
Previous = Reader.AnonymousDeclarationsForMerging[CanonDC];
3427 auto *PrimaryDC = getPrimaryDCForAnonymousDecl(DC);
3428 if (PrimaryDC && !cast<Decl>(PrimaryDC)->isFromASTFile()) {
3440void ASTDeclReader::setAnonymousDeclForMerging(
ASTReader &Reader,
3443 auto *CanonDC = cast<Decl>(DC)->getCanonicalDecl();
3445 auto &
Previous = Reader.AnonymousDeclarationsForMerging[CanonDC];
3452ASTDeclReader::FindExistingResult ASTDeclReader::findExisting(
NamedDecl *
D) {
3459 FindExistingResult
Result(Reader,
D,
nullptr,
3460 AnonymousDeclNumber, TypedefNameForLinkage);
3467 if (TypedefNameForLinkage) {
3468 auto It = Reader.ImportedTypedefNamesForLinkage.find(
3469 std::make_pair(DC, TypedefNameForLinkage));
3470 if (It != Reader.ImportedTypedefNamesForLinkage.end())
3471 if (
C.isSameEntity(It->second,
D))
3472 return FindExistingResult(Reader,
D, It->second, AnonymousDeclNumber,
3473 TypedefNameForLinkage);
3481 if (
auto *Existing = getAnonymousDeclForMerging(
3483 if (
C.isSameEntity(Existing,
D))
3484 return FindExistingResult(Reader,
D, Existing, AnonymousDeclNumber,
3485 TypedefNameForLinkage);
3492 class UpToDateIdentifierRAII {
3494 bool WasOutToDate =
false;
3505 ~UpToDateIdentifierRAII() {
3509 } UpToDate(Name.getAsIdentifierInfo());
3512 IEnd = IdResolver.
end();
3515 if (
C.isSameEntity(Existing,
D))
3516 return FindExistingResult(Reader,
D, Existing, AnonymousDeclNumber,
3517 TypedefNameForLinkage);
3519 }
else if (
DeclContext *MergeDC = getPrimaryContextForMerging(Reader, DC)) {
3523 if (
C.isSameEntity(Existing,
D))
3524 return FindExistingResult(Reader,
D, Existing, AnonymousDeclNumber,
3525 TypedefNameForLinkage);
3529 return FindExistingResult(Reader);
3541 if (MergedDCIt != Reader.MergedDeclContexts.end() &&
3544 Reader.PendingOdrMergeChecks.push_back(
D);
3546 return FindExistingResult(Reader,
D,
nullptr,
3547 AnonymousDeclNumber, TypedefNameForLinkage);
3550template<
typename DeclT>
3552 return D->RedeclLink.getLatestNotUpdated();
3556 llvm_unreachable(
"getMostRecentDecl on non-redeclarable declaration");
3563#define ABSTRACT_DECL(TYPE)
3564#define DECL(TYPE, BASE) \
3566 return getMostRecentDeclImpl(cast<TYPE##Decl>(D));
3567#include "clang/AST/DeclNodes.inc"
3569 llvm_unreachable(
"unknown decl kind");
3572Decl *ASTReader::getMostRecentExistingDecl(
Decl *
D) {
3580 const auto *IA =
Previous->getAttr<MSInheritanceAttr>();
3582 if (IA && !
D->
hasAttr<MSInheritanceAttr>()) {
3583 NewAttr = cast<InheritableAttr>(IA->clone(Context));
3588 const auto *AA =
Previous->getAttr<AvailabilityAttr>();
3589 if (AA && !
D->
hasAttr<AvailabilityAttr>()) {
3590 NewAttr = AA->
clone(Context);
3597template<
typename DeclT>
3601 D->RedeclLink.setPrevious(cast<DeclT>(
Previous));
3602 D->First = cast<DeclT>(
Previous)->First;
3611 auto *VD =
static_cast<VarDecl *
>(
D);
3612 auto *PrevVD = cast<VarDecl>(
Previous);
3613 D->RedeclLink.setPrevious(PrevVD);
3614 D->First = PrevVD->First;
3623 VD->demoteThisDefinitionToDeclaration();
3640 auto *PrevFD = cast<FunctionDecl>(
Previous);
3642 FD->RedeclLink.setPrevious(PrevFD);
3643 FD->First = PrevFD->First;
3647 if (PrevFD->isInlined() != FD->isInlined()) {
3663 FD->setImplicitlyInline(
true);
3668 if (FPT && PrevFPT) {
3672 bool WasUnresolved =
3674 if (IsUnresolved != WasUnresolved)
3675 Reader.PendingExceptionSpecUpdates.insert(
3676 {Canon, IsUnresolved ? PrevFD : FD});
3682 if (IsUndeduced != WasUndeduced)
3683 Reader.PendingDeducedTypeUpdates.insert(
3684 {cast<FunctionDecl>(Canon),
3685 (IsUndeduced ? PrevFPT : FPT)->getReturnType()});
3692 llvm_unreachable(
"attachPreviousDecl on non-redeclarable declaration");
3697template <
typename ParmDecl>
3700 auto *To = cast<ParmDecl>(ToD);
3701 if (!From->hasDefaultArgument())
3703 To->setInheritedDefaultArgument(Context, From);
3712 assert(FromTP->size() == ToTP->size() &&
"merged mismatched templates?");
3714 for (
unsigned I = 0, N = FromTP->size(); I != N; ++I) {
3715 NamedDecl *FromParam = FromTP->getParam(I);
3718 if (
auto *FTTP = dyn_cast<TemplateTypeParmDecl>(FromParam))
3720 else if (
auto *FNTTP = dyn_cast<NonTypeTemplateParmDecl>(FromParam))
3724 Context, cast<TemplateTemplateParmDecl>(FromParam), ToParam);
3742 if (!isa<VarDecl, FunctionDecl, TagDecl, RedeclarableTemplateDecl>(
Previous))
3750 if (isa<VarTemplateSpecializationDecl>(
Previous))
3752 if (isa<ClassTemplateSpecializationDecl>(
Previous))
3755 Func &&
Func->getTemplateSpecializationInfo())
3764 if (!
Previous->getLexicalDeclContext()
3765 ->getNonTransparentContext()
3766 ->isFileContext() ||
3784 Reader.PendingWarningForDuplicatedDefsInModuleUnits.push_back(
3794 diag::err_multiple_decl_in_different_modules)
3804#define ABSTRACT_DECL(TYPE)
3805#define DECL(TYPE, BASE) \
3807 attachPreviousDeclImpl(Reader, cast<TYPE##Decl>(D), Previous, Canon); \
3809#include "clang/AST/DeclNodes.inc"
3825 if (
auto *TD = dyn_cast<TemplateDecl>(
D))
3833 mergeInheritableAttributes(Reader,
D,
Previous);
3836template<
typename DeclT>
3838 D->RedeclLink.setLatest(cast<DeclT>(Latest));
3842 llvm_unreachable(
"attachLatestDecl on non-redeclarable declaration");
3846 assert(
D && Latest);
3849#define ABSTRACT_DECL(TYPE)
3850#define DECL(TYPE, BASE) \
3852 attachLatestDeclImpl(cast<TYPE##Decl>(D), Latest); \
3854#include "clang/AST/DeclNodes.inc"
3858template<
typename DeclT>
3860 D->RedeclLink.markIncomplete();
3864 llvm_unreachable(
"markIncompleteDeclChain on non-redeclarable declaration");
3867void ASTReader::markIncompleteDeclChain(
Decl *
D) {
3869#define ABSTRACT_DECL(TYPE)
3870#define DECL(TYPE, BASE) \
3872 ASTDeclReader::markIncompleteDeclChainImpl(cast<TYPE##Decl>(D)); \
3874#include "clang/AST/DeclNodes.inc"
3881 RecordLocation
Loc = DeclCursorForID(ID, DeclLoc);
3882 llvm::BitstreamCursor &DeclsCursor =
Loc.F->DeclsCursor;
3887 ReadingKindTracker ReadingKind(Read_Decl, *
this);
3890 Deserializing ADecl(
this);
3892 auto Fail = [](
const char *what, llvm::Error &&Err) {
3893 llvm::report_fatal_error(Twine(
"ASTReader::readDeclRecord failed ") + what +
3897 if (llvm::Error JumpFailed = DeclsCursor.JumpToBit(
Loc.Offset))
3898 Fail(
"jumping", std::move(JumpFailed));
3903 Fail(
"reading code", MaybeCode.takeError());
3904 unsigned Code = MaybeCode.get();
3910 llvm::report_fatal_error(
3911 Twine(
"ASTReader::readDeclRecord failed reading decl code: ") +
3912 toString(MaybeDeclCode.takeError()));
3914 switch ((
DeclCode)MaybeDeclCode.get()) {
3921 llvm_unreachable(
"Record cannot be de-serialized with readDeclRecord");
4031 bool HasTypeConstraint =
Record.readInt();
4037 bool HasTypeConstraint =
Record.readInt();
4043 bool HasTypeConstraint =
Record.readInt();
4045 Context, ID,
Record.readInt(), HasTypeConstraint);
4134 D = MSGuidDecl::CreateDeserialized(Context, ID);
4137 D = UnnamedGlobalConstantDecl::CreateDeserialized(Context, ID);
4140 D = TemplateParamObjectDecl::CreateDeserialized(Context, ID);
4149 Error(
"attempt to read a C++ base-specifier record as a declaration");
4152 Error(
"attempt to read a C++ ctor initializer record as a declaration");
4161 unsigned NumChildren =
Record.readInt();
4167 unsigned NumClauses =
Record.readInt();
4168 unsigned NumVars =
Record.readInt();
4174 unsigned NumClauses =
Record.readInt();
4183 unsigned NumClauses =
Record.readInt();
4222 assert(
D &&
"Unknown declaration reading AST file");
4223 LoadedDecl(translateGlobalDeclIDToIndex(ID),
D);
4234 if (
auto *DC = dyn_cast<DeclContext>(
D)) {
4237 Reader.VisitDeclContext(DC, Offsets);
4242 if (!Offsets && isa<NamespaceDecl>(
D))
4243 if (
auto Iter = DelayedNamespaceOffsetMap.find(ID);
4244 Iter != DelayedNamespaceOffsetMap.end())
4245 Offsets =
Iter->second;
4248 ReadVisibleDeclContextStorage(
4250 VisibleDeclContextStorageKind::GenerallyVisible))
4253 ReadVisibleDeclContextStorage(
4255 VisibleDeclContextStorageKind::ModuleLocalVisible))
4258 ReadVisibleDeclContextStorage(
4260 VisibleDeclContextStorageKind::TULocalVisible))
4264 ReadLexicalDeclContextStorage(*
Loc.F, DeclsCursor,
4271 PendingUpdateRecords.push_back(
4272 PendingUpdateRecord(ID,
D,
true));
4275 if (
auto *
Class = dyn_cast<ObjCInterfaceDecl>(
D))
4278 if (
Class->isThisDeclarationADefinition() ||
4279 PendingDefinitions.count(
Class))
4280 loadObjCCategories(ID,
Class);
4286 PotentiallyInterestingDecls.push_back(
D);
4291void ASTReader::PassInterestingDeclsToConsumer() {
4294 if (!CanPassDeclsToConsumer)
4299 SaveAndRestore GuardPassingDeclsToConsumer(CanPassDeclsToConsumer,
4304 for (
auto ID : EagerlyDeserializedDecls)
4306 EagerlyDeserializedDecls.clear();
4308 auto ConsumingPotentialInterestingDecls = [
this]() {
4309 while (!PotentiallyInterestingDecls.empty()) {
4310 Decl *
D = PotentiallyInterestingDecls.front();
4311 PotentiallyInterestingDecls.pop_front();
4312 if (isConsumerInterestedIn(
D))
4313 PassInterestingDeclToConsumer(
D);
4316 std::deque<Decl *> MaybeInterestingDecls =
4317 std::move(PotentiallyInterestingDecls);
4318 PotentiallyInterestingDecls.clear();
4319 assert(PotentiallyInterestingDecls.empty());
4320 while (!MaybeInterestingDecls.empty()) {
4321 Decl *
D = MaybeInterestingDecls.front();
4322 MaybeInterestingDecls.pop_front();
4328 if (
auto *VD = dyn_cast<VarDecl>(
D);
4329 VD && VD->isFileVarDecl() && !VD->isExternallyVisible())
4331 ConsumingPotentialInterestingDecls();
4332 if (isConsumerInterestedIn(
D))
4333 PassInterestingDeclToConsumer(
D);
4337 ConsumingPotentialInterestingDecls();
4340 auto *RD = cast<CXXRecordDecl>(
GetDecl(ID));
4342 PassVTableToConsumer(RD);
4344 VTablesToEmit.clear();
4347void ASTReader::loadDeclUpdateRecords(PendingUpdateRecord &
Record) {
4353 ProcessingUpdatesRAIIObj ProcessingUpdates(*
this);
4354 DeclUpdateOffsetsMap::iterator UpdI = DeclUpdateOffsets.find(ID);
4356 if (UpdI != DeclUpdateOffsets.end()) {
4357 auto UpdateOffsets = std::move(UpdI->second);
4358 DeclUpdateOffsets.erase(UpdI);
4364 bool WasInteresting =
Record.JustLoaded || isConsumerInterestedIn(
D);
4365 for (
auto &FileAndOffset : UpdateOffsets) {
4367 uint64_t Offset = FileAndOffset.second;
4370 if (llvm::Error JumpFailed =
Cursor.JumpToBit(Offset))
4372 llvm::report_fatal_error(
4373 Twine(
"ASTReader::loadDeclUpdateRecords failed jumping: ") +
4377 llvm::report_fatal_error(
4378 Twine(
"ASTReader::loadDeclUpdateRecords failed reading code: ") +
4380 unsigned Code = MaybeCode.get();
4384 "Expected DECL_UPDATES record!");
4386 llvm::report_fatal_error(
4387 Twine(
"ASTReader::loadDeclUpdateRecords failed reading rec code: ") +
4392 Reader.UpdateDecl(
D);
4396 if (!WasInteresting && isConsumerInterestedIn(
D)) {
4397 PotentiallyInterestingDecls.push_back(
D);
4398 WasInteresting =
true;
4404 if (
auto I = PendingVisibleUpdates.find(ID);
4405 I != PendingVisibleUpdates.end()) {
4406 auto VisibleUpdates = std::move(I->second);
4407 PendingVisibleUpdates.erase(I);
4410 for (
const auto &
Update : VisibleUpdates)
4411 Lookups[DC].Table.add(
4417 if (
auto I = PendingModuleLocalVisibleUpdates.find(ID);
4418 I != PendingModuleLocalVisibleUpdates.end()) {
4419 auto ModuleLocalVisibleUpdates = std::move(I->second);
4420 PendingModuleLocalVisibleUpdates.erase(I);
4423 for (
const auto &
Update : ModuleLocalVisibleUpdates)
4424 ModuleLocalLookups[DC].Table.add(
4432 if (
auto I = TULocalUpdates.find(ID); I != TULocalUpdates.end()) {
4433 auto Updates = std::move(I->second);
4434 TULocalUpdates.erase(I);
4437 for (
const auto &
Update : Updates)
4438 TULocalLookups[DC].Table.add(
4446 if (
auto IT = RelatedDeclsMap.find(ID); IT != RelatedDeclsMap.end()) {
4447 for (
auto LID : IT->second)
4449 RelatedDeclsMap.erase(IT);
4454 if (
auto I = PendingSpecializationsUpdates.find(ID);
4455 I != PendingSpecializationsUpdates.end()) {
4456 auto SpecializationUpdates = std::move(I->second);
4457 PendingSpecializationsUpdates.erase(I);
4459 for (
const auto &
Update : SpecializationUpdates)
4464 if (
auto I = PendingPartialSpecializationsUpdates.find(ID);
4465 I != PendingPartialSpecializationsUpdates.end()) {
4466 auto SpecializationUpdates = std::move(I->second);
4467 PendingPartialSpecializationsUpdates.erase(I);
4469 for (
const auto &
Update : SpecializationUpdates)
4474void ASTReader::loadPendingDeclChain(
Decl *FirstLocal, uint64_t LocalOffset) {
4477 if (FirstLocal != CanonDecl) {
4480 *
this, FirstLocal, PrevMostRecent ? PrevMostRecent : CanonDecl,
4491 assert(M &&
"imported decl from no module file");
4495 if (llvm::Error JumpFailed =
Cursor.JumpToBit(LocalOffset))
4496 llvm::report_fatal_error(
4497 Twine(
"ASTReader::loadPendingDeclChain failed jumping: ") +
4503 llvm::report_fatal_error(
4504 Twine(
"ASTReader::loadPendingDeclChain failed reading code: ") +
4506 unsigned Code = MaybeCode.get();
4509 "expected LOCAL_REDECLARATIONS record!");
4511 llvm::report_fatal_error(
4512 Twine(
"ASTReader::loadPendingDeclChain failed reading rec code: ") +
4517 Decl *MostRecent = FirstLocal;
4518 for (
unsigned I = 0, N =
Record.size(); I != N; ++I) {
4519 unsigned Idx = N - I - 1;
4531 class ObjCCategoriesVisitor {
4534 llvm::SmallPtrSetImpl<ObjCCategoryDecl *> &Deserialized;
4536 llvm::DenseMap<DeclarationName, ObjCCategoryDecl *> NameCategoryMap;
4538 unsigned PreviousGeneration;
4542 if (!Deserialized.erase(Cat))
4554 StructuralEquivalenceKind::Default,
4558 if (!Ctx.IsEquivalent(Cat, Existing)) {
4563 diag::note_previous_definition);
4565 }
else if (!Existing) {
4580 ObjCCategoriesVisitor(
4582 llvm::SmallPtrSetImpl<ObjCCategoryDecl *> &Deserialized,
4585 InterfaceID(InterfaceID), PreviousGeneration(PreviousGeneration) {
4587 for (
auto *Cat :
Interface->known_categories()) {
4617 LocalID != Result->getDefinitionID()) {
4625 unsigned Offset = Result->Offset;
4628 for (
unsigned I = 0; I != N; ++I)
4637 unsigned PreviousGeneration) {
4638 ObjCCategoriesVisitor Visitor(*
this,
D, CategoriesDeserialized, ID,
4639 PreviousGeneration);
4640 ModuleMgr.
visit(Visitor);
4643template<
typename DeclT,
typename Fn>
4652 for (
auto *Redecl = MostRecent; Redecl && !
Found;
4653 Redecl = Redecl->getPreviousDecl())
4658 for (
auto *Redecl = MostRecent; Redecl !=
D;
4667 case DeclUpdateKind::CXXAddedImplicitMember: {
4668 auto *RD = cast<CXXRecordDecl>(
D);
4670 assert(MD &&
"couldn't read decl from update record");
4671 Reader.PendingAddedClassMembers.push_back({RD, MD});
4675 case DeclUpdateKind::CXXAddedAnonymousNamespace: {
4676 auto *Anon = readDeclAs<NamespaceDecl>();
4681 if (!
Record.isModule()) {
4682 if (
auto *TU = dyn_cast<TranslationUnitDecl>(
D))
4683 TU->setAnonymousNamespace(Anon);
4685 cast<NamespaceDecl>(
D)->setAnonymousNamespace(Anon);
4690 case DeclUpdateKind::CXXAddedVarDefinition: {
4691 auto *VD = cast<VarDecl>(
D);
4692 VD->NonParmVarDeclBits.IsInline =
Record.readInt();
4693 VD->NonParmVarDeclBits.IsInlineSpecified =
Record.readInt();
4698 case DeclUpdateKind::CXXPointOfInstantiation: {
4700 if (
auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(
D)) {
4701 VTSD->setPointOfInstantiation(POI);
4702 }
else if (
auto *VD = dyn_cast<VarDecl>(
D)) {
4704 assert(MSInfo &&
"No member specialization information");
4707 auto *FD = cast<FunctionDecl>(
D);
4708 if (
auto *FTSInfo = dyn_cast<FunctionTemplateSpecializationInfo *>(
4709 FD->TemplateOrSpecialization))
4710 FTSInfo->setPointOfInstantiation(POI);
4712 cast<MemberSpecializationInfo *>(FD->TemplateOrSpecialization)
4713 ->setPointOfInstantiation(POI);
4718 case DeclUpdateKind::CXXInstantiatedDefaultArgument: {
4719 auto *Param = cast<ParmVarDecl>(
D);
4724 auto *DefaultArg =
Record.readExpr();
4728 if (Param->hasUninstantiatedDefaultArg())
4729 Param->setDefaultArg(DefaultArg);
4733 case DeclUpdateKind::CXXInstantiatedDefaultMemberInitializer: {
4734 auto *FD = cast<FieldDecl>(
D);
4735 auto *DefaultInit =
Record.readExpr();
4739 if (FD->hasInClassInitializer() && !FD->hasNonNullInClassInitializer()) {
4741 FD->setInClassInitializer(DefaultInit);
4745 FD->removeInClassInitializer();
4750 case DeclUpdateKind::CXXAddedFunctionDefinition: {
4751 auto *FD = cast<FunctionDecl>(
D);
4752 if (Reader.PendingBodies[FD]) {
4766 FD->setInnerLocStart(readSourceLocation());
4768 assert(
Record.getIdx() ==
Record.size() &&
"lazy body must be last");
4772 case DeclUpdateKind::CXXInstantiatedClassDefinition: {
4773 auto *RD = cast<CXXRecordDecl>(
D);
4775 bool HadRealDefinition =
4776 OldDD && (OldDD->Definition != RD ||
4777 !Reader.PendingFakeDefinitionData.count(OldDD));
4781 ReadCXXRecordDefinition(RD,
true);
4784 uint64_t LexicalOffset = ReadLocalOffset();
4785 if (!HadRealDefinition && LexicalOffset) {
4786 Record.readLexicalDeclContextStorage(LexicalOffset, RD);
4787 Reader.PendingFakeDefinitionData.erase(OldDD);
4794 MSInfo->setTemplateSpecializationKind(TSK);
4795 MSInfo->setPointOfInstantiation(POI);
4797 auto *Spec = cast<ClassTemplateSpecializationDecl>(RD);
4798 Spec->setTemplateSpecializationKind(TSK);
4799 Spec->setPointOfInstantiation(POI);
4803 readDeclAs<ClassTemplatePartialSpecializationDecl>();
4805 Record.readTemplateArgumentList(TemplArgs);
4811 if (!isa<ClassTemplatePartialSpecializationDecl *>(
4812 Spec->getSpecializedTemplateOrPartial()))
4813 Spec->setInstantiationOf(PartialSpec, TemplArgList);
4824 Record.readAttributes(Attrs);
4833 case DeclUpdateKind::CXXResolvedDtorDelete: {
4836 auto *Del = readDeclAs<FunctionDecl>();
4838 auto *ThisArg =
Record.readExpr();
4840 if (!
First->OperatorDelete) {
4841 First->OperatorDelete = Del;
4842 First->OperatorDeleteThisArg = ThisArg;
4847 case DeclUpdateKind::CXXResolvedExceptionSpec: {
4849 auto ESI =
Record.readExceptionSpecInfo(ExceptionStorage);
4852 auto *FD = cast<FunctionDecl>(
D);
4858 FPT->getReturnType(), FPT->getParamTypes(),
4859 FPT->getExtProtoInfo().withExceptionSpec(ESI)));
4863 Reader.PendingExceptionSpecUpdates.insert(
4864 std::make_pair(FD->getCanonicalDecl(), FD));
4869 case DeclUpdateKind::CXXDeducedReturnType: {
4870 auto *FD = cast<FunctionDecl>(
D);
4872 Reader.PendingDeducedTypeUpdates.insert(
4873 {FD->getCanonicalDecl(), DeducedResultType});
4877 case DeclUpdateKind::DeclMarkedUsed:
4882 case DeclUpdateKind::ManglingNumber:
4887 case DeclUpdateKind::StaticLocalNumber:
4892 case DeclUpdateKind::DeclMarkedOpenMPThreadPrivate:
4894 readSourceRange()));
4897 case DeclUpdateKind::DeclMarkedOpenMPAllocate: {
4898 auto AllocatorKind =
4899 static_cast<OMPAllocateDeclAttr::AllocatorTypeTy
>(
Record.readInt());
4903 D->
addAttr(OMPAllocateDeclAttr::CreateImplicit(
4904 Reader.
getContext(), AllocatorKind, Allocator, Alignment, SR));
4908 case DeclUpdateKind::DeclExported: {
4910 auto *Exported = cast<NamedDecl>(
D);
4913 Reader.PendingMergedDefinitionsToDeduplicate.insert(Exported);
4917 case DeclUpdateKind::DeclMarkedOpenMPDeclareTarget: {
4918 auto MapType =
Record.readEnum<OMPDeclareTargetDeclAttr::MapTypeTy>();
4919 auto DevType =
Record.readEnum<OMPDeclareTargetDeclAttr::DevTypeTy>();
4922 unsigned Level =
Record.readInt();
4923 D->
addAttr(OMPDeclareTargetDeclAttr::CreateImplicit(
4925 readSourceRange()));
4929 case DeclUpdateKind::AddedAttrToRecord:
4931 Record.readAttributes(Attrs);
4932 assert(Attrs.size() == 1);
This file provides AST data structures related to concepts.
Defines the clang::ASTContext interface.
static T assert_cast(T t)
"Cast" to type T, asserting if we don't have an implicit conversion.
static bool allowODRLikeMergeInC(NamedDecl *ND)
ODR-like semantics for C/ObjC allow us to merge tag types and a structural check in Sema guarantees t...
static NamedDecl * getDeclForMerging(NamedDecl *Found, bool IsTypedefNameForLinkage)
Find the declaration that should be merged into, given the declaration found by name lookup.
static bool inheritDefaultTemplateArgument(ASTContext &Context, ParmDecl *From, Decl *ToD)
Inherit the default template argument from From to To.
static void inheritDefaultTemplateArguments(ASTContext &Context, TemplateDecl *From, TemplateDecl *To)
static void forAllLaterRedecls(DeclT *D, Fn F)
static llvm::iterator_range< MergedRedeclIterator< DeclT > > merged_redecls(DeclT *D)
Defines the clang::attr::Kind enum.
clang::CharUnits operator*(clang::CharUnits::QuantityType Scale, const clang::CharUnits &CU)
enum clang::sema::@1840::IndirectLocalPathEntry::EntryKind Kind
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
This file defines OpenMP nodes for declarative directives.
Defines the C++ template declaration subclasses.
Defines the ExceptionSpecificationType enumeration and various utility functions.
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 several types used to describe C++ lambda expressions that are shared between the parser and ...
Defines the clang::LangOptions interface.
llvm::MachO::Record Record
Defines the clang::Module class, which describes a module in the source code.
This file defines OpenMP AST classes for clauses.
static std::string toString(const clang::SanitizerSet &Sanitizers)
Produce a string containing comma-separated names of sanitizers in Sanitizers set.
Defines the clang::SourceLocation class and associated facilities.
Defines various enumerations that describe declaration and type specifiers.
C Language Family Type Representation.
__DEVICE__ void * memcpy(void *__a, const void *__b, size_t __c)
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
bool needsCleanup() const
Returns whether the object performed allocations.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
TranslationUnitDecl * getTranslationUnitDecl() const
void setInstantiatedFromUsingDecl(NamedDecl *Inst, NamedDecl *Pattern)
Remember that the using decl Inst is an instantiation of the using decl Pattern of a class template.
void setInstantiatedFromUsingShadowDecl(UsingShadowDecl *Inst, UsingShadowDecl *Pattern)
const LangOptions & getLangOpts() const
void setInstantiatedFromUsingEnumDecl(UsingEnumDecl *Inst, UsingEnumDecl *Pattern)
Remember that the using enum decl Inst is an instantiation of the using enum decl Pattern of a class ...
void setStaticLocalNumber(const VarDecl *VD, unsigned Number)
void addOverriddenMethod(const CXXMethodDecl *Method, const CXXMethodDecl *Overridden)
Note that the given C++ Method overrides the given Overridden method.
bool isInSameModule(const Module *M1, const Module *M2) const
If the two module M1 and M2 are in the same module.
void setManglingNumber(const NamedDecl *ND, unsigned Number)
void * Allocate(size_t Size, unsigned Align=8) const
TypeSourceInfo * CreateTypeSourceInfo(QualType T, unsigned Size=0) const
Allocate an uninitialized TypeSourceInfo.
void setInstantiatedFromStaticDataMember(VarDecl *Inst, VarDecl *Tmpl, TemplateSpecializationKind TSK, SourceLocation PointOfInstantiation=SourceLocation())
Note that the static data member Inst is an instantiation of the static data member template Tmpl of ...
QualType getFunctionType(QualType ResultTy, ArrayRef< QualType > Args, const FunctionProtoType::ExtProtoInfo &EPI) const
Return a normal function type with a typed argument list.
void setInstantiatedFromUnnamedFieldDecl(FieldDecl *Inst, FieldDecl *Tmpl)
void setBlockVarCopyInit(const VarDecl *VD, Expr *CopyExpr, bool CanThrow)
Set the copy initialization expression of a block var decl.
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.
void mergeDefinitionIntoModule(NamedDecl *ND, Module *M, bool NotifyListeners=true)
Note that the definition ND has been merged into module M, and should be visible whenever M is visibl...
void setPrimaryMergedDecl(Decl *D, Decl *Primary)
void setObjCMethodRedeclaration(const ObjCMethodDecl *MD, const ObjCMethodDecl *Redecl)
void mergeTemplatePattern(RedeclarableTemplateDecl *D, RedeclarableTemplateDecl *Existing, bool IsKeyDecl)
Merge together the pattern declarations from two template declarations.
ASTDeclMerger(ASTReader &Reader)
void mergeRedeclarable(Redeclarable< T > *D, T *Existing, RedeclarableResult &Redecl)
void mergeLambda(CXXRecordDecl *D, RedeclarableResult &Redecl, Decl &Context, unsigned Number)
Attempt to merge D with a previous declaration of the same lambda, which is found by its index within...
void MergeDefinitionData(CXXRecordDecl *D, struct CXXRecordDecl::DefinitionData &&NewDD)
void mergeRedeclarableImpl(Redeclarable< T > *D, T *Existing, GlobalDeclID KeyDeclID)
Attempts to merge the given declaration (D) with another declaration of the same entity.
void VisitTemplateParamObjectDecl(TemplateParamObjectDecl *D)
void VisitObjCImplementationDecl(ObjCImplementationDecl *D)
void mergeRedeclarableTemplate(RedeclarableTemplateDecl *D, RedeclarableResult &Redecl)
void VisitImportDecl(ImportDecl *D)
void VisitBindingDecl(BindingDecl *BD)
void VisitNamespaceDecl(NamespaceDecl *D)
void VisitTopLevelStmtDecl(TopLevelStmtDecl *D)
RedeclarableResult VisitRedeclarableTemplateDecl(RedeclarableTemplateDecl *D)
void VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D)
void VisitUnresolvedUsingIfExistsDecl(UnresolvedUsingIfExistsDecl *D)
void ReadFunctionDefinition(FunctionDecl *FD)
void VisitLabelDecl(LabelDecl *LD)
void VisitObjCCategoryDecl(ObjCCategoryDecl *D)
void VisitUsingDirectiveDecl(UsingDirectiveDecl *D)
RedeclarableResult VisitClassTemplateSpecializationDeclImpl(ClassTemplateSpecializationDecl *D)
void VisitFunctionDecl(FunctionDecl *FD)
void VisitObjCMethodDecl(ObjCMethodDecl *D)
void VisitUsingShadowDecl(UsingShadowDecl *D)
void VisitVarTemplateSpecializationDecl(VarTemplateSpecializationDecl *D)
void VisitVarDecl(VarDecl *VD)
RedeclarableResult VisitRedeclarable(Redeclarable< T > *D)
void VisitDeclContext(DeclContext *DC, LookupBlockOffsets &Offsets)
void VisitMSGuidDecl(MSGuidDecl *D)
void VisitPragmaCommentDecl(PragmaCommentDecl *D)
void VisitRecordDecl(RecordDecl *RD)
void VisitLifetimeExtendedTemporaryDecl(LifetimeExtendedTemporaryDecl *D)
void VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D)
void VisitRequiresExprBodyDecl(RequiresExprBodyDecl *D)
void ReadVarDeclInit(VarDecl *VD)
static Decl * getMostRecentDeclImpl(Redeclarable< DeclT > *D)
void VisitNamespaceAliasDecl(NamespaceAliasDecl *D)
void VisitIndirectFieldDecl(IndirectFieldDecl *FD)
void VisitObjCContainerDecl(ObjCContainerDecl *D)
void VisitBlockDecl(BlockDecl *BD)
void VisitOpenACCRoutineDecl(OpenACCRoutineDecl *D)
void VisitExportDecl(ExportDecl *D)
static void attachLatestDecl(Decl *D, Decl *latest)
void VisitStaticAssertDecl(StaticAssertDecl *D)
void VisitEmptyDecl(EmptyDecl *D)
void VisitOMPCapturedExprDecl(OMPCapturedExprDecl *D)
void VisitValueDecl(ValueDecl *VD)
void VisitEnumDecl(EnumDecl *ED)
void mergeRedeclarable(Redeclarable< T > *D, RedeclarableResult &Redecl)
Attempts to merge the given declaration (D) with another declaration of the same entity.
void VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D)
void VisitFriendTemplateDecl(FriendTemplateDecl *D)
void VisitObjCProtocolDecl(ObjCProtocolDecl *D)
void VisitClassTemplatePartialSpecializationDecl(ClassTemplatePartialSpecializationDecl *D)
void VisitObjCTypeParamDecl(ObjCTypeParamDecl *D)
void VisitDeclaratorDecl(DeclaratorDecl *DD)
RedeclarableResult VisitTypedefNameDecl(TypedefNameDecl *TD)
void VisitFriendDecl(FriendDecl *D)
void VisitLinkageSpecDecl(LinkageSpecDecl *D)
void VisitCXXRecordDecl(CXXRecordDecl *D)
ASTDeclReader(ASTReader &Reader, ASTRecordReader &Record, ASTReader::RecordLocation Loc, GlobalDeclID thisDeclID, SourceLocation ThisDeclLoc)
void VisitFileScopeAsmDecl(FileScopeAsmDecl *AD)
void VisitImplicitConceptSpecializationDecl(ImplicitConceptSpecializationDecl *D)
void VisitNamedDecl(NamedDecl *ND)
void mergeMergeable(Mergeable< T > *D)
Attempts to merge the given declaration (D) with another declaration of the same entity,...
void VisitBuiltinTemplateDecl(BuiltinTemplateDecl *D)
static Decl * getMostRecentDecl(Decl *D)
void VisitObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *D)
void VisitCXXConstructorDecl(CXXConstructorDecl *D)
void VisitPragmaDetectMismatchDecl(PragmaDetectMismatchDecl *D)
void VisitImplicitParamDecl(ImplicitParamDecl *PD)
void VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D)
static void setNextObjCCategory(ObjCCategoryDecl *Cat, ObjCCategoryDecl *Next)
void VisitMSPropertyDecl(MSPropertyDecl *FD)
void VisitClassTemplateSpecializationDecl(ClassTemplateSpecializationDecl *D)
void VisitFieldDecl(FieldDecl *FD)
RedeclarableResult VisitVarDeclImpl(VarDecl *D)
void VisitOMPDeclareMapperDecl(OMPDeclareMapperDecl *D)
void VisitCapturedDecl(CapturedDecl *CD)
void VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D)
void VisitObjCInterfaceDecl(ObjCInterfaceDecl *D)
RedeclarableResult VisitCXXRecordDeclImpl(CXXRecordDecl *D)
void VisitAccessSpecDecl(AccessSpecDecl *D)
void VisitCXXMethodDecl(CXXMethodDecl *D)
void VisitOpenACCDeclareDecl(OpenACCDeclareDecl *D)
void VisitOMPAllocateDecl(OMPAllocateDecl *D)
void VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D)
static void attachLatestDeclImpl(Redeclarable< DeclT > *D, Decl *Latest)
static void markIncompleteDeclChainImpl(Redeclarable< DeclT > *D)
RedeclarableResult VisitTagDecl(TagDecl *TD)
ObjCTypeParamList * ReadObjCTypeParamList()
void VisitHLSLBufferDecl(HLSLBufferDecl *D)
void VisitOMPThreadPrivateDecl(OMPThreadPrivateDecl *D)
void VisitCXXDeductionGuideDecl(CXXDeductionGuideDecl *GD)
void VisitConstructorUsingShadowDecl(ConstructorUsingShadowDecl *D)
void VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D)
static void checkMultipleDefinitionInNamedModules(ASTReader &Reader, Decl *D, Decl *Previous)
void VisitUsingEnumDecl(UsingEnumDecl *D)
void VisitObjCImplDecl(ObjCImplDecl *D)
void VisitTranslationUnitDecl(TranslationUnitDecl *TU)
void VisitUnnamedGlobalConstantDecl(UnnamedGlobalConstantDecl *D)
void VisitTypeDecl(TypeDecl *TD)
void VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D)
void VisitEnumConstantDecl(EnumConstantDecl *ECD)
void VisitTypeAliasDecl(TypeAliasDecl *TD)
static void attachPreviousDeclImpl(ASTReader &Reader, Redeclarable< DeclT > *D, Decl *Previous, Decl *Canon)
void VisitConceptDecl(ConceptDecl *D)
void VisitObjCPropertyDecl(ObjCPropertyDecl *D)
void VisitOutlinedFunctionDecl(OutlinedFunctionDecl *D)
void VisitObjCIvarDecl(ObjCIvarDecl *D)
void VisitUsingPackDecl(UsingPackDecl *D)
void VisitFunctionTemplateDecl(FunctionTemplateDecl *D)
void VisitOMPDeclareReductionDecl(OMPDeclareReductionDecl *D)
RedeclarableResult VisitVarTemplateSpecializationDeclImpl(VarTemplateSpecializationDecl *D)
TODO: Unify with ClassTemplateSpecializationDecl version? May require unifying ClassTemplate(Partial)...
void VisitUsingDecl(UsingDecl *D)
void VisitObjCAtDefsFieldDecl(ObjCAtDefsFieldDecl *D)
void VisitVarTemplatePartialSpecializationDecl(VarTemplatePartialSpecializationDecl *D)
TODO: Unify with ClassTemplatePartialSpecializationDecl version? May require unifying ClassTemplate(P...
void VisitParmVarDecl(ParmVarDecl *PD)
void VisitVarTemplateDecl(VarTemplateDecl *D)
TODO: Unify with ClassTemplateDecl version? May require unifying ClassTemplateDecl and VarTemplateDec...
static void attachPreviousDecl(ASTReader &Reader, Decl *D, Decl *Previous, Decl *Canon)
void VisitClassTemplateDecl(ClassTemplateDecl *D)
void VisitCXXDestructorDecl(CXXDestructorDecl *D)
void VisitTemplateDecl(TemplateDecl *D)
void VisitCXXConversionDecl(CXXConversionDecl *D)
void VisitTypedefDecl(TypedefDecl *TD)
void VisitOMPRequiresDecl(OMPRequiresDecl *D)
RedeclarableResult VisitRecordDeclImpl(RecordDecl *RD)
void VisitDecompositionDecl(DecompositionDecl *DD)
void ReadSpecializations(ModuleFile &M, Decl *D, llvm::BitstreamCursor &DeclsCursor, bool IsPartial)
Reads an AST files chain containing the contents of a translation unit.
bool isDeclIDFromModule(GlobalDeclID ID, ModuleFile &M) const
Returns true if global DeclID ID originated from module M.
DiagnosticBuilder Diag(unsigned DiagID) const
Report a diagnostic.
ASTContext & getContext()
Retrieve the AST context that this AST reader supplements.
Decl * ReadDecl(ModuleFile &F, const RecordDataImpl &R, unsigned &I)
Reads a declaration from the given position in a record in the given module.
ModuleFile * getOwningModuleFile(const Decl *D) const
Retrieve the module file that owns the given declaration, or NULL if the declaration is not from a mo...
T * ReadDeclAs(ModuleFile &F, const RecordDataImpl &R, unsigned &I)
Reads a declaration from the given position in a record in the given module.
LocalDeclID mapGlobalIDToModuleFileGlobalID(ModuleFile &M, GlobalDeclID GlobalID)
Map a global declaration ID into the declaration ID used to refer to this declaration within the give...
QualType GetType(serialization::TypeID ID)
Resolve a type ID into a type, potentially building a new type.
IdentifierResolver & getIdResolver()
Get the identifier resolver used for name lookup / updates in the translation unit scope.
Decl * GetDecl(GlobalDeclID ID)
Resolve a declaration ID into a declaration, potentially building a new declaration.
SourceLocation ReadSourceLocation(ModuleFile &MF, RawLocEncoding Raw) const
Read a source location from raw form.
Module * getSubmodule(serialization::SubmoduleID GlobalID)
Retrieve the submodule that corresponds to a global submodule ID.
void mergeDefinitionVisibility(NamedDecl *Def, NamedDecl *MergedDef)
Note that MergedDef is a redefinition of the canonical definition Def, so Def should be visible whene...
void runWithSufficientStackSpace(SourceLocation Loc, llvm::function_ref< void()> Fn)
SmallVector< uint64_t, 64 > RecordData
An object for streaming information from a record.
bool readBool()
Read a boolean value, advancing Idx.
std::string readString()
Read a string, advancing Idx.
SourceRange readSourceRange()
Read a source range, advancing Idx.
SourceLocation readSourceLocation()
Read a source location, advancing Idx.
void readAttributes(AttrVec &Attrs)
Reads attributes from the current stream position, advancing Idx.
T * readDeclAs()
Reads a declaration from the given position in the record, advancing Idx.
IdentifierInfo * readIdentifier()
ASTContext & getContext()
Retrieve the AST context that this AST reader supplements.
TypeSourceInfo * readTypeSourceInfo()
Reads a declarator info from the given record, advancing Idx.
OMPTraitInfo * readOMPTraitInfo()
Read an OMPTraitInfo object, advancing Idx.
VersionTuple readVersionTuple()
Read a version tuple, advancing Idx.
uint64_t readInt()
Returns the current value in this record, and advances to the next value.
Attr * readAttr()
Reads one attribute from the current stream position, advancing Idx.
Expr * readExpr()
Reads an expression.
Represents an access specifier followed by colon ':'.
static AccessSpecDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Attr - This represents one attribute.
Attr * clone(ASTContext &C) const
Syntax
The style used to specify an attribute.
@ AS_Keyword
__ptr16, alignas(...), etc.
A binding in a decomposition declaration.
static BindingDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
A simple helper class to unpack an integer to bits and consuming the bits in order.
uint32_t getNextBits(uint32_t Width)
A class which contains all the information about a particular captured value.
Represents a block literal declaration, which is like an unnamed FunctionDecl.
void setParams(ArrayRef< ParmVarDecl * > NewParamInfo)
void setDoesNotEscape(bool B=true)
void setSignatureAsWritten(TypeSourceInfo *Sig)
void setCanAvoidCopyToHeap(bool B=true)
void setIsConversionFromLambda(bool val=true)
void setBlockMissingReturnType(bool val=true)
static BlockDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setIsVariadic(bool value)
void setBody(CompoundStmt *B)
void setCaptures(ASTContext &Context, ArrayRef< Capture > Captures, bool CapturesCXXThis)
Represents the builtin template declaration which is used to implement __make_integer_seq and other b...
Represents a C++ constructor within a class.
static CXXConstructorDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, uint64_t AllocKind)
Represents a C++ conversion function within a class.
static CXXConversionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a C++ deduction guide declaration.
static CXXDeductionGuideDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a C++ destructor within a class.
static CXXDestructorDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a static or instance method of a struct/union/class.
static CXXMethodDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a C++ struct/union/class.
CXXRecordDecl * getDefinition() const
static CXXRecordDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID)
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this class is an instantiation of a member class of a class template specialization,...
CXXRecordDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Represents the body of a CapturedStmt, and serves as its DeclContext.
static CapturedDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumParams)
void setContextParam(unsigned i, ImplicitParamDecl *P)
void setNothrow(bool Nothrow=true)
void setParam(unsigned i, ImplicitParamDecl *P)
Declaration of a class template.
static ClassTemplateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Create an empty class template node.
static ClassTemplatePartialSpecializationDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a class template specialization, which refers to a class template with a given set of temp...
static ClassTemplateSpecializationDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Declaration of a C++20 concept.
static ConceptDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
A reference to a concept and its template args, as it appears in the code.
Represents a shadow constructor declaration introduced into a class by a C++11 using-declaration that...
static ConstructorUsingShadowDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
static DeclAccessPair make(NamedDecl *D, AccessSpecifier AS)
The results of name lookup within a DeclContext.
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
bool isFileContext() const
void setHasExternalVisibleStorage(bool ES=true) const
State whether this DeclContext has external storage for declarations visible in this context.
bool isTranslationUnit() const
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
DeclContext * getPrimaryContext()
getPrimaryContext - There may be many different declarations of the same entity (including forward de...
bool isFunctionOrMethod() const
DeclContext * getNonTransparentContext()
DeclID getRawValue() const
A simple visitor class that helps create declaration visitors.
Decl - This represents one declaration (or definition), e.g.
Decl * getPreviousDecl()
Retrieve the previous declaration that declares the same entity as this declaration,...
Decl * getMostRecentDecl()
Retrieve the most recent declaration that declares the same entity as this declaration (which may be ...
FriendObjectKind getFriendObjectKind() const
Determines whether this declaration is the object of a friend declaration and, if so,...
ASTContext & getASTContext() const LLVM_READONLY
void setOwningModuleID(unsigned ID)
Set the owning module ID.
void setLocalExternDecl()
Changes the namespace of this declaration to reflect that it's a function-local extern declaration.
void setTopLevelDeclInObjCContainer(bool V=true)
void markUsed(ASTContext &C)
Mark the declaration used, in the sense of odr-use.
bool isCanonicalDecl() const
Whether this particular Decl is a canonical one.
Module * getOwningModule() const
Get the module that owns this declaration (for visibility purposes).
bool isFirstDecl() const
True if this is the first declaration in its redeclaration chain.
Module * getImportedOwningModule() const
Get the imported owning module, if this decl is from an imported (non-local) module.
ObjCDeclQualifier
ObjCDeclQualifier - 'Qualifiers' written next to the return and parameter types in method declaration...
bool isFromASTFile() const
Determine whether this declaration came from an AST file (such as a precompiled header or module) rat...
bool isTemplateParameter() const
isTemplateParameter - Determines whether this declaration is a template parameter.
bool isInvalidDecl() const
unsigned FromASTFile
Whether this declaration was loaded from an AST file.
void setAccess(AccessSpecifier AS)
SourceLocation getLocation() const
IdentifierNamespace
IdentifierNamespace - The different namespaces in which declarations may appear.
@ IDNS_Ordinary
Ordinary names.
@ IDNS_Type
Types, declared with 'struct foo', typedefs, etc.
@ IDNS_Tag
Tags, declared with 'struct foo;' and referenced with 'struct foo'.
bool isTemplateParameterPack() const
isTemplateParameter - Determines whether this declaration is a template parameter pack.
void setImplicit(bool I=true)
void setReferenced(bool R=true)
void setLocation(SourceLocation L)
DeclContext * getDeclContext()
void setCachedLinkage(Linkage L) const
void setDeclContext(DeclContext *DC)
setDeclContext - Set both the semantic and lexical DeclContext to DC.
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
ModuleOwnershipKind
The kind of ownership a declaration has, for visibility purposes.
@ VisibleWhenImported
This declaration has an owning module, and is visible when that module is imported.
@ Unowned
This declaration is not owned by a module.
@ ReachableWhenImported
This declaration has an owning module, and is visible to lookups that occurs within that module.
@ ModulePrivate
This declaration has an owning module, but is only visible to lookups that occur within that module.
@ Visible
This declaration has an owning module, but is globally visible (typically because its owning module i...
void setModuleOwnershipKind(ModuleOwnershipKind MOK)
Set whether this declaration is hidden from name lookup.
bool shouldEmitInExternalSource() const
Whether the definition of the declaration should be emitted in external sources.
void setVisibleDespiteOwningModule()
Set that this declaration is globally visible, even if it came from a module that is not visible.
The name of a declaration.
Selector getObjCSelector() const
Get the Objective-C selector stored in this declaration name.
Represents a ValueDecl that came out of a declarator.
void setInnerLocStart(SourceLocation L)
void setTypeSourceInfo(TypeSourceInfo *TI)
TypeSourceInfo * getTypeSourceInfo() const
A decomposition declaration.
static DecompositionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumBindings)
Represents an empty-declaration.
static EmptyDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
An instance of this object exists for each enum constant that is defined.
static EnumConstantDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setInitExpr(Expr *E)
void setInitVal(const ASTContext &C, const llvm::APSInt &V)
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this enumeration is an instantiation of a member enumeration of a class template specialization,...
void setFixed(bool Fixed=true)
True if this is an Objective-C, C++11, or Microsoft-style enumeration with a fixed underlying type.
void setIntegerType(QualType T)
Set the underlying integer type.
void setIntegerTypeSourceInfo(TypeSourceInfo *TInfo)
Set the underlying integer type source info.
static EnumDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setScoped(bool Scoped=true)
True if this tag declaration is a scoped enumeration.
void setPromotionType(QualType T)
Set the promotion type.
EnumDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
void setScopedUsingClassTag(bool ScopedUCT=true)
If this tag declaration is a scoped enum, then this is true if the scoped enum was declared using the...
Represents a standard C++ module export declaration.
static ExportDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
This represents one expression.
Represents a member of a struct/union/class.
void setBitWidth(Expr *Width)
Set the bit-field width for this member.
static FieldDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
const VariableArrayType * CapturedVLAType
void setRParenLoc(SourceLocation L)
void setAsmString(Expr *Asm)
static FileScopeAsmDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
FriendDecl - Represents the declaration of a friend entity, which can be a function,...
static FriendDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned FriendTypeNumTPLists)
Declaration of a friend template.
static FriendTemplateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
static DefaultedOrDeletedFunctionInfo * Create(ASTContext &Context, ArrayRef< DeclAccessPair > Lookups, StringLiteral *DeletedMessage=nullptr)
Represents a function declaration or definition.
void setDescribedFunctionTemplate(FunctionTemplateDecl *Template)
FunctionTemplateDecl * getDescribedFunctionTemplate() const
Retrieves the function template that is described by this function declaration.
void setIsPureVirtual(bool P=true)
void setDefaultedOrDeletedInfo(DefaultedOrDeletedFunctionInfo *Info)
void setFriendConstraintRefersToEnclosingTemplate(bool V=true)
void setHasSkippedBody(bool Skipped=true)
static FunctionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setUsesSEHTry(bool UST)
void setIsMultiVersion(bool V=true)
Sets the multiversion state for this declaration and all of its redeclarations.
void setHasWrittenPrototype(bool P=true)
State that this function has a written prototype.
bool isExplicitlyDefaulted() const
Whether this function is explicitly defaulted.
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this function is an instantiation of a member function of a class template specialization,...
FunctionTemplateSpecializationInfo * getTemplateSpecializationInfo() const
If this function is actually a function template specialization, retrieve information about this func...
void setDefaultLoc(SourceLocation NewLoc)
void setInstantiatedFromMemberTemplate(bool Val=true)
void setInlineSpecified(bool I)
Set whether the "inline" keyword was specified for this function.
TemplatedKind
The kind of templated function a FunctionDecl can be.
@ TK_MemberSpecialization
@ TK_DependentNonTemplate
@ TK_FunctionTemplateSpecialization
@ TK_DependentFunctionTemplateSpecialization
TemplatedKind getTemplatedKind() const
What kind of templated function this is.
void setInstantiatedFromDecl(FunctionDecl *FD)
Specify that this function declaration was instantiated from a FunctionDecl FD.
bool isDeletedAsWritten() const
void setHasInheritedPrototype(bool P=true)
State that this function inherited its prototype from a previous declaration.
void setDependentTemplateSpecialization(ASTContext &Context, const UnresolvedSetImpl &Templates, const TemplateArgumentListInfo *TemplateArgs)
Specifies that this function declaration is actually a dependent function template specialization.
void setVirtualAsWritten(bool V)
State that this function is marked as virtual explicitly.
void setIsDestroyingOperatorDelete(bool IsDestroyingDelete)
void setLateTemplateParsed(bool ILT=true)
State that this templated function will be late parsed.
void setImplicitlyInline(bool I=true)
Flag that this function is implicitly inline.
void setTrivialForCall(bool IT)
void setIsTypeAwareOperatorNewOrDelete(bool IsTypeAwareOperator=true)
bool isDefaulted() const
Whether this function is defaulted.
void setIneligibleOrNotSelected(bool II)
void setConstexprKind(ConstexprSpecKind CSK)
void setDefaulted(bool D=true)
void setStorageClass(StorageClass SClass)
Sets the storage class as written in the source.
void setDeletedAsWritten(bool D=true, StringLiteral *Message=nullptr)
void setExplicitlyDefaulted(bool ED=true)
State that this function is explicitly defaulted.
void setHasImplicitReturnZero(bool IRZ)
State that falling off this function implicitly returns null/zero.
Represents a prototype with parameter type info, e.g.
ExceptionSpecificationType getExceptionSpecType() const
Get the kind of exception specification on this function.
Declaration of a template function.
static FunctionTemplateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Create an empty function template node.
Provides information about a function template specialization, which is a FunctionDecl that has been ...
static FunctionTemplateSpecializationInfo * Create(ASTContext &C, FunctionDecl *FD, FunctionTemplateDecl *Template, TemplateSpecializationKind TSK, TemplateArgumentList *TemplateArgs, const TemplateArgumentListInfo *TemplateArgsAsWritten, SourceLocation POI, MemberSpecializationInfo *MSInfo)
void Profile(llvm::FoldingSetNodeID &ID)
FunctionDecl * getFunction() const
Retrieve the declaration of the function template specialization.
FunctionType - C99 6.7.5.3 - Function Declarators.
QualType getReturnType() const
HLSLBufferDecl - Represent a cbuffer or tbuffer declaration.
static HLSLBufferDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
One of these records is kept for each identifier that is lexed.
void setOutOfDate(bool OOD)
Set whether the information for this identifier is out of date with respect to the external source.
bool isOutOfDate() const
Determine whether the information for this identifier is out of date with respect to the external sou...
iterator - Iterate over the decls of a specified declaration name.
IdentifierResolver - Keeps track of shadowed decls on enclosing scopes.
iterator begin(DeclarationName Name)
Returns an iterator over decls with the name 'Name'.
bool tryAddTopLevelDecl(NamedDecl *D, DeclarationName Name)
Try to add the given declaration to the top level scope, if it (or a redeclaration of it) hasn't alre...
iterator end()
Returns the end iterator.
static ImplicitConceptSpecializationDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID, unsigned NumTemplateArgs)
static ImplicitParamDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Describes a module import declaration, which makes the contents of the named module visible in the cu...
static ImportDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumLocations)
Create a new, deserialized module import declaration.
Represents a field injected from an anonymous union/struct into the parent scope.
static IndirectFieldDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setInherited(bool I)
Description of a constructor that was inherited from a base class.
Represents the declaration of a label.
static LabelDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Describes the capture of a variable or of this, or of a C++1y init-capture.
LambdaCaptureKind getCaptureKind() const
Determine the kind of capture.
Implicit declaration of a temporary that was materialized by a MaterializeTemporaryExpr and lifetime-...
unsigned getManglingNumber() const
static LifetimeExtendedTemporaryDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
ValueDecl * getExtendingDecl()
Represents a linkage specification.
static LinkageSpecDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents the results of name lookup.
An instance of this class represents the declaration of a property member.
static MSPropertyDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Provides information a specialization of a member of a class template, which may be a member function...
void setPointOfInstantiation(SourceLocation POI)
Set the first point of instantiation.
Provides common interface for the Decls that cannot be redeclared, but can be merged if the same decl...
Describes a module or submodule.
@ AllVisible
All of the names in this module are visible.
std::string Name
The name of this module.
bool isGlobalModule() const
Does this Module scope describe a fragment of the global module within some C++ module.
@ ModuleMapModule
This is a module that was defined by a module map and built out of header files.
bool isNamedModule() const
Does this Module is a named module of a standard named module?
Module * getTopLevelModule()
Retrieve the top-level module for this (sub)module, which may be this module.
This represents a decl that may have a name.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
bool isPlaceholderVar(const LangOptions &LangOpts) const
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
void setDeclName(DeclarationName N)
Set the name of this declaration.
Represents a C++ namespace alias.
static NamespaceAliasDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represent a C++ namespace.
static NamespaceDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
static NonTypeTemplateParmDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, bool HasTypeConstraint)
This represents '#pragma omp allocate ...' directive.
static OMPAllocateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NVars, unsigned NClauses)
Pseudo declaration for capturing expressions.
static OMPCapturedExprDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
This represents '#pragma omp declare mapper ...' directive.
static OMPDeclareMapperDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned N)
Creates deserialized declare mapper node.
This represents '#pragma omp declare reduction ...' directive.
static OMPDeclareReductionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Create deserialized declare reduction node.
This represents '#pragma omp requires...' directive.
static OMPRequiresDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned N)
Create deserialized requires node.
This represents '#pragma omp threadprivate ...' directive.
static OMPThreadPrivateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned N)
Helper data structure representing the traits in a match clause of an declare variant or metadirectiv...
Represents a field declaration created by an @defs(...).
static ObjCAtDefsFieldDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
ObjCCategoryDecl - Represents a category declaration.
void setProtocolList(ObjCProtocolDecl *const *List, unsigned Num, const SourceLocation *Locs, ASTContext &C)
setProtocolList - Set the list of protocols that this interface implements.
static ObjCCategoryDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setIvarLBraceLoc(SourceLocation Loc)
void setCategoryNameLoc(SourceLocation Loc)
void setIvarRBraceLoc(SourceLocation Loc)
bool IsClassExtension() const
ObjCCategoryImplDecl - An object of this class encapsulates a category @implementation declaration.
static ObjCCategoryImplDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
ObjCCompatibleAliasDecl - Represents alias of a class.
static ObjCCompatibleAliasDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setClassInterface(ObjCInterfaceDecl *D)
ObjCContainerDecl - Represents a container for method declarations.
void setAtStartLoc(SourceLocation Loc)
void setAtEndRange(SourceRange atEnd)
ObjCImplementationDecl - Represents a class definition - this is where method definitions are specifi...
static ObjCImplementationDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents an ObjC class declaration.
void mergeClassExtensionProtocolList(ObjCProtocolDecl *const *List, unsigned Num, ASTContext &C)
mergeClassExtensionProtocolList - Merge class extension's protocol list into the protocol list for th...
ObjCIvarDecl * lookupInstanceVariable(IdentifierInfo *IVarName, ObjCInterfaceDecl *&ClassDeclared)
static ObjCInterfaceDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID)
ObjCInterfaceDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this Objective-C class.
ObjCIvarDecl - Represents an ObjC instance variable.
void setAccessControl(AccessControl ac)
void setNextIvar(ObjCIvarDecl *ivar)
ObjCInterfaceDecl * getContainingInterface()
Return the class interface that this ivar is logically contained in; this is either the interface whe...
void setSynthesize(bool synth)
static ObjCIvarDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
ObjCMethodDecl - Represents an instance or class method declaration.
void setSynthesizedAccessorStub(bool isSynthesizedAccessorStub)
void setObjCDeclQualifier(ObjCDeclQualifier QV)
void setDefined(bool isDefined)
void setSelfDecl(ImplicitParamDecl *SD)
void setReturnTypeSourceInfo(TypeSourceInfo *TInfo)
void setHasRedeclaration(bool HRD) const
void setIsRedeclaration(bool RD)
void setCmdDecl(ImplicitParamDecl *CD)
bool hasRedeclaration() const
True if redeclared in the same interface.
void setRelatedResultType(bool RRT=true)
Note whether this method has a related result type.
void setOverriding(bool IsOver)
void setPropertyAccessor(bool isAccessor)
void setDeclImplementation(ObjCImplementationControl ic)
void setReturnType(QualType T)
static ObjCMethodDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setHasSkippedBody(bool Skipped=true)
void setInstanceMethod(bool isInst)
void setVariadic(bool isVar)
Represents one property declaration in an Objective-C interface.
static ObjCPropertyDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
ObjCPropertyImplDecl - Represents implementation declaration of a property in a class or category imp...
static ObjCPropertyImplDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents an Objective-C protocol declaration.
static ObjCProtocolDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
ObjCProtocolDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this Objective-C protocol.
Represents the declaration of an Objective-C type parameter.
static ObjCTypeParamDecl * CreateDeserialized(ASTContext &ctx, GlobalDeclID ID)
Stores a list of Objective-C type parameters for a parameterized class or a category/extension thereo...
static ObjCTypeParamList * create(ASTContext &ctx, SourceLocation lAngleLoc, ArrayRef< ObjCTypeParamDecl * > typeParams, SourceLocation rAngleLoc)
Create a new Objective-C type parameter list.
static OpenACCDeclareDecl * CreateDeserialized(ASTContext &Ctx, GlobalDeclID ID, unsigned NumClauses)
static OpenACCRoutineDecl * CreateDeserialized(ASTContext &Ctx, GlobalDeclID ID, unsigned NumClauses)
Represents a partial function definition.
static OutlinedFunctionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumParams)
Represents a parameter to a function.
static ParmVarDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setUninstantiatedDefaultArg(Expr *arg)
void setScopeInfo(unsigned scopeDepth, unsigned parameterIndex)
void setObjCMethodScopeInfo(unsigned parameterIndex)
Represents a #pragma detect_mismatch line.
static PragmaDetectMismatchDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NameValueSize)
A (possibly-)qualified type.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
const Type * getTypePtrOrNull() const
Represents a struct/union/class.
unsigned getODRHash()
Get precomputed ODRHash or add a new one.
void setAnonymousStructOrUnion(bool Anon)
void setArgPassingRestrictions(RecordArgPassingKind Kind)
void setNonTrivialToPrimitiveCopy(bool V)
void setHasNonTrivialToPrimitiveCopyCUnion(bool V)
void setHasNonTrivialToPrimitiveDestructCUnion(bool V)
void setHasFlexibleArrayMember(bool V)
void setParamDestroyedInCallee(bool V)
void setNonTrivialToPrimitiveDestroy(bool V)
void setHasObjectMember(bool val)
void setHasVolatileMember(bool val)
void setHasNonTrivialToPrimitiveDefaultInitializeCUnion(bool V)
static RecordDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID)
void setHasUninitializedExplicitInitFields(bool V)
void setNonTrivialToPrimitiveDefaultInitialize(bool V)
Declaration of a redeclarable template.
CommonBase * Common
Pointer to the common data shared by all declarations of this template.
virtual CommonBase * newCommon(ASTContext &C) const =0
Provides common interface for the Decls that can be redeclared.
decl_type * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
bool isFirstDecl() const
True if this is the first declaration in its redeclaration chain.
static DeclLink PreviousDeclLink(decl_type *D)
Represents the body of a requires-expression.
static RequiresExprBodyDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
const FunctionDecl * getKernelEntryPointDecl() const
Encodes a location in the source.
A trivial tuple used to represent a source range.
Represents a C++11 static_assert declaration.
static StaticAssertDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
StringLiteral - This represents a string literal expression, e.g.
Represents the declaration of a struct/union/class/enum.
void setTagKind(TagKind TK)
void setCompleteDefinitionRequired(bool V=true)
True if this complete decl is required to be complete for some existing use.
void demoteThisDefinitionToDeclaration()
Mark a definition as a declaration and maintain information it was a definition.
bool isThisDeclarationADefinition() const
Return true if this declaration is a completion definition of the type.
void setEmbeddedInDeclarator(bool isInDeclarator)
True if this tag declaration is "embedded" (i.e., defined or declared for the very first time) in the...
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
TagDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
void setFreeStanding(bool isFreeStanding=true)
True if this tag is free standing, e.g. "struct foo;".
void setBraceRange(SourceRange R)
void setCompleteDefinition(bool V=true)
True if this decl has its body fully specified.
A convenient class for passing around template argument information.
A template argument list.
static TemplateArgumentList * CreateCopy(ASTContext &Context, ArrayRef< TemplateArgument > Args)
Create a new template argument list that copies the given set of template arguments.
The base class of all kinds of template declarations (e.g., class, function, etc.).
NamedDecl * getTemplatedDecl() const
Get the underlying, templated declaration.
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
A template parameter object.
Stores a list of template parameters for a TemplateDecl and its derived classes.
TemplateTemplateParmDecl - Declares a template template parameter, e.g., "T" in.
static TemplateTemplateParmDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Declaration of a template type parameter.
static TemplateTypeParmDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID)
A declaration that models statements at global scope.
static TopLevelStmtDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
The top declaration context.
Represents the declaration of a typedef-name via a C++11 alias-declaration.
static TypeAliasDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setDescribedAliasTemplate(TypeAliasTemplateDecl *TAT)
Declaration of an alias template.
static TypeAliasTemplateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Create an empty alias template node.
Represents a declaration of a type.
void setLocStart(SourceLocation L)
A container of type source information.
QualType getType() const
Return the type wrapped by this type source info.
const T * castAs() const
Member-template castAs<specific type>.
AutoType * getContainedAutoType() const
Get the AutoType whose type will be deduced for a variable with an initializer of this type.
DeducedType * getContainedDeducedType() const
Get the DeducedType whose type will be deduced for a variable with an initializer of this type.
const T * getAs() const
Member-template getAs<specific type>'.
Represents the declaration of a typedef-name via the 'typedef' type specifier.
static TypedefDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Base class for declarations which introduce a typedef-name.
void setModedTypeSourceInfo(TypeSourceInfo *unmodedTSI, QualType modedTy)
void setTypeSourceInfo(TypeSourceInfo *newType)
An artificial decl, representing a global anonymous constant value which is uniquified by value withi...
void addDecl(NamedDecl *D)
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)
Represents a dependent using declaration which was marked with typename.
static UnresolvedUsingTypenameDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a dependent using declaration which was not marked with typename.
static UnresolvedUsingValueDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a C++ using-declaration.
static UsingDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents C++ using-directive.
static UsingDirectiveDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a C++ using-enum-declaration.
static UsingEnumDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a pack of using declarations that a single using-declarator pack-expanded into.
static UsingPackDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumExpansions)
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
static UsingShadowDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
void setType(QualType newType)
Represents a variable declaration or definition.
ParmVarDeclBitfields ParmVarDeclBits
static VarDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
VarDeclBitfields VarDeclBits
EvaluatedStmt * ensureEvaluatedStmt() const
Convert the initializer for this declaration to the elaborated EvaluatedStmt form,...
NonParmVarDeclBitfields NonParmVarDeclBits
@ Definition
This declaration is definitely a definition.
void setDescribedVarTemplate(VarTemplateDecl *Template)
StorageClass getStorageClass() const
Returns the storage class as written in the source.
Declaration of a variable template.
static VarTemplateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Create an empty variable template node.
static VarTemplatePartialSpecializationDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a variable template specialization, which refers to a variable template with a given set o...
static VarTemplateSpecializationDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Source location and bit offset of a declaration.
RawLocEncoding getRawLoc() const
uint64_t getBitOffset(const uint64_t DeclTypesBlockStartOffset) const
Information about a module that has been loaded by the ASTReader.
const serialization::ObjCCategoriesInfo * ObjCCategoriesMap
Array of category list location information within this module file, sorted by the definition ID.
unsigned LocalNumObjCCategoriesInMap
The number of redeclaration info entries in ObjCCategoriesMap.
llvm::BitstreamCursor DeclsCursor
DeclsCursor - This is a cursor to the start of the DECLTYPES_BLOCK block.
uint64_t GlobalBitOffset
The global bit offset (or base) of this module.
const DeclOffset * DeclOffsets
Offset of each declaration within the bitstream, indexed by the declaration ID (-1).
unsigned Generation
The generation of which this module file is a part.
uint64_t DeclsBlockStartOffset
The offset to the start of the DECLTYPES_BLOCK block.
SmallVector< uint64_t, 1 > ObjCCategories
The Objective-C category lists for categories known to this module.
void visit(llvm::function_ref< bool(ModuleFile &M)> Visitor, llvm::SmallPtrSetImpl< ModuleFile * > *ModuleFilesHit=nullptr)
Visit each of the modules.
Class that performs name lookup into a DeclContext stored in an AST file.
const unsigned int LOCAL_REDECLARATIONS
Record code for a list of local redeclarations of a declaration.
DeclCode
Record codes for each kind of declaration.
const unsigned int DECL_UPDATES
Record of updates for a declaration that was modified after being deserialized.
@ DECL_EMPTY
An EmptyDecl record.
@ DECL_CAPTURED
A CapturedDecl record.
@ DECL_CXX_BASE_SPECIFIERS
A record containing CXXBaseSpecifiers.
@ DECL_CXX_RECORD
A CXXRecordDecl record.
@ DECL_VAR_TEMPLATE_PARTIAL_SPECIALIZATION
A VarTemplatePartialSpecializationDecl record.
@ DECL_OMP_ALLOCATE
An OMPAllocateDcl record.
@ DECL_MS_PROPERTY
A MSPropertyDecl record.
@ DECL_OMP_DECLARE_MAPPER
An OMPDeclareMapperDecl record.
@ DECL_TOP_LEVEL_STMT_DECL
A TopLevelStmtDecl record.
@ DECL_REQUIRES_EXPR_BODY
A RequiresExprBodyDecl record.
@ DECL_STATIC_ASSERT
A StaticAssertDecl record.
@ DECL_INDIRECTFIELD
A IndirectFieldDecl record.
@ DECL_TEMPLATE_TEMPLATE_PARM
A TemplateTemplateParmDecl record.
@ DECL_IMPORT
An ImportDecl recording a module import.
@ DECL_UNNAMED_GLOBAL_CONSTANT
A UnnamedGlobalConstantDecl record.
@ DECL_ACCESS_SPEC
An AccessSpecDecl record.
@ DECL_OBJC_TYPE_PARAM
An ObjCTypeParamDecl record.
@ DECL_OBJC_CATEGORY_IMPL
A ObjCCategoryImplDecl record.
@ DECL_ENUM_CONSTANT
An EnumConstantDecl record.
@ DECL_PARM_VAR
A ParmVarDecl record.
@ DECL_TYPEDEF
A TypedefDecl record.
@ DECL_EXPANDED_TEMPLATE_TEMPLATE_PARM_PACK
A TemplateTemplateParmDecl record that stores an expanded template template parameter pack.
@ DECL_HLSL_BUFFER
A HLSLBufferDecl record.
@ DECL_NAMESPACE_ALIAS
A NamespaceAliasDecl record.
@ DECL_TYPEALIAS
A TypeAliasDecl record.
@ DECL_FUNCTION_TEMPLATE
A FunctionTemplateDecl record.
@ DECL_MS_GUID
A MSGuidDecl record.
@ DECL_UNRESOLVED_USING_TYPENAME
An UnresolvedUsingTypenameDecl record.
@ DECL_CLASS_TEMPLATE_SPECIALIZATION
A ClassTemplateSpecializationDecl record.
@ DECL_FILE_SCOPE_ASM
A FileScopeAsmDecl record.
@ DECL_PARTIAL_SPECIALIZATIONS
@ DECL_CXX_CONSTRUCTOR
A CXXConstructorDecl record.
@ DECL_CXX_CONVERSION
A CXXConversionDecl record.
@ DECL_FIELD
A FieldDecl record.
@ DECL_LINKAGE_SPEC
A LinkageSpecDecl record.
@ DECL_CONTEXT_TU_LOCAL_VISIBLE
A record that stores the set of declarations that are only visible to the TU.
@ DECL_NAMESPACE
A NamespaceDecl record.
@ DECL_NON_TYPE_TEMPLATE_PARM
A NonTypeTemplateParmDecl record.
@ DECL_USING_PACK
A UsingPackDecl record.
@ DECL_FUNCTION
A FunctionDecl record.
@ DECL_USING_DIRECTIVE
A UsingDirecitveDecl record.
@ DECL_RECORD
A RecordDecl record.
@ DECL_CONTEXT_LEXICAL
A record that stores the set of declarations that are lexically stored within a given DeclContext.
@ DECL_OUTLINEDFUNCTION
A OutlinedFunctionDecl record.
@ DECL_BLOCK
A BlockDecl record.
@ DECL_UNRESOLVED_USING_VALUE
An UnresolvedUsingValueDecl record.
@ DECL_TYPE_ALIAS_TEMPLATE
A TypeAliasTemplateDecl record.
@ DECL_CXX_CTOR_INITIALIZERS
A record containing CXXCtorInitializers.
@ DECL_OBJC_CATEGORY
A ObjCCategoryDecl record.
@ DECL_VAR
A VarDecl record.
@ DECL_UNRESOLVED_USING_IF_EXISTS
An UnresolvedUsingIfExistsDecl record.
@ DECL_USING
A UsingDecl record.
@ DECL_OBJC_PROTOCOL
A ObjCProtocolDecl record.
@ DECL_TEMPLATE_TYPE_PARM
A TemplateTypeParmDecl record.
@ DECL_VAR_TEMPLATE_SPECIALIZATION
A VarTemplateSpecializationDecl record.
@ DECL_OBJC_IMPLEMENTATION
A ObjCImplementationDecl record.
@ DECL_LABEL
A LabelDecl record.
@ DECL_OBJC_COMPATIBLE_ALIAS
A ObjCCompatibleAliasDecl record.
@ DECL_CONSTRUCTOR_USING_SHADOW
A ConstructorUsingShadowDecl record.
@ DECL_USING_ENUM
A UsingEnumDecl record.
@ DECL_FRIEND_TEMPLATE
A FriendTemplateDecl record.
@ DECL_PRAGMA_DETECT_MISMATCH
A PragmaDetectMismatchDecl record.
@ DECL_EXPANDED_NON_TYPE_TEMPLATE_PARM_PACK
A NonTypeTemplateParmDecl record that stores an expanded non-type template parameter pack.
@ DECL_OBJC_AT_DEFS_FIELD
A ObjCAtDefsFieldDecl record.
@ DECL_IMPLICIT_PARAM
An ImplicitParamDecl record.
@ DECL_FRIEND
A FriendDecl record.
@ DECL_CXX_METHOD
A CXXMethodDecl record.
@ DECL_EXPORT
An ExportDecl record.
@ DECL_BINDING
A BindingDecl record.
@ DECL_PRAGMA_COMMENT
A PragmaCommentDecl record.
@ DECL_ENUM
An EnumDecl record.
@ DECL_CONTEXT_MODULE_LOCAL_VISIBLE
A record containing the set of declarations that are only visible from DeclContext in the same module...
@ DECL_DECOMPOSITION
A DecompositionDecl record.
@ DECL_OMP_DECLARE_REDUCTION
An OMPDeclareReductionDecl record.
@ DECL_OMP_THREADPRIVATE
An OMPThreadPrivateDecl record.
@ DECL_OBJC_METHOD
A ObjCMethodDecl record.
@ DECL_CXX_DESTRUCTOR
A CXXDestructorDecl record.
@ DECL_OMP_CAPTUREDEXPR
An OMPCapturedExprDecl record.
@ DECL_CLASS_TEMPLATE
A ClassTemplateDecl record.
@ DECL_USING_SHADOW
A UsingShadowDecl record.
@ DECL_CONCEPT
A ConceptDecl record.
@ DECL_CXX_DEDUCTION_GUIDE
A CXXDeductionGuideDecl record.
@ DECL_OMP_REQUIRES
An OMPRequiresDecl record.
@ DECL_OBJC_IVAR
A ObjCIvarDecl record.
@ DECL_OBJC_PROPERTY
A ObjCPropertyDecl record.
@ DECL_TEMPLATE_PARAM_OBJECT
A TemplateParamObjectDecl record.
@ DECL_OBJC_INTERFACE
A ObjCInterfaceDecl record.
@ DECL_VAR_TEMPLATE
A VarTemplateDecl record.
@ DECL_LIFETIME_EXTENDED_TEMPORARY
An LifetimeExtendedTemporaryDecl record.
@ DECL_CLASS_TEMPLATE_PARTIAL_SPECIALIZATION
A ClassTemplatePartialSpecializationDecl record.
@ DECL_IMPLICIT_CONCEPT_SPECIALIZATION
An ImplicitConceptSpecializationDecl record.
@ DECL_CONTEXT_VISIBLE
A record that stores the set of declarations that are visible from a given DeclContext.
@ DECL_OBJC_PROPERTY_IMPL
A ObjCPropertyImplDecl record.
Defines the Linkage enumeration and various utility functions.
const internal::VariadicAllOfMatcher< Decl > decl
Matches declarations.
ComparisonCategoryResult Compare(const T &X, const T &Y)
Helper to compare two comparable types.
uint64_t TypeID
An ID number that refers to a type in an AST file.
uint32_t SubmoduleID
An ID number that refers to a submodule in a module file.
bool needsAnonymousDeclarationNumber(const NamedDecl *D)
Determine whether the given declaration needs an anonymous declaration number.
void numberAnonymousDeclsWithin(const DeclContext *DC, Fn Visit)
Visit each declaration within DC that needs an anonymous declaration number and call Visit with the d...
bool isPartOfPerModuleInitializer(const Decl *D)
Determine whether the given declaration will be included in the per-module initializer if it needs to...
The JSON file list parser is used to communicate input to InstallAPI.
SelectorLocationsKind
Whether all locations of the selector identifiers are in a "standard" position.
bool isUnresolvedExceptionSpec(ExceptionSpecificationType ESpecType)
ConstexprSpecKind
Define the kind of constexpr specifier.
LinkageSpecLanguageIDs
Represents the language in a linkage specification.
LazyOffsetPtr< Stmt, uint64_t, &ExternalASTSource::GetExternalDeclStmt > LazyDeclStmtPtr
A lazy pointer to a statement.
LambdaCaptureKind
The different capture forms in a lambda introducer.
@ LCK_ByCopy
Capturing by copy (a.k.a., by value)
@ LCK_ByRef
Capturing by reference.
@ LCK_VLAType
Capturing variable-length array type.
@ LCK_StarThis
Capturing the *this object by copy.
@ LCK_This
Capturing the *this object by reference.
AccessSpecifier
A C++ access specifier (public, private, protected), plus the special value "none" which means differ...
OMPDeclareReductionInitKind
StorageClass
Storage classes.
Linkage
Describes the different kinds of linkage (C++ [basic.link], C99 6.2.2) that an entity may have.
@ None
No linkage, which means that the entity is unique and can only be referred to from within its scope.
@ Result
The result type of a method or function.
@ Template
We are parsing a template declaration.
TagTypeKind
The kind of a tag type.
@ VarTemplate
The name was classified as a variable template name.
ObjCImplementationControl
RecordArgPassingKind
Enum that represents the different ways arguments are passed to and returned from function calls.
static bool isUndeducedReturnType(QualType T)
bool operator!=(CanQual< T > x, CanQual< U > y)
TemplateNameKind
Specifies the kind of template name that an identifier refers to.
for(const auto &A :T->param_types())
const FunctionProtoType * T
DeductionCandidate
Only used by CXXDeductionGuideDecl.
bool shouldSkipCheckingODR(const Decl *D)
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...
@ Interface
The "__interface" keyword introduces the elaborated-type-specifier.
@ Class
The "class" keyword introduces the elaborated-type-specifier.
@ Other
Other implicit parameter.
Structure used to store a statement, the constant value to which it was evaluated (if any),...
bool HasConstantDestruction
Whether this variable is known to have constant destruction.
bool WasEvaluated
Whether this statement was already evaluated.
bool CheckedForSideEffects
bool HasConstantInitialization
Whether this variable is known to have constant initialization.
Provides information about an explicit instantiation of a variable or class template.
SourceLocation ExternKeywordLoc
The location of the extern keyword.
Data that is common to all of the declarations of a given function template.
llvm::FoldingSetVector< FunctionTemplateSpecializationInfo > Specializations
The function template specializations for this function template, including explicit specializations ...
A struct with extended info about a syntactic name qualifier, to be used for the case of out-of-line ...
Helper class that saves the current stream position and then restores it when destroyed.
llvm::DenseSet< std::tuple< Decl *, Decl *, int > > NonEquivalentDeclSet
Store declaration pairs already found to be non-equivalent.
static constexpr UnsignedOrNone fromInternalRepresentation(unsigned Rep)
uint64_t ModuleLocalOffset
Describes the categories of an Objective-C class.