57#include "llvm/ADT/DenseMap.h"
58#include "llvm/ADT/FoldingSet.h"
59#include "llvm/ADT/SmallPtrSet.h"
60#include "llvm/ADT/SmallVector.h"
61#include "llvm/ADT/iterator_range.h"
62#include "llvm/Bitstream/BitstreamReader.h"
63#include "llvm/Support/ErrorHandling.h"
64#include "llvm/Support/SaveAndRestore.h"
81class RedeclarableResult {
87 RedeclarableResult(Decl *MergeWith, GlobalDeclID FirstID,
bool IsKeyDecl)
88 : MergeWith(MergeWith), FirstID(FirstID), IsKeyDecl(IsKeyDecl) {}
91 GlobalDeclID getFirstID()
const {
return FirstID; }
94 bool isKeyDecl()
const {
return IsKeyDecl; }
98 Decl *getKnownMergeTarget()
const {
return MergeWith; }
116 template <
typename T>
120 template <
typename T>
122 RedeclarableResult &Redecl) {
124 D, Existing, Redecl.isKeyDecl() ? Redecl.getFirstID() :
GlobalDeclID());
131 struct CXXRecordDecl::DefinitionData &&NewDD);
133 struct ObjCInterfaceDecl::DefinitionData &&NewDD);
135 struct ObjCProtocolDecl::DefinitionData &&NewDD);
148 ASTReader::RecordLocation Loc;
154 TypeID DeferredTypeID = 0;
155 unsigned AnonymousDeclNumber = 0;
162 bool IsDeclMarkedUsed =
false;
164 uint64_t GetCurrentCursorOffset();
166 uint64_t ReadLocalOffset() {
167 uint64_t LocalOffset = Record.readInt();
168 assert(LocalOffset < Loc.Offset &&
"offset point after current record");
169 return LocalOffset ? Loc.Offset - LocalOffset : 0;
172 uint64_t ReadGlobalOffset() {
173 uint64_t Local = ReadLocalOffset();
174 return Local ? Record.getGlobalBitOffset(Local) : 0;
177 SourceLocation readSourceLocation() {
return Record.readSourceLocation(); }
179 SourceRange readSourceRange() {
return Record.readSourceRange(); }
181 TypeSourceInfo *readTypeSourceInfo() {
return Record.readTypeSourceInfo(); }
183 GlobalDeclID readDeclID() {
return Record.readDeclID(); }
185 std::string readString() {
return Record.readString(); }
187 Decl *readDecl() {
return Record.readDecl(); }
189 template <
typename T> T *readDeclAs() {
return Record.readDeclAs<T>(); }
192 if (Record.getIdx() == Record.size())
195 return Record.getGlobalSubmoduleID(Record.readInt());
198 Module *readModule() {
return Record.getSubmodule(readSubmoduleID()); }
201 Decl *LambdaContext =
nullptr,
202 unsigned IndexInLambdaContext = 0);
203 void ReadCXXDefinitionData(
struct CXXRecordDecl::DefinitionData &
Data,
205 unsigned IndexInLambdaContext);
206 void ReadObjCDefinitionData(
struct ObjCInterfaceDecl::DefinitionData &
Data);
207 void ReadObjCDefinitionData(
struct ObjCProtocolDecl::DefinitionData &
Data);
228 class FindExistingResult {
232 bool AddResult =
false;
233 unsigned AnonymousDeclNumber = 0;
237 FindExistingResult(
ASTReader &Reader) : Reader(Reader) {}
240 unsigned AnonymousDeclNumber,
242 : Reader(Reader),
New(
New), Existing(Existing), AddResult(
true),
243 AnonymousDeclNumber(AnonymousDeclNumber),
244 TypedefNameForLinkage(TypedefNameForLinkage) {}
246 FindExistingResult(FindExistingResult &&
Other)
248 AddResult(
Other.AddResult),
249 AnonymousDeclNumber(
Other.AnonymousDeclNumber),
250 TypedefNameForLinkage(
Other.TypedefNameForLinkage) {
251 Other.AddResult =
false;
254 FindExistingResult &operator=(FindExistingResult &&) =
delete;
255 ~FindExistingResult();
259 void suppress() { AddResult =
false; }
261 operator NamedDecl *()
const {
return Existing; }
263 template <
typename T>
operator T *()
const {
264 return dyn_cast_or_null<T>(Existing);
270 FindExistingResult findExisting(
NamedDecl *D);
276 : Reader(Reader), MergeImpl(Reader), Record(Record), Loc(Loc),
277 ThisDeclID(thisDeclID), ThisDeclLoc(ThisDeclLoc) {}
279 template <
typename DeclT>
284 template <
typename DeclT>
294 template <
typename DeclT>
299 template <
typename DeclT>
304 llvm::BitstreamCursor &DeclsCursor,
bool IsPartial);
313 Cat->NextClassCategory =
Next;
419 template <
typename T>
422 template <
typename T>
426 RedeclarableResult &Redecl);
462template <
typename DeclT>
class MergedRedeclIterator {
463 DeclT *Start =
nullptr;
464 DeclT *Canonical =
nullptr;
465 DeclT *Current =
nullptr;
468 MergedRedeclIterator() =
default;
469 MergedRedeclIterator(DeclT *Start) : Start(Start), Current(Start) {}
473 MergedRedeclIterator &operator++() {
474 if (Current->isFirstDecl()) {
476 Current = Current->getMostRecentDecl();
478 Current = Current->getPreviousDecl();
484 if (Current == Start || Current == Canonical)
489 friend bool operator!=(
const MergedRedeclIterator &A,
490 const MergedRedeclIterator &B) {
491 return A.Current != B.Current;
497template <
typename DeclT>
498static llvm::iterator_range<MergedRedeclIterator<DeclT>>
500 return llvm::make_range(MergedRedeclIterator<DeclT>(D),
501 MergedRedeclIterator<DeclT>());
504uint64_t ASTDeclReader::GetCurrentCursorOffset() {
505 return Loc.F->DeclsCursor.GetCurrentBitNo() + Loc.F->GlobalBitOffset;
509 if (Record.readInt()) {
510 Reader.DefinitionSource[FD] =
512 Reader.getContext().getLangOpts().BuildingPCHWithObjectFile;
514 if (
auto *CD = dyn_cast<CXXConstructorDecl>(FD)) {
515 CD->setNumCtorInitializers(Record.readInt());
516 if (CD->getNumCtorInitializers())
517 CD->CtorInitializers = ReadGlobalOffset();
520 Reader.PendingBodies[FD] = GetCurrentCursorOffset();
523 Reader.ThisDeclarationWasADefinitionSet.insert(FD);
532 IsDeclMarkedUsed =
false;
534 if (
auto *DD = dyn_cast<DeclaratorDecl>(D)) {
535 if (
auto *TInfo = DD->getTypeSourceInfo())
536 Record.readTypeLoc(TInfo->getTypeLoc());
539 if (
auto *TD = dyn_cast<TypeDecl>(D)) {
542 assert(DeferredTypeID == 0 &&
543 "Deferred type not used for TagDecls and Typedefs");
545 TD->setTypeForDecl(Reader.GetType(DeferredTypeID).getTypePtrOrNull());
549 if (NamedDeclForTagDecl.isValid())
552 }
else if (
auto *ID = dyn_cast<ObjCInterfaceDecl>(D)) {
554 ID->TypeForDecl = Reader.GetType(DeferredTypeID).getTypePtrOrNull();
555 }
else if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
557 if (Record.readInt())
559 }
else if (
auto *VD = dyn_cast<VarDecl>(D)) {
561 }
else if (
auto *FD = dyn_cast<FieldDecl>(D)) {
562 if (FD->hasInClassInitializer() && Record.readInt()) {
563 FD->setLazyInClassInitializer(
LazyDeclStmtPtr(GetCurrentCursorOffset()));
570 auto ModuleOwnership =
574 IsDeclMarkedUsed |= D->Used;
577 bool HasStandaloneLexicalDC = DeclBits.
getNextBit();
591 GlobalDeclID SemaDCIDForTemplateParmDecl = readDeclID();
594 if (LexicalDCIDForTemplateParmDecl.
isInvalid())
595 LexicalDCIDForTemplateParmDecl = SemaDCIDForTemplateParmDecl;
596 Reader.addPendingDeclContextInfo(D,
597 SemaDCIDForTemplateParmDecl,
598 LexicalDCIDForTemplateParmDecl);
601 auto *SemaDC = readDeclAs<DeclContext>();
603 HasStandaloneLexicalDC ? readDeclAs<DeclContext>() :
nullptr;
609 if (
auto *RD = dyn_cast<CXXRecordDecl>(SemaDC))
610 MergedSemaDC = getOrFakePrimaryClassDefinition(Reader, RD);
612 MergedSemaDC = Reader.MergedDeclContexts.
lookup(SemaDC);
615 D->setDeclContextsImpl(MergedSemaDC ? MergedSemaDC : SemaDC, LexicalDC,
616 Reader.getContext());
622 Record.readAttributes(Attrs);
625 D->setAttrsImpl(Attrs, Reader.getContext());
633 switch (ModuleOwnership) {
652 }
else if (Reader.getContext().getLangOpts().ModulesLocalVisibility) {
660 Reader.HiddenNamesMap[Owner].push_back(D);
662 }
else if (ModulePrivate) {
671 std::string Arg = readString();
672 memcpy(D->getTrailingObjects(), Arg.data(), Arg.size());
673 D->getTrailingObjects()[Arg.size()] =
'\0';
679 std::string Name = readString();
680 memcpy(D->getTrailingObjects(), Name.data(), Name.size());
681 D->getTrailingObjects()[Name.size()] =
'\0';
683 D->ValueStart = Name.size() + 1;
684 std::string
Value = readString();
685 memcpy(D->getTrailingObjects() + D->ValueStart,
Value.data(),
Value.size());
686 D->getTrailingObjects()[D->ValueStart +
Value.size()] =
'\0';
690 llvm_unreachable(
"Translation units are not serialized");
696 AnonymousDeclNumber = Record.readInt();
704 DeferredTypeID = Record.getGlobalTypeID(Record.readInt());
711 if (Record.readInt()) {
712 QualType modedT = Record.readType();
731 if (
auto *
Template = readDeclAs<TypeAliasTemplateDecl>())
757 auto *Info =
new (Reader.getContext()) TagDecl::ExtInfo();
758 Record.readQualifierInfo(*Info);
759 TD->TypedefNameDeclOrQualifier = Info;
763 NamedDeclForTagDecl = readDeclID();
764 TypedefNameForLinkage = Record.readIdentifier();
767 llvm_unreachable(
"unexpected tag info kind");
784 ED->setNumPositiveBits(EnumDeclBits.
getNextBits(8));
785 ED->setNumNegativeBits(EnumDeclBits.
getNextBits(8));
790 ED->setHasODRHash(
true);
791 ED->ODRHash = Record.readInt();
801 if (!D->isFromASTFile() && D->isCompleteDefinition()) {
808 Reader.MergedDeclContexts.insert(std::make_pair(ED, OldDef));
810 Reader.mergeDefinitionVisibility(OldDef, ED);
815 Reader.PendingEnumOdrMergeFailures[OldDef].push_back(ED);
821 if (
auto *InstED = readDeclAs<EnumDecl>()) {
824 ED->setInstantiationOfMemberEnum(Reader.getContext(), InstED, TSK);
853 RD->setODRHash(Record.readInt());
859 RecordDecl *&OldDef = Reader.RecordDefinitions[Canon];
864 if (!D->isFromASTFile() && D->isCompleteDefinition()) {
871 Reader.MergedDeclContexts.insert(std::make_pair(RD, OldDef));
873 Reader.mergeDefinitionVisibility(OldDef, RD);
875 Reader.PendingRecordOdrMergeFailures[OldDef].push_back(RD);
888 DeferredTypeID = Record.getGlobalTypeID(Record.readInt());
890 VD->
setType(Record.readType());
895 if (Record.readInt())
897 ECD->
setInitVal(Reader.getContext(), Record.readAPSInt());
904 if (Record.readInt()) {
905 auto *Info =
new (Reader.getContext()) DeclaratorDecl::ExtInfo();
906 Record.readQualifierInfo(*Info);
912 QualType TSIType = Record.readType();
914 TSIType.
isNull() ?
nullptr
915 : Reader.getContext().CreateTypeSourceInfo(TSIType));
930 auto *
Template = readDeclAs<FunctionTemplateDecl>();
936 auto *InstFD = readDeclAs<FunctionDecl>();
939 FD->setInstantiationOfMemberFunction(Reader.getContext(), InstFD, TSK);
944 auto *
Template = readDeclAs<FunctionTemplateDecl>();
949 Record.readTemplateArgumentList(TemplArgs,
true);
953 bool HasTemplateArgumentsAsWritten = Record.readBool();
954 if (HasTemplateArgumentsAsWritten)
955 Record.readTemplateArgumentListInfo(TemplArgsWritten);
964 if (Record.readInt()) {
965 auto *FD = readDeclAs<FunctionDecl>();
976 HasTemplateArgumentsAsWritten ? &TemplArgsWritten :
nullptr, POI,
978 FD->TemplateOrSpecialization = FTInfo;
983 auto *CanonTemplate = readDeclAs<FunctionTemplateDecl>();
989 llvm::FoldingSetNodeID ID;
991 void *InsertPos =
nullptr;
998 assert(Reader.getContext().getLangOpts().Modules &&
999 "already deserialized this template specialization");
1008 unsigned NumCandidates = Record.readInt();
1009 while (NumCandidates--)
1010 Candidates.
addDecl(readDeclAs<NamedDecl>());
1014 bool HasTemplateArgumentsAsWritten = Record.readBool();
1015 if (HasTemplateArgumentsAsWritten)
1016 Record.readTemplateArgumentListInfo(TemplArgsWritten);
1019 Reader.getContext(), Candidates,
1020 HasTemplateArgumentsAsWritten ? &TemplArgsWritten :
nullptr);
1039 Reader.PendingDeducedFunctionTypes.push_back({FD, DeferredTypeID});
1041 FD->
setType(Reader.GetType(DeferredTypeID));
1045 FD->DNLoc = Record.readDeclarationNameLoc(FD->
getDeclName());
1061 const bool Pure = FunctionDeclBits.
getNextBit();
1082 FD->EndRangeLoc = readSourceLocation();
1086 FD->ODRHash = Record.readInt();
1087 FD->setHasODRHash(
true);
1093 if (
auto Info = Record.readInt()) {
1094 bool HasMessage = Info & 2;
1098 unsigned NumLookups = Record.readInt();
1100 for (
unsigned I = 0; I != NumLookups; ++I) {
1108 Reader.getContext(), Lookups, DeletedMessage));
1113 MergeImpl.mergeRedeclarable(FD, Existing, Redecl);
1119 auto merge = [
this, &Redecl, FD](
auto &&F) {
1120 auto *Existing = cast_or_null<FunctionDecl>(Redecl.getKnownMergeTarget());
1121 RedeclarableResult NewRedecl(Existing ? F(Existing) :
nullptr,
1122 Redecl.getFirstID(), Redecl.isKeyDecl());
1140 unsigned NumParams = Record.readInt();
1142 Params.reserve(NumParams);
1143 for (
unsigned I = 0; I != NumParams; ++I)
1144 Params.push_back(readDeclAs<ParmVarDecl>());
1145 FD->setParams(Reader.getContext(), Params);
1150 if (FD->
hasAttr<SYCLKernelEntryPointAttr>()) {
1151 auto *SKEPAttr = FD->
getAttr<SYCLKernelEntryPointAttr>();
1153 const SYCLKernelInfo *SKI =
C.findSYCLKernelInfo(SKEPAttr->getKernelName());
1156 Reader.Diag(FD->
getLocation(), diag::err_sycl_kernel_name_conflict)
1159 diag::note_previous_declaration);
1160 SKEPAttr->setInvalidAttr();
1163 C.registerSYCLEntryPointFunction(FD);
1170 if (Record.readInt()) {
1173 Reader.PendingBodies[MD] = GetCurrentCursorOffset();
1176 MD->
setCmdDecl(readDeclAs<ImplicitParamDecl>());
1188 Reader.getContext().setObjCMethodRedeclaration(MD,
1189 readDeclAs<ObjCMethodDecl>());
1197 MD->DeclEndLoc = readSourceLocation();
1198 unsigned NumParams = Record.readInt();
1200 Params.reserve(NumParams);
1201 for (
unsigned I = 0; I != NumParams; ++I)
1202 Params.push_back(readDeclAs<ParmVarDecl>());
1205 unsigned NumStoredSelLocs = Record.readInt();
1207 SelLocs.reserve(NumStoredSelLocs);
1208 for (
unsigned i = 0; i != NumStoredSelLocs; ++i)
1209 SelLocs.push_back(readSourceLocation());
1211 MD->setParamsAndSelLocs(Reader.getContext(), Params, SelLocs);
1217 D->Variance = Record.readInt();
1218 D->Index = Record.readInt();
1219 D->VarianceLoc = readSourceLocation();
1220 D->ColonLoc = readSourceLocation();
1230 unsigned numParams = Record.readInt();
1235 typeParams.reserve(numParams);
1236 for (
unsigned i = 0; i != numParams; ++i) {
1237 auto *typeParam = readDeclAs<ObjCTypeParamDecl>();
1241 typeParams.push_back(typeParam);
1248 typeParams, rAngleLoc);
1251void ASTDeclReader::ReadObjCDefinitionData(
1252 struct ObjCInterfaceDecl::DefinitionData &
Data) {
1254 Data.SuperClassTInfo = readTypeSourceInfo();
1256 Data.EndLoc = readSourceLocation();
1257 Data.HasDesignatedInitializers =
Record.readInt();
1259 Data.HasODRHash =
true;
1262 unsigned NumProtocols =
Record.readInt();
1264 Protocols.reserve(NumProtocols);
1265 for (
unsigned I = 0; I != NumProtocols; ++I)
1266 Protocols.push_back(readDeclAs<ObjCProtocolDecl>());
1268 ProtoLocs.reserve(NumProtocols);
1269 for (
unsigned I = 0; I != NumProtocols; ++I)
1270 ProtoLocs.push_back(readSourceLocation());
1271 Data.ReferencedProtocols.set(Protocols.data(), NumProtocols, ProtoLocs.data(),
1275 NumProtocols =
Record.readInt();
1277 Protocols.reserve(NumProtocols);
1278 for (
unsigned I = 0; I != NumProtocols; ++I)
1279 Protocols.push_back(readDeclAs<ObjCProtocolDecl>());
1280 Data.AllReferencedProtocols.set(Protocols.data(), NumProtocols,
1286 struct ObjCInterfaceDecl::DefinitionData &DD = D->data();
1287 if (DD.Definition == NewDD.Definition)
1290 Reader.MergedDeclContexts.insert(
1291 std::make_pair(NewDD.Definition, DD.Definition));
1292 Reader.mergeDefinitionVisibility(DD.Definition, NewDD.Definition);
1295 Reader.PendingObjCInterfaceOdrMergeFailures[DD.Definition].push_back(
1296 {NewDD.Definition, &NewDD});
1302 DeferredTypeID = Record.getGlobalTypeID(Record.readInt());
1306 if (Record.readInt()) {
1308 ID->allocateDefinitionData();
1310 ReadObjCDefinitionData(ID->data());
1312 if (Canon->Data.getPointer()) {
1315 MergeImpl.MergeDefinitionData(Canon, std::move(ID->data()));
1316 ID->Data = Canon->Data;
1320 ID->getCanonicalDecl()->Data = ID->Data;
1323 ID->setIvarList(
nullptr);
1327 Reader.PendingDefinitions.insert(ID);
1330 Reader.ObjCClassesLoaded.push_back(ID);
1332 ID->Data = ID->getCanonicalDecl()->Data;
1341 bool synth = Record.readInt();
1356 if (PrevIvar && PrevIvar != IVD) {
1357 auto *ParentExt = dyn_cast<ObjCCategoryDecl>(IVD->
getDeclContext());
1358 auto *PrevParentExt =
1360 if (ParentExt && PrevParentExt) {
1364 .PendingObjCExtensionIvarRedeclarations[std::make_pair(ParentExt,
1366 .push_back(std::make_pair(IVD, PrevIvar));
1367 }
else if (ParentExt || PrevParentExt) {
1371 Reader.Diag(IVD->
getLocation(), diag::err_duplicate_ivar_declaration)
1373 Reader.Diag(PrevIvar->
getLocation(), diag::note_previous_definition);
1378void ASTDeclReader::ReadObjCDefinitionData(
1379 struct ObjCProtocolDecl::DefinitionData &
Data) {
1380 unsigned NumProtoRefs =
Record.readInt();
1382 ProtoRefs.reserve(NumProtoRefs);
1383 for (
unsigned I = 0; I != NumProtoRefs; ++I)
1384 ProtoRefs.push_back(readDeclAs<ObjCProtocolDecl>());
1386 ProtoLocs.reserve(NumProtoRefs);
1387 for (
unsigned I = 0; I != NumProtoRefs; ++I)
1388 ProtoLocs.push_back(readSourceLocation());
1389 Data.ReferencedProtocols.set(ProtoRefs.data(), NumProtoRefs,
1392 Data.HasODRHash =
true;
1397 struct ObjCProtocolDecl::DefinitionData &DD = D->data();
1398 if (DD.Definition == NewDD.Definition)
1401 Reader.MergedDeclContexts.insert(
1402 std::make_pair(NewDD.Definition, DD.Definition));
1403 Reader.mergeDefinitionVisibility(DD.Definition, NewDD.Definition);
1406 Reader.PendingObjCProtocolOdrMergeFailures[DD.Definition].push_back(
1407 {NewDD.Definition, &NewDD});
1415 if (Record.readInt()) {
1417 PD->allocateDefinitionData();
1419 ReadObjCDefinitionData(PD->data());
1422 if (Canon->Data.getPointer()) {
1425 MergeImpl.MergeDefinitionData(Canon, std::move(PD->data()));
1426 PD->Data = Canon->Data;
1433 Reader.PendingDefinitions.insert(PD);
1452 Reader.CategoriesDeserialized.insert(CD);
1454 CD->ClassInterface = readDeclAs<ObjCInterfaceDecl>();
1456 unsigned NumProtoRefs = Record.readInt();
1458 ProtoRefs.reserve(NumProtoRefs);
1459 for (
unsigned I = 0; I != NumProtoRefs; ++I)
1460 ProtoRefs.push_back(readDeclAs<ObjCProtocolDecl>());
1462 ProtoLocs.reserve(NumProtoRefs);
1463 for (
unsigned I = 0; I != NumProtoRefs; ++I)
1464 ProtoLocs.push_back(readSourceLocation());
1466 Reader.getContext());
1472 Reader.getContext());
1510 D->CategoryNameLoc = readSourceLocation();
1516 D->SuperLoc = readSourceLocation();
1521 D->NumIvarInitializers = Record.readInt();
1522 if (D->NumIvarInitializers)
1523 D->IvarInitializers = ReadGlobalOffset();
1530 D->PropertyIvarDecl = readDeclAs<ObjCIvarDecl>();
1531 D->IvarLoc = readSourceLocation();
1540 FD->Mutable = Record.readInt();
1542 unsigned Bits = Record.readInt();
1543 FD->StorageKind = Bits >> 1;
1544 if (FD->StorageKind == FieldDecl::ISK_CapturedVLAType)
1552 if (
auto *Tmpl = readDeclAs<FieldDecl>())
1553 Reader.getContext().setInstantiatedFromUnnamedFieldDecl(FD, Tmpl);
1560 PD->GetterId = Record.readIdentifier();
1561 PD->SetterId = Record.readIdentifier();
1566 D->PartVal.
Part1 = Record.readInt();
1567 D->PartVal.
Part2 = Record.readInt();
1568 D->PartVal.
Part3 = Record.readInt();
1570 C = Record.readInt();
1573 if (
MSGuidDecl *Existing = Reader.getContext().MSGuidDecls.GetOrInsertNode(D))
1580 D->Value = Record.readAPValue();
1584 Reader.getContext().UnnamedGlobalConstantDecls.GetOrInsertNode(D))
1590 D->Value = Record.readAPValue();
1595 Reader.getContext().TemplateParamObjectDecls.GetOrInsertNode(D))
1602 FD->ChainingSize = Record.readInt();
1603 assert(FD->ChainingSize >= 2 &&
"Anonymous chaining must be >= 2");
1604 FD->Chaining =
new (Reader.getContext())
NamedDecl*[FD->ChainingSize];
1606 for (
unsigned I = 0; I != FD->ChainingSize; ++I)
1607 FD->Chaining[I] = readDeclAs<NamedDecl>();
1618 bool DefGeneratedInModule = VarDeclBits.
getNextBit();
1623 bool HasDeducedType =
false;
1651 Reader.PendingDeducedVarTypes.push_back({VD, DeferredTypeID});
1653 VD->
setType(Reader.GetType(DeferredTypeID));
1663 if (DefGeneratedInModule) {
1664 Reader.DefinitionSource[VD] =
1666 Reader.getContext().getLangOpts().BuildingPCHWithObjectFile;
1669 if (VD->
hasAttr<BlocksAttr>()) {
1670 Expr *CopyExpr = Record.readExpr();
1672 Reader.getContext().setBlockVarCopyInit(VD, CopyExpr, Record.readInt());
1676 VarNotTemplate = 0,
VarTemplate, StaticDataMemberSpecialization
1678 switch ((VarKind)Record.readInt()) {
1679 case VarNotTemplate:
1690 case StaticDataMemberSpecialization: {
1691 auto *Tmpl = readDeclAs<VarDecl>();
1694 Reader.getContext().setInstantiatedFromStaticDataMember(VD, Tmpl, TSK,POI);
1704 if (uint64_t Val = Record.readInt()) {
1714 Reader.getContext().addDestruction(&Eval->
Evaluated);
1720 Eval->
Value = GetCurrentCursorOffset();
1731 unsigned scopeIndex = Record.readInt();
1733 unsigned isObjCMethodParam = ParmVarDeclBits.
getNextBit();
1734 unsigned scopeDepth = ParmVarDeclBits.
getNextBits(7);
1735 unsigned declQualifier = ParmVarDeclBits.
getNextBits(7);
1736 if (isObjCMethodParam) {
1737 assert(scopeDepth == 0);
1750 PD->ExplicitObjectParameterIntroducerLoc = Record.readSourceLocation();
1758 auto **BDs = DD->getTrailingObjects();
1759 for (
unsigned I = 0; I != DD->NumBindings; ++I) {
1760 BDs[I] = readDeclAs<BindingDecl>();
1761 BDs[I]->setDecomposedDecl(DD);
1767 BD->Binding = Record.readExpr();
1778 D->Statement = Record.readStmt();
1783 BD->
setBody(cast_or_null<CompoundStmt>(Record.readStmt()));
1785 unsigned NumParams = Record.readInt();
1787 Params.reserve(NumParams);
1788 for (
unsigned I = 0; I != NumParams; ++I)
1789 Params.push_back(readDeclAs<ParmVarDecl>());
1798 bool capturesCXXThis = Record.readInt();
1799 unsigned numCaptures = Record.readInt();
1801 captures.reserve(numCaptures);
1802 for (
unsigned i = 0; i != numCaptures; ++i) {
1803 auto *
decl = readDeclAs<VarDecl>();
1804 unsigned flags = Record.readInt();
1805 bool byRef = (flags & 1);
1806 bool nested = (flags & 2);
1807 Expr *copyExpr = ((flags & 4) ? Record.readExpr() :
nullptr);
1811 BD->
setCaptures(Reader.getContext(), captures, capturesCXXThis);
1817 for (
unsigned I = 0; I < D->NumParams; ++I)
1818 D->
setParam(I, readDeclAs<ImplicitParamDecl>());
1820 D->
setBody(cast_or_null<Stmt>(Record.readStmt()));
1825 unsigned ContextParamPos = Record.readInt();
1828 for (
unsigned I = 0; I < CD->NumParams; ++I) {
1829 if (I != ContextParamPos)
1830 CD->
setParam(I, readDeclAs<ImplicitParamDecl>());
1845 D->RBraceLoc = readSourceLocation();
1860 D->LocStart = readSourceLocation();
1861 D->RBraceLoc = readSourceLocation();
1868 if (Redecl.getFirstID() == ThisDeclID)
1869 AnonNamespace = readDeclID();
1873 if (AnonNamespace.
isValid()) {
1878 if (!Record.isModule())
1887 D->IsCBuffer = Record.readBool();
1888 D->KwLoc = readSourceLocation();
1889 D->LBraceLoc = readSourceLocation();
1890 D->RBraceLoc = readSourceLocation();
1896 D->NamespaceLoc = readSourceLocation();
1897 D->IdentLoc = readSourceLocation();
1898 D->QualifierLoc = Record.readNestedNameSpecifierLoc();
1899 D->Namespace = readDeclAs<NamespaceBaseDecl>();
1906 D->QualifierLoc = Record.readNestedNameSpecifierLoc();
1907 D->DNLoc = Record.readDeclarationNameLoc(D->
getDeclName());
1908 D->FirstUsingShadow.setPointer(readDeclAs<UsingShadowDecl>());
1910 if (
auto *Pattern = readDeclAs<NamedDecl>())
1911 Reader.getContext().setInstantiatedFromUsingDecl(D, Pattern);
1920 D->FirstUsingShadow.setPointer(readDeclAs<UsingShadowDecl>());
1921 if (
auto *Pattern = readDeclAs<UsingEnumDecl>())
1922 Reader.getContext().setInstantiatedFromUsingEnumDecl(D, Pattern);
1928 D->InstantiatedFrom = readDeclAs<NamedDecl>();
1929 auto **Expansions = D->getTrailingObjects();
1930 for (
unsigned I = 0; I != D->NumExpansions; ++I)
1931 Expansions[I] = readDeclAs<NamedDecl>();
1938 D->Underlying = readDeclAs<NamedDecl>();
1940 D->UsingOrNextShadow = readDeclAs<NamedDecl>();
1941 auto *Pattern = readDeclAs<UsingShadowDecl>();
1943 Reader.getContext().setInstantiatedFromUsingShadowDecl(D, Pattern);
1950 D->NominatedBaseClassShadowDecl = readDeclAs<ConstructorUsingShadowDecl>();
1951 D->ConstructedBaseClassShadowDecl = readDeclAs<ConstructorUsingShadowDecl>();
1952 D->IsVirtual = Record.readInt();
1957 D->UsingLoc = readSourceLocation();
1958 D->NamespaceLoc = readSourceLocation();
1959 D->QualifierLoc = Record.readNestedNameSpecifierLoc();
1960 D->NominatedNamespace = readDeclAs<NamedDecl>();
1961 D->CommonAncestor = readDeclAs<DeclContext>();
1967 D->QualifierLoc = Record.readNestedNameSpecifierLoc();
1968 D->DNLoc = Record.readDeclarationNameLoc(D->
getDeclName());
1969 D->EllipsisLoc = readSourceLocation();
1976 D->TypenameLocation = readSourceLocation();
1977 D->QualifierLoc = Record.readNestedNameSpecifierLoc();
1978 D->EllipsisLoc = readSourceLocation();
1987void ASTDeclReader::ReadCXXDefinitionData(
1989 Decl *LambdaContext,
unsigned IndexInLambdaContext) {
1993#define FIELD(Name, Width, Merge) \
1994 if (!CXXRecordDeclBits.canGetNextNBits(Width)) \
1995 CXXRecordDeclBits.updateValue(Record.readInt()); \
1996 Data.Name = CXXRecordDeclBits.getNextBits(Width);
1998#include "clang/AST/CXXRecordDeclDefinitionBits.def"
2003 Data.HasODRHash =
true;
2006 Reader.DefinitionSource[D] =
2007 Loc.F->
Kind == ModuleKind::MK_MainFile ||
2012 Data.ComputedVisibleConversions =
Record.readInt();
2013 if (
Data.ComputedVisibleConversions)
2014 Record.readUnresolvedSet(
Data.VisibleConversions);
2015 assert(
Data.Definition &&
"Data.Definition should be already set!");
2017 if (!
Data.IsLambda) {
2018 assert(!LambdaContext && !IndexInLambdaContext &&
2019 "given lambda context for non-lambda");
2023 Data.Bases = ReadGlobalOffset();
2027 Data.VBases = ReadGlobalOffset();
2031 using Capture = LambdaCapture;
2033 auto &Lambda =
static_cast<CXXRecordDecl::LambdaDefinitionData &
>(
Data);
2035 BitsUnpacker LambdaBits(Record.readInt());
2036 Lambda.DependencyKind = LambdaBits.getNextBits(2);
2037 Lambda.IsGenericLambda = LambdaBits.getNextBit();
2038 Lambda.CaptureDefault = LambdaBits.getNextBits(2);
2039 Lambda.NumCaptures = LambdaBits.getNextBits(15);
2040 Lambda.HasKnownInternalLinkage = LambdaBits.getNextBit();
2042 Lambda.NumExplicitCaptures = Record.readInt();
2043 Lambda.ManglingNumber = Record.readInt();
2044 if (
unsigned DeviceManglingNumber = Record.readInt())
2045 Reader.getContext().DeviceLambdaManglingNumbers[D] = DeviceManglingNumber;
2046 Lambda.IndexInContext = IndexInLambdaContext;
2047 Lambda.ContextDecl = LambdaContext;
2049 if (Lambda.NumCaptures) {
2050 ToCapture = (
Capture *)Reader.getContext().Allocate(
sizeof(
Capture) *
2051 Lambda.NumCaptures);
2052 Lambda.AddCaptureList(Reader.getContext(), ToCapture);
2054 Lambda.MethodTyInfo = readTypeSourceInfo();
2055 for (
unsigned I = 0, N = Lambda.NumCaptures; I != N; ++I) {
2056 SourceLocation Loc = readSourceLocation();
2057 BitsUnpacker CaptureBits(Record.readInt());
2058 bool IsImplicit = CaptureBits.getNextBit();
2066 Capture(Loc, IsImplicit, Kind,
nullptr, SourceLocation());
2071 auto *Var = readDeclAs<ValueDecl>();
2072 SourceLocation EllipsisLoc = readSourceLocation();
2073 new (ToCapture)
Capture(Loc, IsImplicit, Kind, Var, EllipsisLoc);
2082 CXXRecordDecl *D,
struct CXXRecordDecl::DefinitionData &&MergeDD) {
2083 assert(D->DefinitionData &&
2084 "merging class definition into non-definition");
2085 auto &DD = *D->DefinitionData;
2087 if (DD.Definition != MergeDD.Definition) {
2089 Reader.MergedDeclContexts.insert(std::make_pair(MergeDD.Definition,
2091 Reader.PendingDefinitions.erase(MergeDD.Definition);
2092 MergeDD.Definition->demoteThisDefinitionToDeclaration();
2093 Reader.mergeDefinitionVisibility(DD.Definition, MergeDD.Definition);
2094 assert(!Reader.Lookups.contains(MergeDD.Definition) &&
2095 "already loaded pending lookups for merged definition");
2098 auto PFDI = Reader.PendingFakeDefinitionData.find(&DD);
2099 if (PFDI != Reader.PendingFakeDefinitionData.end() &&
2100 PFDI->second == ASTReader::PendingFakeDefinitionKind::Fake) {
2103 assert(!DD.IsLambda && !MergeDD.IsLambda &&
"faked up lambda definition?");
2104 PFDI->second = ASTReader::PendingFakeDefinitionKind::FakeLoaded;
2108 auto *Def = DD.Definition;
2109 DD = std::move(MergeDD);
2110 DD.Definition = Def;
2111 for (
auto *R = Reader.getMostRecentExistingDecl(Def); R;
2112 R = R->getPreviousDecl())
2117 bool DetectedOdrViolation =
false;
2119 #define FIELD(Name, Width, Merge) Merge(Name)
2120 #define MERGE_OR(Field) DD.Field |= MergeDD.Field;
2121 #define NO_MERGE(Field) \
2122 DetectedOdrViolation |= DD.Field != MergeDD.Field; \
2124 #include "clang/AST/CXXRecordDeclDefinitionBits.def"
2129 if (DD.NumBases != MergeDD.NumBases || DD.NumVBases != MergeDD.NumVBases)
2130 DetectedOdrViolation =
true;
2136 if (MergeDD.ComputedVisibleConversions && !DD.ComputedVisibleConversions) {
2137 DD.VisibleConversions = std::move(MergeDD.VisibleConversions);
2138 DD.ComputedVisibleConversions =
true;
2145 auto &Lambda1 =
static_cast<CXXRecordDecl::LambdaDefinitionData &
>(DD);
2146 auto &Lambda2 =
static_cast<CXXRecordDecl::LambdaDefinitionData &
>(MergeDD);
2147 DetectedOdrViolation |= Lambda1.DependencyKind != Lambda2.DependencyKind;
2148 DetectedOdrViolation |= Lambda1.IsGenericLambda != Lambda2.IsGenericLambda;
2149 DetectedOdrViolation |= Lambda1.CaptureDefault != Lambda2.CaptureDefault;
2150 DetectedOdrViolation |= Lambda1.NumCaptures != Lambda2.NumCaptures;
2151 DetectedOdrViolation |=
2152 Lambda1.NumExplicitCaptures != Lambda2.NumExplicitCaptures;
2153 DetectedOdrViolation |=
2154 Lambda1.HasKnownInternalLinkage != Lambda2.HasKnownInternalLinkage;
2155 DetectedOdrViolation |= Lambda1.ManglingNumber != Lambda2.ManglingNumber;
2157 if (Lambda1.NumCaptures && Lambda1.NumCaptures == Lambda2.NumCaptures) {
2158 for (
unsigned I = 0, N = Lambda1.NumCaptures; I != N; ++I) {
2163 Lambda1.AddCaptureList(Reader.getContext(), Lambda2.Captures.front());
2172 DetectedOdrViolation =
true;
2175 if (DetectedOdrViolation)
2176 Reader.PendingOdrMergeFailures[DD.Definition].push_back(
2177 {MergeDD.Definition, &MergeDD});
2181 Decl *LambdaContext,
2182 unsigned IndexInLambdaContext) {
2183 struct CXXRecordDecl::DefinitionData *DD;
2188 bool IsLambda =
Record.readInt();
2189 assert(!(IsLambda &&
Update) &&
2190 "lambda definition should not be added by update record");
2192 DD =
new (
C) CXXRecordDecl::LambdaDefinitionData(
2195 DD =
new (
C)
struct CXXRecordDecl::DefinitionData(D);
2201 if (!Canon->DefinitionData)
2202 Canon->DefinitionData = DD;
2203 D->DefinitionData = Canon->DefinitionData;
2204 ReadCXXDefinitionData(*DD, D, LambdaContext, IndexInLambdaContext);
2212 if (Canon->DefinitionData != DD) {
2220 if (
Update || Canon != D)
2221 Reader.PendingDefinitions.insert(D);
2230 CXXRecNotTemplate = 0,
2232 CXXRecMemberSpecialization,
2236 Decl *LambdaContext =
nullptr;
2237 unsigned IndexInLambdaContext = 0;
2239 switch ((CXXRecKind)Record.readInt()) {
2240 case CXXRecNotTemplate:
2245 case CXXRecTemplate: {
2247 auto *
Template = readDeclAs<ClassTemplateDecl>();
2248 D->TemplateOrInstantiation =
Template;
2251 case CXXRecMemberSpecialization: {
2252 auto *RD = readDeclAs<CXXRecordDecl>();
2257 D->TemplateOrInstantiation = MSI;
2262 LambdaContext = readDecl();
2264 IndexInLambdaContext = Record.readInt();
2266 MergeImpl.mergeLambda(D, Redecl, *LambdaContext, IndexInLambdaContext);
2275 bool WasDefinition = Record.readInt();
2277 ReadCXXRecordDefinition(D,
false, LambdaContext,
2278 IndexInLambdaContext);
2285 if (WasDefinition) {
2298 D->setExplicitSpecifier(Record.readExplicitSpec());
2299 D->Ctor = readDeclAs<CXXConstructorDecl>();
2312 unsigned NumOverridenMethods = Record.readInt();
2314 while (NumOverridenMethods--) {
2317 if (
auto *MD = readDeclAs<CXXMethodDecl>())
2323 Record.skipInts(NumOverridenMethods);
2332 auto *Shadow = readDeclAs<ConstructorUsingShadowDecl>();
2333 auto *Ctor = readDeclAs<CXXConstructorDecl>();
2346 if (
auto *OperatorDelete = readDeclAs<FunctionDecl>()) {
2347 auto *ThisArg = Record.readExpr();
2350 C.addOperatorDeleteForVDtor(D, OperatorDelete,
2352 Canon->OperatorDeleteThisArg = ThisArg;
2355 if (
auto *OperatorGlobDelete = readDeclAs<FunctionDecl>()) {
2356 if (!
C.dtorHasOperatorDelete(D,
2358 C.addOperatorDeleteForVDtor(
2361 if (
auto *OperatorArrayDelete = readDeclAs<FunctionDecl>()) {
2363 C.addOperatorDeleteForVDtor(D, OperatorArrayDelete,
2366 if (
auto *OperatorGlobArrayDelete = readDeclAs<FunctionDecl>()) {
2367 if (!
C.dtorHasOperatorDelete(D,
2369 C.addOperatorDeleteForVDtor(D, OperatorGlobArrayDelete,
2381 D->ImportedModule = readModule();
2382 D->setImportComplete(Record.readInt());
2383 auto *StoredLocs = D->getTrailingObjects();
2384 for (
unsigned I = 0, N = Record.back(); I != N; ++I)
2385 StoredLocs[I] = readSourceLocation();
2396 if (Record.readInt())
2397 D->Friend = readDeclAs<NamedDecl>();
2399 D->Friend = readTypeSourceInfo();
2400 for (
unsigned i = 0; i != D->NumTPLists; ++i)
2401 D->getTrailingObjects()[i] = Record.readTemplateParameterList();
2402 D->NextFriend = readDeclID().getRawValue();
2403 D->UnsupportedFriend = (Record.readInt() != 0);
2404 D->FriendLoc = readSourceLocation();
2405 D->EllipsisLoc = readSourceLocation();
2410 unsigned NumParams = Record.readInt();
2411 D->NumParams = NumParams;
2413 for (
unsigned i = 0; i != NumParams; ++i)
2414 D->Params[i] = Record.readTemplateParameterList();
2415 if (Record.readInt())
2416 D->Friend = readDeclAs<NamedDecl>();
2418 D->Friend = readTypeSourceInfo();
2419 D->FriendLoc = readSourceLocation();
2427 D->
init(readDeclAs<NamedDecl>());
2442 for (
unsigned I = 0; I < D->NumTemplateArgs; ++I)
2443 Args.push_back(Record.readTemplateArgument(
false));
2451 llvm::BitstreamCursor &DeclsCursor,
2453 uint64_t Offset = ReadLocalOffset();
2455 Reader.ReadSpecializations(M, DeclsCursor, Offset, D, IsPartial);
2469 Reader.PendingDefinitions.insert(CanonD);
2475 if (ThisDeclID == Redecl.getFirstID()) {
2476 if (
auto *RTD = readDeclAs<RedeclarableTemplateDecl>()) {
2477 assert(RTD->getKind() == D->
getKind() &&
2478 "InstantiatedFromMemberTemplate kind mismatch");
2480 if (Record.readInt())
2495 if (ThisDeclID == Redecl.getFirstID()) {
2504 llvm_unreachable(
"BuiltinTemplates are not serialized");
2514 if (ThisDeclID == Redecl.getFirstID()) {
2527 if (
Decl *InstD = readDecl()) {
2528 if (
auto *CTD = dyn_cast<ClassTemplateDecl>(InstD)) {
2529 D->SpecializedTemplate = CTD;
2532 Record.readTemplateArgumentList(TemplArgs);
2537 SpecializedPartialSpecialization();
2538 PS->PartialSpecialization
2540 PS->TemplateArgs = ArgList;
2541 D->SpecializedTemplate = PS;
2546 Record.readTemplateArgumentList(TemplArgs,
true);
2548 D->PointOfInstantiation = readSourceLocation();
2550 D->StrictPackMatch = Record.readBool();
2552 bool writtenAsCanonicalDecl = Record.readInt();
2553 if (writtenAsCanonicalDecl) {
2554 auto *CanonPattern = readDeclAs<ClassTemplateDecl>();
2558 if (
auto *Partial = dyn_cast<ClassTemplatePartialSpecializationDecl>(D)) {
2559 CanonSpec = CanonPattern->getCommonPtr()->PartialSpecializations
2560 .GetOrInsertNode(Partial);
2563 CanonPattern->getCommonPtr()->Specializations.GetOrInsertNode(D);
2566 if (CanonSpec != D) {
2567 MergeImpl.mergeRedeclarable<
TagDecl>(D, CanonSpec, Redecl);
2571 if (
auto *DDD = D->DefinitionData) {
2572 if (CanonSpec->DefinitionData)
2573 MergeImpl.MergeDefinitionData(CanonSpec, std::move(*DDD));
2575 CanonSpec->DefinitionData = D->DefinitionData;
2577 D->DefinitionData = CanonSpec->DefinitionData;
2583 if (Record.readBool()) {
2586 ExplicitInfo->TemplateKeywordLoc = readSourceLocation();
2587 D->ExplicitInfo = ExplicitInfo;
2590 if (Record.readBool())
2601 D->TemplateParams = Params;
2606 if (ThisDeclID == Redecl.getFirstID()) {
2607 D->InstantiatedFromMember.setPointer(
2608 readDeclAs<ClassTemplatePartialSpecializationDecl>());
2609 D->InstantiatedFromMember.setInt(Record.readInt());
2616 if (ThisDeclID == Redecl.getFirstID()) {
2630 if (
Decl *InstD = readDecl()) {
2631 if (
auto *VTD = dyn_cast<VarTemplateDecl>(InstD)) {
2632 D->SpecializedTemplate = VTD;
2635 Record.readTemplateArgumentList(TemplArgs);
2640 VarTemplateSpecializationDecl::SpecializedPartialSpecialization();
2641 PS->PartialSpecialization =
2643 PS->TemplateArgs = ArgList;
2644 D->SpecializedTemplate = PS;
2649 if (Record.readBool()) {
2652 ExplicitInfo->TemplateKeywordLoc = readSourceLocation();
2653 D->ExplicitInfo = ExplicitInfo;
2656 if (Record.readBool())
2660 Record.readTemplateArgumentList(TemplArgs,
true);
2662 D->PointOfInstantiation = readSourceLocation();
2664 D->IsCompleteDefinition = Record.readInt();
2668 bool writtenAsCanonicalDecl = Record.readInt();
2669 if (writtenAsCanonicalDecl) {
2670 auto *CanonPattern = readDeclAs<VarTemplateDecl>();
2673 if (
auto *Partial = dyn_cast<VarTemplatePartialSpecializationDecl>(D)) {
2674 CanonSpec = CanonPattern->getCommonPtr()
2675 ->PartialSpecializations.GetOrInsertNode(Partial);
2678 CanonPattern->getCommonPtr()->Specializations.GetOrInsertNode(D);
2682 MergeImpl.mergeRedeclarable<
VarDecl>(D, CanonSpec, Redecl);
2697 D->TemplateParams = Params;
2702 if (ThisDeclID == Redecl.getFirstID()) {
2703 D->InstantiatedFromMember.setPointer(
2704 readDeclAs<VarTemplatePartialSpecializationDecl>());
2705 D->InstantiatedFromMember.setInt(Record.readInt());
2715 if (TypeConstraintInitialized) {
2717 if (Record.readBool())
2718 CR = Record.readConceptReference();
2719 Expr *ImmediatelyDeclaredConstraint = Record.readExpr();
2723 D->NumExpanded = Record.readUnsignedOrNone();
2726 if (Record.readInt())
2728 Record.readTemplateArgumentLoc());
2739 auto TypesAndInfos =
2740 D->getTrailingObjects<std::pair<QualType, TypeSourceInfo *>>();
2742 new (&TypesAndInfos[I].first)
QualType(Record.readType());
2743 TypesAndInfos[I].second = readTypeSourceInfo();
2747 D->ParameterPack = Record.readInt();
2748 if (Record.readInt())
2750 Record.readTemplateArgumentLoc());
2762 auto **
Data = D->getTrailingObjects();
2765 Data[I] = Record.readTemplateParameterList();
2768 D->ParameterPack = Record.readInt();
2769 if (Record.readInt())
2771 Record.readTemplateArgumentLoc());
2782 D->AssertExprAndFailed.setPointer(Record.readExpr());
2783 D->AssertExprAndFailed.setInt(Record.readInt());
2784 D->Message = cast_or_null<StringLiteral>(Record.readExpr());
2785 D->RParenLoc = readSourceLocation();
2795 D->ExtendingDecl = readDeclAs<ValueDecl>();
2796 D->ExprWithTemporary = Record.readStmt();
2797 if (Record.readInt()) {
2801 D->ManglingNumber = Record.readInt();
2813template <
typename T>
2816 Decl *MergeWith =
nullptr;
2818 bool IsKeyDecl = ThisDeclID == FirstDeclID;
2819 bool IsFirstLocalDecl =
false;
2821 uint64_t RedeclOffset = 0;
2826 FirstDeclID = ThisDeclID;
2828 IsFirstLocalDecl =
true;
2829 }
else if (
unsigned N = Record.readInt()) {
2833 IsFirstLocalDecl =
true;
2840 for (
unsigned I = 0; I != N - 1; ++I)
2841 MergeWith = readDecl();
2843 RedeclOffset = ReadLocalOffset();
2850 auto *FirstDecl = cast_or_null<T>(Reader.GetDecl(FirstDeclID));
2851 if (FirstDecl != D) {
2857 D->
First = FirstDecl->getCanonicalDecl();
2860 auto *DAsT =
static_cast<T *
>(D);
2866 if (IsFirstLocalDecl)
2867 Reader.PendingDeclChains.push_back(std::make_pair(DAsT, RedeclOffset));
2869 return RedeclarableResult(MergeWith, FirstDeclID, IsKeyDecl);
2874template <
typename T>
2876 RedeclarableResult &Redecl) {
2878 if (!Reader.getContext().getLangOpts().Modules)
2885 auto *D =
static_cast<T *
>(DBase);
2887 if (
auto *Existing = Redecl.getKnownMergeTarget())
2889 MergeImpl.mergeRedeclarable(D,
cast<T>(Existing), Redecl);
2890 else if (FindExistingResult ExistingRes = findExisting(D))
2891 if (T *Existing = ExistingRes)
2892 MergeImpl.mergeRedeclarable(D, Existing, Redecl);
2902 Decl &Context,
unsigned IndexInContext) {
2904 if (!Reader.getContext().getLangOpts().Modules)
2911 if (
auto *Existing = Redecl.getKnownMergeTarget())
2917 NamedDecl *&Slot = Reader.LambdaDeclarationsForMerging[{
2918 Context.getCanonicalDecl(), IndexInContext}];
2926 RedeclarableResult &Redecl) {
2939 llvm_unreachable(
"bad assert_cast");
2949 RedeclarableResult
Result(
2951 DPattern->getCanonicalDecl()->getGlobalID(), IsKeyDecl);
2953 if (
auto *DClass = dyn_cast<CXXRecordDecl>(DPattern)) {
2956 auto *ExistingClass =
2958 if (
auto *DDD = DClass->DefinitionData) {
2959 if (ExistingClass->DefinitionData) {
2962 ExistingClass->DefinitionData = DClass->DefinitionData;
2965 Reader.PendingDefinitions.insert(DClass);
2968 DClass->DefinitionData = ExistingClass->DefinitionData;
2973 if (
auto *DFunction = dyn_cast<FunctionDecl>(DPattern))
2976 if (
auto *DVar = dyn_cast<VarDecl>(DPattern))
2978 if (
auto *DAlias = dyn_cast<TypeAliasDecl>(DPattern))
2981 llvm_unreachable(
"merged an unknown kind of redeclarable template");
2986template <
typename T>
2989 auto *D =
static_cast<T *
>(DBase);
2990 T *ExistingCanon = Existing->getCanonicalDecl();
2992 if (ExistingCanon != DCanon) {
2997 D->
First = ExistingCanon;
2998 ExistingCanon->Used |= D->Used;
3001 bool IsKeyDecl = KeyDeclID.
isValid();
3004 if (
auto *DTemplate = dyn_cast<RedeclarableTemplateDecl>(D))
3011 Reader.KeyDecls[ExistingCanon].push_back(KeyDeclID);
3033 if (!Reader.getContext().getLangOpts().Modules)
3039 Reader.LETemporaryForMerging[std::make_pair(
3042 Reader.getContext().setPrimaryMergedDecl(LETDecl,
3055 if (!Reader.getContext().getLangOpts().Modules)
3062 if (!Reader.getContext().getLangOpts().CPlusPlus &&
3066 if (FindExistingResult ExistingRes = findExisting(
static_cast<T*
>(D)))
3067 if (T *Existing = ExistingRes)
3068 Reader.getContext().setPrimaryMergedDecl(
static_cast<T *
>(D),
3069 Existing->getCanonicalDecl());
3073 Record.readOMPChildren(D->
Data);
3078 Record.readOMPChildren(D->
Data);
3083 Record.readOMPChildren(D->
Data);
3090 Expr *In = Record.readExpr();
3091 Expr *Out = Record.readExpr();
3093 Expr *Combiner = Record.readExpr();
3095 Expr *Orig = Record.readExpr();
3096 Expr *Priv = Record.readExpr();
3101 D->PrevDeclInScope = readDeclID().getRawValue();
3105 Record.readOMPChildren(D->
Data);
3107 D->VarName = Record.readDeclarationName();
3108 D->PrevDeclInScope = readDeclID().getRawValue();
3118 D->DirectiveLoc = Record.readSourceLocation();
3119 D->EndLoc = Record.readSourceLocation();
3120 Record.readOpenACCClauseList(D->Clauses);
3125 D->DirectiveLoc = Record.readSourceLocation();
3126 D->EndLoc = Record.readSourceLocation();
3127 D->ParensLoc = Record.readSourceRange();
3128 D->FuncRef = Record.readExpr();
3129 Record.readOpenACCClauseList(D->Clauses);
3143 uint64_t readInt() {
3147 bool readBool() {
return Reader.
readBool(); }
3149 SourceRange readSourceRange() {
3153 SourceLocation readSourceLocation() {
3157 Expr *readExpr() {
return Reader.
readExpr(); }
3159 Attr *readAttr() {
return Reader.
readAttr(); }
3161 std::string readString() {
3165 TypeSourceInfo *readTypeSourceInfo() {
3169 IdentifierInfo *readIdentifier() {
3173 VersionTuple readVersionTuple() {
3179 template <
typename T> T *readDeclAs() {
return Reader.
readDeclAs<T>(); }
3184 AttrReader
Record(*
this);
3185 auto V = Record.readInt();
3199 unsigned ParsedKind = Record.readInt();
3200 unsigned Syntax = Record.readInt();
3201 unsigned SpellingIndex = Record.readInt();
3202 bool IsAlignas = (ParsedKind == AttributeCommonInfo::AT_Aligned &&
3204 SpellingIndex == AlignedAttr::Keyword_alignas);
3205 bool IsRegularKeywordAttribute = Record.readBool();
3210 IsAlignas, IsRegularKeywordAttribute});
3212#include "clang/Serialization/AttrPCHRead.inc"
3214 assert(
New &&
"Unable to decode attribute?");
3220 for (
unsigned I = 0, E =
readInt(); I != E; ++I)
3235inline void ASTReader::LoadedDecl(
unsigned Index,
Decl *D) {
3236 assert(!DeclsLoaded[Index] &&
"Decl loaded twice?");
3237 DeclsLoaded[Index] = D;
3246bool ASTReader::isConsumerInterestedIn(
Decl *D) {
3259 if (
isa<FileScopeAsmDecl, TopLevelStmtDecl, ObjCProtocolDecl, ObjCImplDecl,
3260 ImportDecl, PragmaCommentDecl, PragmaDetectMismatchDecl>(D))
3262 if (
isa<OMPThreadPrivateDecl, OMPDeclareReductionDecl, OMPDeclareMapperDecl,
3263 OMPAllocateDecl, OMPRequiresDecl>(D))
3265 if (
const auto *Var = dyn_cast<VarDecl>(D))
3266 return Var->isFileVarDecl() &&
3268 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(Var));
3269 if (
const auto *
Func = dyn_cast<FunctionDecl>(D))
3270 return Func->doesThisDeclarationHaveABody() || PendingBodies.count(D);
3280ASTReader::RecordLocation ASTReader::DeclCursorForID(
GlobalDeclID ID,
3284 unsigned LocalDeclIndex = ID.getLocalDeclIndex();
3285 const DeclOffset &DOffs = M->
DeclOffsets[LocalDeclIndex];
3290ASTReader::RecordLocation ASTReader::getLocalBitOffset(uint64_t GlobalOffset) {
3291 auto I = GlobalBitOffsetsMap.find(GlobalOffset);
3293 assert(I != GlobalBitOffsetsMap.end() &&
"Corrupted global bit offsets map");
3294 return RecordLocation(I->second, GlobalOffset - I->second->GlobalBitOffset);
3297uint64_t ASTReader::getGlobalBitOffset(ModuleFile &M, uint64_t LocalOffset) {
3302ASTDeclReader::getOrFakePrimaryClassDefinition(
ASTReader &Reader,
3305 auto *DD = RD->DefinitionData;
3314 DD =
new (Reader.getContext())
struct CXXRecordDecl::DefinitionData(RD);
3316 RD->DefinitionData = DD;
3320 Reader.PendingFakeDefinitionData.insert(
3321 std::make_pair(DD, ASTReader::PendingFakeDefinitionKind::Fake));
3324 return DD->Definition;
3331 if (
auto *ND = dyn_cast<NamespaceDecl>(DC))
3332 return ND->getFirstDecl();
3334 if (
auto *RD = dyn_cast<CXXRecordDecl>(DC))
3335 return getOrFakePrimaryClassDefinition(Reader, RD);
3337 if (
auto *RD = dyn_cast<RecordDecl>(DC))
3340 if (
auto *ED = dyn_cast<EnumDecl>(DC))
3343 if (
auto *OID = dyn_cast<ObjCInterfaceDecl>(DC))
3348 if (
auto *TU = dyn_cast<TranslationUnitDecl>(DC))
3354ASTDeclReader::FindExistingResult::~FindExistingResult() {
3357 if (TypedefNameForLinkage) {
3359 Reader.ImportedTypedefNamesForLinkage.insert(
3360 std::make_pair(std::make_pair(DC, TypedefNameForLinkage), New));
3364 if (!AddResult || Existing)
3367 DeclarationName Name = New->getDeclName();
3370 setAnonymousDeclForMerging(Reader, New->getLexicalDeclContext(),
3371 AnonymousDeclNumber, New);
3373 !Reader.getContext().getLangOpts().CPlusPlus) {
3374 if (Reader.getIdResolver().tryAddTopLevelDecl(New, Name))
3377 }
else if (DeclContext *MergeDC = getPrimaryContextForMerging(Reader, DC)) {
3380 MergeDC->makeDeclVisibleInContextImpl(New,
true);
3388 bool IsTypedefNameForLinkage) {
3389 if (!IsTypedefNameForLinkage)
3395 if (
Found->isFromASTFile())
3398 if (
auto *TND = dyn_cast<TypedefNameDecl>(
Found))
3399 return TND->getAnonDeclWithTypedefName(
true);
3408ASTDeclReader::getPrimaryDCForAnonymousDecl(DeclContext *LexicalDC) {
3410 if (
auto *RD = dyn_cast<CXXRecordDecl>(LexicalDC)) {
3412 return DD ? DD->Definition :
nullptr;
3413 }
else if (
auto *OID = dyn_cast<ObjCInterfaceDecl>(LexicalDC)) {
3414 return OID->getCanonicalDecl()->getDefinition();
3421 if (
auto *FD = dyn_cast<FunctionDecl>(D))
3422 if (FD->isThisDeclarationADefinition())
3424 if (
auto *MD = dyn_cast<ObjCMethodDecl>(D))
3425 if (MD->isThisDeclarationADefinition())
3427 if (
auto *RD = dyn_cast<RecordDecl>(D))
3436NamedDecl *ASTDeclReader::getAnonymousDeclForMerging(ASTReader &Reader,
3441 auto *CanonDC =
cast<Decl>(DC)->getCanonicalDecl();
3444 auto &
Previous = Reader.AnonymousDeclarationsForMerging[CanonDC];
3450 auto *PrimaryDC = getPrimaryDCForAnonymousDecl(DC);
3451 auto needToNumberAnonymousDeclsWithin = [](
Decl *D) {
3459 auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D);
3460 return CTSD && !CTSD->noload_field_empty() &&
3461 !CTSD->hasLoadedFieldsFromExternalStorage();
3463 if (PrimaryDC && needToNumberAnonymousDeclsWithin(
cast<Decl>(PrimaryDC))) {
3475void ASTDeclReader::setAnonymousDeclForMerging(ASTReader &Reader,
3476 DeclContext *DC,
unsigned Index,
3478 auto *CanonDC =
cast<Decl>(DC)->getCanonicalDecl();
3480 auto &
Previous = Reader.AnonymousDeclarationsForMerging[CanonDC];
3487ASTDeclReader::FindExistingResult ASTDeclReader::findExisting(NamedDecl *D) {
3488 DeclarationName Name = TypedefNameForLinkage ? TypedefNameForLinkage
3494 FindExistingResult
Result(Reader, D,
nullptr,
3495 AnonymousDeclNumber, TypedefNameForLinkage);
3500 ASTContext &
C = Reader.getContext();
3502 if (TypedefNameForLinkage) {
3503 auto It = Reader.ImportedTypedefNamesForLinkage.find(
3504 std::make_pair(DC, TypedefNameForLinkage));
3505 if (It != Reader.ImportedTypedefNamesForLinkage.end())
3506 if (
C.isSameEntity(It->second, D))
3507 return FindExistingResult(Reader, D, It->second, AnonymousDeclNumber,
3508 TypedefNameForLinkage);
3516 if (
auto *Existing = getAnonymousDeclForMerging(
3518 if (
C.isSameEntity(Existing, D))
3519 return FindExistingResult(Reader, D, Existing, AnonymousDeclNumber,
3520 TypedefNameForLinkage);
3522 !Reader.getContext().getLangOpts().CPlusPlus) {
3523 IdentifierResolver &IdResolver = Reader.getIdResolver();
3527 class UpToDateIdentifierRAII {
3529 bool WasOutToDate =
false;
3532 explicit UpToDateIdentifierRAII(IdentifierInfo *II) : II(II) {
3540 ~UpToDateIdentifierRAII() {
3546 for (IdentifierResolver::iterator I = IdResolver.
begin(Name),
3547 IEnd = IdResolver.
end();
3550 if (
C.isSameEntity(Existing, D))
3551 return FindExistingResult(Reader, D, Existing, AnonymousDeclNumber,
3552 TypedefNameForLinkage);
3554 }
else if (DeclContext *MergeDC = getPrimaryContextForMerging(Reader, DC)) {
3558 if (
C.isSameEntity(Existing, D))
3559 return FindExistingResult(Reader, D, Existing, AnonymousDeclNumber,
3560 TypedefNameForLinkage);
3564 return FindExistingResult(Reader);
3576 if (MergedDCIt != Reader.MergedDeclContexts.end() &&
3579 Reader.PendingOdrMergeChecks.push_back(D);
3581 return FindExistingResult(Reader, D,
nullptr,
3582 AnonymousDeclNumber, TypedefNameForLinkage);
3585template<
typename DeclT>
3591 llvm_unreachable(
"getMostRecentDecl on non-redeclarable declaration");
3598#define ABSTRACT_DECL(TYPE)
3599#define DECL(TYPE, BASE) \
3601 return getMostRecentDeclImpl(cast<TYPE##Decl>(D));
3602#include "clang/AST/DeclNodes.inc"
3604 llvm_unreachable(
"unknown decl kind");
3607Decl *ASTReader::getMostRecentExistingDecl(
Decl *D) {
3615 const auto *IA =
Previous->getAttr<MSInheritanceAttr>();
3617 if (IA && !D->
hasAttr<MSInheritanceAttr>()) {
3623 const auto *AA =
Previous->getAttr<AvailabilityAttr>();
3624 if (AA && !D->
hasAttr<AvailabilityAttr>()) {
3625 NewAttr = AA->
clone(Context);
3632template<
typename DeclT>
3648 D->
First = PrevVD->First;
3653 auto *VD =
static_cast<VarDecl *
>(D);
3663 if (VD->getOwningModule() &&
3664 VD->getOwningModule()->isHeaderLikeModule())
3665 VD->demoteThisDefinitionToDeclaration();
3666 Reader.mergeDefinitionVisibility(CurD, VD);
3674 auto *DT = T->getContainedDeducedType();
3675 return DT && !DT->isDeduced();
3685 FD->RedeclLink.setPrevious(PrevFD);
3686 FD->First = PrevFD->First;
3690 if (PrevFD->isInlined() != FD->isInlined()) {
3706 FD->setImplicitlyInline(
true);
3711 if (FPT && PrevFPT) {
3715 bool WasUnresolved =
3717 if (IsUnresolved != WasUnresolved)
3718 Reader.PendingExceptionSpecUpdates.insert(
3719 {Canon, IsUnresolved ? PrevFD : FD});
3725 if (IsUndeduced != WasUndeduced)
3726 Reader.PendingDeducedTypeUpdates.insert(
3728 (IsUndeduced ? PrevFPT : FPT)->getReturnType()});
3735 llvm_unreachable(
"attachPreviousDecl on non-redeclarable declaration");
3740template <
typename ParmDecl>
3744 if (!From->hasDefaultArgument())
3746 To->setInheritedDefaultArgument(Context, From);
3755 assert(FromTP->size() == ToTP->size() &&
"merged mismatched templates?");
3757 for (
unsigned I = 0, N = FromTP->size(); I != N; ++I) {
3758 NamedDecl *FromParam = FromTP->getParam(I);
3761 if (
auto *FTTP = dyn_cast<TemplateTypeParmDecl>(FromParam))
3763 else if (
auto *FNTTP = dyn_cast<NonTypeTemplateParmDecl>(FromParam))
3798 Func &&
Func->getTemplateSpecializationInfo())
3807 if (!
Previous->getLexicalDeclContext()
3808 ->getNonTransparentContext()
3809 ->isFileContext() ||
3827 Reader.PendingWarningForDuplicatedDefsInModuleUnits.push_back(
3836 Reader.Diag(
Previous->getLocation(),
3837 diag::err_multiple_decl_in_different_modules)
3839 Reader.Diag(D->
getLocation(), diag::note_also_found);
3847#define ABSTRACT_DECL(TYPE)
3848#define DECL(TYPE, BASE) \
3850 attachPreviousDeclImpl(Reader, cast<TYPE##Decl>(D), Previous, Canon); \
3852#include "clang/AST/DeclNodes.inc"
3868 if (
auto *TD = dyn_cast<TemplateDecl>(D))
3876 mergeInheritableAttributes(Reader, D,
Previous);
3879template<
typename DeclT>
3885 llvm_unreachable(
"attachLatestDecl on non-redeclarable declaration");
3889 assert(D && Latest);
3892#define ABSTRACT_DECL(TYPE)
3893#define DECL(TYPE, BASE) \
3895 attachLatestDeclImpl(cast<TYPE##Decl>(D), Latest); \
3897#include "clang/AST/DeclNodes.inc"
3901template<
typename DeclT>
3907 llvm_unreachable(
"markIncompleteDeclChain on non-redeclarable declaration");
3910void ASTReader::markIncompleteDeclChain(
Decl *D) {
3912#define ABSTRACT_DECL(TYPE)
3913#define DECL(TYPE, BASE) \
3915 ASTDeclReader::markIncompleteDeclChainImpl(cast<TYPE##Decl>(D)); \
3917#include "clang/AST/DeclNodes.inc"
3923 SourceLocation DeclLoc;
3924 RecordLocation Loc = DeclCursorForID(ID, DeclLoc);
3925 llvm::BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
3928 SavedStreamPosition SavedPosition(DeclsCursor);
3930 ReadingKindTracker ReadingKind(Read_Decl, *
this);
3935 auto Fail = [](
const char *what, llvm::Error &&Err) {
3936 llvm::report_fatal_error(Twine(
"ASTReader::readDeclRecord failed ") + what +
3940 if (llvm::Error JumpFailed = DeclsCursor.JumpToBit(Loc.Offset))
3941 Fail(
"jumping", std::move(JumpFailed));
3944 Expected<unsigned> MaybeCode = DeclsCursor.ReadCode();
3946 Fail(
"reading code", MaybeCode.takeError());
3947 unsigned Code = MaybeCode.get();
3951 Expected<unsigned> MaybeDeclCode =
Record.readRecord(DeclsCursor, Code);
3953 llvm::report_fatal_error(
3954 Twine(
"ASTReader::readDeclRecord failed reading decl code: ") +
3955 toString(MaybeDeclCode.takeError()));
3957 switch ((
DeclCode)MaybeDeclCode.get()) {
3964 llvm_unreachable(
"Record cannot be de-serialized with readDeclRecord");
4074 bool HasTypeConstraint =
Record.readInt();
4080 bool HasTypeConstraint =
Record.readInt();
4086 bool HasTypeConstraint =
Record.readInt();
4088 Context, ID,
Record.readInt(), HasTypeConstraint);
4177 D = MSGuidDecl::CreateDeserialized(Context, ID);
4180 D = UnnamedGlobalConstantDecl::CreateDeserialized(Context, ID);
4183 D = TemplateParamObjectDecl::CreateDeserialized(Context, ID);
4192 Error(
"attempt to read a C++ base-specifier record as a declaration");
4195 Error(
"attempt to read a C++ ctor initializer record as a declaration");
4204 unsigned NumChildren =
Record.readInt();
4210 unsigned NumClauses =
Record.readInt();
4211 unsigned NumVars =
Record.readInt();
4217 unsigned NumClauses =
Record.readInt();
4226 unsigned NumClauses =
Record.readInt();
4265 assert(D &&
"Unknown declaration reading AST file");
4266 LoadedDecl(translateGlobalDeclIDToIndex(ID), D);
4277 if (
auto *DC = dyn_cast<DeclContext>(D)) {
4278 LookupBlockOffsets Offsets;
4280 Reader.VisitDeclContext(DC, Offsets);
4286 if (
auto Iter = DelayedNamespaceOffsetMap.find(ID);
4287 Iter != DelayedNamespaceOffsetMap.end())
4288 Offsets = Iter->second;
4291 ReadVisibleDeclContextStorage(
4293 VisibleDeclContextStorageKind::GenerallyVisible))
4296 ReadVisibleDeclContextStorage(
4298 VisibleDeclContextStorageKind::ModuleLocalVisible))
4301 ReadVisibleDeclContextStorage(
4303 VisibleDeclContextStorageKind::TULocalVisible))
4307 ReadLexicalDeclContextStorage(*Loc.F, DeclsCursor,
4314 PendingUpdateRecords.push_back(
4315 PendingUpdateRecord(ID, D,
true));
4318 if (
auto *
Class = dyn_cast<ObjCInterfaceDecl>(D))
4321 if (
Class->isThisDeclarationADefinition() ||
4322 PendingDefinitions.count(
Class))
4323 loadObjCCategories(ID,
Class);
4329 PotentiallyInterestingDecls.push_back(D);
4334void ASTReader::PassInterestingDeclsToConsumer() {
4337 if (!CanPassDeclsToConsumer)
4342 SaveAndRestore GuardPassingDeclsToConsumer(CanPassDeclsToConsumer,
4347 for (
auto ID : EagerlyDeserializedDecls)
4349 EagerlyDeserializedDecls.clear();
4351 auto ConsumingPotentialInterestingDecls = [
this]() {
4352 while (!PotentiallyInterestingDecls.empty()) {
4353 Decl *D = PotentiallyInterestingDecls.front();
4354 PotentiallyInterestingDecls.pop_front();
4355 if (isConsumerInterestedIn(D))
4356 PassInterestingDeclToConsumer(D);
4359 std::deque<Decl *> MaybeInterestingDecls =
4360 std::move(PotentiallyInterestingDecls);
4361 PotentiallyInterestingDecls.clear();
4362 assert(PotentiallyInterestingDecls.empty());
4363 while (!MaybeInterestingDecls.empty()) {
4364 Decl *D = MaybeInterestingDecls.front();
4365 MaybeInterestingDecls.pop_front();
4371 if (
auto *VD = dyn_cast<VarDecl>(D);
4372 VD && VD->isFileVarDecl() && !VD->isExternallyVisible())
4374 ConsumingPotentialInterestingDecls();
4375 if (isConsumerInterestedIn(D))
4376 PassInterestingDeclToConsumer(D);
4380 ConsumingPotentialInterestingDecls();
4382 for (GlobalDeclID ID : VTablesToEmit) {
4385 PassVTableToConsumer(RD);
4387 VTablesToEmit.clear();
4390void ASTReader::loadDeclUpdateRecords(PendingUpdateRecord &
Record) {
4394 GlobalDeclID ID =
Record.ID;
4396 ProcessingUpdatesRAIIObj ProcessingUpdates(*
this);
4397 DeclUpdateOffsetsMap::iterator UpdI = DeclUpdateOffsets.find(ID);
4399 if (UpdI != DeclUpdateOffsets.end()) {
4400 auto UpdateOffsets = std::move(UpdI->second);
4401 DeclUpdateOffsets.erase(UpdI);
4407 bool WasInteresting =
Record.JustLoaded || isConsumerInterestedIn(D);
4408 for (
auto &FileAndOffset : UpdateOffsets) {
4410 uint64_t Offset = FileAndOffset.second;
4412 SavedStreamPosition SavedPosition(Cursor);
4413 if (llvm::Error JumpFailed =
Cursor.JumpToBit(Offset))
4415 llvm::report_fatal_error(
4416 Twine(
"ASTReader::loadDeclUpdateRecords failed jumping: ") +
4418 Expected<unsigned> MaybeCode =
Cursor.ReadCode();
4420 llvm::report_fatal_error(
4421 Twine(
"ASTReader::loadDeclUpdateRecords failed reading code: ") +
4423 unsigned Code = MaybeCode.get();
4425 if (Expected<unsigned> MaybeRecCode =
Record.readRecord(Cursor, Code))
4427 "Expected DECL_UPDATES record!");
4429 llvm::report_fatal_error(
4430 Twine(
"ASTReader::loadDeclUpdateRecords failed reading rec code: ") +
4435 Reader.UpdateDecl(D);
4439 if (!WasInteresting && isConsumerInterestedIn(D)) {
4440 PotentiallyInterestingDecls.push_back(D);
4441 WasInteresting =
true;
4447 if (
auto I = PendingVisibleUpdates.find(ID);
4448 I != PendingVisibleUpdates.end()) {
4449 auto VisibleUpdates = std::move(I->second);
4450 PendingVisibleUpdates.erase(I);
4453 for (
const auto &
Update : VisibleUpdates)
4454 Lookups[DC].Table.add(
4456 reader::ASTDeclContextNameLookupTrait(*
this, *
Update.Mod));
4460 if (
auto I = PendingModuleLocalVisibleUpdates.find(ID);
4461 I != PendingModuleLocalVisibleUpdates.end()) {
4462 auto ModuleLocalVisibleUpdates = std::move(I->second);
4463 PendingModuleLocalVisibleUpdates.erase(I);
4466 for (
const auto &
Update : ModuleLocalVisibleUpdates)
4467 ModuleLocalLookups[DC].Table.add(
4469 reader::ModuleLocalNameLookupTrait(*
this, *
Update.Mod));
4475 if (
auto I = TULocalUpdates.find(ID); I != TULocalUpdates.end()) {
4476 auto Updates = std::move(I->second);
4477 TULocalUpdates.erase(I);
4481 TULocalLookups[DC].Table.add(
4483 reader::ASTDeclContextNameLookupTrait(*
this, *
Update.Mod));
4489 if (
auto IT = RelatedDeclsMap.find(ID); IT != RelatedDeclsMap.end()) {
4490 for (
auto LID : IT->second)
4492 RelatedDeclsMap.erase(IT);
4497 if (
auto I = PendingSpecializationsUpdates.find(ID);
4498 I != PendingSpecializationsUpdates.end()) {
4499 auto SpecializationUpdates = std::move(I->second);
4500 PendingSpecializationsUpdates.erase(I);
4502 for (
const auto &
Update : SpecializationUpdates)
4503 AddSpecializations(D,
Update.Data, *
Update.Mod,
false);
4507 if (
auto I = PendingPartialSpecializationsUpdates.find(ID);
4508 I != PendingPartialSpecializationsUpdates.end()) {
4509 auto SpecializationUpdates = std::move(I->second);
4510 PendingPartialSpecializationsUpdates.erase(I);
4512 for (
const auto &
Update : SpecializationUpdates)
4517void ASTReader::loadPendingDeclChain(
Decl *FirstLocal, uint64_t LocalOffset) {
4520 if (FirstLocal != CanonDecl) {
4523 *
this, FirstLocal, PrevMostRecent ? PrevMostRecent : CanonDecl,
4534 assert(M &&
"imported decl from no module file");
4537 SavedStreamPosition SavedPosition(Cursor);
4538 if (llvm::Error JumpFailed =
Cursor.JumpToBit(LocalOffset))
4539 llvm::report_fatal_error(
4540 Twine(
"ASTReader::loadPendingDeclChain failed jumping: ") +
4544 Expected<unsigned> MaybeCode =
Cursor.ReadCode();
4546 llvm::report_fatal_error(
4547 Twine(
"ASTReader::loadPendingDeclChain failed reading code: ") +
4549 unsigned Code = MaybeCode.get();
4550 if (Expected<unsigned> MaybeRecCode =
Cursor.readRecord(Code,
Record))
4552 "expected LOCAL_REDECLARATIONS record!");
4554 llvm::report_fatal_error(
4555 Twine(
"ASTReader::loadPendingDeclChain failed reading rec code: ") +
4560 Decl *MostRecent = FirstLocal;
4561 for (
unsigned I = 0, N =
Record.size(); I != N; ++I) {
4562 unsigned Idx = N - I - 1;
4574 class ObjCCategoriesVisitor {
4577 llvm::SmallPtrSetImpl<ObjCCategoryDecl *> &Deserialized;
4578 ObjCCategoryDecl *Tail =
nullptr;
4579 llvm::DenseMap<DeclarationName, ObjCCategoryDecl *> NameCategoryMap;
4580 GlobalDeclID InterfaceID;
4581 unsigned PreviousGeneration;
4583 void add(ObjCCategoryDecl *Cat) {
4585 if (!Deserialized.erase(Cat))
4590 ObjCCategoryDecl *&Existing = NameCategoryMap[Cat->
getDeclName()];
4594 StructuralEquivalenceContext Ctx(
4597 StructuralEquivalenceKind::Default,
4601 if (!Ctx.IsEquivalent(Cat, Existing)) {
4606 diag::note_previous_definition);
4608 }
else if (!Existing) {
4623 ObjCCategoriesVisitor(
4624 ASTReader &Reader, ObjCInterfaceDecl *
Interface,
4625 llvm::SmallPtrSetImpl<ObjCCategoryDecl *> &Deserialized,
4626 GlobalDeclID InterfaceID,
unsigned PreviousGeneration)
4628 InterfaceID(InterfaceID), PreviousGeneration(PreviousGeneration) {
4630 for (
auto *Cat :
Interface->known_categories()) {
4631 if (Cat->getDeclName())
4632 NameCategoryMap[Cat->getDeclName()] = Cat;
4639 bool operator()(ModuleFile &M) {
4648 LocalDeclID LocalID =
4655 const ObjCCategoriesInfo
Compare = {LocalID, 0};
4656 const ObjCCategoriesInfo *
Result = std::lower_bound(
4660 LocalID !=
Result->getDefinitionID()) {
4668 unsigned Offset =
Result->Offset;
4671 for (
unsigned I = 0; I != N; ++I)
4680 unsigned PreviousGeneration) {
4681 ObjCCategoriesVisitor Visitor(*
this, D, CategoriesDeserialized, ID,
4682 PreviousGeneration);
4683 ModuleMgr.visit(Visitor);
4686template<
typename DeclT,
typename Fn>
4695 for (
auto *Redecl = MostRecent; Redecl && !
Found;
4696 Redecl = Redecl->getPreviousDecl())
4697 Found = (Redecl == D);
4701 for (
auto *Redecl = MostRecent; Redecl != D;
4708 while (Record.getIdx() < Record.size()) {
4712 Decl *MD = Record.readDecl();
4713 assert(MD &&
"couldn't read decl from update record");
4714 Reader.PendingAddedClassMembers.push_back({RD, MD});
4719 auto *Anon = readDeclAs<NamespaceDecl>();
4724 if (!Record.isModule()) {
4725 if (
auto *TU = dyn_cast<TranslationUnitDecl>(D))
4726 TU->setAnonymousNamespace(Anon);
4735 VD->NonParmVarDeclBits.IsInline = Record.readInt();
4736 VD->NonParmVarDeclBits.IsInlineSpecified = Record.readInt();
4743 if (
auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D)) {
4744 VTSD->setPointOfInstantiation(POI);
4745 }
else if (
auto *VD = dyn_cast<VarDecl>(D)) {
4747 assert(MSInfo &&
"No member specialization information");
4751 if (
auto *FTSInfo = dyn_cast<FunctionTemplateSpecializationInfo *>(
4752 FD->TemplateOrSpecialization))
4753 FTSInfo->setPointOfInstantiation(POI);
4756 ->setPointOfInstantiation(POI);
4767 auto *DefaultArg = Record.readExpr();
4771 if (Param->hasUninstantiatedDefaultArg())
4772 Param->setDefaultArg(DefaultArg);
4778 auto *DefaultInit = Record.readExpr();
4782 if (FD->hasInClassInitializer() && !FD->hasNonNullInClassInitializer()) {
4784 FD->setInClassInitializer(DefaultInit);
4788 FD->removeInClassInitializer();
4795 if (Reader.PendingBodies[FD]) {
4801 if (Record.readInt()) {
4809 FD->setInnerLocStart(readSourceLocation());
4811 assert(Record.getIdx() == Record.size() &&
"lazy body must be last");
4818 bool HadRealDefinition =
4819 OldDD && (OldDD->Definition != RD ||
4820 !Reader.PendingFakeDefinitionData.count(OldDD));
4824 ReadCXXRecordDefinition(RD,
true);
4827 uint64_t LexicalOffset = ReadLocalOffset();
4828 if (!HadRealDefinition && LexicalOffset) {
4829 Record.readLexicalDeclContextStorage(LexicalOffset, RD);
4830 Reader.PendingFakeDefinitionData.erase(OldDD);
4837 MSInfo->setTemplateSpecializationKind(TSK);
4838 MSInfo->setPointOfInstantiation(POI);
4841 Spec->setTemplateSpecializationKind(TSK);
4842 Spec->setPointOfInstantiation(POI);
4844 if (Record.readInt()) {
4846 readDeclAs<ClassTemplatePartialSpecializationDecl>();
4848 Record.readTemplateArgumentList(TemplArgs);
4850 Reader.getContext(), TemplArgs);
4855 Spec->getSpecializedTemplateOrPartial()))
4856 Spec->setInstantiationOf(PartialSpec, TemplArgList);
4865 if (Record.readInt()) {
4867 Record.readAttributes(Attrs);
4871 D->setAttrsImpl(Attrs, Reader.getContext());
4881 auto *Del = readDeclAs<FunctionDecl>();
4882 auto *ThisArg = Record.readExpr();
4885 if (!
C.dtorHasOperatorDelete(Dtor,
4887 C.addOperatorDeleteForVDtor(Dtor, Del,
4889 Canon->OperatorDeleteThisArg = ThisArg;
4895 auto *Del = readDeclAs<FunctionDecl>();
4898 if (!
C.dtorHasOperatorDelete(
4900 C.addOperatorDeleteForVDtor(
4905 auto *Del = readDeclAs<FunctionDecl>();
4909 C.addOperatorDeleteForVDtor(Dtor, Del,
4914 auto *Del = readDeclAs<FunctionDecl>();
4917 if (!
C.dtorHasOperatorDelete(Dtor,
4919 C.addOperatorDeleteForVDtor(
4926 auto ESI = Record.readExceptionSpecInfo(ExceptionStorage);
4934 FD->setType(Reader.getContext().getFunctionType(
4935 FPT->getReturnType(), FPT->getParamTypes(),
4936 FPT->getExtProtoInfo().withExceptionSpec(ESI)));
4940 Reader.PendingExceptionSpecUpdates.insert(
4941 std::make_pair(FD->getCanonicalDecl(), FD));
4948 QualType DeducedResultType = Record.readType();
4949 Reader.PendingDeducedTypeUpdates.insert(
4950 {FD->getCanonicalDecl(), DeducedResultType});
4970 D->
addAttr(OMPThreadPrivateDeclAttr::CreateImplicit(Reader.getContext(),
4971 readSourceRange()));
4975 auto AllocatorKind =
4976 static_cast<OMPAllocateDeclAttr::AllocatorTypeTy
>(Record.readInt());
4977 Expr *Allocator = Record.readExpr();
4978 Expr *Alignment = Record.readExpr();
4980 D->
addAttr(OMPAllocateDeclAttr::CreateImplicit(
4981 Reader.getContext(), AllocatorKind, Allocator, Alignment, SR));
4986 D->
addAttr(OMPTargetIndirectCallAttr::CreateImplicit(Reader.getContext(),
4987 readSourceRange()));
4994 Reader.getContext().mergeDefinitionIntoModule(Exported, Owner);
4995 Reader.PendingMergedDefinitionsToDeduplicate.insert(Exported);
5000 auto MapType = Record.readEnum<OMPDeclareTargetDeclAttr::MapTypeTy>();
5001 auto DevType = Record.readEnum<OMPDeclareTargetDeclAttr::DevTypeTy>();
5002 Expr *IndirectE = Record.readExpr();
5003 bool Indirect = Record.readBool();
5004 unsigned Level = Record.readInt();
5005 D->
addAttr(OMPDeclareTargetDeclAttr::CreateImplicit(
5006 Reader.getContext(), MapType, DevType, IndirectE, Indirect, Level,
5007 readSourceRange()));
5013 Record.readAttributes(Attrs);
5014 assert(Attrs.size() == 1);
This file provides AST data structures related to concepts.
Defines the clang::ASTContext interface.
static T assert_cast(T t)
"Cast" to type T, asserting if we don't have an implicit conversion.
static bool allowODRLikeMergeInC(NamedDecl *ND)
ODR-like semantics for C/ObjC allow us to merge tag types and a structural check in Sema guarantees t...
static NamedDecl * getDeclForMerging(NamedDecl *Found, bool IsTypedefNameForLinkage)
Find the declaration that should be merged into, given the declaration found by name lookup.
static bool inheritDefaultTemplateArgument(ASTContext &Context, ParmDecl *From, Decl *ToD)
Inherit the default template argument from From to To.
static void inheritDefaultTemplateArguments(ASTContext &Context, TemplateDecl *From, TemplateDecl *To)
static void forAllLaterRedecls(DeclT *D, Fn F)
static llvm::iterator_range< MergedRedeclIterator< DeclT > > merged_redecls(DeclT *D)
Defines the clang::attr::Kind enum.
clang::CharUnits operator*(clang::CharUnits::QuantityType Scale, const clang::CharUnits &CU)
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
This file defines OpenMP nodes for declarative directives.
Defines the C++ template declaration subclasses.
Defines the ExceptionSpecificationType enumeration and various utility functions.
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines the LambdaCapture class.
Defines several types used to describe C++ lambda expressions that are shared between the parser and ...
Defines the clang::LangOptions interface.
llvm::MachO::Record Record
Defines the clang::Module class, which describes a module in the source code.
This file defines OpenMP AST classes for clauses.
static std::string toString(const clang::SanitizerSet &Sanitizers)
Produce a string containing comma-separated names of sanitizers in Sanitizers set.
Defines the clang::SourceLocation class and associated facilities.
Defines various enumerations that describe declaration and type specifiers.
C Language Family Type Representation.
__DEVICE__ void * memcpy(void *__a, const void *__b, size_t __c)
bool needsCleanup() const
Returns whether the object performed allocations.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
TranslationUnitDecl * getTranslationUnitDecl() const
const LangOptions & getLangOpts() const
void addDestruction(T *Ptr) const
If T isn't trivially destructible, calls AddDeallocation to register it for destruction.
ExternalASTSource * getExternalSource() const
Retrieve a pointer to the external AST source associated with this AST context, if any.
void mergeTemplatePattern(RedeclarableTemplateDecl *D, RedeclarableTemplateDecl *Existing, bool IsKeyDecl)
Merge together the pattern declarations from two template declarations.
ASTDeclMerger(ASTReader &Reader)
void mergeRedeclarable(Redeclarable< T > *D, T *Existing, RedeclarableResult &Redecl)
void mergeLambda(CXXRecordDecl *D, RedeclarableResult &Redecl, Decl &Context, unsigned Number)
Attempt to merge D with a previous declaration of the same lambda, which is found by its index within...
void MergeDefinitionData(CXXRecordDecl *D, struct CXXRecordDecl::DefinitionData &&NewDD)
void mergeRedeclarableImpl(Redeclarable< T > *D, T *Existing, GlobalDeclID KeyDeclID)
Attempts to merge the given declaration (D) with another declaration of the same entity.
void VisitTemplateParamObjectDecl(TemplateParamObjectDecl *D)
void VisitObjCImplementationDecl(ObjCImplementationDecl *D)
void mergeRedeclarableTemplate(RedeclarableTemplateDecl *D, RedeclarableResult &Redecl)
void VisitImportDecl(ImportDecl *D)
void VisitBindingDecl(BindingDecl *BD)
void VisitNamespaceDecl(NamespaceDecl *D)
void VisitTopLevelStmtDecl(TopLevelStmtDecl *D)
RedeclarableResult VisitRedeclarableTemplateDecl(RedeclarableTemplateDecl *D)
void VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D)
void VisitUnresolvedUsingIfExistsDecl(UnresolvedUsingIfExistsDecl *D)
void ReadFunctionDefinition(FunctionDecl *FD)
void VisitLabelDecl(LabelDecl *LD)
void VisitObjCCategoryDecl(ObjCCategoryDecl *D)
void VisitUsingDirectiveDecl(UsingDirectiveDecl *D)
RedeclarableResult VisitClassTemplateSpecializationDeclImpl(ClassTemplateSpecializationDecl *D)
void VisitFunctionDecl(FunctionDecl *FD)
void VisitObjCMethodDecl(ObjCMethodDecl *D)
void VisitUsingShadowDecl(UsingShadowDecl *D)
void VisitVarTemplateSpecializationDecl(VarTemplateSpecializationDecl *D)
void VisitVarDecl(VarDecl *VD)
RedeclarableResult VisitRedeclarable(Redeclarable< T > *D)
void VisitDeclContext(DeclContext *DC, LookupBlockOffsets &Offsets)
void VisitMSGuidDecl(MSGuidDecl *D)
void VisitPragmaCommentDecl(PragmaCommentDecl *D)
void VisitRecordDecl(RecordDecl *RD)
void VisitLifetimeExtendedTemporaryDecl(LifetimeExtendedTemporaryDecl *D)
void VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D)
void VisitRequiresExprBodyDecl(RequiresExprBodyDecl *D)
void ReadVarDeclInit(VarDecl *VD)
static Decl * getMostRecentDeclImpl(Redeclarable< DeclT > *D)
void VisitNamespaceAliasDecl(NamespaceAliasDecl *D)
void VisitIndirectFieldDecl(IndirectFieldDecl *FD)
void VisitObjCContainerDecl(ObjCContainerDecl *D)
void VisitBlockDecl(BlockDecl *BD)
void VisitOpenACCRoutineDecl(OpenACCRoutineDecl *D)
void VisitExportDecl(ExportDecl *D)
static void attachLatestDecl(Decl *D, Decl *latest)
void VisitStaticAssertDecl(StaticAssertDecl *D)
void VisitEmptyDecl(EmptyDecl *D)
void VisitOMPCapturedExprDecl(OMPCapturedExprDecl *D)
void VisitValueDecl(ValueDecl *VD)
void VisitEnumDecl(EnumDecl *ED)
void mergeRedeclarable(Redeclarable< T > *D, RedeclarableResult &Redecl)
Attempts to merge the given declaration (D) with another declaration of the same entity.
void VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D)
void VisitFriendTemplateDecl(FriendTemplateDecl *D)
void VisitObjCProtocolDecl(ObjCProtocolDecl *D)
void VisitClassTemplatePartialSpecializationDecl(ClassTemplatePartialSpecializationDecl *D)
void VisitObjCTypeParamDecl(ObjCTypeParamDecl *D)
void VisitDeclaratorDecl(DeclaratorDecl *DD)
RedeclarableResult VisitTypedefNameDecl(TypedefNameDecl *TD)
void VisitFriendDecl(FriendDecl *D)
void VisitLinkageSpecDecl(LinkageSpecDecl *D)
void VisitCXXRecordDecl(CXXRecordDecl *D)
ASTDeclReader(ASTReader &Reader, ASTRecordReader &Record, ASTReader::RecordLocation Loc, GlobalDeclID thisDeclID, SourceLocation ThisDeclLoc)
void VisitFileScopeAsmDecl(FileScopeAsmDecl *AD)
void VisitImplicitConceptSpecializationDecl(ImplicitConceptSpecializationDecl *D)
void VisitNamedDecl(NamedDecl *ND)
void mergeMergeable(Mergeable< T > *D)
Attempts to merge the given declaration (D) with another declaration of the same entity,...
void VisitBuiltinTemplateDecl(BuiltinTemplateDecl *D)
static Decl * getMostRecentDecl(Decl *D)
void VisitObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *D)
void VisitCXXConstructorDecl(CXXConstructorDecl *D)
void VisitPragmaDetectMismatchDecl(PragmaDetectMismatchDecl *D)
void VisitImplicitParamDecl(ImplicitParamDecl *PD)
void VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D)
static void setNextObjCCategory(ObjCCategoryDecl *Cat, ObjCCategoryDecl *Next)
void VisitMSPropertyDecl(MSPropertyDecl *FD)
void VisitClassTemplateSpecializationDecl(ClassTemplateSpecializationDecl *D)
void VisitFieldDecl(FieldDecl *FD)
RedeclarableResult VisitVarDeclImpl(VarDecl *D)
void VisitOMPDeclareMapperDecl(OMPDeclareMapperDecl *D)
void VisitCapturedDecl(CapturedDecl *CD)
void VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D)
void VisitObjCInterfaceDecl(ObjCInterfaceDecl *D)
RedeclarableResult VisitCXXRecordDeclImpl(CXXRecordDecl *D)
void VisitAccessSpecDecl(AccessSpecDecl *D)
void VisitCXXMethodDecl(CXXMethodDecl *D)
void VisitOpenACCDeclareDecl(OpenACCDeclareDecl *D)
void VisitOMPAllocateDecl(OMPAllocateDecl *D)
void VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D)
static void attachLatestDeclImpl(Redeclarable< DeclT > *D, Decl *Latest)
static void markIncompleteDeclChainImpl(Redeclarable< DeclT > *D)
RedeclarableResult VisitTagDecl(TagDecl *TD)
ObjCTypeParamList * ReadObjCTypeParamList()
void VisitHLSLBufferDecl(HLSLBufferDecl *D)
void VisitOMPThreadPrivateDecl(OMPThreadPrivateDecl *D)
void VisitCXXDeductionGuideDecl(CXXDeductionGuideDecl *GD)
void VisitConstructorUsingShadowDecl(ConstructorUsingShadowDecl *D)
void VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D)
static void checkMultipleDefinitionInNamedModules(ASTReader &Reader, Decl *D, Decl *Previous)
void VisitUsingEnumDecl(UsingEnumDecl *D)
void VisitObjCImplDecl(ObjCImplDecl *D)
void VisitTranslationUnitDecl(TranslationUnitDecl *TU)
void VisitUnnamedGlobalConstantDecl(UnnamedGlobalConstantDecl *D)
void VisitTypeDecl(TypeDecl *TD)
void VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D)
void VisitEnumConstantDecl(EnumConstantDecl *ECD)
void VisitTypeAliasDecl(TypeAliasDecl *TD)
static void attachPreviousDeclImpl(ASTReader &Reader, Redeclarable< DeclT > *D, Decl *Previous, Decl *Canon)
void VisitConceptDecl(ConceptDecl *D)
void VisitObjCPropertyDecl(ObjCPropertyDecl *D)
void VisitOutlinedFunctionDecl(OutlinedFunctionDecl *D)
void VisitObjCIvarDecl(ObjCIvarDecl *D)
void VisitUsingPackDecl(UsingPackDecl *D)
void VisitFunctionTemplateDecl(FunctionTemplateDecl *D)
void VisitOMPDeclareReductionDecl(OMPDeclareReductionDecl *D)
RedeclarableResult VisitVarTemplateSpecializationDeclImpl(VarTemplateSpecializationDecl *D)
TODO: Unify with ClassTemplateSpecializationDecl version?
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 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)
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 static or instance method of a struct/union/class.
static CXXMethodDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
CXXMethodDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Represents a C++ struct/union/class.
CXXRecordDecl * getDefinition() const
static CXXRecordDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID)
unsigned getODRHash() const
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this class is an instantiation of a member class of a class template specialization,...
CXXRecordDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Represents the body of a CapturedStmt, and serves as its DeclContext.
static CapturedDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumParams)
void setContextParam(unsigned i, ImplicitParamDecl *P)
void setNothrow(bool Nothrow=true)
void setParam(unsigned i, ImplicitParamDecl *P)
Declaration of a class template.
static ClassTemplateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Create an empty class template node.
static ClassTemplatePartialSpecializationDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a class template specialization, which refers to a class template with a given set of temp...
static ClassTemplateSpecializationDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setTemplateArgsAsWritten(const ASTTemplateArgumentListInfo *ArgsWritten)
Set the template argument list as written in the sources.
Declaration of a C++20 concept.
static ConceptDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
A reference to a concept and its template args, as it appears in the code.
Represents a shadow constructor declaration introduced into a class by a C++11 using-declaration that...
static ConstructorUsingShadowDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
static DeclAccessPair make(NamedDecl *D, AccessSpecifier AS)
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
lookup_result::iterator lookup_iterator
bool isFileContext() const
void setHasExternalVisibleStorage(bool ES=true) const
State whether this DeclContext has external storage for declarations visible in this context.
DeclContextLookupResult lookup_result
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
bool isTranslationUnit() const
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
DeclContext * getPrimaryContext()
getPrimaryContext - There may be many different declarations of the same entity (including forward de...
bool isFunctionOrMethod() const
DeclContext * getNonTransparentContext()
DeclID getRawValue() const
A simple visitor class that helps create declaration visitors.
Decl - This represents one declaration (or definition), e.g.
Decl * getPreviousDecl()
Retrieve the previous declaration that declares the same entity as this declaration,...
Decl * getMostRecentDecl()
Retrieve the most recent declaration that declares the same entity as this declaration (which may be ...
FriendObjectKind getFriendObjectKind() const
Determines whether this declaration is the object of a friend declaration and, if so,...
ASTContext & getASTContext() const LLVM_READONLY
void setOwningModuleID(unsigned ID)
Set the owning module ID.
void setLocalExternDecl()
Changes the namespace of this declaration to reflect that it's a function-local extern declaration.
void setTopLevelDeclInObjCContainer(bool V=true)
void markUsed(ASTContext &C)
Mark the declaration used, in the sense of odr-use.
bool isCanonicalDecl() const
Whether this particular Decl is a canonical one.
Module * getOwningModule() const
Get the module that owns this declaration (for visibility purposes).
Module * getImportedOwningModule() const
Get the imported owning module, if this decl is from an imported (non-local) module.
ObjCDeclQualifier
ObjCDeclQualifier - 'Qualifiers' written next to the return and parameter types in method declaration...
bool isFromASTFile() const
Determine whether this declaration came from an AST file (such as a precompiled header or module) rat...
bool isTemplateParameter() const
isTemplateParameter - Determines whether this declaration is a template parameter.
bool isInvalidDecl() const
unsigned FromASTFile
Whether this declaration was loaded from an AST file.
void setAccess(AccessSpecifier AS)
SourceLocation getLocation() const
IdentifierNamespace
IdentifierNamespace - The different namespaces in which declarations may appear.
@ IDNS_Ordinary
Ordinary names.
@ IDNS_Type
Types, declared with 'struct foo', typedefs, etc.
@ IDNS_Tag
Tags, declared with 'struct foo;' and referenced with 'struct foo'.
bool isTemplateParameterPack() const
isTemplateParameter - Determines whether this declaration is a template parameter pack.
void setImplicit(bool I=true)
void setReferenced(bool R=true)
void setLocation(SourceLocation L)
DeclContext * getDeclContext()
void setCachedLinkage(Linkage L) const
void setDeclContext(DeclContext *DC)
setDeclContext - Set both the semantic and lexical DeclContext to DC.
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
ModuleOwnershipKind
The kind of ownership a declaration has, for visibility purposes.
@ VisiblePromoted
This declaration has an owning module, and is not visible to the current TU but we promoted it to be ...
@ VisibleWhenImported
This declaration has an owning module, and is visible when that module is imported.
@ Unowned
This declaration is not owned by a module.
@ ReachableWhenImported
This declaration has an owning module, and is visible to lookups that occurs within that module.
@ ModulePrivate
This declaration has an owning module, but is only visible to lookups that occur within that module.
@ Visible
This declaration has an owning module, but is globally visible (typically because its owning module i...
void setModuleOwnershipKind(ModuleOwnershipKind MOK)
Set whether this declaration is hidden from name lookup.
bool shouldEmitInExternalSource() const
Whether the definition of the declaration should be emitted in external sources.
void setVisibleDespiteOwningModule()
Set that this declaration is globally visible, even if it came from a module that is not visible.
The name of a declaration.
IdentifierInfo * getAsIdentifierInfo() const
Retrieve the IdentifierInfo * stored in this declaration name, or null if this declaration name isn't...
Selector getObjCSelector() const
Get the Objective-C selector stored in this declaration name.
Represents a ValueDecl that came out of a declarator.
void setInnerLocStart(SourceLocation L)
void setTypeSourceInfo(TypeSourceInfo *TI)
TypeSourceInfo * getTypeSourceInfo() const
A decomposition declaration.
static DecompositionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumBindings)
Represents an empty-declaration.
static EmptyDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
An instance of this object exists for each enum constant that is defined.
static EnumConstantDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setInitExpr(Expr *E)
void setInitVal(const ASTContext &C, const llvm::APSInt &V)
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this enumeration is an instantiation of a member enumeration of a class template specialization,...
void setFixed(bool Fixed=true)
True if this is an Objective-C, C++11, or Microsoft-style enumeration with a fixed underlying type.
void setIntegerType(QualType T)
Set the underlying integer type.
void setIntegerTypeSourceInfo(TypeSourceInfo *TInfo)
Set the underlying integer type source info.
static EnumDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setScoped(bool Scoped=true)
True if this tag declaration is a scoped enumeration.
void setPromotionType(QualType T)
Set the promotion type.
EnumDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
void setScopedUsingClassTag(bool ScopedUCT=true)
If this tag declaration is a scoped enum, then this is true if the scoped enum was declared using the...
Represents 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 a member of a struct/union/class.
void setBitWidth(Expr *Width)
Set the bit-field width for this member.
static FieldDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
const VariableArrayType * CapturedVLAType
void setRParenLoc(SourceLocation L)
void setAsmString(Expr *Asm)
static FileScopeAsmDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
FriendDecl - Represents the declaration of a friend entity, which can be a function,...
static FriendDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned FriendTypeNumTPLists)
Declaration of a friend template.
static FriendTemplateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
static DefaultedOrDeletedFunctionInfo * Create(ASTContext &Context, ArrayRef< DeclAccessPair > Lookups, StringLiteral *DeletedMessage=nullptr)
Represents a function declaration or definition.
void setDescribedFunctionTemplate(FunctionTemplateDecl *Template)
FunctionTemplateDecl * getDescribedFunctionTemplate() const
Retrieves the function template that is described by this function declaration.
void setIsPureVirtual(bool P=true)
void setDefaultedOrDeletedInfo(DefaultedOrDeletedFunctionInfo *Info)
void setFriendConstraintRefersToEnclosingTemplate(bool V=true)
void setHasSkippedBody(bool Skipped=true)
static FunctionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setUsesSEHTry(bool UST)
void setIsMultiVersion(bool V=true)
Sets the multiversion state for this declaration and all of its redeclarations.
void setHasWrittenPrototype(bool P=true)
State that this function has a written prototype.
bool isExplicitlyDefaulted() const
Whether this function is explicitly defaulted.
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this function is an instantiation of a member function of a class template specialization,...
FunctionTemplateSpecializationInfo * getTemplateSpecializationInfo() const
If this function is actually a function template specialization, retrieve information about this func...
void setDefaultLoc(SourceLocation NewLoc)
void setInstantiatedFromMemberTemplate(bool Val=true)
void setInlineSpecified(bool I)
Set whether the "inline" keyword was specified for this function.
TemplatedKind
The kind of templated function a FunctionDecl can be.
@ TK_MemberSpecialization
@ TK_DependentNonTemplate
@ TK_FunctionTemplateSpecialization
@ TK_DependentFunctionTemplateSpecialization
TemplatedKind getTemplatedKind() const
What kind of templated function this is.
void setInstantiatedFromDecl(FunctionDecl *FD)
Specify that this function declaration was instantiated from a FunctionDecl FD.
bool isDeletedAsWritten() const
void setHasInheritedPrototype(bool P=true)
State that this function inherited its prototype from a previous declaration.
void setDependentTemplateSpecialization(ASTContext &Context, const UnresolvedSetImpl &Templates, const TemplateArgumentListInfo *TemplateArgs)
Specifies that this function declaration is actually a dependent function template specialization.
void setVirtualAsWritten(bool V)
State that this function is marked as virtual explicitly.
void setIsDestroyingOperatorDelete(bool IsDestroyingDelete)
void setLateTemplateParsed(bool ILT=true)
State that this templated function will be late parsed.
void setImplicitlyInline(bool I=true)
Flag that this function is implicitly inline.
void setTrivialForCall(bool IT)
void setIsTypeAwareOperatorNewOrDelete(bool IsTypeAwareOperator=true)
bool isDefaulted() const
Whether this function is defaulted.
void setIneligibleOrNotSelected(bool II)
void setConstexprKind(ConstexprSpecKind CSK)
void setDefaulted(bool D=true)
void setStorageClass(StorageClass SClass)
Sets the storage class as written in the source.
void setDeletedAsWritten(bool D=true, StringLiteral *Message=nullptr)
void setExplicitlyDefaulted(bool ED=true)
State that this function is explicitly defaulted.
void setHasImplicitReturnZero(bool IRZ)
State that falling off this function implicitly returns null/zero.
Represents a prototype with parameter type info, e.g.
ExceptionSpecificationType getExceptionSpecType() const
Get the kind of exception specification on this function.
Declaration of a template function.
static FunctionTemplateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Create an empty function template node.
Provides information about a function template specialization, which is a FunctionDecl that has been ...
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)
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...
void setPosition(unsigned P)
void setDepth(unsigned D)
bool hasPlaceholderTypeConstraint() const
Determine whether this non-type template parameter's type has a placeholder with a type-constraint.
void setPlaceholderTypeConstraint(Expr *E)
void setDefaultArgument(const ASTContext &C, const TemplateArgumentLoc &DefArg)
Set the default argument for this template parameter, and whether that default argument was inherited...
This represents 'pragma omp allocate ...' directive.
static OMPAllocateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NVars, unsigned NClauses)
Pseudo declaration for capturing expressions.
static OMPCapturedExprDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
OMPChildren * Data
Data, associated with the directive.
This represents 'pragma omp declare mapper ...' directive.
static OMPDeclareMapperDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned N)
Creates deserialized declare mapper node.
This represents 'pragma omp declare reduction ...' directive.
void setInitializerData(Expr *OrigE, Expr *PrivE)
Set initializer Orig and Priv vars.
void setInitializer(Expr *E, OMPDeclareReductionInitKind IK)
Set initializer expression for the declare reduction construct.
void setCombiner(Expr *E)
Set combiner expression for the declare reduction construct.
void setCombinerData(Expr *InE, Expr *OutE)
Set combiner In and Out vars.
static OMPDeclareReductionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Create deserialized declare reduction node.
This represents 'pragma omp requires...' directive.
static OMPRequiresDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned N)
Create deserialized requires node.
This represents 'pragma omp threadprivate ...' directive.
static OMPThreadPrivateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned N)
Represents a field declaration created by an @defs(...).
static ObjCAtDefsFieldDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
ObjCCategoryDecl - Represents a category declaration.
void setProtocolList(ObjCProtocolDecl *const *List, unsigned Num, const SourceLocation *Locs, ASTContext &C)
setProtocolList - Set the list of protocols that this interface implements.
static ObjCCategoryDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setIvarLBraceLoc(SourceLocation Loc)
void setCategoryNameLoc(SourceLocation Loc)
void setIvarRBraceLoc(SourceLocation Loc)
bool IsClassExtension() const
ObjCCategoryImplDecl - An object of this class encapsulates a category @implementation declaration.
static ObjCCategoryImplDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
ObjCCompatibleAliasDecl - Represents alias of a class.
static ObjCCompatibleAliasDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setClassInterface(ObjCInterfaceDecl *D)
ObjCContainerDecl - Represents a container for method declarations.
void setAtStartLoc(SourceLocation Loc)
void setAtEndRange(SourceRange atEnd)
void setClassInterface(ObjCInterfaceDecl *IFace)
ObjCImplementationDecl - Represents a class definition - this is where method definitions are specifi...
static ObjCImplementationDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setIvarLBraceLoc(SourceLocation Loc)
void setSuperClass(ObjCInterfaceDecl *superCls)
void setIvarRBraceLoc(SourceLocation Loc)
void setHasDestructors(bool val)
void setHasNonZeroConstructors(bool val)
Represents an ObjC class declaration.
void mergeClassExtensionProtocolList(ObjCProtocolDecl *const *List, unsigned Num, ASTContext &C)
mergeClassExtensionProtocolList - Merge class extension's protocol list into the protocol list for th...
ObjCIvarDecl * lookupInstanceVariable(IdentifierInfo *IVarName, ObjCInterfaceDecl *&ClassDeclared)
unsigned getODRHash()
Get precomputed ODRHash or add a new one.
static ObjCInterfaceDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID)
ObjCInterfaceDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this Objective-C class.
ObjCIvarDecl - Represents an ObjC instance variable.
void setAccessControl(AccessControl ac)
void setNextIvar(ObjCIvarDecl *ivar)
ObjCInterfaceDecl * getContainingInterface()
Return the class interface that this ivar is logically contained in; this is either the interface whe...
void setSynthesize(bool synth)
static ObjCIvarDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
ObjCMethodDecl - Represents an instance or class method declaration.
void setSynthesizedAccessorStub(bool isSynthesizedAccessorStub)
void setObjCDeclQualifier(ObjCDeclQualifier QV)
void setDefined(bool isDefined)
void setSelfDecl(ImplicitParamDecl *SD)
void setReturnTypeSourceInfo(TypeSourceInfo *TInfo)
void setHasRedeclaration(bool HRD) const
void setIsRedeclaration(bool RD)
void setCmdDecl(ImplicitParamDecl *CD)
bool hasRedeclaration() const
True if redeclared in the same interface.
void setRelatedResultType(bool RRT=true)
Note whether this method has a related result type.
void setOverriding(bool IsOver)
void setPropertyAccessor(bool isAccessor)
void setDeclImplementation(ObjCImplementationControl ic)
void setReturnType(QualType T)
static ObjCMethodDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setHasSkippedBody(bool Skipped=true)
void setInstanceMethod(bool isInst)
void setVariadic(bool isVar)
Represents one property declaration in an Objective-C interface.
void setAtLoc(SourceLocation L)
void setPropertyImplementation(PropertyControl pc)
void setSetterName(Selector Sel, SourceLocation Loc=SourceLocation())
void setPropertyAttributes(ObjCPropertyAttribute::Kind PRVal)
static ObjCPropertyDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setPropertyAttributesAsWritten(ObjCPropertyAttribute::Kind PRVal)
void setLParenLoc(SourceLocation L)
void setPropertyIvarDecl(ObjCIvarDecl *Ivar)
void setSetterMethodDecl(ObjCMethodDecl *gDecl)
void setType(QualType T, TypeSourceInfo *TSI)
void setGetterName(Selector Sel, SourceLocation Loc=SourceLocation())
void setGetterMethodDecl(ObjCMethodDecl *gDecl)
ObjCPropertyImplDecl - Represents implementation declaration of a property in a class or category imp...
void setSetterMethodDecl(ObjCMethodDecl *MD)
void setSetterCXXAssignment(Expr *setterCXXAssignment)
static ObjCPropertyImplDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setGetterMethodDecl(ObjCMethodDecl *MD)
void setAtLoc(SourceLocation Loc)
void setPropertyDecl(ObjCPropertyDecl *Prop)
void setGetterCXXConstructor(Expr *getterCXXConstructor)
Represents an Objective-C protocol declaration.
static ObjCProtocolDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
ObjCProtocolDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this Objective-C protocol.
unsigned getODRHash()
Get precomputed ODRHash or add a new one.
Represents the declaration of an Objective-C type parameter.
static ObjCTypeParamDecl * CreateDeserialized(ASTContext &ctx, GlobalDeclID ID)
Stores a list of Objective-C type parameters for a parameterized class or a category/extension thereo...
static ObjCTypeParamList * create(ASTContext &ctx, SourceLocation lAngleLoc, ArrayRef< ObjCTypeParamDecl * > typeParams, SourceLocation rAngleLoc)
Create a new Objective-C type parameter list.
static OpenACCDeclareDecl * CreateDeserialized(ASTContext &Ctx, GlobalDeclID ID, unsigned NumClauses)
static OpenACCRoutineDecl * CreateDeserialized(ASTContext &Ctx, GlobalDeclID ID, unsigned NumClauses)
Represents a partial function definition.
void setNothrow(bool Nothrow=true)
static OutlinedFunctionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumParams)
void setParam(unsigned i, ImplicitParamDecl *P)
Represents a parameter to a function.
static ParmVarDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setUninstantiatedDefaultArg(Expr *arg)
void setScopeInfo(unsigned scopeDepth, unsigned parameterIndex)
void setObjCMethodScopeInfo(unsigned parameterIndex)
Represents a #pragma detect_mismatch line.
static PragmaDetectMismatchDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NameValueSize)
A (possibly-)qualified type.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
Represents a struct/union/class.
unsigned getODRHash()
Get precomputed ODRHash or add a new one.
void setAnonymousStructOrUnion(bool Anon)
void setArgPassingRestrictions(RecordArgPassingKind Kind)
void setNonTrivialToPrimitiveCopy(bool V)
void setHasNonTrivialToPrimitiveCopyCUnion(bool V)
void setHasNonTrivialToPrimitiveDestructCUnion(bool V)
void setHasFlexibleArrayMember(bool V)
void setParamDestroyedInCallee(bool V)
void setNonTrivialToPrimitiveDestroy(bool V)
void setHasObjectMember(bool val)
void setHasVolatileMember(bool val)
void setHasNonTrivialToPrimitiveDefaultInitializeCUnion(bool V)
static RecordDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID)
void setHasUninitializedExplicitInitFields(bool V)
void setNonTrivialToPrimitiveDefaultInitialize(bool V)
Declaration of a redeclarable template.
CommonBase * Common
Pointer to the common data shared by all declarations of this template.
virtual CommonBase * newCommon(ASTContext &C) const =0
RedeclarableTemplateDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this template.
void setMemberSpecialization()
Note that this member template is a specialization.
void setInstantiatedFromMemberTemplate(RedeclarableTemplateDecl *TD)
void setPrevious(decl_type *D)
Decl * getLatestNotUpdated() const
void setLatest(decl_type *D)
Provides common interface for the Decls that can be redeclared.
DeclLink RedeclLink
Points to the next redeclaration in the chain.
bool isFirstDecl() const
True if this is the first declaration in its redeclaration chain.
static DeclLink PreviousDeclLink(decl_type *D)
Represents the body of a requires-expression.
static RequiresExprBodyDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
const FunctionDecl * getKernelEntryPointDecl() const
Encodes a location in the source.
A trivial tuple used to represent a source range.
Represents a C++11 static_assert declaration.
static StaticAssertDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
StringLiteral - This represents a string literal expression, e.g.
Represents the declaration of a struct/union/class/enum.
void setTagKind(TagKind TK)
void setCompleteDefinitionRequired(bool V=true)
True if this complete decl is required to be complete for some existing use.
void demoteThisDefinitionToDeclaration()
Mark a definition as a declaration and maintain information it was a definition.
bool isThisDeclarationADefinition() const
Return true if this declaration is a completion definition of the type.
void setEmbeddedInDeclarator(bool isInDeclarator)
True if this tag declaration is "embedded" (i.e., defined or declared for the very first time) in the...
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
bool isFirstDecl() const
True if this is the first declaration in its redeclaration chain.
TagDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
void setFreeStanding(bool isFreeStanding=true)
True if this tag is free standing, e.g. "struct foo;".
void setBraceRange(SourceRange R)
void setCompleteDefinition(bool V=true)
True if this decl has its body fully specified.
A convenient class for passing around template argument information.
A template argument list.
static TemplateArgumentList * CreateCopy(ASTContext &Context, ArrayRef< TemplateArgument > Args)
Create a new template argument list that copies the given set of template arguments.
The base class of all kinds of template declarations (e.g., class, function, etc.).
TemplateParameterList * TemplateParams
void init(NamedDecl *NewTemplatedDecl)
Initialize the underlying templated declaration.
NamedDecl * getTemplatedDecl() const
Get the underlying, templated declaration.
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
A template parameter object.
TemplateParamObjectDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Stores a list of template parameters for a TemplateDecl and its derived classes.
TemplateTemplateParmDecl - Declares a template template parameter, e.g., "T" in.
unsigned getNumExpansionTemplateParameters() const
Retrieves the number of expansion template parameters in an expanded parameter pack.
static TemplateTemplateParmDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setPosition(unsigned P)
void setDepth(unsigned D)
void setDeclaredWithTypename(bool withTypename)
Set whether this template template parameter was declared with the 'typename' or 'class' keyword.
void setDefaultArgument(const ASTContext &C, const TemplateArgumentLoc &DefArg)
Set the default argument for this template parameter, and whether that default argument was inherited...
bool isExpandedParameterPack() const
Whether this parameter is a template template parameter pack that has a known list of different templ...
Declaration of a template type parameter.
void setTypeConstraint(ConceptReference *CR, Expr *ImmediatelyDeclaredConstraint, UnsignedOrNone ArgPackSubstIndex)
static TemplateTypeParmDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID)
bool hasTypeConstraint() const
Determine whether this template parameter has a type-constraint.
void setDefaultArgument(const ASTContext &C, const TemplateArgumentLoc &DefArg)
Set the default argument for this template parameter.
void setDeclaredWithTypename(bool withTypename)
Set whether this template type parameter was declared with the 'typename' or 'class' keyword.
A declaration that models statements at global scope.
static TopLevelStmtDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
The top declaration context.
Represents the declaration of a typedef-name via a C++11 alias-declaration.
static TypeAliasDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setDescribedAliasTemplate(TypeAliasTemplateDecl *TAT)
Declaration of an alias template.
static TypeAliasTemplateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Create an empty alias template node.
Represents a declaration of a type.
void setLocStart(SourceLocation L)
A container of type source information.
QualType getType() const
Return the type wrapped by this type source info.
const T * castAs() const
Member-template castAs<specific type>.
AutoType * getContainedAutoType() const
Get the AutoType whose type will be deduced for a variable with an initializer of this type.
const T * getAs() const
Member-template getAs<specific type>'.
Represents the declaration of a typedef-name via the 'typedef' type specifier.
static TypedefDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Base class for declarations which introduce a typedef-name.
void setModedTypeSourceInfo(TypeSourceInfo *unmodedTSI, QualType modedTy)
void setTypeSourceInfo(TypeSourceInfo *newType)
An artificial decl, representing a global anonymous constant value which is uniquified by value withi...
void addDecl(NamedDecl *D)
A set of unresolved declarations.
This node is generated when a using-declaration that was annotated with attribute((using_if_exists)) ...
static UnresolvedUsingIfExistsDecl * CreateDeserialized(ASTContext &Ctx, GlobalDeclID ID)
Represents a dependent using declaration which was marked with typename.
static UnresolvedUsingTypenameDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a dependent using declaration which was not marked with typename.
void setUsingLoc(SourceLocation L)
Set the source location of the 'using' keyword.
static UnresolvedUsingValueDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a C++ using-declaration.
void setTypename(bool TN)
Sets whether the using declaration has 'typename'.
void setUsingLoc(SourceLocation L)
Set the source location of the 'using' keyword.
static UsingDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents C++ using-directive.
static UsingDirectiveDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a C++ using-enum-declaration.
void setEnumType(TypeSourceInfo *TSI)
void setEnumLoc(SourceLocation L)
void setUsingLoc(SourceLocation L)
static UsingEnumDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a pack of using declarations that a single using-declarator pack-expanded into.
static UsingPackDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumExpansions)
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
static UsingShadowDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
void setType(QualType newType)
Represents a variable declaration or definition.
ParmVarDeclBitfields ParmVarDeclBits
static VarDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
VarDeclBitfields VarDeclBits
EvaluatedStmt * ensureEvaluatedStmt() const
Convert the initializer for this declaration to the elaborated EvaluatedStmt form,...
NonParmVarDeclBitfields NonParmVarDeclBits
@ Definition
This declaration is definitely a definition.
void setDescribedVarTemplate(VarTemplateDecl *Template)
StorageClass getStorageClass() const
Returns the storage class as written in the source.
VarDecl * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
Declaration of a variable template.
static VarTemplateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Create an empty variable template node.
static VarTemplatePartialSpecializationDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a variable template specialization, which refers to a variable template with a given set o...
void setTemplateArgsAsWritten(const ASTTemplateArgumentListInfo *ArgsWritten)
Set the template argument list as written in the sources.
static VarTemplateSpecializationDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
RawLocEncoding getRawLoc() const
uint64_t getBitOffset(const uint64_t DeclTypesBlockStartOffset) const
Information about a module that has been loaded by the ASTReader.
const serialization::ObjCCategoriesInfo * ObjCCategoriesMap
Array of category list location information within this module file, sorted by the definition ID.
unsigned LocalNumObjCCategoriesInMap
The number of redeclaration info entries in ObjCCategoriesMap.
llvm::BitstreamCursor DeclsCursor
DeclsCursor - This is a cursor to the start of the DECLTYPES_BLOCK block.
uint64_t GlobalBitOffset
The global bit offset (or base) of this module.
const DeclOffset * DeclOffsets
Offset of each declaration within the bitstream, indexed by the declaration ID (-1).
unsigned Generation
The generation of which this module file is a part.
uint64_t DeclsBlockStartOffset
The offset to the start of the DECLTYPES_BLOCK block.
ModuleKind Kind
The type of this module.
SmallVector< uint64_t, 1 > ObjCCategories
The Objective-C category lists for categories known to this module.
const unsigned int LOCAL_REDECLARATIONS
Record code for a list of local redeclarations of a declaration.
DeclCode
Record codes for each kind of declaration.
const unsigned int DECL_UPDATES
Record of updates for a declaration that was modified after being deserialized.
@ DECL_EMPTY
An EmptyDecl record.
@ DECL_CAPTURED
A CapturedDecl record.
@ DECL_CXX_BASE_SPECIFIERS
A record containing CXXBaseSpecifiers.
@ DECL_CXX_RECORD
A CXXRecordDecl record.
@ DECL_VAR_TEMPLATE_PARTIAL_SPECIALIZATION
A VarTemplatePartialSpecializationDecl record.
@ DECL_OMP_ALLOCATE
An OMPAllocateDcl record.
@ DECL_MS_PROPERTY
A MSPropertyDecl record.
@ DECL_OMP_DECLARE_MAPPER
An OMPDeclareMapperDecl record.
@ DECL_TOP_LEVEL_STMT_DECL
A TopLevelStmtDecl record.
@ DECL_REQUIRES_EXPR_BODY
A RequiresExprBodyDecl record.
@ DECL_STATIC_ASSERT
A StaticAssertDecl record.
@ DECL_INDIRECTFIELD
A IndirectFieldDecl record.
@ DECL_TEMPLATE_TEMPLATE_PARM
A TemplateTemplateParmDecl record.
@ DECL_IMPORT
An ImportDecl recording a module import.
@ DECL_UNNAMED_GLOBAL_CONSTANT
A UnnamedGlobalConstantDecl record.
@ DECL_ACCESS_SPEC
An AccessSpecDecl record.
@ DECL_OBJC_TYPE_PARAM
An ObjCTypeParamDecl record.
@ DECL_OBJC_CATEGORY_IMPL
A ObjCCategoryImplDecl record.
@ DECL_ENUM_CONSTANT
An EnumConstantDecl record.
@ DECL_PARM_VAR
A ParmVarDecl record.
@ DECL_TYPEDEF
A TypedefDecl record.
@ DECL_EXPANDED_TEMPLATE_TEMPLATE_PARM_PACK
A TemplateTemplateParmDecl record that stores an expanded template template parameter pack.
@ DECL_HLSL_BUFFER
A HLSLBufferDecl record.
@ DECL_NAMESPACE_ALIAS
A NamespaceAliasDecl record.
@ DECL_TYPEALIAS
A TypeAliasDecl record.
@ DECL_FUNCTION_TEMPLATE
A FunctionTemplateDecl record.
@ DECL_MS_GUID
A MSGuidDecl record.
@ DECL_UNRESOLVED_USING_TYPENAME
An UnresolvedUsingTypenameDecl record.
@ DECL_CLASS_TEMPLATE_SPECIALIZATION
A ClassTemplateSpecializationDecl record.
@ DECL_FILE_SCOPE_ASM
A FileScopeAsmDecl record.
@ DECL_PARTIAL_SPECIALIZATIONS
@ DECL_CXX_CONSTRUCTOR
A CXXConstructorDecl record.
@ DECL_CXX_CONVERSION
A CXXConversionDecl record.
@ DECL_FIELD
A FieldDecl record.
@ DECL_LINKAGE_SPEC
A LinkageSpecDecl record.
@ DECL_CONTEXT_TU_LOCAL_VISIBLE
A record that stores the set of declarations that are only visible to the TU.
@ DECL_NAMESPACE
A NamespaceDecl record.
@ DECL_NON_TYPE_TEMPLATE_PARM
A NonTypeTemplateParmDecl record.
@ DECL_USING_PACK
A UsingPackDecl record.
@ DECL_FUNCTION
A FunctionDecl record.
@ DECL_USING_DIRECTIVE
A UsingDirecitveDecl record.
@ DECL_RECORD
A RecordDecl record.
@ DECL_CONTEXT_LEXICAL
A record that stores the set of declarations that are lexically stored within a given DeclContext.
@ DECL_OUTLINEDFUNCTION
A OutlinedFunctionDecl record.
@ DECL_BLOCK
A BlockDecl record.
@ DECL_UNRESOLVED_USING_VALUE
An UnresolvedUsingValueDecl record.
@ DECL_TYPE_ALIAS_TEMPLATE
A TypeAliasTemplateDecl record.
@ DECL_CXX_CTOR_INITIALIZERS
A record containing CXXCtorInitializers.
@ DECL_OBJC_CATEGORY
A ObjCCategoryDecl record.
@ DECL_VAR
A VarDecl record.
@ DECL_UNRESOLVED_USING_IF_EXISTS
An UnresolvedUsingIfExistsDecl record.
@ DECL_USING
A UsingDecl record.
@ DECL_OBJC_PROTOCOL
A ObjCProtocolDecl record.
@ DECL_TEMPLATE_TYPE_PARM
A TemplateTypeParmDecl record.
@ DECL_VAR_TEMPLATE_SPECIALIZATION
A VarTemplateSpecializationDecl record.
@ DECL_OBJC_IMPLEMENTATION
A ObjCImplementationDecl record.
@ DECL_LABEL
A LabelDecl record.
@ DECL_OBJC_COMPATIBLE_ALIAS
A ObjCCompatibleAliasDecl record.
@ DECL_CONSTRUCTOR_USING_SHADOW
A ConstructorUsingShadowDecl record.
@ DECL_USING_ENUM
A UsingEnumDecl record.
@ DECL_FRIEND_TEMPLATE
A FriendTemplateDecl record.
@ DECL_PRAGMA_DETECT_MISMATCH
A PragmaDetectMismatchDecl record.
@ DECL_EXPANDED_NON_TYPE_TEMPLATE_PARM_PACK
A NonTypeTemplateParmDecl record that stores an expanded non-type template parameter pack.
@ DECL_OBJC_AT_DEFS_FIELD
A ObjCAtDefsFieldDecl record.
@ DECL_IMPLICIT_PARAM
An ImplicitParamDecl record.
@ DECL_FRIEND
A FriendDecl record.
@ DECL_CXX_METHOD
A CXXMethodDecl record.
@ DECL_EXPORT
An ExportDecl record.
@ DECL_BINDING
A BindingDecl record.
@ DECL_PRAGMA_COMMENT
A PragmaCommentDecl record.
@ DECL_ENUM
An EnumDecl record.
@ DECL_CONTEXT_MODULE_LOCAL_VISIBLE
A record containing the set of declarations that are only visible from DeclContext in the same module...
@ DECL_DECOMPOSITION
A DecompositionDecl record.
@ DECL_OMP_DECLARE_REDUCTION
An OMPDeclareReductionDecl record.
@ DECL_OMP_THREADPRIVATE
An OMPThreadPrivateDecl record.
@ DECL_OBJC_METHOD
A ObjCMethodDecl record.
@ DECL_CXX_DESTRUCTOR
A CXXDestructorDecl record.
@ DECL_OMP_CAPTUREDEXPR
An OMPCapturedExprDecl record.
@ DECL_CLASS_TEMPLATE
A ClassTemplateDecl record.
@ DECL_USING_SHADOW
A UsingShadowDecl record.
@ DECL_CONCEPT
A ConceptDecl record.
@ DECL_CXX_DEDUCTION_GUIDE
A CXXDeductionGuideDecl record.
@ DECL_OMP_REQUIRES
An OMPRequiresDecl record.
@ DECL_OBJC_IVAR
A ObjCIvarDecl record.
@ DECL_OBJC_PROPERTY
A ObjCPropertyDecl record.
@ DECL_TEMPLATE_PARAM_OBJECT
A TemplateParamObjectDecl record.
@ DECL_OBJC_INTERFACE
A ObjCInterfaceDecl record.
@ DECL_VAR_TEMPLATE
A VarTemplateDecl record.
@ DECL_LIFETIME_EXTENDED_TEMPORARY
An LifetimeExtendedTemporaryDecl record.
@ DECL_CLASS_TEMPLATE_PARTIAL_SPECIALIZATION
A ClassTemplatePartialSpecializationDecl record.
@ DECL_IMPLICIT_CONCEPT_SPECIALIZATION
An ImplicitConceptSpecializationDecl record.
@ DECL_CONTEXT_VISIBLE
A record that stores the set of declarations that are visible from a given DeclContext.
@ DECL_OBJC_PROPERTY_IMPL
A ObjCPropertyImplDecl record.
Defines the Linkage enumeration and various utility functions.
const internal::VariadicAllOfMatcher< Decl > decl
Matches declarations.
@ Number
Just a number, nothing else.
ComparisonCategoryResult Compare(const T &X, const T &Y)
Helper to compare two comparable types.
std::variant< struct RequiresDecl, struct HeaderDecl, struct UmbrellaDirDecl, struct ModuleDecl, struct ExcludeDecl, struct ExportDecl, struct ExportAsDecl, struct ExternModuleDecl, struct UseDecl, struct LinkDecl, struct ConfigMacrosDecl, struct ConflictDecl > Decl
All declarations that can appear in a module declaration.
bool needsAnonymousDeclarationNumber(const NamedDecl *D)
Determine whether the given declaration needs an anonymous declaration number.
void numberAnonymousDeclsWithin(const DeclContext *DC, Fn Visit)
Visit each declaration within DC that needs an anonymous declaration number and call Visit with the d...
uint64_t TypeID
An ID number that refers to a type in an AST file.
@ MK_MainFile
File is a PCH file treated as the actual main file.
uint32_t SubmoduleID
An ID number that refers to a submodule in a module file.
bool isPartOfPerModuleInitializer(const Decl *D)
Determine whether the given declaration will be included in the per-module initializer if it needs to...
@ DeclMarkedOpenMPThreadPrivate
@ CXXResolvedDtorGlobArrayDelete
@ CXXInstantiatedClassDefinition
@ CXXResolvedExceptionSpec
@ CXXResolvedDtorArrayDelete
@ CXXInstantiatedDefaultArgument
@ CXXInstantiatedDefaultMemberInitializer
@ CXXAddedAnonymousNamespace
@ CXXResolvedDtorGlobDelete
@ CXXAddedFunctionDefinition
@ CXXPointOfInstantiation
@ DeclMarkedOpenMPIndirectCall
@ DeclMarkedOpenMPDeclareTarget
@ DeclMarkedOpenMPAllocate
The JSON file list parser is used to communicate input to InstallAPI.
bool isa(CodeGen::Address addr)
SelectorLocationsKind
Whether all locations of the selector identifiers are in a "standard" position.
LazyOffsetPtr< Stmt, uint64_t, &ExternalASTSource::GetExternalDeclStmt > LazyDeclStmtPtr
A lazy pointer to a statement.
bool isUnresolvedExceptionSpec(ExceptionSpecificationType ESpecType)
ConstexprSpecKind
Define the kind of constexpr specifier.
LinkageSpecLanguageIDs
Represents the language in a linkage specification.
LambdaCaptureKind
The different capture forms in a lambda introducer.
@ LCK_ByCopy
Capturing by copy (a.k.a., by value)
@ LCK_ByRef
Capturing by reference.
@ LCK_VLAType
Capturing variable-length array type.
@ LCK_StarThis
Capturing the *this object by copy.
@ LCK_This
Capturing the *this object by reference.
AccessSpecifier
A C++ access specifier (public, private, protected), plus the special value "none" which means differ...
SmallVector< Attr *, 4 > AttrVec
AttrVec - A vector of Attr, which is how they are stored on the AST.
OMPDeclareReductionInitKind
StorageClass
Storage classes.
Linkage
Describes the different kinds of linkage (C++ [basic.link], C99 6.2.2) that an entity may have.
@ None
No linkage, which means that the entity is unique and can only be referred to from within its scope.
@ Result
The result type of a method or function.
OptionalUnsigned< unsigned > UnsignedOrNone
@ Template
We are parsing a template declaration.
TagTypeKind
The kind of a tag type.
@ VarTemplate
The name was classified as a variable template name.
ObjCImplementationControl
RecordArgPassingKind
Enum that represents the different ways arguments are passed to and returned from function calls.
static bool isUndeducedReturnType(QualType T)
bool operator!=(CanQual< T > x, CanQual< U > y)
TemplateNameKind
Specifies the kind of template name that an identifier refers to.
DeductionCandidate
Only used by CXXDeductionGuideDecl.
bool shouldSkipCheckingODR(const Decl *D)
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
U cast(CodeGen::Address addr)
@ Interface
The "__interface" keyword introduces the elaborated-type-specifier.
@ Class
The "class" keyword introduces the elaborated-type-specifier.
@ Other
Other implicit parameter.
Structure used to store a statement, the constant value to which it was evaluated (if any),...
bool HasConstantDestruction
Whether this variable is known to have constant destruction.
bool WasEvaluated
Whether this statement was already evaluated.
bool CheckedForSideEffects
bool HasConstantInitialization
Whether this variable is known to have constant initialization.
Provides information about an explicit instantiation of a variable or class template.
SourceLocation ExternKeywordLoc
The location of the extern keyword.
Data that is common to all of the declarations of a given function template.
llvm::FoldingSetVector< FunctionTemplateSpecializationInfo > Specializations
The function template specializations for this function template, including explicit specializations ...
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