58#include "llvm/ADT/DenseMap.h"
59#include "llvm/ADT/FoldingSet.h"
60#include "llvm/ADT/STLExtras.h"
61#include "llvm/ADT/SmallPtrSet.h"
62#include "llvm/ADT/SmallVector.h"
63#include "llvm/ADT/iterator_range.h"
64#include "llvm/Bitstream/BitstreamReader.h"
65#include "llvm/Support/Casting.h"
66#include "llvm/Support/ErrorHandling.h"
67#include "llvm/Support/SaveAndRestore.h"
76using namespace serialization;
84class RedeclarableResult {
91 : MergeWith(MergeWith), FirstID(FirstID), IsKeyDecl(IsKeyDecl) {}
97 bool isKeyDecl()
const {
return IsKeyDecl; }
101 Decl *getKnownMergeTarget()
const {
return MergeWith; }
119 template <
typename T>
123 template <
typename T>
125 RedeclarableResult &Redecl) {
127 D, Existing, Redecl.isKeyDecl() ? Redecl.getFirstID() :
GlobalDeclID());
134 struct CXXRecordDecl::DefinitionData &&NewDD);
136 struct ObjCInterfaceDecl::DefinitionData &&NewDD);
138 struct ObjCProtocolDecl::DefinitionData &&NewDD);
151 ASTReader::RecordLocation Loc;
157 TypeID DeferredTypeID = 0;
158 unsigned AnonymousDeclNumber = 0;
165 bool IsDeclMarkedUsed =
false;
167 uint64_t GetCurrentCursorOffset();
169 uint64_t ReadLocalOffset() {
170 uint64_t LocalOffset =
Record.readInt();
171 assert(LocalOffset <
Loc.Offset &&
"offset point after current record");
172 return LocalOffset ?
Loc.Offset - LocalOffset : 0;
175 uint64_t ReadGlobalOffset() {
176 uint64_t Local = ReadLocalOffset();
177 return Local ?
Record.getGlobalBitOffset(Local) : 0;
188 std::string readString() {
return Record.readString(); }
190 Decl *readDecl() {
return Record.readDecl(); }
192 template <
typename T>
T *readDeclAs() {
return Record.readDeclAs<
T>(); }
201 Module *readModule() {
return Record.getSubmodule(readSubmoduleID()); }
204 Decl *LambdaContext =
nullptr,
205 unsigned IndexInLambdaContext = 0);
206 void ReadCXXDefinitionData(
struct CXXRecordDecl::DefinitionData &
Data,
208 unsigned IndexInLambdaContext);
209 void ReadObjCDefinitionData(
struct ObjCInterfaceDecl::DefinitionData &
Data);
210 void ReadObjCDefinitionData(
struct ObjCProtocolDecl::DefinitionData &
Data);
231 class FindExistingResult {
235 bool AddResult =
false;
236 unsigned AnonymousDeclNumber = 0;
240 FindExistingResult(
ASTReader &Reader) : Reader(Reader) {}
243 unsigned AnonymousDeclNumber,
245 : Reader(Reader), New(New), Existing(Existing), AddResult(
true),
246 AnonymousDeclNumber(AnonymousDeclNumber),
247 TypedefNameForLinkage(TypedefNameForLinkage) {}
249 FindExistingResult(FindExistingResult &&
Other)
251 AddResult(
Other.AddResult),
252 AnonymousDeclNumber(
Other.AnonymousDeclNumber),
253 TypedefNameForLinkage(
Other.TypedefNameForLinkage) {
254 Other.AddResult =
false;
257 FindExistingResult &operator=(FindExistingResult &&) =
delete;
258 ~FindExistingResult();
262 void suppress() { AddResult =
false; }
264 operator NamedDecl *()
const {
return Existing; }
266 template <
typename T>
operator T *()
const {
267 return dyn_cast_or_null<T>(Existing);
273 FindExistingResult findExisting(
NamedDecl *
D);
280 ThisDeclID(thisDeclID), ThisDeclLoc(ThisDeclLoc) {}
282 template <
typename DeclT>
287 template <
typename DeclT>
297 template <
typename DeclT>
302 template <
typename DeclT>
307 llvm::BitstreamCursor &DeclsCursor,
bool IsPartial);
316 Cat->NextClassCategory = Next;
417 uint64_t &VisibleOffset, uint64_t &ModuleLocalOffset,
418 uint64_t &TULocalOffset);
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;
511 Reader.DefinitionSource[FD] =
512 Loc.F->Kind == ModuleKind::MK_MainFile ||
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();
530 IsDeclMarkedUsed =
false;
532 if (
auto *DD = dyn_cast<DeclaratorDecl>(
D)) {
533 if (
auto *TInfo = DD->getTypeSourceInfo())
534 Record.readTypeLoc(TInfo->getTypeLoc());
537 if (
auto *TD = dyn_cast<TypeDecl>(
D)) {
543 if (NamedDeclForTagDecl.
isValid())
544 cast<TagDecl>(
D)->TypedefNameDeclOrQualifier =
545 cast<TypedefNameDecl>(Reader.
GetDecl(NamedDeclForTagDecl));
546 }
else if (
auto *ID = dyn_cast<ObjCInterfaceDecl>(
D)) {
549 }
else if (
auto *FD = dyn_cast<FunctionDecl>(
D)) {
553 }
else if (
auto *VD = dyn_cast<VarDecl>(
D)) {
555 }
else if (
auto *FD = dyn_cast<FieldDecl>(
D)) {
556 if (FD->hasInClassInitializer() &&
Record.readInt()) {
557 FD->setLazyInClassInitializer(
LazyDeclStmtPtr(GetCurrentCursorOffset()));
564 auto ModuleOwnership =
568 IsDeclMarkedUsed |=
D->Used;
571 bool HasStandaloneLexicalDC = DeclBits.
getNextBit();
578 isa<ParmVarDecl, ObjCTypeParamDecl>(
D)) {
585 GlobalDeclID SemaDCIDForTemplateParmDecl = readDeclID();
588 if (LexicalDCIDForTemplateParmDecl.
isInvalid())
589 LexicalDCIDForTemplateParmDecl = SemaDCIDForTemplateParmDecl;
590 Reader.addPendingDeclContextInfo(
D,
591 SemaDCIDForTemplateParmDecl,
592 LexicalDCIDForTemplateParmDecl);
595 auto *SemaDC = readDeclAs<DeclContext>();
597 HasStandaloneLexicalDC ? readDeclAs<DeclContext>() :
nullptr;
603 if (
auto *RD = dyn_cast<CXXRecordDecl>(SemaDC))
604 MergedSemaDC = getOrFakePrimaryClassDefinition(Reader, RD);
606 MergedSemaDC = Reader.MergedDeclContexts.lookup(SemaDC);
609 D->setDeclContextsImpl(MergedSemaDC ? MergedSemaDC : SemaDC, LexicalDC,
616 Record.readAttributes(Attrs,
D);
627 switch (ModuleOwnership) {
653 Reader.HiddenNamesMap[Owner].push_back(
D);
655 }
else if (ModulePrivate) {
664 std::string Arg = readString();
665 memcpy(
D->getTrailingObjects<
char>(), Arg.data(), Arg.size());
666 D->getTrailingObjects<
char>()[Arg.size()] =
'\0';
672 std::string Name = readString();
673 memcpy(
D->getTrailingObjects<
char>(), Name.data(), Name.size());
674 D->getTrailingObjects<
char>()[Name.size()] =
'\0';
676 D->ValueStart = Name.size() + 1;
677 std::string
Value = readString();
678 memcpy(
D->getTrailingObjects<
char>() +
D->ValueStart,
Value.data(),
680 D->getTrailingObjects<
char>()[
D->ValueStart +
Value.size()] =
'\0';
684 llvm_unreachable(
"Translation units are not serialized");
690 AnonymousDeclNumber =
Record.readInt();
697 DeferredTypeID =
Record.getGlobalTypeID(
Record.readInt());
724 if (
auto *Template = readDeclAs<TypeAliasTemplateDecl>())
751 Record.readQualifierInfo(*Info);
752 TD->TypedefNameDeclOrQualifier = Info;
756 NamedDeclForTagDecl = readDeclID();
757 TypedefNameForLinkage =
Record.readIdentifier();
760 llvm_unreachable(
"unexpected tag info kind");
763 if (!isa<CXXRecordDecl>(TD))
777 ED->setNumPositiveBits(EnumDeclBits.
getNextBits(8));
778 ED->setNumNegativeBits(EnumDeclBits.
getNextBits(8));
783 ED->setHasODRHash(
true);
784 ED->ODRHash =
Record.readInt();
801 Reader.MergedDeclContexts.insert(std::make_pair(ED, OldDef));
808 Reader.PendingEnumOdrMergeFailures[OldDef].push_back(ED);
814 if (
auto *InstED = readDeclAs<EnumDecl>()) {
817 ED->setInstantiationOfMemberEnum(Reader.
getContext(), InstED, TSK);
846 RD->setODRHash(
Record.readInt());
852 RecordDecl *&OldDef = Reader.RecordDefinitions[Canon];
864 Reader.MergedDeclContexts.insert(std::make_pair(RD, OldDef));
868 Reader.PendingRecordOdrMergeFailures[OldDef].push_back(RD);
880 if (isa<FunctionDecl, VarDecl>(VD))
881 DeferredTypeID =
Record.getGlobalTypeID(
Record.readInt());
898 auto *Info =
new (Reader.
getContext()) DeclaratorDecl::ExtInfo();
899 Record.readQualifierInfo(*Info);
900 Info->TrailingRequiresClause =
Record.readExpr();
905 TSIType.
isNull() ? nullptr
921 auto *Template = readDeclAs<FunctionTemplateDecl>();
927 auto *InstFD = readDeclAs<FunctionDecl>();
930 FD->setInstantiationOfMemberFunction(Reader.
getContext(), InstFD, TSK);
935 auto *Template = readDeclAs<FunctionTemplateDecl>();
940 Record.readTemplateArgumentList(TemplArgs,
true);
944 bool HasTemplateArgumentsAsWritten =
Record.readBool();
945 if (HasTemplateArgumentsAsWritten)
946 Record.readTemplateArgumentListInfo(TemplArgsWritten);
956 auto *FD = readDeclAs<FunctionDecl>();
966 C, FD, Template, TSK, TemplArgList,
967 HasTemplateArgumentsAsWritten ? &TemplArgsWritten :
nullptr, POI,
969 FD->TemplateOrSpecialization = FTInfo;
974 auto *CanonTemplate = readDeclAs<FunctionTemplateDecl>();
980 llvm::FoldingSetNodeID ID;
982 void *InsertPos =
nullptr;
990 "already deserialized this template specialization");
999 unsigned NumCandidates =
Record.readInt();
1000 while (NumCandidates--)
1001 Candidates.
addDecl(readDeclAs<NamedDecl>());
1005 bool HasTemplateArgumentsAsWritten =
Record.readBool();
1006 if (HasTemplateArgumentsAsWritten)
1007 Record.readTemplateArgumentListInfo(TemplArgsWritten);
1011 HasTemplateArgumentsAsWritten ? &TemplArgsWritten :
nullptr);
1030 Reader.PendingDeducedFunctionTypes.push_back({FD, DeferredTypeID});
1052 const bool Pure = FunctionDeclBits.
getNextBit();
1070 FD->EndRangeLoc = readSourceLocation();
1074 FD->ODRHash =
Record.readInt();
1075 FD->setHasODRHash(
true);
1081 if (
auto Info =
Record.readInt()) {
1082 bool HasMessage = Info & 2;
1084 HasMessage ? cast<StringLiteral>(
Record.readExpr()) :
nullptr;
1086 unsigned NumLookups =
Record.readInt();
1088 for (
unsigned I = 0; I != NumLookups; ++I) {
1096 Reader.
getContext(), Lookups, DeletedMessage));
1107 auto merge = [
this, &Redecl, FD](
auto &&F) {
1108 auto *Existing = cast_or_null<FunctionDecl>(Redecl.getKnownMergeTarget());
1109 RedeclarableResult NewRedecl(Existing ? F(Existing) :
nullptr,
1110 Redecl.getFirstID(), Redecl.isKeyDecl());
1128 unsigned NumParams =
Record.readInt();
1130 Params.reserve(NumParams);
1131 for (
unsigned I = 0; I != NumParams; ++I)
1132 Params.push_back(readDeclAs<ParmVarDecl>());
1138 if (FD->
hasAttr<SYCLKernelEntryPointAttr>()) {
1139 auto *SKEPAttr = FD->
getAttr<SYCLKernelEntryPointAttr>();
1141 const SYCLKernelInfo *SKI =
C.findSYCLKernelInfo(SKEPAttr->getKernelName());
1146 diag::note_previous_declaration);
1147 SKEPAttr->setInvalidAttr();
1150 C.registerSYCLEntryPointFunction(FD);
1160 Reader.PendingBodies[MD] = GetCurrentCursorOffset();
1163 MD->
setCmdDecl(readDeclAs<ImplicitParamDecl>());
1176 readDeclAs<ObjCMethodDecl>());
1184 MD->DeclEndLoc = readSourceLocation();
1185 unsigned NumParams =
Record.readInt();
1187 Params.reserve(NumParams);
1188 for (
unsigned I = 0; I != NumParams; ++I)
1189 Params.push_back(readDeclAs<ParmVarDecl>());
1192 unsigned NumStoredSelLocs =
Record.readInt();
1194 SelLocs.reserve(NumStoredSelLocs);
1195 for (
unsigned i = 0; i != NumStoredSelLocs; ++i)
1196 SelLocs.push_back(readSourceLocation());
1198 MD->setParamsAndSelLocs(Reader.
getContext(), Params, SelLocs);
1204 D->Variance =
Record.readInt();
1206 D->VarianceLoc = readSourceLocation();
1207 D->ColonLoc = readSourceLocation();
1217 unsigned numParams =
Record.readInt();
1222 typeParams.reserve(numParams);
1223 for (
unsigned i = 0; i != numParams; ++i) {
1224 auto *typeParam = readDeclAs<ObjCTypeParamDecl>();
1228 typeParams.push_back(typeParam);
1235 typeParams, rAngleLoc);
1238void ASTDeclReader::ReadObjCDefinitionData(
1239 struct ObjCInterfaceDecl::DefinitionData &
Data) {
1241 Data.SuperClassTInfo = readTypeSourceInfo();
1243 Data.EndLoc = readSourceLocation();
1244 Data.HasDesignatedInitializers =
Record.readInt();
1246 Data.HasODRHash =
true;
1249 unsigned NumProtocols =
Record.readInt();
1251 Protocols.reserve(NumProtocols);
1252 for (
unsigned I = 0; I != NumProtocols; ++I)
1253 Protocols.push_back(readDeclAs<ObjCProtocolDecl>());
1255 ProtoLocs.reserve(NumProtocols);
1256 for (
unsigned I = 0; I != NumProtocols; ++I)
1257 ProtoLocs.push_back(readSourceLocation());
1258 Data.ReferencedProtocols.set(Protocols.data(), NumProtocols, ProtoLocs.data(),
1262 NumProtocols =
Record.readInt();
1264 Protocols.reserve(NumProtocols);
1265 for (
unsigned I = 0; I != NumProtocols; ++I)
1266 Protocols.push_back(readDeclAs<ObjCProtocolDecl>());
1267 Data.AllReferencedProtocols.set(Protocols.data(), NumProtocols,
1273 struct ObjCInterfaceDecl::DefinitionData &DD =
D->data();
1274 if (DD.Definition == NewDD.Definition)
1277 Reader.MergedDeclContexts.insert(
1278 std::make_pair(NewDD.Definition, DD.Definition));
1281 if (
D->getODRHash() != NewDD.ODRHash)
1282 Reader.PendingObjCInterfaceOdrMergeFailures[DD.Definition].push_back(
1283 {NewDD.Definition, &NewDD});
1289 DeferredTypeID =
Record.getGlobalTypeID(
Record.readInt());
1295 ID->allocateDefinitionData();
1297 ReadObjCDefinitionData(
ID->data());
1299 if (Canon->Data.getPointer()) {
1303 ID->Data = Canon->Data;
1307 ID->getCanonicalDecl()->Data =
ID->Data;
1310 ID->setIvarList(
nullptr);
1314 Reader.PendingDefinitions.insert(
ID);
1317 Reader.ObjCClassesLoaded.push_back(
ID);
1319 ID->Data =
ID->getCanonicalDecl()->Data;
1328 bool synth =
Record.readInt();
1343 if (PrevIvar && PrevIvar != IVD) {
1344 auto *ParentExt = dyn_cast<ObjCCategoryDecl>(IVD->
getDeclContext());
1345 auto *PrevParentExt =
1347 if (ParentExt && PrevParentExt) {
1351 .PendingObjCExtensionIvarRedeclarations[std::make_pair(ParentExt,
1353 .push_back(std::make_pair(IVD, PrevIvar));
1354 }
else if (ParentExt || PrevParentExt) {
1365void ASTDeclReader::ReadObjCDefinitionData(
1366 struct ObjCProtocolDecl::DefinitionData &
Data) {
1367 unsigned NumProtoRefs =
Record.readInt();
1369 ProtoRefs.reserve(NumProtoRefs);
1370 for (
unsigned I = 0; I != NumProtoRefs; ++I)
1371 ProtoRefs.push_back(readDeclAs<ObjCProtocolDecl>());
1373 ProtoLocs.reserve(NumProtoRefs);
1374 for (
unsigned I = 0; I != NumProtoRefs; ++I)
1375 ProtoLocs.push_back(readSourceLocation());
1376 Data.ReferencedProtocols.set(ProtoRefs.data(), NumProtoRefs,
1379 Data.HasODRHash =
true;
1384 struct ObjCProtocolDecl::DefinitionData &DD =
D->data();
1385 if (DD.Definition == NewDD.Definition)
1388 Reader.MergedDeclContexts.insert(
1389 std::make_pair(NewDD.Definition, DD.Definition));
1392 if (
D->getODRHash() != NewDD.ODRHash)
1393 Reader.PendingObjCProtocolOdrMergeFailures[DD.Definition].push_back(
1394 {NewDD.Definition, &NewDD});
1404 PD->allocateDefinitionData();
1406 ReadObjCDefinitionData(PD->data());
1409 if (Canon->Data.getPointer()) {
1413 PD->Data = Canon->Data;
1420 Reader.PendingDefinitions.insert(PD);
1439 Reader.CategoriesDeserialized.insert(CD);
1441 CD->ClassInterface = readDeclAs<ObjCInterfaceDecl>();
1443 unsigned NumProtoRefs =
Record.readInt();
1445 ProtoRefs.reserve(NumProtoRefs);
1446 for (
unsigned I = 0; I != NumProtoRefs; ++I)
1447 ProtoRefs.push_back(readDeclAs<ObjCProtocolDecl>());
1449 ProtoLocs.reserve(NumProtoRefs);
1450 for (
unsigned I = 0; I != NumProtoRefs; ++I)
1451 ProtoLocs.push_back(readSourceLocation());
1469 D->setAtLoc(readSourceLocation());
1470 D->setLParenLoc(readSourceLocation());
1475 D->setPropertyAttributesAsWritten(
1477 D->setPropertyImplementation(
1485 D->setGetterMethodDecl(readDeclAs<ObjCMethodDecl>());
1486 D->setSetterMethodDecl(readDeclAs<ObjCMethodDecl>());
1487 D->setPropertyIvarDecl(readDeclAs<ObjCIvarDecl>());
1492 D->setClassInterface(readDeclAs<ObjCInterfaceDecl>());
1497 D->CategoryNameLoc = readSourceLocation();
1502 D->setSuperClass(readDeclAs<ObjCInterfaceDecl>());
1503 D->SuperLoc = readSourceLocation();
1504 D->setIvarLBraceLoc(readSourceLocation());
1505 D->setIvarRBraceLoc(readSourceLocation());
1506 D->setHasNonZeroConstructors(
Record.readInt());
1507 D->setHasDestructors(
Record.readInt());
1508 D->NumIvarInitializers =
Record.readInt();
1509 if (
D->NumIvarInitializers)
1510 D->IvarInitializers = ReadGlobalOffset();
1515 D->setAtLoc(readSourceLocation());
1516 D->setPropertyDecl(readDeclAs<ObjCPropertyDecl>());
1517 D->PropertyIvarDecl = readDeclAs<ObjCIvarDecl>();
1518 D->IvarLoc = readSourceLocation();
1519 D->setGetterMethodDecl(readDeclAs<ObjCMethodDecl>());
1520 D->setSetterMethodDecl(readDeclAs<ObjCMethodDecl>());
1521 D->setGetterCXXConstructor(
Record.readExpr());
1522 D->setSetterCXXAssignment(
Record.readExpr());
1527 FD->Mutable =
Record.readInt();
1529 unsigned Bits =
Record.readInt();
1530 FD->StorageKind = Bits >> 1;
1531 if (FD->StorageKind == FieldDecl::ISK_CapturedVLAType)
1533 cast<VariableArrayType>(
Record.readType().getTypePtr());
1539 if (
auto *Tmpl = readDeclAs<FieldDecl>())
1547 PD->GetterId =
Record.readIdentifier();
1548 PD->SetterId =
Record.readIdentifier();
1553 D->PartVal.Part1 =
Record.readInt();
1554 D->PartVal.Part2 =
Record.readInt();
1555 D->PartVal.Part3 =
Record.readInt();
1556 for (
auto &
C :
D->PartVal.Part4And5)
1567 D->Value =
Record.readAPValue();
1571 Reader.
getContext().UnnamedGlobalConstantDecls.GetOrInsertNode(
D))
1577 D->Value =
Record.readAPValue();
1582 Reader.
getContext().TemplateParamObjectDecls.GetOrInsertNode(
D))
1589 FD->ChainingSize =
Record.readInt();
1590 assert(FD->ChainingSize >= 2 &&
"Anonymous chaining must be >= 2");
1593 for (
unsigned I = 0; I != FD->ChainingSize; ++I)
1594 FD->Chaining[I] = readDeclAs<NamedDecl>();
1605 bool DefGeneratedInModule = VarDeclBits.
getNextBit();
1610 bool HasDeducedType =
false;
1611 if (!isa<ParmVarDecl>(VD)) {
1637 Reader.PendingDeducedVarTypes.push_back({VD, DeferredTypeID});
1649 if (DefGeneratedInModule) {
1650 Reader.DefinitionSource[VD] =
1651 Loc.F->Kind == ModuleKind::MK_MainFile ||
1655 if (VD->
hasAttr<BlocksAttr>()) {
1662 VarNotTemplate = 0, VarTemplate, StaticDataMemberSpecialization
1664 switch ((VarKind)
Record.readInt()) {
1665 case VarNotTemplate:
1668 if (!isa<ParmVarDecl>(VD) && !isa<ImplicitParamDecl>(VD) &&
1669 !isa<VarTemplateSpecializationDecl>(VD))
1676 case StaticDataMemberSpecialization: {
1677 auto *Tmpl = readDeclAs<VarDecl>();
1690 if (uint64_t Val =
Record.readInt()) {
1704 Eval->
Value = GetCurrentCursorOffset();
1715 unsigned scopeIndex =
Record.readInt();
1717 unsigned isObjCMethodParam = ParmVarDeclBits.
getNextBit();
1718 unsigned scopeDepth = ParmVarDeclBits.
getNextBits(7);
1719 unsigned declQualifier = ParmVarDeclBits.
getNextBits(7);
1720 if (isObjCMethodParam) {
1721 assert(scopeDepth == 0);
1734 PD->ExplicitObjectParameterIntroducerLoc =
Record.readSourceLocation();
1742 auto **BDs = DD->getTrailingObjects<
BindingDecl *>();
1743 for (
unsigned I = 0; I != DD->NumBindings; ++I) {
1744 BDs[I] = readDeclAs<BindingDecl>();
1745 BDs[I]->setDecomposedDecl(DD);
1751 BD->Binding =
Record.readExpr();
1762 D->Statement =
Record.readStmt();
1769 unsigned NumParams =
Record.readInt();
1771 Params.reserve(NumParams);
1772 for (
unsigned I = 0; I != NumParams; ++I)
1773 Params.push_back(readDeclAs<ParmVarDecl>());
1782 bool capturesCXXThis =
Record.readInt();
1783 unsigned numCaptures =
Record.readInt();
1785 captures.reserve(numCaptures);
1786 for (
unsigned i = 0; i != numCaptures; ++i) {
1787 auto *
decl = readDeclAs<VarDecl>();
1788 unsigned flags =
Record.readInt();
1789 bool byRef = (flags & 1);
1790 bool nested = (flags & 2);
1791 Expr *copyExpr = ((flags & 4) ?
Record.readExpr() :
nullptr);
1800 unsigned ContextParamPos =
Record.readInt();
1803 for (
unsigned I = 0; I < CD->NumParams; ++I) {
1804 if (I != ContextParamPos)
1805 CD->
setParam(I, readDeclAs<ImplicitParamDecl>());
1814 D->setExternLoc(readSourceLocation());
1815 D->setRBraceLoc(readSourceLocation());
1820 D->RBraceLoc = readSourceLocation();
1825 D->setLocStart(readSourceLocation());
1835 D->LocStart = readSourceLocation();
1836 D->RBraceLoc = readSourceLocation();
1843 if (Redecl.getFirstID() == ThisDeclID)
1844 AnonNamespace = readDeclID();
1848 if (AnonNamespace.
isValid()) {
1852 auto *Anon = cast<NamespaceDecl>(Reader.
GetDecl(AnonNamespace));
1854 D->setAnonymousNamespace(Anon);
1860 uint64_t LexicalOffset = 0;
1861 uint64_t VisibleOffset = 0;
1862 uint64_t ModuleLocalOffset = 0;
1863 uint64_t TULocalOffset = 0;
1866 D->IsCBuffer =
Record.readBool();
1867 D->KwLoc = readSourceLocation();
1868 D->LBraceLoc = readSourceLocation();
1869 D->RBraceLoc = readSourceLocation();
1875 D->NamespaceLoc = readSourceLocation();
1876 D->IdentLoc = readSourceLocation();
1877 D->QualifierLoc =
Record.readNestedNameSpecifierLoc();
1878 D->Namespace = readDeclAs<NamedDecl>();
1884 D->setUsingLoc(readSourceLocation());
1885 D->QualifierLoc =
Record.readNestedNameSpecifierLoc();
1886 D->DNLoc =
Record.readDeclarationNameLoc(
D->getDeclName());
1887 D->FirstUsingShadow.setPointer(readDeclAs<UsingShadowDecl>());
1888 D->setTypename(
Record.readInt());
1889 if (
auto *Pattern = readDeclAs<NamedDecl>())
1896 D->setUsingLoc(readSourceLocation());
1897 D->setEnumLoc(readSourceLocation());
1898 D->setEnumType(
Record.readTypeSourceInfo());
1899 D->FirstUsingShadow.setPointer(readDeclAs<UsingShadowDecl>());
1900 if (
auto *Pattern = readDeclAs<UsingEnumDecl>())
1907 D->InstantiatedFrom = readDeclAs<NamedDecl>();
1908 auto **Expansions =
D->getTrailingObjects<
NamedDecl *>();
1909 for (
unsigned I = 0; I !=
D->NumExpansions; ++I)
1910 Expansions[I] = readDeclAs<NamedDecl>();
1917 D->Underlying = readDeclAs<NamedDecl>();
1919 D->UsingOrNextShadow = readDeclAs<NamedDecl>();
1920 auto *Pattern = readDeclAs<UsingShadowDecl>();
1929 D->NominatedBaseClassShadowDecl = readDeclAs<ConstructorUsingShadowDecl>();
1930 D->ConstructedBaseClassShadowDecl = readDeclAs<ConstructorUsingShadowDecl>();
1931 D->IsVirtual =
Record.readInt();
1936 D->UsingLoc = readSourceLocation();
1937 D->NamespaceLoc = readSourceLocation();
1938 D->QualifierLoc =
Record.readNestedNameSpecifierLoc();
1939 D->NominatedNamespace = readDeclAs<NamedDecl>();
1940 D->CommonAncestor = readDeclAs<DeclContext>();
1945 D->setUsingLoc(readSourceLocation());
1946 D->QualifierLoc =
Record.readNestedNameSpecifierLoc();
1947 D->DNLoc =
Record.readDeclarationNameLoc(
D->getDeclName());
1948 D->EllipsisLoc = readSourceLocation();
1955 D->TypenameLocation = readSourceLocation();
1956 D->QualifierLoc =
Record.readNestedNameSpecifierLoc();
1957 D->EllipsisLoc = readSourceLocation();
1966void ASTDeclReader::ReadCXXDefinitionData(
1968 Decl *LambdaContext,
unsigned IndexInLambdaContext) {
1972#define FIELD(Name, Width, Merge) \
1973 if (!CXXRecordDeclBits.canGetNextNBits(Width)) \
1974 CXXRecordDeclBits.updateValue(Record.readInt()); \
1975 Data.Name = CXXRecordDeclBits.getNextBits(Width);
1977#include "clang/AST/CXXRecordDeclDefinitionBits.def"
1982 Data.HasODRHash =
true;
1985 Reader.DefinitionSource[
D] =
1986 Loc.F->Kind == ModuleKind::MK_MainFile ||
1991 Data.ComputedVisibleConversions =
Record.readInt();
1992 if (
Data.ComputedVisibleConversions)
1993 Record.readUnresolvedSet(
Data.VisibleConversions);
1994 assert(
Data.Definition &&
"Data.Definition should be already set!");
1996 if (!
Data.IsLambda) {
1997 assert(!LambdaContext && !IndexInLambdaContext &&
1998 "given lambda context for non-lambda");
2002 Data.Bases = ReadGlobalOffset();
2006 Data.VBases = ReadGlobalOffset();
2012 auto &Lambda =
static_cast<CXXRecordDecl::LambdaDefinitionData &
>(
Data);
2015 Lambda.DependencyKind = LambdaBits.getNextBits(2);
2016 Lambda.IsGenericLambda = LambdaBits.getNextBit();
2017 Lambda.CaptureDefault = LambdaBits.getNextBits(2);
2018 Lambda.NumCaptures = LambdaBits.getNextBits(15);
2019 Lambda.HasKnownInternalLinkage = LambdaBits.getNextBit();
2021 Lambda.NumExplicitCaptures =
Record.readInt();
2022 Lambda.ManglingNumber =
Record.readInt();
2023 if (
unsigned DeviceManglingNumber =
Record.readInt())
2024 Reader.
getContext().DeviceLambdaManglingNumbers[
D] = DeviceManglingNumber;
2025 Lambda.IndexInContext = IndexInLambdaContext;
2026 Lambda.ContextDecl = LambdaContext;
2028 if (Lambda.NumCaptures) {
2030 Lambda.NumCaptures);
2031 Lambda.AddCaptureList(Reader.
getContext(), ToCapture);
2033 Lambda.MethodTyInfo = readTypeSourceInfo();
2034 for (
unsigned I = 0, N = Lambda.NumCaptures; I != N; ++I) {
2037 bool IsImplicit = CaptureBits.getNextBit();
2050 auto *Var = readDeclAs<ValueDecl>();
2052 new (ToCapture)
Capture(
Loc, IsImplicit,
Kind, Var, EllipsisLoc);
2061 CXXRecordDecl *
D,
struct CXXRecordDecl::DefinitionData &&MergeDD) {
2062 assert(
D->DefinitionData &&
2063 "merging class definition into non-definition");
2064 auto &DD = *
D->DefinitionData;
2066 if (DD.Definition != MergeDD.Definition) {
2068 Reader.MergedDeclContexts.insert(std::make_pair(MergeDD.Definition,
2070 Reader.PendingDefinitions.erase(MergeDD.Definition);
2071 MergeDD.Definition->demoteThisDefinitionToDeclaration();
2073 assert(!Reader.Lookups.contains(MergeDD.Definition) &&
2074 "already loaded pending lookups for merged definition");
2077 auto PFDI = Reader.PendingFakeDefinitionData.find(&DD);
2078 if (PFDI != Reader.PendingFakeDefinitionData.end() &&
2079 PFDI->second == ASTReader::PendingFakeDefinitionKind::Fake) {
2082 assert(!DD.IsLambda && !MergeDD.IsLambda &&
"faked up lambda definition?");
2083 PFDI->second = ASTReader::PendingFakeDefinitionKind::FakeLoaded;
2087 auto *Def = DD.Definition;
2088 DD = std::move(MergeDD);
2089 DD.Definition = Def;
2093 bool DetectedOdrViolation =
false;
2095 #define FIELD(Name, Width, Merge) Merge(Name)
2096 #define MERGE_OR(Field) DD.Field |= MergeDD.Field;
2097 #define NO_MERGE(Field) \
2098 DetectedOdrViolation |= DD.Field != MergeDD.Field; \
2100 #include "clang/AST/CXXRecordDeclDefinitionBits.def"
2105 if (DD.NumBases != MergeDD.NumBases || DD.NumVBases != MergeDD.NumVBases)
2106 DetectedOdrViolation =
true;
2112 if (MergeDD.ComputedVisibleConversions && !DD.ComputedVisibleConversions) {
2113 DD.VisibleConversions = std::move(MergeDD.VisibleConversions);
2114 DD.ComputedVisibleConversions =
true;
2121 auto &Lambda1 =
static_cast<CXXRecordDecl::LambdaDefinitionData &
>(DD);
2122 auto &Lambda2 =
static_cast<CXXRecordDecl::LambdaDefinitionData &
>(MergeDD);
2123 DetectedOdrViolation |= Lambda1.DependencyKind != Lambda2.DependencyKind;
2124 DetectedOdrViolation |= Lambda1.IsGenericLambda != Lambda2.IsGenericLambda;
2125 DetectedOdrViolation |= Lambda1.CaptureDefault != Lambda2.CaptureDefault;
2126 DetectedOdrViolation |= Lambda1.NumCaptures != Lambda2.NumCaptures;
2127 DetectedOdrViolation |=
2128 Lambda1.NumExplicitCaptures != Lambda2.NumExplicitCaptures;
2129 DetectedOdrViolation |=
2130 Lambda1.HasKnownInternalLinkage != Lambda2.HasKnownInternalLinkage;
2131 DetectedOdrViolation |= Lambda1.ManglingNumber != Lambda2.ManglingNumber;
2133 if (Lambda1.NumCaptures && Lambda1.NumCaptures == Lambda2.NumCaptures) {
2134 for (
unsigned I = 0, N = Lambda1.NumCaptures; I != N; ++I) {
2139 Lambda1.AddCaptureList(Reader.
getContext(), Lambda2.Captures.front());
2147 if (
D->getODRHash() != MergeDD.ODRHash) {
2148 DetectedOdrViolation =
true;
2151 if (DetectedOdrViolation)
2152 Reader.PendingOdrMergeFailures[DD.Definition].push_back(
2153 {MergeDD.Definition, &MergeDD});
2157 Decl *LambdaContext,
2158 unsigned IndexInLambdaContext) {
2159 struct CXXRecordDecl::DefinitionData *DD;
2164 bool IsLambda =
Record.readInt();
2165 assert(!(IsLambda &&
Update) &&
2166 "lambda definition should not be added by update record");
2168 DD =
new (
C) CXXRecordDecl::LambdaDefinitionData(
2171 DD =
new (
C)
struct CXXRecordDecl::DefinitionData(
D);
2177 if (!Canon->DefinitionData)
2178 Canon->DefinitionData = DD;
2179 D->DefinitionData = Canon->DefinitionData;
2180 ReadCXXDefinitionData(*DD,
D, LambdaContext, IndexInLambdaContext);
2183 D->setCompleteDefinition(
true);
2188 if (Canon->DefinitionData != DD) {
2197 Reader.PendingDefinitions.insert(
D);
2206 CXXRecNotTemplate = 0,
2208 CXXRecMemberSpecialization,
2212 Decl *LambdaContext =
nullptr;
2213 unsigned IndexInLambdaContext = 0;
2215 switch ((CXXRecKind)
Record.readInt()) {
2216 case CXXRecNotTemplate:
2218 if (!isa<ClassTemplateSpecializationDecl>(
D))
2221 case CXXRecTemplate: {
2223 auto *Template = readDeclAs<ClassTemplateDecl>();
2224 D->TemplateOrInstantiation = Template;
2225 if (!Template->getTemplatedDecl()) {
2236 case CXXRecMemberSpecialization: {
2237 auto *RD = readDeclAs<CXXRecordDecl>();
2242 D->TemplateOrInstantiation = MSI;
2247 LambdaContext = readDecl();
2249 IndexInLambdaContext =
Record.readInt();
2251 MergeImpl.
mergeLambda(
D, Redecl, *LambdaContext, IndexInLambdaContext);
2260 bool WasDefinition =
Record.readInt();
2262 ReadCXXRecordDefinition(
D,
false, LambdaContext,
2263 IndexInLambdaContext);
2270 if (WasDefinition) {
2272 if (KeyFn.
isValid() &&
D->isCompleteDefinition())
2283 D->setExplicitSpecifier(
Record.readExplicitSpec());
2284 D->Ctor = readDeclAs<CXXConstructorDecl>();
2286 D->setDeductionCandidateKind(
2293 unsigned NumOverridenMethods =
Record.readInt();
2295 while (NumOverridenMethods--) {
2298 if (
auto *MD = readDeclAs<CXXMethodDecl>())
2304 Record.skipInts(NumOverridenMethods);
2311 D->setExplicitSpecifier(
Record.readExplicitSpec());
2312 if (
D->isInheritingConstructor()) {
2313 auto *Shadow = readDeclAs<ConstructorUsingShadowDecl>();
2314 auto *Ctor = readDeclAs<CXXConstructorDecl>();
2325 if (
auto *OperatorDelete = readDeclAs<FunctionDecl>()) {
2327 auto *ThisArg =
Record.readExpr();
2329 if (!Canon->OperatorDelete) {
2330 Canon->OperatorDelete = OperatorDelete;
2331 Canon->OperatorDeleteThisArg = ThisArg;
2337 D->setExplicitSpecifier(
Record.readExplicitSpec());
2343 D->ImportedModule = readModule();
2344 D->setImportComplete(
Record.readInt());
2346 for (
unsigned I = 0, N =
Record.back(); I != N; ++I)
2347 StoredLocs[I] = readSourceLocation();
2353 D->setColonLoc(readSourceLocation());
2359 D->Friend = readDeclAs<NamedDecl>();
2361 D->Friend = readTypeSourceInfo();
2362 for (
unsigned i = 0; i !=
D->NumTPLists; ++i)
2364 Record.readTemplateParameterList();
2366 D->UnsupportedFriend = (
Record.readInt() != 0);
2367 D->FriendLoc = readSourceLocation();
2368 D->EllipsisLoc = readSourceLocation();
2373 unsigned NumParams =
Record.readInt();
2374 D->NumParams = NumParams;
2376 for (
unsigned i = 0; i != NumParams; ++i)
2377 D->Params[i] =
Record.readTemplateParameterList();
2379 D->Friend = readDeclAs<NamedDecl>();
2381 D->Friend = readTypeSourceInfo();
2382 D->FriendLoc = readSourceLocation();
2388 assert(!
D->TemplateParams &&
"TemplateParams already set!");
2389 D->TemplateParams =
Record.readTemplateParameterList();
2390 D->init(readDeclAs<NamedDecl>());
2395 D->ConstraintExpr =
Record.readExpr();
2405 for (
unsigned I = 0; I <
D->NumTemplateArgs; ++I)
2406 Args.push_back(
Record.readTemplateArgument(
true));
2407 D->setTemplateArguments(Args);
2414 llvm::BitstreamCursor &DeclsCursor,
2416 uint64_t Offset = ReadLocalOffset();
2418 Reader.ReadSpecializations(M, DeclsCursor, Offset,
D, IsPartial);
2432 Reader.PendingDefinitions.insert(CanonD);
2438 if (ThisDeclID == Redecl.getFirstID()) {
2439 if (
auto *RTD = readDeclAs<RedeclarableTemplateDecl>()) {
2440 assert(RTD->getKind() ==
D->
getKind() &&
2441 "InstantiatedFromMemberTemplate kind mismatch");
2442 D->setInstantiatedFromMemberTemplate(RTD);
2444 D->setMemberSpecialization();
2458 if (ThisDeclID == Redecl.getFirstID()) {
2465 if (
D->getTemplatedDecl()->TemplateOrInstantiation) {
2470 D->getTemplatedDecl(),
D->getInjectedClassNameSpecialization());
2475 llvm_unreachable(
"BuiltinTemplates are not serialized");
2485 if (ThisDeclID == Redecl.getFirstID()) {
2498 if (
Decl *InstD = readDecl()) {
2499 if (
auto *CTD = dyn_cast<ClassTemplateDecl>(InstD)) {
2500 D->SpecializedTemplate = CTD;
2503 Record.readTemplateArgumentList(TemplArgs);
2508 SpecializedPartialSpecialization();
2509 PS->PartialSpecialization
2510 = cast<ClassTemplatePartialSpecializationDecl>(InstD);
2511 PS->TemplateArgs = ArgList;
2512 D->SpecializedTemplate = PS;
2517 Record.readTemplateArgumentList(TemplArgs,
true);
2519 D->PointOfInstantiation = readSourceLocation();
2522 bool writtenAsCanonicalDecl =
Record.readInt();
2523 if (writtenAsCanonicalDecl) {
2524 auto *CanonPattern = readDeclAs<ClassTemplateDecl>();
2528 if (
auto *Partial = dyn_cast<ClassTemplatePartialSpecializationDecl>(
D)) {
2529 CanonSpec = CanonPattern->getCommonPtr()->PartialSpecializations
2530 .GetOrInsertNode(Partial);
2533 CanonPattern->getCommonPtr()->Specializations.GetOrInsertNode(
D);
2536 if (CanonSpec !=
D) {
2541 if (
auto *DDD =
D->DefinitionData) {
2542 if (CanonSpec->DefinitionData)
2545 CanonSpec->DefinitionData =
D->DefinitionData;
2547 D->DefinitionData = CanonSpec->DefinitionData;
2556 ExplicitInfo->TemplateKeywordLoc = readSourceLocation();
2557 D->ExplicitInfo = ExplicitInfo;
2561 D->setTemplateArgsAsWritten(
Record.readASTTemplateArgumentListInfo());
2571 D->TemplateParams = Params;
2576 if (ThisDeclID == Redecl.getFirstID()) {
2577 D->InstantiatedFromMember.setPointer(
2578 readDeclAs<ClassTemplatePartialSpecializationDecl>());
2579 D->InstantiatedFromMember.setInt(
Record.readInt());
2586 if (ThisDeclID == Redecl.getFirstID()) {
2600 if (
Decl *InstD = readDecl()) {
2601 if (
auto *VTD = dyn_cast<VarTemplateDecl>(InstD)) {
2602 D->SpecializedTemplate = VTD;
2605 Record.readTemplateArgumentList(TemplArgs);
2610 VarTemplateSpecializationDecl::SpecializedPartialSpecialization();
2611 PS->PartialSpecialization =
2612 cast<VarTemplatePartialSpecializationDecl>(InstD);
2613 PS->TemplateArgs = ArgList;
2614 D->SpecializedTemplate = PS;
2622 ExplicitInfo->TemplateKeywordLoc = readSourceLocation();
2623 D->ExplicitInfo = ExplicitInfo;
2627 D->setTemplateArgsAsWritten(
Record.readASTTemplateArgumentListInfo());
2630 Record.readTemplateArgumentList(TemplArgs,
true);
2632 D->PointOfInstantiation = readSourceLocation();
2634 D->IsCompleteDefinition =
Record.readInt();
2638 bool writtenAsCanonicalDecl =
Record.readInt();
2639 if (writtenAsCanonicalDecl) {
2640 auto *CanonPattern = readDeclAs<VarTemplateDecl>();
2643 if (
auto *Partial = dyn_cast<VarTemplatePartialSpecializationDecl>(
D)) {
2644 CanonSpec = CanonPattern->getCommonPtr()
2645 ->PartialSpecializations.GetOrInsertNode(Partial);
2648 CanonPattern->getCommonPtr()->Specializations.GetOrInsertNode(
D);
2667 D->TemplateParams = Params;
2672 if (ThisDeclID == Redecl.getFirstID()) {
2673 D->InstantiatedFromMember.setPointer(
2674 readDeclAs<VarTemplatePartialSpecializationDecl>());
2675 D->InstantiatedFromMember.setInt(
Record.readInt());
2682 D->setDeclaredWithTypename(
Record.readInt());
2684 bool TypeConstraintInitialized =
D->hasTypeConstraint() &&
Record.readBool();
2685 if (TypeConstraintInitialized) {
2688 CR =
Record.readConceptReference();
2689 Expr *ImmediatelyDeclaredConstraint =
Record.readExpr();
2691 D->setTypeConstraint(CR, ImmediatelyDeclaredConstraint);
2692 if ((
D->ExpandedParameterPack =
Record.readInt()))
2693 D->NumExpanded =
Record.readInt();
2698 Record.readTemplateArgumentLoc());
2704 D->setDepth(
Record.readInt());
2705 D->setPosition(
Record.readInt());
2706 if (
D->hasPlaceholderTypeConstraint())
2707 D->setPlaceholderTypeConstraint(
Record.readExpr());
2708 if (
D->isExpandedParameterPack()) {
2709 auto TypesAndInfos =
2710 D->getTrailingObjects<std::pair<QualType, TypeSourceInfo *>>();
2711 for (
unsigned I = 0, N =
D->getNumExpansionTypes(); I != N; ++I) {
2713 TypesAndInfos[I].second = readTypeSourceInfo();
2717 D->ParameterPack =
Record.readInt();
2720 Record.readTemplateArgumentLoc());
2726 D->setDeclaredWithTypename(
Record.readBool());
2728 D->setDepth(
Record.readInt());
2729 D->setPosition(
Record.readInt());
2730 if (
D->isExpandedParameterPack()) {
2732 for (
unsigned I = 0, N =
D->getNumExpansionTemplateParameters();
2734 Data[I] =
Record.readTemplateParameterList();
2737 D->ParameterPack =
Record.readInt();
2740 Record.readTemplateArgumentLoc());
2751 D->AssertExprAndFailed.setPointer(
Record.readExpr());
2752 D->AssertExprAndFailed.setInt(
Record.readInt());
2753 D->Message = cast_or_null<StringLiteral>(
Record.readExpr());
2754 D->RParenLoc = readSourceLocation();
2764 D->ExtendingDecl = readDeclAs<ValueDecl>();
2765 D->ExprWithTemporary =
Record.readStmt();
2770 D->ManglingNumber =
Record.readInt();
2775 uint64_t &VisibleOffset,
2776 uint64_t &ModuleLocalOffset,
2777 uint64_t &TULocalOffset) {
2778 LexicalOffset = ReadLocalOffset();
2779 VisibleOffset = ReadLocalOffset();
2780 ModuleLocalOffset = ReadLocalOffset();
2781 TULocalOffset = ReadLocalOffset();
2784template <
typename T>
2787 Decl *MergeWith =
nullptr;
2789 bool IsKeyDecl = ThisDeclID == FirstDeclID;
2790 bool IsFirstLocalDecl =
false;
2792 uint64_t RedeclOffset = 0;
2797 FirstDeclID = ThisDeclID;
2799 IsFirstLocalDecl =
true;
2800 }
else if (
unsigned N =
Record.readInt()) {
2804 IsFirstLocalDecl =
true;
2811 for (
unsigned I = 0; I != N - 1; ++I)
2812 MergeWith = readDecl();
2814 RedeclOffset = ReadLocalOffset();
2821 auto *FirstDecl = cast_or_null<T>(Reader.
GetDecl(FirstDeclID));
2822 if (FirstDecl !=
D) {
2831 auto *DAsT =
static_cast<T *
>(
D);
2837 if (IsFirstLocalDecl)
2838 Reader.PendingDeclChains.push_back(std::make_pair(DAsT, RedeclOffset));
2840 return RedeclarableResult(MergeWith, FirstDeclID, IsKeyDecl);
2845template <
typename T>
2847 RedeclarableResult &Redecl) {
2856 auto *
D =
static_cast<T *
>(DBase);
2858 if (
auto *Existing = Redecl.getKnownMergeTarget())
2861 else if (FindExistingResult ExistingRes = findExisting(
D))
2862 if (
T *Existing = ExistingRes)
2873 Decl &Context,
unsigned IndexInContext) {
2882 if (
auto *Existing = Redecl.getKnownMergeTarget())
2888 NamedDecl *&Slot = Reader.LambdaDeclarationsForMerging[{
2889 Context.getCanonicalDecl(), IndexInContext}];
2897 RedeclarableResult &Redecl) {
2910 llvm_unreachable(
"bad assert_cast");
2918 auto *DPattern =
D->getTemplatedDecl();
2920 RedeclarableResult
Result(
2922 DPattern->getCanonicalDecl()->getGlobalID(), IsKeyDecl);
2924 if (
auto *DClass = dyn_cast<CXXRecordDecl>(DPattern)) {
2927 auto *ExistingClass =
2928 cast<CXXRecordDecl>(ExistingPattern)->getCanonicalDecl();
2929 if (
auto *DDD = DClass->DefinitionData) {
2930 if (ExistingClass->DefinitionData) {
2933 ExistingClass->DefinitionData = DClass->DefinitionData;
2936 Reader.PendingDefinitions.insert(DClass);
2939 DClass->DefinitionData = ExistingClass->DefinitionData;
2944 if (
auto *DFunction = dyn_cast<FunctionDecl>(DPattern))
2947 if (
auto *DVar = dyn_cast<VarDecl>(DPattern))
2949 if (
auto *DAlias = dyn_cast<TypeAliasDecl>(DPattern))
2952 llvm_unreachable(
"merged an unknown kind of redeclarable template");
2957template <
typename T>
2960 auto *
D =
static_cast<T *
>(DBase);
2961 T *ExistingCanon = Existing->getCanonicalDecl();
2963 if (ExistingCanon != DCanon) {
2968 D->First = ExistingCanon;
2969 ExistingCanon->Used |=
D->Used;
2972 bool IsKeyDecl = KeyDeclID.
isValid();
2975 if (
auto *DTemplate = dyn_cast<RedeclarableTemplateDecl>(
D))
2977 DTemplate, assert_cast<RedeclarableTemplateDecl *>(ExistingCanon),
2982 Reader.KeyDecls[ExistingCanon].push_back(KeyDeclID);
2995 if (isa<EnumConstantDecl, FieldDecl, IndirectFieldDecl>(ND))
3010 Reader.LETemporaryForMerging[std::make_pair(
3037 if (FindExistingResult ExistingRes = findExisting(
static_cast<T*
>(
D)))
3038 if (
T *Existing = ExistingRes)
3040 Existing->getCanonicalDecl());
3044 Record.readOMPChildren(
D->Data);
3049 Record.readOMPChildren(
D->Data);
3054 Record.readOMPChildren(
D->Data);
3063 D->setCombinerData(In, Out);
3065 D->setCombiner(Combiner);
3068 D->setInitializerData(Orig, Priv);
3071 D->setInitializer(
Init, IK);
3076 Record.readOMPChildren(
D->Data);
3078 D->VarName =
Record.readDeclarationName();
3097 uint64_t readInt() {
3103 bool readBool() {
return Reader.
readBool(); }
3117 std::string readString() {
3129 VersionTuple readVersionTuple() {
3133 void skipInt() { Reader.
skipInts(1); }
3135 void skipInts(
unsigned N) { Reader.
skipInts(N); }
3137 unsigned getCurrentIdx() {
return Reader.
getIdx(); }
3141 template <
typename T>
T *readDeclAs() {
return Reader.
readDeclAs<
T>(); }
3147 AttrReader
Record(*
this);
3156 Attr *New =
nullptr;
3166 unsigned ParsedKind =
Record.readInt();
3167 unsigned Syntax =
Record.readInt();
3168 unsigned SpellingIndex =
Record.readInt();
3169 bool IsAlignas = (ParsedKind == AttributeCommonInfo::AT_Aligned &&
3171 SpellingIndex == AlignedAttr::Keyword_alignas);
3172 bool IsRegularKeywordAttribute =
Record.readBool();
3177 IsAlignas, IsRegularKeywordAttribute});
3179#include "clang/Serialization/AttrPCHRead.inc"
3181 assert(New &&
"Unable to decode attribute?");
3189 for (
unsigned I = 0,
E =
readInt(); I !=
E; ++I)
3198 AttrReader
Record(*
this);
3199 unsigned SkipCount =
Record.peekInts(1);
3202 Reader->PendingDeferredAttributes.push_back({
Record.getCurrentIdx(),
D});
3217inline void ASTReader::LoadedDecl(
unsigned Index,
Decl *
D) {
3218 assert(!DeclsLoaded[Index] &&
"Decl loaded twice?");
3219 DeclsLoaded[Index] =
D;
3228bool ASTReader::isConsumerInterestedIn(
Decl *
D) {
3247 if (
const auto *Var = dyn_cast<VarDecl>(
D))
3248 return Var->isFileVarDecl() &&
3250 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(Var));
3251 if (
const auto *
Func = dyn_cast<FunctionDecl>(
D))
3252 return Func->doesThisDeclarationHaveABody() || PendingBodies.count(
D);
3262ASTReader::RecordLocation ASTReader::DeclCursorForID(
GlobalDeclID ID,
3266 unsigned LocalDeclIndex =
ID.getLocalDeclIndex();
3272ASTReader::RecordLocation ASTReader::getLocalBitOffset(uint64_t GlobalOffset) {
3273 auto I = GlobalBitOffsetsMap.find(GlobalOffset);
3275 assert(I != GlobalBitOffsetsMap.end() &&
"Corrupted global bit offsets map");
3276 return RecordLocation(I->second, GlobalOffset - I->second->GlobalBitOffset);
3284ASTDeclReader::getOrFakePrimaryClassDefinition(
ASTReader &Reader,
3287 auto *DD = RD->DefinitionData;
3296 DD =
new (Reader.
getContext())
struct CXXRecordDecl::DefinitionData(RD);
3298 RD->DefinitionData = DD;
3302 Reader.PendingFakeDefinitionData.insert(
3303 std::make_pair(DD, ASTReader::PendingFakeDefinitionKind::Fake));
3306 return DD->Definition;
3313 if (
auto *ND = dyn_cast<NamespaceDecl>(DC))
3314 return ND->getFirstDecl();
3316 if (
auto *RD = dyn_cast<CXXRecordDecl>(DC))
3317 return getOrFakePrimaryClassDefinition(Reader, RD);
3319 if (
auto *RD = dyn_cast<RecordDecl>(DC))
3322 if (
auto *ED = dyn_cast<EnumDecl>(DC))
3325 if (
auto *OID = dyn_cast<ObjCInterfaceDecl>(DC))
3330 if (
auto *TU = dyn_cast<TranslationUnitDecl>(DC))
3336ASTDeclReader::FindExistingResult::~FindExistingResult() {
3339 if (TypedefNameForLinkage) {
3341 Reader.ImportedTypedefNamesForLinkage.insert(
3342 std::make_pair(std::make_pair(DC, TypedefNameForLinkage), New));
3346 if (!AddResult || Existing)
3352 setAnonymousDeclForMerging(Reader, New->getLexicalDeclContext(),
3353 AnonymousDeclNumber, New);
3357 Reader.PendingFakeLookupResults[Name.getAsIdentifierInfo()]
3359 }
else if (
DeclContext *MergeDC = getPrimaryContextForMerging(Reader, DC)) {
3362 MergeDC->makeDeclVisibleInContextImpl(New,
true);
3370 bool IsTypedefNameForLinkage) {
3371 if (!IsTypedefNameForLinkage)
3377 if (
Found->isFromASTFile())
3380 if (
auto *TND = dyn_cast<TypedefNameDecl>(
Found))
3381 return TND->getAnonDeclWithTypedefName(
true);
3390ASTDeclReader::getPrimaryDCForAnonymousDecl(
DeclContext *LexicalDC) {
3392 if (
auto *RD = dyn_cast<CXXRecordDecl>(LexicalDC)) {
3394 return DD ? DD->Definition :
nullptr;
3395 }
else if (
auto *OID = dyn_cast<ObjCInterfaceDecl>(LexicalDC)) {
3396 return OID->getCanonicalDecl()->getDefinition();
3403 if (
auto *FD = dyn_cast<FunctionDecl>(
D))
3404 if (FD->isThisDeclarationADefinition())
3406 if (
auto *MD = dyn_cast<ObjCMethodDecl>(
D))
3407 if (MD->isThisDeclarationADefinition())
3409 if (
auto *RD = dyn_cast<RecordDecl>(
D))
3426 auto &
Previous = Reader.AnonymousDeclarationsForMerging[CanonDC];
3432 auto *PrimaryDC = getPrimaryDCForAnonymousDecl(DC);
3433 if (PrimaryDC && !cast<Decl>(PrimaryDC)->isFromASTFile()) {
3445void ASTDeclReader::setAnonymousDeclForMerging(
ASTReader &Reader,
3448 auto *CanonDC = cast<Decl>(DC)->getCanonicalDecl();
3450 auto &
Previous = Reader.AnonymousDeclarationsForMerging[CanonDC];
3457ASTDeclReader::FindExistingResult ASTDeclReader::findExisting(
NamedDecl *
D) {
3464 FindExistingResult
Result(Reader,
D,
nullptr,
3465 AnonymousDeclNumber, TypedefNameForLinkage);
3472 if (TypedefNameForLinkage) {
3473 auto It = Reader.ImportedTypedefNamesForLinkage.find(
3474 std::make_pair(DC, TypedefNameForLinkage));
3475 if (It != Reader.ImportedTypedefNamesForLinkage.end())
3476 if (
C.isSameEntity(It->second,
D))
3477 return FindExistingResult(Reader,
D, It->second, AnonymousDeclNumber,
3478 TypedefNameForLinkage);
3486 if (
auto *Existing = getAnonymousDeclForMerging(
3488 if (
C.isSameEntity(Existing,
D))
3489 return FindExistingResult(Reader,
D, Existing, AnonymousDeclNumber,
3490 TypedefNameForLinkage);
3497 class UpToDateIdentifierRAII {
3499 bool WasOutToDate =
false;
3510 ~UpToDateIdentifierRAII() {
3514 } UpToDate(Name.getAsIdentifierInfo());
3517 IEnd = IdResolver.
end();
3520 if (
C.isSameEntity(Existing,
D))
3521 return FindExistingResult(Reader,
D, Existing, AnonymousDeclNumber,
3522 TypedefNameForLinkage);
3524 }
else if (
DeclContext *MergeDC = getPrimaryContextForMerging(Reader, DC)) {
3528 if (
C.isSameEntity(Existing,
D))
3529 return FindExistingResult(Reader,
D, Existing, AnonymousDeclNumber,
3530 TypedefNameForLinkage);
3534 return FindExistingResult(Reader);
3546 if (MergedDCIt != Reader.MergedDeclContexts.end() &&
3549 Reader.PendingOdrMergeChecks.push_back(
D);
3551 return FindExistingResult(Reader,
D,
nullptr,
3552 AnonymousDeclNumber, TypedefNameForLinkage);
3555template<
typename DeclT>
3557 return D->RedeclLink.getLatestNotUpdated();
3561 llvm_unreachable(
"getMostRecentDecl on non-redeclarable declaration");
3568#define ABSTRACT_DECL(TYPE)
3569#define DECL(TYPE, BASE) \
3571 return getMostRecentDeclImpl(cast<TYPE##Decl>(D));
3572#include "clang/AST/DeclNodes.inc"
3574 llvm_unreachable(
"unknown decl kind");
3577Decl *ASTReader::getMostRecentExistingDecl(
Decl *
D) {
3585 const auto *IA =
Previous->getAttr<MSInheritanceAttr>();
3587 if (IA && !
D->
hasAttr<MSInheritanceAttr>()) {
3588 NewAttr = cast<InheritableAttr>(IA->clone(Context));
3593 const auto *AA =
Previous->getAttr<AvailabilityAttr>();
3594 if (AA && !
D->
hasAttr<AvailabilityAttr>()) {
3595 NewAttr = AA->
clone(Context);
3602template<
typename DeclT>
3606 D->RedeclLink.setPrevious(cast<DeclT>(
Previous));
3607 D->First = cast<DeclT>(
Previous)->First;
3616 auto *VD =
static_cast<VarDecl *
>(
D);
3617 auto *PrevVD = cast<VarDecl>(
Previous);
3618 D->RedeclLink.setPrevious(PrevVD);
3619 D->First = PrevVD->First;
3628 VD->demoteThisDefinitionToDeclaration();
3645 auto *PrevFD = cast<FunctionDecl>(
Previous);
3647 FD->RedeclLink.setPrevious(PrevFD);
3648 FD->First = PrevFD->First;
3652 if (PrevFD->isInlined() != FD->isInlined()) {
3668 FD->setImplicitlyInline(
true);
3673 if (FPT && PrevFPT) {
3677 bool WasUnresolved =
3679 if (IsUnresolved != WasUnresolved)
3680 Reader.PendingExceptionSpecUpdates.insert(
3681 {Canon, IsUnresolved ? PrevFD : FD});
3687 if (IsUndeduced != WasUndeduced)
3688 Reader.PendingDeducedTypeUpdates.insert(
3689 {cast<FunctionDecl>(Canon),
3690 (IsUndeduced ? PrevFPT : FPT)->getReturnType()});
3697 llvm_unreachable(
"attachPreviousDecl on non-redeclarable declaration");
3702template <
typename ParmDecl>
3705 auto *To = cast<ParmDecl>(ToD);
3706 if (!From->hasDefaultArgument())
3708 To->setInheritedDefaultArgument(Context, From);
3717 assert(FromTP->size() == ToTP->size() &&
"merged mismatched templates?");
3719 for (
unsigned I = 0, N = FromTP->size(); I != N; ++I) {
3720 NamedDecl *FromParam = FromTP->getParam(I);
3723 if (
auto *FTTP = dyn_cast<TemplateTypeParmDecl>(FromParam))
3725 else if (
auto *FNTTP = dyn_cast<NonTypeTemplateParmDecl>(FromParam))
3729 Context, cast<TemplateTemplateParmDecl>(FromParam), ToParam);
3747 if (!isa<VarDecl, FunctionDecl, TagDecl, RedeclarableTemplateDecl>(
Previous))
3755 if (isa<VarTemplateSpecializationDecl>(
Previous))
3757 if (isa<ClassTemplateSpecializationDecl>(
Previous))
3760 Func &&
Func->getTemplateSpecializationInfo())
3777 Reader.PendingWarningForDuplicatedDefsInModuleUnits.push_back(
3787 diag::err_multiple_decl_in_different_modules)
3797#define ABSTRACT_DECL(TYPE)
3798#define DECL(TYPE, BASE) \
3800 attachPreviousDeclImpl(Reader, cast<TYPE##Decl>(D), Previous, Canon); \
3802#include "clang/AST/DeclNodes.inc"
3818 if (
auto *TD = dyn_cast<TemplateDecl>(
D))
3826 mergeInheritableAttributes(Reader,
D,
Previous);
3829template<
typename DeclT>
3831 D->RedeclLink.setLatest(cast<DeclT>(Latest));
3835 llvm_unreachable(
"attachLatestDecl on non-redeclarable declaration");
3839 assert(
D && Latest);
3842#define ABSTRACT_DECL(TYPE)
3843#define DECL(TYPE, BASE) \
3845 attachLatestDeclImpl(cast<TYPE##Decl>(D), Latest); \
3847#include "clang/AST/DeclNodes.inc"
3851template<
typename DeclT>
3853 D->RedeclLink.markIncomplete();
3857 llvm_unreachable(
"markIncompleteDeclChain on non-redeclarable declaration");
3860void ASTReader::markIncompleteDeclChain(
Decl *
D) {
3862#define ABSTRACT_DECL(TYPE)
3863#define DECL(TYPE, BASE) \
3865 ASTDeclReader::markIncompleteDeclChainImpl(cast<TYPE##Decl>(D)); \
3867#include "clang/AST/DeclNodes.inc"
3874 RecordLocation
Loc = DeclCursorForID(ID, DeclLoc);
3875 llvm::BitstreamCursor &DeclsCursor =
Loc.F->DeclsCursor;
3880 ReadingKindTracker ReadingKind(Read_Decl, *
this);
3883 Deserializing ADecl(
this);
3885 auto Fail = [](
const char *what, llvm::Error &&Err) {
3886 llvm::report_fatal_error(Twine(
"ASTReader::readDeclRecord failed ") + what +
3890 if (llvm::Error JumpFailed = DeclsCursor.JumpToBit(
Loc.Offset))
3891 Fail(
"jumping", std::move(JumpFailed));
3896 Fail(
"reading code", MaybeCode.takeError());
3897 unsigned Code = MaybeCode.get();
3903 llvm::report_fatal_error(
3904 Twine(
"ASTReader::readDeclRecord failed reading decl code: ") +
3905 toString(MaybeDeclCode.takeError()));
3907 switch ((
DeclCode)MaybeDeclCode.get()) {
3914 llvm_unreachable(
"Record cannot be de-serialized with readDeclRecord");
4024 bool HasTypeConstraint =
Record.readInt();
4030 bool HasTypeConstraint =
Record.readInt();
4036 bool HasTypeConstraint =
Record.readInt();
4038 Context, ID,
Record.readInt(), HasTypeConstraint);
4127 D = MSGuidDecl::CreateDeserialized(Context, ID);
4130 D = UnnamedGlobalConstantDecl::CreateDeserialized(Context, ID);
4133 D = TemplateParamObjectDecl::CreateDeserialized(Context, ID);
4139 Error(
"attempt to read a C++ base-specifier record as a declaration");
4142 Error(
"attempt to read a C++ ctor initializer record as a declaration");
4151 unsigned NumChildren =
Record.readInt();
4157 unsigned NumClauses =
Record.readInt();
4158 unsigned NumVars =
Record.readInt();
4164 unsigned NumClauses =
Record.readInt();
4173 unsigned NumClauses =
Record.readInt();
4206 assert(
D &&
"Unknown declaration reading AST file");
4207 LoadedDecl(translateGlobalDeclIDToIndex(ID),
D);
4218 if (
auto *DC = dyn_cast<DeclContext>(
D)) {
4224 Reader.VisitDeclContext(DC, LexicalOffset, VisibleOffset, ModuleLocalOffset,
4230 if (!LexicalOffset && !VisibleOffset && !ModuleLocalOffset &&
4231 isa<NamespaceDecl>(
D))
4232 if (
auto Iter = DelayedNamespaceOffsetMap.find(ID);
4233 Iter != DelayedNamespaceOffsetMap.end()) {
4234 LexicalOffset =
Iter->second.LexicalOffset;
4235 VisibleOffset =
Iter->second.VisibleOffset;
4236 ModuleLocalOffset =
Iter->second.ModuleLocalOffset;
4237 TULocalOffset =
Iter->second.TULocalOffset;
4240 if (LexicalOffset &&
4241 ReadLexicalDeclContextStorage(*
Loc.F, DeclsCursor, LexicalOffset, DC))
4243 if (VisibleOffset && ReadVisibleDeclContextStorage(
4244 *
Loc.F, DeclsCursor, VisibleOffset, ID,
4245 VisibleDeclContextStorageKind::GenerallyVisible))
4247 if (ModuleLocalOffset &&
4248 ReadVisibleDeclContextStorage(
4249 *
Loc.F, DeclsCursor, ModuleLocalOffset, ID,
4250 VisibleDeclContextStorageKind::ModuleLocalVisible))
4252 if (TULocalOffset && ReadVisibleDeclContextStorage(
4253 *
Loc.F, DeclsCursor, TULocalOffset, ID,
4254 VisibleDeclContextStorageKind::TULocalVisible))
4260 PendingUpdateRecords.push_back(
4261 PendingUpdateRecord(ID,
D,
true));
4264 if (
auto *
Class = dyn_cast<ObjCInterfaceDecl>(
D))
4267 if (
Class->isThisDeclarationADefinition() ||
4268 PendingDefinitions.count(
Class))
4269 loadObjCCategories(ID,
Class);
4275 PotentiallyInterestingDecls.push_back(
D);
4280void ASTReader::PassInterestingDeclsToConsumer() {
4283 if (PassingDeclsToConsumer)
4288 SaveAndRestore GuardPassingDeclsToConsumer(PassingDeclsToConsumer,
true);
4292 for (
auto ID : EagerlyDeserializedDecls)
4294 EagerlyDeserializedDecls.clear();
4296 auto ConsumingPotentialInterestingDecls = [
this]() {
4297 while (!PotentiallyInterestingDecls.empty()) {
4298 Decl *
D = PotentiallyInterestingDecls.front();
4299 PotentiallyInterestingDecls.pop_front();
4300 if (isConsumerInterestedIn(
D))
4301 PassInterestingDeclToConsumer(
D);
4304 std::deque<Decl *> MaybeInterestingDecls =
4305 std::move(PotentiallyInterestingDecls);
4306 PotentiallyInterestingDecls.clear();
4307 assert(PotentiallyInterestingDecls.empty());
4308 while (!MaybeInterestingDecls.empty()) {
4309 Decl *
D = MaybeInterestingDecls.front();
4310 MaybeInterestingDecls.pop_front();
4316 if (
auto *VD = dyn_cast<VarDecl>(
D);
4317 VD && VD->isFileVarDecl() && !VD->isExternallyVisible())
4319 ConsumingPotentialInterestingDecls();
4320 if (isConsumerInterestedIn(
D))
4321 PassInterestingDeclToConsumer(
D);
4325 ConsumingPotentialInterestingDecls();
4328 auto *RD = cast<CXXRecordDecl>(
GetDecl(ID));
4330 PassVTableToConsumer(RD);
4332 VTablesToEmit.clear();
4335void ASTReader::loadDeclUpdateRecords(PendingUpdateRecord &
Record) {
4341 ProcessingUpdatesRAIIObj ProcessingUpdates(*
this);
4342 DeclUpdateOffsetsMap::iterator UpdI = DeclUpdateOffsets.find(ID);
4344 if (UpdI != DeclUpdateOffsets.end()) {
4345 auto UpdateOffsets = std::move(UpdI->second);
4346 DeclUpdateOffsets.erase(UpdI);
4352 bool WasInteresting =
Record.JustLoaded || isConsumerInterestedIn(
D);
4353 for (
auto &FileAndOffset : UpdateOffsets) {
4355 uint64_t Offset = FileAndOffset.second;
4358 if (llvm::Error JumpFailed =
Cursor.JumpToBit(Offset))
4360 llvm::report_fatal_error(
4361 Twine(
"ASTReader::loadDeclUpdateRecords failed jumping: ") +
4365 llvm::report_fatal_error(
4366 Twine(
"ASTReader::loadDeclUpdateRecords failed reading code: ") +
4368 unsigned Code = MaybeCode.get();
4372 "Expected DECL_UPDATES record!");
4374 llvm::report_fatal_error(
4375 Twine(
"ASTReader::loadDeclUpdateRecords failed reading rec code: ") +
4380 Reader.UpdateDecl(
D);
4384 if (!WasInteresting && isConsumerInterestedIn(
D)) {
4385 PotentiallyInterestingDecls.push_back(
D);
4386 WasInteresting =
true;
4392 if (
auto I = PendingVisibleUpdates.find(ID);
4393 I != PendingVisibleUpdates.end()) {
4394 auto VisibleUpdates = std::move(I->second);
4395 PendingVisibleUpdates.erase(I);
4398 for (
const auto &
Update : VisibleUpdates)
4399 Lookups[DC].Table.add(
4405 if (
auto I = PendingModuleLocalVisibleUpdates.find(ID);
4406 I != PendingModuleLocalVisibleUpdates.end()) {
4407 auto ModuleLocalVisibleUpdates = std::move(I->second);
4408 PendingModuleLocalVisibleUpdates.erase(I);
4411 for (
const auto &
Update : ModuleLocalVisibleUpdates)
4412 ModuleLocalLookups[DC].Table.add(
4420 if (
auto I = TULocalUpdates.find(ID); I != TULocalUpdates.end()) {
4421 auto Updates = std::move(I->second);
4422 TULocalUpdates.erase(I);
4425 for (
const auto &
Update : Updates)
4426 TULocalLookups[DC].Table.add(
4434 if (
auto IT = RelatedDeclsMap.find(ID); IT != RelatedDeclsMap.end()) {
4435 for (
auto LID : IT->second)
4437 RelatedDeclsMap.erase(IT);
4442 if (
auto I = PendingSpecializationsUpdates.find(ID);
4443 I != PendingSpecializationsUpdates.end()) {
4444 auto SpecializationUpdates = std::move(I->second);
4445 PendingSpecializationsUpdates.erase(I);
4447 for (
const auto &
Update : SpecializationUpdates)
4452 if (
auto I = PendingPartialSpecializationsUpdates.find(ID);
4453 I != PendingPartialSpecializationsUpdates.end()) {
4454 auto SpecializationUpdates = std::move(I->second);
4455 PendingPartialSpecializationsUpdates.erase(I);
4457 for (
const auto &
Update : SpecializationUpdates)
4462void ASTReader::loadPendingDeclChain(
Decl *FirstLocal, uint64_t LocalOffset) {
4465 if (FirstLocal != CanonDecl) {
4468 *
this, FirstLocal, PrevMostRecent ? PrevMostRecent : CanonDecl,
4479 assert(M &&
"imported decl from no module file");
4483 if (llvm::Error JumpFailed =
Cursor.JumpToBit(LocalOffset))
4484 llvm::report_fatal_error(
4485 Twine(
"ASTReader::loadPendingDeclChain failed jumping: ") +
4491 llvm::report_fatal_error(
4492 Twine(
"ASTReader::loadPendingDeclChain failed reading code: ") +
4494 unsigned Code = MaybeCode.get();
4497 "expected LOCAL_REDECLARATIONS record!");
4499 llvm::report_fatal_error(
4500 Twine(
"ASTReader::loadPendingDeclChain failed reading rec code: ") +
4505 Decl *MostRecent = FirstLocal;
4506 for (
unsigned I = 0, N =
Record.size(); I != N; ++I) {
4507 unsigned Idx = N - I - 1;
4515void ASTReader::loadDeferredAttribute(
const DeferredAttribute &DA) {
4516 Decl *
D = DA.TargetedDecl;
4523 llvm::BitstreamCursor &
Cursor =
Loc.F->DeclsCursor;
4525 if (llvm::Error Err =
Cursor.JumpToBit(
Loc.Offset)) {
4526 Error(std::move(Err));
4531 llvm::report_fatal_error(
4532 Twine(
"ASTReader::loadPreferredNameAttribute failed reading code: ") +
4535 unsigned Code = MaybeCode.get();
4539 if (!MaybeRecCode) {
4540 llvm::report_fatal_error(
4542 "ASTReader::loadPreferredNameAttribute failed reading rec code: ") +
4545 unsigned RecCode = MaybeRecCode.get();
4546 if (RecCode < DECL_TYPEDEF || RecCode >
DECL_LAST) {
4547 llvm::report_fatal_error(
4548 Twine(
"ASTReader::loadPreferredNameAttribute failed reading rec code: "
4549 "expected valid DeclCode") +
4553 Record.skipInts(DA.RecordIdx);
4562 class ObjCCategoriesVisitor {
4565 llvm::SmallPtrSetImpl<ObjCCategoryDecl *> &Deserialized;
4567 llvm::DenseMap<DeclarationName, ObjCCategoryDecl *> NameCategoryMap;
4569 unsigned PreviousGeneration;
4573 if (!Deserialized.erase(Cat))
4584 NonEquivalentDecls, StructuralEquivalenceKind::Default,
4588 if (!Ctx.IsEquivalent(Cat, Existing)) {
4593 diag::note_previous_definition);
4595 }
else if (!Existing) {
4610 ObjCCategoriesVisitor(
4612 llvm::SmallPtrSetImpl<ObjCCategoryDecl *> &Deserialized,
4615 InterfaceID(InterfaceID), PreviousGeneration(PreviousGeneration) {
4617 for (
auto *Cat :
Interface->known_categories()) {
4648 LocalID != Result->getDefinitionID()) {
4656 unsigned Offset = Result->Offset;
4659 for (
unsigned I = 0; I != N; ++I)
4668 unsigned PreviousGeneration) {
4669 ObjCCategoriesVisitor Visitor(*
this,
D, CategoriesDeserialized, ID,
4670 PreviousGeneration);
4671 ModuleMgr.
visit(Visitor);
4674template<
typename DeclT,
typename Fn>
4683 for (
auto *Redecl = MostRecent; Redecl && !
Found;
4684 Redecl = Redecl->getPreviousDecl())
4689 for (
auto *Redecl = MostRecent; Redecl !=
D;
4699 auto *RD = cast<CXXRecordDecl>(
D);
4701 assert(MD &&
"couldn't read decl from update record");
4702 Reader.PendingAddedClassMembers.push_back({RD, MD});
4707 auto *Anon = readDeclAs<NamespaceDecl>();
4712 if (!
Record.isModule()) {
4713 if (
auto *TU = dyn_cast<TranslationUnitDecl>(
D))
4714 TU->setAnonymousNamespace(Anon);
4716 cast<NamespaceDecl>(
D)->setAnonymousNamespace(Anon);
4722 auto *VD = cast<VarDecl>(
D);
4723 VD->NonParmVarDeclBits.IsInline =
Record.readInt();
4724 VD->NonParmVarDeclBits.IsInlineSpecified =
Record.readInt();
4731 if (
auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(
D)) {
4732 VTSD->setPointOfInstantiation(POI);
4733 }
else if (
auto *VD = dyn_cast<VarDecl>(
D)) {
4735 assert(MSInfo &&
"No member specialization information");
4738 auto *FD = cast<FunctionDecl>(
D);
4739 if (
auto *FTSInfo = FD->TemplateOrSpecialization
4741 FTSInfo->setPointOfInstantiation(POI);
4743 cast<MemberSpecializationInfo *>(FD->TemplateOrSpecialization)
4744 ->setPointOfInstantiation(POI);
4750 auto *Param = cast<ParmVarDecl>(
D);
4755 auto *DefaultArg =
Record.readExpr();
4759 if (Param->hasUninstantiatedDefaultArg())
4760 Param->setDefaultArg(DefaultArg);
4765 auto *FD = cast<FieldDecl>(
D);
4766 auto *DefaultInit =
Record.readExpr();
4770 if (FD->hasInClassInitializer() && !FD->hasNonNullInClassInitializer()) {
4772 FD->setInClassInitializer(DefaultInit);
4776 FD->removeInClassInitializer();
4782 auto *FD = cast<FunctionDecl>(
D);
4783 if (Reader.PendingBodies[FD]) {
4797 FD->setInnerLocStart(readSourceLocation());
4799 assert(
Record.getIdx() ==
Record.size() &&
"lazy body must be last");
4804 auto *RD = cast<CXXRecordDecl>(
D);
4806 bool HadRealDefinition =
4807 OldDD && (OldDD->Definition != RD ||
4808 !Reader.PendingFakeDefinitionData.count(OldDD));
4812 ReadCXXRecordDefinition(RD,
true);
4815 uint64_t LexicalOffset = ReadLocalOffset();
4816 if (!HadRealDefinition && LexicalOffset) {
4817 Record.readLexicalDeclContextStorage(LexicalOffset, RD);
4818 Reader.PendingFakeDefinitionData.erase(OldDD);
4825 MSInfo->setTemplateSpecializationKind(TSK);
4826 MSInfo->setPointOfInstantiation(POI);
4828 auto *Spec = cast<ClassTemplateSpecializationDecl>(RD);
4829 Spec->setTemplateSpecializationKind(TSK);
4830 Spec->setPointOfInstantiation(POI);
4834 readDeclAs<ClassTemplatePartialSpecializationDecl>();
4836 Record.readTemplateArgumentList(TemplArgs);
4842 if (!isa<ClassTemplatePartialSpecializationDecl *>(
4843 Spec->getSpecializedTemplateOrPartial()))
4844 Spec->setInstantiationOf(PartialSpec, TemplArgList);
4855 Record.readAttributes(Attrs);
4867 auto *Del = readDeclAs<FunctionDecl>();
4869 auto *ThisArg =
Record.readExpr();
4871 if (!
First->OperatorDelete) {
4872 First->OperatorDelete = Del;
4873 First->OperatorDeleteThisArg = ThisArg;
4880 auto ESI =
Record.readExceptionSpecInfo(ExceptionStorage);
4883 auto *FD = cast<FunctionDecl>(
D);
4889 FPT->getReturnType(), FPT->getParamTypes(),
4890 FPT->getExtProtoInfo().withExceptionSpec(ESI)));
4894 Reader.PendingExceptionSpecUpdates.insert(
4895 std::make_pair(FD->getCanonicalDecl(), FD));
4901 auto *FD = cast<FunctionDecl>(
D);
4903 Reader.PendingDeducedTypeUpdates.insert(
4904 {FD->getCanonicalDecl(), DeducedResultType});
4925 readSourceRange()));
4929 auto AllocatorKind =
4930 static_cast<OMPAllocateDeclAttr::AllocatorTypeTy
>(
Record.readInt());
4934 D->
addAttr(OMPAllocateDeclAttr::CreateImplicit(
4935 Reader.
getContext(), AllocatorKind, Allocator, Alignment, SR));
4941 auto *Exported = cast<NamedDecl>(
D);
4944 Reader.PendingMergedDefinitionsToDeduplicate.insert(Exported);
4949 auto MapType =
Record.readEnum<OMPDeclareTargetDeclAttr::MapTypeTy>();
4950 auto DevType =
Record.readEnum<OMPDeclareTargetDeclAttr::DevTypeTy>();
4953 unsigned Level =
Record.readInt();
4954 D->
addAttr(OMPDeclareTargetDeclAttr::CreateImplicit(
4956 readSourceRange()));
4962 Record.readAttributes(Attrs);
4963 assert(Attrs.size() == 1);
This file provides AST data structures related to concepts.
Defines the clang::ASTContext interface.
static T assert_cast(T t)
"Cast" to type T, asserting if we don't have an implicit conversion.
static bool allowODRLikeMergeInC(NamedDecl *ND)
ODR-like semantics for C/ObjC allow us to merge tag types and a structural check in Sema guarantees t...
static NamedDecl * getDeclForMerging(NamedDecl *Found, bool IsTypedefNameForLinkage)
Find the declaration that should be merged into, given the declaration found by name lookup.
static bool inheritDefaultTemplateArgument(ASTContext &Context, ParmDecl *From, Decl *ToD)
Inherit the default template argument from From to To.
static void inheritDefaultTemplateArguments(ASTContext &Context, TemplateDecl *From, TemplateDecl *To)
static void forAllLaterRedecls(DeclT *D, Fn F)
static llvm::iterator_range< MergedRedeclIterator< DeclT > > merged_redecls(DeclT *D)
Defines the clang::attr::Kind enum.
clang::CharUnits operator*(clang::CharUnits::QuantityType Scale, const clang::CharUnits &CU)
enum clang::sema::@1726::IndirectLocalPathEntry::EntryKind Kind
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
This file defines OpenMP nodes for declarative directives.
Defines the C++ template declaration subclasses.
Defines the ExceptionSpecificationType enumeration and various utility functions.
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines the LambdaCapture class.
Defines several types used to describe C++ lambda expressions that are shared between the parser and ...
Defines the clang::LangOptions interface.
llvm::MachO::Record Record
Defines the clang::Module class, which describes a module in the source code.
This file defines OpenMP AST classes for clauses.
static std::string toString(const clang::SanitizerSet &Sanitizers)
Produce a string containing comma-separated names of sanitizers in Sanitizers set.
Defines the clang::SourceLocation class and associated facilities.
Defines various enumerations that describe declaration and type specifiers.
Defines utilities for dealing with stack allocation and stack space.
C Language Family Type Representation.
__DEVICE__ void * memcpy(void *__a, const void *__b, size_t __c)
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
bool needsCleanup() const
Returns whether the object performed allocations.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
TranslationUnitDecl * getTranslationUnitDecl() const
void setInstantiatedFromUsingDecl(NamedDecl *Inst, NamedDecl *Pattern)
Remember that the using decl Inst is an instantiation of the using decl Pattern of a class template.
QualType getInjectedClassNameType(CXXRecordDecl *Decl, QualType TST) const
getInjectedClassNameType - Return the unique reference to the injected class name type for the specif...
void setInstantiatedFromUsingShadowDecl(UsingShadowDecl *Inst, UsingShadowDecl *Pattern)
const LangOptions & getLangOpts() const
void setInstantiatedFromUsingEnumDecl(UsingEnumDecl *Inst, UsingEnumDecl *Pattern)
Remember that the using enum decl Inst is an instantiation of the using enum decl Pattern of a class ...
void setStaticLocalNumber(const VarDecl *VD, unsigned Number)
void addOverriddenMethod(const CXXMethodDecl *Method, const CXXMethodDecl *Overridden)
Note that the given C++ Method overrides the given Overridden method.
void setManglingNumber(const NamedDecl *ND, unsigned Number)
void * Allocate(size_t Size, unsigned Align=8) const
TypeSourceInfo * CreateTypeSourceInfo(QualType T, unsigned Size=0) const
Allocate an uninitialized TypeSourceInfo.
void setInstantiatedFromStaticDataMember(VarDecl *Inst, VarDecl *Tmpl, TemplateSpecializationKind TSK, SourceLocation PointOfInstantiation=SourceLocation())
Note that the static data member Inst is an instantiation of the static data member template Tmpl of ...
QualType getFunctionType(QualType ResultTy, ArrayRef< QualType > Args, const FunctionProtoType::ExtProtoInfo &EPI) const
Return a normal function type with a typed argument list.
void setInstantiatedFromUnnamedFieldDecl(FieldDecl *Inst, FieldDecl *Tmpl)
void setBlockVarCopyInit(const VarDecl *VD, Expr *CopyExpr, bool CanThrow)
Set the copy initialization expression of a block var decl.
void addDestruction(T *Ptr) const
If T isn't trivially destructible, calls AddDeallocation to register it for destruction.
ExternalASTSource * getExternalSource() const
Retrieve a pointer to the external AST source associated with this AST context, if any.
void mergeDefinitionIntoModule(NamedDecl *ND, Module *M, bool NotifyListeners=true)
Note that the definition ND has been merged into module M, and should be visible whenever M is visibl...
void setPrimaryMergedDecl(Decl *D, Decl *Primary)
void setObjCMethodRedeclaration(const ObjCMethodDecl *MD, const ObjCMethodDecl *Redecl)
bool isInSameModule(const Module *M1, const Module *M2)
If the two module M1 and M2 are in the same module.
AttrVec & getDeclAttrs(const Decl *D)
Retrieve the attributes for the given declaration.
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 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 VisitExportDecl(ExportDecl *D)
static void attachLatestDecl(Decl *D, Decl *latest)
void VisitStaticAssertDecl(StaticAssertDecl *D)
void VisitEmptyDecl(EmptyDecl *D)
void VisitOMPCapturedExprDecl(OMPCapturedExprDecl *D)
void VisitValueDecl(ValueDecl *VD)
void VisitEnumDecl(EnumDecl *ED)
void mergeRedeclarable(Redeclarable< T > *D, RedeclarableResult &Redecl)
Attempts to merge the given declaration (D) with another declaration of the same entity.
void VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D)
void VisitFriendTemplateDecl(FriendTemplateDecl *D)
void VisitObjCProtocolDecl(ObjCProtocolDecl *D)
void VisitClassTemplatePartialSpecializationDecl(ClassTemplatePartialSpecializationDecl *D)
void VisitObjCTypeParamDecl(ObjCTypeParamDecl *D)
void VisitDeclaratorDecl(DeclaratorDecl *DD)
RedeclarableResult VisitTypedefNameDecl(TypedefNameDecl *TD)
void VisitFriendDecl(FriendDecl *D)
void VisitLinkageSpecDecl(LinkageSpecDecl *D)
void VisitCXXRecordDecl(CXXRecordDecl *D)
ASTDeclReader(ASTReader &Reader, ASTRecordReader &Record, ASTReader::RecordLocation Loc, GlobalDeclID thisDeclID, SourceLocation ThisDeclLoc)
void VisitFileScopeAsmDecl(FileScopeAsmDecl *AD)
void VisitImplicitConceptSpecializationDecl(ImplicitConceptSpecializationDecl *D)
void VisitNamedDecl(NamedDecl *ND)
void mergeMergeable(Mergeable< T > *D)
Attempts to merge the given declaration (D) with another declaration of the same entity,...
void VisitBuiltinTemplateDecl(BuiltinTemplateDecl *D)
static Decl * getMostRecentDecl(Decl *D)
void VisitObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *D)
void VisitCXXConstructorDecl(CXXConstructorDecl *D)
void VisitPragmaDetectMismatchDecl(PragmaDetectMismatchDecl *D)
void VisitImplicitParamDecl(ImplicitParamDecl *PD)
void VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D)
static void setNextObjCCategory(ObjCCategoryDecl *Cat, ObjCCategoryDecl *Next)
void VisitMSPropertyDecl(MSPropertyDecl *FD)
void VisitClassTemplateSpecializationDecl(ClassTemplateSpecializationDecl *D)
void VisitFieldDecl(FieldDecl *FD)
RedeclarableResult VisitVarDeclImpl(VarDecl *D)
void VisitOMPDeclareMapperDecl(OMPDeclareMapperDecl *D)
void VisitCapturedDecl(CapturedDecl *CD)
void VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D)
void VisitObjCInterfaceDecl(ObjCInterfaceDecl *D)
RedeclarableResult VisitCXXRecordDeclImpl(CXXRecordDecl *D)
void VisitAccessSpecDecl(AccessSpecDecl *D)
void VisitCXXMethodDecl(CXXMethodDecl *D)
void 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 VisitDeclContext(DeclContext *DC, uint64_t &LexicalOffset, uint64_t &VisibleOffset, uint64_t &ModuleLocalOffset, uint64_t &TULocalOffset)
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 VisitObjCIvarDecl(ObjCIvarDecl *D)
void VisitUsingPackDecl(UsingPackDecl *D)
void VisitFunctionTemplateDecl(FunctionTemplateDecl *D)
void VisitOMPDeclareReductionDecl(OMPDeclareReductionDecl *D)
RedeclarableResult VisitVarTemplateSpecializationDeclImpl(VarTemplateSpecializationDecl *D)
TODO: Unify with ClassTemplateSpecializationDecl version? May require unifying ClassTemplate(Partial)...
void VisitUsingDecl(UsingDecl *D)
void VisitObjCAtDefsFieldDecl(ObjCAtDefsFieldDecl *D)
void VisitVarTemplatePartialSpecializationDecl(VarTemplatePartialSpecializationDecl *D)
TODO: Unify with ClassTemplatePartialSpecializationDecl version? May require unifying ClassTemplate(P...
void VisitParmVarDecl(ParmVarDecl *PD)
void VisitVarTemplateDecl(VarTemplateDecl *D)
TODO: Unify with ClassTemplateDecl version? May require unifying ClassTemplateDecl and VarTemplateDec...
static void attachPreviousDecl(ASTReader &Reader, Decl *D, Decl *Previous, Decl *Canon)
void VisitClassTemplateDecl(ClassTemplateDecl *D)
void VisitCXXDestructorDecl(CXXDestructorDecl *D)
void VisitTemplateDecl(TemplateDecl *D)
void VisitCXXConversionDecl(CXXConversionDecl *D)
void VisitTypedefDecl(TypedefDecl *TD)
void VisitOMPRequiresDecl(OMPRequiresDecl *D)
RedeclarableResult VisitRecordDeclImpl(RecordDecl *RD)
void VisitDecompositionDecl(DecompositionDecl *DD)
void ReadSpecializations(ModuleFile &M, Decl *D, llvm::BitstreamCursor &DeclsCursor, bool IsPartial)
Reads an AST files chain containing the contents of a translation unit.
bool isDeclIDFromModule(GlobalDeclID ID, ModuleFile &M) const
Returns true if global DeclID ID originated from module M.
DiagnosticBuilder Diag(unsigned DiagID) const
Report a diagnostic.
ASTContext & getContext()
Retrieve the AST context that this AST reader supplements.
Decl * ReadDecl(ModuleFile &F, const RecordDataImpl &R, unsigned &I)
Reads a declaration from the given position in a record in the given module.
ModuleFile * getOwningModuleFile(const Decl *D) const
Retrieve the module file that owns the given declaration, or NULL if the declaration is not from a mo...
T * ReadDeclAs(ModuleFile &F, const RecordDataImpl &R, unsigned &I)
Reads a declaration from the given position in a record in the given module.
SourceLocation ReadSourceLocation(ModuleFile &MF, RawLocEncoding Raw, LocSeq *Seq=nullptr) const
Read a source location from raw form.
LocalDeclID mapGlobalIDToModuleFileGlobalID(ModuleFile &M, GlobalDeclID GlobalID)
Map a global declaration ID into the declaration ID used to refer to this declaration within the give...
QualType GetType(serialization::TypeID ID)
Resolve a type ID into a type, potentially building a new type.
IdentifierResolver & getIdResolver()
Get the identifier resolver used for name lookup / updates in the translation unit scope.
Decl * GetDecl(GlobalDeclID ID)
Resolve a declaration ID into a declaration, potentially building a new declaration.
Module * getSubmodule(serialization::SubmoduleID GlobalID)
Retrieve the submodule that corresponds to a global submodule ID.
void mergeDefinitionVisibility(NamedDecl *Def, NamedDecl *MergedDef)
Note that MergedDef is a redefinition of the canonical definition Def, so Def should be visible whene...
void runWithSufficientStackSpace(SourceLocation Loc, llvm::function_ref< void()> Fn)
SmallVector< uint64_t, 64 > RecordData
An object for streaming information from a record.
bool readBool()
Read a boolean value, advancing Idx.
std::string readString()
Read a string, advancing Idx.
unsigned getIdx() const
The current position in this record.
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.
void skipInts(unsigned N)
Skips the specified number of values.
SourceRange readSourceRange(LocSeq *Seq=nullptr)
Read a source range, advancing Idx.
uint64_t peekInts(unsigned N)
Returns the next N values in this record, without advancing.
OMPTraitInfo * readOMPTraitInfo()
Read an OMPTraitInfo object, advancing Idx.
VersionTuple readVersionTuple()
Read a version tuple, advancing Idx.
Attr * readOrDeferAttrFor(Decl *D)
Reads one attribute from the current stream position, 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.
SourceLocation readSourceLocation(LocSeq *Seq=nullptr)
Read a source location, advancing Idx.
void readAttributes(AttrVec &Attrs, Decl *D=nullptr)
Reads attributes from the current stream position, advancing Idx.
Represents an access specifier followed by colon ':'.
static AccessSpecDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Attr - This represents one attribute.
Attr * clone(ASTContext &C) const
Syntax
The style used to specify an attribute.
@ AS_Keyword
__ptr16, alignas(...), etc.
A binding in a decomposition declaration.
static BindingDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
A simple helper class to unpack an integer to bits and consuming the bits in order.
uint32_t getNextBits(uint32_t Width)
A class which contains all the information about a particular captured value.
Represents a block literal declaration, which is like an unnamed FunctionDecl.
void setParams(ArrayRef< ParmVarDecl * > NewParamInfo)
void setDoesNotEscape(bool B=true)
void setSignatureAsWritten(TypeSourceInfo *Sig)
void setCanAvoidCopyToHeap(bool B=true)
void setIsConversionFromLambda(bool val=true)
void setBlockMissingReturnType(bool val=true)
static BlockDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setIsVariadic(bool value)
void setBody(CompoundStmt *B)
void setCaptures(ASTContext &Context, ArrayRef< Capture > Captures, bool CapturesCXXThis)
Represents the builtin template declaration which is used to implement __make_integer_seq and other b...
Represents a C++ constructor within a class.
static CXXConstructorDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, uint64_t AllocKind)
Represents a C++ conversion function within a class.
static CXXConversionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a C++ deduction guide declaration.
static CXXDeductionGuideDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a C++ destructor within a class.
static CXXDestructorDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a static or instance method of a struct/union/class.
static CXXMethodDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a C++ struct/union/class.
CXXRecordDecl * getDefinition() const
static CXXRecordDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID)
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this class is an instantiation of a member class of a class template specialization,...
CXXRecordDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Represents the body of a CapturedStmt, and serves as its DeclContext.
static CapturedDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumParams)
void setContextParam(unsigned i, ImplicitParamDecl *P)
void setNothrow(bool Nothrow=true)
void setParam(unsigned i, ImplicitParamDecl *P)
Declaration of a class template.
static ClassTemplateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Create an empty class template node.
static ClassTemplatePartialSpecializationDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a class template specialization, which refers to a class template with a given set of temp...
static ClassTemplateSpecializationDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Declaration of a C++20 concept.
static ConceptDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
A reference to a concept and its template args, as it appears in the code.
Represents a shadow constructor declaration introduced into a class by a C++11 using-declaration that...
static ConstructorUsingShadowDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
static DeclAccessPair make(NamedDecl *D, AccessSpecifier AS)
The results of name lookup within a DeclContext.
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
void setHasExternalVisibleStorage(bool ES=true) const
State whether this DeclContext has external storage for declarations visible in this context.
bool isTranslationUnit() const
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
DeclContext * getPrimaryContext()
getPrimaryContext - There may be many different declarations of the same entity (including forward de...
bool isFunctionOrMethod() const
DeclID getRawValue() const
unsigned getLocalDeclIndex() 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 ...
ASTContext & getASTContext() const LLVM_READONLY
void setOwningModuleID(unsigned ID)
Set the owning module ID.
void setLocalExternDecl()
Changes the namespace of this declaration to reflect that it's a function-local extern declaration.
void setTopLevelDeclInObjCContainer(bool V=true)
void markUsed(ASTContext &C)
Mark the declaration used, in the sense of odr-use.
bool isCanonicalDecl() const
Whether this particular Decl is a canonical one.
Module * getOwningModule() const
Get the module that owns this declaration (for visibility purposes).
bool isFirstDecl() const
True if this is the first declaration in its redeclaration chain.
Module * getImportedOwningModule() const
Get the imported owning module, if this decl is from an imported (non-local) module.
ObjCDeclQualifier
ObjCDeclQualifier - 'Qualifiers' written next to the return and parameter types in method declaration...
bool isFromASTFile() const
Determine whether this declaration came from an AST file (such as a precompiled header or module) rat...
bool isTemplateParameter() const
isTemplateParameter - Determines whether this declaration is a template parameter.
bool isInvalidDecl() const
unsigned FromASTFile
Whether this declaration was loaded from an AST file.
void setAccess(AccessSpecifier AS)
SourceLocation getLocation() const
IdentifierNamespace
IdentifierNamespace - The different namespaces in which declarations may appear.
@ IDNS_Ordinary
Ordinary names.
@ IDNS_Type
Types, declared with 'struct foo', typedefs, etc.
@ IDNS_Tag
Tags, declared with 'struct foo;' and referenced with 'struct foo'.
bool isTemplateParameterPack() const
isTemplateParameter - Determines whether this declaration is a template parameter pack.
void setImplicit(bool I=true)
void setReferenced(bool R=true)
void setLocation(SourceLocation L)
DeclContext * getDeclContext()
void setCachedLinkage(Linkage L) const
void setDeclContext(DeclContext *DC)
setDeclContext - Set both the semantic and lexical DeclContext to DC.
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
ModuleOwnershipKind
The kind of ownership a declaration has, for visibility purposes.
@ VisibleWhenImported
This declaration has an owning module, and is visible when that module is imported.
@ Unowned
This declaration is not owned by a module.
@ ReachableWhenImported
This declaration has an owning module, and is visible to lookups that occurs within that module.
@ ModulePrivate
This declaration has an owning module, but is only visible to lookups that occur within that module.
@ Visible
This declaration has an owning module, but is globally visible (typically because its owning module i...
void setModuleOwnershipKind(ModuleOwnershipKind MOK)
Set whether this declaration is hidden from name lookup.
GlobalDeclID getGlobalID() const
Retrieve the global declaration ID associated with this declaration, which specifies where this Decl ...
bool shouldEmitInExternalSource() const
Whether the definition of the declaration should be emitted in external sources.
void setVisibleDespiteOwningModule()
Set that this declaration is globally visible, even if it came from a module that is not visible.
The name of a declaration.
Selector getObjCSelector() const
Get the Objective-C selector stored in this declaration name.
Represents a ValueDecl that came out of a declarator.
void setInnerLocStart(SourceLocation L)
void setTypeSourceInfo(TypeSourceInfo *TI)
TypeSourceInfo * getTypeSourceInfo() const
A decomposition declaration.
static DecompositionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumBindings)
Represents an empty-declaration.
static EmptyDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
An instance of this object exists for each enum constant that is defined.
static EnumConstantDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setInitExpr(Expr *E)
void setInitVal(const ASTContext &C, const llvm::APSInt &V)
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this enumeration is an instantiation of a member enumeration of a class template specialization,...
void setFixed(bool Fixed=true)
True if this is an Objective-C, C++11, or Microsoft-style enumeration with a fixed underlying type.
void setIntegerType(QualType T)
Set the underlying integer type.
void setIntegerTypeSourceInfo(TypeSourceInfo *TInfo)
Set the underlying integer type source info.
static EnumDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setScoped(bool Scoped=true)
True if this tag declaration is a scoped enumeration.
void setPromotionType(QualType T)
Set the promotion type.
EnumDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
void setScopedUsingClassTag(bool ScopedUCT=true)
If this tag declaration is a scoped enum, then this is true if the scoped enum was declared using the...
Represents a standard C++ module export declaration.
static ExportDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
This represents one expression.
Represents a member of a struct/union/class.
void setBitWidth(Expr *Width)
Set the bit-field width for this member.
static FieldDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
const VariableArrayType * CapturedVLAType
void setRParenLoc(SourceLocation L)
void setAsmString(StringLiteral *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 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 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)
bool isDefaulted() const
Whether this function is defaulted.
void setIneligibleOrNotSelected(bool II)
void setConstexprKind(ConstexprSpecKind CSK)
void setDefaulted(bool D=true)
void setStorageClass(StorageClass SClass)
Sets the storage class as written in the source.
void setDeletedAsWritten(bool D=true, StringLiteral *Message=nullptr)
void setExplicitlyDefaulted(bool ED=true)
State that this function is explicitly defaulted.
void setHasImplicitReturnZero(bool IRZ)
State that falling off this function implicitly returns null/zero.
Represents a prototype with parameter type info, e.g.
ExceptionSpecificationType getExceptionSpecType() const
Get the kind of exception specification on this function.
Declaration of a template function.
static FunctionTemplateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Create an empty function template node.
Provides information about a function template specialization, which is a FunctionDecl that has been ...
static FunctionTemplateSpecializationInfo * Create(ASTContext &C, FunctionDecl *FD, FunctionTemplateDecl *Template, TemplateSpecializationKind TSK, TemplateArgumentList *TemplateArgs, const TemplateArgumentListInfo *TemplateArgsAsWritten, SourceLocation POI, MemberSpecializationInfo *MSInfo)
void Profile(llvm::FoldingSetNodeID &ID)
FunctionDecl * getFunction() const
Retrieve the declaration of the function template specialization.
FunctionType - C99 6.7.5.3 - Function Declarators.
QualType getReturnType() const
HLSLBufferDecl - Represent a cbuffer or tbuffer declaration.
static HLSLBufferDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
One of these records is kept for each identifier that is lexed.
void setOutOfDate(bool OOD)
Set whether the information for this identifier is out of date with respect to the external source.
bool isOutOfDate() const
Determine whether the information for this identifier is out of date with respect to the external sou...
iterator - Iterate over the decls of a specified declaration name.
IdentifierResolver - Keeps track of shadowed decls on enclosing scopes.
iterator begin(DeclarationName Name)
Returns an iterator over decls with the name 'Name'.
bool tryAddTopLevelDecl(NamedDecl *D, DeclarationName Name)
Try to add the given declaration to the top level scope, if it (or a redeclaration of it) hasn't alre...
iterator end()
Returns the end iterator.
static ImplicitConceptSpecializationDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID, unsigned NumTemplateArgs)
static ImplicitParamDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Describes a module import declaration, which makes the contents of the named module visible in the cu...
static ImportDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumLocations)
Create a new, deserialized module import declaration.
Represents a field injected from an anonymous union/struct into the parent scope.
static IndirectFieldDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setInherited(bool I)
Description of a constructor that was inherited from a base class.
Represents the declaration of a label.
static LabelDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Describes the capture of a variable or of this, or of a C++1y init-capture.
LambdaCaptureKind getCaptureKind() const
Determine the kind of capture.
Implicit declaration of a temporary that was materialized by a MaterializeTemporaryExpr and lifetime-...
unsigned getManglingNumber() const
static LifetimeExtendedTemporaryDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
ValueDecl * getExtendingDecl()
Represents a linkage specification.
static LinkageSpecDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents the results of name lookup.
An instance of this class represents the declaration of a property member.
static MSPropertyDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Provides information a specialization of a member of a class template, which may be a member function...
void setPointOfInstantiation(SourceLocation POI)
Set the first point of instantiation.
Provides common interface for the Decls that cannot be redeclared, but can be merged if the same decl...
Describes a module or submodule.
@ AllVisible
All of the names in this module are visible.
std::string Name
The name of this module.
bool isGlobalModule() const
Does this Module scope describe a fragment of the global module within some C++ module.
@ ModuleMapModule
This is a module that was defined by a module map and built out of header files.
bool isNamedModule() const
Does this Module is a named module of a standard named module?
Module * getTopLevelModule()
Retrieve the top-level module for this (sub)module, which may be this module.
This represents a decl that may have a name.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
bool isPlaceholderVar(const LangOptions &LangOpts) const
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
void setDeclName(DeclarationName N)
Set the name of this declaration.
Represents a C++ namespace alias.
static NamespaceAliasDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represent a C++ namespace.
static NamespaceDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
static NonTypeTemplateParmDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, bool HasTypeConstraint)
This represents '#pragma omp allocate ...' directive.
static OMPAllocateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NVars, unsigned NClauses)
Pseudo declaration for capturing expressions.
static OMPCapturedExprDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
This represents '#pragma omp declare mapper ...' directive.
static OMPDeclareMapperDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned N)
Creates deserialized declare mapper node.
This represents '#pragma omp declare reduction ...' directive.
static OMPDeclareReductionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Create deserialized declare reduction node.
This represents '#pragma omp requires...' directive.
static OMPRequiresDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned N)
Create deserialized requires node.
This represents '#pragma omp threadprivate ...' directive.
static OMPThreadPrivateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned N)
Helper data structure representing the traits in a match clause of an declare variant or metadirectiv...
Represents a field declaration created by an @defs(...).
static ObjCAtDefsFieldDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
ObjCCategoryDecl - Represents a category declaration.
void setProtocolList(ObjCProtocolDecl *const *List, unsigned Num, const SourceLocation *Locs, ASTContext &C)
setProtocolList - Set the list of protocols that this interface implements.
static ObjCCategoryDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setIvarLBraceLoc(SourceLocation Loc)
void setCategoryNameLoc(SourceLocation Loc)
void setIvarRBraceLoc(SourceLocation Loc)
bool IsClassExtension() const
ObjCCategoryImplDecl - An object of this class encapsulates a category @implementation declaration.
static ObjCCategoryImplDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
ObjCCompatibleAliasDecl - Represents alias of a class.
static ObjCCompatibleAliasDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setClassInterface(ObjCInterfaceDecl *D)
ObjCContainerDecl - Represents a container for method declarations.
void setAtStartLoc(SourceLocation Loc)
void setAtEndRange(SourceRange atEnd)
ObjCImplementationDecl - Represents a class definition - this is where method definitions are specifi...
static ObjCImplementationDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents an ObjC class declaration.
void mergeClassExtensionProtocolList(ObjCProtocolDecl *const *List, unsigned Num, ASTContext &C)
mergeClassExtensionProtocolList - Merge class extension's protocol list into the protocol list for th...
ObjCIvarDecl * lookupInstanceVariable(IdentifierInfo *IVarName, ObjCInterfaceDecl *&ClassDeclared)
static ObjCInterfaceDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID)
ObjCInterfaceDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this Objective-C class.
ObjCIvarDecl - Represents an ObjC instance variable.
void setAccessControl(AccessControl ac)
void setNextIvar(ObjCIvarDecl *ivar)
ObjCInterfaceDecl * getContainingInterface()
Return the class interface that this ivar is logically contained in; this is either the interface whe...
void setSynthesize(bool synth)
static ObjCIvarDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
ObjCMethodDecl - Represents an instance or class method declaration.
void setSynthesizedAccessorStub(bool isSynthesizedAccessorStub)
void setObjCDeclQualifier(ObjCDeclQualifier QV)
void setDefined(bool isDefined)
void setSelfDecl(ImplicitParamDecl *SD)
void setReturnTypeSourceInfo(TypeSourceInfo *TInfo)
void setHasRedeclaration(bool HRD) const
void setIsRedeclaration(bool RD)
void setCmdDecl(ImplicitParamDecl *CD)
bool hasRedeclaration() const
True if redeclared in the same interface.
void setRelatedResultType(bool RRT=true)
Note whether this method has a related result type.
void setOverriding(bool IsOver)
void setPropertyAccessor(bool isAccessor)
void setDeclImplementation(ObjCImplementationControl ic)
void setReturnType(QualType T)
static ObjCMethodDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setHasSkippedBody(bool Skipped=true)
void setInstanceMethod(bool isInst)
void setVariadic(bool isVar)
Represents one property declaration in an Objective-C interface.
static ObjCPropertyDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
ObjCPropertyImplDecl - Represents implementation declaration of a property in a class or category imp...
static ObjCPropertyImplDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents an Objective-C protocol declaration.
static ObjCProtocolDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
ObjCProtocolDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this Objective-C protocol.
Represents the declaration of an Objective-C type parameter.
static ObjCTypeParamDecl * CreateDeserialized(ASTContext &ctx, GlobalDeclID ID)
Stores a list of Objective-C type parameters for a parameterized class or a category/extension thereo...
static ObjCTypeParamList * create(ASTContext &ctx, SourceLocation lAngleLoc, ArrayRef< ObjCTypeParamDecl * > typeParams, SourceLocation rAngleLoc)
Create a new Objective-C type parameter list.
Represents a parameter to a function.
static ParmVarDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setUninstantiatedDefaultArg(Expr *arg)
void setScopeInfo(unsigned scopeDepth, unsigned parameterIndex)
void setObjCMethodScopeInfo(unsigned parameterIndex)
Represents a #pragma detect_mismatch line.
static PragmaDetectMismatchDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NameValueSize)
A (possibly-)qualified type.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
const Type * getTypePtrOrNull() const
Represents a struct/union/class.
unsigned getODRHash()
Get precomputed ODRHash or add a new one.
void setAnonymousStructOrUnion(bool Anon)
void setArgPassingRestrictions(RecordArgPassingKind Kind)
void setNonTrivialToPrimitiveCopy(bool V)
void setHasNonTrivialToPrimitiveCopyCUnion(bool V)
void setHasNonTrivialToPrimitiveDestructCUnion(bool V)
void setHasFlexibleArrayMember(bool V)
void setParamDestroyedInCallee(bool V)
void setNonTrivialToPrimitiveDestroy(bool V)
void setHasObjectMember(bool val)
void setHasVolatileMember(bool val)
void setHasNonTrivialToPrimitiveDefaultInitializeCUnion(bool V)
static RecordDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID)
void setHasUninitializedExplicitInitFields(bool V)
void setNonTrivialToPrimitiveDefaultInitialize(bool V)
Declaration of a redeclarable template.
CommonBase * Common
Pointer to the common data shared by all declarations of this template.
virtual CommonBase * newCommon(ASTContext &C) const =0
Provides common interface for the Decls that can be redeclared.
decl_type * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
bool isFirstDecl() const
True if this is the first declaration in its redeclaration chain.
static DeclLink PreviousDeclLink(decl_type *D)
Represents the body of a requires-expression.
static RequiresExprBodyDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
const FunctionDecl * getKernelEntryPointDecl() const
Encodes a location in the source.
A trivial tuple used to represent a source range.
Represents a C++11 static_assert declaration.
static StaticAssertDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
StringLiteral - This represents a string literal expression, e.g.
Represents the declaration of a struct/union/class/enum.
void setTagKind(TagKind TK)
void setCompleteDefinitionRequired(bool V=true)
True if this complete decl is required to be complete for some existing use.
void demoteThisDefinitionToDeclaration()
Mark a definition as a declaration and maintain information it was a definition.
bool isThisDeclarationADefinition() const
Return true if this declaration is a completion definition of the type.
void setEmbeddedInDeclarator(bool isInDeclarator)
True if this tag declaration is "embedded" (i.e., defined or declared for the very first time) in the...
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
TagDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
void setFreeStanding(bool isFreeStanding=true)
True if this tag is free standing, e.g. "struct foo;".
void setBraceRange(SourceRange R)
void setCompleteDefinition(bool V=true)
True if this decl has its body fully specified.
A convenient class for passing around template argument information.
A template argument list.
static TemplateArgumentList * CreateCopy(ASTContext &Context, ArrayRef< TemplateArgument > Args)
Create a new template argument list that copies the given set of template arguments.
The base class of all kinds of template declarations (e.g., class, function, etc.).
NamedDecl * getTemplatedDecl() const
Get the underlying, templated declaration.
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
A template parameter object.
Stores a list of template parameters for a TemplateDecl and its derived classes.
TemplateTemplateParmDecl - Declares a template template parameter, e.g., "T" in.
static TemplateTemplateParmDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Declaration of a template type parameter.
static TemplateTypeParmDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID)
A declaration that models statements at global scope.
static TopLevelStmtDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
The top declaration context.
Represents the declaration of a typedef-name via a C++11 alias-declaration.
static TypeAliasDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setDescribedAliasTemplate(TypeAliasTemplateDecl *TAT)
Declaration of an alias template.
static TypeAliasTemplateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Create an empty alias template node.
Represents a declaration of a type.
void setLocStart(SourceLocation L)
A container of type source information.
QualType getType() const
Return the type wrapped by this type source info.
const T * castAs() const
Member-template castAs<specific type>.
AutoType * getContainedAutoType() const
Get the AutoType whose type will be deduced for a variable with an initializer of this type.
DeducedType * getContainedDeducedType() const
Get the DeducedType whose type will be deduced for a variable with an initializer of this type.
const T * getAs() const
Member-template getAs<specific type>'.
Represents the declaration of a typedef-name via the 'typedef' type specifier.
static TypedefDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Base class for declarations which introduce a typedef-name.
void setModedTypeSourceInfo(TypeSourceInfo *unmodedTSI, QualType modedTy)
void setTypeSourceInfo(TypeSourceInfo *newType)
An artificial decl, representing a global anonymous constant value which is uniquified by value withi...
void addDecl(NamedDecl *D)
A set of unresolved declarations.
This node is generated when a using-declaration that was annotated with attribute((using_if_exists)) ...
static UnresolvedUsingIfExistsDecl * CreateDeserialized(ASTContext &Ctx, GlobalDeclID ID)
Represents a dependent using declaration which was marked with typename.
static UnresolvedUsingTypenameDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a dependent using declaration which was not marked with typename.
static UnresolvedUsingValueDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a C++ using-declaration.
static UsingDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents C++ using-directive.
static UsingDirectiveDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a C++ using-enum-declaration.
static UsingEnumDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a pack of using declarations that a single using-declarator pack-expanded into.
static UsingPackDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumExpansions)
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
static UsingShadowDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
void setType(QualType newType)
Represents a variable declaration or definition.
ParmVarDeclBitfields ParmVarDeclBits
static VarDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
VarDeclBitfields VarDeclBits
EvaluatedStmt * ensureEvaluatedStmt() const
Convert the initializer for this declaration to the elaborated EvaluatedStmt form,...
NonParmVarDeclBitfields NonParmVarDeclBits
@ Definition
This declaration is definitely a definition.
void setDescribedVarTemplate(VarTemplateDecl *Template)
StorageClass getStorageClass() const
Returns the storage class as written in the source.
Declaration of a variable template.
static VarTemplateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Create an empty variable template node.
static VarTemplatePartialSpecializationDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a variable template specialization, which refers to a variable template with a given set o...
static VarTemplateSpecializationDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Source location and bit offset of a declaration.
RawLocEncoding getRawLoc() const
uint64_t getBitOffset(const uint64_t DeclTypesBlockStartOffset) const
Information about a module that has been loaded by the ASTReader.
const serialization::ObjCCategoriesInfo * ObjCCategoriesMap
Array of category list location information within this module file, sorted by the definition ID.
unsigned LocalNumObjCCategoriesInMap
The number of redeclaration info entries in ObjCCategoriesMap.
llvm::BitstreamCursor DeclsCursor
DeclsCursor - This is a cursor to the start of the DECLTYPES_BLOCK block.
uint64_t GlobalBitOffset
The global bit offset (or base) of this module.
const DeclOffset * DeclOffsets
Offset of each declaration within the bitstream, indexed by the declaration ID (-1).
unsigned Generation
The generation of which this module file is a part.
uint64_t DeclsBlockStartOffset
The offset to the start of the DECLTYPES_BLOCK block.
SmallVector< uint64_t, 1 > ObjCCategories
The Objective-C category lists for categories known to this module.
void visit(llvm::function_ref< bool(ModuleFile &M)> Visitor, llvm::SmallPtrSetImpl< ModuleFile * > *ModuleFilesHit=nullptr)
Visit each of the modules.
Class that performs name lookup into a DeclContext stored in an AST file.
const unsigned int LOCAL_REDECLARATIONS
Record code for a list of local redeclarations of a declaration.
DeclCode
Record codes for each kind of declaration.
const unsigned int DECL_UPDATES
Record of updates for a declaration that was modified after being deserialized.
@ DECL_EMPTY
An EmptyDecl record.
@ DECL_CAPTURED
A CapturedDecl record.
@ DECL_CXX_BASE_SPECIFIERS
A record containing CXXBaseSpecifiers.
@ DECL_CXX_RECORD
A CXXRecordDecl record.
@ DECL_VAR_TEMPLATE_PARTIAL_SPECIALIZATION
A VarTemplatePartialSpecializationDecl record.
@ DECL_OMP_ALLOCATE
An OMPAllocateDcl record.
@ DECL_MS_PROPERTY
A MSPropertyDecl record.
@ DECL_OMP_DECLARE_MAPPER
An OMPDeclareMapperDecl record.
@ DECL_TOP_LEVEL_STMT_DECL
A TopLevelStmtDecl record.
@ DECL_REQUIRES_EXPR_BODY
A RequiresExprBodyDecl record.
@ DECL_STATIC_ASSERT
A StaticAssertDecl record.
@ DECL_INDIRECTFIELD
A IndirectFieldDecl record.
@ DECL_TEMPLATE_TEMPLATE_PARM
A TemplateTemplateParmDecl record.
@ DECL_IMPORT
An ImportDecl recording a module import.
@ DECL_UNNAMED_GLOBAL_CONSTANT
A UnnamedGlobalConstantDecl record.
@ DECL_ACCESS_SPEC
An AccessSpecDecl record.
@ DECL_OBJC_TYPE_PARAM
An ObjCTypeParamDecl record.
@ DECL_OBJC_CATEGORY_IMPL
A ObjCCategoryImplDecl record.
@ DECL_ENUM_CONSTANT
An EnumConstantDecl record.
@ DECL_PARM_VAR
A ParmVarDecl record.
@ DECL_TYPEDEF
A TypedefDecl record.
@ DECL_EXPANDED_TEMPLATE_TEMPLATE_PARM_PACK
A TemplateTemplateParmDecl record that stores an expanded template template parameter pack.
@ DECL_HLSL_BUFFER
A HLSLBufferDecl record.
@ DECL_NAMESPACE_ALIAS
A NamespaceAliasDecl record.
@ DECL_TYPEALIAS
A TypeAliasDecl record.
@ DECL_FUNCTION_TEMPLATE
A FunctionTemplateDecl record.
@ DECL_MS_GUID
A MSGuidDecl record.
@ DECL_UNRESOLVED_USING_TYPENAME
An UnresolvedUsingTypenameDecl record.
@ DECL_CLASS_TEMPLATE_SPECIALIZATION
A ClassTemplateSpecializationDecl record.
@ DECL_FILE_SCOPE_ASM
A FileScopeAsmDecl record.
@ DECL_PARTIAL_SPECIALIZATIONS
@ DECL_CXX_CONSTRUCTOR
A CXXConstructorDecl record.
@ DECL_CXX_CONVERSION
A CXXConversionDecl record.
@ DECL_FIELD
A FieldDecl record.
@ DECL_LINKAGE_SPEC
A LinkageSpecDecl record.
@ DECL_CONTEXT_TU_LOCAL_VISIBLE
A record that stores the set of declarations that are only visible to the TU.
@ DECL_NAMESPACE
A NamespaceDecl record.
@ DECL_NON_TYPE_TEMPLATE_PARM
A NonTypeTemplateParmDecl record.
@ DECL_USING_PACK
A UsingPackDecl record.
@ DECL_FUNCTION
A FunctionDecl record.
@ DECL_USING_DIRECTIVE
A UsingDirecitveDecl record.
@ DECL_RECORD
A RecordDecl record.
@ DECL_CONTEXT_LEXICAL
A record that stores the set of declarations that are lexically stored within a given DeclContext.
@ DECL_BLOCK
A BlockDecl record.
@ DECL_UNRESOLVED_USING_VALUE
An UnresolvedUsingValueDecl record.
@ DECL_TYPE_ALIAS_TEMPLATE
A TypeAliasTemplateDecl record.
@ DECL_CXX_CTOR_INITIALIZERS
A record containing CXXCtorInitializers.
@ DECL_OBJC_CATEGORY
A ObjCCategoryDecl record.
@ DECL_VAR
A VarDecl record.
@ DECL_UNRESOLVED_USING_IF_EXISTS
An UnresolvedUsingIfExistsDecl record.
@ DECL_USING
A UsingDecl record.
@ DECL_OBJC_PROTOCOL
A ObjCProtocolDecl record.
@ DECL_TEMPLATE_TYPE_PARM
A TemplateTypeParmDecl record.
@ DECL_VAR_TEMPLATE_SPECIALIZATION
A VarTemplateSpecializationDecl record.
@ DECL_OBJC_IMPLEMENTATION
A ObjCImplementationDecl record.
@ DECL_LABEL
A LabelDecl record.
@ DECL_OBJC_COMPATIBLE_ALIAS
A ObjCCompatibleAliasDecl record.
@ DECL_CONSTRUCTOR_USING_SHADOW
A ConstructorUsingShadowDecl record.
@ DECL_USING_ENUM
A UsingEnumDecl record.
@ DECL_FRIEND_TEMPLATE
A FriendTemplateDecl record.
@ DECL_PRAGMA_DETECT_MISMATCH
A PragmaDetectMismatchDecl record.
@ DECL_EXPANDED_NON_TYPE_TEMPLATE_PARM_PACK
A NonTypeTemplateParmDecl record that stores an expanded non-type template parameter pack.
@ DECL_OBJC_AT_DEFS_FIELD
A ObjCAtDefsFieldDecl record.
@ DECL_IMPLICIT_PARAM
An ImplicitParamDecl record.
@ DECL_FRIEND
A FriendDecl record.
@ DECL_CXX_METHOD
A CXXMethodDecl record.
@ DECL_EXPORT
An ExportDecl record.
@ DECL_BINDING
A BindingDecl record.
@ DECL_PRAGMA_COMMENT
A PragmaCommentDecl record.
@ DECL_ENUM
An EnumDecl record.
@ DECL_CONTEXT_MODULE_LOCAL_VISIBLE
A record containing the set of declarations that are only visible from DeclContext in the same module...
@ DECL_DECOMPOSITION
A DecompositionDecl record.
@ DECL_OMP_DECLARE_REDUCTION
An OMPDeclareReductionDecl record.
@ DECL_OMP_THREADPRIVATE
An OMPThreadPrivateDecl record.
@ DECL_OBJC_METHOD
A ObjCMethodDecl record.
@ DECL_CXX_DESTRUCTOR
A CXXDestructorDecl record.
@ DECL_OMP_CAPTUREDEXPR
An OMPCapturedExprDecl record.
@ DECL_CLASS_TEMPLATE
A ClassTemplateDecl record.
@ DECL_USING_SHADOW
A UsingShadowDecl record.
@ DECL_CONCEPT
A ConceptDecl record.
@ DECL_CXX_DEDUCTION_GUIDE
A CXXDeductionGuideDecl record.
@ DECL_OMP_REQUIRES
An OMPRequiresDecl record.
@ DECL_OBJC_IVAR
A ObjCIvarDecl record.
@ DECL_OBJC_PROPERTY
A ObjCPropertyDecl record.
@ DECL_TEMPLATE_PARAM_OBJECT
A TemplateParamObjectDecl record.
@ DECL_OBJC_INTERFACE
A ObjCInterfaceDecl record.
@ DECL_VAR_TEMPLATE
A VarTemplateDecl record.
@ DECL_LIFETIME_EXTENDED_TEMPORARY
An LifetimeExtendedTemporaryDecl record.
@ DECL_CLASS_TEMPLATE_PARTIAL_SPECIALIZATION
A ClassTemplatePartialSpecializationDecl record.
@ DECL_IMPLICIT_CONCEPT_SPECIALIZATION
An ImplicitConceptSpecializationDecl record.
@ DECL_CONTEXT_VISIBLE
A record that stores the set of declarations that are visible from a given DeclContext.
@ DECL_OBJC_PROPERTY_IMPL
A ObjCPropertyImplDecl record.
Defines the Linkage enumeration and various utility functions.
const internal::VariadicAllOfMatcher< Decl > decl
Matches declarations.
ComparisonCategoryResult Compare(const T &X, const T &Y)
Helper to compare two comparable types.
uint64_t TypeID
An ID number that refers to a type in an AST file.
uint32_t SubmoduleID
An ID number that refers to a submodule in a module file.
bool needsAnonymousDeclarationNumber(const NamedDecl *D)
Determine whether the given declaration needs an anonymous declaration number.
void numberAnonymousDeclsWithin(const DeclContext *DC, Fn Visit)
Visit each declaration within DC that needs an anonymous declaration number and call Visit with the d...
bool isPartOfPerModuleInitializer(const Decl *D)
Determine whether the given declaration will be included in the per-module initializer if it needs to...
@ UPD_CXX_RESOLVED_DTOR_DELETE
@ UPD_CXX_INSTANTIATED_DEFAULT_MEMBER_INITIALIZER
@ UPD_CXX_DEDUCED_RETURN_TYPE
@ UPD_CXX_ADDED_IMPLICIT_MEMBER
@ UPD_DECL_MARKED_OPENMP_DECLARETARGET
@ UPD_CXX_POINT_OF_INSTANTIATION
@ UPD_CXX_RESOLVED_EXCEPTION_SPEC
@ UPD_CXX_ADDED_FUNCTION_DEFINITION
@ UPD_DECL_MARKED_OPENMP_THREADPRIVATE
@ UPD_STATIC_LOCAL_NUMBER
@ UPD_CXX_INSTANTIATED_DEFAULT_ARGUMENT
@ UPD_ADDED_ATTR_TO_RECORD
@ UPD_DECL_MARKED_OPENMP_ALLOCATE
@ UPD_CXX_ADDED_ANONYMOUS_NAMESPACE
@ UPD_CXX_INSTANTIATED_CLASS_DEFINITION
@ UPD_CXX_ADDED_VAR_DEFINITION
The JSON file list parser is used to communicate input to InstallAPI.
SelectorLocationsKind
Whether all locations of the selector identifiers are in a "standard" position.
bool isUnresolvedExceptionSpec(ExceptionSpecificationType ESpecType)
ConstexprSpecKind
Define the kind of constexpr specifier.
LinkageSpecLanguageIDs
Represents the language in a linkage specification.
LazyOffsetPtr< Stmt, uint64_t, &ExternalASTSource::GetExternalDeclStmt > LazyDeclStmtPtr
A lazy pointer to a statement.
LambdaCaptureKind
The different capture forms in a lambda introducer.
@ LCK_ByCopy
Capturing by copy (a.k.a., by value)
@ LCK_ByRef
Capturing by reference.
@ LCK_VLAType
Capturing variable-length array type.
@ LCK_StarThis
Capturing the *this object by copy.
@ LCK_This
Capturing the *this object by reference.
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.
TagTypeKind
The kind of a tag type.
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)
for(const auto &A :T->param_types())
const FunctionProtoType * T
DeductionCandidate
Only used by CXXDeductionGuideDecl.
bool shouldSkipCheckingODR(const Decl *D)
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
@ Interface
The "__interface" keyword introduces the elaborated-type-specifier.
@ Class
The "class" keyword introduces the elaborated-type-specifier.
@ Other
Other implicit parameter.
AccessSpecifier
A C++ access specifier (public, private, protected), plus the special value "none" which means differ...
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 HasConstantInitialization
Whether this variable is known to have constant initialization.
Provides information about an explicit instantiation of a variable or class template.
SourceLocation ExternKeywordLoc
The location of the extern keyword.
Data that is common to all of the declarations of a given function template.
llvm::FoldingSetVector< FunctionTemplateSpecializationInfo > Specializations
The function template specializations for this function template, including explicit specializations ...
A struct with extended info about a syntactic name qualifier, to be used for the case of out-of-line ...
Helper class that saves the current stream position and then restores it when destroyed.
llvm::DenseSet< std::tuple< Decl *, Decl *, int > > NonEquivalentDeclSet
Store declaration pairs already found to be non-equivalent.
Describes the categories of an Objective-C class.