58#include "llvm/ADT/DenseMap.h"
59#include "llvm/ADT/FoldingSet.h"
60#include "llvm/ADT/SmallPtrSet.h"
61#include "llvm/ADT/SmallVector.h"
62#include "llvm/ADT/iterator_range.h"
63#include "llvm/Bitstream/BitstreamReader.h"
64#include "llvm/Support/ErrorHandling.h"
65#include "llvm/Support/SaveAndRestore.h"
82class RedeclarableResult {
88 RedeclarableResult(Decl *MergeWith, GlobalDeclID FirstID,
bool IsKeyDecl)
89 : MergeWith(MergeWith), FirstID(FirstID), IsKeyDecl(IsKeyDecl) {}
92 GlobalDeclID getFirstID()
const {
return FirstID; }
95 bool isKeyDecl()
const {
return IsKeyDecl; }
99 Decl *getKnownMergeTarget()
const {
return MergeWith; }
117 template <
typename T>
121 template <
typename T>
123 RedeclarableResult &Redecl) {
125 D, Existing, Redecl.isKeyDecl() ? Redecl.getFirstID() :
GlobalDeclID());
132 struct CXXRecordDecl::DefinitionData &&NewDD);
134 struct ObjCInterfaceDecl::DefinitionData &&NewDD);
136 struct ObjCProtocolDecl::DefinitionData &&NewDD);
149 ASTReader::RecordLocation Loc;
155 TypeID DeferredTypeID = 0;
156 unsigned AnonymousDeclNumber = 0;
163 bool IsDeclMarkedUsed =
false;
165 uint64_t GetCurrentCursorOffset();
167 uint64_t ReadLocalOffset() {
168 uint64_t LocalOffset = Record.readInt();
169 assert(LocalOffset < Loc.Offset &&
"offset point after current record");
170 return LocalOffset ? Loc.Offset - LocalOffset : 0;
173 uint64_t ReadGlobalOffset() {
174 uint64_t
Local = ReadLocalOffset();
175 return Local ? Record.getGlobalBitOffset(
Local) : 0;
178 SourceLocation readSourceLocation() {
return Record.readSourceLocation(); }
180 SourceRange readSourceRange() {
return Record.readSourceRange(); }
182 TypeSourceInfo *readTypeSourceInfo() {
return Record.readTypeSourceInfo(); }
184 GlobalDeclID readDeclID() {
return Record.readDeclID(); }
186 std::string readString() {
return Record.readString(); }
188 Decl *readDecl() {
return Record.readDecl(); }
190 template <
typename T>
T *readDeclAs() {
return Record.readDeclAs<
T>(); }
193 if (Record.getIdx() == Record.size())
196 return Record.getGlobalSubmoduleID(Record.readInt());
199 Module *readModule() {
return Record.getSubmodule(readSubmoduleID()); }
202 Decl *LambdaContext =
nullptr,
203 unsigned IndexInLambdaContext = 0);
204 void ReadCXXDefinitionData(
struct CXXRecordDecl::DefinitionData &
Data,
206 unsigned IndexInLambdaContext);
207 void ReadObjCDefinitionData(
struct ObjCInterfaceDecl::DefinitionData &
Data);
208 void ReadObjCDefinitionData(
struct ObjCProtocolDecl::DefinitionData &
Data);
229 class FindExistingResult {
233 bool AddResult =
false;
234 unsigned AnonymousDeclNumber = 0;
238 FindExistingResult(
ASTReader &Reader) : Reader(Reader) {}
241 unsigned AnonymousDeclNumber,
243 : Reader(Reader),
New(
New), Existing(Existing), AddResult(
true),
244 AnonymousDeclNumber(AnonymousDeclNumber),
245 TypedefNameForLinkage(TypedefNameForLinkage) {}
247 FindExistingResult(FindExistingResult &&
Other)
249 AddResult(
Other.AddResult),
250 AnonymousDeclNumber(
Other.AnonymousDeclNumber),
251 TypedefNameForLinkage(
Other.TypedefNameForLinkage) {
252 Other.AddResult =
false;
255 FindExistingResult &operator=(FindExistingResult &&) =
delete;
256 ~FindExistingResult();
260 void suppress() { AddResult =
false; }
262 operator NamedDecl *()
const {
return Existing; }
264 template <
typename T>
operator T *()
const {
265 return dyn_cast_or_null<T>(Existing);
271 FindExistingResult findExisting(
NamedDecl *D);
277 : Reader(Reader), MergeImpl(Reader), Record(Record), Loc(Loc),
278 ThisDeclID(thisDeclID), ThisDeclLoc(ThisDeclLoc) {}
280 template <
typename DeclT>
285 template <
typename DeclT>
295 template <
typename DeclT>
300 template <
typename DeclT>
305 llvm::BitstreamCursor &DeclsCursor,
bool IsPartial);
314 Cat->NextClassCategory =
Next;
422 template <
typename T>
425 template <
typename T>
429 RedeclarableResult &Redecl);
465template <
typename DeclT>
class MergedRedeclIterator {
466 DeclT *Start =
nullptr;
467 DeclT *Canonical =
nullptr;
468 DeclT *Current =
nullptr;
471 MergedRedeclIterator() =
default;
472 MergedRedeclIterator(DeclT *Start) : Start(Start), Current(Start) {}
476 MergedRedeclIterator &operator++() {
477 if (Current->isFirstDecl()) {
479 Current = Current->getMostRecentDecl();
481 Current = Current->getPreviousDecl();
487 if (Current == Start || Current == Canonical)
492 friend bool operator!=(
const MergedRedeclIterator &A,
493 const MergedRedeclIterator &B) {
494 return A.Current != B.Current;
500template <
typename DeclT>
501static llvm::iterator_range<MergedRedeclIterator<DeclT>>
503 return llvm::make_range(MergedRedeclIterator<DeclT>(D),
504 MergedRedeclIterator<DeclT>());
507uint64_t ASTDeclReader::GetCurrentCursorOffset() {
508 return Loc.F->DeclsCursor.GetCurrentBitNo() + Loc.F->GlobalBitOffset;
512 if (Record.readInt()) {
513 Reader.DefinitionSource[FD] =
515 Reader.getContext().getLangOpts().BuildingPCHWithObjectFile;
517 if (
auto *CD = dyn_cast<CXXConstructorDecl>(FD)) {
518 CD->setNumCtorInitializers(Record.readInt());
519 if (CD->getNumCtorInitializers())
520 CD->CtorInitializers = ReadGlobalOffset();
523 Reader.PendingBodies[FD] = GetCurrentCursorOffset();
526 Reader.ThisDeclarationWasADefinitionSet.insert(FD);
535 IsDeclMarkedUsed =
false;
537 if (
auto *DD = dyn_cast<DeclaratorDecl>(D)) {
538 if (
auto *TInfo = DD->getTypeSourceInfo())
539 Record.readTypeLoc(TInfo->getTypeLoc());
542 if (
auto *TD = dyn_cast<TypeDecl>(D)) {
545 assert(DeferredTypeID == 0 &&
546 "Deferred type not used for TagDecls and Typedefs");
548 TD->setTypeForDecl(Reader.GetType(DeferredTypeID).getTypePtrOrNull());
552 if (NamedDeclForTagDecl.isValid())
555 }
else if (
auto *ID = dyn_cast<ObjCInterfaceDecl>(D)) {
557 ID->TypeForDecl = Reader.GetType(DeferredTypeID).getTypePtrOrNull();
558 }
else if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
560 if (Record.readInt())
562 }
else if (
auto *VD = dyn_cast<VarDecl>(D)) {
564 }
else if (
auto *FD = dyn_cast<FieldDecl>(D)) {
565 if (FD->hasInClassInitializer() && Record.readInt()) {
566 FD->setLazyInClassInitializer(
LazyDeclStmtPtr(GetCurrentCursorOffset()));
573 auto ModuleOwnership =
577 IsDeclMarkedUsed |= D->Used;
580 bool HasStandaloneLexicalDC = DeclBits.
getNextBit();
594 GlobalDeclID SemaDCIDForTemplateParmDecl = readDeclID();
597 if (LexicalDCIDForTemplateParmDecl.
isInvalid())
598 LexicalDCIDForTemplateParmDecl = SemaDCIDForTemplateParmDecl;
599 Reader.addPendingDeclContextInfo(D,
600 SemaDCIDForTemplateParmDecl,
601 LexicalDCIDForTemplateParmDecl);
604 auto *SemaDC = readDeclAs<DeclContext>();
606 HasStandaloneLexicalDC ? readDeclAs<DeclContext>() :
nullptr;
612 if (
auto *RD = dyn_cast<CXXRecordDecl>(SemaDC))
613 MergedSemaDC = getOrFakePrimaryClassDefinition(Reader, RD);
615 MergedSemaDC = Reader.MergedDeclContexts.
lookup(SemaDC);
618 D->setDeclContextsImpl(MergedSemaDC ? MergedSemaDC : SemaDC, LexicalDC,
619 Reader.getContext());
625 Record.readAttributes(Attrs);
628 D->setAttrsImpl(Attrs, Reader.getContext());
636 switch (ModuleOwnership) {
655 }
else if (Reader.getContext().getLangOpts().ModulesLocalVisibility) {
663 Reader.HiddenNamesMap[Owner].push_back(D);
665 }
else if (ModulePrivate) {
674 std::string Arg = readString();
675 memcpy(D->getTrailingObjects(), Arg.data(), Arg.size());
676 D->getTrailingObjects()[Arg.size()] =
'\0';
682 std::string Name = readString();
683 memcpy(D->getTrailingObjects(), Name.data(), Name.size());
684 D->getTrailingObjects()[Name.size()] =
'\0';
686 D->ValueStart = Name.size() + 1;
687 std::string
Value = readString();
688 memcpy(D->getTrailingObjects() + D->ValueStart,
Value.data(),
Value.size());
689 D->getTrailingObjects()[D->ValueStart +
Value.size()] =
'\0';
693 llvm_unreachable(
"Translation units are not serialized");
699 AnonymousDeclNumber = Record.readInt();
707 DeferredTypeID = Record.getGlobalTypeID(Record.readInt());
714 if (Record.readInt()) {
715 QualType modedT = Record.readType();
734 if (
auto *
Template = readDeclAs<TypeAliasTemplateDecl>())
760 auto *Info =
new (Reader.getContext()) TagDecl::ExtInfo();
761 Record.readQualifierInfo(*Info);
762 TD->TypedefNameDeclOrQualifier = Info;
766 NamedDeclForTagDecl = readDeclID();
767 TypedefNameForLinkage = Record.readIdentifier();
770 llvm_unreachable(
"unexpected tag info kind");
787 ED->setNumPositiveBits(EnumDeclBits.
getNextBits(8));
788 ED->setNumNegativeBits(EnumDeclBits.
getNextBits(8));
793 ED->setHasODRHash(
true);
794 ED->ODRHash = Record.readInt();
804 if (!D->isFromASTFile() && D->isCompleteDefinition()) {
811 Reader.MergedDeclContexts.insert(std::make_pair(ED, OldDef));
813 Reader.mergeDefinitionVisibility(OldDef, ED);
818 Reader.PendingEnumOdrMergeFailures[OldDef].push_back(ED);
824 if (
auto *InstED = readDeclAs<EnumDecl>()) {
827 ED->setInstantiationOfMemberEnum(Reader.getContext(), InstED, TSK);
856 RD->setODRHash(Record.readInt());
862 RecordDecl *&OldDef = Reader.RecordDefinitions[Canon];
867 if (!D->isFromASTFile() && D->isCompleteDefinition()) {
874 Reader.MergedDeclContexts.insert(std::make_pair(RD, OldDef));
876 Reader.mergeDefinitionVisibility(OldDef, RD);
878 Reader.PendingRecordOdrMergeFailures[OldDef].push_back(RD);
891 DeferredTypeID = Record.getGlobalTypeID(Record.readInt());
893 VD->
setType(Record.readType());
898 if (Record.readInt())
900 ECD->
setInitVal(Reader.getContext(), Record.readAPSInt());
907 if (Record.readInt()) {
908 auto *Info =
new (Reader.getContext()) DeclaratorDecl::ExtInfo();
909 Record.readQualifierInfo(*Info);
915 QualType TSIType = Record.readType();
917 TSIType.
isNull() ?
nullptr
918 : Reader.getContext().CreateTypeSourceInfo(TSIType));
933 auto *
Template = readDeclAs<FunctionTemplateDecl>();
939 auto *InstFD = readDeclAs<FunctionDecl>();
942 FD->setInstantiationOfMemberFunction(Reader.getContext(), InstFD, TSK);
947 auto *
Template = readDeclAs<FunctionTemplateDecl>();
952 Record.readTemplateArgumentList(TemplArgs,
true);
956 bool HasTemplateArgumentsAsWritten = Record.readBool();
957 if (HasTemplateArgumentsAsWritten)
958 Record.readTemplateArgumentListInfo(TemplArgsWritten);
967 if (Record.readInt()) {
968 auto *FD = readDeclAs<FunctionDecl>();
979 HasTemplateArgumentsAsWritten ? &TemplArgsWritten :
nullptr, POI,
981 FD->TemplateOrSpecialization = FTInfo;
986 auto *CanonTemplate = readDeclAs<FunctionTemplateDecl>();
992 llvm::FoldingSetNodeID ID;
994 llvm::FoldingSetInsertToken InsertToken;
1009 unsigned NumCandidates = Record.readInt();
1010 while (NumCandidates--)
1011 Candidates.
addDecl(readDeclAs<NamedDecl>());
1015 bool HasTemplateArgumentsAsWritten = Record.readBool();
1016 if (HasTemplateArgumentsAsWritten)
1017 Record.readTemplateArgumentListInfo(TemplArgsWritten);
1020 Reader.getContext(), Candidates,
1021 HasTemplateArgumentsAsWritten ? &TemplArgsWritten :
nullptr);
1040 Reader.PendingDeducedFunctionTypes.push_back({FD, DeferredTypeID});
1042 FD->
setType(Reader.GetType(DeferredTypeID));
1046 FD->DNLoc = Record.readDeclarationNameLoc(FD->
getDeclName());
1062 const bool Pure = FunctionDeclBits.
getNextBit();
1083 FD->EndRangeLoc = readSourceLocation();
1087 FD->ODRHash = Record.readInt();
1088 FD->setHasODRHash(
true);
1094 if (
auto Info = Record.readInt()) {
1095 bool HasMessage = Info & 2;
1102 unsigned NumLookups = Record.readInt();
1104 for (
unsigned I = 0; I != NumLookups; ++I) {
1112 Reader.getContext(), Lookups, FPFeatures, DeletedMessage));
1117 MergeImpl.mergeRedeclarable(FD, Existing, Redecl);
1123 auto merge = [
this, &Redecl, FD](
auto &&F) {
1124 auto *Existing = cast_or_null<FunctionDecl>(Redecl.getKnownMergeTarget());
1125 RedeclarableResult NewRedecl(Existing ? F(Existing) :
nullptr,
1126 Redecl.getFirstID(), Redecl.isKeyDecl());
1144 unsigned NumParams = Record.readInt();
1146 Params.reserve(NumParams);
1147 for (
unsigned I = 0; I != NumParams; ++I)
1148 Params.push_back(readDeclAs<ParmVarDecl>());
1149 FD->setParams(Reader.getContext(), Params);
1154 if (FD->
hasAttr<SYCLKernelEntryPointAttr>()) {
1155 auto *SKEPAttr = FD->
getAttr<SYCLKernelEntryPointAttr>();
1157 const SYCLKernelInfo *SKI =
C.findSYCLKernelInfo(SKEPAttr->getKernelName());
1160 Reader.Diag(FD->
getLocation(), diag::err_sycl_kernel_name_conflict)
1163 diag::note_previous_declaration);
1164 SKEPAttr->setInvalidAttr();
1167 C.registerSYCLEntryPointFunction(FD);
1174 if (Record.readInt()) {
1177 Reader.PendingBodies[MD] = GetCurrentCursorOffset();
1180 MD->
setCmdDecl(readDeclAs<ImplicitParamDecl>());
1192 Reader.getContext().setObjCMethodRedeclaration(MD,
1193 readDeclAs<ObjCMethodDecl>());
1201 MD->DeclEndLoc = readSourceLocation();
1202 unsigned NumParams = Record.readInt();
1204 Params.reserve(NumParams);
1205 for (
unsigned I = 0; I != NumParams; ++I)
1206 Params.push_back(readDeclAs<ParmVarDecl>());
1209 unsigned NumStoredSelLocs = Record.readInt();
1211 SelLocs.reserve(NumStoredSelLocs);
1212 for (
unsigned i = 0; i != NumStoredSelLocs; ++i)
1213 SelLocs.push_back(readSourceLocation());
1215 MD->setParamsAndSelLocs(Reader.getContext(), Params, SelLocs);
1221 D->Variance = Record.readInt();
1222 D->Index = Record.readInt();
1223 D->VarianceLoc = readSourceLocation();
1224 D->ColonLoc = readSourceLocation();
1234 unsigned numParams = Record.readInt();
1239 typeParams.reserve(numParams);
1240 for (
unsigned i = 0; i != numParams; ++i) {
1241 auto *typeParam = readDeclAs<ObjCTypeParamDecl>();
1245 typeParams.push_back(typeParam);
1252 typeParams, rAngleLoc);
1255void ASTDeclReader::ReadObjCDefinitionData(
1256 struct ObjCInterfaceDecl::DefinitionData &
Data) {
1258 Data.SuperClassTInfo = readTypeSourceInfo();
1260 Data.EndLoc = readSourceLocation();
1261 Data.HasDesignatedInitializers =
Record.readInt();
1263 Data.HasODRHash =
true;
1266 unsigned NumProtocols =
Record.readInt();
1268 Protocols.reserve(NumProtocols);
1269 for (
unsigned I = 0; I != NumProtocols; ++I)
1270 Protocols.push_back(readDeclAs<ObjCProtocolDecl>());
1272 ProtoLocs.reserve(NumProtocols);
1273 for (
unsigned I = 0; I != NumProtocols; ++I)
1274 ProtoLocs.push_back(readSourceLocation());
1275 Data.ReferencedProtocols.set(Protocols.data(), NumProtocols, ProtoLocs.data(),
1279 NumProtocols =
Record.readInt();
1281 Protocols.reserve(NumProtocols);
1282 for (
unsigned I = 0; I != NumProtocols; ++I)
1283 Protocols.push_back(readDeclAs<ObjCProtocolDecl>());
1284 Data.AllReferencedProtocols.set(Protocols.data(), NumProtocols,
1290 struct ObjCInterfaceDecl::DefinitionData &DD = D->data();
1291 if (DD.Definition == NewDD.Definition)
1294 Reader.MergedDeclContexts.insert(
1295 std::make_pair(NewDD.Definition, DD.Definition));
1296 Reader.mergeDefinitionVisibility(DD.Definition, NewDD.Definition);
1299 Reader.PendingObjCInterfaceOdrMergeFailures[DD.Definition].push_back(
1300 {NewDD.Definition, &NewDD});
1306 DeferredTypeID = Record.getGlobalTypeID(Record.readInt());
1310 if (Record.readInt()) {
1312 ID->allocateDefinitionData();
1314 ReadObjCDefinitionData(ID->data());
1316 if (Canon->Data.getPointer()) {
1319 MergeImpl.MergeDefinitionData(Canon, std::move(ID->data()));
1320 ID->Data = Canon->Data;
1324 ID->getCanonicalDecl()->Data = ID->Data;
1327 ID->setIvarList(
nullptr);
1331 Reader.PendingDefinitions.insert(ID);
1334 Reader.ObjCClassesLoaded.push_back(ID);
1336 ID->Data = ID->getCanonicalDecl()->Data;
1345 bool synth = Record.readInt();
1360 if (PrevIvar && PrevIvar != IVD) {
1361 auto *ParentExt = dyn_cast<ObjCCategoryDecl>(IVD->
getDeclContext());
1362 auto *PrevParentExt =
1364 if (ParentExt && PrevParentExt) {
1368 .PendingObjCExtensionIvarRedeclarations[std::make_pair(ParentExt,
1370 .push_back(std::make_pair(IVD, PrevIvar));
1371 }
else if (ParentExt || PrevParentExt) {
1375 Reader.Diag(IVD->
getLocation(), diag::err_duplicate_ivar_declaration)
1377 Reader.Diag(PrevIvar->
getLocation(), diag::note_previous_definition);
1382void ASTDeclReader::ReadObjCDefinitionData(
1383 struct ObjCProtocolDecl::DefinitionData &
Data) {
1384 unsigned NumProtoRefs =
Record.readInt();
1386 ProtoRefs.reserve(NumProtoRefs);
1387 for (
unsigned I = 0; I != NumProtoRefs; ++I)
1388 ProtoRefs.push_back(readDeclAs<ObjCProtocolDecl>());
1390 ProtoLocs.reserve(NumProtoRefs);
1391 for (
unsigned I = 0; I != NumProtoRefs; ++I)
1392 ProtoLocs.push_back(readSourceLocation());
1393 Data.ReferencedProtocols.set(ProtoRefs.data(), NumProtoRefs,
1396 Data.HasODRHash =
true;
1401 struct ObjCProtocolDecl::DefinitionData &DD = D->data();
1402 if (DD.Definition == NewDD.Definition)
1405 Reader.MergedDeclContexts.insert(
1406 std::make_pair(NewDD.Definition, DD.Definition));
1407 Reader.mergeDefinitionVisibility(DD.Definition, NewDD.Definition);
1410 Reader.PendingObjCProtocolOdrMergeFailures[DD.Definition].push_back(
1411 {NewDD.Definition, &NewDD});
1419 if (Record.readInt()) {
1421 PD->allocateDefinitionData();
1423 ReadObjCDefinitionData(PD->data());
1426 if (Canon->Data.getPointer()) {
1429 MergeImpl.MergeDefinitionData(Canon, std::move(PD->data()));
1430 PD->Data = Canon->Data;
1437 Reader.PendingDefinitions.insert(PD);
1456 Reader.CategoriesDeserialized.insert(CD);
1458 CD->ClassInterface = readDeclAs<ObjCInterfaceDecl>();
1460 unsigned NumProtoRefs = Record.readInt();
1462 ProtoRefs.reserve(NumProtoRefs);
1463 for (
unsigned I = 0; I != NumProtoRefs; ++I)
1464 ProtoRefs.push_back(readDeclAs<ObjCProtocolDecl>());
1466 ProtoLocs.reserve(NumProtoRefs);
1467 for (
unsigned I = 0; I != NumProtoRefs; ++I)
1468 ProtoLocs.push_back(readSourceLocation());
1470 Reader.getContext());
1476 Reader.getContext());
1514 D->CategoryNameLoc = readSourceLocation();
1520 D->SuperLoc = readSourceLocation();
1525 D->NumIvarInitializers = Record.readInt();
1526 if (D->NumIvarInitializers)
1527 D->IvarInitializers = ReadGlobalOffset();
1534 D->PropertyIvarDecl = readDeclAs<ObjCIvarDecl>();
1535 D->IvarLoc = readSourceLocation();
1544 FD->Mutable = Record.readInt();
1546 unsigned Bits = Record.readInt();
1547 FD->StorageKind = Bits >> 1;
1548 if (FD->StorageKind == FieldDecl::ISK_CapturedVLAType)
1556 if (
auto *Tmpl = readDeclAs<FieldDecl>())
1557 Reader.getContext().setInstantiatedFromUnnamedFieldDecl(FD, Tmpl);
1564 PD->GetterId = Record.readIdentifier();
1565 PD->SetterId = Record.readIdentifier();
1570 D->PartVal.
Part1 = Record.readInt();
1571 D->PartVal.
Part2 = Record.readInt();
1572 D->PartVal.
Part3 = Record.readInt();
1574 C = Record.readInt();
1577 if (
MSGuidDecl *Existing = Reader.getContext().MSGuidDecls.getOrInsert(D))
1584 D->Value = Record.readAPValue();
1588 Reader.getContext().UnnamedGlobalConstantDecls.getOrInsert(D))
1594 D->Value = Record.readAPValue();
1599 Reader.getContext().TemplateParamObjectDecls.getOrInsert(D))
1606 FD->ChainingSize = Record.readInt();
1607 assert(FD->ChainingSize >= 2 &&
"Anonymous chaining must be >= 2");
1608 FD->Chaining =
new (Reader.getContext())
NamedDecl*[FD->ChainingSize];
1610 for (
unsigned I = 0; I != FD->ChainingSize; ++I)
1611 FD->Chaining[I] = readDeclAs<NamedDecl>();
1622 bool DefGeneratedInModule = VarDeclBits.
getNextBit();
1627 bool HasDeducedType =
false;
1655 Reader.PendingDeducedVarTypes.push_back({VD, DeferredTypeID});
1657 VD->
setType(Reader.GetType(DeferredTypeID));
1667 if (DefGeneratedInModule) {
1668 Reader.DefinitionSource[VD] =
1670 Reader.getContext().getLangOpts().BuildingPCHWithObjectFile;
1673 if (VD->
hasAttr<BlocksAttr>()) {
1674 Expr *CopyExpr = Record.readExpr();
1676 Reader.getContext().setBlockVarCopyInit(VD, CopyExpr, Record.readInt());
1680 VarNotTemplate = 0,
VarTemplate, StaticDataMemberSpecialization
1682 switch ((VarKind)Record.readInt()) {
1683 case VarNotTemplate:
1694 case StaticDataMemberSpecialization: {
1695 auto *Tmpl = readDeclAs<VarDecl>();
1698 Reader.getContext().setInstantiatedFromStaticDataMember(VD, Tmpl, TSK,POI);
1708 if (uint64_t Val = Record.readInt()) {
1719 Context.addDestruction(&Eval->
Evaluated);
1725 if (Context.getLangOpts().EnableNewConstInterp &&
1727 Context.getInterpContext().registerRedecl(VD, Eval->
Evaluated);
1733 Eval->
Value = GetCurrentCursorOffset();
1744 unsigned scopeIndex = Record.readInt();
1746 unsigned isObjCMethodParam = ParmVarDeclBits.
getNextBit();
1747 unsigned scopeDepth = ParmVarDeclBits.
getNextBits(7);
1748 unsigned declQualifier = ParmVarDeclBits.
getNextBits(7);
1749 if (isObjCMethodParam) {
1750 assert(scopeDepth == 0);
1763 PD->ExplicitObjectParameterIntroducerLoc = Record.readSourceLocation();
1771 auto **BDs = DD->getTrailingObjects();
1772 for (
unsigned I = 0; I != DD->NumBindings; ++I) {
1773 BDs[I] = readDeclAs<BindingDecl>();
1774 BDs[I]->setDecomposedDecl(DD);
1780 BD->Binding = Record.readExpr();
1791 D->Ordinal = Record.readInt();
1795 D->Statement = Record.readStmt();
1800 BD->
setBody(cast_or_null<CompoundStmt>(Record.readStmt()));
1802 unsigned NumParams = Record.readInt();
1804 Params.reserve(NumParams);
1805 for (
unsigned I = 0; I != NumParams; ++I)
1806 Params.push_back(readDeclAs<ParmVarDecl>());
1815 bool capturesCXXThis = Record.readInt();
1816 unsigned numCaptures = Record.readInt();
1818 captures.reserve(numCaptures);
1819 for (
unsigned i = 0; i != numCaptures; ++i) {
1820 auto *
decl = readDeclAs<VarDecl>();
1821 unsigned flags = Record.readInt();
1822 bool byRef = (flags & 1);
1823 bool nested = (flags & 2);
1824 Expr *copyExpr = ((flags & 4) ? Record.readExpr() :
nullptr);
1828 BD->
setCaptures(Reader.getContext(), captures, capturesCXXThis);
1834 for (
unsigned I = 0; I < D->NumParams; ++I)
1835 D->
setParam(I, readDeclAs<ImplicitParamDecl>());
1837 D->
setBody(cast_or_null<Stmt>(Record.readStmt()));
1842 unsigned ContextParamPos = Record.readInt();
1845 for (
unsigned I = 0; I < CD->NumParams; ++I) {
1846 if (I != ContextParamPos)
1847 CD->
setParam(I, readDeclAs<ImplicitParamDecl>());
1862 D->RBraceLoc = readSourceLocation();
1877 D->LocStart = readSourceLocation();
1878 D->RBraceLoc = readSourceLocation();
1885 if (Redecl.getFirstID() == ThisDeclID)
1886 AnonNamespace = readDeclID();
1890 if (AnonNamespace.
isValid()) {
1895 if (!Record.isModule())
1904 D->IsCBuffer = Record.readBool();
1905 D->KwLoc = readSourceLocation();
1906 D->LBraceLoc = readSourceLocation();
1907 D->RBraceLoc = readSourceLocation();
1913 D->NamespaceLoc = readSourceLocation();
1914 D->IdentLoc = readSourceLocation();
1915 D->QualifierLoc = Record.readNestedNameSpecifierLoc();
1916 D->Namespace = readDeclAs<NamespaceBaseDecl>();
1923 D->QualifierLoc = Record.readNestedNameSpecifierLoc();
1924 D->DNLoc = Record.readDeclarationNameLoc(D->
getDeclName());
1925 D->FirstUsingShadow.setPointer(readDeclAs<UsingShadowDecl>());
1927 if (
auto *Pattern = readDeclAs<NamedDecl>())
1928 Reader.getContext().setInstantiatedFromUsingDecl(D, Pattern);
1937 D->FirstUsingShadow.setPointer(readDeclAs<UsingShadowDecl>());
1938 if (
auto *Pattern = readDeclAs<UsingEnumDecl>())
1939 Reader.getContext().setInstantiatedFromUsingEnumDecl(D, Pattern);
1945 D->InstantiatedFrom = readDeclAs<NamedDecl>();
1946 auto **Expansions = D->getTrailingObjects();
1947 for (
unsigned I = 0; I != D->NumExpansions; ++I)
1948 Expansions[I] = readDeclAs<NamedDecl>();
1955 D->Underlying = readDeclAs<NamedDecl>();
1957 D->UsingOrNextShadow = readDeclAs<NamedDecl>();
1958 auto *Pattern = readDeclAs<UsingShadowDecl>();
1960 Reader.getContext().setInstantiatedFromUsingShadowDecl(D, Pattern);
1967 D->NominatedBaseClassShadowDecl = readDeclAs<ConstructorUsingShadowDecl>();
1968 D->ConstructedBaseClassShadowDecl = readDeclAs<ConstructorUsingShadowDecl>();
1969 D->IsVirtual = Record.readInt();
1974 D->UsingLoc = readSourceLocation();
1975 D->NamespaceLoc = readSourceLocation();
1976 D->QualifierLoc = Record.readNestedNameSpecifierLoc();
1977 D->NominatedNamespace = readDeclAs<NamedDecl>();
1978 D->CommonAncestor = readDeclAs<DeclContext>();
1984 D->QualifierLoc = Record.readNestedNameSpecifierLoc();
1985 D->DNLoc = Record.readDeclarationNameLoc(D->
getDeclName());
1986 D->EllipsisLoc = readSourceLocation();
1993 D->TypenameLocation = readSourceLocation();
1994 D->QualifierLoc = Record.readNestedNameSpecifierLoc();
1995 D->EllipsisLoc = readSourceLocation();
2004void ASTDeclReader::ReadCXXDefinitionData(
2006 Decl *LambdaContext,
unsigned IndexInLambdaContext) {
2010#define FIELD(Name, Width, Merge) \
2011 if (!CXXRecordDeclBits.canGetNextNBits(Width)) \
2012 CXXRecordDeclBits.updateValue(Record.readInt()); \
2013 Data.Name = CXXRecordDeclBits.getNextBits(Width);
2015#include "clang/AST/CXXRecordDeclDefinitionBits.def"
2020 Data.HasODRHash =
true;
2023 Reader.DefinitionSource[D] =
2024 Loc.F->
Kind == ModuleKind::MK_MainFile ||
2029 Data.ComputedVisibleConversions =
Record.readInt();
2030 if (
Data.ComputedVisibleConversions)
2031 Record.readUnresolvedSet(
Data.VisibleConversions);
2032 assert(
Data.Definition &&
"Data.Definition should be already set!");
2034 if (!
Data.IsLambda) {
2035 assert(!LambdaContext && !IndexInLambdaContext &&
2036 "given lambda context for non-lambda");
2040 Data.Bases = ReadGlobalOffset();
2044 Data.VBases = ReadGlobalOffset();
2048 using Capture = LambdaCapture;
2050 auto &Lambda =
static_cast<CXXRecordDecl::LambdaDefinitionData &
>(
Data);
2052 BitsUnpacker LambdaBits(Record.readInt());
2053 Lambda.DependencyKind = LambdaBits.getNextBits(2);
2054 Lambda.IsGenericLambda = LambdaBits.getNextBit();
2055 Lambda.CaptureDefault = LambdaBits.getNextBits(2);
2056 Lambda.NumCaptures = LambdaBits.getNextBits(15);
2057 Lambda.HasKnownInternalLinkage = LambdaBits.getNextBit();
2059 Lambda.NumExplicitCaptures = Record.readInt();
2060 Lambda.ManglingNumber = Record.readInt();
2061 if (
unsigned DeviceManglingNumber = Record.readInt())
2062 Reader.getContext().DeviceLambdaManglingNumbers[D] = DeviceManglingNumber;
2063 Lambda.IndexInContext = IndexInLambdaContext;
2064 Lambda.ContextDecl = LambdaContext;
2066 if (Lambda.NumCaptures) {
2067 ToCapture = (
Capture *)Reader.getContext().Allocate(
sizeof(
Capture) *
2068 Lambda.NumCaptures);
2069 Lambda.AddCaptureList(Reader.getContext(), ToCapture);
2071 Lambda.MethodTyInfo = readTypeSourceInfo();
2072 for (
unsigned I = 0, N = Lambda.NumCaptures; I != N; ++I) {
2073 SourceLocation Loc = readSourceLocation();
2074 BitsUnpacker CaptureBits(Record.readInt());
2075 bool IsImplicit = CaptureBits.getNextBit();
2083 Capture(Loc, IsImplicit, Kind,
nullptr, SourceLocation());
2088 auto *Var = readDeclAs<ValueDecl>();
2089 SourceLocation EllipsisLoc = readSourceLocation();
2090 new (ToCapture)
Capture(Loc, IsImplicit, Kind, Var, EllipsisLoc);
2099 CXXRecordDecl *D,
struct CXXRecordDecl::DefinitionData &&MergeDD) {
2100 assert(D->DefinitionData &&
2101 "merging class definition into non-definition");
2102 auto &DD = *D->DefinitionData;
2104 if (DD.Definition != MergeDD.Definition) {
2106 Reader.MergedDeclContexts.insert(std::make_pair(MergeDD.Definition,
2108 Reader.PendingDefinitions.erase(MergeDD.Definition);
2109 MergeDD.Definition->demoteThisDefinitionToDeclaration();
2110 Reader.mergeDefinitionVisibility(DD.Definition, MergeDD.Definition);
2111 assert(!Reader.Lookups.contains(MergeDD.Definition) &&
2112 "already loaded pending lookups for merged definition");
2115 auto PFDI = Reader.PendingFakeDefinitionData.find(&DD);
2116 if (PFDI != Reader.PendingFakeDefinitionData.end() &&
2117 PFDI->second == ASTReader::PendingFakeDefinitionKind::Fake) {
2120 assert(!DD.IsLambda &&
"faked up lambda definition?");
2127 if (MergeDD.IsLambda) {
2128 auto *Def = DD.Definition;
2129 MergeDD.Definition = Def;
2134 Reader.PendingFakeDefinitionData.erase(PFDI);
2135 for (
auto *R = Reader.getMostRecentExistingDecl(Def); R;
2136 R = R->getPreviousDecl())
2141 PFDI->second = ASTReader::PendingFakeDefinitionKind::FakeLoaded;
2145 auto *Def = DD.Definition;
2146 DD = std::move(MergeDD);
2147 DD.Definition = Def;
2148 for (
auto *R = Reader.getMostRecentExistingDecl(Def); R;
2149 R = R->getPreviousDecl())
2154 bool DetectedOdrViolation =
false;
2156 #define FIELD(Name, Width, Merge) Merge(Name)
2157 #define MERGE_OR(Field) DD.Field |= MergeDD.Field;
2158 #define NO_MERGE(Field) \
2159 DetectedOdrViolation |= DD.Field != MergeDD.Field; \
2161 #include "clang/AST/CXXRecordDeclDefinitionBits.def"
2166 if (DD.NumBases != MergeDD.NumBases || DD.NumVBases != MergeDD.NumVBases)
2167 DetectedOdrViolation =
true;
2173 if (MergeDD.ComputedVisibleConversions && !DD.ComputedVisibleConversions) {
2174 DD.VisibleConversions = std::move(MergeDD.VisibleConversions);
2175 DD.ComputedVisibleConversions =
true;
2182 auto &Lambda1 =
static_cast<CXXRecordDecl::LambdaDefinitionData &
>(DD);
2183 auto &Lambda2 =
static_cast<CXXRecordDecl::LambdaDefinitionData &
>(MergeDD);
2184 DetectedOdrViolation |= Lambda1.DependencyKind != Lambda2.DependencyKind;
2185 DetectedOdrViolation |= Lambda1.IsGenericLambda != Lambda2.IsGenericLambda;
2186 DetectedOdrViolation |= Lambda1.CaptureDefault != Lambda2.CaptureDefault;
2187 DetectedOdrViolation |= Lambda1.NumCaptures != Lambda2.NumCaptures;
2188 DetectedOdrViolation |=
2189 Lambda1.NumExplicitCaptures != Lambda2.NumExplicitCaptures;
2190 DetectedOdrViolation |=
2191 Lambda1.HasKnownInternalLinkage != Lambda2.HasKnownInternalLinkage;
2192 DetectedOdrViolation |= Lambda1.ManglingNumber != Lambda2.ManglingNumber;
2194 if (Lambda1.NumCaptures && Lambda1.NumCaptures == Lambda2.NumCaptures) {
2195 for (
unsigned I = 0, N = Lambda1.NumCaptures; I != N; ++I) {
2200 Lambda1.AddCaptureList(Reader.getContext(), Lambda2.Captures.front());
2209 DetectedOdrViolation =
true;
2212 if (DetectedOdrViolation)
2213 Reader.PendingOdrMergeFailures[DD.Definition].push_back(
2214 {MergeDD.Definition, &MergeDD});
2218 Decl *LambdaContext,
2219 unsigned IndexInLambdaContext) {
2220 struct CXXRecordDecl::DefinitionData *DD;
2225 bool IsLambda =
Record.readInt();
2226 assert(!(IsLambda &&
Update) &&
2227 "lambda definition should not be added by update record");
2229 DD =
new (
C) CXXRecordDecl::LambdaDefinitionData(
2232 DD =
new (
C)
struct CXXRecordDecl::DefinitionData(D);
2238 if (!Canon->DefinitionData)
2239 Canon->DefinitionData = DD;
2240 D->DefinitionData = Canon->DefinitionData;
2241 ReadCXXDefinitionData(*DD, D, LambdaContext, IndexInLambdaContext);
2249 if (Canon->DefinitionData != DD) {
2257 if (
Update || Canon != D)
2258 Reader.PendingDefinitions.insert(D);
2267 CXXRecNotTemplate = 0,
2269 CXXRecMemberSpecialization,
2273 Decl *LambdaContext =
nullptr;
2274 unsigned IndexInLambdaContext = 0;
2276 switch ((CXXRecKind)Record.readInt()) {
2277 case CXXRecNotTemplate:
2282 case CXXRecTemplate: {
2284 auto *
Template = readDeclAs<ClassTemplateDecl>();
2285 D->TemplateOrInstantiation =
Template;
2288 case CXXRecMemberSpecialization: {
2289 auto *RD = readDeclAs<CXXRecordDecl>();
2294 D->TemplateOrInstantiation = MSI;
2299 LambdaContext = readDecl();
2301 IndexInLambdaContext = Record.readInt();
2303 MergeImpl.mergeLambda(D, Redecl, *LambdaContext, IndexInLambdaContext);
2312 bool WasDefinition = Record.readInt();
2314 ReadCXXRecordDefinition(D,
false, LambdaContext,
2315 IndexInLambdaContext);
2322 if (WasDefinition) {
2335 D->setExplicitSpecifier(Record.readExplicitSpec());
2336 D->Ctor = readDeclAs<CXXConstructorDecl>();
2349 unsigned NumOverridenMethods = Record.readInt();
2351 while (NumOverridenMethods--) {
2354 if (
auto *MD = readDeclAs<CXXMethodDecl>())
2360 Record.skipInts(NumOverridenMethods);
2369 auto *Shadow = readDeclAs<ConstructorUsingShadowDecl>();
2370 auto *Ctor = readDeclAs<CXXConstructorDecl>();
2375 if (
unsigned NumArgs = Record.readUInt32()) {
2378 for (
unsigned I = 0; I != NumArgs; I++)
2379 Args[I] = cast_or_null<CXXDefaultArgExpr>(Record.readStmt());
2391 if (
auto *OperatorDelete = readDeclAs<FunctionDecl>()) {
2392 auto *ThisArg = Record.readExpr();
2395 C.addOperatorDeleteForVDtor(D, OperatorDelete,
2397 Canon->OperatorDeleteThisArg = ThisArg;
2400 if (
auto *OperatorGlobDelete = readDeclAs<FunctionDecl>()) {
2401 if (!
C.dtorHasOperatorDelete(D,
2403 C.addOperatorDeleteForVDtor(
2406 if (
auto *OperatorArrayDelete = readDeclAs<FunctionDecl>()) {
2408 C.addOperatorDeleteForVDtor(D, OperatorArrayDelete,
2411 if (
auto *OperatorGlobArrayDelete = readDeclAs<FunctionDecl>()) {
2412 if (!
C.dtorHasOperatorDelete(D,
2414 C.addOperatorDeleteForVDtor(D, OperatorGlobArrayDelete,
2426 D->ImportedModule = readModule();
2427 D->setImportComplete(Record.readInt());
2428 auto *StoredLocs = D->getTrailingObjects();
2429 for (
unsigned I = 0, N = Record.back(); I != N; ++I)
2430 StoredLocs[I] = readSourceLocation();
2441 if (Record.readInt())
2442 D->
Friend = readDeclAs<NamedDecl>();
2444 D->
Friend = readTypeSourceInfo();
2446 D->FriendLoc = readSourceLocation();
2447 D->EllipsisLoc = readSourceLocation();
2452 for (
unsigned I = 0; I != D->NumTPLists; ++I)
2453 D->getTrailingObjects()[I] = Record.readTemplateParameterList();
2457 D->
Friend = readTypeSourceInfo();
2460 D->
Friend = readDeclAs<NamedDecl>();
2463 D->Template = Record.readTemplateName();
2465 "friend template name must resolve to a template declaration");
2469 D->
Friend = readTypeSourceInfo();
2470 D->Template = Record.readTemplateName();
2474 D->FriendLoc = readSourceLocation();
2475 D->EllipsisLoc = readSourceLocation();
2483 D->
init(readDeclAs<NamedDecl>());
2498 for (
unsigned I = 0; I < D->NumTemplateArgs; ++I)
2499 Args.push_back(Record.readTemplateArgument(
false));
2507 llvm::BitstreamCursor &DeclsCursor,
2509 uint64_t Offset = ReadLocalOffset();
2511 Reader.ReadSpecializations(M, DeclsCursor, Offset, D, IsPartial);
2525 Reader.PendingDefinitions.insert(CanonD);
2531 if (ThisDeclID == Redecl.getFirstID()) {
2532 if (
auto *RTD = readDeclAs<RedeclarableTemplateDecl>()) {
2533 assert(RTD->getKind() == D->
getKind() &&
2534 "InstantiatedFromMemberTemplate kind mismatch");
2536 if (Record.readInt())
2551 if (ThisDeclID == Redecl.getFirstID()) {
2560 llvm_unreachable(
"BuiltinTemplates are not serialized");
2570 if (ThisDeclID == Redecl.getFirstID()) {
2583 if (
Decl *InstD = readDecl()) {
2584 if (
auto *CTD = dyn_cast<ClassTemplateDecl>(InstD)) {
2585 D->SpecializedTemplate = CTD;
2588 Record.readTemplateArgumentList(TemplArgs);
2593 SpecializedPartialSpecialization();
2594 PS->PartialSpecialization
2596 PS->TemplateArgs = ArgList;
2597 D->SpecializedTemplate = PS;
2602 Record.readTemplateArgumentList(TemplArgs,
true);
2604 D->PointOfInstantiation = readSourceLocation();
2606 D->StrictPackMatch = Record.readBool();
2608 bool writtenAsCanonicalDecl = Record.readInt();
2609 if (writtenAsCanonicalDecl) {
2610 auto *CanonPattern = readDeclAs<ClassTemplateDecl>();
2614 if (
auto *Partial = dyn_cast<ClassTemplatePartialSpecializationDecl>(D)) {
2616 CanonPattern->getCommonPtr()->PartialSpecializations.getOrInsert(
2620 CanonPattern->getCommonPtr()->Specializations.getOrInsert(D);
2623 if (CanonSpec != D) {
2624 MergeImpl.mergeRedeclarable<
TagDecl>(D, CanonSpec, Redecl);
2628 if (
auto *DDD = D->DefinitionData) {
2629 if (CanonSpec->DefinitionData)
2630 MergeImpl.MergeDefinitionData(CanonSpec, std::move(*DDD));
2632 CanonSpec->DefinitionData = D->DefinitionData;
2634 D->DefinitionData = CanonSpec->DefinitionData;
2640 if (Record.readBool()) {
2643 ExplicitInfo->TemplateKeywordLoc = readSourceLocation();
2644 D->ExplicitInfo = ExplicitInfo;
2647 if (Record.readBool())
2658 D->TemplateParams = Params;
2663 if (ThisDeclID == Redecl.getFirstID()) {
2664 D->InstantiatedFromMember.setPointer(
2665 readDeclAs<ClassTemplatePartialSpecializationDecl>());
2666 D->InstantiatedFromMember.setInt(Record.readInt());
2673 if (ThisDeclID == Redecl.getFirstID()) {
2687 if (
Decl *InstD = readDecl()) {
2688 if (
auto *VTD = dyn_cast<VarTemplateDecl>(InstD)) {
2689 D->SpecializedTemplate = VTD;
2692 Record.readTemplateArgumentList(TemplArgs);
2697 VarTemplateSpecializationDecl::SpecializedPartialSpecialization();
2698 PS->PartialSpecialization =
2700 PS->TemplateArgs = ArgList;
2701 D->SpecializedTemplate = PS;
2706 if (Record.readBool()) {
2709 ExplicitInfo->TemplateKeywordLoc = readSourceLocation();
2710 D->ExplicitInfo = ExplicitInfo;
2713 if (Record.readBool())
2717 Record.readTemplateArgumentList(TemplArgs,
true);
2719 D->PointOfInstantiation = readSourceLocation();
2721 D->IsCompleteDefinition = Record.readInt();
2725 bool writtenAsCanonicalDecl = Record.readInt();
2726 if (writtenAsCanonicalDecl) {
2727 auto *CanonPattern = readDeclAs<VarTemplateDecl>();
2730 if (
auto *Partial = dyn_cast<VarTemplatePartialSpecializationDecl>(D)) {
2732 CanonPattern->getCommonPtr()->PartialSpecializations.getOrInsert(
2736 CanonPattern->getCommonPtr()->Specializations.getOrInsert(D);
2740 MergeImpl.mergeRedeclarable<
VarDecl>(D, CanonSpec, Redecl);
2755 D->TemplateParams = Params;
2760 if (ThisDeclID == Redecl.getFirstID()) {
2761 D->InstantiatedFromMember.setPointer(
2762 readDeclAs<VarTemplatePartialSpecializationDecl>());
2763 D->InstantiatedFromMember.setInt(Record.readInt());
2773 if (TypeConstraintInitialized) {
2775 if (Record.readBool())
2776 CR = Record.readConceptReference();
2777 Expr *ImmediatelyDeclaredConstraint = Record.readExpr();
2781 D->NumExpanded = Record.readUnsignedOrNone();
2784 if (Record.readInt())
2786 Record.readTemplateArgumentLoc());
2797 auto TypesAndInfos =
2798 D->getTrailingObjects<std::pair<QualType, TypeSourceInfo *>>();
2800 new (&TypesAndInfos[I].first)
QualType(Record.readType());
2801 TypesAndInfos[I].second = readTypeSourceInfo();
2805 D->ParameterPack = Record.readInt();
2806 if (Record.readInt())
2808 Record.readTemplateArgumentLoc());
2820 auto **
Data = D->getTrailingObjects();
2823 Data[I] = Record.readTemplateParameterList();
2826 D->ParameterPack = Record.readInt();
2827 if (Record.readInt())
2829 Record.readTemplateArgumentLoc());
2840 D->AssertExprAndFailed.setPointer(Record.readExpr());
2841 D->AssertExprAndFailed.setInt(Record.readInt());
2842 D->Message = cast_or_null<StringLiteral>(Record.readExpr());
2843 D->RParenLoc = readSourceLocation();
2851 auto *Spec = readDeclAs<NamedDecl>();
2852 D->SpecAndTSK.setPointer(Spec);
2853 D->ExternLoc = readSourceLocation();
2854 D->NameLoc = readSourceLocation();
2856 unsigned TSK = Record.readInt();
2857 D->SpecAndTSK.setInt(TSK);
2858 D->TypeAndFlags.setPointer(TSI);
2862 Record.readNestedNameSpecifierLoc();
2865 Record.readASTTemplateArgumentListInfo();
2869 Reader.getContext().addExplicitInstantiationDecl(Spec, D);
2876 cast_or_null<CXXExpansionStmtInstantiation>(Record.readStmt());
2887 D->ExtendingDecl = readDeclAs<ValueDecl>();
2888 D->ExprWithTemporary = Record.readStmt();
2889 if (Record.readInt()) {
2893 D->ManglingNumber = Record.readInt();
2905template <
typename T>
2908 Decl *MergeWith =
nullptr;
2910 bool IsKeyDecl = ThisDeclID == FirstDeclID;
2911 bool IsFirstLocalDecl =
false;
2913 uint64_t RedeclOffset = 0;
2918 FirstDeclID = ThisDeclID;
2920 IsFirstLocalDecl =
true;
2921 }
else if (
unsigned N = Record.readInt()) {
2925 IsFirstLocalDecl =
true;
2932 for (
unsigned I = 0; I != N - 1; ++I)
2933 MergeWith = readDecl();
2935 RedeclOffset = ReadLocalOffset();
2942 auto *FirstDecl = cast_or_null<T>(Reader.GetDecl(FirstDeclID));
2943 if (FirstDecl != D) {
2949 D->
First = FirstDecl->getCanonicalDecl();
2952 auto *DAsT =
static_cast<T *
>(D);
2958 if (IsFirstLocalDecl)
2959 Reader.PendingDeclChains.push_back(std::make_pair(DAsT, RedeclOffset));
2961 return RedeclarableResult(MergeWith, FirstDeclID, IsKeyDecl);
2966template <
typename T>
2968 RedeclarableResult &Redecl) {
2970 if (!Reader.getContext().getLangOpts().Modules)
2977 auto *D =
static_cast<T *
>(DBase);
2979 if (
auto *Existing = Redecl.getKnownMergeTarget())
2981 MergeImpl.mergeRedeclarable(D,
cast<T>(Existing), Redecl);
2982 else if (FindExistingResult ExistingRes = findExisting(D))
2983 if (
T *Existing = ExistingRes)
2984 MergeImpl.mergeRedeclarable(D, Existing, Redecl);
2994 Decl &Context,
unsigned IndexInContext) {
2996 if (!Reader.getContext().getLangOpts().Modules)
3003 if (
auto *Existing = Redecl.getKnownMergeTarget())
3009 auto *&Slot = Reader.getContext().getLambdaDeclarationSlotForMerging(
3010 &Context, IndexInContext);
3018 RedeclarableResult &Redecl) {
3031 llvm_unreachable(
"bad assert_cast");
3041 RedeclarableResult
Result(
3043 DPattern->getCanonicalDecl()->getGlobalID(), IsKeyDecl);
3045 if (
auto *DClass = dyn_cast<CXXRecordDecl>(DPattern)) {
3048 auto *ExistingClass =
3050 if (
auto *DDD = DClass->DefinitionData) {
3051 if (ExistingClass->DefinitionData) {
3054 ExistingClass->DefinitionData = DClass->DefinitionData;
3057 Reader.PendingDefinitions.insert(DClass);
3060 DClass->DefinitionData = ExistingClass->DefinitionData;
3065 if (
auto *DFunction = dyn_cast<FunctionDecl>(DPattern))
3068 if (
auto *DVar = dyn_cast<VarDecl>(DPattern))
3070 if (
auto *DAlias = dyn_cast<TypeAliasDecl>(DPattern))
3073 llvm_unreachable(
"merged an unknown kind of redeclarable template");
3078template <
typename T>
3081 auto *D =
static_cast<T *
>(DBase);
3082 T *ExistingCanon = Existing->getCanonicalDecl();
3084 if (ExistingCanon != DCanon) {
3089 D->
First = ExistingCanon;
3090 ExistingCanon->Used |= D->Used;
3093 bool IsKeyDecl = KeyDeclID.
isValid();
3096 if (
auto *DTemplate = dyn_cast<RedeclarableTemplateDecl>(D))
3103 Reader.KeyDecls[ExistingCanon].push_back(KeyDeclID);
3125 if (!Reader.getContext().getLangOpts().Modules)
3131 Reader.LETemporaryForMerging[std::make_pair(
3134 Reader.getContext().setPrimaryMergedDecl(LETDecl,
3147 if (!Reader.getContext().getLangOpts().Modules)
3154 if (!Reader.getContext().getLangOpts().CPlusPlus &&
3158 if (FindExistingResult ExistingRes = findExisting(
static_cast<T*
>(D)))
3159 if (
T *Existing = ExistingRes)
3160 Reader.getContext().setPrimaryMergedDecl(
static_cast<T *
>(D),
3161 Existing->getCanonicalDecl());
3165 Record.readOMPChildren(D->
Data);
3170 Record.readOMPChildren(D->
Data);
3175 Record.readOMPChildren(D->
Data);
3182 Expr *In = Record.readExpr();
3183 Expr *Out = Record.readExpr();
3185 Expr *Combiner = Record.readExpr();
3187 Expr *Orig = Record.readExpr();
3188 Expr *Priv = Record.readExpr();
3193 D->PrevDeclInScope = readDeclID().getRawValue();
3197 Record.readOMPChildren(D->
Data);
3199 D->VarName = Record.readDeclarationName();
3200 D->PrevDeclInScope = readDeclID().getRawValue();
3210 D->DirectiveLoc = Record.readSourceLocation();
3211 D->EndLoc = Record.readSourceLocation();
3212 Record.readOpenACCClauseList(D->Clauses);
3217 D->DirectiveLoc = Record.readSourceLocation();
3218 D->EndLoc = Record.readSourceLocation();
3219 D->ParensLoc = Record.readSourceRange();
3220 D->FuncRef = Record.readExpr();
3221 Record.readOpenACCClauseList(D->Clauses);
3235 uint64_t readInt() {
3239 bool readBool() {
return Reader.
readBool(); }
3241 SourceRange readSourceRange() {
3245 SourceLocation readSourceLocation() {
3249 Expr *readExpr() {
return Reader.
readExpr(); }
3251 Attr *readAttr() {
return Reader.
readAttr(); }
3253 std::string readString() {
3257 TypeSourceInfo *readTypeSourceInfo() {
3261 IdentifierInfo *readIdentifier() {
3265 VersionTuple readVersionTuple() {
3271 template <
typename T>
T *readDeclAs() {
return Reader.
readDeclAs<
T>(); }
3276 AttrReader
Record(*
this);
3277 auto V = Record.readInt();
3291 unsigned ParsedKind = Record.readInt();
3292 unsigned Syntax = Record.readInt();
3293 unsigned SpellingIndex = Record.readInt();
3294 bool IsAlignas = (ParsedKind == AttributeCommonInfo::AT_Aligned &&
3296 SpellingIndex == AlignedAttr::Keyword_alignas);
3297 bool IsRegularKeywordAttribute = Record.readBool();
3302 IsAlignas, IsRegularKeywordAttribute});
3304#include "clang/Serialization/AttrPCHRead.inc"
3306 assert(
New &&
"Unable to decode attribute?");
3312 for (
unsigned I = 0, E =
readInt(); I != E; ++I)
3327inline void ASTReader::LoadedDecl(
unsigned Index,
Decl *D) {
3328 assert(!DeclsLoaded[Index] &&
"Decl loaded twice?");
3329 DeclsLoaded[Index] = D;
3338bool ASTReader::isConsumerInterestedIn(
Decl *D) {
3351 if (
isa<FileScopeAsmDecl, TopLevelStmtDecl, ObjCProtocolDecl, ObjCImplDecl,
3352 ImportDecl, PragmaCommentDecl, PragmaDetectMismatchDecl>(D))
3354 if (
isa<OMPThreadPrivateDecl, OMPDeclareReductionDecl, OMPDeclareMapperDecl,
3355 OMPAllocateDecl, OMPRequiresDecl>(D))
3357 if (
const auto *Var = dyn_cast<VarDecl>(D))
3358 return Var->isFileVarDecl() &&
3360 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(Var));
3361 if (
const auto *
Func = dyn_cast<FunctionDecl>(D))
3362 return Func->doesThisDeclarationHaveABody() || PendingBodies.count(D);
3372ASTReader::RecordLocation ASTReader::DeclCursorForID(
GlobalDeclID ID,
3376 unsigned LocalDeclIndex = ID.getLocalDeclIndex();
3377 const DeclOffset &DOffs = M->
DeclOffsets[LocalDeclIndex];
3382ASTReader::RecordLocation ASTReader::getLocalBitOffset(uint64_t GlobalOffset) {
3383 auto I = GlobalBitOffsetsMap.find(GlobalOffset);
3385 assert(I != GlobalBitOffsetsMap.end() &&
"Corrupted global bit offsets map");
3386 return RecordLocation(I->second, GlobalOffset - I->second->GlobalBitOffset);
3389uint64_t ASTReader::getGlobalBitOffset(ModuleFile &M, uint64_t LocalOffset) {
3394ASTDeclReader::getOrFakePrimaryClassDefinition(
ASTReader &Reader,
3397 auto *DD = RD->DefinitionData;
3406 DD =
new (Reader.getContext())
struct CXXRecordDecl::DefinitionData(RD);
3408 RD->DefinitionData = DD;
3412 Reader.PendingFakeDefinitionData.insert(
3413 std::make_pair(DD, ASTReader::PendingFakeDefinitionKind::Fake));
3416 return DD->Definition;
3423 if (
auto *ND = dyn_cast<NamespaceDecl>(DC))
3424 return ND->getFirstDecl();
3426 if (
auto *RD = dyn_cast<CXXRecordDecl>(DC))
3427 return getOrFakePrimaryClassDefinition(Reader, RD);
3429 if (
auto *RD = dyn_cast<RecordDecl>(DC))
3432 if (
auto *ED = dyn_cast<EnumDecl>(DC))
3435 if (
auto *OID = dyn_cast<ObjCInterfaceDecl>(DC))
3440 if (
auto *TU = dyn_cast<TranslationUnitDecl>(DC))
3446ASTDeclReader::FindExistingResult::~FindExistingResult() {
3449 if (TypedefNameForLinkage) {
3451 Reader.ImportedTypedefNamesForLinkage.insert(
3452 std::make_pair(std::make_pair(DC, TypedefNameForLinkage), New));
3456 if (!AddResult || Existing)
3459 DeclarationName Name = New->getDeclName();
3462 setAnonymousDeclForMerging(Reader, New->getLexicalDeclContext(),
3463 AnonymousDeclNumber, New);
3465 !Reader.getContext().getLangOpts().CPlusPlus) {
3466 if (Reader.getIdResolver().tryAddTopLevelDecl(New, Name))
3469 }
else if (DeclContext *MergeDC = getPrimaryContextForMerging(Reader, DC)) {
3472 MergeDC->makeDeclVisibleInContextImpl(New,
true);
3482 bool IsTypedefNameForLinkage,
3483 bool FilteringUsingShadowDecl) {
3486 if (
auto *USD = dyn_cast<UsingShadowDecl>(
Found);
3487 USD && FilteringUsingShadowDecl)
3489 FilteringUsingShadowDecl);
3491 if (!IsTypedefNameForLinkage)
3497 if (
Found->isFromASTFile())
3500 if (
auto *TND = dyn_cast<TypedefNameDecl>(
Found))
3501 return TND->getAnonDeclWithTypedefName(
true);
3510ASTDeclReader::getPrimaryDCForAnonymousDecl(DeclContext *LexicalDC) {
3512 if (
auto *RD = dyn_cast<CXXRecordDecl>(LexicalDC)) {
3514 return DD ? DD->Definition :
nullptr;
3515 }
else if (
auto *OID = dyn_cast<ObjCInterfaceDecl>(LexicalDC)) {
3516 return OID->getCanonicalDecl()->getDefinition();
3523 if (
auto *FD = dyn_cast<FunctionDecl>(D))
3524 if (FD->isThisDeclarationADefinition())
3526 if (
auto *MD = dyn_cast<ObjCMethodDecl>(D))
3527 if (MD->isThisDeclarationADefinition())
3529 if (
auto *RD = dyn_cast<RecordDecl>(D))
3538NamedDecl *ASTDeclReader::getAnonymousDeclForMerging(ASTReader &Reader,
3543 auto *CanonDC =
cast<Decl>(DC)->getCanonicalDecl();
3546 auto &
Previous = Reader.AnonymousDeclarationsForMerging[CanonDC];
3552 auto *PrimaryDC = getPrimaryDCForAnonymousDecl(DC);
3553 auto needToNumberAnonymousDeclsWithin = [](
Decl *D) {
3561 auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D);
3562 return CTSD && !CTSD->noload_field_empty() &&
3563 !CTSD->hasLoadedFieldsFromExternalStorage();
3565 if (PrimaryDC && needToNumberAnonymousDeclsWithin(
cast<Decl>(PrimaryDC))) {
3577void ASTDeclReader::setAnonymousDeclForMerging(ASTReader &Reader,
3578 DeclContext *DC,
unsigned Index,
3580 auto *CanonDC =
cast<Decl>(DC)->getCanonicalDecl();
3582 auto &
Previous = Reader.AnonymousDeclarationsForMerging[CanonDC];
3589ASTDeclReader::FindExistingResult ASTDeclReader::findExisting(NamedDecl *D) {
3590 DeclarationName Name = TypedefNameForLinkage ? TypedefNameForLinkage
3596 FindExistingResult
Result(Reader, D,
nullptr,
3597 AnonymousDeclNumber, TypedefNameForLinkage);
3602 ASTContext &
C = Reader.getContext();
3604 if (TypedefNameForLinkage) {
3605 auto It = Reader.ImportedTypedefNamesForLinkage.find(
3606 std::make_pair(DC, TypedefNameForLinkage));
3607 if (It != Reader.ImportedTypedefNamesForLinkage.end())
3608 if (
C.isSameEntity(It->second, D))
3609 return FindExistingResult(Reader, D, It->second, AnonymousDeclNumber,
3610 TypedefNameForLinkage);
3618 if (
auto *Existing = getAnonymousDeclForMerging(
3620 if (
C.isSameEntity(Existing, D))
3621 return FindExistingResult(Reader, D, Existing, AnonymousDeclNumber,
3622 TypedefNameForLinkage);
3624 !Reader.getContext().getLangOpts().CPlusPlus) {
3625 IdentifierResolver &IdResolver = Reader.getIdResolver();
3629 class UpToDateIdentifierRAII {
3631 bool WasOutToDate =
false;
3634 explicit UpToDateIdentifierRAII(IdentifierInfo *II) : II(II) {
3642 ~UpToDateIdentifierRAII() {
3648 for (IdentifierResolver::iterator I = IdResolver.
begin(Name),
3649 IEnd = IdResolver.
end();
3651 if (NamedDecl *Existing =
3654 if (
C.isSameEntity(Existing, D))
3655 return FindExistingResult(Reader, D, Existing, AnonymousDeclNumber,
3656 TypedefNameForLinkage);
3658 }
else if (DeclContext *MergeDC = getPrimaryContextForMerging(Reader, DC)) {
3663 if (
C.isSameEntity(Existing, D)) {
3664 return FindExistingResult(Reader, D, Existing, AnonymousDeclNumber,
3665 TypedefNameForLinkage);
3670 return FindExistingResult(Reader);
3682 if (MergedDCIt != Reader.MergedDeclContexts.end() &&
3685 Reader.PendingOdrMergeChecks.push_back(D);
3687 return FindExistingResult(Reader, D,
nullptr,
3688 AnonymousDeclNumber, TypedefNameForLinkage);
3691template<
typename DeclT>
3697 llvm_unreachable(
"getMostRecentDecl on non-redeclarable declaration");
3704#define ABSTRACT_DECL(TYPE)
3705#define DECL(TYPE, BASE) \
3707 return getMostRecentDeclImpl(cast<TYPE##Decl>(D));
3708#include "clang/AST/DeclNodes.inc"
3710 llvm_unreachable(
"unknown decl kind");
3713Decl *ASTReader::getMostRecentExistingDecl(
Decl *D) {
3721 const auto *IA =
Previous->getAttr<MSInheritanceAttr>();
3723 if (IA && !D->
hasAttr<MSInheritanceAttr>()) {
3729 if (!D->
hasAttr<AvailabilityAttr>()) {
3730 for (
const auto *AA :
Previous->specific_attrs<AvailabilityAttr>()) {
3731 NewAttr = AA->
clone(Context);
3739template<
typename DeclT>
3755 D->
First = PrevVD->First;
3760 auto *VD =
static_cast<VarDecl *
>(D);
3770 if (VD->getOwningModule() &&
3771 VD->getOwningModule()->isHeaderLikeModule())
3772 VD->demoteThisDefinitionToDeclaration();
3773 Reader.mergeDefinitionVisibility(CurD, VD);
3781 auto *DT =
T->getContainedDeducedType();
3782 return DT && !DT->isDeduced();
3792 FD->RedeclLink.setPrevious(PrevFD);
3793 FD->First = PrevFD->First;
3797 if (PrevFD->isInlined() != FD->isInlined()) {
3813 FD->setImplicitlyInline(
true);
3818 if (FPT && PrevFPT) {
3822 bool WasUnresolved =
3824 if (IsUnresolved != WasUnresolved)
3825 Reader.PendingExceptionSpecUpdates.insert(
3826 {Canon, IsUnresolved ? PrevFD : FD});
3832 if (IsUndeduced != WasUndeduced)
3833 Reader.PendingDeducedTypeUpdates.insert(
3835 (IsUndeduced ? PrevFPT : FPT)->getReturnType()});
3842 llvm_unreachable(
"attachPreviousDecl on non-redeclarable declaration");
3847template <
typename ParmDecl>
3851 if (!From->hasDefaultArgument())
3853 To->setInheritedDefaultArgument(Context, From);
3862 assert(FromTP->size() == ToTP->size() &&
"merged mismatched templates?");
3864 for (
unsigned I = 0, N = FromTP->size(); I != N; ++I) {
3865 NamedDecl *FromParam = FromTP->getParam(I);
3868 if (
auto *FTTP = dyn_cast<TemplateTypeParmDecl>(FromParam))
3870 else if (
auto *FNTTP = dyn_cast<NonTypeTemplateParmDecl>(FromParam))
3905 Func &&
Func->getTemplateSpecializationInfo())
3914 if (!
Previous->getLexicalDeclContext()
3915 ->getNonTransparentContext()
3916 ->isFileContext() ||
3934 Reader.PendingWarningForDuplicatedDefsInModuleUnits.push_back(
3943 Reader.Diag(
Previous->getLocation(),
3944 diag::err_multiple_decl_in_different_modules)
3946 Reader.Diag(D->
getLocation(), diag::note_also_found);
3954#define ABSTRACT_DECL(TYPE)
3955#define DECL(TYPE, BASE) \
3957 attachPreviousDeclImpl(Reader, cast<TYPE##Decl>(D), Previous, Canon); \
3959#include "clang/AST/DeclNodes.inc"
3975 if (
auto *TD = dyn_cast<TemplateDecl>(D))
3983 mergeInheritableAttributes(Reader, D,
Previous);
3986template<
typename DeclT>
3992 llvm_unreachable(
"attachLatestDecl on non-redeclarable declaration");
3996 assert(D && Latest);
3999#define ABSTRACT_DECL(TYPE)
4000#define DECL(TYPE, BASE) \
4002 attachLatestDeclImpl(cast<TYPE##Decl>(D), Latest); \
4004#include "clang/AST/DeclNodes.inc"
4008template<
typename DeclT>
4014 llvm_unreachable(
"markIncompleteDeclChain on non-redeclarable declaration");
4017void ASTReader::markIncompleteDeclChain(
Decl *D) {
4019#define ABSTRACT_DECL(TYPE)
4020#define DECL(TYPE, BASE) \
4022 ASTDeclReader::markIncompleteDeclChainImpl(cast<TYPE##Decl>(D)); \
4024#include "clang/AST/DeclNodes.inc"
4030 SourceLocation DeclLoc;
4031 RecordLocation Loc = DeclCursorForID(ID, DeclLoc);
4032 llvm::BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
4035 SavedStreamPosition SavedPosition(DeclsCursor);
4037 ReadingKindTracker ReadingKind(Read_Decl, *
this);
4042 auto Fail = [](
const char *what, llvm::Error &&Err) {
4043 llvm::report_fatal_error(Twine(
"ASTReader::readDeclRecord failed ") + what +
4047 if (llvm::Error JumpFailed = DeclsCursor.JumpToBit(Loc.Offset))
4048 Fail(
"jumping", std::move(JumpFailed));
4051 Expected<unsigned> MaybeCode = DeclsCursor.ReadCode();
4053 Fail(
"reading code", MaybeCode.takeError());
4054 unsigned Code = MaybeCode.get();
4058 Expected<unsigned> MaybeDeclCode =
Record.readRecord(DeclsCursor, Code);
4060 llvm::report_fatal_error(
4061 Twine(
"ASTReader::readDeclRecord failed reading decl code: ") +
4062 toString(MaybeDeclCode.takeError()));
4064 switch ((
DeclCode)MaybeDeclCode.get()) {
4071 llvm_unreachable(
"Record cannot be de-serialized with readDeclRecord");
4182 bool HasTypeConstraint =
Record.readInt();
4188 bool HasTypeConstraint =
Record.readInt();
4194 bool HasTypeConstraint =
Record.readInt();
4196 Context, ID,
Record.readInt(), HasTypeConstraint);
4292 D = MSGuidDecl::CreateDeserialized(Context, ID);
4295 D = UnnamedGlobalConstantDecl::CreateDeserialized(Context, ID);
4298 D = TemplateParamObjectDecl::CreateDeserialized(Context, ID);
4307 Error(
"attempt to read a C++ base-specifier record as a declaration");
4310 Error(
"attempt to read a C++ ctor initializer record as a declaration");
4319 unsigned NumChildren =
Record.readInt();
4325 unsigned NumClauses =
Record.readInt();
4326 unsigned NumVars =
Record.readInt();
4332 unsigned NumClauses =
Record.readInt();
4341 unsigned NumClauses =
Record.readInt();
4380 assert(D &&
"Unknown declaration reading AST file");
4381 LoadedDecl(translateGlobalDeclIDToIndex(ID), D);
4392 if (
auto *DC = dyn_cast<DeclContext>(D)) {
4393 LookupBlockOffsets Offsets;
4395 Reader.VisitDeclContext(DC, Offsets);
4401 if (
auto Iter = DelayedNamespaceOffsetMap.find(ID);
4402 Iter != DelayedNamespaceOffsetMap.end())
4403 Offsets = Iter->second;
4406 ReadVisibleDeclContextStorage(
4408 VisibleDeclContextStorageKind::GenerallyVisible))
4411 ReadVisibleDeclContextStorage(
4413 VisibleDeclContextStorageKind::ModuleLocalVisible))
4416 ReadVisibleDeclContextStorage(
4418 VisibleDeclContextStorageKind::TULocalVisible))
4422 ReadLexicalDeclContextStorage(*Loc.F, DeclsCursor,
4429 PendingUpdateRecords.push_back(
4430 PendingUpdateRecord(ID, D,
true));
4433 if (
auto *
Class = dyn_cast<ObjCInterfaceDecl>(D))
4436 if (
Class->isThisDeclarationADefinition() ||
4437 PendingDefinitions.count(
Class))
4438 loadObjCCategories(ID,
Class);
4444 PotentiallyInterestingDecls.push_back(D);
4449void ASTReader::PassInterestingDeclsToConsumer() {
4452 if (!CanPassDeclsToConsumer)
4457 SaveAndRestore GuardPassingDeclsToConsumer(CanPassDeclsToConsumer,
4462 for (
auto ID : EagerlyDeserializedDecls)
4464 EagerlyDeserializedDecls.clear();
4466 auto ConsumingPotentialInterestingDecls = [
this]() {
4467 while (!PotentiallyInterestingDecls.empty()) {
4468 Decl *D = PotentiallyInterestingDecls.front();
4469 PotentiallyInterestingDecls.pop_front();
4470 if (isConsumerInterestedIn(D))
4471 PassInterestingDeclToConsumer(D);
4474 std::deque<Decl *> MaybeInterestingDecls =
4475 std::move(PotentiallyInterestingDecls);
4476 PotentiallyInterestingDecls.clear();
4477 assert(PotentiallyInterestingDecls.empty());
4478 while (!MaybeInterestingDecls.empty()) {
4479 Decl *D = MaybeInterestingDecls.front();
4480 MaybeInterestingDecls.pop_front();
4486 if (
auto *VD = dyn_cast<VarDecl>(D);
4487 VD && VD->isFileVarDecl() && !VD->isExternallyVisible())
4489 ConsumingPotentialInterestingDecls();
4490 if (isConsumerInterestedIn(D))
4491 PassInterestingDeclToConsumer(D);
4495 ConsumingPotentialInterestingDecls();
4497 for (GlobalDeclID ID : VTablesToEmit) {
4500 PassVTableToConsumer(RD);
4502 VTablesToEmit.clear();
4505void ASTReader::loadDeclUpdateRecords(PendingUpdateRecord &
Record) {
4509 GlobalDeclID ID =
Record.ID;
4511 ProcessingUpdatesRAIIObj ProcessingUpdates(*
this);
4512 DeclUpdateOffsetsMap::iterator UpdI = DeclUpdateOffsets.find(ID);
4514 if (UpdI != DeclUpdateOffsets.end()) {
4515 auto UpdateOffsets = std::move(UpdI->second);
4516 DeclUpdateOffsets.erase(UpdI);
4522 bool WasInteresting =
Record.JustLoaded || isConsumerInterestedIn(D);
4523 for (
auto &FileAndOffset : UpdateOffsets) {
4525 uint64_t Offset = FileAndOffset.second;
4527 SavedStreamPosition SavedPosition(Cursor);
4528 if (llvm::Error JumpFailed =
Cursor.JumpToBit(Offset))
4530 llvm::report_fatal_error(
4531 Twine(
"ASTReader::loadDeclUpdateRecords failed jumping: ") +
4533 Expected<unsigned> MaybeCode =
Cursor.ReadCode();
4535 llvm::report_fatal_error(
4536 Twine(
"ASTReader::loadDeclUpdateRecords failed reading code: ") +
4538 unsigned Code = MaybeCode.get();
4540 if (Expected<unsigned> MaybeRecCode =
Record.readRecord(Cursor, Code))
4542 "Expected DECL_UPDATES record!");
4544 llvm::report_fatal_error(
4545 Twine(
"ASTReader::loadDeclUpdateRecords failed reading rec code: ") +
4550 Reader.UpdateDecl(D);
4554 if (!WasInteresting && isConsumerInterestedIn(D)) {
4555 PotentiallyInterestingDecls.push_back(D);
4556 WasInteresting =
true;
4562 if (
auto I = PendingVisibleUpdates.find(ID);
4563 I != PendingVisibleUpdates.end()) {
4564 auto VisibleUpdates = std::move(I->second);
4565 PendingVisibleUpdates.erase(I);
4568 for (
const auto &
Update : VisibleUpdates)
4569 Lookups[DC].Table.add(
4571 reader::ASTDeclContextNameLookupTrait(*
this, *
Update.Mod));
4575 if (
auto I = PendingModuleLocalVisibleUpdates.find(ID);
4576 I != PendingModuleLocalVisibleUpdates.end()) {
4577 auto ModuleLocalVisibleUpdates = std::move(I->second);
4578 PendingModuleLocalVisibleUpdates.erase(I);
4581 for (
const auto &
Update : ModuleLocalVisibleUpdates)
4582 ModuleLocalLookups[DC].Table.add(
4584 reader::ModuleLocalNameLookupTrait(*
this, *
Update.Mod));
4590 if (
auto I = TULocalUpdates.find(ID); I != TULocalUpdates.end()) {
4591 auto Updates = std::move(I->second);
4592 TULocalUpdates.erase(I);
4596 TULocalLookups[DC].Table.add(
4598 reader::ASTDeclContextNameLookupTrait(*
this, *
Update.Mod));
4604 if (
auto IT = RelatedDeclsMap.find(ID); IT != RelatedDeclsMap.end()) {
4605 for (
auto LID : IT->second)
4607 RelatedDeclsMap.erase(IT);
4612 if (
auto I = PendingSpecializationsUpdates.find(ID);
4613 I != PendingSpecializationsUpdates.end()) {
4614 auto SpecializationUpdates = std::move(I->second);
4615 PendingSpecializationsUpdates.erase(I);
4617 for (
const auto &
Update : SpecializationUpdates)
4618 AddSpecializations(D,
Update.Data, *
Update.Mod,
false);
4622 if (
auto I = PendingPartialSpecializationsUpdates.find(ID);
4623 I != PendingPartialSpecializationsUpdates.end()) {
4624 auto SpecializationUpdates = std::move(I->second);
4625 PendingPartialSpecializationsUpdates.erase(I);
4627 for (
const auto &
Update : SpecializationUpdates)
4632void ASTReader::loadPendingDeclChain(
Decl *FirstLocal, uint64_t LocalOffset) {
4637 MostRecent = CanonDecl;
4638 if (FirstLocal != CanonDecl) {
4641 MostRecent = FirstLocal;
4651 assert(M &&
"imported decl from no module file");
4654 SavedStreamPosition SavedPosition(Cursor);
4655 if (llvm::Error JumpFailed =
Cursor.JumpToBit(LocalOffset))
4656 llvm::report_fatal_error(
4657 Twine(
"ASTReader::loadPendingDeclChain failed jumping: ") +
4661 Expected<unsigned> MaybeCode =
Cursor.ReadCode();
4663 llvm::report_fatal_error(
4664 Twine(
"ASTReader::loadPendingDeclChain failed reading code: ") +
4666 unsigned Code = MaybeCode.get();
4667 if (Expected<unsigned> MaybeRecCode =
Cursor.readRecord(Code,
Record))
4669 "expected LOCAL_REDECLARATIONS record!");
4671 llvm::report_fatal_error(
4672 Twine(
"ASTReader::loadPendingDeclChain failed reading rec code: ") +
4677 for (
unsigned I = 0, N =
Record.size(); I != N; ++I) {
4678 unsigned Idx = N - I - 1;
4690 class ObjCCategoriesVisitor {
4693 llvm::SmallPtrSetImpl<ObjCCategoryDecl *> &Deserialized;
4694 ObjCCategoryDecl *Tail =
nullptr;
4695 llvm::DenseMap<DeclarationName, ObjCCategoryDecl *> NameCategoryMap;
4696 GlobalDeclID InterfaceID;
4697 unsigned PreviousGeneration;
4699 void add(ObjCCategoryDecl *Cat) {
4701 if (!Deserialized.erase(Cat))
4706 ObjCCategoryDecl *&Existing = NameCategoryMap[Cat->
getDeclName()];
4710 StructuralEquivalenceContext Ctx(
4713 StructuralEquivalenceKind::Default,
4717 if (!Ctx.IsEquivalent(Cat, Existing)) {
4722 diag::note_previous_definition);
4724 }
else if (!Existing) {
4739 ObjCCategoriesVisitor(
4740 ASTReader &Reader, ObjCInterfaceDecl *
Interface,
4741 llvm::SmallPtrSetImpl<ObjCCategoryDecl *> &Deserialized,
4742 GlobalDeclID InterfaceID,
unsigned PreviousGeneration)
4744 InterfaceID(InterfaceID), PreviousGeneration(PreviousGeneration) {
4746 for (
auto *Cat :
Interface->known_categories()) {
4747 if (Cat->getDeclName())
4748 NameCategoryMap[Cat->getDeclName()] = Cat;
4755 bool operator()(ModuleFile &M) {
4764 LocalDeclID LocalID =
4771 const ObjCCategoriesInfo
Compare = {LocalID, 0};
4772 const ObjCCategoriesInfo *
Result = std::lower_bound(
4776 LocalID !=
Result->getDefinitionID()) {
4784 unsigned Offset =
Result->Offset;
4787 for (
unsigned I = 0; I != N; ++I)
4796 unsigned PreviousGeneration) {
4797 ObjCCategoriesVisitor Visitor(*
this, D, CategoriesDeserialized, ID,
4798 PreviousGeneration);
4799 ModuleMgr.visit(Visitor);
4802template<
typename DeclT,
typename Fn>
4811 for (
auto *Redecl = MostRecent; Redecl && !
Found;
4812 Redecl = Redecl->getPreviousDecl())
4813 Found = (Redecl == D);
4817 for (
auto *Redecl = MostRecent; Redecl != D;
4824 while (Record.getIdx() < Record.size()) {
4828 Decl *MD = Record.readDecl();
4829 assert(MD &&
"couldn't read decl from update record");
4830 Reader.PendingAddedClassMembers.push_back({RD, MD});
4835 auto *Anon = readDeclAs<NamespaceDecl>();
4840 if (!Record.isModule()) {
4841 if (
auto *TU = dyn_cast<TranslationUnitDecl>(D))
4842 TU->setAnonymousNamespace(Anon);
4851 VD->NonParmVarDeclBits.IsInline = Record.readInt();
4852 VD->NonParmVarDeclBits.IsInlineSpecified = Record.readInt();
4859 if (
auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D)) {
4860 VTSD->setPointOfInstantiation(POI);
4861 }
else if (
auto *VD = dyn_cast<VarDecl>(D)) {
4863 assert(MSInfo &&
"No member specialization information");
4867 if (
auto *FTSInfo = dyn_cast<FunctionTemplateSpecializationInfo *>(
4868 FD->TemplateOrSpecialization))
4869 FTSInfo->setPointOfInstantiation(POI);
4872 ->setPointOfInstantiation(POI);
4883 auto *DefaultArg = Record.readExpr();
4887 if (Param->hasUninstantiatedDefaultArg())
4888 Param->setDefaultArg(DefaultArg);
4894 auto *DefaultInit = Record.readExpr();
4898 if (FD->hasInClassInitializer() && !FD->hasNonNullInClassInitializer()) {
4900 FD->setInClassInitializer(DefaultInit);
4904 FD->removeInClassInitializer();
4911 if (Reader.PendingBodies[FD]) {
4917 if (Record.readInt()) {
4925 FD->setInnerLocStart(readSourceLocation());
4927 assert(Record.getIdx() == Record.size() &&
"lazy body must be last");
4934 bool HadRealDefinition =
4935 OldDD && (OldDD->Definition != RD ||
4936 !Reader.PendingFakeDefinitionData.count(OldDD));
4940 ReadCXXRecordDefinition(RD,
true);
4943 uint64_t LexicalOffset = ReadLocalOffset();
4944 if (!HadRealDefinition && LexicalOffset) {
4945 Record.readLexicalDeclContextStorage(LexicalOffset, RD);
4946 Reader.PendingFakeDefinitionData.erase(OldDD);
4953 MSInfo->setTemplateSpecializationKind(TSK);
4954 MSInfo->setPointOfInstantiation(POI);
4957 Spec->setTemplateSpecializationKind(TSK);
4958 Spec->setPointOfInstantiation(POI);
4960 if (Record.readInt()) {
4962 readDeclAs<ClassTemplatePartialSpecializationDecl>();
4964 Record.readTemplateArgumentList(TemplArgs);
4966 Reader.getContext(), TemplArgs);
4971 Spec->getSpecializedTemplateOrPartial()))
4972 Spec->setInstantiationOf(PartialSpec, TemplArgList);
4981 if (Record.readInt()) {
4983 Record.readAttributes(Attrs);
4987 D->setAttrsImpl(Attrs, Reader.getContext());
4997 auto *Del = readDeclAs<FunctionDecl>();
4998 auto *ThisArg = Record.readExpr();
5001 if (!
C.dtorHasOperatorDelete(Dtor,
5003 C.addOperatorDeleteForVDtor(Dtor, Del,
5005 Canon->OperatorDeleteThisArg = ThisArg;
5011 auto *Del = readDeclAs<FunctionDecl>();
5014 if (!
C.dtorHasOperatorDelete(
5016 C.addOperatorDeleteForVDtor(
5021 auto *Del = readDeclAs<FunctionDecl>();
5025 C.addOperatorDeleteForVDtor(Dtor, Del,
5030 auto *Del = readDeclAs<FunctionDecl>();
5033 if (!
C.dtorHasOperatorDelete(Dtor,
5035 C.addOperatorDeleteForVDtor(
5042 auto ESI = Record.readExceptionSpecInfo(ExceptionStorage);
5050 FD->setType(Reader.getContext().getFunctionType(
5051 FPT->getReturnType(), FPT->getParamTypes(),
5052 FPT->getExtProtoInfo().withExceptionSpec(ESI)));
5056 Reader.PendingExceptionSpecUpdates.insert(
5057 std::make_pair(FD->getCanonicalDecl(), FD));
5064 QualType DeducedResultType = Record.readType();
5065 Reader.PendingDeducedTypeUpdates.insert(
5066 {FD->getCanonicalDecl(), DeducedResultType});
5086 D->
addAttr(OMPThreadPrivateDeclAttr::CreateImplicit(Reader.getContext(),
5087 readSourceRange()));
5091 auto AllocatorKind =
5092 static_cast<OMPAllocateDeclAttr::AllocatorTypeTy
>(Record.readInt());
5093 Expr *Allocator = Record.readExpr();
5094 Expr *Alignment = Record.readExpr();
5096 D->
addAttr(OMPAllocateDeclAttr::CreateImplicit(
5097 Reader.getContext(), AllocatorKind, Allocator, Alignment, SR));
5102 D->
addAttr(OMPTargetIndirectCallAttr::CreateImplicit(Reader.getContext(),
5103 readSourceRange()));
5110 Reader.getContext().mergeDefinitionIntoModule(Exported, Owner);
5111 Reader.PendingMergedDefinitionsToDeduplicate.insert(Exported);
5116 auto MapType = Record.readEnum<OMPDeclareTargetDeclAttr::MapTypeTy>();
5117 auto DevType = Record.readEnum<OMPDeclareTargetDeclAttr::DevTypeTy>();
5118 Expr *IndirectE = Record.readExpr();
5119 bool Indirect = Record.readBool();
5120 unsigned Level = Record.readInt();
5121 D->
addAttr(OMPDeclareTargetDeclAttr::CreateImplicit(
5122 Reader.getContext(), MapType, DevType, IndirectE, Indirect, Level,
5123 readSourceRange()));
5129 Record.readAttributes(Attrs);
5130 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
unsigned NumTopLevelStmtDecls
Ordinal for the next TopLevelStmtDecl; counts created and loaded ones.
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
Returns true if this DeclContext is a function, Objective-C method, or block, or a DeclContext that c...
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)
Declaration of a friend template.
static FriendTemplateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumFriendTPLists)
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.
TemplateDecl * getAsTemplateDecl(bool IgnoreDeduced=false) const
Retrieve the underlying template declaration that this template name refers to, if known.
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.
FriendTemplateDeclKind
Kinds of friend payloads owned by FriendTemplateDecl.
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
Top level wrappers for InstallAPI frontend operations.
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
const FunctionProtoType * T
@ 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