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"
81class RedeclarableResult {
87 RedeclarableResult(Decl *MergeWith, GlobalDeclID FirstID,
bool IsKeyDecl)
88 : MergeWith(MergeWith), FirstID(FirstID), IsKeyDecl(IsKeyDecl) {}
91 GlobalDeclID getFirstID()
const {
return FirstID; }
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;
177 SourceLocation readSourceLocation() {
return Record.readSourceLocation(); }
179 SourceRange readSourceRange() {
return Record.readSourceRange(); }
181 TypeSourceInfo *readTypeSourceInfo() {
return Record.readTypeSourceInfo(); }
183 GlobalDeclID readDeclID() {
return Record.readDeclID(); }
185 std::string readString() {
return Record.readString(); }
187 Decl *readDecl() {
return Record.readDecl(); }
189 template <
typename T> T *readDeclAs() {
return Record.readDeclAs<T>(); }
192 if (Record.getIdx() == Record.size())
195 return Record.getGlobalSubmoduleID(Record.readInt());
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);
276 : Reader(Reader), MergeImpl(Reader), Record(Record), Loc(Loc),
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;
421 template <
typename T>
424 template <
typename T>
428 RedeclarableResult &Redecl);
464template <
typename DeclT>
class MergedRedeclIterator {
465 DeclT *Start =
nullptr;
466 DeclT *Canonical =
nullptr;
467 DeclT *Current =
nullptr;
470 MergedRedeclIterator() =
default;
471 MergedRedeclIterator(DeclT *Start) : Start(Start), Current(Start) {}
475 MergedRedeclIterator &operator++() {
476 if (Current->isFirstDecl()) {
478 Current = Current->getMostRecentDecl();
480 Current = Current->getPreviousDecl();
486 if (Current == Start || Current == Canonical)
491 friend bool operator!=(
const MergedRedeclIterator &A,
492 const MergedRedeclIterator &B) {
493 return A.Current != B.Current;
499template <
typename DeclT>
500static llvm::iterator_range<MergedRedeclIterator<DeclT>>
502 return llvm::make_range(MergedRedeclIterator<DeclT>(D),
503 MergedRedeclIterator<DeclT>());
506uint64_t ASTDeclReader::GetCurrentCursorOffset() {
507 return Loc.F->DeclsCursor.GetCurrentBitNo() + Loc.F->GlobalBitOffset;
511 if (Record.readInt()) {
512 Reader.DefinitionSource[FD] =
514 Reader.getContext().getLangOpts().BuildingPCHWithObjectFile;
516 if (
auto *CD = dyn_cast<CXXConstructorDecl>(FD)) {
517 CD->setNumCtorInitializers(Record.readInt());
518 if (CD->getNumCtorInitializers())
519 CD->CtorInitializers = ReadGlobalOffset();
522 Reader.PendingBodies[FD] = GetCurrentCursorOffset();
525 Reader.ThisDeclarationWasADefinitionSet.insert(FD);
534 IsDeclMarkedUsed =
false;
536 if (
auto *DD = dyn_cast<DeclaratorDecl>(D)) {
537 if (
auto *TInfo = DD->getTypeSourceInfo())
538 Record.readTypeLoc(TInfo->getTypeLoc());
541 if (
auto *TD = dyn_cast<TypeDecl>(D)) {
544 assert(DeferredTypeID == 0 &&
545 "Deferred type not used for TagDecls and Typedefs");
547 TD->setTypeForDecl(Reader.GetType(DeferredTypeID).getTypePtrOrNull());
551 if (NamedDeclForTagDecl.isValid())
554 }
else if (
auto *ID = dyn_cast<ObjCInterfaceDecl>(D)) {
556 ID->TypeForDecl = Reader.GetType(DeferredTypeID).getTypePtrOrNull();
557 }
else if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
559 if (Record.readInt())
561 }
else if (
auto *VD = dyn_cast<VarDecl>(D)) {
563 }
else if (
auto *FD = dyn_cast<FieldDecl>(D)) {
564 if (FD->hasInClassInitializer() && Record.readInt()) {
565 FD->setLazyInClassInitializer(
LazyDeclStmtPtr(GetCurrentCursorOffset()));
572 auto ModuleOwnership =
576 IsDeclMarkedUsed |= D->Used;
579 bool HasStandaloneLexicalDC = DeclBits.
getNextBit();
593 GlobalDeclID SemaDCIDForTemplateParmDecl = readDeclID();
596 if (LexicalDCIDForTemplateParmDecl.
isInvalid())
597 LexicalDCIDForTemplateParmDecl = SemaDCIDForTemplateParmDecl;
598 Reader.addPendingDeclContextInfo(D,
599 SemaDCIDForTemplateParmDecl,
600 LexicalDCIDForTemplateParmDecl);
603 auto *SemaDC = readDeclAs<DeclContext>();
605 HasStandaloneLexicalDC ? readDeclAs<DeclContext>() :
nullptr;
611 if (
auto *RD = dyn_cast<CXXRecordDecl>(SemaDC))
612 MergedSemaDC = getOrFakePrimaryClassDefinition(Reader, RD);
614 MergedSemaDC = Reader.MergedDeclContexts.
lookup(SemaDC);
617 D->setDeclContextsImpl(MergedSemaDC ? MergedSemaDC : SemaDC, LexicalDC,
618 Reader.getContext());
624 Record.readAttributes(Attrs);
627 D->setAttrsImpl(Attrs, Reader.getContext());
635 switch (ModuleOwnership) {
654 }
else if (Reader.getContext().getLangOpts().ModulesLocalVisibility) {
662 Reader.HiddenNamesMap[Owner].push_back(D);
664 }
else if (ModulePrivate) {
673 std::string Arg = readString();
674 memcpy(D->getTrailingObjects(), Arg.data(), Arg.size());
675 D->getTrailingObjects()[Arg.size()] =
'\0';
681 std::string Name = readString();
682 memcpy(D->getTrailingObjects(), Name.data(), Name.size());
683 D->getTrailingObjects()[Name.size()] =
'\0';
685 D->ValueStart = Name.size() + 1;
686 std::string
Value = readString();
687 memcpy(D->getTrailingObjects() + D->ValueStart,
Value.data(),
Value.size());
688 D->getTrailingObjects()[D->ValueStart +
Value.size()] =
'\0';
692 llvm_unreachable(
"Translation units are not serialized");
698 AnonymousDeclNumber = Record.readInt();
706 DeferredTypeID = Record.getGlobalTypeID(Record.readInt());
713 if (Record.readInt()) {
714 QualType modedT = Record.readType();
733 if (
auto *
Template = readDeclAs<TypeAliasTemplateDecl>())
759 auto *Info =
new (Reader.getContext()) TagDecl::ExtInfo();
760 Record.readQualifierInfo(*Info);
761 TD->TypedefNameDeclOrQualifier = Info;
765 NamedDeclForTagDecl = readDeclID();
766 TypedefNameForLinkage = Record.readIdentifier();
769 llvm_unreachable(
"unexpected tag info kind");
786 ED->setNumPositiveBits(EnumDeclBits.
getNextBits(8));
787 ED->setNumNegativeBits(EnumDeclBits.
getNextBits(8));
792 ED->setHasODRHash(
true);
793 ED->ODRHash = Record.readInt();
803 if (!D->isFromASTFile() && D->isCompleteDefinition()) {
810 Reader.MergedDeclContexts.insert(std::make_pair(ED, OldDef));
812 Reader.mergeDefinitionVisibility(OldDef, ED);
817 Reader.PendingEnumOdrMergeFailures[OldDef].push_back(ED);
823 if (
auto *InstED = readDeclAs<EnumDecl>()) {
826 ED->setInstantiationOfMemberEnum(Reader.getContext(), InstED, TSK);
855 RD->setODRHash(Record.readInt());
861 RecordDecl *&OldDef = Reader.RecordDefinitions[Canon];
866 if (!D->isFromASTFile() && D->isCompleteDefinition()) {
873 Reader.MergedDeclContexts.insert(std::make_pair(RD, OldDef));
875 Reader.mergeDefinitionVisibility(OldDef, RD);
877 Reader.PendingRecordOdrMergeFailures[OldDef].push_back(RD);
890 DeferredTypeID = Record.getGlobalTypeID(Record.readInt());
892 VD->
setType(Record.readType());
897 if (Record.readInt())
899 ECD->
setInitVal(Reader.getContext(), Record.readAPSInt());
906 if (Record.readInt()) {
907 auto *Info =
new (Reader.getContext()) DeclaratorDecl::ExtInfo();
908 Record.readQualifierInfo(*Info);
914 QualType TSIType = Record.readType();
916 TSIType.
isNull() ?
nullptr
917 : Reader.getContext().CreateTypeSourceInfo(TSIType));
932 auto *
Template = readDeclAs<FunctionTemplateDecl>();
938 auto *InstFD = readDeclAs<FunctionDecl>();
941 FD->setInstantiationOfMemberFunction(Reader.getContext(), InstFD, TSK);
946 auto *
Template = readDeclAs<FunctionTemplateDecl>();
951 Record.readTemplateArgumentList(TemplArgs,
true);
955 bool HasTemplateArgumentsAsWritten = Record.readBool();
956 if (HasTemplateArgumentsAsWritten)
957 Record.readTemplateArgumentListInfo(TemplArgsWritten);
966 if (Record.readInt()) {
967 auto *FD = readDeclAs<FunctionDecl>();
978 HasTemplateArgumentsAsWritten ? &TemplArgsWritten :
nullptr, POI,
980 FD->TemplateOrSpecialization = FTInfo;
985 auto *CanonTemplate = readDeclAs<FunctionTemplateDecl>();
991 llvm::FoldingSetNodeID ID;
993 void *InsertPos =
nullptr;
1008 unsigned NumCandidates = Record.readInt();
1009 while (NumCandidates--)
1010 Candidates.
addDecl(readDeclAs<NamedDecl>());
1014 bool HasTemplateArgumentsAsWritten = Record.readBool();
1015 if (HasTemplateArgumentsAsWritten)
1016 Record.readTemplateArgumentListInfo(TemplArgsWritten);
1019 Reader.getContext(), Candidates,
1020 HasTemplateArgumentsAsWritten ? &TemplArgsWritten :
nullptr);
1039 Reader.PendingDeducedFunctionTypes.push_back({FD, DeferredTypeID});
1041 FD->
setType(Reader.GetType(DeferredTypeID));
1045 FD->DNLoc = Record.readDeclarationNameLoc(FD->
getDeclName());
1061 const bool Pure = FunctionDeclBits.
getNextBit();
1082 FD->EndRangeLoc = readSourceLocation();
1086 FD->ODRHash = Record.readInt();
1087 FD->setHasODRHash(
true);
1093 if (
auto Info = Record.readInt()) {
1094 bool HasMessage = Info & 2;
1101 unsigned NumLookups = Record.readInt();
1103 for (
unsigned I = 0; I != NumLookups; ++I) {
1111 Reader.getContext(), Lookups, FPFeatures, DeletedMessage));
1116 MergeImpl.mergeRedeclarable(FD, Existing, Redecl);
1122 auto merge = [
this, &Redecl, FD](
auto &&F) {
1123 auto *Existing = cast_or_null<FunctionDecl>(Redecl.getKnownMergeTarget());
1124 RedeclarableResult NewRedecl(Existing ? F(Existing) :
nullptr,
1125 Redecl.getFirstID(), Redecl.isKeyDecl());
1143 unsigned NumParams = Record.readInt();
1145 Params.reserve(NumParams);
1146 for (
unsigned I = 0; I != NumParams; ++I)
1147 Params.push_back(readDeclAs<ParmVarDecl>());
1148 FD->setParams(Reader.getContext(), Params);
1153 if (FD->
hasAttr<SYCLKernelEntryPointAttr>()) {
1154 auto *SKEPAttr = FD->
getAttr<SYCLKernelEntryPointAttr>();
1156 const SYCLKernelInfo *SKI =
C.findSYCLKernelInfo(SKEPAttr->getKernelName());
1159 Reader.Diag(FD->
getLocation(), diag::err_sycl_kernel_name_conflict)
1162 diag::note_previous_declaration);
1163 SKEPAttr->setInvalidAttr();
1166 C.registerSYCLEntryPointFunction(FD);
1173 if (Record.readInt()) {
1176 Reader.PendingBodies[MD] = GetCurrentCursorOffset();
1179 MD->
setCmdDecl(readDeclAs<ImplicitParamDecl>());
1191 Reader.getContext().setObjCMethodRedeclaration(MD,
1192 readDeclAs<ObjCMethodDecl>());
1200 MD->DeclEndLoc = readSourceLocation();
1201 unsigned NumParams = Record.readInt();
1203 Params.reserve(NumParams);
1204 for (
unsigned I = 0; I != NumParams; ++I)
1205 Params.push_back(readDeclAs<ParmVarDecl>());
1208 unsigned NumStoredSelLocs = Record.readInt();
1210 SelLocs.reserve(NumStoredSelLocs);
1211 for (
unsigned i = 0; i != NumStoredSelLocs; ++i)
1212 SelLocs.push_back(readSourceLocation());
1214 MD->setParamsAndSelLocs(Reader.getContext(), Params, SelLocs);
1220 D->Variance = Record.readInt();
1221 D->Index = Record.readInt();
1222 D->VarianceLoc = readSourceLocation();
1223 D->ColonLoc = readSourceLocation();
1233 unsigned numParams = Record.readInt();
1238 typeParams.reserve(numParams);
1239 for (
unsigned i = 0; i != numParams; ++i) {
1240 auto *typeParam = readDeclAs<ObjCTypeParamDecl>();
1244 typeParams.push_back(typeParam);
1251 typeParams, rAngleLoc);
1254void ASTDeclReader::ReadObjCDefinitionData(
1255 struct ObjCInterfaceDecl::DefinitionData &
Data) {
1257 Data.SuperClassTInfo = readTypeSourceInfo();
1259 Data.EndLoc = readSourceLocation();
1260 Data.HasDesignatedInitializers =
Record.readInt();
1262 Data.HasODRHash =
true;
1265 unsigned NumProtocols =
Record.readInt();
1267 Protocols.reserve(NumProtocols);
1268 for (
unsigned I = 0; I != NumProtocols; ++I)
1269 Protocols.push_back(readDeclAs<ObjCProtocolDecl>());
1271 ProtoLocs.reserve(NumProtocols);
1272 for (
unsigned I = 0; I != NumProtocols; ++I)
1273 ProtoLocs.push_back(readSourceLocation());
1274 Data.ReferencedProtocols.set(Protocols.data(), NumProtocols, ProtoLocs.data(),
1278 NumProtocols =
Record.readInt();
1280 Protocols.reserve(NumProtocols);
1281 for (
unsigned I = 0; I != NumProtocols; ++I)
1282 Protocols.push_back(readDeclAs<ObjCProtocolDecl>());
1283 Data.AllReferencedProtocols.set(Protocols.data(), NumProtocols,
1289 struct ObjCInterfaceDecl::DefinitionData &DD = D->data();
1290 if (DD.Definition == NewDD.Definition)
1293 Reader.MergedDeclContexts.insert(
1294 std::make_pair(NewDD.Definition, DD.Definition));
1295 Reader.mergeDefinitionVisibility(DD.Definition, NewDD.Definition);
1298 Reader.PendingObjCInterfaceOdrMergeFailures[DD.Definition].push_back(
1299 {NewDD.Definition, &NewDD});
1305 DeferredTypeID = Record.getGlobalTypeID(Record.readInt());
1309 if (Record.readInt()) {
1311 ID->allocateDefinitionData();
1313 ReadObjCDefinitionData(ID->data());
1315 if (Canon->Data.getPointer()) {
1318 MergeImpl.MergeDefinitionData(Canon, std::move(ID->data()));
1319 ID->Data = Canon->Data;
1323 ID->getCanonicalDecl()->Data = ID->Data;
1326 ID->setIvarList(
nullptr);
1330 Reader.PendingDefinitions.insert(ID);
1333 Reader.ObjCClassesLoaded.push_back(ID);
1335 ID->Data = ID->getCanonicalDecl()->Data;
1344 bool synth = Record.readInt();
1359 if (PrevIvar && PrevIvar != IVD) {
1360 auto *ParentExt = dyn_cast<ObjCCategoryDecl>(IVD->
getDeclContext());
1361 auto *PrevParentExt =
1363 if (ParentExt && PrevParentExt) {
1367 .PendingObjCExtensionIvarRedeclarations[std::make_pair(ParentExt,
1369 .push_back(std::make_pair(IVD, PrevIvar));
1370 }
else if (ParentExt || PrevParentExt) {
1374 Reader.Diag(IVD->
getLocation(), diag::err_duplicate_ivar_declaration)
1376 Reader.Diag(PrevIvar->
getLocation(), diag::note_previous_definition);
1381void ASTDeclReader::ReadObjCDefinitionData(
1382 struct ObjCProtocolDecl::DefinitionData &
Data) {
1383 unsigned NumProtoRefs =
Record.readInt();
1385 ProtoRefs.reserve(NumProtoRefs);
1386 for (
unsigned I = 0; I != NumProtoRefs; ++I)
1387 ProtoRefs.push_back(readDeclAs<ObjCProtocolDecl>());
1389 ProtoLocs.reserve(NumProtoRefs);
1390 for (
unsigned I = 0; I != NumProtoRefs; ++I)
1391 ProtoLocs.push_back(readSourceLocation());
1392 Data.ReferencedProtocols.set(ProtoRefs.data(), NumProtoRefs,
1395 Data.HasODRHash =
true;
1400 struct ObjCProtocolDecl::DefinitionData &DD = D->data();
1401 if (DD.Definition == NewDD.Definition)
1404 Reader.MergedDeclContexts.insert(
1405 std::make_pair(NewDD.Definition, DD.Definition));
1406 Reader.mergeDefinitionVisibility(DD.Definition, NewDD.Definition);
1409 Reader.PendingObjCProtocolOdrMergeFailures[DD.Definition].push_back(
1410 {NewDD.Definition, &NewDD});
1418 if (Record.readInt()) {
1420 PD->allocateDefinitionData();
1422 ReadObjCDefinitionData(PD->data());
1425 if (Canon->Data.getPointer()) {
1428 MergeImpl.MergeDefinitionData(Canon, std::move(PD->data()));
1429 PD->Data = Canon->Data;
1436 Reader.PendingDefinitions.insert(PD);
1455 Reader.CategoriesDeserialized.insert(CD);
1457 CD->ClassInterface = readDeclAs<ObjCInterfaceDecl>();
1459 unsigned NumProtoRefs = Record.readInt();
1461 ProtoRefs.reserve(NumProtoRefs);
1462 for (
unsigned I = 0; I != NumProtoRefs; ++I)
1463 ProtoRefs.push_back(readDeclAs<ObjCProtocolDecl>());
1465 ProtoLocs.reserve(NumProtoRefs);
1466 for (
unsigned I = 0; I != NumProtoRefs; ++I)
1467 ProtoLocs.push_back(readSourceLocation());
1469 Reader.getContext());
1475 Reader.getContext());
1513 D->CategoryNameLoc = readSourceLocation();
1519 D->SuperLoc = readSourceLocation();
1524 D->NumIvarInitializers = Record.readInt();
1525 if (D->NumIvarInitializers)
1526 D->IvarInitializers = ReadGlobalOffset();
1533 D->PropertyIvarDecl = readDeclAs<ObjCIvarDecl>();
1534 D->IvarLoc = readSourceLocation();
1543 FD->Mutable = Record.readInt();
1545 unsigned Bits = Record.readInt();
1546 FD->StorageKind = Bits >> 1;
1547 if (FD->StorageKind == FieldDecl::ISK_CapturedVLAType)
1555 if (
auto *Tmpl = readDeclAs<FieldDecl>())
1556 Reader.getContext().setInstantiatedFromUnnamedFieldDecl(FD, Tmpl);
1563 PD->GetterId = Record.readIdentifier();
1564 PD->SetterId = Record.readIdentifier();
1569 D->PartVal.
Part1 = Record.readInt();
1570 D->PartVal.
Part2 = Record.readInt();
1571 D->PartVal.
Part3 = Record.readInt();
1573 C = Record.readInt();
1576 if (
MSGuidDecl *Existing = Reader.getContext().MSGuidDecls.GetOrInsertNode(D))
1583 D->Value = Record.readAPValue();
1587 Reader.getContext().UnnamedGlobalConstantDecls.GetOrInsertNode(D))
1593 D->Value = Record.readAPValue();
1598 Reader.getContext().TemplateParamObjectDecls.GetOrInsertNode(D))
1605 FD->ChainingSize = Record.readInt();
1606 assert(FD->ChainingSize >= 2 &&
"Anonymous chaining must be >= 2");
1607 FD->Chaining =
new (Reader.getContext())
NamedDecl*[FD->ChainingSize];
1609 for (
unsigned I = 0; I != FD->ChainingSize; ++I)
1610 FD->Chaining[I] = readDeclAs<NamedDecl>();
1621 bool DefGeneratedInModule = VarDeclBits.
getNextBit();
1626 bool HasDeducedType =
false;
1654 Reader.PendingDeducedVarTypes.push_back({VD, DeferredTypeID});
1656 VD->
setType(Reader.GetType(DeferredTypeID));
1666 if (DefGeneratedInModule) {
1667 Reader.DefinitionSource[VD] =
1669 Reader.getContext().getLangOpts().BuildingPCHWithObjectFile;
1672 if (VD->
hasAttr<BlocksAttr>()) {
1673 Expr *CopyExpr = Record.readExpr();
1675 Reader.getContext().setBlockVarCopyInit(VD, CopyExpr, Record.readInt());
1679 VarNotTemplate = 0,
VarTemplate, StaticDataMemberSpecialization
1681 switch ((VarKind)Record.readInt()) {
1682 case VarNotTemplate:
1693 case StaticDataMemberSpecialization: {
1694 auto *Tmpl = readDeclAs<VarDecl>();
1697 Reader.getContext().setInstantiatedFromStaticDataMember(VD, Tmpl, TSK,POI);
1707 if (uint64_t Val = Record.readInt()) {
1717 Reader.getContext().addDestruction(&Eval->
Evaluated);
1723 Eval->
Value = GetCurrentCursorOffset();
1734 unsigned scopeIndex = Record.readInt();
1736 unsigned isObjCMethodParam = ParmVarDeclBits.
getNextBit();
1737 unsigned scopeDepth = ParmVarDeclBits.
getNextBits(7);
1738 unsigned declQualifier = ParmVarDeclBits.
getNextBits(7);
1739 if (isObjCMethodParam) {
1740 assert(scopeDepth == 0);
1753 PD->ExplicitObjectParameterIntroducerLoc = Record.readSourceLocation();
1761 auto **BDs = DD->getTrailingObjects();
1762 for (
unsigned I = 0; I != DD->NumBindings; ++I) {
1763 BDs[I] = readDeclAs<BindingDecl>();
1764 BDs[I]->setDecomposedDecl(DD);
1770 BD->Binding = Record.readExpr();
1781 D->Statement = Record.readStmt();
1786 BD->
setBody(cast_or_null<CompoundStmt>(Record.readStmt()));
1788 unsigned NumParams = Record.readInt();
1790 Params.reserve(NumParams);
1791 for (
unsigned I = 0; I != NumParams; ++I)
1792 Params.push_back(readDeclAs<ParmVarDecl>());
1801 bool capturesCXXThis = Record.readInt();
1802 unsigned numCaptures = Record.readInt();
1804 captures.reserve(numCaptures);
1805 for (
unsigned i = 0; i != numCaptures; ++i) {
1806 auto *
decl = readDeclAs<VarDecl>();
1807 unsigned flags = Record.readInt();
1808 bool byRef = (flags & 1);
1809 bool nested = (flags & 2);
1810 Expr *copyExpr = ((flags & 4) ? Record.readExpr() :
nullptr);
1814 BD->
setCaptures(Reader.getContext(), captures, capturesCXXThis);
1820 for (
unsigned I = 0; I < D->NumParams; ++I)
1821 D->
setParam(I, readDeclAs<ImplicitParamDecl>());
1823 D->
setBody(cast_or_null<Stmt>(Record.readStmt()));
1828 unsigned ContextParamPos = Record.readInt();
1831 for (
unsigned I = 0; I < CD->NumParams; ++I) {
1832 if (I != ContextParamPos)
1833 CD->
setParam(I, readDeclAs<ImplicitParamDecl>());
1848 D->RBraceLoc = readSourceLocation();
1863 D->LocStart = readSourceLocation();
1864 D->RBraceLoc = readSourceLocation();
1871 if (Redecl.getFirstID() == ThisDeclID)
1872 AnonNamespace = readDeclID();
1876 if (AnonNamespace.
isValid()) {
1881 if (!Record.isModule())
1890 D->IsCBuffer = Record.readBool();
1891 D->KwLoc = readSourceLocation();
1892 D->LBraceLoc = readSourceLocation();
1893 D->RBraceLoc = readSourceLocation();
1899 D->NamespaceLoc = readSourceLocation();
1900 D->IdentLoc = readSourceLocation();
1901 D->QualifierLoc = Record.readNestedNameSpecifierLoc();
1902 D->Namespace = readDeclAs<NamespaceBaseDecl>();
1909 D->QualifierLoc = Record.readNestedNameSpecifierLoc();
1910 D->DNLoc = Record.readDeclarationNameLoc(D->
getDeclName());
1911 D->FirstUsingShadow.setPointer(readDeclAs<UsingShadowDecl>());
1913 if (
auto *Pattern = readDeclAs<NamedDecl>())
1914 Reader.getContext().setInstantiatedFromUsingDecl(D, Pattern);
1923 D->FirstUsingShadow.setPointer(readDeclAs<UsingShadowDecl>());
1924 if (
auto *Pattern = readDeclAs<UsingEnumDecl>())
1925 Reader.getContext().setInstantiatedFromUsingEnumDecl(D, Pattern);
1931 D->InstantiatedFrom = readDeclAs<NamedDecl>();
1932 auto **Expansions = D->getTrailingObjects();
1933 for (
unsigned I = 0; I != D->NumExpansions; ++I)
1934 Expansions[I] = readDeclAs<NamedDecl>();
1941 D->Underlying = readDeclAs<NamedDecl>();
1943 D->UsingOrNextShadow = readDeclAs<NamedDecl>();
1944 auto *Pattern = readDeclAs<UsingShadowDecl>();
1946 Reader.getContext().setInstantiatedFromUsingShadowDecl(D, Pattern);
1953 D->NominatedBaseClassShadowDecl = readDeclAs<ConstructorUsingShadowDecl>();
1954 D->ConstructedBaseClassShadowDecl = readDeclAs<ConstructorUsingShadowDecl>();
1955 D->IsVirtual = Record.readInt();
1960 D->UsingLoc = readSourceLocation();
1961 D->NamespaceLoc = readSourceLocation();
1962 D->QualifierLoc = Record.readNestedNameSpecifierLoc();
1963 D->NominatedNamespace = readDeclAs<NamedDecl>();
1964 D->CommonAncestor = readDeclAs<DeclContext>();
1970 D->QualifierLoc = Record.readNestedNameSpecifierLoc();
1971 D->DNLoc = Record.readDeclarationNameLoc(D->
getDeclName());
1972 D->EllipsisLoc = readSourceLocation();
1979 D->TypenameLocation = readSourceLocation();
1980 D->QualifierLoc = Record.readNestedNameSpecifierLoc();
1981 D->EllipsisLoc = readSourceLocation();
1990void ASTDeclReader::ReadCXXDefinitionData(
1992 Decl *LambdaContext,
unsigned IndexInLambdaContext) {
1996#define FIELD(Name, Width, Merge) \
1997 if (!CXXRecordDeclBits.canGetNextNBits(Width)) \
1998 CXXRecordDeclBits.updateValue(Record.readInt()); \
1999 Data.Name = CXXRecordDeclBits.getNextBits(Width);
2001#include "clang/AST/CXXRecordDeclDefinitionBits.def"
2006 Data.HasODRHash =
true;
2009 Reader.DefinitionSource[D] =
2010 Loc.F->
Kind == ModuleKind::MK_MainFile ||
2015 Data.ComputedVisibleConversions =
Record.readInt();
2016 if (
Data.ComputedVisibleConversions)
2017 Record.readUnresolvedSet(
Data.VisibleConversions);
2018 assert(
Data.Definition &&
"Data.Definition should be already set!");
2020 if (!
Data.IsLambda) {
2021 assert(!LambdaContext && !IndexInLambdaContext &&
2022 "given lambda context for non-lambda");
2026 Data.Bases = ReadGlobalOffset();
2030 Data.VBases = ReadGlobalOffset();
2034 using Capture = LambdaCapture;
2036 auto &Lambda =
static_cast<CXXRecordDecl::LambdaDefinitionData &
>(
Data);
2038 BitsUnpacker LambdaBits(Record.readInt());
2039 Lambda.DependencyKind = LambdaBits.getNextBits(2);
2040 Lambda.IsGenericLambda = LambdaBits.getNextBit();
2041 Lambda.CaptureDefault = LambdaBits.getNextBits(2);
2042 Lambda.NumCaptures = LambdaBits.getNextBits(15);
2043 Lambda.HasKnownInternalLinkage = LambdaBits.getNextBit();
2045 Lambda.NumExplicitCaptures = Record.readInt();
2046 Lambda.ManglingNumber = Record.readInt();
2047 if (
unsigned DeviceManglingNumber = Record.readInt())
2048 Reader.getContext().DeviceLambdaManglingNumbers[D] = DeviceManglingNumber;
2049 Lambda.IndexInContext = IndexInLambdaContext;
2050 Lambda.ContextDecl = LambdaContext;
2052 if (Lambda.NumCaptures) {
2053 ToCapture = (
Capture *)Reader.getContext().Allocate(
sizeof(
Capture) *
2054 Lambda.NumCaptures);
2055 Lambda.AddCaptureList(Reader.getContext(), ToCapture);
2057 Lambda.MethodTyInfo = readTypeSourceInfo();
2058 for (
unsigned I = 0, N = Lambda.NumCaptures; I != N; ++I) {
2059 SourceLocation Loc = readSourceLocation();
2060 BitsUnpacker CaptureBits(Record.readInt());
2061 bool IsImplicit = CaptureBits.getNextBit();
2069 Capture(Loc, IsImplicit, Kind,
nullptr, SourceLocation());
2074 auto *Var = readDeclAs<ValueDecl>();
2075 SourceLocation EllipsisLoc = readSourceLocation();
2076 new (ToCapture)
Capture(Loc, IsImplicit, Kind, Var, EllipsisLoc);
2085 CXXRecordDecl *D,
struct CXXRecordDecl::DefinitionData &&MergeDD) {
2086 assert(D->DefinitionData &&
2087 "merging class definition into non-definition");
2088 auto &DD = *D->DefinitionData;
2090 if (DD.Definition != MergeDD.Definition) {
2092 Reader.MergedDeclContexts.insert(std::make_pair(MergeDD.Definition,
2094 Reader.PendingDefinitions.erase(MergeDD.Definition);
2095 MergeDD.Definition->demoteThisDefinitionToDeclaration();
2096 Reader.mergeDefinitionVisibility(DD.Definition, MergeDD.Definition);
2097 assert(!Reader.Lookups.contains(MergeDD.Definition) &&
2098 "already loaded pending lookups for merged definition");
2101 auto PFDI = Reader.PendingFakeDefinitionData.find(&DD);
2102 if (PFDI != Reader.PendingFakeDefinitionData.end() &&
2103 PFDI->second == ASTReader::PendingFakeDefinitionKind::Fake) {
2106 assert(!DD.IsLambda && !MergeDD.IsLambda &&
"faked up lambda definition?");
2107 PFDI->second = ASTReader::PendingFakeDefinitionKind::FakeLoaded;
2111 auto *Def = DD.Definition;
2112 DD = std::move(MergeDD);
2113 DD.Definition = Def;
2114 for (
auto *R = Reader.getMostRecentExistingDecl(Def); R;
2115 R = R->getPreviousDecl())
2120 bool DetectedOdrViolation =
false;
2122 #define FIELD(Name, Width, Merge) Merge(Name)
2123 #define MERGE_OR(Field) DD.Field |= MergeDD.Field;
2124 #define NO_MERGE(Field) \
2125 DetectedOdrViolation |= DD.Field != MergeDD.Field; \
2127 #include "clang/AST/CXXRecordDeclDefinitionBits.def"
2132 if (DD.NumBases != MergeDD.NumBases || DD.NumVBases != MergeDD.NumVBases)
2133 DetectedOdrViolation =
true;
2139 if (MergeDD.ComputedVisibleConversions && !DD.ComputedVisibleConversions) {
2140 DD.VisibleConversions = std::move(MergeDD.VisibleConversions);
2141 DD.ComputedVisibleConversions =
true;
2148 auto &Lambda1 =
static_cast<CXXRecordDecl::LambdaDefinitionData &
>(DD);
2149 auto &Lambda2 =
static_cast<CXXRecordDecl::LambdaDefinitionData &
>(MergeDD);
2150 DetectedOdrViolation |= Lambda1.DependencyKind != Lambda2.DependencyKind;
2151 DetectedOdrViolation |= Lambda1.IsGenericLambda != Lambda2.IsGenericLambda;
2152 DetectedOdrViolation |= Lambda1.CaptureDefault != Lambda2.CaptureDefault;
2153 DetectedOdrViolation |= Lambda1.NumCaptures != Lambda2.NumCaptures;
2154 DetectedOdrViolation |=
2155 Lambda1.NumExplicitCaptures != Lambda2.NumExplicitCaptures;
2156 DetectedOdrViolation |=
2157 Lambda1.HasKnownInternalLinkage != Lambda2.HasKnownInternalLinkage;
2158 DetectedOdrViolation |= Lambda1.ManglingNumber != Lambda2.ManglingNumber;
2160 if (Lambda1.NumCaptures && Lambda1.NumCaptures == Lambda2.NumCaptures) {
2161 for (
unsigned I = 0, N = Lambda1.NumCaptures; I != N; ++I) {
2166 Lambda1.AddCaptureList(Reader.getContext(), Lambda2.Captures.front());
2175 DetectedOdrViolation =
true;
2178 if (DetectedOdrViolation)
2179 Reader.PendingOdrMergeFailures[DD.Definition].push_back(
2180 {MergeDD.Definition, &MergeDD});
2184 Decl *LambdaContext,
2185 unsigned IndexInLambdaContext) {
2186 struct CXXRecordDecl::DefinitionData *DD;
2191 bool IsLambda =
Record.readInt();
2192 assert(!(IsLambda &&
Update) &&
2193 "lambda definition should not be added by update record");
2195 DD =
new (
C) CXXRecordDecl::LambdaDefinitionData(
2198 DD =
new (
C)
struct CXXRecordDecl::DefinitionData(D);
2204 if (!Canon->DefinitionData)
2205 Canon->DefinitionData = DD;
2206 D->DefinitionData = Canon->DefinitionData;
2207 ReadCXXDefinitionData(*DD, D, LambdaContext, IndexInLambdaContext);
2215 if (Canon->DefinitionData != DD) {
2223 if (
Update || Canon != D)
2224 Reader.PendingDefinitions.insert(D);
2233 CXXRecNotTemplate = 0,
2235 CXXRecMemberSpecialization,
2239 Decl *LambdaContext =
nullptr;
2240 unsigned IndexInLambdaContext = 0;
2242 switch ((CXXRecKind)Record.readInt()) {
2243 case CXXRecNotTemplate:
2248 case CXXRecTemplate: {
2250 auto *
Template = readDeclAs<ClassTemplateDecl>();
2251 D->TemplateOrInstantiation =
Template;
2254 case CXXRecMemberSpecialization: {
2255 auto *RD = readDeclAs<CXXRecordDecl>();
2260 D->TemplateOrInstantiation = MSI;
2265 LambdaContext = readDecl();
2267 IndexInLambdaContext = Record.readInt();
2269 MergeImpl.mergeLambda(D, Redecl, *LambdaContext, IndexInLambdaContext);
2278 bool WasDefinition = Record.readInt();
2280 ReadCXXRecordDefinition(D,
false, LambdaContext,
2281 IndexInLambdaContext);
2288 if (WasDefinition) {
2301 D->setExplicitSpecifier(Record.readExplicitSpec());
2302 D->Ctor = readDeclAs<CXXConstructorDecl>();
2315 unsigned NumOverridenMethods = Record.readInt();
2317 while (NumOverridenMethods--) {
2320 if (
auto *MD = readDeclAs<CXXMethodDecl>())
2326 Record.skipInts(NumOverridenMethods);
2335 auto *Shadow = readDeclAs<ConstructorUsingShadowDecl>();
2336 auto *Ctor = readDeclAs<CXXConstructorDecl>();
2341 if (
unsigned NumArgs = Record.readUInt32()) {
2344 for (
unsigned I = 0; I != NumArgs; I++)
2345 Args[I] = cast_or_null<CXXDefaultArgExpr>(Record.readStmt());
2357 if (
auto *OperatorDelete = readDeclAs<FunctionDecl>()) {
2358 auto *ThisArg = Record.readExpr();
2361 C.addOperatorDeleteForVDtor(D, OperatorDelete,
2363 Canon->OperatorDeleteThisArg = ThisArg;
2366 if (
auto *OperatorGlobDelete = readDeclAs<FunctionDecl>()) {
2367 if (!
C.dtorHasOperatorDelete(D,
2369 C.addOperatorDeleteForVDtor(
2372 if (
auto *OperatorArrayDelete = readDeclAs<FunctionDecl>()) {
2374 C.addOperatorDeleteForVDtor(D, OperatorArrayDelete,
2377 if (
auto *OperatorGlobArrayDelete = readDeclAs<FunctionDecl>()) {
2378 if (!
C.dtorHasOperatorDelete(D,
2380 C.addOperatorDeleteForVDtor(D, OperatorGlobArrayDelete,
2392 D->ImportedModule = readModule();
2393 D->setImportComplete(Record.readInt());
2394 auto *StoredLocs = D->getTrailingObjects();
2395 for (
unsigned I = 0, N = Record.back(); I != N; ++I)
2396 StoredLocs[I] = readSourceLocation();
2407 if (Record.readInt())
2408 D->Friend = readDeclAs<NamedDecl>();
2410 D->Friend = readTypeSourceInfo();
2411 for (
unsigned i = 0; i != D->NumTPLists; ++i)
2412 D->getTrailingObjects()[i] = Record.readTemplateParameterList();
2413 D->NextFriend = readDeclID().getRawValue();
2414 D->UnsupportedFriend = (Record.readInt() != 0);
2415 D->FriendLoc = readSourceLocation();
2416 D->EllipsisLoc = readSourceLocation();
2421 unsigned NumParams = Record.readInt();
2422 D->NumParams = NumParams;
2424 for (
unsigned i = 0; i != NumParams; ++i)
2425 D->Params[i] = Record.readTemplateParameterList();
2426 if (Record.readInt())
2427 D->Friend = readDeclAs<NamedDecl>();
2429 D->Friend = readTypeSourceInfo();
2430 D->FriendLoc = readSourceLocation();
2438 D->
init(readDeclAs<NamedDecl>());
2453 for (
unsigned I = 0; I < D->NumTemplateArgs; ++I)
2454 Args.push_back(Record.readTemplateArgument(
false));
2462 llvm::BitstreamCursor &DeclsCursor,
2464 uint64_t Offset = ReadLocalOffset();
2466 Reader.ReadSpecializations(M, DeclsCursor, Offset, D, IsPartial);
2480 Reader.PendingDefinitions.insert(CanonD);
2486 if (ThisDeclID == Redecl.getFirstID()) {
2487 if (
auto *RTD = readDeclAs<RedeclarableTemplateDecl>()) {
2488 assert(RTD->getKind() == D->
getKind() &&
2489 "InstantiatedFromMemberTemplate kind mismatch");
2491 if (Record.readInt())
2506 if (ThisDeclID == Redecl.getFirstID()) {
2515 llvm_unreachable(
"BuiltinTemplates are not serialized");
2525 if (ThisDeclID == Redecl.getFirstID()) {
2538 if (
Decl *InstD = readDecl()) {
2539 if (
auto *CTD = dyn_cast<ClassTemplateDecl>(InstD)) {
2540 D->SpecializedTemplate = CTD;
2543 Record.readTemplateArgumentList(TemplArgs);
2548 SpecializedPartialSpecialization();
2549 PS->PartialSpecialization
2551 PS->TemplateArgs = ArgList;
2552 D->SpecializedTemplate = PS;
2557 Record.readTemplateArgumentList(TemplArgs,
true);
2559 D->PointOfInstantiation = readSourceLocation();
2561 D->StrictPackMatch = Record.readBool();
2563 bool writtenAsCanonicalDecl = Record.readInt();
2564 if (writtenAsCanonicalDecl) {
2565 auto *CanonPattern = readDeclAs<ClassTemplateDecl>();
2569 if (
auto *Partial = dyn_cast<ClassTemplatePartialSpecializationDecl>(D)) {
2570 CanonSpec = CanonPattern->getCommonPtr()->PartialSpecializations
2571 .GetOrInsertNode(Partial);
2574 CanonPattern->getCommonPtr()->Specializations.GetOrInsertNode(D);
2577 if (CanonSpec != D) {
2578 MergeImpl.mergeRedeclarable<
TagDecl>(D, CanonSpec, Redecl);
2582 if (
auto *DDD = D->DefinitionData) {
2583 if (CanonSpec->DefinitionData)
2584 MergeImpl.MergeDefinitionData(CanonSpec, std::move(*DDD));
2586 CanonSpec->DefinitionData = D->DefinitionData;
2588 D->DefinitionData = CanonSpec->DefinitionData;
2594 if (Record.readBool()) {
2597 ExplicitInfo->TemplateKeywordLoc = readSourceLocation();
2598 D->ExplicitInfo = ExplicitInfo;
2601 if (Record.readBool())
2612 D->TemplateParams = Params;
2617 if (ThisDeclID == Redecl.getFirstID()) {
2618 D->InstantiatedFromMember.setPointer(
2619 readDeclAs<ClassTemplatePartialSpecializationDecl>());
2620 D->InstantiatedFromMember.setInt(Record.readInt());
2627 if (ThisDeclID == Redecl.getFirstID()) {
2641 if (
Decl *InstD = readDecl()) {
2642 if (
auto *VTD = dyn_cast<VarTemplateDecl>(InstD)) {
2643 D->SpecializedTemplate = VTD;
2646 Record.readTemplateArgumentList(TemplArgs);
2651 VarTemplateSpecializationDecl::SpecializedPartialSpecialization();
2652 PS->PartialSpecialization =
2654 PS->TemplateArgs = ArgList;
2655 D->SpecializedTemplate = PS;
2660 if (Record.readBool()) {
2663 ExplicitInfo->TemplateKeywordLoc = readSourceLocation();
2664 D->ExplicitInfo = ExplicitInfo;
2667 if (Record.readBool())
2671 Record.readTemplateArgumentList(TemplArgs,
true);
2673 D->PointOfInstantiation = readSourceLocation();
2675 D->IsCompleteDefinition = Record.readInt();
2679 bool writtenAsCanonicalDecl = Record.readInt();
2680 if (writtenAsCanonicalDecl) {
2681 auto *CanonPattern = readDeclAs<VarTemplateDecl>();
2684 if (
auto *Partial = dyn_cast<VarTemplatePartialSpecializationDecl>(D)) {
2685 CanonSpec = CanonPattern->getCommonPtr()
2686 ->PartialSpecializations.GetOrInsertNode(Partial);
2689 CanonPattern->getCommonPtr()->Specializations.GetOrInsertNode(D);
2693 MergeImpl.mergeRedeclarable<
VarDecl>(D, CanonSpec, Redecl);
2708 D->TemplateParams = Params;
2713 if (ThisDeclID == Redecl.getFirstID()) {
2714 D->InstantiatedFromMember.setPointer(
2715 readDeclAs<VarTemplatePartialSpecializationDecl>());
2716 D->InstantiatedFromMember.setInt(Record.readInt());
2726 if (TypeConstraintInitialized) {
2728 if (Record.readBool())
2729 CR = Record.readConceptReference();
2730 Expr *ImmediatelyDeclaredConstraint = Record.readExpr();
2734 D->NumExpanded = Record.readUnsignedOrNone();
2737 if (Record.readInt())
2739 Record.readTemplateArgumentLoc());
2750 auto TypesAndInfos =
2751 D->getTrailingObjects<std::pair<QualType, TypeSourceInfo *>>();
2753 new (&TypesAndInfos[I].first)
QualType(Record.readType());
2754 TypesAndInfos[I].second = readTypeSourceInfo();
2758 D->ParameterPack = Record.readInt();
2759 if (Record.readInt())
2761 Record.readTemplateArgumentLoc());
2773 auto **
Data = D->getTrailingObjects();
2776 Data[I] = Record.readTemplateParameterList();
2779 D->ParameterPack = Record.readInt();
2780 if (Record.readInt())
2782 Record.readTemplateArgumentLoc());
2793 D->AssertExprAndFailed.setPointer(Record.readExpr());
2794 D->AssertExprAndFailed.setInt(Record.readInt());
2795 D->Message = cast_or_null<StringLiteral>(Record.readExpr());
2796 D->RParenLoc = readSourceLocation();
2804 auto *Spec = readDeclAs<NamedDecl>();
2805 D->SpecAndTSK.setPointer(Spec);
2806 D->ExternLoc = readSourceLocation();
2807 D->NameLoc = readSourceLocation();
2809 unsigned TSK = Record.readInt();
2810 D->SpecAndTSK.setInt(TSK);
2811 D->TypeAndFlags.setPointer(TSI);
2815 Record.readNestedNameSpecifierLoc();
2818 Record.readASTTemplateArgumentListInfo();
2822 Reader.getContext().addExplicitInstantiationDecl(Spec, D);
2829 cast_or_null<CXXExpansionStmtInstantiation>(Record.readStmt());
2840 D->ExtendingDecl = readDeclAs<ValueDecl>();
2841 D->ExprWithTemporary = Record.readStmt();
2842 if (Record.readInt()) {
2846 D->ManglingNumber = Record.readInt();
2858template <
typename T>
2861 Decl *MergeWith =
nullptr;
2863 bool IsKeyDecl = ThisDeclID == FirstDeclID;
2864 bool IsFirstLocalDecl =
false;
2866 uint64_t RedeclOffset = 0;
2871 FirstDeclID = ThisDeclID;
2873 IsFirstLocalDecl =
true;
2874 }
else if (
unsigned N = Record.readInt()) {
2878 IsFirstLocalDecl =
true;
2885 for (
unsigned I = 0; I != N - 1; ++I)
2886 MergeWith = readDecl();
2888 RedeclOffset = ReadLocalOffset();
2895 auto *FirstDecl = cast_or_null<T>(Reader.GetDecl(FirstDeclID));
2896 if (FirstDecl != D) {
2902 D->
First = FirstDecl->getCanonicalDecl();
2905 auto *DAsT =
static_cast<T *
>(D);
2911 if (IsFirstLocalDecl)
2912 Reader.PendingDeclChains.push_back(std::make_pair(DAsT, RedeclOffset));
2914 return RedeclarableResult(MergeWith, FirstDeclID, IsKeyDecl);
2919template <
typename T>
2921 RedeclarableResult &Redecl) {
2923 if (!Reader.getContext().getLangOpts().Modules)
2930 auto *D =
static_cast<T *
>(DBase);
2932 if (
auto *Existing = Redecl.getKnownMergeTarget())
2934 MergeImpl.mergeRedeclarable(D,
cast<T>(Existing), Redecl);
2935 else if (FindExistingResult ExistingRes = findExisting(D))
2936 if (T *Existing = ExistingRes)
2937 MergeImpl.mergeRedeclarable(D, Existing, Redecl);
2947 Decl &Context,
unsigned IndexInContext) {
2949 if (!Reader.getContext().getLangOpts().Modules)
2956 if (
auto *Existing = Redecl.getKnownMergeTarget())
2962 NamedDecl *&Slot = Reader.LambdaDeclarationsForMerging[{
2963 Context.getCanonicalDecl(), IndexInContext}];
2971 RedeclarableResult &Redecl) {
2984 llvm_unreachable(
"bad assert_cast");
2994 RedeclarableResult
Result(
2996 DPattern->getCanonicalDecl()->getGlobalID(), IsKeyDecl);
2998 if (
auto *DClass = dyn_cast<CXXRecordDecl>(DPattern)) {
3001 auto *ExistingClass =
3003 if (
auto *DDD = DClass->DefinitionData) {
3004 if (ExistingClass->DefinitionData) {
3007 ExistingClass->DefinitionData = DClass->DefinitionData;
3010 Reader.PendingDefinitions.insert(DClass);
3013 DClass->DefinitionData = ExistingClass->DefinitionData;
3018 if (
auto *DFunction = dyn_cast<FunctionDecl>(DPattern))
3021 if (
auto *DVar = dyn_cast<VarDecl>(DPattern))
3023 if (
auto *DAlias = dyn_cast<TypeAliasDecl>(DPattern))
3026 llvm_unreachable(
"merged an unknown kind of redeclarable template");
3031template <
typename T>
3034 auto *D =
static_cast<T *
>(DBase);
3035 T *ExistingCanon = Existing->getCanonicalDecl();
3037 if (ExistingCanon != DCanon) {
3042 D->
First = ExistingCanon;
3043 ExistingCanon->Used |= D->Used;
3046 bool IsKeyDecl = KeyDeclID.
isValid();
3049 if (
auto *DTemplate = dyn_cast<RedeclarableTemplateDecl>(D))
3056 Reader.KeyDecls[ExistingCanon].push_back(KeyDeclID);
3078 if (!Reader.getContext().getLangOpts().Modules)
3084 Reader.LETemporaryForMerging[std::make_pair(
3087 Reader.getContext().setPrimaryMergedDecl(LETDecl,
3100 if (!Reader.getContext().getLangOpts().Modules)
3107 if (!Reader.getContext().getLangOpts().CPlusPlus &&
3111 if (FindExistingResult ExistingRes = findExisting(
static_cast<T*
>(D)))
3112 if (T *Existing = ExistingRes)
3113 Reader.getContext().setPrimaryMergedDecl(
static_cast<T *
>(D),
3114 Existing->getCanonicalDecl());
3118 Record.readOMPChildren(D->
Data);
3123 Record.readOMPChildren(D->
Data);
3128 Record.readOMPChildren(D->
Data);
3135 Expr *In = Record.readExpr();
3136 Expr *Out = Record.readExpr();
3138 Expr *Combiner = Record.readExpr();
3140 Expr *Orig = Record.readExpr();
3141 Expr *Priv = Record.readExpr();
3146 D->PrevDeclInScope = readDeclID().getRawValue();
3150 Record.readOMPChildren(D->
Data);
3152 D->VarName = Record.readDeclarationName();
3153 D->PrevDeclInScope = readDeclID().getRawValue();
3163 D->DirectiveLoc = Record.readSourceLocation();
3164 D->EndLoc = Record.readSourceLocation();
3165 Record.readOpenACCClauseList(D->Clauses);
3170 D->DirectiveLoc = Record.readSourceLocation();
3171 D->EndLoc = Record.readSourceLocation();
3172 D->ParensLoc = Record.readSourceRange();
3173 D->FuncRef = Record.readExpr();
3174 Record.readOpenACCClauseList(D->Clauses);
3188 uint64_t readInt() {
3192 bool readBool() {
return Reader.
readBool(); }
3194 SourceRange readSourceRange() {
3198 SourceLocation readSourceLocation() {
3202 Expr *readExpr() {
return Reader.
readExpr(); }
3204 Attr *readAttr() {
return Reader.
readAttr(); }
3206 std::string readString() {
3210 TypeSourceInfo *readTypeSourceInfo() {
3214 IdentifierInfo *readIdentifier() {
3218 VersionTuple readVersionTuple() {
3224 template <
typename T> T *readDeclAs() {
return Reader.
readDeclAs<T>(); }
3229 AttrReader
Record(*
this);
3230 auto V = Record.readInt();
3244 unsigned ParsedKind = Record.readInt();
3245 unsigned Syntax = Record.readInt();
3246 unsigned SpellingIndex = Record.readInt();
3247 bool IsAlignas = (ParsedKind == AttributeCommonInfo::AT_Aligned &&
3249 SpellingIndex == AlignedAttr::Keyword_alignas);
3250 bool IsRegularKeywordAttribute = Record.readBool();
3255 IsAlignas, IsRegularKeywordAttribute});
3257#include "clang/Serialization/AttrPCHRead.inc"
3259 assert(
New &&
"Unable to decode attribute?");
3265 for (
unsigned I = 0, E =
readInt(); I != E; ++I)
3280inline void ASTReader::LoadedDecl(
unsigned Index,
Decl *D) {
3281 assert(!DeclsLoaded[Index] &&
"Decl loaded twice?");
3282 DeclsLoaded[Index] = D;
3291bool ASTReader::isConsumerInterestedIn(
Decl *D) {
3304 if (
isa<FileScopeAsmDecl, TopLevelStmtDecl, ObjCProtocolDecl, ObjCImplDecl,
3305 ImportDecl, PragmaCommentDecl, PragmaDetectMismatchDecl>(D))
3307 if (
isa<OMPThreadPrivateDecl, OMPDeclareReductionDecl, OMPDeclareMapperDecl,
3308 OMPAllocateDecl, OMPRequiresDecl>(D))
3310 if (
const auto *Var = dyn_cast<VarDecl>(D))
3311 return Var->isFileVarDecl() &&
3313 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(Var));
3314 if (
const auto *
Func = dyn_cast<FunctionDecl>(D))
3315 return Func->doesThisDeclarationHaveABody() || PendingBodies.count(D);
3325ASTReader::RecordLocation ASTReader::DeclCursorForID(
GlobalDeclID ID,
3329 unsigned LocalDeclIndex = ID.getLocalDeclIndex();
3330 const DeclOffset &DOffs = M->
DeclOffsets[LocalDeclIndex];
3335ASTReader::RecordLocation ASTReader::getLocalBitOffset(uint64_t GlobalOffset) {
3336 auto I = GlobalBitOffsetsMap.find(GlobalOffset);
3338 assert(I != GlobalBitOffsetsMap.end() &&
"Corrupted global bit offsets map");
3339 return RecordLocation(I->second, GlobalOffset - I->second->GlobalBitOffset);
3342uint64_t ASTReader::getGlobalBitOffset(ModuleFile &M, uint64_t LocalOffset) {
3347ASTDeclReader::getOrFakePrimaryClassDefinition(
ASTReader &Reader,
3350 auto *DD = RD->DefinitionData;
3359 DD =
new (Reader.getContext())
struct CXXRecordDecl::DefinitionData(RD);
3361 RD->DefinitionData = DD;
3365 Reader.PendingFakeDefinitionData.insert(
3366 std::make_pair(DD, ASTReader::PendingFakeDefinitionKind::Fake));
3369 return DD->Definition;
3376 if (
auto *ND = dyn_cast<NamespaceDecl>(DC))
3377 return ND->getFirstDecl();
3379 if (
auto *RD = dyn_cast<CXXRecordDecl>(DC))
3380 return getOrFakePrimaryClassDefinition(Reader, RD);
3382 if (
auto *RD = dyn_cast<RecordDecl>(DC))
3385 if (
auto *ED = dyn_cast<EnumDecl>(DC))
3388 if (
auto *OID = dyn_cast<ObjCInterfaceDecl>(DC))
3393 if (
auto *TU = dyn_cast<TranslationUnitDecl>(DC))
3399ASTDeclReader::FindExistingResult::~FindExistingResult() {
3402 if (TypedefNameForLinkage) {
3404 Reader.ImportedTypedefNamesForLinkage.insert(
3405 std::make_pair(std::make_pair(DC, TypedefNameForLinkage), New));
3409 if (!AddResult || Existing)
3412 DeclarationName Name = New->getDeclName();
3415 setAnonymousDeclForMerging(Reader, New->getLexicalDeclContext(),
3416 AnonymousDeclNumber, New);
3418 !Reader.getContext().getLangOpts().CPlusPlus) {
3419 if (Reader.getIdResolver().tryAddTopLevelDecl(New, Name))
3422 }
else if (DeclContext *MergeDC = getPrimaryContextForMerging(Reader, DC)) {
3425 MergeDC->makeDeclVisibleInContextImpl(New,
true);
3435 bool IsTypedefNameForLinkage,
3436 bool FilteringUsingShadowDecl) {
3439 if (
auto *USD = dyn_cast<UsingShadowDecl>(
Found);
3440 USD && FilteringUsingShadowDecl)
3442 FilteringUsingShadowDecl);
3444 if (!IsTypedefNameForLinkage)
3450 if (
Found->isFromASTFile())
3453 if (
auto *TND = dyn_cast<TypedefNameDecl>(
Found))
3454 return TND->getAnonDeclWithTypedefName(
true);
3463ASTDeclReader::getPrimaryDCForAnonymousDecl(DeclContext *LexicalDC) {
3465 if (
auto *RD = dyn_cast<CXXRecordDecl>(LexicalDC)) {
3467 return DD ? DD->Definition :
nullptr;
3468 }
else if (
auto *OID = dyn_cast<ObjCInterfaceDecl>(LexicalDC)) {
3469 return OID->getCanonicalDecl()->getDefinition();
3476 if (
auto *FD = dyn_cast<FunctionDecl>(D))
3477 if (FD->isThisDeclarationADefinition())
3479 if (
auto *MD = dyn_cast<ObjCMethodDecl>(D))
3480 if (MD->isThisDeclarationADefinition())
3482 if (
auto *RD = dyn_cast<RecordDecl>(D))
3491NamedDecl *ASTDeclReader::getAnonymousDeclForMerging(ASTReader &Reader,
3496 auto *CanonDC =
cast<Decl>(DC)->getCanonicalDecl();
3499 auto &
Previous = Reader.AnonymousDeclarationsForMerging[CanonDC];
3505 auto *PrimaryDC = getPrimaryDCForAnonymousDecl(DC);
3506 auto needToNumberAnonymousDeclsWithin = [](
Decl *D) {
3514 auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D);
3515 return CTSD && !CTSD->noload_field_empty() &&
3516 !CTSD->hasLoadedFieldsFromExternalStorage();
3518 if (PrimaryDC && needToNumberAnonymousDeclsWithin(
cast<Decl>(PrimaryDC))) {
3530void ASTDeclReader::setAnonymousDeclForMerging(ASTReader &Reader,
3531 DeclContext *DC,
unsigned Index,
3533 auto *CanonDC =
cast<Decl>(DC)->getCanonicalDecl();
3535 auto &
Previous = Reader.AnonymousDeclarationsForMerging[CanonDC];
3542ASTDeclReader::FindExistingResult ASTDeclReader::findExisting(NamedDecl *D) {
3543 DeclarationName Name = TypedefNameForLinkage ? TypedefNameForLinkage
3549 FindExistingResult
Result(Reader, D,
nullptr,
3550 AnonymousDeclNumber, TypedefNameForLinkage);
3555 ASTContext &
C = Reader.getContext();
3557 if (TypedefNameForLinkage) {
3558 auto It = Reader.ImportedTypedefNamesForLinkage.find(
3559 std::make_pair(DC, TypedefNameForLinkage));
3560 if (It != Reader.ImportedTypedefNamesForLinkage.end())
3561 if (
C.isSameEntity(It->second, D))
3562 return FindExistingResult(Reader, D, It->second, AnonymousDeclNumber,
3563 TypedefNameForLinkage);
3571 if (
auto *Existing = getAnonymousDeclForMerging(
3573 if (
C.isSameEntity(Existing, D))
3574 return FindExistingResult(Reader, D, Existing, AnonymousDeclNumber,
3575 TypedefNameForLinkage);
3577 !Reader.getContext().getLangOpts().CPlusPlus) {
3578 IdentifierResolver &IdResolver = Reader.getIdResolver();
3582 class UpToDateIdentifierRAII {
3584 bool WasOutToDate =
false;
3587 explicit UpToDateIdentifierRAII(IdentifierInfo *II) : II(II) {
3595 ~UpToDateIdentifierRAII() {
3601 for (IdentifierResolver::iterator I = IdResolver.
begin(Name),
3602 IEnd = IdResolver.
end();
3604 if (NamedDecl *Existing =
3607 if (
C.isSameEntity(Existing, D))
3608 return FindExistingResult(Reader, D, Existing, AnonymousDeclNumber,
3609 TypedefNameForLinkage);
3611 }
else if (DeclContext *MergeDC = getPrimaryContextForMerging(Reader, DC)) {
3616 if (
C.isSameEntity(Existing, D)) {
3617 return FindExistingResult(Reader, D, Existing, AnonymousDeclNumber,
3618 TypedefNameForLinkage);
3623 return FindExistingResult(Reader);
3635 if (MergedDCIt != Reader.MergedDeclContexts.end() &&
3638 Reader.PendingOdrMergeChecks.push_back(D);
3640 return FindExistingResult(Reader, D,
nullptr,
3641 AnonymousDeclNumber, TypedefNameForLinkage);
3644template<
typename DeclT>
3650 llvm_unreachable(
"getMostRecentDecl on non-redeclarable declaration");
3657#define ABSTRACT_DECL(TYPE)
3658#define DECL(TYPE, BASE) \
3660 return getMostRecentDeclImpl(cast<TYPE##Decl>(D));
3661#include "clang/AST/DeclNodes.inc"
3663 llvm_unreachable(
"unknown decl kind");
3666Decl *ASTReader::getMostRecentExistingDecl(
Decl *D) {
3674 const auto *IA =
Previous->getAttr<MSInheritanceAttr>();
3676 if (IA && !D->
hasAttr<MSInheritanceAttr>()) {
3682 if (!D->
hasAttr<AvailabilityAttr>()) {
3683 for (
const auto *AA :
Previous->specific_attrs<AvailabilityAttr>()) {
3684 NewAttr = AA->
clone(Context);
3692template<
typename DeclT>
3708 D->
First = PrevVD->First;
3713 auto *VD =
static_cast<VarDecl *
>(D);
3723 if (VD->getOwningModule() &&
3724 VD->getOwningModule()->isHeaderLikeModule())
3725 VD->demoteThisDefinitionToDeclaration();
3726 Reader.mergeDefinitionVisibility(CurD, VD);
3734 auto *DT = T->getContainedDeducedType();
3735 return DT && !DT->isDeduced();
3745 FD->RedeclLink.setPrevious(PrevFD);
3746 FD->First = PrevFD->First;
3750 if (PrevFD->isInlined() != FD->isInlined()) {
3766 FD->setImplicitlyInline(
true);
3771 if (FPT && PrevFPT) {
3775 bool WasUnresolved =
3777 if (IsUnresolved != WasUnresolved)
3778 Reader.PendingExceptionSpecUpdates.insert(
3779 {Canon, IsUnresolved ? PrevFD : FD});
3785 if (IsUndeduced != WasUndeduced)
3786 Reader.PendingDeducedTypeUpdates.insert(
3788 (IsUndeduced ? PrevFPT : FPT)->getReturnType()});
3795 llvm_unreachable(
"attachPreviousDecl on non-redeclarable declaration");
3800template <
typename ParmDecl>
3804 if (!From->hasDefaultArgument())
3806 To->setInheritedDefaultArgument(Context, From);
3815 assert(FromTP->size() == ToTP->size() &&
"merged mismatched templates?");
3817 for (
unsigned I = 0, N = FromTP->size(); I != N; ++I) {
3818 NamedDecl *FromParam = FromTP->getParam(I);
3821 if (
auto *FTTP = dyn_cast<TemplateTypeParmDecl>(FromParam))
3823 else if (
auto *FNTTP = dyn_cast<NonTypeTemplateParmDecl>(FromParam))
3858 Func &&
Func->getTemplateSpecializationInfo())
3867 if (!
Previous->getLexicalDeclContext()
3868 ->getNonTransparentContext()
3869 ->isFileContext() ||
3887 Reader.PendingWarningForDuplicatedDefsInModuleUnits.push_back(
3896 Reader.Diag(
Previous->getLocation(),
3897 diag::err_multiple_decl_in_different_modules)
3899 Reader.Diag(D->
getLocation(), diag::note_also_found);
3907#define ABSTRACT_DECL(TYPE)
3908#define DECL(TYPE, BASE) \
3910 attachPreviousDeclImpl(Reader, cast<TYPE##Decl>(D), Previous, Canon); \
3912#include "clang/AST/DeclNodes.inc"
3928 if (
auto *TD = dyn_cast<TemplateDecl>(D))
3936 mergeInheritableAttributes(Reader, D,
Previous);
3939template<
typename DeclT>
3945 llvm_unreachable(
"attachLatestDecl on non-redeclarable declaration");
3949 assert(D && Latest);
3952#define ABSTRACT_DECL(TYPE)
3953#define DECL(TYPE, BASE) \
3955 attachLatestDeclImpl(cast<TYPE##Decl>(D), Latest); \
3957#include "clang/AST/DeclNodes.inc"
3961template<
typename DeclT>
3967 llvm_unreachable(
"markIncompleteDeclChain on non-redeclarable declaration");
3970void ASTReader::markIncompleteDeclChain(
Decl *D) {
3972#define ABSTRACT_DECL(TYPE)
3973#define DECL(TYPE, BASE) \
3975 ASTDeclReader::markIncompleteDeclChainImpl(cast<TYPE##Decl>(D)); \
3977#include "clang/AST/DeclNodes.inc"
3983 SourceLocation DeclLoc;
3984 RecordLocation Loc = DeclCursorForID(ID, DeclLoc);
3985 llvm::BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
3988 SavedStreamPosition SavedPosition(DeclsCursor);
3990 ReadingKindTracker ReadingKind(Read_Decl, *
this);
3995 auto Fail = [](
const char *what, llvm::Error &&Err) {
3996 llvm::report_fatal_error(Twine(
"ASTReader::readDeclRecord failed ") + what +
4000 if (llvm::Error JumpFailed = DeclsCursor.JumpToBit(Loc.Offset))
4001 Fail(
"jumping", std::move(JumpFailed));
4004 Expected<unsigned> MaybeCode = DeclsCursor.ReadCode();
4006 Fail(
"reading code", MaybeCode.takeError());
4007 unsigned Code = MaybeCode.get();
4011 Expected<unsigned> MaybeDeclCode =
Record.readRecord(DeclsCursor, Code);
4013 llvm::report_fatal_error(
4014 Twine(
"ASTReader::readDeclRecord failed reading decl code: ") +
4015 toString(MaybeDeclCode.takeError()));
4017 switch ((
DeclCode)MaybeDeclCode.get()) {
4024 llvm_unreachable(
"Record cannot be de-serialized with readDeclRecord");
4134 bool HasTypeConstraint =
Record.readInt();
4140 bool HasTypeConstraint =
Record.readInt();
4146 bool HasTypeConstraint =
Record.readInt();
4148 Context, ID,
Record.readInt(), HasTypeConstraint);
4244 D = MSGuidDecl::CreateDeserialized(Context, ID);
4247 D = UnnamedGlobalConstantDecl::CreateDeserialized(Context, ID);
4250 D = TemplateParamObjectDecl::CreateDeserialized(Context, ID);
4259 Error(
"attempt to read a C++ base-specifier record as a declaration");
4262 Error(
"attempt to read a C++ ctor initializer record as a declaration");
4271 unsigned NumChildren =
Record.readInt();
4277 unsigned NumClauses =
Record.readInt();
4278 unsigned NumVars =
Record.readInt();
4284 unsigned NumClauses =
Record.readInt();
4293 unsigned NumClauses =
Record.readInt();
4332 assert(D &&
"Unknown declaration reading AST file");
4333 LoadedDecl(translateGlobalDeclIDToIndex(ID), D);
4344 if (
auto *DC = dyn_cast<DeclContext>(D)) {
4345 LookupBlockOffsets Offsets;
4347 Reader.VisitDeclContext(DC, Offsets);
4353 if (
auto Iter = DelayedNamespaceOffsetMap.find(ID);
4354 Iter != DelayedNamespaceOffsetMap.end())
4355 Offsets = Iter->second;
4358 ReadVisibleDeclContextStorage(
4360 VisibleDeclContextStorageKind::GenerallyVisible))
4363 ReadVisibleDeclContextStorage(
4365 VisibleDeclContextStorageKind::ModuleLocalVisible))
4368 ReadVisibleDeclContextStorage(
4370 VisibleDeclContextStorageKind::TULocalVisible))
4374 ReadLexicalDeclContextStorage(*Loc.F, DeclsCursor,
4381 PendingUpdateRecords.push_back(
4382 PendingUpdateRecord(ID, D,
true));
4385 if (
auto *
Class = dyn_cast<ObjCInterfaceDecl>(D))
4388 if (
Class->isThisDeclarationADefinition() ||
4389 PendingDefinitions.count(
Class))
4390 loadObjCCategories(ID,
Class);
4396 PotentiallyInterestingDecls.push_back(D);
4401void ASTReader::PassInterestingDeclsToConsumer() {
4404 if (!CanPassDeclsToConsumer)
4409 SaveAndRestore GuardPassingDeclsToConsumer(CanPassDeclsToConsumer,
4414 for (
auto ID : EagerlyDeserializedDecls)
4416 EagerlyDeserializedDecls.clear();
4418 auto ConsumingPotentialInterestingDecls = [
this]() {
4419 while (!PotentiallyInterestingDecls.empty()) {
4420 Decl *D = PotentiallyInterestingDecls.front();
4421 PotentiallyInterestingDecls.pop_front();
4422 if (isConsumerInterestedIn(D))
4423 PassInterestingDeclToConsumer(D);
4426 std::deque<Decl *> MaybeInterestingDecls =
4427 std::move(PotentiallyInterestingDecls);
4428 PotentiallyInterestingDecls.clear();
4429 assert(PotentiallyInterestingDecls.empty());
4430 while (!MaybeInterestingDecls.empty()) {
4431 Decl *D = MaybeInterestingDecls.front();
4432 MaybeInterestingDecls.pop_front();
4438 if (
auto *VD = dyn_cast<VarDecl>(D);
4439 VD && VD->isFileVarDecl() && !VD->isExternallyVisible())
4441 ConsumingPotentialInterestingDecls();
4442 if (isConsumerInterestedIn(D))
4443 PassInterestingDeclToConsumer(D);
4447 ConsumingPotentialInterestingDecls();
4449 for (GlobalDeclID ID : VTablesToEmit) {
4452 PassVTableToConsumer(RD);
4454 VTablesToEmit.clear();
4457void ASTReader::loadDeclUpdateRecords(PendingUpdateRecord &
Record) {
4461 GlobalDeclID ID =
Record.ID;
4463 ProcessingUpdatesRAIIObj ProcessingUpdates(*
this);
4464 DeclUpdateOffsetsMap::iterator UpdI = DeclUpdateOffsets.find(ID);
4466 if (UpdI != DeclUpdateOffsets.end()) {
4467 auto UpdateOffsets = std::move(UpdI->second);
4468 DeclUpdateOffsets.erase(UpdI);
4474 bool WasInteresting =
Record.JustLoaded || isConsumerInterestedIn(D);
4475 for (
auto &FileAndOffset : UpdateOffsets) {
4477 uint64_t Offset = FileAndOffset.second;
4479 SavedStreamPosition SavedPosition(Cursor);
4480 if (llvm::Error JumpFailed =
Cursor.JumpToBit(Offset))
4482 llvm::report_fatal_error(
4483 Twine(
"ASTReader::loadDeclUpdateRecords failed jumping: ") +
4485 Expected<unsigned> MaybeCode =
Cursor.ReadCode();
4487 llvm::report_fatal_error(
4488 Twine(
"ASTReader::loadDeclUpdateRecords failed reading code: ") +
4490 unsigned Code = MaybeCode.get();
4492 if (Expected<unsigned> MaybeRecCode =
Record.readRecord(Cursor, Code))
4494 "Expected DECL_UPDATES record!");
4496 llvm::report_fatal_error(
4497 Twine(
"ASTReader::loadDeclUpdateRecords failed reading rec code: ") +
4502 Reader.UpdateDecl(D);
4506 if (!WasInteresting && isConsumerInterestedIn(D)) {
4507 PotentiallyInterestingDecls.push_back(D);
4508 WasInteresting =
true;
4514 if (
auto I = PendingVisibleUpdates.find(ID);
4515 I != PendingVisibleUpdates.end()) {
4516 auto VisibleUpdates = std::move(I->second);
4517 PendingVisibleUpdates.erase(I);
4520 for (
const auto &
Update : VisibleUpdates)
4521 Lookups[DC].Table.add(
4523 reader::ASTDeclContextNameLookupTrait(*
this, *
Update.Mod));
4527 if (
auto I = PendingModuleLocalVisibleUpdates.find(ID);
4528 I != PendingModuleLocalVisibleUpdates.end()) {
4529 auto ModuleLocalVisibleUpdates = std::move(I->second);
4530 PendingModuleLocalVisibleUpdates.erase(I);
4533 for (
const auto &
Update : ModuleLocalVisibleUpdates)
4534 ModuleLocalLookups[DC].Table.add(
4536 reader::ModuleLocalNameLookupTrait(*
this, *
Update.Mod));
4542 if (
auto I = TULocalUpdates.find(ID); I != TULocalUpdates.end()) {
4543 auto Updates = std::move(I->second);
4544 TULocalUpdates.erase(I);
4548 TULocalLookups[DC].Table.add(
4550 reader::ASTDeclContextNameLookupTrait(*
this, *
Update.Mod));
4556 if (
auto IT = RelatedDeclsMap.find(ID); IT != RelatedDeclsMap.end()) {
4557 for (
auto LID : IT->second)
4559 RelatedDeclsMap.erase(IT);
4564 if (
auto I = PendingSpecializationsUpdates.find(ID);
4565 I != PendingSpecializationsUpdates.end()) {
4566 auto SpecializationUpdates = std::move(I->second);
4567 PendingSpecializationsUpdates.erase(I);
4569 for (
const auto &
Update : SpecializationUpdates)
4570 AddSpecializations(D,
Update.Data, *
Update.Mod,
false);
4574 if (
auto I = PendingPartialSpecializationsUpdates.find(ID);
4575 I != PendingPartialSpecializationsUpdates.end()) {
4576 auto SpecializationUpdates = std::move(I->second);
4577 PendingPartialSpecializationsUpdates.erase(I);
4579 for (
const auto &
Update : SpecializationUpdates)
4584void ASTReader::loadPendingDeclChain(
Decl *FirstLocal, uint64_t LocalOffset) {
4587 if (FirstLocal != CanonDecl) {
4590 *
this, FirstLocal, PrevMostRecent ? PrevMostRecent : CanonDecl,
4601 assert(M &&
"imported decl from no module file");
4604 SavedStreamPosition SavedPosition(Cursor);
4605 if (llvm::Error JumpFailed =
Cursor.JumpToBit(LocalOffset))
4606 llvm::report_fatal_error(
4607 Twine(
"ASTReader::loadPendingDeclChain failed jumping: ") +
4611 Expected<unsigned> MaybeCode =
Cursor.ReadCode();
4613 llvm::report_fatal_error(
4614 Twine(
"ASTReader::loadPendingDeclChain failed reading code: ") +
4616 unsigned Code = MaybeCode.get();
4617 if (Expected<unsigned> MaybeRecCode =
Cursor.readRecord(Code,
Record))
4619 "expected LOCAL_REDECLARATIONS record!");
4621 llvm::report_fatal_error(
4622 Twine(
"ASTReader::loadPendingDeclChain failed reading rec code: ") +
4627 Decl *MostRecent = FirstLocal;
4628 for (
unsigned I = 0, N =
Record.size(); I != N; ++I) {
4629 unsigned Idx = N - I - 1;
4641 class ObjCCategoriesVisitor {
4644 llvm::SmallPtrSetImpl<ObjCCategoryDecl *> &Deserialized;
4645 ObjCCategoryDecl *Tail =
nullptr;
4646 llvm::DenseMap<DeclarationName, ObjCCategoryDecl *> NameCategoryMap;
4647 GlobalDeclID InterfaceID;
4648 unsigned PreviousGeneration;
4650 void add(ObjCCategoryDecl *Cat) {
4652 if (!Deserialized.erase(Cat))
4657 ObjCCategoryDecl *&Existing = NameCategoryMap[Cat->
getDeclName()];
4661 StructuralEquivalenceContext Ctx(
4664 StructuralEquivalenceKind::Default,
4668 if (!Ctx.IsEquivalent(Cat, Existing)) {
4673 diag::note_previous_definition);
4675 }
else if (!Existing) {
4690 ObjCCategoriesVisitor(
4691 ASTReader &Reader, ObjCInterfaceDecl *
Interface,
4692 llvm::SmallPtrSetImpl<ObjCCategoryDecl *> &Deserialized,
4693 GlobalDeclID InterfaceID,
unsigned PreviousGeneration)
4695 InterfaceID(InterfaceID), PreviousGeneration(PreviousGeneration) {
4697 for (
auto *Cat :
Interface->known_categories()) {
4698 if (Cat->getDeclName())
4699 NameCategoryMap[Cat->getDeclName()] = Cat;
4706 bool operator()(ModuleFile &M) {
4715 LocalDeclID LocalID =
4722 const ObjCCategoriesInfo
Compare = {LocalID, 0};
4723 const ObjCCategoriesInfo *
Result = std::lower_bound(
4727 LocalID !=
Result->getDefinitionID()) {
4735 unsigned Offset =
Result->Offset;
4738 for (
unsigned I = 0; I != N; ++I)
4747 unsigned PreviousGeneration) {
4748 ObjCCategoriesVisitor Visitor(*
this, D, CategoriesDeserialized, ID,
4749 PreviousGeneration);
4750 ModuleMgr.visit(Visitor);
4753template<
typename DeclT,
typename Fn>
4762 for (
auto *Redecl = MostRecent; Redecl && !
Found;
4763 Redecl = Redecl->getPreviousDecl())
4764 Found = (Redecl == D);
4768 for (
auto *Redecl = MostRecent; Redecl != D;
4775 while (Record.getIdx() < Record.size()) {
4779 Decl *MD = Record.readDecl();
4780 assert(MD &&
"couldn't read decl from update record");
4781 Reader.PendingAddedClassMembers.push_back({RD, MD});
4786 auto *Anon = readDeclAs<NamespaceDecl>();
4791 if (!Record.isModule()) {
4792 if (
auto *TU = dyn_cast<TranslationUnitDecl>(D))
4793 TU->setAnonymousNamespace(Anon);
4802 VD->NonParmVarDeclBits.IsInline = Record.readInt();
4803 VD->NonParmVarDeclBits.IsInlineSpecified = Record.readInt();
4810 if (
auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D)) {
4811 VTSD->setPointOfInstantiation(POI);
4812 }
else if (
auto *VD = dyn_cast<VarDecl>(D)) {
4814 assert(MSInfo &&
"No member specialization information");
4818 if (
auto *FTSInfo = dyn_cast<FunctionTemplateSpecializationInfo *>(
4819 FD->TemplateOrSpecialization))
4820 FTSInfo->setPointOfInstantiation(POI);
4823 ->setPointOfInstantiation(POI);
4834 auto *DefaultArg = Record.readExpr();
4838 if (Param->hasUninstantiatedDefaultArg())
4839 Param->setDefaultArg(DefaultArg);
4845 auto *DefaultInit = Record.readExpr();
4849 if (FD->hasInClassInitializer() && !FD->hasNonNullInClassInitializer()) {
4851 FD->setInClassInitializer(DefaultInit);
4855 FD->removeInClassInitializer();
4862 if (Reader.PendingBodies[FD]) {
4868 if (Record.readInt()) {
4876 FD->setInnerLocStart(readSourceLocation());
4878 assert(Record.getIdx() == Record.size() &&
"lazy body must be last");
4885 bool HadRealDefinition =
4886 OldDD && (OldDD->Definition != RD ||
4887 !Reader.PendingFakeDefinitionData.count(OldDD));
4891 ReadCXXRecordDefinition(RD,
true);
4894 uint64_t LexicalOffset = ReadLocalOffset();
4895 if (!HadRealDefinition && LexicalOffset) {
4896 Record.readLexicalDeclContextStorage(LexicalOffset, RD);
4897 Reader.PendingFakeDefinitionData.erase(OldDD);
4904 MSInfo->setTemplateSpecializationKind(TSK);
4905 MSInfo->setPointOfInstantiation(POI);
4908 Spec->setTemplateSpecializationKind(TSK);
4909 Spec->setPointOfInstantiation(POI);
4911 if (Record.readInt()) {
4913 readDeclAs<ClassTemplatePartialSpecializationDecl>();
4915 Record.readTemplateArgumentList(TemplArgs);
4917 Reader.getContext(), TemplArgs);
4922 Spec->getSpecializedTemplateOrPartial()))
4923 Spec->setInstantiationOf(PartialSpec, TemplArgList);
4932 if (Record.readInt()) {
4934 Record.readAttributes(Attrs);
4938 D->setAttrsImpl(Attrs, Reader.getContext());
4948 auto *Del = readDeclAs<FunctionDecl>();
4949 auto *ThisArg = Record.readExpr();
4952 if (!
C.dtorHasOperatorDelete(Dtor,
4954 C.addOperatorDeleteForVDtor(Dtor, Del,
4956 Canon->OperatorDeleteThisArg = ThisArg;
4962 auto *Del = readDeclAs<FunctionDecl>();
4965 if (!
C.dtorHasOperatorDelete(
4967 C.addOperatorDeleteForVDtor(
4972 auto *Del = readDeclAs<FunctionDecl>();
4976 C.addOperatorDeleteForVDtor(Dtor, Del,
4981 auto *Del = readDeclAs<FunctionDecl>();
4984 if (!
C.dtorHasOperatorDelete(Dtor,
4986 C.addOperatorDeleteForVDtor(
4993 auto ESI = Record.readExceptionSpecInfo(ExceptionStorage);
5001 FD->setType(Reader.getContext().getFunctionType(
5002 FPT->getReturnType(), FPT->getParamTypes(),
5003 FPT->getExtProtoInfo().withExceptionSpec(ESI)));
5007 Reader.PendingExceptionSpecUpdates.insert(
5008 std::make_pair(FD->getCanonicalDecl(), FD));
5015 QualType DeducedResultType = Record.readType();
5016 Reader.PendingDeducedTypeUpdates.insert(
5017 {FD->getCanonicalDecl(), DeducedResultType});
5037 D->
addAttr(OMPThreadPrivateDeclAttr::CreateImplicit(Reader.getContext(),
5038 readSourceRange()));
5042 auto AllocatorKind =
5043 static_cast<OMPAllocateDeclAttr::AllocatorTypeTy
>(Record.readInt());
5044 Expr *Allocator = Record.readExpr();
5045 Expr *Alignment = Record.readExpr();
5047 D->
addAttr(OMPAllocateDeclAttr::CreateImplicit(
5048 Reader.getContext(), AllocatorKind, Allocator, Alignment, SR));
5053 D->
addAttr(OMPTargetIndirectCallAttr::CreateImplicit(Reader.getContext(),
5054 readSourceRange()));
5061 Reader.getContext().mergeDefinitionIntoModule(Exported, Owner);
5062 Reader.PendingMergedDefinitionsToDeduplicate.insert(Exported);
5067 auto MapType = Record.readEnum<OMPDeclareTargetDeclAttr::MapTypeTy>();
5068 auto DevType = Record.readEnum<OMPDeclareTargetDeclAttr::DevTypeTy>();
5069 Expr *IndirectE = Record.readExpr();
5070 bool Indirect = Record.readBool();
5071 unsigned Level = Record.readInt();
5072 D->
addAttr(OMPDeclareTargetDeclAttr::CreateImplicit(
5073 Reader.getContext(), MapType, DevType, IndirectE, Indirect, Level,
5074 readSourceRange()));
5080 Record.readAttributes(Attrs);
5081 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 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)
static NamedDecl * getDeclForMerging(NamedDecl *Found, bool IsTypedefNameForLinkage, bool FilteringUsingShadowDecl)
Find the declaration that should be merged into, given the declaration found by name lookup.
Defines the clang::attr::Kind enum.
clang::CharUnits operator*(clang::CharUnits::QuantityType Scale, const clang::CharUnits &CU)
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.
Result
Implement __builtin_bit_cast and related operations.
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)
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
const LangOptions & getLangOpts() const
void addDestruction(T *Ptr) const
If T isn't trivially destructible, calls AddDeallocation to register it for destruction.
ExternalASTSource * getExternalSource() const
Retrieve a pointer to the external AST source associated with this AST context, if any.
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 VisitExplicitInstantiationDecl(ExplicitInstantiationDecl *D)
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 VisitCXXExpansionStmtDecl(CXXExpansionStmtDecl *D)
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?
void VisitUsingDecl(UsingDecl *D)
void VisitObjCAtDefsFieldDecl(ObjCAtDefsFieldDecl *D)
void VisitVarTemplatePartialSpecializationDecl(VarTemplatePartialSpecializationDecl *D)
TODO: Unify with ClassTemplatePartialSpecializationDecl version?
void VisitParmVarDecl(ParmVarDecl *PD)
void VisitVarTemplateDecl(VarTemplateDecl *D)
TODO: Unify with ClassTemplateDecl version?
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...
friend class ASTDeclReader
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.
void runWithSufficientStackSpace(SourceLocation Loc, llvm::function_ref< void()> Fn)
friend class ASTRecordReader
SmallVector< uint64_t, 64 > RecordData
serialization::ModuleFile ModuleFile
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)
void setColonLoc(SourceLocation CLoc)
Sets the location of the colon.
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)
void setCtorClosureDefaultArgs(ArrayRef< CXXDefaultArgExpr * > Args)
void setExplicitSpecifier(ExplicitSpecifier ES)
bool isInheritingConstructor() const
Determine whether this is an implicit constructor synthesized to model a call to a constructor inheri...
Represents a C++ conversion function within a class.
void setExplicitSpecifier(ExplicitSpecifier ES)
static CXXConversionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a C++ deduction guide declaration.
void setDeductionCandidateKind(DeductionCandidate K)
void setSourceDeductionGuide(CXXDeductionGuideDecl *DG)
static CXXDeductionGuideDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setSourceDeductionGuideKind(SourceDeductionGuideKind SK)
A default argument (C++ [dcl.fct.default]).
Represents a C++ destructor within a class.
static CXXDestructorDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
CXXDestructorDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Represents a C++26 expansion statement declaration.
static CXXExpansionStmtDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a static or instance method of a struct/union/class.
static CXXMethodDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
CXXMethodDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Represents a C++ struct/union/class.
CXXRecordDecl * getDefinition() const
static CXXRecordDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID)
unsigned getODRHash() const
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)
void setTemplateArgsAsWritten(const ASTTemplateArgumentListInfo *ArgsWritten)
Set the template argument list as written in the sources.
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)
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
lookup_result::iterator lookup_iterator
bool isFileContext() const
void setHasExternalVisibleStorage(bool ES=true) const
State whether this DeclContext has external storage for declarations visible in this context.
DeclContextLookupResult lookup_result
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name 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).
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.
@ VisiblePromoted
This declaration has an owning module, and is not visible to the current TU but we promoted it to be ...
@ 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.
IdentifierInfo * getAsIdentifierInfo() const
Retrieve the IdentifierInfo * stored in this declaration name, or null if this declaration name isn't...
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 an explicit instantiation of a template entity in source code.
static ExplicitInstantiationDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned TrailingFlags)
bool hasTrailingQualifier() const
bool hasTrailingArgsAsWritten() const
Represents a standard C++ module export declaration.
static ExportDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
This represents one expression.
RAII class for safely pairing a StartedDeserializing call with FinishedDeserializing.
Represents difference between two FPOptions values.
static FPOptionsOverride getFromOpaqueInt(storage_type I)
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, FPOptionsOverride FPFeatures, 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 ...
FunctionTemplateDecl * getTemplate() const
Retrieve the template from which this function was specialized.
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 begin(DeclarationName Name)
Returns an iterator over decls with the name 'Name'.
iterator end()
Returns the end iterator.
void setTemplateArguments(ArrayRef< TemplateArgument > Converted)
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.
void setLocStart(SourceLocation L)
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.
void setExternLoc(SourceLocation L)
void setLanguage(LinkageSpecLanguageIDs L)
Set the language specified by this linkage specification.
void setRBraceLoc(SourceLocation L)
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.
void setAnonymousNamespace(NamespaceDecl *D)
void setNested(bool Nested)
Set whether this is a nested namespace declaration.
void setInline(bool Inline)
Set whether this is an inline namespace declaration.
static NamespaceDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
A C++ nested-name-specifier augmented with source location information.
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
static NonTypeTemplateParmDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, bool HasTypeConstraint)
unsigned getNumExpansionTypes() const
Retrieves the number of expansion types in an expanded parameter pack.
bool isExpandedParameterPack() const
Whether this parameter is a non-type template parameter pack that has a known list of different types...
bool hasPlaceholderTypeConstraint() const
Determine whether this non-type template parameter's type has a placeholder with a type-constraint.
void setPlaceholderTypeConstraint(Expr *E)
void setDefaultArgument(const ASTContext &C, const TemplateArgumentLoc &DefArg)
Set the default argument for this template parameter, and whether that default argument was inherited...
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)
OMPChildren * Data
Data, associated with the directive.
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.
void setInitializerData(Expr *OrigE, Expr *PrivE)
Set initializer Orig and Priv vars.
void setInitializer(Expr *E, OMPDeclareReductionInitKind IK)
Set initializer expression for the declare reduction construct.
void setCombiner(Expr *E)
Set combiner expression for the declare reduction construct.
void setCombinerData(Expr *InE, Expr *OutE)
Set combiner In and Out vars.
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)
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)
void setClassInterface(ObjCInterfaceDecl *IFace)
ObjCImplementationDecl - Represents a class definition - this is where method definitions are specifi...
static ObjCImplementationDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setIvarLBraceLoc(SourceLocation Loc)
void setSuperClass(ObjCInterfaceDecl *superCls)
void setIvarRBraceLoc(SourceLocation Loc)
void setHasDestructors(bool val)
void setHasNonZeroConstructors(bool val)
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)
unsigned getODRHash()
Get precomputed ODRHash or add a new one.
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.
void setAtLoc(SourceLocation L)
void setPropertyImplementation(PropertyControl pc)
void setSetterName(Selector Sel, SourceLocation Loc=SourceLocation())
void setPropertyAttributes(ObjCPropertyAttribute::Kind PRVal)
static ObjCPropertyDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setPropertyAttributesAsWritten(ObjCPropertyAttribute::Kind PRVal)
void setLParenLoc(SourceLocation L)
void setPropertyIvarDecl(ObjCIvarDecl *Ivar)
void setSetterMethodDecl(ObjCMethodDecl *gDecl)
void setType(QualType T, TypeSourceInfo *TSI)
void setGetterName(Selector Sel, SourceLocation Loc=SourceLocation())
void setGetterMethodDecl(ObjCMethodDecl *gDecl)
ObjCPropertyImplDecl - Represents implementation declaration of a property in a class or category imp...
void setSetterMethodDecl(ObjCMethodDecl *MD)
void setSetterCXXAssignment(Expr *setterCXXAssignment)
static ObjCPropertyImplDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setGetterMethodDecl(ObjCMethodDecl *MD)
void setAtLoc(SourceLocation Loc)
void setPropertyDecl(ObjCPropertyDecl *Prop)
void setGetterCXXConstructor(Expr *getterCXXConstructor)
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.
unsigned getODRHash()
Get precomputed ODRHash or add a new one.
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.
void setNothrow(bool Nothrow=true)
static OutlinedFunctionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumParams)
void setParam(unsigned i, ImplicitParamDecl *P)
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.
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
RedeclarableTemplateDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this template.
void setMemberSpecialization()
Note that this member template is a specialization.
void setInstantiatedFromMemberTemplate(RedeclarableTemplateDecl *TD)
void setPrevious(decl_type *D)
Decl * getLatestNotUpdated() const
void setLatest(decl_type *D)
Provides common interface for the Decls that can be redeclared.
DeclLink RedeclLink
Points to the next redeclaration in the chain.
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.
bool isFirstDecl() const
True if this is the first declaration in its redeclaration chain.
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.).
TemplateParameterList * TemplateParams
void init(NamedDecl *NewTemplatedDecl)
Initialize the underlying templated declaration.
NamedDecl * getTemplatedDecl() const
Get the underlying, templated declaration.
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
A template parameter object.
TemplateParamObjectDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Stores a list of template parameters for a TemplateDecl and its derived classes.
TemplateTemplateParmDecl - Declares a template template parameter, e.g., "T" in.
unsigned getNumExpansionTemplateParameters() const
Retrieves the number of expansion template parameters in an expanded parameter pack.
static TemplateTemplateParmDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setDeclaredWithTypename(bool withTypename)
Set whether this template template parameter was declared with the 'typename' or 'class' keyword.
void setDefaultArgument(const ASTContext &C, const TemplateArgumentLoc &DefArg)
Set the default argument for this template parameter, and whether that default argument was inherited...
bool isExpandedParameterPack() const
Whether this parameter is a template template parameter pack that has a known list of different templ...
Declaration of a template type parameter.
void setTypeConstraint(ConceptReference *CR, Expr *ImmediatelyDeclaredConstraint, UnsignedOrNone ArgPackSubstIndex)
static TemplateTypeParmDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID)
bool hasTypeConstraint() const
Determine whether this template parameter has a type-constraint.
void setDefaultArgument(const ASTContext &C, const TemplateArgumentLoc &DefArg)
Set the default argument for this template parameter.
void setDeclaredWithTypename(bool withTypename)
Set whether this template type parameter was declared with the 'typename' or 'class' keyword.
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.
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.
void setUsingLoc(SourceLocation L)
Set the source location of the 'using' keyword.
static UnresolvedUsingValueDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a C++ using-declaration.
void setTypename(bool TN)
Sets whether the using declaration has 'typename'.
void setUsingLoc(SourceLocation L)
Set the source location of the 'using' keyword.
static UsingDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents C++ using-directive.
static UsingDirectiveDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a C++ using-enum-declaration.
void setEnumType(TypeSourceInfo *TSI)
void setEnumLoc(SourceLocation L)
void setUsingLoc(SourceLocation L)
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.
VarDecl * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
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...
void setTemplateArgsAsWritten(const ASTTemplateArgumentListInfo *ArgsWritten)
Set the template argument list as written in the sources.
static VarTemplateSpecializationDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
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.
ModuleKind Kind
The type of this module.
SmallVector< uint64_t, 1 > ObjCCategories
The Objective-C category lists for categories known to this module.
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_EXPANSION_STMT
A C++ expansion statement.
@ 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_EXPLICIT_INSTANTIATION
An ExplicitInstantiationDecl 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.
@ Number
Just a number, nothing else.
ComparisonCategoryResult Compare(const T &X, const T &Y)
Helper to compare two comparable types.
std::variant< struct RequiresDecl, struct HeaderDecl, struct UmbrellaDirDecl, struct ModuleDecl, struct ExcludeDecl, struct ExportDecl, struct ExportAsDecl, struct ExternModuleDecl, struct UseDecl, struct LinkDecl, struct ConfigMacrosDecl, struct ConflictDecl > Decl
All declarations that can appear in a module declaration.
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...
uint64_t TypeID
An ID number that refers to a type in an AST file.
@ MK_MainFile
File is a PCH file treated as the actual main file.
uint32_t SubmoduleID
An ID number that refers to a submodule in a module file.
bool isPartOfPerModuleInitializer(const Decl *D)
Determine whether the given declaration will be included in the per-module initializer if it needs to...
@ DeclMarkedOpenMPThreadPrivate
@ CXXResolvedDtorGlobArrayDelete
@ CXXInstantiatedClassDefinition
@ CXXResolvedExceptionSpec
@ CXXResolvedDtorArrayDelete
@ CXXInstantiatedDefaultArgument
@ CXXInstantiatedDefaultMemberInitializer
@ CXXAddedAnonymousNamespace
@ CXXResolvedDtorGlobDelete
@ CXXAddedFunctionDefinition
@ CXXPointOfInstantiation
@ DeclMarkedOpenMPIndirectCall
@ DeclMarkedOpenMPDeclareTarget
@ DeclMarkedOpenMPAllocate
The JSON file list parser is used to communicate input to InstallAPI.
bool isa(CodeGen::Address addr)
SelectorLocationsKind
Whether all locations of the selector identifiers are in a "standard" position.
LazyOffsetPtr< Stmt, uint64_t, &ExternalASTSource::GetExternalDeclStmt > LazyDeclStmtPtr
A lazy pointer to a statement.
bool isUnresolvedExceptionSpec(ExceptionSpecificationType ESpecType)
ConstexprSpecKind
Define the kind of constexpr specifier.
LinkageSpecLanguageIDs
Represents the language in a linkage specification.
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...
SmallVector< Attr *, 4 > AttrVec
AttrVec - A vector of Attr, which is how they are stored on the AST.
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.
OptionalUnsigned< unsigned > UnsignedOrNone
@ 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.
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...
U cast(CodeGen::Address addr)
@ Interface
The "__interface" keyword introduces the elaborated-type-specifier.
@ Class
The "class" keyword introduces the elaborated-type-specifier.
@ Other
Other implicit parameter.
Represents an explicit template argument list in C++, e.g., the "<int>" in "sort<int>".
Structure used to store a statement, the constant value to which it was evaluated (if any),...
unsigned WasEvaluated
Whether this statement was already evaluated.
unsigned HasConstantInitialization
Whether this variable is known to have constant initialization.
unsigned CheckedForSideEffects
unsigned HasConstantDestruction
Whether this variable is known to have constant destruction.
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 ...
uint16_t Part2
...-89ab-...
uint32_t Part1
{01234567-...
uint16_t Part3
...-cdef-...
uint8_t Part4And5[8]
...-0123-456789abcdef}
static constexpr OptionalUnsigned fromInternalRepresentation(underlying_type Rep)
llvm::DenseSet< std::tuple< Decl *, Decl *, int > > NonEquivalentDeclSet
Store declaration pairs already found to be non-equivalent.
uint64_t ModuleLocalOffset