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;
420 template <
typename T>
423 template <
typename T>
427 RedeclarableResult &Redecl);
463template <
typename DeclT>
class MergedRedeclIterator {
464 DeclT *Start =
nullptr;
465 DeclT *Canonical =
nullptr;
466 DeclT *Current =
nullptr;
469 MergedRedeclIterator() =
default;
470 MergedRedeclIterator(DeclT *Start) : Start(Start), Current(Start) {}
474 MergedRedeclIterator &operator++() {
475 if (Current->isFirstDecl()) {
477 Current = Current->getMostRecentDecl();
479 Current = Current->getPreviousDecl();
485 if (Current == Start || Current == Canonical)
490 friend bool operator!=(
const MergedRedeclIterator &A,
491 const MergedRedeclIterator &B) {
492 return A.Current != B.Current;
498template <
typename DeclT>
499static llvm::iterator_range<MergedRedeclIterator<DeclT>>
501 return llvm::make_range(MergedRedeclIterator<DeclT>(D),
502 MergedRedeclIterator<DeclT>());
505uint64_t ASTDeclReader::GetCurrentCursorOffset() {
506 return Loc.F->DeclsCursor.GetCurrentBitNo() + Loc.F->GlobalBitOffset;
510 if (Record.readInt()) {
511 Reader.DefinitionSource[FD] =
513 Reader.getContext().getLangOpts().BuildingPCHWithObjectFile;
515 if (
auto *CD = dyn_cast<CXXConstructorDecl>(FD)) {
516 CD->setNumCtorInitializers(Record.readInt());
517 if (CD->getNumCtorInitializers())
518 CD->CtorInitializers = ReadGlobalOffset();
521 Reader.PendingBodies[FD] = GetCurrentCursorOffset();
524 Reader.ThisDeclarationWasADefinitionSet.insert(FD);
533 IsDeclMarkedUsed =
false;
535 if (
auto *DD = dyn_cast<DeclaratorDecl>(D)) {
536 if (
auto *TInfo = DD->getTypeSourceInfo())
537 Record.readTypeLoc(TInfo->getTypeLoc());
540 if (
auto *TD = dyn_cast<TypeDecl>(D)) {
543 assert(DeferredTypeID == 0 &&
544 "Deferred type not used for TagDecls and Typedefs");
546 TD->setTypeForDecl(Reader.GetType(DeferredTypeID).getTypePtrOrNull());
550 if (NamedDeclForTagDecl.isValid())
553 }
else if (
auto *ID = dyn_cast<ObjCInterfaceDecl>(D)) {
555 ID->TypeForDecl = Reader.GetType(DeferredTypeID).getTypePtrOrNull();
556 }
else if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
558 if (Record.readInt())
560 }
else if (
auto *VD = dyn_cast<VarDecl>(D)) {
562 }
else if (
auto *FD = dyn_cast<FieldDecl>(D)) {
563 if (FD->hasInClassInitializer() && Record.readInt()) {
564 FD->setLazyInClassInitializer(
LazyDeclStmtPtr(GetCurrentCursorOffset()));
571 auto ModuleOwnership =
575 IsDeclMarkedUsed |= D->Used;
578 bool HasStandaloneLexicalDC = DeclBits.
getNextBit();
592 GlobalDeclID SemaDCIDForTemplateParmDecl = readDeclID();
595 if (LexicalDCIDForTemplateParmDecl.
isInvalid())
596 LexicalDCIDForTemplateParmDecl = SemaDCIDForTemplateParmDecl;
597 Reader.addPendingDeclContextInfo(D,
598 SemaDCIDForTemplateParmDecl,
599 LexicalDCIDForTemplateParmDecl);
602 auto *SemaDC = readDeclAs<DeclContext>();
604 HasStandaloneLexicalDC ? readDeclAs<DeclContext>() :
nullptr;
610 if (
auto *RD = dyn_cast<CXXRecordDecl>(SemaDC))
611 MergedSemaDC = getOrFakePrimaryClassDefinition(Reader, RD);
613 MergedSemaDC = Reader.MergedDeclContexts.
lookup(SemaDC);
616 D->setDeclContextsImpl(MergedSemaDC ? MergedSemaDC : SemaDC, LexicalDC,
617 Reader.getContext());
623 Record.readAttributes(Attrs);
626 D->setAttrsImpl(Attrs, Reader.getContext());
634 switch (ModuleOwnership) {
653 }
else if (Reader.getContext().getLangOpts().ModulesLocalVisibility) {
661 Reader.HiddenNamesMap[Owner].push_back(D);
663 }
else if (ModulePrivate) {
672 std::string Arg = readString();
673 memcpy(D->getTrailingObjects(), Arg.data(), Arg.size());
674 D->getTrailingObjects()[Arg.size()] =
'\0';
680 std::string Name = readString();
681 memcpy(D->getTrailingObjects(), Name.data(), Name.size());
682 D->getTrailingObjects()[Name.size()] =
'\0';
684 D->ValueStart = Name.size() + 1;
685 std::string
Value = readString();
686 memcpy(D->getTrailingObjects() + D->ValueStart,
Value.data(),
Value.size());
687 D->getTrailingObjects()[D->ValueStart +
Value.size()] =
'\0';
691 llvm_unreachable(
"Translation units are not serialized");
697 AnonymousDeclNumber = Record.readInt();
705 DeferredTypeID = Record.getGlobalTypeID(Record.readInt());
712 if (Record.readInt()) {
713 QualType modedT = Record.readType();
732 if (
auto *
Template = readDeclAs<TypeAliasTemplateDecl>())
758 auto *Info =
new (Reader.getContext()) TagDecl::ExtInfo();
759 Record.readQualifierInfo(*Info);
760 TD->TypedefNameDeclOrQualifier = Info;
764 NamedDeclForTagDecl = readDeclID();
765 TypedefNameForLinkage = Record.readIdentifier();
768 llvm_unreachable(
"unexpected tag info kind");
785 ED->setNumPositiveBits(EnumDeclBits.
getNextBits(8));
786 ED->setNumNegativeBits(EnumDeclBits.
getNextBits(8));
791 ED->setHasODRHash(
true);
792 ED->ODRHash = Record.readInt();
802 if (!D->isFromASTFile() && D->isCompleteDefinition()) {
809 Reader.MergedDeclContexts.insert(std::make_pair(ED, OldDef));
811 Reader.mergeDefinitionVisibility(OldDef, ED);
816 Reader.PendingEnumOdrMergeFailures[OldDef].push_back(ED);
822 if (
auto *InstED = readDeclAs<EnumDecl>()) {
825 ED->setInstantiationOfMemberEnum(Reader.getContext(), InstED, TSK);
854 RD->setODRHash(Record.readInt());
860 RecordDecl *&OldDef = Reader.RecordDefinitions[Canon];
865 if (!D->isFromASTFile() && D->isCompleteDefinition()) {
872 Reader.MergedDeclContexts.insert(std::make_pair(RD, OldDef));
874 Reader.mergeDefinitionVisibility(OldDef, RD);
876 Reader.PendingRecordOdrMergeFailures[OldDef].push_back(RD);
889 DeferredTypeID = Record.getGlobalTypeID(Record.readInt());
891 VD->
setType(Record.readType());
896 if (Record.readInt())
898 ECD->
setInitVal(Reader.getContext(), Record.readAPSInt());
905 if (Record.readInt()) {
906 auto *Info =
new (Reader.getContext()) DeclaratorDecl::ExtInfo();
907 Record.readQualifierInfo(*Info);
913 QualType TSIType = Record.readType();
915 TSIType.
isNull() ?
nullptr
916 : Reader.getContext().CreateTypeSourceInfo(TSIType));
931 auto *
Template = readDeclAs<FunctionTemplateDecl>();
937 auto *InstFD = readDeclAs<FunctionDecl>();
940 FD->setInstantiationOfMemberFunction(Reader.getContext(), InstFD, TSK);
945 auto *
Template = readDeclAs<FunctionTemplateDecl>();
950 Record.readTemplateArgumentList(TemplArgs,
true);
954 bool HasTemplateArgumentsAsWritten = Record.readBool();
955 if (HasTemplateArgumentsAsWritten)
956 Record.readTemplateArgumentListInfo(TemplArgsWritten);
965 if (Record.readInt()) {
966 auto *FD = readDeclAs<FunctionDecl>();
977 HasTemplateArgumentsAsWritten ? &TemplArgsWritten :
nullptr, POI,
979 FD->TemplateOrSpecialization = FTInfo;
984 auto *CanonTemplate = readDeclAs<FunctionTemplateDecl>();
990 llvm::FoldingSetNodeID ID;
992 void *InsertPos =
nullptr;
999 assert(Reader.getContext().getLangOpts().Modules &&
1000 "already deserialized this template specialization");
1009 unsigned NumCandidates = Record.readInt();
1010 while (NumCandidates--)
1011 Candidates.
addDecl(readDeclAs<NamedDecl>());
1015 bool HasTemplateArgumentsAsWritten = Record.readBool();
1016 if (HasTemplateArgumentsAsWritten)
1017 Record.readTemplateArgumentListInfo(TemplArgsWritten);
1020 Reader.getContext(), Candidates,
1021 HasTemplateArgumentsAsWritten ? &TemplArgsWritten :
nullptr);
1040 Reader.PendingDeducedFunctionTypes.push_back({FD, DeferredTypeID});
1042 FD->
setType(Reader.GetType(DeferredTypeID));
1046 FD->DNLoc = Record.readDeclarationNameLoc(FD->
getDeclName());
1062 const bool Pure = FunctionDeclBits.
getNextBit();
1083 FD->EndRangeLoc = readSourceLocation();
1087 FD->ODRHash = Record.readInt();
1088 FD->setHasODRHash(
true);
1094 if (
auto Info = Record.readInt()) {
1095 bool HasMessage = Info & 2;
1099 unsigned NumLookups = Record.readInt();
1101 for (
unsigned I = 0; I != NumLookups; ++I) {
1109 Reader.getContext(), Lookups, DeletedMessage));
1114 MergeImpl.mergeRedeclarable(FD, Existing, Redecl);
1120 auto merge = [
this, &Redecl, FD](
auto &&F) {
1121 auto *Existing = cast_or_null<FunctionDecl>(Redecl.getKnownMergeTarget());
1122 RedeclarableResult NewRedecl(Existing ? F(Existing) :
nullptr,
1123 Redecl.getFirstID(), Redecl.isKeyDecl());
1141 unsigned NumParams = Record.readInt();
1143 Params.reserve(NumParams);
1144 for (
unsigned I = 0; I != NumParams; ++I)
1145 Params.push_back(readDeclAs<ParmVarDecl>());
1146 FD->setParams(Reader.getContext(), Params);
1151 if (FD->
hasAttr<SYCLKernelEntryPointAttr>()) {
1152 auto *SKEPAttr = FD->
getAttr<SYCLKernelEntryPointAttr>();
1154 const SYCLKernelInfo *SKI =
C.findSYCLKernelInfo(SKEPAttr->getKernelName());
1157 Reader.Diag(FD->
getLocation(), diag::err_sycl_kernel_name_conflict)
1160 diag::note_previous_declaration);
1161 SKEPAttr->setInvalidAttr();
1164 C.registerSYCLEntryPointFunction(FD);
1171 if (Record.readInt()) {
1174 Reader.PendingBodies[MD] = GetCurrentCursorOffset();
1177 MD->
setCmdDecl(readDeclAs<ImplicitParamDecl>());
1189 Reader.getContext().setObjCMethodRedeclaration(MD,
1190 readDeclAs<ObjCMethodDecl>());
1198 MD->DeclEndLoc = readSourceLocation();
1199 unsigned NumParams = Record.readInt();
1201 Params.reserve(NumParams);
1202 for (
unsigned I = 0; I != NumParams; ++I)
1203 Params.push_back(readDeclAs<ParmVarDecl>());
1206 unsigned NumStoredSelLocs = Record.readInt();
1208 SelLocs.reserve(NumStoredSelLocs);
1209 for (
unsigned i = 0; i != NumStoredSelLocs; ++i)
1210 SelLocs.push_back(readSourceLocation());
1212 MD->setParamsAndSelLocs(Reader.getContext(), Params, SelLocs);
1218 D->Variance = Record.readInt();
1219 D->Index = Record.readInt();
1220 D->VarianceLoc = readSourceLocation();
1221 D->ColonLoc = readSourceLocation();
1231 unsigned numParams = Record.readInt();
1236 typeParams.reserve(numParams);
1237 for (
unsigned i = 0; i != numParams; ++i) {
1238 auto *typeParam = readDeclAs<ObjCTypeParamDecl>();
1242 typeParams.push_back(typeParam);
1249 typeParams, rAngleLoc);
1252void ASTDeclReader::ReadObjCDefinitionData(
1253 struct ObjCInterfaceDecl::DefinitionData &
Data) {
1255 Data.SuperClassTInfo = readTypeSourceInfo();
1257 Data.EndLoc = readSourceLocation();
1258 Data.HasDesignatedInitializers =
Record.readInt();
1260 Data.HasODRHash =
true;
1263 unsigned NumProtocols =
Record.readInt();
1265 Protocols.reserve(NumProtocols);
1266 for (
unsigned I = 0; I != NumProtocols; ++I)
1267 Protocols.push_back(readDeclAs<ObjCProtocolDecl>());
1269 ProtoLocs.reserve(NumProtocols);
1270 for (
unsigned I = 0; I != NumProtocols; ++I)
1271 ProtoLocs.push_back(readSourceLocation());
1272 Data.ReferencedProtocols.set(Protocols.data(), NumProtocols, ProtoLocs.data(),
1276 NumProtocols =
Record.readInt();
1278 Protocols.reserve(NumProtocols);
1279 for (
unsigned I = 0; I != NumProtocols; ++I)
1280 Protocols.push_back(readDeclAs<ObjCProtocolDecl>());
1281 Data.AllReferencedProtocols.set(Protocols.data(), NumProtocols,
1287 struct ObjCInterfaceDecl::DefinitionData &DD = D->data();
1288 if (DD.Definition == NewDD.Definition)
1291 Reader.MergedDeclContexts.insert(
1292 std::make_pair(NewDD.Definition, DD.Definition));
1293 Reader.mergeDefinitionVisibility(DD.Definition, NewDD.Definition);
1296 Reader.PendingObjCInterfaceOdrMergeFailures[DD.Definition].push_back(
1297 {NewDD.Definition, &NewDD});
1303 DeferredTypeID = Record.getGlobalTypeID(Record.readInt());
1307 if (Record.readInt()) {
1309 ID->allocateDefinitionData();
1311 ReadObjCDefinitionData(ID->data());
1313 if (Canon->Data.getPointer()) {
1316 MergeImpl.MergeDefinitionData(Canon, std::move(ID->data()));
1317 ID->Data = Canon->Data;
1321 ID->getCanonicalDecl()->Data = ID->Data;
1324 ID->setIvarList(
nullptr);
1328 Reader.PendingDefinitions.insert(ID);
1331 Reader.ObjCClassesLoaded.push_back(ID);
1333 ID->Data = ID->getCanonicalDecl()->Data;
1342 bool synth = Record.readInt();
1357 if (PrevIvar && PrevIvar != IVD) {
1358 auto *ParentExt = dyn_cast<ObjCCategoryDecl>(IVD->
getDeclContext());
1359 auto *PrevParentExt =
1361 if (ParentExt && PrevParentExt) {
1365 .PendingObjCExtensionIvarRedeclarations[std::make_pair(ParentExt,
1367 .push_back(std::make_pair(IVD, PrevIvar));
1368 }
else if (ParentExt || PrevParentExt) {
1372 Reader.Diag(IVD->
getLocation(), diag::err_duplicate_ivar_declaration)
1374 Reader.Diag(PrevIvar->
getLocation(), diag::note_previous_definition);
1379void ASTDeclReader::ReadObjCDefinitionData(
1380 struct ObjCProtocolDecl::DefinitionData &
Data) {
1381 unsigned NumProtoRefs =
Record.readInt();
1383 ProtoRefs.reserve(NumProtoRefs);
1384 for (
unsigned I = 0; I != NumProtoRefs; ++I)
1385 ProtoRefs.push_back(readDeclAs<ObjCProtocolDecl>());
1387 ProtoLocs.reserve(NumProtoRefs);
1388 for (
unsigned I = 0; I != NumProtoRefs; ++I)
1389 ProtoLocs.push_back(readSourceLocation());
1390 Data.ReferencedProtocols.set(ProtoRefs.data(), NumProtoRefs,
1393 Data.HasODRHash =
true;
1398 struct ObjCProtocolDecl::DefinitionData &DD = D->data();
1399 if (DD.Definition == NewDD.Definition)
1402 Reader.MergedDeclContexts.insert(
1403 std::make_pair(NewDD.Definition, DD.Definition));
1404 Reader.mergeDefinitionVisibility(DD.Definition, NewDD.Definition);
1407 Reader.PendingObjCProtocolOdrMergeFailures[DD.Definition].push_back(
1408 {NewDD.Definition, &NewDD});
1416 if (Record.readInt()) {
1418 PD->allocateDefinitionData();
1420 ReadObjCDefinitionData(PD->data());
1423 if (Canon->Data.getPointer()) {
1426 MergeImpl.MergeDefinitionData(Canon, std::move(PD->data()));
1427 PD->Data = Canon->Data;
1434 Reader.PendingDefinitions.insert(PD);
1453 Reader.CategoriesDeserialized.insert(CD);
1455 CD->ClassInterface = readDeclAs<ObjCInterfaceDecl>();
1457 unsigned NumProtoRefs = Record.readInt();
1459 ProtoRefs.reserve(NumProtoRefs);
1460 for (
unsigned I = 0; I != NumProtoRefs; ++I)
1461 ProtoRefs.push_back(readDeclAs<ObjCProtocolDecl>());
1463 ProtoLocs.reserve(NumProtoRefs);
1464 for (
unsigned I = 0; I != NumProtoRefs; ++I)
1465 ProtoLocs.push_back(readSourceLocation());
1467 Reader.getContext());
1473 Reader.getContext());
1511 D->CategoryNameLoc = readSourceLocation();
1517 D->SuperLoc = readSourceLocation();
1522 D->NumIvarInitializers = Record.readInt();
1523 if (D->NumIvarInitializers)
1524 D->IvarInitializers = ReadGlobalOffset();
1531 D->PropertyIvarDecl = readDeclAs<ObjCIvarDecl>();
1532 D->IvarLoc = readSourceLocation();
1541 FD->Mutable = Record.readInt();
1543 unsigned Bits = Record.readInt();
1544 FD->StorageKind = Bits >> 1;
1545 if (FD->StorageKind == FieldDecl::ISK_CapturedVLAType)
1553 if (
auto *Tmpl = readDeclAs<FieldDecl>())
1554 Reader.getContext().setInstantiatedFromUnnamedFieldDecl(FD, Tmpl);
1561 PD->GetterId = Record.readIdentifier();
1562 PD->SetterId = Record.readIdentifier();
1567 D->PartVal.
Part1 = Record.readInt();
1568 D->PartVal.
Part2 = Record.readInt();
1569 D->PartVal.
Part3 = Record.readInt();
1571 C = Record.readInt();
1574 if (
MSGuidDecl *Existing = Reader.getContext().MSGuidDecls.GetOrInsertNode(D))
1581 D->Value = Record.readAPValue();
1585 Reader.getContext().UnnamedGlobalConstantDecls.GetOrInsertNode(D))
1591 D->Value = Record.readAPValue();
1596 Reader.getContext().TemplateParamObjectDecls.GetOrInsertNode(D))
1603 FD->ChainingSize = Record.readInt();
1604 assert(FD->ChainingSize >= 2 &&
"Anonymous chaining must be >= 2");
1605 FD->Chaining =
new (Reader.getContext())
NamedDecl*[FD->ChainingSize];
1607 for (
unsigned I = 0; I != FD->ChainingSize; ++I)
1608 FD->Chaining[I] = readDeclAs<NamedDecl>();
1619 bool DefGeneratedInModule = VarDeclBits.
getNextBit();
1624 bool HasDeducedType =
false;
1652 Reader.PendingDeducedVarTypes.push_back({VD, DeferredTypeID});
1654 VD->
setType(Reader.GetType(DeferredTypeID));
1664 if (DefGeneratedInModule) {
1665 Reader.DefinitionSource[VD] =
1667 Reader.getContext().getLangOpts().BuildingPCHWithObjectFile;
1670 if (VD->
hasAttr<BlocksAttr>()) {
1671 Expr *CopyExpr = Record.readExpr();
1673 Reader.getContext().setBlockVarCopyInit(VD, CopyExpr, Record.readInt());
1677 VarNotTemplate = 0,
VarTemplate, StaticDataMemberSpecialization
1679 switch ((VarKind)Record.readInt()) {
1680 case VarNotTemplate:
1691 case StaticDataMemberSpecialization: {
1692 auto *Tmpl = readDeclAs<VarDecl>();
1695 Reader.getContext().setInstantiatedFromStaticDataMember(VD, Tmpl, TSK,POI);
1705 if (uint64_t Val = Record.readInt()) {
1715 Reader.getContext().addDestruction(&Eval->
Evaluated);
1721 Eval->
Value = GetCurrentCursorOffset();
1732 unsigned scopeIndex = Record.readInt();
1734 unsigned isObjCMethodParam = ParmVarDeclBits.
getNextBit();
1735 unsigned scopeDepth = ParmVarDeclBits.
getNextBits(7);
1736 unsigned declQualifier = ParmVarDeclBits.
getNextBits(7);
1737 if (isObjCMethodParam) {
1738 assert(scopeDepth == 0);
1751 PD->ExplicitObjectParameterIntroducerLoc = Record.readSourceLocation();
1759 auto **BDs = DD->getTrailingObjects();
1760 for (
unsigned I = 0; I != DD->NumBindings; ++I) {
1761 BDs[I] = readDeclAs<BindingDecl>();
1762 BDs[I]->setDecomposedDecl(DD);
1768 BD->Binding = Record.readExpr();
1779 D->Statement = Record.readStmt();
1784 BD->
setBody(cast_or_null<CompoundStmt>(Record.readStmt()));
1786 unsigned NumParams = Record.readInt();
1788 Params.reserve(NumParams);
1789 for (
unsigned I = 0; I != NumParams; ++I)
1790 Params.push_back(readDeclAs<ParmVarDecl>());
1799 bool capturesCXXThis = Record.readInt();
1800 unsigned numCaptures = Record.readInt();
1802 captures.reserve(numCaptures);
1803 for (
unsigned i = 0; i != numCaptures; ++i) {
1804 auto *
decl = readDeclAs<VarDecl>();
1805 unsigned flags = Record.readInt();
1806 bool byRef = (flags & 1);
1807 bool nested = (flags & 2);
1808 Expr *copyExpr = ((flags & 4) ? Record.readExpr() :
nullptr);
1812 BD->
setCaptures(Reader.getContext(), captures, capturesCXXThis);
1818 for (
unsigned I = 0; I < D->NumParams; ++I)
1819 D->
setParam(I, readDeclAs<ImplicitParamDecl>());
1821 D->
setBody(cast_or_null<Stmt>(Record.readStmt()));
1826 unsigned ContextParamPos = Record.readInt();
1829 for (
unsigned I = 0; I < CD->NumParams; ++I) {
1830 if (I != ContextParamPos)
1831 CD->
setParam(I, readDeclAs<ImplicitParamDecl>());
1846 D->RBraceLoc = readSourceLocation();
1861 D->LocStart = readSourceLocation();
1862 D->RBraceLoc = readSourceLocation();
1869 if (Redecl.getFirstID() == ThisDeclID)
1870 AnonNamespace = readDeclID();
1874 if (AnonNamespace.
isValid()) {
1879 if (!Record.isModule())
1888 D->IsCBuffer = Record.readBool();
1889 D->KwLoc = readSourceLocation();
1890 D->LBraceLoc = readSourceLocation();
1891 D->RBraceLoc = readSourceLocation();
1897 D->NamespaceLoc = readSourceLocation();
1898 D->IdentLoc = readSourceLocation();
1899 D->QualifierLoc = Record.readNestedNameSpecifierLoc();
1900 D->Namespace = readDeclAs<NamespaceBaseDecl>();
1907 D->QualifierLoc = Record.readNestedNameSpecifierLoc();
1908 D->DNLoc = Record.readDeclarationNameLoc(D->
getDeclName());
1909 D->FirstUsingShadow.setPointer(readDeclAs<UsingShadowDecl>());
1911 if (
auto *Pattern = readDeclAs<NamedDecl>())
1912 Reader.getContext().setInstantiatedFromUsingDecl(D, Pattern);
1921 D->FirstUsingShadow.setPointer(readDeclAs<UsingShadowDecl>());
1922 if (
auto *Pattern = readDeclAs<UsingEnumDecl>())
1923 Reader.getContext().setInstantiatedFromUsingEnumDecl(D, Pattern);
1929 D->InstantiatedFrom = readDeclAs<NamedDecl>();
1930 auto **Expansions = D->getTrailingObjects();
1931 for (
unsigned I = 0; I != D->NumExpansions; ++I)
1932 Expansions[I] = readDeclAs<NamedDecl>();
1939 D->Underlying = readDeclAs<NamedDecl>();
1941 D->UsingOrNextShadow = readDeclAs<NamedDecl>();
1942 auto *Pattern = readDeclAs<UsingShadowDecl>();
1944 Reader.getContext().setInstantiatedFromUsingShadowDecl(D, Pattern);
1951 D->NominatedBaseClassShadowDecl = readDeclAs<ConstructorUsingShadowDecl>();
1952 D->ConstructedBaseClassShadowDecl = readDeclAs<ConstructorUsingShadowDecl>();
1953 D->IsVirtual = Record.readInt();
1958 D->UsingLoc = readSourceLocation();
1959 D->NamespaceLoc = readSourceLocation();
1960 D->QualifierLoc = Record.readNestedNameSpecifierLoc();
1961 D->NominatedNamespace = readDeclAs<NamedDecl>();
1962 D->CommonAncestor = readDeclAs<DeclContext>();
1968 D->QualifierLoc = Record.readNestedNameSpecifierLoc();
1969 D->DNLoc = Record.readDeclarationNameLoc(D->
getDeclName());
1970 D->EllipsisLoc = readSourceLocation();
1977 D->TypenameLocation = readSourceLocation();
1978 D->QualifierLoc = Record.readNestedNameSpecifierLoc();
1979 D->EllipsisLoc = readSourceLocation();
1988void ASTDeclReader::ReadCXXDefinitionData(
1990 Decl *LambdaContext,
unsigned IndexInLambdaContext) {
1994#define FIELD(Name, Width, Merge) \
1995 if (!CXXRecordDeclBits.canGetNextNBits(Width)) \
1996 CXXRecordDeclBits.updateValue(Record.readInt()); \
1997 Data.Name = CXXRecordDeclBits.getNextBits(Width);
1999#include "clang/AST/CXXRecordDeclDefinitionBits.def"
2004 Data.HasODRHash =
true;
2007 Reader.DefinitionSource[D] =
2008 Loc.F->
Kind == ModuleKind::MK_MainFile ||
2013 Data.ComputedVisibleConversions =
Record.readInt();
2014 if (
Data.ComputedVisibleConversions)
2015 Record.readUnresolvedSet(
Data.VisibleConversions);
2016 assert(
Data.Definition &&
"Data.Definition should be already set!");
2018 if (!
Data.IsLambda) {
2019 assert(!LambdaContext && !IndexInLambdaContext &&
2020 "given lambda context for non-lambda");
2024 Data.Bases = ReadGlobalOffset();
2028 Data.VBases = ReadGlobalOffset();
2032 using Capture = LambdaCapture;
2034 auto &Lambda =
static_cast<CXXRecordDecl::LambdaDefinitionData &
>(
Data);
2036 BitsUnpacker LambdaBits(Record.readInt());
2037 Lambda.DependencyKind = LambdaBits.getNextBits(2);
2038 Lambda.IsGenericLambda = LambdaBits.getNextBit();
2039 Lambda.CaptureDefault = LambdaBits.getNextBits(2);
2040 Lambda.NumCaptures = LambdaBits.getNextBits(15);
2041 Lambda.HasKnownInternalLinkage = LambdaBits.getNextBit();
2043 Lambda.NumExplicitCaptures = Record.readInt();
2044 Lambda.ManglingNumber = Record.readInt();
2045 if (
unsigned DeviceManglingNumber = Record.readInt())
2046 Reader.getContext().DeviceLambdaManglingNumbers[D] = DeviceManglingNumber;
2047 Lambda.IndexInContext = IndexInLambdaContext;
2048 Lambda.ContextDecl = LambdaContext;
2050 if (Lambda.NumCaptures) {
2051 ToCapture = (
Capture *)Reader.getContext().Allocate(
sizeof(
Capture) *
2052 Lambda.NumCaptures);
2053 Lambda.AddCaptureList(Reader.getContext(), ToCapture);
2055 Lambda.MethodTyInfo = readTypeSourceInfo();
2056 for (
unsigned I = 0, N = Lambda.NumCaptures; I != N; ++I) {
2057 SourceLocation Loc = readSourceLocation();
2058 BitsUnpacker CaptureBits(Record.readInt());
2059 bool IsImplicit = CaptureBits.getNextBit();
2067 Capture(Loc, IsImplicit, Kind,
nullptr, SourceLocation());
2072 auto *Var = readDeclAs<ValueDecl>();
2073 SourceLocation EllipsisLoc = readSourceLocation();
2074 new (ToCapture)
Capture(Loc, IsImplicit, Kind, Var, EllipsisLoc);
2083 CXXRecordDecl *D,
struct CXXRecordDecl::DefinitionData &&MergeDD) {
2084 assert(D->DefinitionData &&
2085 "merging class definition into non-definition");
2086 auto &DD = *D->DefinitionData;
2088 if (DD.Definition != MergeDD.Definition) {
2090 Reader.MergedDeclContexts.insert(std::make_pair(MergeDD.Definition,
2092 Reader.PendingDefinitions.erase(MergeDD.Definition);
2093 MergeDD.Definition->demoteThisDefinitionToDeclaration();
2094 Reader.mergeDefinitionVisibility(DD.Definition, MergeDD.Definition);
2095 assert(!Reader.Lookups.contains(MergeDD.Definition) &&
2096 "already loaded pending lookups for merged definition");
2099 auto PFDI = Reader.PendingFakeDefinitionData.find(&DD);
2100 if (PFDI != Reader.PendingFakeDefinitionData.end() &&
2101 PFDI->second == ASTReader::PendingFakeDefinitionKind::Fake) {
2104 assert(!DD.IsLambda && !MergeDD.IsLambda &&
"faked up lambda definition?");
2105 PFDI->second = ASTReader::PendingFakeDefinitionKind::FakeLoaded;
2109 auto *Def = DD.Definition;
2110 DD = std::move(MergeDD);
2111 DD.Definition = Def;
2112 for (
auto *R = Reader.getMostRecentExistingDecl(Def); R;
2113 R = R->getPreviousDecl())
2118 bool DetectedOdrViolation =
false;
2120 #define FIELD(Name, Width, Merge) Merge(Name)
2121 #define MERGE_OR(Field) DD.Field |= MergeDD.Field;
2122 #define NO_MERGE(Field) \
2123 DetectedOdrViolation |= DD.Field != MergeDD.Field; \
2125 #include "clang/AST/CXXRecordDeclDefinitionBits.def"
2130 if (DD.NumBases != MergeDD.NumBases || DD.NumVBases != MergeDD.NumVBases)
2131 DetectedOdrViolation =
true;
2137 if (MergeDD.ComputedVisibleConversions && !DD.ComputedVisibleConversions) {
2138 DD.VisibleConversions = std::move(MergeDD.VisibleConversions);
2139 DD.ComputedVisibleConversions =
true;
2146 auto &Lambda1 =
static_cast<CXXRecordDecl::LambdaDefinitionData &
>(DD);
2147 auto &Lambda2 =
static_cast<CXXRecordDecl::LambdaDefinitionData &
>(MergeDD);
2148 DetectedOdrViolation |= Lambda1.DependencyKind != Lambda2.DependencyKind;
2149 DetectedOdrViolation |= Lambda1.IsGenericLambda != Lambda2.IsGenericLambda;
2150 DetectedOdrViolation |= Lambda1.CaptureDefault != Lambda2.CaptureDefault;
2151 DetectedOdrViolation |= Lambda1.NumCaptures != Lambda2.NumCaptures;
2152 DetectedOdrViolation |=
2153 Lambda1.NumExplicitCaptures != Lambda2.NumExplicitCaptures;
2154 DetectedOdrViolation |=
2155 Lambda1.HasKnownInternalLinkage != Lambda2.HasKnownInternalLinkage;
2156 DetectedOdrViolation |= Lambda1.ManglingNumber != Lambda2.ManglingNumber;
2158 if (Lambda1.NumCaptures && Lambda1.NumCaptures == Lambda2.NumCaptures) {
2159 for (
unsigned I = 0, N = Lambda1.NumCaptures; I != N; ++I) {
2164 Lambda1.AddCaptureList(Reader.getContext(), Lambda2.Captures.front());
2173 DetectedOdrViolation =
true;
2176 if (DetectedOdrViolation)
2177 Reader.PendingOdrMergeFailures[DD.Definition].push_back(
2178 {MergeDD.Definition, &MergeDD});
2182 Decl *LambdaContext,
2183 unsigned IndexInLambdaContext) {
2184 struct CXXRecordDecl::DefinitionData *DD;
2189 bool IsLambda =
Record.readInt();
2190 assert(!(IsLambda &&
Update) &&
2191 "lambda definition should not be added by update record");
2193 DD =
new (
C) CXXRecordDecl::LambdaDefinitionData(
2196 DD =
new (
C)
struct CXXRecordDecl::DefinitionData(D);
2202 if (!Canon->DefinitionData)
2203 Canon->DefinitionData = DD;
2204 D->DefinitionData = Canon->DefinitionData;
2205 ReadCXXDefinitionData(*DD, D, LambdaContext, IndexInLambdaContext);
2213 if (Canon->DefinitionData != DD) {
2221 if (
Update || Canon != D)
2222 Reader.PendingDefinitions.insert(D);
2231 CXXRecNotTemplate = 0,
2233 CXXRecMemberSpecialization,
2237 Decl *LambdaContext =
nullptr;
2238 unsigned IndexInLambdaContext = 0;
2240 switch ((CXXRecKind)Record.readInt()) {
2241 case CXXRecNotTemplate:
2246 case CXXRecTemplate: {
2248 auto *
Template = readDeclAs<ClassTemplateDecl>();
2249 D->TemplateOrInstantiation =
Template;
2252 case CXXRecMemberSpecialization: {
2253 auto *RD = readDeclAs<CXXRecordDecl>();
2258 D->TemplateOrInstantiation = MSI;
2263 LambdaContext = readDecl();
2265 IndexInLambdaContext = Record.readInt();
2267 MergeImpl.mergeLambda(D, Redecl, *LambdaContext, IndexInLambdaContext);
2276 bool WasDefinition = Record.readInt();
2278 ReadCXXRecordDefinition(D,
false, LambdaContext,
2279 IndexInLambdaContext);
2286 if (WasDefinition) {
2299 D->setExplicitSpecifier(Record.readExplicitSpec());
2300 D->Ctor = readDeclAs<CXXConstructorDecl>();
2313 unsigned NumOverridenMethods = Record.readInt();
2315 while (NumOverridenMethods--) {
2318 if (
auto *MD = readDeclAs<CXXMethodDecl>())
2324 Record.skipInts(NumOverridenMethods);
2333 auto *Shadow = readDeclAs<ConstructorUsingShadowDecl>();
2334 auto *Ctor = readDeclAs<CXXConstructorDecl>();
2347 if (
auto *OperatorDelete = readDeclAs<FunctionDecl>()) {
2348 auto *ThisArg = Record.readExpr();
2351 C.addOperatorDeleteForVDtor(D, OperatorDelete,
2353 Canon->OperatorDeleteThisArg = ThisArg;
2356 if (
auto *OperatorGlobDelete = readDeclAs<FunctionDecl>()) {
2357 if (!
C.dtorHasOperatorDelete(D,
2359 C.addOperatorDeleteForVDtor(
2362 if (
auto *OperatorArrayDelete = readDeclAs<FunctionDecl>()) {
2364 C.addOperatorDeleteForVDtor(D, OperatorArrayDelete,
2367 if (
auto *OperatorGlobArrayDelete = readDeclAs<FunctionDecl>()) {
2368 if (!
C.dtorHasOperatorDelete(D,
2370 C.addOperatorDeleteForVDtor(D, OperatorGlobArrayDelete,
2382 D->ImportedModule = readModule();
2383 D->setImportComplete(Record.readInt());
2384 auto *StoredLocs = D->getTrailingObjects();
2385 for (
unsigned I = 0, N = Record.back(); I != N; ++I)
2386 StoredLocs[I] = readSourceLocation();
2397 if (Record.readInt())
2398 D->Friend = readDeclAs<NamedDecl>();
2400 D->Friend = readTypeSourceInfo();
2401 for (
unsigned i = 0; i != D->NumTPLists; ++i)
2402 D->getTrailingObjects()[i] = Record.readTemplateParameterList();
2403 D->NextFriend = readDeclID().getRawValue();
2404 D->UnsupportedFriend = (Record.readInt() != 0);
2405 D->FriendLoc = readSourceLocation();
2406 D->EllipsisLoc = readSourceLocation();
2411 unsigned NumParams = Record.readInt();
2412 D->NumParams = NumParams;
2414 for (
unsigned i = 0; i != NumParams; ++i)
2415 D->Params[i] = Record.readTemplateParameterList();
2416 if (Record.readInt())
2417 D->Friend = readDeclAs<NamedDecl>();
2419 D->Friend = readTypeSourceInfo();
2420 D->FriendLoc = readSourceLocation();
2428 D->
init(readDeclAs<NamedDecl>());
2443 for (
unsigned I = 0; I < D->NumTemplateArgs; ++I)
2444 Args.push_back(Record.readTemplateArgument(
false));
2452 llvm::BitstreamCursor &DeclsCursor,
2454 uint64_t Offset = ReadLocalOffset();
2456 Reader.ReadSpecializations(M, DeclsCursor, Offset, D, IsPartial);
2470 Reader.PendingDefinitions.insert(CanonD);
2476 if (ThisDeclID == Redecl.getFirstID()) {
2477 if (
auto *RTD = readDeclAs<RedeclarableTemplateDecl>()) {
2478 assert(RTD->getKind() == D->
getKind() &&
2479 "InstantiatedFromMemberTemplate kind mismatch");
2481 if (Record.readInt())
2496 if (ThisDeclID == Redecl.getFirstID()) {
2505 llvm_unreachable(
"BuiltinTemplates are not serialized");
2515 if (ThisDeclID == Redecl.getFirstID()) {
2528 if (
Decl *InstD = readDecl()) {
2529 if (
auto *CTD = dyn_cast<ClassTemplateDecl>(InstD)) {
2530 D->SpecializedTemplate = CTD;
2533 Record.readTemplateArgumentList(TemplArgs);
2538 SpecializedPartialSpecialization();
2539 PS->PartialSpecialization
2541 PS->TemplateArgs = ArgList;
2542 D->SpecializedTemplate = PS;
2547 Record.readTemplateArgumentList(TemplArgs,
true);
2549 D->PointOfInstantiation = readSourceLocation();
2551 D->StrictPackMatch = Record.readBool();
2553 bool writtenAsCanonicalDecl = Record.readInt();
2554 if (writtenAsCanonicalDecl) {
2555 auto *CanonPattern = readDeclAs<ClassTemplateDecl>();
2559 if (
auto *Partial = dyn_cast<ClassTemplatePartialSpecializationDecl>(D)) {
2560 CanonSpec = CanonPattern->getCommonPtr()->PartialSpecializations
2561 .GetOrInsertNode(Partial);
2564 CanonPattern->getCommonPtr()->Specializations.GetOrInsertNode(D);
2567 if (CanonSpec != D) {
2568 MergeImpl.mergeRedeclarable<
TagDecl>(D, CanonSpec, Redecl);
2572 if (
auto *DDD = D->DefinitionData) {
2573 if (CanonSpec->DefinitionData)
2574 MergeImpl.MergeDefinitionData(CanonSpec, std::move(*DDD));
2576 CanonSpec->DefinitionData = D->DefinitionData;
2578 D->DefinitionData = CanonSpec->DefinitionData;
2584 if (Record.readBool()) {
2587 ExplicitInfo->TemplateKeywordLoc = readSourceLocation();
2588 D->ExplicitInfo = ExplicitInfo;
2591 if (Record.readBool())
2602 D->TemplateParams = Params;
2607 if (ThisDeclID == Redecl.getFirstID()) {
2608 D->InstantiatedFromMember.setPointer(
2609 readDeclAs<ClassTemplatePartialSpecializationDecl>());
2610 D->InstantiatedFromMember.setInt(Record.readInt());
2617 if (ThisDeclID == Redecl.getFirstID()) {
2631 if (
Decl *InstD = readDecl()) {
2632 if (
auto *VTD = dyn_cast<VarTemplateDecl>(InstD)) {
2633 D->SpecializedTemplate = VTD;
2636 Record.readTemplateArgumentList(TemplArgs);
2641 VarTemplateSpecializationDecl::SpecializedPartialSpecialization();
2642 PS->PartialSpecialization =
2644 PS->TemplateArgs = ArgList;
2645 D->SpecializedTemplate = PS;
2650 if (Record.readBool()) {
2653 ExplicitInfo->TemplateKeywordLoc = readSourceLocation();
2654 D->ExplicitInfo = ExplicitInfo;
2657 if (Record.readBool())
2661 Record.readTemplateArgumentList(TemplArgs,
true);
2663 D->PointOfInstantiation = readSourceLocation();
2665 D->IsCompleteDefinition = Record.readInt();
2669 bool writtenAsCanonicalDecl = Record.readInt();
2670 if (writtenAsCanonicalDecl) {
2671 auto *CanonPattern = readDeclAs<VarTemplateDecl>();
2674 if (
auto *Partial = dyn_cast<VarTemplatePartialSpecializationDecl>(D)) {
2675 CanonSpec = CanonPattern->getCommonPtr()
2676 ->PartialSpecializations.GetOrInsertNode(Partial);
2679 CanonPattern->getCommonPtr()->Specializations.GetOrInsertNode(D);
2683 MergeImpl.mergeRedeclarable<
VarDecl>(D, CanonSpec, Redecl);
2698 D->TemplateParams = Params;
2703 if (ThisDeclID == Redecl.getFirstID()) {
2704 D->InstantiatedFromMember.setPointer(
2705 readDeclAs<VarTemplatePartialSpecializationDecl>());
2706 D->InstantiatedFromMember.setInt(Record.readInt());
2716 if (TypeConstraintInitialized) {
2718 if (Record.readBool())
2719 CR = Record.readConceptReference();
2720 Expr *ImmediatelyDeclaredConstraint = Record.readExpr();
2724 D->NumExpanded = Record.readUnsignedOrNone();
2727 if (Record.readInt())
2729 Record.readTemplateArgumentLoc());
2740 auto TypesAndInfos =
2741 D->getTrailingObjects<std::pair<QualType, TypeSourceInfo *>>();
2743 new (&TypesAndInfos[I].first)
QualType(Record.readType());
2744 TypesAndInfos[I].second = readTypeSourceInfo();
2748 D->ParameterPack = Record.readInt();
2749 if (Record.readInt())
2751 Record.readTemplateArgumentLoc());
2763 auto **
Data = D->getTrailingObjects();
2766 Data[I] = Record.readTemplateParameterList();
2769 D->ParameterPack = Record.readInt();
2770 if (Record.readInt())
2772 Record.readTemplateArgumentLoc());
2783 D->AssertExprAndFailed.setPointer(Record.readExpr());
2784 D->AssertExprAndFailed.setInt(Record.readInt());
2785 D->Message = cast_or_null<StringLiteral>(Record.readExpr());
2786 D->RParenLoc = readSourceLocation();
2794 auto *Spec = readDeclAs<NamedDecl>();
2795 D->SpecAndTSK.setPointer(Spec);
2796 D->ExternLoc = readSourceLocation();
2797 D->NameLoc = readSourceLocation();
2799 unsigned TSK = Record.readInt();
2800 D->SpecAndTSK.setInt(TSK);
2801 D->TypeAndFlags.setPointer(TSI);
2805 Record.readNestedNameSpecifierLoc();
2808 Record.readASTTemplateArgumentListInfo();
2812 Reader.getContext().addExplicitInstantiationDecl(Spec, D);
2822 D->ExtendingDecl = readDeclAs<ValueDecl>();
2823 D->ExprWithTemporary = Record.readStmt();
2824 if (Record.readInt()) {
2828 D->ManglingNumber = Record.readInt();
2840template <
typename T>
2843 Decl *MergeWith =
nullptr;
2845 bool IsKeyDecl = ThisDeclID == FirstDeclID;
2846 bool IsFirstLocalDecl =
false;
2848 uint64_t RedeclOffset = 0;
2853 FirstDeclID = ThisDeclID;
2855 IsFirstLocalDecl =
true;
2856 }
else if (
unsigned N = Record.readInt()) {
2860 IsFirstLocalDecl =
true;
2867 for (
unsigned I = 0; I != N - 1; ++I)
2868 MergeWith = readDecl();
2870 RedeclOffset = ReadLocalOffset();
2877 auto *FirstDecl = cast_or_null<T>(Reader.GetDecl(FirstDeclID));
2878 if (FirstDecl != D) {
2884 D->
First = FirstDecl->getCanonicalDecl();
2887 auto *DAsT =
static_cast<T *
>(D);
2893 if (IsFirstLocalDecl)
2894 Reader.PendingDeclChains.push_back(std::make_pair(DAsT, RedeclOffset));
2896 return RedeclarableResult(MergeWith, FirstDeclID, IsKeyDecl);
2901template <
typename T>
2903 RedeclarableResult &Redecl) {
2905 if (!Reader.getContext().getLangOpts().Modules)
2912 auto *D =
static_cast<T *
>(DBase);
2914 if (
auto *Existing = Redecl.getKnownMergeTarget())
2916 MergeImpl.mergeRedeclarable(D,
cast<T>(Existing), Redecl);
2917 else if (FindExistingResult ExistingRes = findExisting(D))
2918 if (T *Existing = ExistingRes)
2919 MergeImpl.mergeRedeclarable(D, Existing, Redecl);
2929 Decl &Context,
unsigned IndexInContext) {
2931 if (!Reader.getContext().getLangOpts().Modules)
2938 if (
auto *Existing = Redecl.getKnownMergeTarget())
2944 NamedDecl *&Slot = Reader.LambdaDeclarationsForMerging[{
2945 Context.getCanonicalDecl(), IndexInContext}];
2953 RedeclarableResult &Redecl) {
2966 llvm_unreachable(
"bad assert_cast");
2976 RedeclarableResult
Result(
2978 DPattern->getCanonicalDecl()->getGlobalID(), IsKeyDecl);
2980 if (
auto *DClass = dyn_cast<CXXRecordDecl>(DPattern)) {
2983 auto *ExistingClass =
2985 if (
auto *DDD = DClass->DefinitionData) {
2986 if (ExistingClass->DefinitionData) {
2989 ExistingClass->DefinitionData = DClass->DefinitionData;
2992 Reader.PendingDefinitions.insert(DClass);
2995 DClass->DefinitionData = ExistingClass->DefinitionData;
3000 if (
auto *DFunction = dyn_cast<FunctionDecl>(DPattern))
3003 if (
auto *DVar = dyn_cast<VarDecl>(DPattern))
3005 if (
auto *DAlias = dyn_cast<TypeAliasDecl>(DPattern))
3008 llvm_unreachable(
"merged an unknown kind of redeclarable template");
3013template <
typename T>
3016 auto *D =
static_cast<T *
>(DBase);
3017 T *ExistingCanon = Existing->getCanonicalDecl();
3019 if (ExistingCanon != DCanon) {
3024 D->
First = ExistingCanon;
3025 ExistingCanon->Used |= D->Used;
3028 bool IsKeyDecl = KeyDeclID.
isValid();
3031 if (
auto *DTemplate = dyn_cast<RedeclarableTemplateDecl>(D))
3038 Reader.KeyDecls[ExistingCanon].push_back(KeyDeclID);
3060 if (!Reader.getContext().getLangOpts().Modules)
3066 Reader.LETemporaryForMerging[std::make_pair(
3069 Reader.getContext().setPrimaryMergedDecl(LETDecl,
3082 if (!Reader.getContext().getLangOpts().Modules)
3089 if (!Reader.getContext().getLangOpts().CPlusPlus &&
3093 if (FindExistingResult ExistingRes = findExisting(
static_cast<T*
>(D)))
3094 if (T *Existing = ExistingRes)
3095 Reader.getContext().setPrimaryMergedDecl(
static_cast<T *
>(D),
3096 Existing->getCanonicalDecl());
3100 Record.readOMPChildren(D->
Data);
3105 Record.readOMPChildren(D->
Data);
3110 Record.readOMPChildren(D->
Data);
3117 Expr *In = Record.readExpr();
3118 Expr *Out = Record.readExpr();
3120 Expr *Combiner = Record.readExpr();
3122 Expr *Orig = Record.readExpr();
3123 Expr *Priv = Record.readExpr();
3128 D->PrevDeclInScope = readDeclID().getRawValue();
3132 Record.readOMPChildren(D->
Data);
3134 D->VarName = Record.readDeclarationName();
3135 D->PrevDeclInScope = readDeclID().getRawValue();
3145 D->DirectiveLoc = Record.readSourceLocation();
3146 D->EndLoc = Record.readSourceLocation();
3147 Record.readOpenACCClauseList(D->Clauses);
3152 D->DirectiveLoc = Record.readSourceLocation();
3153 D->EndLoc = Record.readSourceLocation();
3154 D->ParensLoc = Record.readSourceRange();
3155 D->FuncRef = Record.readExpr();
3156 Record.readOpenACCClauseList(D->Clauses);
3170 uint64_t readInt() {
3174 bool readBool() {
return Reader.
readBool(); }
3176 SourceRange readSourceRange() {
3180 SourceLocation readSourceLocation() {
3184 Expr *readExpr() {
return Reader.
readExpr(); }
3186 Attr *readAttr() {
return Reader.
readAttr(); }
3188 std::string readString() {
3192 TypeSourceInfo *readTypeSourceInfo() {
3196 IdentifierInfo *readIdentifier() {
3200 VersionTuple readVersionTuple() {
3206 template <
typename T> T *readDeclAs() {
return Reader.
readDeclAs<T>(); }
3211 AttrReader
Record(*
this);
3212 auto V = Record.readInt();
3226 unsigned ParsedKind = Record.readInt();
3227 unsigned Syntax = Record.readInt();
3228 unsigned SpellingIndex = Record.readInt();
3229 bool IsAlignas = (ParsedKind == AttributeCommonInfo::AT_Aligned &&
3231 SpellingIndex == AlignedAttr::Keyword_alignas);
3232 bool IsRegularKeywordAttribute = Record.readBool();
3237 IsAlignas, IsRegularKeywordAttribute});
3239#include "clang/Serialization/AttrPCHRead.inc"
3241 assert(
New &&
"Unable to decode attribute?");
3247 for (
unsigned I = 0, E =
readInt(); I != E; ++I)
3262inline void ASTReader::LoadedDecl(
unsigned Index,
Decl *D) {
3263 assert(!DeclsLoaded[Index] &&
"Decl loaded twice?");
3264 DeclsLoaded[Index] = D;
3273bool ASTReader::isConsumerInterestedIn(
Decl *D) {
3286 if (
isa<FileScopeAsmDecl, TopLevelStmtDecl, ObjCProtocolDecl, ObjCImplDecl,
3287 ImportDecl, PragmaCommentDecl, PragmaDetectMismatchDecl>(D))
3289 if (
isa<OMPThreadPrivateDecl, OMPDeclareReductionDecl, OMPDeclareMapperDecl,
3290 OMPAllocateDecl, OMPRequiresDecl>(D))
3292 if (
const auto *Var = dyn_cast<VarDecl>(D))
3293 return Var->isFileVarDecl() &&
3295 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(Var));
3296 if (
const auto *
Func = dyn_cast<FunctionDecl>(D))
3297 return Func->doesThisDeclarationHaveABody() || PendingBodies.count(D);
3307ASTReader::RecordLocation ASTReader::DeclCursorForID(
GlobalDeclID ID,
3311 unsigned LocalDeclIndex = ID.getLocalDeclIndex();
3312 const DeclOffset &DOffs = M->
DeclOffsets[LocalDeclIndex];
3317ASTReader::RecordLocation ASTReader::getLocalBitOffset(uint64_t GlobalOffset) {
3318 auto I = GlobalBitOffsetsMap.find(GlobalOffset);
3320 assert(I != GlobalBitOffsetsMap.end() &&
"Corrupted global bit offsets map");
3321 return RecordLocation(I->second, GlobalOffset - I->second->GlobalBitOffset);
3324uint64_t ASTReader::getGlobalBitOffset(ModuleFile &M, uint64_t LocalOffset) {
3329ASTDeclReader::getOrFakePrimaryClassDefinition(
ASTReader &Reader,
3332 auto *DD = RD->DefinitionData;
3341 DD =
new (Reader.getContext())
struct CXXRecordDecl::DefinitionData(RD);
3343 RD->DefinitionData = DD;
3347 Reader.PendingFakeDefinitionData.insert(
3348 std::make_pair(DD, ASTReader::PendingFakeDefinitionKind::Fake));
3351 return DD->Definition;
3358 if (
auto *ND = dyn_cast<NamespaceDecl>(DC))
3359 return ND->getFirstDecl();
3361 if (
auto *RD = dyn_cast<CXXRecordDecl>(DC))
3362 return getOrFakePrimaryClassDefinition(Reader, RD);
3364 if (
auto *RD = dyn_cast<RecordDecl>(DC))
3367 if (
auto *ED = dyn_cast<EnumDecl>(DC))
3370 if (
auto *OID = dyn_cast<ObjCInterfaceDecl>(DC))
3375 if (
auto *TU = dyn_cast<TranslationUnitDecl>(DC))
3381ASTDeclReader::FindExistingResult::~FindExistingResult() {
3384 if (TypedefNameForLinkage) {
3386 Reader.ImportedTypedefNamesForLinkage.insert(
3387 std::make_pair(std::make_pair(DC, TypedefNameForLinkage), New));
3391 if (!AddResult || Existing)
3394 DeclarationName Name = New->getDeclName();
3397 setAnonymousDeclForMerging(Reader, New->getLexicalDeclContext(),
3398 AnonymousDeclNumber, New);
3400 !Reader.getContext().getLangOpts().CPlusPlus) {
3401 if (Reader.getIdResolver().tryAddTopLevelDecl(New, Name))
3404 }
else if (DeclContext *MergeDC = getPrimaryContextForMerging(Reader, DC)) {
3407 MergeDC->makeDeclVisibleInContextImpl(New,
true);
3415 bool IsTypedefNameForLinkage) {
3416 if (!IsTypedefNameForLinkage)
3422 if (
Found->isFromASTFile())
3425 if (
auto *TND = dyn_cast<TypedefNameDecl>(
Found))
3426 return TND->getAnonDeclWithTypedefName(
true);
3435ASTDeclReader::getPrimaryDCForAnonymousDecl(DeclContext *LexicalDC) {
3437 if (
auto *RD = dyn_cast<CXXRecordDecl>(LexicalDC)) {
3439 return DD ? DD->Definition :
nullptr;
3440 }
else if (
auto *OID = dyn_cast<ObjCInterfaceDecl>(LexicalDC)) {
3441 return OID->getCanonicalDecl()->getDefinition();
3448 if (
auto *FD = dyn_cast<FunctionDecl>(D))
3449 if (FD->isThisDeclarationADefinition())
3451 if (
auto *MD = dyn_cast<ObjCMethodDecl>(D))
3452 if (MD->isThisDeclarationADefinition())
3454 if (
auto *RD = dyn_cast<RecordDecl>(D))
3463NamedDecl *ASTDeclReader::getAnonymousDeclForMerging(ASTReader &Reader,
3468 auto *CanonDC =
cast<Decl>(DC)->getCanonicalDecl();
3471 auto &
Previous = Reader.AnonymousDeclarationsForMerging[CanonDC];
3477 auto *PrimaryDC = getPrimaryDCForAnonymousDecl(DC);
3478 auto needToNumberAnonymousDeclsWithin = [](
Decl *D) {
3486 auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D);
3487 return CTSD && !CTSD->noload_field_empty() &&
3488 !CTSD->hasLoadedFieldsFromExternalStorage();
3490 if (PrimaryDC && needToNumberAnonymousDeclsWithin(
cast<Decl>(PrimaryDC))) {
3502void ASTDeclReader::setAnonymousDeclForMerging(ASTReader &Reader,
3503 DeclContext *DC,
unsigned Index,
3505 auto *CanonDC =
cast<Decl>(DC)->getCanonicalDecl();
3507 auto &
Previous = Reader.AnonymousDeclarationsForMerging[CanonDC];
3514ASTDeclReader::FindExistingResult ASTDeclReader::findExisting(NamedDecl *D) {
3515 DeclarationName Name = TypedefNameForLinkage ? TypedefNameForLinkage
3521 FindExistingResult
Result(Reader, D,
nullptr,
3522 AnonymousDeclNumber, TypedefNameForLinkage);
3527 ASTContext &
C = Reader.getContext();
3529 if (TypedefNameForLinkage) {
3530 auto It = Reader.ImportedTypedefNamesForLinkage.find(
3531 std::make_pair(DC, TypedefNameForLinkage));
3532 if (It != Reader.ImportedTypedefNamesForLinkage.end())
3533 if (
C.isSameEntity(It->second, D))
3534 return FindExistingResult(Reader, D, It->second, AnonymousDeclNumber,
3535 TypedefNameForLinkage);
3543 if (
auto *Existing = getAnonymousDeclForMerging(
3545 if (
C.isSameEntity(Existing, D))
3546 return FindExistingResult(Reader, D, Existing, AnonymousDeclNumber,
3547 TypedefNameForLinkage);
3549 !Reader.getContext().getLangOpts().CPlusPlus) {
3550 IdentifierResolver &IdResolver = Reader.getIdResolver();
3554 class UpToDateIdentifierRAII {
3556 bool WasOutToDate =
false;
3559 explicit UpToDateIdentifierRAII(IdentifierInfo *II) : II(II) {
3567 ~UpToDateIdentifierRAII() {
3573 for (IdentifierResolver::iterator I = IdResolver.
begin(Name),
3574 IEnd = IdResolver.
end();
3577 if (
C.isSameEntity(Existing, D))
3578 return FindExistingResult(Reader, D, Existing, AnonymousDeclNumber,
3579 TypedefNameForLinkage);
3581 }
else if (DeclContext *MergeDC = getPrimaryContextForMerging(Reader, DC)) {
3585 if (
C.isSameEntity(Existing, D))
3586 return FindExistingResult(Reader, D, Existing, AnonymousDeclNumber,
3587 TypedefNameForLinkage);
3591 return FindExistingResult(Reader);
3603 if (MergedDCIt != Reader.MergedDeclContexts.end() &&
3606 Reader.PendingOdrMergeChecks.push_back(D);
3608 return FindExistingResult(Reader, D,
nullptr,
3609 AnonymousDeclNumber, TypedefNameForLinkage);
3612template<
typename DeclT>
3618 llvm_unreachable(
"getMostRecentDecl on non-redeclarable declaration");
3625#define ABSTRACT_DECL(TYPE)
3626#define DECL(TYPE, BASE) \
3628 return getMostRecentDeclImpl(cast<TYPE##Decl>(D));
3629#include "clang/AST/DeclNodes.inc"
3631 llvm_unreachable(
"unknown decl kind");
3634Decl *ASTReader::getMostRecentExistingDecl(
Decl *D) {
3642 const auto *IA =
Previous->getAttr<MSInheritanceAttr>();
3644 if (IA && !D->
hasAttr<MSInheritanceAttr>()) {
3650 if (!D->
hasAttr<AvailabilityAttr>()) {
3651 for (
const auto *AA :
Previous->specific_attrs<AvailabilityAttr>()) {
3652 NewAttr = AA->
clone(Context);
3660template<
typename DeclT>
3676 D->
First = PrevVD->First;
3681 auto *VD =
static_cast<VarDecl *
>(D);
3691 if (VD->getOwningModule() &&
3692 VD->getOwningModule()->isHeaderLikeModule())
3693 VD->demoteThisDefinitionToDeclaration();
3694 Reader.mergeDefinitionVisibility(CurD, VD);
3702 auto *DT = T->getContainedDeducedType();
3703 return DT && !DT->isDeduced();
3713 FD->RedeclLink.setPrevious(PrevFD);
3714 FD->First = PrevFD->First;
3718 if (PrevFD->isInlined() != FD->isInlined()) {
3734 FD->setImplicitlyInline(
true);
3739 if (FPT && PrevFPT) {
3743 bool WasUnresolved =
3745 if (IsUnresolved != WasUnresolved)
3746 Reader.PendingExceptionSpecUpdates.insert(
3747 {Canon, IsUnresolved ? PrevFD : FD});
3753 if (IsUndeduced != WasUndeduced)
3754 Reader.PendingDeducedTypeUpdates.insert(
3756 (IsUndeduced ? PrevFPT : FPT)->getReturnType()});
3763 llvm_unreachable(
"attachPreviousDecl on non-redeclarable declaration");
3768template <
typename ParmDecl>
3772 if (!From->hasDefaultArgument())
3774 To->setInheritedDefaultArgument(Context, From);
3783 assert(FromTP->size() == ToTP->size() &&
"merged mismatched templates?");
3785 for (
unsigned I = 0, N = FromTP->size(); I != N; ++I) {
3786 NamedDecl *FromParam = FromTP->getParam(I);
3789 if (
auto *FTTP = dyn_cast<TemplateTypeParmDecl>(FromParam))
3791 else if (
auto *FNTTP = dyn_cast<NonTypeTemplateParmDecl>(FromParam))
3826 Func &&
Func->getTemplateSpecializationInfo())
3835 if (!
Previous->getLexicalDeclContext()
3836 ->getNonTransparentContext()
3837 ->isFileContext() ||
3855 Reader.PendingWarningForDuplicatedDefsInModuleUnits.push_back(
3864 Reader.Diag(
Previous->getLocation(),
3865 diag::err_multiple_decl_in_different_modules)
3867 Reader.Diag(D->
getLocation(), diag::note_also_found);
3875#define ABSTRACT_DECL(TYPE)
3876#define DECL(TYPE, BASE) \
3878 attachPreviousDeclImpl(Reader, cast<TYPE##Decl>(D), Previous, Canon); \
3880#include "clang/AST/DeclNodes.inc"
3896 if (
auto *TD = dyn_cast<TemplateDecl>(D))
3904 mergeInheritableAttributes(Reader, D,
Previous);
3907template<
typename DeclT>
3913 llvm_unreachable(
"attachLatestDecl on non-redeclarable declaration");
3917 assert(D && Latest);
3920#define ABSTRACT_DECL(TYPE)
3921#define DECL(TYPE, BASE) \
3923 attachLatestDeclImpl(cast<TYPE##Decl>(D), Latest); \
3925#include "clang/AST/DeclNodes.inc"
3929template<
typename DeclT>
3935 llvm_unreachable(
"markIncompleteDeclChain on non-redeclarable declaration");
3938void ASTReader::markIncompleteDeclChain(
Decl *D) {
3940#define ABSTRACT_DECL(TYPE)
3941#define DECL(TYPE, BASE) \
3943 ASTDeclReader::markIncompleteDeclChainImpl(cast<TYPE##Decl>(D)); \
3945#include "clang/AST/DeclNodes.inc"
3951 SourceLocation DeclLoc;
3952 RecordLocation Loc = DeclCursorForID(ID, DeclLoc);
3953 llvm::BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
3956 SavedStreamPosition SavedPosition(DeclsCursor);
3958 ReadingKindTracker ReadingKind(Read_Decl, *
this);
3963 auto Fail = [](
const char *what, llvm::Error &&Err) {
3964 llvm::report_fatal_error(Twine(
"ASTReader::readDeclRecord failed ") + what +
3968 if (llvm::Error JumpFailed = DeclsCursor.JumpToBit(Loc.Offset))
3969 Fail(
"jumping", std::move(JumpFailed));
3972 Expected<unsigned> MaybeCode = DeclsCursor.ReadCode();
3974 Fail(
"reading code", MaybeCode.takeError());
3975 unsigned Code = MaybeCode.get();
3979 Expected<unsigned> MaybeDeclCode =
Record.readRecord(DeclsCursor, Code);
3981 llvm::report_fatal_error(
3982 Twine(
"ASTReader::readDeclRecord failed reading decl code: ") +
3983 toString(MaybeDeclCode.takeError()));
3985 switch ((
DeclCode)MaybeDeclCode.get()) {
3992 llvm_unreachable(
"Record cannot be de-serialized with readDeclRecord");
4102 bool HasTypeConstraint =
Record.readInt();
4108 bool HasTypeConstraint =
Record.readInt();
4114 bool HasTypeConstraint =
Record.readInt();
4116 Context, ID,
Record.readInt(), HasTypeConstraint);
4209 D = MSGuidDecl::CreateDeserialized(Context, ID);
4212 D = UnnamedGlobalConstantDecl::CreateDeserialized(Context, ID);
4215 D = TemplateParamObjectDecl::CreateDeserialized(Context, ID);
4224 Error(
"attempt to read a C++ base-specifier record as a declaration");
4227 Error(
"attempt to read a C++ ctor initializer record as a declaration");
4236 unsigned NumChildren =
Record.readInt();
4242 unsigned NumClauses =
Record.readInt();
4243 unsigned NumVars =
Record.readInt();
4249 unsigned NumClauses =
Record.readInt();
4258 unsigned NumClauses =
Record.readInt();
4297 assert(D &&
"Unknown declaration reading AST file");
4298 LoadedDecl(translateGlobalDeclIDToIndex(ID), D);
4309 if (
auto *DC = dyn_cast<DeclContext>(D)) {
4310 LookupBlockOffsets Offsets;
4312 Reader.VisitDeclContext(DC, Offsets);
4318 if (
auto Iter = DelayedNamespaceOffsetMap.find(ID);
4319 Iter != DelayedNamespaceOffsetMap.end())
4320 Offsets = Iter->second;
4323 ReadVisibleDeclContextStorage(
4325 VisibleDeclContextStorageKind::GenerallyVisible))
4328 ReadVisibleDeclContextStorage(
4330 VisibleDeclContextStorageKind::ModuleLocalVisible))
4333 ReadVisibleDeclContextStorage(
4335 VisibleDeclContextStorageKind::TULocalVisible))
4339 ReadLexicalDeclContextStorage(*Loc.F, DeclsCursor,
4346 PendingUpdateRecords.push_back(
4347 PendingUpdateRecord(ID, D,
true));
4350 if (
auto *
Class = dyn_cast<ObjCInterfaceDecl>(D))
4353 if (
Class->isThisDeclarationADefinition() ||
4354 PendingDefinitions.count(
Class))
4355 loadObjCCategories(ID,
Class);
4361 PotentiallyInterestingDecls.push_back(D);
4366void ASTReader::PassInterestingDeclsToConsumer() {
4369 if (!CanPassDeclsToConsumer)
4374 SaveAndRestore GuardPassingDeclsToConsumer(CanPassDeclsToConsumer,
4379 for (
auto ID : EagerlyDeserializedDecls)
4381 EagerlyDeserializedDecls.clear();
4383 auto ConsumingPotentialInterestingDecls = [
this]() {
4384 while (!PotentiallyInterestingDecls.empty()) {
4385 Decl *D = PotentiallyInterestingDecls.front();
4386 PotentiallyInterestingDecls.pop_front();
4387 if (isConsumerInterestedIn(D))
4388 PassInterestingDeclToConsumer(D);
4391 std::deque<Decl *> MaybeInterestingDecls =
4392 std::move(PotentiallyInterestingDecls);
4393 PotentiallyInterestingDecls.clear();
4394 assert(PotentiallyInterestingDecls.empty());
4395 while (!MaybeInterestingDecls.empty()) {
4396 Decl *D = MaybeInterestingDecls.front();
4397 MaybeInterestingDecls.pop_front();
4403 if (
auto *VD = dyn_cast<VarDecl>(D);
4404 VD && VD->isFileVarDecl() && !VD->isExternallyVisible())
4406 ConsumingPotentialInterestingDecls();
4407 if (isConsumerInterestedIn(D))
4408 PassInterestingDeclToConsumer(D);
4412 ConsumingPotentialInterestingDecls();
4414 for (GlobalDeclID ID : VTablesToEmit) {
4417 PassVTableToConsumer(RD);
4419 VTablesToEmit.clear();
4422void ASTReader::loadDeclUpdateRecords(PendingUpdateRecord &
Record) {
4426 GlobalDeclID ID =
Record.ID;
4428 ProcessingUpdatesRAIIObj ProcessingUpdates(*
this);
4429 DeclUpdateOffsetsMap::iterator UpdI = DeclUpdateOffsets.find(ID);
4431 if (UpdI != DeclUpdateOffsets.end()) {
4432 auto UpdateOffsets = std::move(UpdI->second);
4433 DeclUpdateOffsets.erase(UpdI);
4439 bool WasInteresting =
Record.JustLoaded || isConsumerInterestedIn(D);
4440 for (
auto &FileAndOffset : UpdateOffsets) {
4442 uint64_t Offset = FileAndOffset.second;
4444 SavedStreamPosition SavedPosition(Cursor);
4445 if (llvm::Error JumpFailed =
Cursor.JumpToBit(Offset))
4447 llvm::report_fatal_error(
4448 Twine(
"ASTReader::loadDeclUpdateRecords failed jumping: ") +
4450 Expected<unsigned> MaybeCode =
Cursor.ReadCode();
4452 llvm::report_fatal_error(
4453 Twine(
"ASTReader::loadDeclUpdateRecords failed reading code: ") +
4455 unsigned Code = MaybeCode.get();
4457 if (Expected<unsigned> MaybeRecCode =
Record.readRecord(Cursor, Code))
4459 "Expected DECL_UPDATES record!");
4461 llvm::report_fatal_error(
4462 Twine(
"ASTReader::loadDeclUpdateRecords failed reading rec code: ") +
4467 Reader.UpdateDecl(D);
4471 if (!WasInteresting && isConsumerInterestedIn(D)) {
4472 PotentiallyInterestingDecls.push_back(D);
4473 WasInteresting =
true;
4479 if (
auto I = PendingVisibleUpdates.find(ID);
4480 I != PendingVisibleUpdates.end()) {
4481 auto VisibleUpdates = std::move(I->second);
4482 PendingVisibleUpdates.erase(I);
4485 for (
const auto &
Update : VisibleUpdates)
4486 Lookups[DC].Table.add(
4488 reader::ASTDeclContextNameLookupTrait(*
this, *
Update.Mod));
4492 if (
auto I = PendingModuleLocalVisibleUpdates.find(ID);
4493 I != PendingModuleLocalVisibleUpdates.end()) {
4494 auto ModuleLocalVisibleUpdates = std::move(I->second);
4495 PendingModuleLocalVisibleUpdates.erase(I);
4498 for (
const auto &
Update : ModuleLocalVisibleUpdates)
4499 ModuleLocalLookups[DC].Table.add(
4501 reader::ModuleLocalNameLookupTrait(*
this, *
Update.Mod));
4507 if (
auto I = TULocalUpdates.find(ID); I != TULocalUpdates.end()) {
4508 auto Updates = std::move(I->second);
4509 TULocalUpdates.erase(I);
4513 TULocalLookups[DC].Table.add(
4515 reader::ASTDeclContextNameLookupTrait(*
this, *
Update.Mod));
4521 if (
auto IT = RelatedDeclsMap.find(ID); IT != RelatedDeclsMap.end()) {
4522 for (
auto LID : IT->second)
4524 RelatedDeclsMap.erase(IT);
4529 if (
auto I = PendingSpecializationsUpdates.find(ID);
4530 I != PendingSpecializationsUpdates.end()) {
4531 auto SpecializationUpdates = std::move(I->second);
4532 PendingSpecializationsUpdates.erase(I);
4534 for (
const auto &
Update : SpecializationUpdates)
4535 AddSpecializations(D,
Update.Data, *
Update.Mod,
false);
4539 if (
auto I = PendingPartialSpecializationsUpdates.find(ID);
4540 I != PendingPartialSpecializationsUpdates.end()) {
4541 auto SpecializationUpdates = std::move(I->second);
4542 PendingPartialSpecializationsUpdates.erase(I);
4544 for (
const auto &
Update : SpecializationUpdates)
4549void ASTReader::loadPendingDeclChain(
Decl *FirstLocal, uint64_t LocalOffset) {
4552 if (FirstLocal != CanonDecl) {
4555 *
this, FirstLocal, PrevMostRecent ? PrevMostRecent : CanonDecl,
4566 assert(M &&
"imported decl from no module file");
4569 SavedStreamPosition SavedPosition(Cursor);
4570 if (llvm::Error JumpFailed =
Cursor.JumpToBit(LocalOffset))
4571 llvm::report_fatal_error(
4572 Twine(
"ASTReader::loadPendingDeclChain failed jumping: ") +
4576 Expected<unsigned> MaybeCode =
Cursor.ReadCode();
4578 llvm::report_fatal_error(
4579 Twine(
"ASTReader::loadPendingDeclChain failed reading code: ") +
4581 unsigned Code = MaybeCode.get();
4582 if (Expected<unsigned> MaybeRecCode =
Cursor.readRecord(Code,
Record))
4584 "expected LOCAL_REDECLARATIONS record!");
4586 llvm::report_fatal_error(
4587 Twine(
"ASTReader::loadPendingDeclChain failed reading rec code: ") +
4592 Decl *MostRecent = FirstLocal;
4593 for (
unsigned I = 0, N =
Record.size(); I != N; ++I) {
4594 unsigned Idx = N - I - 1;
4606 class ObjCCategoriesVisitor {
4609 llvm::SmallPtrSetImpl<ObjCCategoryDecl *> &Deserialized;
4610 ObjCCategoryDecl *Tail =
nullptr;
4611 llvm::DenseMap<DeclarationName, ObjCCategoryDecl *> NameCategoryMap;
4612 GlobalDeclID InterfaceID;
4613 unsigned PreviousGeneration;
4615 void add(ObjCCategoryDecl *Cat) {
4617 if (!Deserialized.erase(Cat))
4622 ObjCCategoryDecl *&Existing = NameCategoryMap[Cat->
getDeclName()];
4626 StructuralEquivalenceContext Ctx(
4629 StructuralEquivalenceKind::Default,
4633 if (!Ctx.IsEquivalent(Cat, Existing)) {
4638 diag::note_previous_definition);
4640 }
else if (!Existing) {
4655 ObjCCategoriesVisitor(
4656 ASTReader &Reader, ObjCInterfaceDecl *
Interface,
4657 llvm::SmallPtrSetImpl<ObjCCategoryDecl *> &Deserialized,
4658 GlobalDeclID InterfaceID,
unsigned PreviousGeneration)
4660 InterfaceID(InterfaceID), PreviousGeneration(PreviousGeneration) {
4662 for (
auto *Cat :
Interface->known_categories()) {
4663 if (Cat->getDeclName())
4664 NameCategoryMap[Cat->getDeclName()] = Cat;
4671 bool operator()(ModuleFile &M) {
4680 LocalDeclID LocalID =
4687 const ObjCCategoriesInfo
Compare = {LocalID, 0};
4688 const ObjCCategoriesInfo *
Result = std::lower_bound(
4692 LocalID !=
Result->getDefinitionID()) {
4700 unsigned Offset =
Result->Offset;
4703 for (
unsigned I = 0; I != N; ++I)
4712 unsigned PreviousGeneration) {
4713 ObjCCategoriesVisitor Visitor(*
this, D, CategoriesDeserialized, ID,
4714 PreviousGeneration);
4715 ModuleMgr.visit(Visitor);
4718template<
typename DeclT,
typename Fn>
4727 for (
auto *Redecl = MostRecent; Redecl && !
Found;
4728 Redecl = Redecl->getPreviousDecl())
4729 Found = (Redecl == D);
4733 for (
auto *Redecl = MostRecent; Redecl != D;
4740 while (Record.getIdx() < Record.size()) {
4744 Decl *MD = Record.readDecl();
4745 assert(MD &&
"couldn't read decl from update record");
4746 Reader.PendingAddedClassMembers.push_back({RD, MD});
4751 auto *Anon = readDeclAs<NamespaceDecl>();
4756 if (!Record.isModule()) {
4757 if (
auto *TU = dyn_cast<TranslationUnitDecl>(D))
4758 TU->setAnonymousNamespace(Anon);
4767 VD->NonParmVarDeclBits.IsInline = Record.readInt();
4768 VD->NonParmVarDeclBits.IsInlineSpecified = Record.readInt();
4775 if (
auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D)) {
4776 VTSD->setPointOfInstantiation(POI);
4777 }
else if (
auto *VD = dyn_cast<VarDecl>(D)) {
4779 assert(MSInfo &&
"No member specialization information");
4783 if (
auto *FTSInfo = dyn_cast<FunctionTemplateSpecializationInfo *>(
4784 FD->TemplateOrSpecialization))
4785 FTSInfo->setPointOfInstantiation(POI);
4788 ->setPointOfInstantiation(POI);
4799 auto *DefaultArg = Record.readExpr();
4803 if (Param->hasUninstantiatedDefaultArg())
4804 Param->setDefaultArg(DefaultArg);
4810 auto *DefaultInit = Record.readExpr();
4814 if (FD->hasInClassInitializer() && !FD->hasNonNullInClassInitializer()) {
4816 FD->setInClassInitializer(DefaultInit);
4820 FD->removeInClassInitializer();
4827 if (Reader.PendingBodies[FD]) {
4833 if (Record.readInt()) {
4841 FD->setInnerLocStart(readSourceLocation());
4843 assert(Record.getIdx() == Record.size() &&
"lazy body must be last");
4850 bool HadRealDefinition =
4851 OldDD && (OldDD->Definition != RD ||
4852 !Reader.PendingFakeDefinitionData.count(OldDD));
4856 ReadCXXRecordDefinition(RD,
true);
4859 uint64_t LexicalOffset = ReadLocalOffset();
4860 if (!HadRealDefinition && LexicalOffset) {
4861 Record.readLexicalDeclContextStorage(LexicalOffset, RD);
4862 Reader.PendingFakeDefinitionData.erase(OldDD);
4869 MSInfo->setTemplateSpecializationKind(TSK);
4870 MSInfo->setPointOfInstantiation(POI);
4873 Spec->setTemplateSpecializationKind(TSK);
4874 Spec->setPointOfInstantiation(POI);
4876 if (Record.readInt()) {
4878 readDeclAs<ClassTemplatePartialSpecializationDecl>();
4880 Record.readTemplateArgumentList(TemplArgs);
4882 Reader.getContext(), TemplArgs);
4887 Spec->getSpecializedTemplateOrPartial()))
4888 Spec->setInstantiationOf(PartialSpec, TemplArgList);
4897 if (Record.readInt()) {
4899 Record.readAttributes(Attrs);
4903 D->setAttrsImpl(Attrs, Reader.getContext());
4913 auto *Del = readDeclAs<FunctionDecl>();
4914 auto *ThisArg = Record.readExpr();
4917 if (!
C.dtorHasOperatorDelete(Dtor,
4919 C.addOperatorDeleteForVDtor(Dtor, Del,
4921 Canon->OperatorDeleteThisArg = ThisArg;
4927 auto *Del = readDeclAs<FunctionDecl>();
4930 if (!
C.dtorHasOperatorDelete(
4932 C.addOperatorDeleteForVDtor(
4937 auto *Del = readDeclAs<FunctionDecl>();
4941 C.addOperatorDeleteForVDtor(Dtor, Del,
4946 auto *Del = readDeclAs<FunctionDecl>();
4949 if (!
C.dtorHasOperatorDelete(Dtor,
4951 C.addOperatorDeleteForVDtor(
4958 auto ESI = Record.readExceptionSpecInfo(ExceptionStorage);
4966 FD->setType(Reader.getContext().getFunctionType(
4967 FPT->getReturnType(), FPT->getParamTypes(),
4968 FPT->getExtProtoInfo().withExceptionSpec(ESI)));
4972 Reader.PendingExceptionSpecUpdates.insert(
4973 std::make_pair(FD->getCanonicalDecl(), FD));
4980 QualType DeducedResultType = Record.readType();
4981 Reader.PendingDeducedTypeUpdates.insert(
4982 {FD->getCanonicalDecl(), DeducedResultType});
5002 D->
addAttr(OMPThreadPrivateDeclAttr::CreateImplicit(Reader.getContext(),
5003 readSourceRange()));
5007 auto AllocatorKind =
5008 static_cast<OMPAllocateDeclAttr::AllocatorTypeTy
>(Record.readInt());
5009 Expr *Allocator = Record.readExpr();
5010 Expr *Alignment = Record.readExpr();
5012 D->
addAttr(OMPAllocateDeclAttr::CreateImplicit(
5013 Reader.getContext(), AllocatorKind, Allocator, Alignment, SR));
5018 D->
addAttr(OMPTargetIndirectCallAttr::CreateImplicit(Reader.getContext(),
5019 readSourceRange()));
5026 Reader.getContext().mergeDefinitionIntoModule(Exported, Owner);
5027 Reader.PendingMergedDefinitionsToDeduplicate.insert(Exported);
5032 auto MapType = Record.readEnum<OMPDeclareTargetDeclAttr::MapTypeTy>();
5033 auto DevType = Record.readEnum<OMPDeclareTargetDeclAttr::DevTypeTy>();
5034 Expr *IndirectE = Record.readExpr();
5035 bool Indirect = Record.readBool();
5036 unsigned Level = Record.readInt();
5037 D->
addAttr(OMPDeclareTargetDeclAttr::CreateImplicit(
5038 Reader.getContext(), MapType, DevType, IndirectE, Indirect, Level,
5039 readSourceRange()));
5045 Record.readAttributes(Attrs);
5046 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.
Result
Implement __builtin_bit_cast and related operations.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines the LambdaCapture class.
Defines several types used to describe C++ lambda expressions that are shared between the parser and ...
Defines the clang::LangOptions interface.
llvm::MachO::Record Record
Defines the clang::Module class, which describes a module in the source code.
This file defines OpenMP AST classes for clauses.
static std::string toString(const clang::SanitizerSet &Sanitizers)
Produce a string containing comma-separated names of sanitizers in Sanitizers set.
Defines the clang::SourceLocation class and associated facilities.
Defines various enumerations that describe declaration and type specifiers.
C Language Family Type Representation.
__DEVICE__ void * memcpy(void *__a, const void *__b, size_t __c)
bool needsCleanup() const
Returns whether the object performed allocations.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
TranslationUnitDecl * getTranslationUnitDecl() const
const LangOptions & getLangOpts() const
void addDestruction(T *Ptr) const
If T isn't trivially destructible, calls AddDeallocation to register it for destruction.
ExternalASTSource * getExternalSource() const
Retrieve a pointer to the external AST source associated with this AST context, if any.
void mergeTemplatePattern(RedeclarableTemplateDecl *D, RedeclarableTemplateDecl *Existing, bool IsKeyDecl)
Merge together the pattern declarations from two template declarations.
ASTDeclMerger(ASTReader &Reader)
void mergeRedeclarable(Redeclarable< T > *D, T *Existing, RedeclarableResult &Redecl)
void mergeLambda(CXXRecordDecl *D, RedeclarableResult &Redecl, Decl &Context, unsigned Number)
Attempt to merge D with a previous declaration of the same lambda, which is found by its index within...
void MergeDefinitionData(CXXRecordDecl *D, struct CXXRecordDecl::DefinitionData &&NewDD)
void mergeRedeclarableImpl(Redeclarable< T > *D, T *Existing, GlobalDeclID KeyDeclID)
Attempts to merge the given declaration (D) with another declaration of the same entity.
void VisitTemplateParamObjectDecl(TemplateParamObjectDecl *D)
void VisitObjCImplementationDecl(ObjCImplementationDecl *D)
void mergeRedeclarableTemplate(RedeclarableTemplateDecl *D, RedeclarableResult &Redecl)
void VisitImportDecl(ImportDecl *D)
void VisitBindingDecl(BindingDecl *BD)
void VisitNamespaceDecl(NamespaceDecl *D)
void VisitTopLevelStmtDecl(TopLevelStmtDecl *D)
RedeclarableResult VisitRedeclarableTemplateDecl(RedeclarableTemplateDecl *D)
void VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D)
void VisitUnresolvedUsingIfExistsDecl(UnresolvedUsingIfExistsDecl *D)
void ReadFunctionDefinition(FunctionDecl *FD)
void VisitLabelDecl(LabelDecl *LD)
void VisitObjCCategoryDecl(ObjCCategoryDecl *D)
void VisitUsingDirectiveDecl(UsingDirectiveDecl *D)
RedeclarableResult VisitClassTemplateSpecializationDeclImpl(ClassTemplateSpecializationDecl *D)
void VisitFunctionDecl(FunctionDecl *FD)
void VisitObjCMethodDecl(ObjCMethodDecl *D)
void VisitUsingShadowDecl(UsingShadowDecl *D)
void VisitVarTemplateSpecializationDecl(VarTemplateSpecializationDecl *D)
void VisitVarDecl(VarDecl *VD)
RedeclarableResult VisitRedeclarable(Redeclarable< T > *D)
void VisitDeclContext(DeclContext *DC, LookupBlockOffsets &Offsets)
void VisitMSGuidDecl(MSGuidDecl *D)
void VisitPragmaCommentDecl(PragmaCommentDecl *D)
void VisitRecordDecl(RecordDecl *RD)
void VisitLifetimeExtendedTemporaryDecl(LifetimeExtendedTemporaryDecl *D)
void VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D)
void VisitRequiresExprBodyDecl(RequiresExprBodyDecl *D)
void ReadVarDeclInit(VarDecl *VD)
static Decl * getMostRecentDeclImpl(Redeclarable< DeclT > *D)
void VisitNamespaceAliasDecl(NamespaceAliasDecl *D)
void VisitIndirectFieldDecl(IndirectFieldDecl *FD)
void VisitObjCContainerDecl(ObjCContainerDecl *D)
void VisitBlockDecl(BlockDecl *BD)
void VisitOpenACCRoutineDecl(OpenACCRoutineDecl *D)
void VisitExportDecl(ExportDecl *D)
static void attachLatestDecl(Decl *D, Decl *latest)
void VisitStaticAssertDecl(StaticAssertDecl *D)
void VisitEmptyDecl(EmptyDecl *D)
void VisitOMPCapturedExprDecl(OMPCapturedExprDecl *D)
void VisitValueDecl(ValueDecl *VD)
void VisitEnumDecl(EnumDecl *ED)
void mergeRedeclarable(Redeclarable< T > *D, RedeclarableResult &Redecl)
Attempts to merge the given declaration (D) with another declaration of the same entity.
void VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D)
void VisitFriendTemplateDecl(FriendTemplateDecl *D)
void VisitObjCProtocolDecl(ObjCProtocolDecl *D)
void VisitClassTemplatePartialSpecializationDecl(ClassTemplatePartialSpecializationDecl *D)
void VisitObjCTypeParamDecl(ObjCTypeParamDecl *D)
void VisitDeclaratorDecl(DeclaratorDecl *DD)
RedeclarableResult VisitTypedefNameDecl(TypedefNameDecl *TD)
void VisitExplicitInstantiationDecl(ExplicitInstantiationDecl *D)
void VisitFriendDecl(FriendDecl *D)
void VisitLinkageSpecDecl(LinkageSpecDecl *D)
void VisitCXXRecordDecl(CXXRecordDecl *D)
ASTDeclReader(ASTReader &Reader, ASTRecordReader &Record, ASTReader::RecordLocation Loc, GlobalDeclID thisDeclID, SourceLocation ThisDeclLoc)
void VisitFileScopeAsmDecl(FileScopeAsmDecl *AD)
void VisitImplicitConceptSpecializationDecl(ImplicitConceptSpecializationDecl *D)
void VisitNamedDecl(NamedDecl *ND)
void mergeMergeable(Mergeable< T > *D)
Attempts to merge the given declaration (D) with another declaration of the same entity,...
void VisitBuiltinTemplateDecl(BuiltinTemplateDecl *D)
static Decl * getMostRecentDecl(Decl *D)
void VisitObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *D)
void VisitCXXConstructorDecl(CXXConstructorDecl *D)
void VisitPragmaDetectMismatchDecl(PragmaDetectMismatchDecl *D)
void VisitImplicitParamDecl(ImplicitParamDecl *PD)
void VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D)
static void setNextObjCCategory(ObjCCategoryDecl *Cat, ObjCCategoryDecl *Next)
void 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 an explicit instantiation of a template entity in source code.
static ExplicitInstantiationDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned TrailingFlags)
bool hasTrailingQualifier() const
Whether the qualifier is stored as a trailing object (function / variable templates) rather than insi...
bool hasTrailingArgsAsWritten() const
Represents a standard C++ module export declaration.
static ExportDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
This represents one expression.
RAII class for safely pairing a StartedDeserializing call with FinishedDeserializing.
Represents 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)
A C++ nested-name-specifier augmented with source location information.
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
static NonTypeTemplateParmDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, bool HasTypeConstraint)
unsigned getNumExpansionTypes() const
Retrieves the number of expansion types in an expanded parameter pack.
bool isExpandedParameterPack() const
Whether this parameter is a non-type template parameter pack that has a known list of different types...
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_EXPLICIT_INSTANTIATION
An ExplicitInstantiationDecl record.
@ DECL_OMP_CAPTUREDEXPR
An OMPCapturedExprDecl record.
@ DECL_CLASS_TEMPLATE
A ClassTemplateDecl record.
@ DECL_USING_SHADOW
A UsingShadowDecl record.
@ DECL_CONCEPT
A ConceptDecl record.
@ DECL_CXX_DEDUCTION_GUIDE
A CXXDeductionGuideDecl record.
@ DECL_OMP_REQUIRES
An OMPRequiresDecl record.
@ DECL_OBJC_IVAR
A ObjCIvarDecl record.
@ DECL_OBJC_PROPERTY
A ObjCPropertyDecl record.
@ DECL_TEMPLATE_PARAM_OBJECT
A TemplateParamObjectDecl record.
@ DECL_OBJC_INTERFACE
A ObjCInterfaceDecl record.
@ DECL_VAR_TEMPLATE
A VarTemplateDecl record.
@ DECL_LIFETIME_EXTENDED_TEMPORARY
An LifetimeExtendedTemporaryDecl record.
@ DECL_CLASS_TEMPLATE_PARTIAL_SPECIALIZATION
A ClassTemplatePartialSpecializationDecl record.
@ DECL_IMPLICIT_CONCEPT_SPECIALIZATION
An ImplicitConceptSpecializationDecl record.
@ DECL_CONTEXT_VISIBLE
A record that stores the set of declarations that are visible from a given DeclContext.
@ DECL_OBJC_PROPERTY_IMPL
A ObjCPropertyImplDecl record.
Defines the Linkage enumeration and various utility functions.
const internal::VariadicAllOfMatcher< Decl > decl
Matches declarations.
@ Number
Just a number, nothing else.
ComparisonCategoryResult Compare(const T &X, const T &Y)
Helper to compare two comparable types.
std::variant< struct RequiresDecl, struct HeaderDecl, struct UmbrellaDirDecl, struct ModuleDecl, struct ExcludeDecl, struct ExportDecl, struct ExportAsDecl, struct ExternModuleDecl, struct UseDecl, struct LinkDecl, struct ConfigMacrosDecl, struct ConflictDecl > Decl
All declarations that can appear in a module declaration.
bool needsAnonymousDeclarationNumber(const NamedDecl *D)
Determine whether the given declaration needs an anonymous declaration number.
void numberAnonymousDeclsWithin(const DeclContext *DC, Fn Visit)
Visit each declaration within DC that needs an anonymous declaration number and call Visit with the d...
uint64_t TypeID
An ID number that refers to a type in an AST file.
@ MK_MainFile
File is a PCH file treated as the actual main file.
uint32_t SubmoduleID
An ID number that refers to a submodule in a module file.
bool isPartOfPerModuleInitializer(const Decl *D)
Determine whether the given declaration will be included in the per-module initializer if it needs to...
@ DeclMarkedOpenMPThreadPrivate
@ CXXResolvedDtorGlobArrayDelete
@ CXXInstantiatedClassDefinition
@ CXXResolvedExceptionSpec
@ CXXResolvedDtorArrayDelete
@ CXXInstantiatedDefaultArgument
@ CXXInstantiatedDefaultMemberInitializer
@ CXXAddedAnonymousNamespace
@ CXXResolvedDtorGlobDelete
@ CXXAddedFunctionDefinition
@ CXXPointOfInstantiation
@ DeclMarkedOpenMPIndirectCall
@ DeclMarkedOpenMPDeclareTarget
@ DeclMarkedOpenMPAllocate
The JSON file list parser is used to communicate input to InstallAPI.
bool isa(CodeGen::Address addr)
SelectorLocationsKind
Whether all locations of the selector identifiers are in a "standard" position.
LazyOffsetPtr< Stmt, uint64_t, &ExternalASTSource::GetExternalDeclStmt > LazyDeclStmtPtr
A lazy pointer to a statement.
bool isUnresolvedExceptionSpec(ExceptionSpecificationType ESpecType)
ConstexprSpecKind
Define the kind of constexpr specifier.
LinkageSpecLanguageIDs
Represents the language in a linkage specification.
LambdaCaptureKind
The different capture forms in a lambda introducer.
@ LCK_ByCopy
Capturing by copy (a.k.a., by value)
@ LCK_ByRef
Capturing by reference.
@ LCK_VLAType
Capturing variable-length array type.
@ LCK_StarThis
Capturing the *this object by copy.
@ LCK_This
Capturing the *this object by reference.
AccessSpecifier
A C++ access specifier (public, private, protected), plus the special value "none" which means differ...
SmallVector< Attr *, 4 > AttrVec
AttrVec - A vector of Attr, which is how they are stored on the AST.
OMPDeclareReductionInitKind
StorageClass
Storage classes.
Linkage
Describes the different kinds of linkage (C++ [basic.link], C99 6.2.2) that an entity may have.
@ None
No linkage, which means that the entity is unique and can only be referred to from within its scope.
@ Result
The result type of a method or function.
OptionalUnsigned< unsigned > UnsignedOrNone
@ Template
We are parsing a template declaration.
TagTypeKind
The kind of a tag type.
@ VarTemplate
The name was classified as a variable template name.
ObjCImplementationControl
RecordArgPassingKind
Enum that represents the different ways arguments are passed to and returned from function calls.
static bool isUndeducedReturnType(QualType T)
bool operator!=(CanQual< T > x, CanQual< U > y)
TemplateNameKind
Specifies the kind of template name that an identifier refers to.
DeductionCandidate
Only used by CXXDeductionGuideDecl.
bool shouldSkipCheckingODR(const Decl *D)
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
U cast(CodeGen::Address addr)
@ Interface
The "__interface" keyword introduces the elaborated-type-specifier.
@ Class
The "class" keyword introduces the elaborated-type-specifier.
@ Other
Other implicit parameter.
Represents an explicit template argument list in C++, e.g., the "<int>" in "sort<int>".
Structure used to store a statement, the constant value to which it was evaluated (if any),...
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