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;
87 ASTReader::RecordLocation Loc;
94 unsigned AnonymousDeclNumber = 0;
101 bool IsDeclMarkedUsed =
false;
103 uint64_t GetCurrentCursorOffset();
105 uint64_t ReadLocalOffset() {
106 uint64_t LocalOffset =
Record.readInt();
107 assert(LocalOffset <
Loc.Offset &&
"offset point after current record");
108 return LocalOffset ?
Loc.Offset - LocalOffset : 0;
111 uint64_t ReadGlobalOffset() {
112 uint64_t Local = ReadLocalOffset();
113 return Local ?
Record.getGlobalBitOffset(Local) : 0;
117 return Record.readSourceLocation();
121 return Record.readSourceRange();
125 return Record.readTypeSourceInfo();
130 std::string readString() {
131 return Record.readString();
135 for (
unsigned I = 0, Size =
Record.readInt(); I != Size; ++I)
136 IDs.push_back(readDeclID());
156 return Record.getSubmodule(readSubmoduleID());
160 Decl *LambdaContext =
nullptr,
161 unsigned IndexInLambdaContext = 0);
162 void ReadCXXDefinitionData(
struct CXXRecordDecl::DefinitionData &
Data,
164 unsigned IndexInLambdaContext);
166 struct CXXRecordDecl::DefinitionData &&NewDD);
167 void ReadObjCDefinitionData(
struct ObjCInterfaceDecl::DefinitionData &
Data);
169 struct ObjCInterfaceDecl::DefinitionData &&NewDD);
170 void ReadObjCDefinitionData(
struct ObjCProtocolDecl::DefinitionData &
Data);
172 struct ObjCProtocolDecl::DefinitionData &&NewDD);
190 class RedeclarableResult {
197 : MergeWith(MergeWith), FirstID(FirstID), IsKeyDecl(IsKeyDecl) {}
203 bool isKeyDecl()
const {
return IsKeyDecl; }
207 Decl *getKnownMergeTarget()
const {
return MergeWith; }
215 class FindExistingResult {
219 bool AddResult =
false;
220 unsigned AnonymousDeclNumber = 0;
224 FindExistingResult(
ASTReader &Reader) : Reader(Reader) {}
227 unsigned AnonymousDeclNumber,
229 : Reader(Reader), New(New), Existing(Existing), AddResult(
true),
230 AnonymousDeclNumber(AnonymousDeclNumber),
231 TypedefNameForLinkage(TypedefNameForLinkage) {}
233 FindExistingResult(FindExistingResult &&
Other)
235 AddResult(
Other.AddResult),
236 AnonymousDeclNumber(
Other.AnonymousDeclNumber),
237 TypedefNameForLinkage(
Other.TypedefNameForLinkage) {
238 Other.AddResult =
false;
241 FindExistingResult &operator=(FindExistingResult &&) =
delete;
242 ~FindExistingResult();
246 void suppress() { AddResult =
false; }
248 operator NamedDecl*()
const {
return Existing; }
251 operator T*()
const {
return dyn_cast_or_null<T>(Existing); }
256 FindExistingResult findExisting(
NamedDecl *
D);
263 ThisDeclLoc(ThisDeclLoc) {}
265 template <
typename T>
274 auto *&LazySpecializations =
D->getCommonPtr()->LazySpecializations;
276 if (
auto &Old = LazySpecializations) {
277 IDs.insert(IDs.end(), Old + 1, Old + 1 + Old[0].getRawValue());
279 IDs.erase(std::unique(IDs.begin(), IDs.end()), IDs.end());
285 std::copy(IDs.begin(), IDs.end(),
Result + 1);
287 LazySpecializations =
Result;
290 template <
typename DeclT>
298 template <
typename DeclT>
306 template <
typename DeclT>
311 template <
typename DeclT>
322 Cat->NextClassCategory = Next;
427 template <
typename T>
431 Decl *Context,
unsigned Number);
434 RedeclarableResult &Redecl);
436 template <
typename T>
438 RedeclarableResult &Redecl);
480template <
typename DeclT>
class MergedRedeclIterator {
481 DeclT *Start =
nullptr;
482 DeclT *Canonical =
nullptr;
483 DeclT *Current =
nullptr;
486 MergedRedeclIterator() =
default;
487 MergedRedeclIterator(DeclT *Start) : Start(Start), Current(Start) {}
491 MergedRedeclIterator &operator++() {
492 if (Current->isFirstDecl()) {
494 Current = Current->getMostRecentDecl();
496 Current = Current->getPreviousDecl();
502 if (Current == Start || Current == Canonical)
507 friend bool operator!=(
const MergedRedeclIterator &A,
508 const MergedRedeclIterator &B) {
509 return A.Current != B.Current;
515template <
typename DeclT>
516static llvm::iterator_range<MergedRedeclIterator<DeclT>>
518 return llvm::make_range(MergedRedeclIterator<DeclT>(
D),
519 MergedRedeclIterator<DeclT>());
522uint64_t ASTDeclReader::GetCurrentCursorOffset() {
523 return Loc.F->DeclsCursor.GetCurrentBitNo() + Loc.F->GlobalBitOffset;
528 Reader.DefinitionSource[FD] =
529 Loc.F->Kind == ModuleKind::MK_MainFile ||
532 if (
auto *CD = dyn_cast<CXXConstructorDecl>(FD)) {
533 CD->setNumCtorInitializers(
Record.readInt());
534 if (CD->getNumCtorInitializers())
535 CD->CtorInitializers = ReadGlobalOffset();
538 Reader.PendingBodies[FD] = GetCurrentCursorOffset();
547 IsDeclMarkedUsed =
false;
549 if (
auto *DD = dyn_cast<DeclaratorDecl>(
D)) {
550 if (
auto *TInfo = DD->getTypeSourceInfo())
551 Record.readTypeLoc(TInfo->getTypeLoc());
554 if (
auto *TD = dyn_cast<TypeDecl>(
D)) {
560 if (NamedDeclForTagDecl.
isValid())
561 cast<TagDecl>(
D)->TypedefNameDeclOrQualifier =
562 cast<TypedefNameDecl>(Reader.
GetDecl(NamedDeclForTagDecl));
563 }
else if (
auto *ID = dyn_cast<ObjCInterfaceDecl>(
D)) {
566 }
else if (
auto *FD = dyn_cast<FunctionDecl>(
D)) {
570 }
else if (
auto *VD = dyn_cast<VarDecl>(
D)) {
572 }
else if (
auto *FD = dyn_cast<FieldDecl>(
D)) {
573 if (FD->hasInClassInitializer() &&
Record.readInt()) {
574 FD->setLazyInClassInitializer(
LazyDeclStmtPtr(GetCurrentCursorOffset()));
581 auto ModuleOwnership =
585 IsDeclMarkedUsed |=
D->Used;
588 bool HasStandaloneLexicalDC = DeclBits.
getNextBit();
595 isa<ParmVarDecl, ObjCTypeParamDecl>(
D)) {
602 GlobalDeclID SemaDCIDForTemplateParmDecl = readDeclID();
605 if (LexicalDCIDForTemplateParmDecl.
isInvalid())
606 LexicalDCIDForTemplateParmDecl = SemaDCIDForTemplateParmDecl;
607 Reader.addPendingDeclContextInfo(
D,
608 SemaDCIDForTemplateParmDecl,
609 LexicalDCIDForTemplateParmDecl);
612 auto *SemaDC = readDeclAs<DeclContext>();
614 HasStandaloneLexicalDC ? readDeclAs<DeclContext>() :
nullptr;
620 if (
auto *RD = dyn_cast<CXXRecordDecl>(SemaDC))
621 MergedSemaDC = getOrFakePrimaryClassDefinition(Reader, RD);
623 MergedSemaDC = Reader.MergedDeclContexts.lookup(SemaDC);
626 D->setDeclContextsImpl(MergedSemaDC ? MergedSemaDC : SemaDC, LexicalDC,
633 Record.readAttributes(Attrs);
644 switch (ModuleOwnership) {
670 Reader.HiddenNamesMap[Owner].push_back(
D);
672 }
else if (ModulePrivate) {
681 std::string Arg = readString();
682 memcpy(
D->getTrailingObjects<
char>(), Arg.data(), Arg.size());
683 D->getTrailingObjects<
char>()[Arg.size()] =
'\0';
689 std::string Name = readString();
690 memcpy(
D->getTrailingObjects<
char>(), Name.data(), Name.size());
691 D->getTrailingObjects<
char>()[Name.size()] =
'\0';
693 D->ValueStart = Name.size() + 1;
694 std::string
Value = readString();
695 memcpy(
D->getTrailingObjects<
char>() +
D->ValueStart,
Value.data(),
697 D->getTrailingObjects<
char>()[
D->ValueStart +
Value.size()] =
'\0';
701 llvm_unreachable(
"Translation units are not serialized");
707 AnonymousDeclNumber =
Record.readInt();
714 DeferredTypeID =
Record.getGlobalTypeID(
Record.readInt());
717ASTDeclReader::RedeclarableResult
742 if (
auto *Template = readDeclAs<TypeAliasTemplateDecl>())
769 Record.readQualifierInfo(*Info);
770 TD->TypedefNameDeclOrQualifier = Info;
774 NamedDeclForTagDecl = readDeclID();
775 TypedefNameForLinkage =
Record.readIdentifier();
778 llvm_unreachable(
"unexpected tag info kind");
781 if (!isa<CXXRecordDecl>(TD))
795 ED->setNumPositiveBits(EnumDeclBits.
getNextBits(8));
796 ED->setNumNegativeBits(EnumDeclBits.
getNextBits(8));
801 ED->setHasODRHash(
true);
802 ED->ODRHash =
Record.readInt();
819 Reader.MergedDeclContexts.insert(std::make_pair(ED, OldDef));
826 Reader.PendingEnumOdrMergeFailures[OldDef].push_back(ED);
832 if (
auto *InstED = readDeclAs<EnumDecl>()) {
835 ED->setInstantiationOfMemberEnum(Reader.
getContext(), InstED, TSK);
840ASTDeclReader::RedeclarableResult
864 RD->setODRHash(
Record.readInt());
870 RecordDecl *&OldDef = Reader.RecordDefinitions[Canon];
882 Reader.MergedDeclContexts.insert(std::make_pair(RD, OldDef));
886 Reader.PendingRecordOdrMergeFailures[OldDef].push_back(RD);
898 if (isa<FunctionDecl, VarDecl>(VD))
899 DeferredTypeID =
Record.getGlobalTypeID(
Record.readInt());
916 auto *Info =
new (Reader.
getContext()) DeclaratorDecl::ExtInfo();
917 Record.readQualifierInfo(*Info);
918 Info->TrailingRequiresClause =
Record.readExpr();
923 TSIType.
isNull() ? nullptr
939 auto *Template = readDeclAs<FunctionTemplateDecl>();
945 auto *InstFD = readDeclAs<FunctionDecl>();
948 FD->setInstantiationOfMemberFunction(Reader.
getContext(), InstFD, TSK);
953 auto *Template = readDeclAs<FunctionTemplateDecl>();
958 Record.readTemplateArgumentList(TemplArgs,
true);
962 bool HasTemplateArgumentsAsWritten =
Record.readBool();
963 if (HasTemplateArgumentsAsWritten)
964 Record.readTemplateArgumentListInfo(TemplArgsWritten);
974 auto *FD = readDeclAs<FunctionDecl>();
984 C, FD, Template, TSK, TemplArgList,
985 HasTemplateArgumentsAsWritten ? &TemplArgsWritten :
nullptr, POI,
987 FD->TemplateOrSpecialization = FTInfo;
992 auto *CanonTemplate = readDeclAs<FunctionTemplateDecl>();
998 llvm::FoldingSetNodeID ID;
1000 void *InsertPos =
nullptr;
1008 "already deserialized this template specialization");
1017 unsigned NumCandidates =
Record.readInt();
1018 while (NumCandidates--)
1019 Candidates.
addDecl(readDeclAs<NamedDecl>());
1023 bool HasTemplateArgumentsAsWritten =
Record.readBool();
1024 if (HasTemplateArgumentsAsWritten)
1025 Record.readTemplateArgumentListInfo(TemplArgsWritten);
1029 HasTemplateArgumentsAsWritten ? &TemplArgsWritten :
nullptr);
1048 Reader.PendingDeducedFunctionTypes.push_back({FD, DeferredTypeID});
1070 const bool Pure = FunctionDeclBits.
getNextBit();
1088 FD->EndRangeLoc = readSourceLocation();
1092 FD->ODRHash =
Record.readInt();
1093 FD->setHasODRHash(
true);
1099 if (
auto Info =
Record.readInt()) {
1100 bool HasMessage = Info & 2;
1102 HasMessage ? cast<StringLiteral>(
Record.readExpr()) :
nullptr;
1104 unsigned NumLookups =
Record.readInt();
1106 for (
unsigned I = 0; I != NumLookups; ++I) {
1114 Reader.
getContext(), Lookups, DeletedMessage));
1125 auto merge = [
this, &Redecl, FD](
auto &&F) {
1126 auto *Existing = cast_or_null<FunctionDecl>(Redecl.getKnownMergeTarget());
1127 RedeclarableResult NewRedecl(Existing ? F(Existing) :
nullptr,
1128 Redecl.getFirstID(), Redecl.isKeyDecl());
1146 unsigned NumParams =
Record.readInt();
1148 Params.reserve(NumParams);
1149 for (
unsigned I = 0; I != NumParams; ++I)
1150 Params.push_back(readDeclAs<ParmVarDecl>());
1159 Reader.PendingBodies[MD] = GetCurrentCursorOffset();
1162 MD->
setCmdDecl(readDeclAs<ImplicitParamDecl>());
1175 readDeclAs<ObjCMethodDecl>());
1183 MD->DeclEndLoc = readSourceLocation();
1184 unsigned NumParams =
Record.readInt();
1186 Params.reserve(NumParams);
1187 for (
unsigned I = 0; I != NumParams; ++I)
1188 Params.push_back(readDeclAs<ParmVarDecl>());
1191 unsigned NumStoredSelLocs =
Record.readInt();
1193 SelLocs.reserve(NumStoredSelLocs);
1194 for (
unsigned i = 0; i != NumStoredSelLocs; ++i)
1195 SelLocs.push_back(readSourceLocation());
1197 MD->setParamsAndSelLocs(Reader.
getContext(), Params, SelLocs);
1203 D->Variance =
Record.readInt();
1205 D->VarianceLoc = readSourceLocation();
1206 D->ColonLoc = readSourceLocation();
1216 unsigned numParams =
Record.readInt();
1221 typeParams.reserve(numParams);
1222 for (
unsigned i = 0; i != numParams; ++i) {
1223 auto *typeParam = readDeclAs<ObjCTypeParamDecl>();
1227 typeParams.push_back(typeParam);
1234 typeParams, rAngleLoc);
1237void ASTDeclReader::ReadObjCDefinitionData(
1238 struct ObjCInterfaceDecl::DefinitionData &
Data) {
1240 Data.SuperClassTInfo = readTypeSourceInfo();
1242 Data.EndLoc = readSourceLocation();
1243 Data.HasDesignatedInitializers =
Record.readInt();
1245 Data.HasODRHash =
true;
1248 unsigned NumProtocols =
Record.readInt();
1250 Protocols.reserve(NumProtocols);
1251 for (
unsigned I = 0; I != NumProtocols; ++I)
1252 Protocols.push_back(readDeclAs<ObjCProtocolDecl>());
1254 ProtoLocs.reserve(NumProtocols);
1255 for (
unsigned I = 0; I != NumProtocols; ++I)
1256 ProtoLocs.push_back(readSourceLocation());
1257 Data.ReferencedProtocols.set(Protocols.data(), NumProtocols, ProtoLocs.data(),
1261 NumProtocols =
Record.readInt();
1263 Protocols.reserve(NumProtocols);
1264 for (
unsigned I = 0; I != NumProtocols; ++I)
1265 Protocols.push_back(readDeclAs<ObjCProtocolDecl>());
1266 Data.AllReferencedProtocols.set(Protocols.data(), NumProtocols,
1271 struct ObjCInterfaceDecl::DefinitionData &&NewDD) {
1272 struct ObjCInterfaceDecl::DefinitionData &DD =
D->data();
1273 if (DD.Definition == NewDD.Definition)
1276 Reader.MergedDeclContexts.insert(
1277 std::make_pair(NewDD.Definition, DD.Definition));
1280 if (
D->getODRHash() != NewDD.ODRHash)
1281 Reader.PendingObjCInterfaceOdrMergeFailures[DD.Definition].push_back(
1282 {NewDD.Definition, &NewDD});
1288 DeferredTypeID =
Record.getGlobalTypeID(
Record.readInt());
1294 ID->allocateDefinitionData();
1296 ReadObjCDefinitionData(
ID->data());
1298 if (Canon->Data.getPointer()) {
1301 MergeDefinitionData(Canon, std::move(
ID->data()));
1302 ID->Data = Canon->Data;
1306 ID->getCanonicalDecl()->Data =
ID->Data;
1309 ID->setIvarList(
nullptr);
1313 Reader.PendingDefinitions.insert(
ID);
1316 Reader.ObjCClassesLoaded.push_back(
ID);
1318 ID->Data =
ID->getCanonicalDecl()->Data;
1327 bool synth =
Record.readInt();
1342 if (PrevIvar && PrevIvar != IVD) {
1343 auto *ParentExt = dyn_cast<ObjCCategoryDecl>(IVD->
getDeclContext());
1344 auto *PrevParentExt =
1346 if (ParentExt && PrevParentExt) {
1350 .PendingObjCExtensionIvarRedeclarations[std::make_pair(ParentExt,
1352 .push_back(std::make_pair(IVD, PrevIvar));
1353 }
else if (ParentExt || PrevParentExt) {
1364void ASTDeclReader::ReadObjCDefinitionData(
1365 struct ObjCProtocolDecl::DefinitionData &
Data) {
1366 unsigned NumProtoRefs =
Record.readInt();
1368 ProtoRefs.reserve(NumProtoRefs);
1369 for (
unsigned I = 0; I != NumProtoRefs; ++I)
1370 ProtoRefs.push_back(readDeclAs<ObjCProtocolDecl>());
1372 ProtoLocs.reserve(NumProtoRefs);
1373 for (
unsigned I = 0; I != NumProtoRefs; ++I)
1374 ProtoLocs.push_back(readSourceLocation());
1375 Data.ReferencedProtocols.set(ProtoRefs.data(), NumProtoRefs,
1378 Data.HasODRHash =
true;
1381void ASTDeclReader::MergeDefinitionData(
1383 struct ObjCProtocolDecl::DefinitionData &DD =
D->data();
1384 if (DD.Definition == NewDD.Definition)
1387 Reader.MergedDeclContexts.insert(
1388 std::make_pair(NewDD.Definition, DD.Definition));
1391 if (
D->getODRHash() != NewDD.ODRHash)
1392 Reader.PendingObjCProtocolOdrMergeFailures[DD.Definition].push_back(
1393 {NewDD.Definition, &NewDD});
1403 PD->allocateDefinitionData();
1405 ReadObjCDefinitionData(PD->data());
1408 if (Canon->Data.getPointer()) {
1411 MergeDefinitionData(Canon, std::move(PD->data()));
1412 PD->Data = Canon->Data;
1419 Reader.PendingDefinitions.insert(PD);
1438 Reader.CategoriesDeserialized.insert(CD);
1440 CD->ClassInterface = readDeclAs<ObjCInterfaceDecl>();
1442 unsigned NumProtoRefs =
Record.readInt();
1444 ProtoRefs.reserve(NumProtoRefs);
1445 for (
unsigned I = 0; I != NumProtoRefs; ++I)
1446 ProtoRefs.push_back(readDeclAs<ObjCProtocolDecl>());
1448 ProtoLocs.reserve(NumProtoRefs);
1449 for (
unsigned I = 0; I != NumProtoRefs; ++I)
1450 ProtoLocs.push_back(readSourceLocation());
1468 D->setAtLoc(readSourceLocation());
1469 D->setLParenLoc(readSourceLocation());
1474 D->setPropertyAttributesAsWritten(
1476 D->setPropertyImplementation(
1484 D->setGetterMethodDecl(readDeclAs<ObjCMethodDecl>());
1485 D->setSetterMethodDecl(readDeclAs<ObjCMethodDecl>());
1486 D->setPropertyIvarDecl(readDeclAs<ObjCIvarDecl>());
1491 D->setClassInterface(readDeclAs<ObjCInterfaceDecl>());
1496 D->CategoryNameLoc = readSourceLocation();
1501 D->setSuperClass(readDeclAs<ObjCInterfaceDecl>());
1502 D->SuperLoc = readSourceLocation();
1503 D->setIvarLBraceLoc(readSourceLocation());
1504 D->setIvarRBraceLoc(readSourceLocation());
1505 D->setHasNonZeroConstructors(
Record.readInt());
1506 D->setHasDestructors(
Record.readInt());
1507 D->NumIvarInitializers =
Record.readInt();
1508 if (
D->NumIvarInitializers)
1509 D->IvarInitializers = ReadGlobalOffset();
1514 D->setAtLoc(readSourceLocation());
1515 D->setPropertyDecl(readDeclAs<ObjCPropertyDecl>());
1516 D->PropertyIvarDecl = readDeclAs<ObjCIvarDecl>();
1517 D->IvarLoc = readSourceLocation();
1518 D->setGetterMethodDecl(readDeclAs<ObjCMethodDecl>());
1519 D->setSetterMethodDecl(readDeclAs<ObjCMethodDecl>());
1520 D->setGetterCXXConstructor(
Record.readExpr());
1521 D->setSetterCXXAssignment(
Record.readExpr());
1526 FD->Mutable =
Record.readInt();
1528 unsigned Bits =
Record.readInt();
1529 FD->StorageKind = Bits >> 1;
1530 if (FD->StorageKind == FieldDecl::ISK_CapturedVLAType)
1532 cast<VariableArrayType>(
Record.readType().getTypePtr());
1537 if (
auto *Tmpl = readDeclAs<FieldDecl>())
1545 PD->GetterId =
Record.readIdentifier();
1546 PD->SetterId =
Record.readIdentifier();
1551 D->PartVal.Part1 =
Record.readInt();
1552 D->PartVal.Part2 =
Record.readInt();
1553 D->PartVal.Part3 =
Record.readInt();
1554 for (
auto &
C :
D->PartVal.Part4And5)
1565 D->Value =
Record.readAPValue();
1569 Reader.
getContext().UnnamedGlobalConstantDecls.GetOrInsertNode(
D))
1575 D->Value =
Record.readAPValue();
1580 Reader.
getContext().TemplateParamObjectDecls.GetOrInsertNode(
D))
1587 FD->ChainingSize =
Record.readInt();
1588 assert(FD->ChainingSize >= 2 &&
"Anonymous chaining must be >= 2");
1591 for (
unsigned I = 0; I != FD->ChainingSize; ++I)
1592 FD->Chaining[I] = readDeclAs<NamedDecl>();
1603 bool DefGeneratedInModule = VarDeclBits.
getNextBit();
1608 bool HasDeducedType =
false;
1609 if (!isa<ParmVarDecl>(VD)) {
1635 Reader.PendingDeducedVarTypes.push_back({VD, DeferredTypeID});
1647 if (DefGeneratedInModule) {
1648 Reader.DefinitionSource[VD] =
1649 Loc.F->Kind == ModuleKind::MK_MainFile ||
1653 if (VD->
hasAttr<BlocksAttr>()) {
1660 VarNotTemplate = 0, VarTemplate, StaticDataMemberSpecialization
1662 switch ((VarKind)
Record.readInt()) {
1663 case VarNotTemplate:
1666 if (!isa<ParmVarDecl>(VD) && !isa<ImplicitParamDecl>(VD) &&
1667 !isa<VarTemplateSpecializationDecl>(VD))
1674 case StaticDataMemberSpecialization: {
1675 auto *Tmpl = readDeclAs<VarDecl>();
1688 if (uint64_t Val =
Record.readInt()) {
1702 Eval->
Value = GetCurrentCursorOffset();
1713 unsigned scopeIndex =
Record.readInt();
1715 unsigned isObjCMethodParam = ParmVarDeclBits.
getNextBit();
1716 unsigned scopeDepth = ParmVarDeclBits.
getNextBits(7);
1717 unsigned declQualifier = ParmVarDeclBits.
getNextBits(7);
1718 if (isObjCMethodParam) {
1719 assert(scopeDepth == 0);
1732 PD->ExplicitObjectParameterIntroducerLoc =
Record.readSourceLocation();
1740 auto **BDs = DD->getTrailingObjects<
BindingDecl *>();
1741 for (
unsigned I = 0; I != DD->NumBindings; ++I) {
1742 BDs[I] = readDeclAs<BindingDecl>();
1743 BDs[I]->setDecomposedDecl(DD);
1749 BD->Binding =
Record.readExpr();
1760 D->Statement =
Record.readStmt();
1767 unsigned NumParams =
Record.readInt();
1769 Params.reserve(NumParams);
1770 for (
unsigned I = 0; I != NumParams; ++I)
1771 Params.push_back(readDeclAs<ParmVarDecl>());
1780 bool capturesCXXThis =
Record.readInt();
1781 unsigned numCaptures =
Record.readInt();
1783 captures.reserve(numCaptures);
1784 for (
unsigned i = 0; i != numCaptures; ++i) {
1785 auto *
decl = readDeclAs<VarDecl>();
1786 unsigned flags =
Record.readInt();
1787 bool byRef = (flags & 1);
1788 bool nested = (flags & 2);
1789 Expr *copyExpr = ((flags & 4) ?
Record.readExpr() :
nullptr);
1798 unsigned ContextParamPos =
Record.readInt();
1801 for (
unsigned I = 0; I < CD->NumParams; ++I) {
1802 if (I != ContextParamPos)
1803 CD->
setParam(I, readDeclAs<ImplicitParamDecl>());
1812 D->setExternLoc(readSourceLocation());
1813 D->setRBraceLoc(readSourceLocation());
1818 D->RBraceLoc = readSourceLocation();
1823 D->setLocStart(readSourceLocation());
1833 D->LocStart = readSourceLocation();
1834 D->RBraceLoc = readSourceLocation();
1841 if (Redecl.getFirstID() == ThisDeclID)
1842 AnonNamespace = readDeclID();
1846 if (AnonNamespace.
isValid()) {
1850 auto *Anon = cast<NamespaceDecl>(Reader.
GetDecl(AnonNamespace));
1852 D->setAnonymousNamespace(Anon);
1859 D->IsCBuffer =
Record.readBool();
1860 D->KwLoc = readSourceLocation();
1861 D->LBraceLoc = readSourceLocation();
1862 D->RBraceLoc = readSourceLocation();
1868 D->NamespaceLoc = readSourceLocation();
1869 D->IdentLoc = readSourceLocation();
1870 D->QualifierLoc =
Record.readNestedNameSpecifierLoc();
1871 D->Namespace = readDeclAs<NamedDecl>();
1877 D->setUsingLoc(readSourceLocation());
1878 D->QualifierLoc =
Record.readNestedNameSpecifierLoc();
1879 D->DNLoc =
Record.readDeclarationNameLoc(
D->getDeclName());
1880 D->FirstUsingShadow.setPointer(readDeclAs<UsingShadowDecl>());
1881 D->setTypename(
Record.readInt());
1882 if (
auto *Pattern = readDeclAs<NamedDecl>())
1889 D->setUsingLoc(readSourceLocation());
1890 D->setEnumLoc(readSourceLocation());
1891 D->setEnumType(
Record.readTypeSourceInfo());
1892 D->FirstUsingShadow.setPointer(readDeclAs<UsingShadowDecl>());
1893 if (
auto *Pattern = readDeclAs<UsingEnumDecl>())
1900 D->InstantiatedFrom = readDeclAs<NamedDecl>();
1901 auto **Expansions =
D->getTrailingObjects<
NamedDecl *>();
1902 for (
unsigned I = 0; I !=
D->NumExpansions; ++I)
1903 Expansions[I] = readDeclAs<NamedDecl>();
1910 D->Underlying = readDeclAs<NamedDecl>();
1912 D->UsingOrNextShadow = readDeclAs<NamedDecl>();
1913 auto *Pattern = readDeclAs<UsingShadowDecl>();
1922 D->NominatedBaseClassShadowDecl = readDeclAs<ConstructorUsingShadowDecl>();
1923 D->ConstructedBaseClassShadowDecl = readDeclAs<ConstructorUsingShadowDecl>();
1924 D->IsVirtual =
Record.readInt();
1929 D->UsingLoc = readSourceLocation();
1930 D->NamespaceLoc = readSourceLocation();
1931 D->QualifierLoc =
Record.readNestedNameSpecifierLoc();
1932 D->NominatedNamespace = readDeclAs<NamedDecl>();
1933 D->CommonAncestor = readDeclAs<DeclContext>();
1938 D->setUsingLoc(readSourceLocation());
1939 D->QualifierLoc =
Record.readNestedNameSpecifierLoc();
1940 D->DNLoc =
Record.readDeclarationNameLoc(
D->getDeclName());
1941 D->EllipsisLoc = readSourceLocation();
1948 D->TypenameLocation = readSourceLocation();
1949 D->QualifierLoc =
Record.readNestedNameSpecifierLoc();
1950 D->EllipsisLoc = readSourceLocation();
1959void ASTDeclReader::ReadCXXDefinitionData(
1961 Decl *LambdaContext,
unsigned IndexInLambdaContext) {
1965#define FIELD(Name, Width, Merge) \
1966 if (!CXXRecordDeclBits.canGetNextNBits(Width)) \
1967 CXXRecordDeclBits.updateValue(Record.readInt()); \
1968 Data.Name = CXXRecordDeclBits.getNextBits(Width);
1970#include "clang/AST/CXXRecordDeclDefinitionBits.def"
1975 Data.HasODRHash =
true;
1978 Reader.DefinitionSource[
D] =
1979 Loc.F->Kind == ModuleKind::MK_MainFile ||
1984 Data.ComputedVisibleConversions =
Record.readInt();
1985 if (
Data.ComputedVisibleConversions)
1986 Record.readUnresolvedSet(
Data.VisibleConversions);
1987 assert(
Data.Definition &&
"Data.Definition should be already set!");
1989 if (!
Data.IsLambda) {
1990 assert(!LambdaContext && !IndexInLambdaContext &&
1991 "given lambda context for non-lambda");
1995 Data.Bases = ReadGlobalOffset();
1999 Data.VBases = ReadGlobalOffset();
2005 auto &Lambda =
static_cast<CXXRecordDecl::LambdaDefinitionData &
>(
Data);
2008 Lambda.DependencyKind = LambdaBits.getNextBits(2);
2009 Lambda.IsGenericLambda = LambdaBits.getNextBit();
2010 Lambda.CaptureDefault = LambdaBits.getNextBits(2);
2011 Lambda.NumCaptures = LambdaBits.getNextBits(15);
2012 Lambda.HasKnownInternalLinkage = LambdaBits.getNextBit();
2014 Lambda.NumExplicitCaptures =
Record.readInt();
2015 Lambda.ManglingNumber =
Record.readInt();
2016 if (
unsigned DeviceManglingNumber =
Record.readInt())
2017 Reader.
getContext().DeviceLambdaManglingNumbers[
D] = DeviceManglingNumber;
2018 Lambda.IndexInContext = IndexInLambdaContext;
2019 Lambda.ContextDecl = LambdaContext;
2021 if (Lambda.NumCaptures) {
2023 Lambda.NumCaptures);
2024 Lambda.AddCaptureList(Reader.
getContext(), ToCapture);
2026 Lambda.MethodTyInfo = readTypeSourceInfo();
2027 for (
unsigned I = 0, N = Lambda.NumCaptures; I != N; ++I) {
2030 bool IsImplicit = CaptureBits.getNextBit();
2043 auto *Var = readDeclAs<ValueDecl>();
2045 new (ToCapture)
Capture(
Loc, IsImplicit,
Kind, Var, EllipsisLoc);
2053void ASTDeclReader::MergeDefinitionData(
2054 CXXRecordDecl *
D,
struct CXXRecordDecl::DefinitionData &&MergeDD) {
2055 assert(
D->DefinitionData &&
2056 "merging class definition into non-definition");
2057 auto &DD = *
D->DefinitionData;
2059 if (DD.Definition != MergeDD.Definition) {
2061 Reader.MergedDeclContexts.insert(std::make_pair(MergeDD.Definition,
2063 Reader.PendingDefinitions.erase(MergeDD.Definition);
2064 MergeDD.Definition->setCompleteDefinition(
false);
2066 assert(!Reader.Lookups.contains(MergeDD.Definition) &&
2067 "already loaded pending lookups for merged definition");
2070 auto PFDI = Reader.PendingFakeDefinitionData.find(&DD);
2071 if (PFDI != Reader.PendingFakeDefinitionData.end() &&
2072 PFDI->second == ASTReader::PendingFakeDefinitionKind::Fake) {
2075 assert(!DD.IsLambda && !MergeDD.IsLambda &&
"faked up lambda definition?");
2076 PFDI->second = ASTReader::PendingFakeDefinitionKind::FakeLoaded;
2080 auto *Def = DD.Definition;
2081 DD = std::move(MergeDD);
2082 DD.Definition = Def;
2086 bool DetectedOdrViolation =
false;
2088 #define FIELD(Name, Width, Merge) Merge(Name)
2089 #define MERGE_OR(Field) DD.Field |= MergeDD.Field;
2090 #define NO_MERGE(Field) \
2091 DetectedOdrViolation |= DD.Field != MergeDD.Field; \
2093 #include "clang/AST/CXXRecordDeclDefinitionBits.def"
2098 if (DD.NumBases != MergeDD.NumBases || DD.NumVBases != MergeDD.NumVBases)
2099 DetectedOdrViolation =
true;
2105 if (MergeDD.ComputedVisibleConversions && !DD.ComputedVisibleConversions) {
2106 DD.VisibleConversions = std::move(MergeDD.VisibleConversions);
2107 DD.ComputedVisibleConversions =
true;
2114 auto &Lambda1 =
static_cast<CXXRecordDecl::LambdaDefinitionData &
>(DD);
2115 auto &Lambda2 =
static_cast<CXXRecordDecl::LambdaDefinitionData &
>(MergeDD);
2116 DetectedOdrViolation |= Lambda1.DependencyKind != Lambda2.DependencyKind;
2117 DetectedOdrViolation |= Lambda1.IsGenericLambda != Lambda2.IsGenericLambda;
2118 DetectedOdrViolation |= Lambda1.CaptureDefault != Lambda2.CaptureDefault;
2119 DetectedOdrViolation |= Lambda1.NumCaptures != Lambda2.NumCaptures;
2120 DetectedOdrViolation |=
2121 Lambda1.NumExplicitCaptures != Lambda2.NumExplicitCaptures;
2122 DetectedOdrViolation |=
2123 Lambda1.HasKnownInternalLinkage != Lambda2.HasKnownInternalLinkage;
2124 DetectedOdrViolation |= Lambda1.ManglingNumber != Lambda2.ManglingNumber;
2126 if (Lambda1.NumCaptures && Lambda1.NumCaptures == Lambda2.NumCaptures) {
2127 for (
unsigned I = 0, N = Lambda1.NumCaptures; I != N; ++I) {
2132 Lambda1.AddCaptureList(Reader.
getContext(), Lambda2.Captures.front());
2140 if (
D->getODRHash() != MergeDD.ODRHash) {
2141 DetectedOdrViolation =
true;
2144 if (DetectedOdrViolation)
2145 Reader.PendingOdrMergeFailures[DD.Definition].push_back(
2146 {MergeDD.Definition, &MergeDD});
2150 Decl *LambdaContext,
2151 unsigned IndexInLambdaContext) {
2152 struct CXXRecordDecl::DefinitionData *DD;
2157 bool IsLambda =
Record.readInt();
2158 assert(!(IsLambda &&
Update) &&
2159 "lambda definition should not be added by update record");
2161 DD =
new (
C) CXXRecordDecl::LambdaDefinitionData(
2164 DD =
new (
C)
struct CXXRecordDecl::DefinitionData(
D);
2170 if (!Canon->DefinitionData)
2171 Canon->DefinitionData = DD;
2172 D->DefinitionData = Canon->DefinitionData;
2173 ReadCXXDefinitionData(*DD,
D, LambdaContext, IndexInLambdaContext);
2178 if (Canon->DefinitionData != DD) {
2179 MergeDefinitionData(Canon, std::move(*DD));
2184 D->setCompleteDefinition(
true);
2190 Reader.PendingDefinitions.insert(
D);
2193ASTDeclReader::RedeclarableResult
2200 CXXRecNotTemplate = 0,
2202 CXXRecMemberSpecialization,
2206 Decl *LambdaContext =
nullptr;
2207 unsigned IndexInLambdaContext = 0;
2209 switch ((CXXRecKind)
Record.readInt()) {
2210 case CXXRecNotTemplate:
2212 if (!isa<ClassTemplateSpecializationDecl>(
D))
2215 case CXXRecTemplate: {
2217 auto *Template = readDeclAs<ClassTemplateDecl>();
2218 D->TemplateOrInstantiation = Template;
2219 if (!Template->getTemplatedDecl()) {
2230 case CXXRecMemberSpecialization: {
2231 auto *RD = readDeclAs<CXXRecordDecl>();
2236 D->TemplateOrInstantiation = MSI;
2241 LambdaContext = readDecl();
2243 IndexInLambdaContext =
Record.readInt();
2244 mergeLambda(
D, Redecl, LambdaContext, IndexInLambdaContext);
2249 bool WasDefinition =
Record.readInt();
2251 ReadCXXRecordDefinition(
D,
false, LambdaContext,
2252 IndexInLambdaContext);
2259 if (WasDefinition) {
2261 if (KeyFn.
isValid() &&
D->isCompleteDefinition())
2272 D->setExplicitSpecifier(
Record.readExplicitSpec());
2273 D->Ctor = readDeclAs<CXXConstructorDecl>();
2275 D->setDeductionCandidateKind(
2282 unsigned NumOverridenMethods =
Record.readInt();
2284 while (NumOverridenMethods--) {
2287 if (
auto *MD = readDeclAs<CXXMethodDecl>())
2293 Record.skipInts(NumOverridenMethods);
2300 D->setExplicitSpecifier(
Record.readExplicitSpec());
2301 if (
D->isInheritingConstructor()) {
2302 auto *Shadow = readDeclAs<ConstructorUsingShadowDecl>();
2303 auto *Ctor = readDeclAs<CXXConstructorDecl>();
2314 if (
auto *OperatorDelete = readDeclAs<FunctionDecl>()) {
2316 auto *ThisArg =
Record.readExpr();
2318 if (!Canon->OperatorDelete) {
2319 Canon->OperatorDelete = OperatorDelete;
2320 Canon->OperatorDeleteThisArg = ThisArg;
2326 D->setExplicitSpecifier(
Record.readExplicitSpec());
2332 D->ImportedModule = readModule();
2333 D->setImportComplete(
Record.readInt());
2335 for (
unsigned I = 0, N =
Record.back(); I != N; ++I)
2336 StoredLocs[I] = readSourceLocation();
2342 D->setColonLoc(readSourceLocation());
2348 D->Friend = readDeclAs<NamedDecl>();
2350 D->Friend = readTypeSourceInfo();
2351 for (
unsigned i = 0; i !=
D->NumTPLists; ++i)
2353 Record.readTemplateParameterList();
2355 D->UnsupportedFriend = (
Record.readInt() != 0);
2356 D->FriendLoc = readSourceLocation();
2361 unsigned NumParams =
Record.readInt();
2362 D->NumParams = NumParams;
2364 for (
unsigned i = 0; i != NumParams; ++i)
2365 D->Params[i] =
Record.readTemplateParameterList();
2367 D->Friend = readDeclAs<NamedDecl>();
2369 D->Friend = readTypeSourceInfo();
2370 D->FriendLoc = readSourceLocation();
2376 assert(!
D->TemplateParams &&
"TemplateParams already set!");
2377 D->TemplateParams =
Record.readTemplateParameterList();
2378 D->init(readDeclAs<NamedDecl>());
2383 D->ConstraintExpr =
Record.readExpr();
2393 for (
unsigned I = 0; I <
D->NumTemplateArgs; ++I)
2394 Args.push_back(
Record.readTemplateArgument(
true));
2395 D->setTemplateArguments(Args);
2401ASTDeclReader::RedeclarableResult
2410 Reader.PendingDefinitions.insert(CanonD);
2416 if (ThisDeclID == Redecl.getFirstID()) {
2417 if (
auto *RTD = readDeclAs<RedeclarableTemplateDecl>()) {
2418 assert(RTD->getKind() ==
D->
getKind() &&
2419 "InstantiatedFromMemberTemplate kind mismatch");
2420 D->setInstantiatedFromMemberTemplate(RTD);
2422 D->setMemberSpecialization();
2436 if (ThisDeclID == Redecl.getFirstID()) {
2440 readDeclIDList(SpecIDs);
2444 if (
D->getTemplatedDecl()->TemplateOrInstantiation) {
2449 D->getTemplatedDecl(),
D->getInjectedClassNameSpecialization());
2454 llvm_unreachable(
"BuiltinTemplates are not serialized");
2464 if (ThisDeclID == Redecl.getFirstID()) {
2468 readDeclIDList(SpecIDs);
2473ASTDeclReader::RedeclarableResult
2479 if (
Decl *InstD = readDecl()) {
2480 if (
auto *CTD = dyn_cast<ClassTemplateDecl>(InstD)) {
2481 D->SpecializedTemplate = CTD;
2484 Record.readTemplateArgumentList(TemplArgs);
2489 SpecializedPartialSpecialization();
2490 PS->PartialSpecialization
2491 = cast<ClassTemplatePartialSpecializationDecl>(InstD);
2492 PS->TemplateArgs = ArgList;
2493 D->SpecializedTemplate = PS;
2498 Record.readTemplateArgumentList(TemplArgs,
true);
2500 D->PointOfInstantiation = readSourceLocation();
2503 bool writtenAsCanonicalDecl =
Record.readInt();
2504 if (writtenAsCanonicalDecl) {
2505 auto *CanonPattern = readDeclAs<ClassTemplateDecl>();
2509 if (
auto *Partial = dyn_cast<ClassTemplatePartialSpecializationDecl>(
D)) {
2510 CanonSpec = CanonPattern->getCommonPtr()->PartialSpecializations
2511 .GetOrInsertNode(Partial);
2514 CanonPattern->getCommonPtr()->Specializations.GetOrInsertNode(
D);
2517 if (CanonSpec !=
D) {
2518 mergeRedeclarable<TagDecl>(
D, CanonSpec, Redecl);
2522 if (
auto *DDD =
D->DefinitionData) {
2523 if (CanonSpec->DefinitionData)
2524 MergeDefinitionData(CanonSpec, std::move(*DDD));
2526 CanonSpec->DefinitionData =
D->DefinitionData;
2528 D->DefinitionData = CanonSpec->DefinitionData;
2537 ExplicitInfo->TemplateKeywordLoc = readSourceLocation();
2538 D->ExplicitInfo = ExplicitInfo;
2542 D->setTemplateArgsAsWritten(
Record.readASTTemplateArgumentListInfo());
2552 D->TemplateParams = Params;
2557 if (ThisDeclID == Redecl.getFirstID()) {
2558 D->InstantiatedFromMember.setPointer(
2559 readDeclAs<ClassTemplatePartialSpecializationDecl>());
2560 D->InstantiatedFromMember.setInt(
Record.readInt());
2567 if (ThisDeclID == Redecl.getFirstID()) {
2570 readDeclIDList(SpecIDs);
2580ASTDeclReader::RedeclarableResult
2584 if (
Decl *InstD = readDecl()) {
2585 if (
auto *VTD = dyn_cast<VarTemplateDecl>(InstD)) {
2586 D->SpecializedTemplate = VTD;
2589 Record.readTemplateArgumentList(TemplArgs);
2594 VarTemplateSpecializationDecl::SpecializedPartialSpecialization();
2595 PS->PartialSpecialization =
2596 cast<VarTemplatePartialSpecializationDecl>(InstD);
2597 PS->TemplateArgs = ArgList;
2598 D->SpecializedTemplate = PS;
2606 ExplicitInfo->TemplateKeywordLoc = readSourceLocation();
2607 D->ExplicitInfo = ExplicitInfo;
2611 D->setTemplateArgsAsWritten(
Record.readASTTemplateArgumentListInfo());
2614 Record.readTemplateArgumentList(TemplArgs,
true);
2616 D->PointOfInstantiation = readSourceLocation();
2618 D->IsCompleteDefinition =
Record.readInt();
2622 bool writtenAsCanonicalDecl =
Record.readInt();
2623 if (writtenAsCanonicalDecl) {
2624 auto *CanonPattern = readDeclAs<VarTemplateDecl>();
2627 if (
auto *Partial = dyn_cast<VarTemplatePartialSpecializationDecl>(
D)) {
2628 CanonSpec = CanonPattern->getCommonPtr()
2629 ->PartialSpecializations.GetOrInsertNode(Partial);
2632 CanonPattern->getCommonPtr()->Specializations.GetOrInsertNode(
D);
2636 mergeRedeclarable<VarDecl>(
D, CanonSpec, Redecl);
2651 D->TemplateParams = Params;
2656 if (ThisDeclID == Redecl.getFirstID()) {
2657 D->InstantiatedFromMember.setPointer(
2658 readDeclAs<VarTemplatePartialSpecializationDecl>());
2659 D->InstantiatedFromMember.setInt(
Record.readInt());
2666 D->setDeclaredWithTypename(
Record.readInt());
2668 if (
D->hasTypeConstraint()) {
2671 CR =
Record.readConceptReference();
2672 Expr *ImmediatelyDeclaredConstraint =
Record.readExpr();
2674 D->setTypeConstraint(CR, ImmediatelyDeclaredConstraint);
2675 if ((
D->ExpandedParameterPack =
Record.readInt()))
2676 D->NumExpanded =
Record.readInt();
2681 Record.readTemplateArgumentLoc());
2687 D->setDepth(
Record.readInt());
2688 D->setPosition(
Record.readInt());
2689 if (
D->hasPlaceholderTypeConstraint())
2690 D->setPlaceholderTypeConstraint(
Record.readExpr());
2691 if (
D->isExpandedParameterPack()) {
2692 auto TypesAndInfos =
2693 D->getTrailingObjects<std::pair<QualType, TypeSourceInfo *>>();
2694 for (
unsigned I = 0, N =
D->getNumExpansionTypes(); I != N; ++I) {
2696 TypesAndInfos[I].second = readTypeSourceInfo();
2700 D->ParameterPack =
Record.readInt();
2703 Record.readTemplateArgumentLoc());
2709 D->setDeclaredWithTypename(
Record.readBool());
2711 D->setDepth(
Record.readInt());
2712 D->setPosition(
Record.readInt());
2713 if (
D->isExpandedParameterPack()) {
2715 for (
unsigned I = 0, N =
D->getNumExpansionTemplateParameters();
2717 Data[I] =
Record.readTemplateParameterList();
2720 D->ParameterPack =
Record.readInt();
2723 Record.readTemplateArgumentLoc());
2734 D->AssertExprAndFailed.setPointer(
Record.readExpr());
2735 D->AssertExprAndFailed.setInt(
Record.readInt());
2736 D->Message = cast_or_null<StringLiteral>(
Record.readExpr());
2737 D->RParenLoc = readSourceLocation();
2747 D->ExtendingDecl = readDeclAs<ValueDecl>();
2748 D->ExprWithTemporary =
Record.readStmt();
2753 D->ManglingNumber =
Record.readInt();
2757std::pair<uint64_t, uint64_t>
2759 uint64_t LexicalOffset = ReadLocalOffset();
2760 uint64_t VisibleOffset = ReadLocalOffset();
2761 return std::make_pair(LexicalOffset, VisibleOffset);
2764template <
typename T>
2765ASTDeclReader::RedeclarableResult
2768 Decl *MergeWith =
nullptr;
2770 bool IsKeyDecl = ThisDeclID == FirstDeclID;
2771 bool IsFirstLocalDecl =
false;
2773 uint64_t RedeclOffset = 0;
2778 FirstDeclID = ThisDeclID;
2780 IsFirstLocalDecl =
true;
2781 }
else if (
unsigned N =
Record.readInt()) {
2785 IsFirstLocalDecl =
true;
2792 for (
unsigned I = 0; I != N - 1; ++I)
2793 MergeWith = readDecl();
2795 RedeclOffset = ReadLocalOffset();
2802 auto *FirstDecl = cast_or_null<T>(Reader.
GetDecl(FirstDeclID));
2803 if (FirstDecl !=
D) {
2812 auto *DAsT =
static_cast<T *
>(
D);
2818 if (IsFirstLocalDecl)
2819 Reader.PendingDeclChains.push_back(std::make_pair(DAsT, RedeclOffset));
2821 return RedeclarableResult(MergeWith, FirstDeclID, IsKeyDecl);
2826template <
typename T>
2828 RedeclarableResult &Redecl) {
2837 auto *
D =
static_cast<T *
>(DBase);
2839 if (
auto *Existing = Redecl.getKnownMergeTarget())
2842 else if (FindExistingResult ExistingRes = findExisting(
D))
2843 if (
T *Existing = ExistingRes)
2854 Decl *Context,
unsigned IndexInContext) {
2868 if (
auto *Existing = Redecl.getKnownMergeTarget())
2874 NamedDecl *&Slot = Reader.LambdaDeclarationsForMerging[{
2875 Context->getCanonicalDecl(), IndexInContext}];
2883 RedeclarableResult &Redecl) {
2896 llvm_unreachable(
"bad assert_cast");
2904 auto *DPattern =
D->getTemplatedDecl();
2906 RedeclarableResult
Result(
2908 DPattern->getCanonicalDecl()->getGlobalID(), IsKeyDecl);
2910 if (
auto *DClass = dyn_cast<CXXRecordDecl>(DPattern)) {
2913 auto *ExistingClass =
2914 cast<CXXRecordDecl>(ExistingPattern)->getCanonicalDecl();
2915 if (
auto *DDD = DClass->DefinitionData) {
2916 if (ExistingClass->DefinitionData) {
2917 MergeDefinitionData(ExistingClass, std::move(*DDD));
2919 ExistingClass->DefinitionData = DClass->DefinitionData;
2922 Reader.PendingDefinitions.insert(DClass);
2925 DClass->DefinitionData = ExistingClass->DefinitionData;
2930 if (
auto *DFunction = dyn_cast<FunctionDecl>(DPattern))
2933 if (
auto *DVar = dyn_cast<VarDecl>(DPattern))
2935 if (
auto *DAlias = dyn_cast<TypeAliasDecl>(DPattern))
2938 llvm_unreachable(
"merged an unknown kind of redeclarable template");
2943template <
typename T>
2945 RedeclarableResult &Redecl) {
2946 auto *
D =
static_cast<T *
>(DBase);
2947 T *ExistingCanon = Existing->getCanonicalDecl();
2949 if (ExistingCanon != DCanon) {
2954 D->First = ExistingCanon;
2955 ExistingCanon->Used |=
D->Used;
2959 if (
auto *DTemplate = dyn_cast<RedeclarableTemplateDecl>(
D))
2961 DTemplate, assert_cast<RedeclarableTemplateDecl *>(ExistingCanon),
2962 Redecl.isKeyDecl());
2965 if (Redecl.isKeyDecl())
2966 Reader.KeyDecls[ExistingCanon].push_back(Redecl.getFirstID());
2979 if (isa<EnumConstantDecl, FieldDecl, IndirectFieldDecl>(ND))
2994 Reader.LETemporaryForMerging[std::make_pair(
3021 if (FindExistingResult ExistingRes = findExisting(
static_cast<T*
>(
D)))
3022 if (
T *Existing = ExistingRes)
3024 Existing->getCanonicalDecl());
3028 Record.readOMPChildren(
D->Data);
3033 Record.readOMPChildren(
D->Data);
3038 Record.readOMPChildren(
D->Data);
3047 D->setCombinerData(In, Out);
3049 D->setCombiner(Combiner);
3052 D->setInitializerData(Orig, Priv);
3055 D->setInitializer(
Init, IK);
3060 Record.readOMPChildren(
D->Data);
3062 D->VarName =
Record.readDeclarationName();
3081 uint64_t readInt() {
3085 bool readBool() {
return Reader.
readBool(); }
3099 std::string readString() {
3111 VersionTuple readVersionTuple() {
3117 template <
typename T>
T *readDeclAs() {
return Reader.
readDeclAs<
T>(); }
3122 AttrReader
Record(*
this);
3127 Attr *New =
nullptr;
3137 unsigned ParsedKind =
Record.readInt();
3138 unsigned Syntax =
Record.readInt();
3139 unsigned SpellingIndex =
Record.readInt();
3140 bool IsAlignas = (ParsedKind == AttributeCommonInfo::AT_Aligned &&
3142 SpellingIndex == AlignedAttr::Keyword_alignas);
3143 bool IsRegularKeywordAttribute =
Record.readBool();
3148 IsAlignas, IsRegularKeywordAttribute});
3150#include "clang/Serialization/AttrPCHRead.inc"
3152 assert(New &&
"Unable to decode attribute?");
3158 for (
unsigned I = 0,
E =
readInt(); I !=
E; ++I)
3173inline void ASTReader::LoadedDecl(
unsigned Index,
Decl *
D) {
3174 assert(!DeclsLoaded[Index] &&
"Decl loaded twice?");
3175 DeclsLoaded[Index] =
D;
3184bool ASTReader::isConsumerInterestedIn(
Decl *
D) {
3203 if (
const auto *Var = dyn_cast<VarDecl>(
D))
3204 return Var->isFileVarDecl() &&
3206 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(Var));
3207 if (
const auto *
Func = dyn_cast<FunctionDecl>(
D))
3208 return Func->doesThisDeclarationHaveABody() || PendingBodies.count(
D);
3218ASTReader::RecordLocation ASTReader::DeclCursorForID(
GlobalDeclID ID,
3222 unsigned LocalDeclIndex =
ID.getLocalDeclIndex();
3228ASTReader::RecordLocation ASTReader::getLocalBitOffset(uint64_t GlobalOffset) {
3229 auto I = GlobalBitOffsetsMap.find(GlobalOffset);
3231 assert(I != GlobalBitOffsetsMap.end() &&
"Corrupted global bit offsets map");
3232 return RecordLocation(I->second, GlobalOffset - I->second->GlobalBitOffset);
3240ASTDeclReader::getOrFakePrimaryClassDefinition(
ASTReader &Reader,
3243 auto *DD = RD->DefinitionData;
3252 DD =
new (Reader.
getContext())
struct CXXRecordDecl::DefinitionData(RD);
3254 RD->DefinitionData = DD;
3258 Reader.PendingFakeDefinitionData.insert(
3259 std::make_pair(DD, ASTReader::PendingFakeDefinitionKind::Fake));
3262 return DD->Definition;
3269 if (
auto *ND = dyn_cast<NamespaceDecl>(DC))
3270 return ND->getFirstDecl();
3272 if (
auto *RD = dyn_cast<CXXRecordDecl>(DC))
3273 return getOrFakePrimaryClassDefinition(Reader, RD);
3275 if (
auto *RD = dyn_cast<RecordDecl>(DC))
3278 if (
auto *ED = dyn_cast<EnumDecl>(DC))
3281 if (
auto *OID = dyn_cast<ObjCInterfaceDecl>(DC))
3286 if (
auto *TU = dyn_cast<TranslationUnitDecl>(DC))
3292ASTDeclReader::FindExistingResult::~FindExistingResult() {
3295 if (TypedefNameForLinkage) {
3297 Reader.ImportedTypedefNamesForLinkage.insert(
3298 std::make_pair(std::make_pair(DC, TypedefNameForLinkage), New));
3302 if (!AddResult || Existing)
3308 setAnonymousDeclForMerging(Reader, New->getLexicalDeclContext(),
3309 AnonymousDeclNumber, New);
3313 Reader.PendingFakeLookupResults[Name.getAsIdentifierInfo()]
3315 }
else if (
DeclContext *MergeDC = getPrimaryContextForMerging(Reader, DC)) {
3318 MergeDC->makeDeclVisibleInContextImpl(New,
true);
3326 bool IsTypedefNameForLinkage) {
3327 if (!IsTypedefNameForLinkage)
3333 if (
Found->isFromASTFile())
3336 if (
auto *TND = dyn_cast<TypedefNameDecl>(
Found))
3337 return TND->getAnonDeclWithTypedefName(
true);
3346ASTDeclReader::getPrimaryDCForAnonymousDecl(
DeclContext *LexicalDC) {
3348 if (
auto *RD = dyn_cast<CXXRecordDecl>(LexicalDC)) {
3350 return DD ? DD->Definition :
nullptr;
3351 }
else if (
auto *OID = dyn_cast<ObjCInterfaceDecl>(LexicalDC)) {
3352 return OID->getCanonicalDecl()->getDefinition();
3359 if (
auto *FD = dyn_cast<FunctionDecl>(
D))
3360 if (FD->isThisDeclarationADefinition())
3362 if (
auto *MD = dyn_cast<ObjCMethodDecl>(
D))
3363 if (MD->isThisDeclarationADefinition())
3365 if (
auto *RD = dyn_cast<RecordDecl>(
D))
3382 auto &
Previous = Reader.AnonymousDeclarationsForMerging[CanonDC];
3388 auto *PrimaryDC = getPrimaryDCForAnonymousDecl(DC);
3389 if (PrimaryDC && !cast<Decl>(PrimaryDC)->isFromASTFile()) {
3401void ASTDeclReader::setAnonymousDeclForMerging(
ASTReader &Reader,
3404 auto *CanonDC = cast<Decl>(DC)->getCanonicalDecl();
3406 auto &
Previous = Reader.AnonymousDeclarationsForMerging[CanonDC];
3413ASTDeclReader::FindExistingResult ASTDeclReader::findExisting(
NamedDecl *
D) {
3420 FindExistingResult
Result(Reader,
D,
nullptr,
3421 AnonymousDeclNumber, TypedefNameForLinkage);
3428 if (TypedefNameForLinkage) {
3429 auto It = Reader.ImportedTypedefNamesForLinkage.find(
3430 std::make_pair(DC, TypedefNameForLinkage));
3431 if (It != Reader.ImportedTypedefNamesForLinkage.end())
3432 if (
C.isSameEntity(It->second,
D))
3433 return FindExistingResult(Reader,
D, It->second, AnonymousDeclNumber,
3434 TypedefNameForLinkage);
3442 if (
auto *Existing = getAnonymousDeclForMerging(
3444 if (
C.isSameEntity(Existing,
D))
3445 return FindExistingResult(Reader,
D, Existing, AnonymousDeclNumber,
3446 TypedefNameForLinkage);
3453 class UpToDateIdentifierRAII {
3455 bool WasOutToDate =
false;
3466 ~UpToDateIdentifierRAII() {
3470 } UpToDate(Name.getAsIdentifierInfo());
3473 IEnd = IdResolver.
end();
3476 if (
C.isSameEntity(Existing,
D))
3477 return FindExistingResult(Reader,
D, Existing, AnonymousDeclNumber,
3478 TypedefNameForLinkage);
3480 }
else if (
DeclContext *MergeDC = getPrimaryContextForMerging(Reader, DC)) {
3484 if (
C.isSameEntity(Existing,
D))
3485 return FindExistingResult(Reader,
D, Existing, AnonymousDeclNumber,
3486 TypedefNameForLinkage);
3490 return FindExistingResult(Reader);
3502 if (MergedDCIt != Reader.MergedDeclContexts.end() &&
3504 Reader.PendingOdrMergeChecks.push_back(
D);
3506 return FindExistingResult(Reader,
D,
nullptr,
3507 AnonymousDeclNumber, TypedefNameForLinkage);
3510template<
typename DeclT>
3512 return D->RedeclLink.getLatestNotUpdated();
3516 llvm_unreachable(
"getMostRecentDecl on non-redeclarable declaration");
3523#define ABSTRACT_DECL(TYPE)
3524#define DECL(TYPE, BASE) \
3526 return getMostRecentDeclImpl(cast<TYPE##Decl>(D));
3527#include "clang/AST/DeclNodes.inc"
3529 llvm_unreachable(
"unknown decl kind");
3532Decl *ASTReader::getMostRecentExistingDecl(
Decl *
D) {
3540 const auto *IA =
Previous->getAttr<MSInheritanceAttr>();
3542 if (IA && !
D->
hasAttr<MSInheritanceAttr>()) {
3543 NewAttr = cast<InheritableAttr>(IA->clone(Context));
3548 const auto *AA =
Previous->getAttr<AvailabilityAttr>();
3549 if (AA && !
D->
hasAttr<AvailabilityAttr>()) {
3550 NewAttr = AA->
clone(Context);
3556template<
typename DeclT>
3560 D->RedeclLink.setPrevious(cast<DeclT>(
Previous));
3561 D->First = cast<DeclT>(
Previous)->First;
3570 auto *VD =
static_cast<VarDecl *
>(
D);
3571 auto *PrevVD = cast<VarDecl>(
Previous);
3572 D->RedeclLink.setPrevious(PrevVD);
3573 D->First = PrevVD->First;
3582 VD->demoteThisDefinitionToDeclaration();
3599 auto *PrevFD = cast<FunctionDecl>(
Previous);
3601 FD->RedeclLink.setPrevious(PrevFD);
3602 FD->First = PrevFD->First;
3606 if (PrevFD->isInlined() != FD->isInlined()) {
3622 FD->setImplicitlyInline(
true);
3627 if (FPT && PrevFPT) {
3631 bool WasUnresolved =
3633 if (IsUnresolved != WasUnresolved)
3634 Reader.PendingExceptionSpecUpdates.insert(
3635 {Canon, IsUnresolved ? PrevFD : FD});
3641 if (IsUndeduced != WasUndeduced)
3642 Reader.PendingDeducedTypeUpdates.insert(
3643 {cast<FunctionDecl>(Canon),
3644 (IsUndeduced ? PrevFPT : FPT)->getReturnType()});
3651 llvm_unreachable(
"attachPreviousDecl on non-redeclarable declaration");
3656template <
typename ParmDecl>
3659 auto *To = cast<ParmDecl>(ToD);
3660 if (!From->hasDefaultArgument())
3662 To->setInheritedDefaultArgument(Context, From);
3671 assert(FromTP->size() == ToTP->size() &&
"merged mismatched templates?");
3673 for (
unsigned I = 0, N = FromTP->size(); I != N; ++I) {
3674 NamedDecl *FromParam = FromTP->getParam(I);
3677 if (
auto *FTTP = dyn_cast<TemplateTypeParmDecl>(FromParam))
3679 else if (
auto *FNTTP = dyn_cast<NonTypeTemplateParmDecl>(FromParam))
3683 Context, cast<TemplateTemplateParmDecl>(FromParam), ToParam);
3692#define ABSTRACT_DECL(TYPE)
3693#define DECL(TYPE, BASE) \
3695 attachPreviousDeclImpl(Reader, cast<TYPE##Decl>(D), Previous, Canon); \
3697#include "clang/AST/DeclNodes.inc"
3708 M && M->isNamedModule() &&
3709 isa<VarDecl, FunctionDecl, TagDecl, RedeclarableTemplateDecl>(
Previous) &&
3712 diag::err_multiple_decl_in_different_modules)
3713 << cast<NamedDecl>(
Previous) << M->Name;
3728 if (
auto *TD = dyn_cast<TemplateDecl>(
D))
3739template<
typename DeclT>
3741 D->RedeclLink.setLatest(cast<DeclT>(Latest));
3745 llvm_unreachable(
"attachLatestDecl on non-redeclarable declaration");
3749 assert(
D && Latest);
3752#define ABSTRACT_DECL(TYPE)
3753#define DECL(TYPE, BASE) \
3755 attachLatestDeclImpl(cast<TYPE##Decl>(D), Latest); \
3757#include "clang/AST/DeclNodes.inc"
3761template<
typename DeclT>
3763 D->RedeclLink.markIncomplete();
3767 llvm_unreachable(
"markIncompleteDeclChain on non-redeclarable declaration");
3770void ASTReader::markIncompleteDeclChain(
Decl *
D) {
3772#define ABSTRACT_DECL(TYPE)
3773#define DECL(TYPE, BASE) \
3775 ASTDeclReader::markIncompleteDeclChainImpl(cast<TYPE##Decl>(D)); \
3777#include "clang/AST/DeclNodes.inc"
3784 RecordLocation
Loc = DeclCursorForID(ID, DeclLoc);
3785 llvm::BitstreamCursor &DeclsCursor =
Loc.F->DeclsCursor;
3790 ReadingKindTracker ReadingKind(Read_Decl, *
this);
3793 Deserializing ADecl(
this);
3795 auto Fail = [](
const char *what, llvm::Error &&Err) {
3796 llvm::report_fatal_error(Twine(
"ASTReader::readDeclRecord failed ") + what +
3800 if (llvm::Error JumpFailed = DeclsCursor.JumpToBit(
Loc.Offset))
3801 Fail(
"jumping", std::move(JumpFailed));
3806 Fail(
"reading code", MaybeCode.takeError());
3807 unsigned Code = MaybeCode.get();
3813 llvm::report_fatal_error(
3814 Twine(
"ASTReader::readDeclRecord failed reading decl code: ") +
3815 toString(MaybeDeclCode.takeError()));
3817 switch ((
DeclCode)MaybeDeclCode.get()) {
3820 llvm_unreachable(
"Record cannot be de-serialized with readDeclRecord");
3930 bool HasTypeConstraint =
Record.readInt();
3936 bool HasTypeConstraint =
Record.readInt();
3942 bool HasTypeConstraint =
Record.readInt();
3944 Context, ID,
Record.readInt(), HasTypeConstraint);
4033 D = MSGuidDecl::CreateDeserialized(Context, ID);
4036 D = UnnamedGlobalConstantDecl::CreateDeserialized(Context, ID);
4039 D = TemplateParamObjectDecl::CreateDeserialized(Context, ID);
4045 Error(
"attempt to read a C++ base-specifier record as a declaration");
4048 Error(
"attempt to read a C++ ctor initializer record as a declaration");
4057 unsigned NumChildren =
Record.readInt();
4063 unsigned NumClauses =
Record.readInt();
4064 unsigned NumVars =
Record.readInt();
4070 unsigned NumClauses =
Record.readInt();
4079 unsigned NumClauses =
Record.readInt();
4112 assert(
D &&
"Unknown declaration reading AST file");
4113 LoadedDecl(translateGlobalDeclIDToIndex(ID),
D);
4121 [&] { Reader.Visit(
D); });
4125 if (
auto *DC = dyn_cast<DeclContext>(
D)) {
4126 std::pair<uint64_t, uint64_t> Offsets = Reader.VisitDeclContext(DC);
4131 if (!Offsets.first && !Offsets.second && isa<NamespaceDecl>(
D))
4132 if (
auto Iter = DelayedNamespaceOffsetMap.find(ID);
4133 Iter != DelayedNamespaceOffsetMap.end())
4134 Offsets =
Iter->second;
4136 if (Offsets.first &&
4137 ReadLexicalDeclContextStorage(*
Loc.F, DeclsCursor, Offsets.first, DC))
4139 if (Offsets.second &&
4140 ReadVisibleDeclContextStorage(*
Loc.F, DeclsCursor, Offsets.second, ID))
4146 PendingUpdateRecords.push_back(
4147 PendingUpdateRecord(ID,
D,
true));
4150 if (
auto *
Class = dyn_cast<ObjCInterfaceDecl>(
D))
4153 if (
Class->isThisDeclarationADefinition() ||
4154 PendingDefinitions.count(
Class))
4155 loadObjCCategories(ID,
Class);
4161 PotentiallyInterestingDecls.push_back(
D);
4166void ASTReader::PassInterestingDeclsToConsumer() {
4169 if (PassingDeclsToConsumer)
4174 SaveAndRestore GuardPassingDeclsToConsumer(PassingDeclsToConsumer,
true);
4178 for (
auto ID : EagerlyDeserializedDecls)
4180 EagerlyDeserializedDecls.clear();
4182 auto ConsumingPotentialInterestingDecls = [
this]() {
4183 while (!PotentiallyInterestingDecls.empty()) {
4184 Decl *
D = PotentiallyInterestingDecls.front();
4185 PotentiallyInterestingDecls.pop_front();
4186 if (isConsumerInterestedIn(
D))
4187 PassInterestingDeclToConsumer(
D);
4190 std::deque<Decl *> MaybeInterestingDecls =
4191 std::move(PotentiallyInterestingDecls);
4192 PotentiallyInterestingDecls.clear();
4193 assert(PotentiallyInterestingDecls.empty());
4194 while (!MaybeInterestingDecls.empty()) {
4195 Decl *
D = MaybeInterestingDecls.front();
4196 MaybeInterestingDecls.pop_front();
4202 if (
auto *VD = dyn_cast<VarDecl>(
D);
4203 VD && VD->isFileVarDecl() && !VD->isExternallyVisible())
4205 ConsumingPotentialInterestingDecls();
4206 if (isConsumerInterestedIn(
D))
4207 PassInterestingDeclToConsumer(
D);
4211 ConsumingPotentialInterestingDecls();
4214void ASTReader::loadDeclUpdateRecords(PendingUpdateRecord &
Record) {
4220 ProcessingUpdatesRAIIObj ProcessingUpdates(*
this);
4221 DeclUpdateOffsetsMap::iterator UpdI = DeclUpdateOffsets.find(ID);
4225 if (UpdI != DeclUpdateOffsets.end()) {
4226 auto UpdateOffsets = std::move(UpdI->second);
4227 DeclUpdateOffsets.erase(UpdI);
4233 bool WasInteresting =
Record.JustLoaded || isConsumerInterestedIn(
D);
4234 for (
auto &FileAndOffset : UpdateOffsets) {
4236 uint64_t Offset = FileAndOffset.second;
4239 if (llvm::Error JumpFailed =
Cursor.JumpToBit(Offset))
4241 llvm::report_fatal_error(
4242 Twine(
"ASTReader::loadDeclUpdateRecords failed jumping: ") +
4246 llvm::report_fatal_error(
4247 Twine(
"ASTReader::loadDeclUpdateRecords failed reading code: ") +
4249 unsigned Code = MaybeCode.get();
4253 "Expected DECL_UPDATES record!");
4255 llvm::report_fatal_error(
4256 Twine(
"ASTReader::loadDeclUpdateRecords failed reading rec code: ") +
4261 Reader.UpdateDecl(
D, PendingLazySpecializationIDs);
4265 if (!WasInteresting && isConsumerInterestedIn(
D)) {
4266 PotentiallyInterestingDecls.push_back(
D);
4267 WasInteresting =
true;
4272 assert((PendingLazySpecializationIDs.empty() || isa<ClassTemplateDecl>(
D) ||
4273 isa<FunctionTemplateDecl, VarTemplateDecl>(
D)) &&
4274 "Must not have pending specializations");
4275 if (
auto *CTD = dyn_cast<ClassTemplateDecl>(
D))
4277 else if (
auto *FTD = dyn_cast<FunctionTemplateDecl>(
D))
4279 else if (
auto *VTD = dyn_cast<VarTemplateDecl>(
D))
4281 PendingLazySpecializationIDs.clear();
4284 auto I = PendingVisibleUpdates.find(ID);
4285 if (I != PendingVisibleUpdates.end()) {
4286 auto VisibleUpdates = std::move(I->second);
4287 PendingVisibleUpdates.erase(I);
4290 for (
const auto &
Update : VisibleUpdates)
4291 Lookups[DC].Table.add(
4298void ASTReader::loadPendingDeclChain(
Decl *FirstLocal, uint64_t LocalOffset) {
4301 if (FirstLocal != CanonDecl) {
4304 *
this, FirstLocal, PrevMostRecent ? PrevMostRecent : CanonDecl,
4315 assert(M &&
"imported decl from no module file");
4319 if (llvm::Error JumpFailed =
Cursor.JumpToBit(LocalOffset))
4320 llvm::report_fatal_error(
4321 Twine(
"ASTReader::loadPendingDeclChain failed jumping: ") +
4327 llvm::report_fatal_error(
4328 Twine(
"ASTReader::loadPendingDeclChain failed reading code: ") +
4330 unsigned Code = MaybeCode.get();
4333 "expected LOCAL_REDECLARATIONS record!");
4335 llvm::report_fatal_error(
4336 Twine(
"ASTReader::loadPendingDeclChain failed reading rec code: ") +
4341 Decl *MostRecent = FirstLocal;
4342 for (
unsigned I = 0, N =
Record.size(); I != N; ++I) {
4343 unsigned Idx = N - I - 1;
4355 class ObjCCategoriesVisitor {
4358 llvm::SmallPtrSetImpl<ObjCCategoryDecl *> &Deserialized;
4360 llvm::DenseMap<DeclarationName, ObjCCategoryDecl *> NameCategoryMap;
4362 unsigned PreviousGeneration;
4366 if (!Deserialized.erase(Cat))
4377 NonEquivalentDecls, StructuralEquivalenceKind::Default,
4381 if (!Ctx.IsEquivalent(Cat, Existing)) {
4386 diag::note_previous_definition);
4388 }
else if (!Existing) {
4403 ObjCCategoriesVisitor(
4405 llvm::SmallPtrSetImpl<ObjCCategoryDecl *> &Deserialized,
4408 InterfaceID(InterfaceID), PreviousGeneration(PreviousGeneration) {
4410 for (
auto *Cat :
Interface->known_categories()) {
4441 LocalID != Result->getDefinitionID()) {
4449 unsigned Offset = Result->Offset;
4452 for (
unsigned I = 0; I != N; ++I)
4461 unsigned PreviousGeneration) {
4462 ObjCCategoriesVisitor Visitor(*
this,
D, CategoriesDeserialized, ID,
4463 PreviousGeneration);
4464 ModuleMgr.
visit(Visitor);
4467template<
typename DeclT,
typename Fn>
4476 for (
auto *Redecl = MostRecent; Redecl && !
Found;
4477 Redecl = Redecl->getPreviousDecl())
4482 for (
auto *Redecl = MostRecent; Redecl !=
D;
4494 auto *RD = cast<CXXRecordDecl>(
D);
4496 assert(MD &&
"couldn't read decl from update record");
4497 Reader.PendingAddedClassMembers.push_back({RD, MD});
4503 PendingLazySpecializationIDs.push_back(readDeclID());
4507 auto *Anon = readDeclAs<NamespaceDecl>();
4512 if (!
Record.isModule()) {
4513 if (
auto *TU = dyn_cast<TranslationUnitDecl>(
D))
4514 TU->setAnonymousNamespace(Anon);
4516 cast<NamespaceDecl>(
D)->setAnonymousNamespace(Anon);
4522 auto *VD = cast<VarDecl>(
D);
4523 VD->NonParmVarDeclBits.IsInline =
Record.readInt();
4524 VD->NonParmVarDeclBits.IsInlineSpecified =
Record.readInt();
4531 if (
auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(
D)) {
4532 VTSD->setPointOfInstantiation(POI);
4533 }
else if (
auto *VD = dyn_cast<VarDecl>(
D)) {
4535 assert(MSInfo &&
"No member specialization information");
4538 auto *FD = cast<FunctionDecl>(
D);
4539 if (
auto *FTSInfo = FD->TemplateOrSpecialization
4541 FTSInfo->setPointOfInstantiation(POI);
4544 ->setPointOfInstantiation(POI);
4550 auto *Param = cast<ParmVarDecl>(
D);
4555 auto *DefaultArg =
Record.readExpr();
4559 if (Param->hasUninstantiatedDefaultArg())
4560 Param->setDefaultArg(DefaultArg);
4565 auto *FD = cast<FieldDecl>(
D);
4566 auto *DefaultInit =
Record.readExpr();
4570 if (FD->hasInClassInitializer() && !FD->hasNonNullInClassInitializer()) {
4572 FD->setInClassInitializer(DefaultInit);
4576 FD->removeInClassInitializer();
4582 auto *FD = cast<FunctionDecl>(
D);
4583 if (Reader.PendingBodies[FD]) {
4597 FD->setInnerLocStart(readSourceLocation());
4599 assert(
Record.getIdx() ==
Record.size() &&
"lazy body must be last");
4604 auto *RD = cast<CXXRecordDecl>(
D);
4606 bool HadRealDefinition =
4607 OldDD && (OldDD->Definition != RD ||
4608 !Reader.PendingFakeDefinitionData.count(OldDD));
4612 ReadCXXRecordDefinition(RD,
true);
4615 uint64_t LexicalOffset = ReadLocalOffset();
4616 if (!HadRealDefinition && LexicalOffset) {
4617 Record.readLexicalDeclContextStorage(LexicalOffset, RD);
4618 Reader.PendingFakeDefinitionData.erase(OldDD);
4625 MSInfo->setTemplateSpecializationKind(TSK);
4626 MSInfo->setPointOfInstantiation(POI);
4628 auto *Spec = cast<ClassTemplateSpecializationDecl>(RD);
4629 Spec->setTemplateSpecializationKind(TSK);
4630 Spec->setPointOfInstantiation(POI);
4634 readDeclAs<ClassTemplatePartialSpecializationDecl>();
4636 Record.readTemplateArgumentList(TemplArgs);
4642 if (!Spec->getSpecializedTemplateOrPartial()
4644 Spec->setInstantiationOf(PartialSpec, TemplArgList);
4655 Record.readAttributes(Attrs);
4667 auto *Del = readDeclAs<FunctionDecl>();
4669 auto *ThisArg =
Record.readExpr();
4671 if (!
First->OperatorDelete) {
4672 First->OperatorDelete = Del;
4673 First->OperatorDeleteThisArg = ThisArg;
4680 auto ESI =
Record.readExceptionSpecInfo(ExceptionStorage);
4683 auto *FD = cast<FunctionDecl>(
D);
4689 FPT->getReturnType(), FPT->getParamTypes(),
4690 FPT->getExtProtoInfo().withExceptionSpec(ESI)));
4694 Reader.PendingExceptionSpecUpdates.insert(
4695 std::make_pair(FD->getCanonicalDecl(), FD));
4701 auto *FD = cast<FunctionDecl>(
D);
4703 Reader.PendingDeducedTypeUpdates.insert(
4704 {FD->getCanonicalDecl(), DeducedResultType});
4725 readSourceRange()));
4729 auto AllocatorKind =
4730 static_cast<OMPAllocateDeclAttr::AllocatorTypeTy
>(
Record.readInt());
4734 D->
addAttr(OMPAllocateDeclAttr::CreateImplicit(
4735 Reader.
getContext(), AllocatorKind, Allocator, Alignment, SR));
4741 auto *Exported = cast<NamedDecl>(
D);
4744 Reader.PendingMergedDefinitionsToDeduplicate.insert(Exported);
4749 auto MapType =
Record.readEnum<OMPDeclareTargetDeclAttr::MapTypeTy>();
4750 auto DevType =
Record.readEnum<OMPDeclareTargetDeclAttr::DevTypeTy>();
4753 unsigned Level =
Record.readInt();
4754 D->
addAttr(OMPDeclareTargetDeclAttr::CreateImplicit(
4756 readSourceRange()));
4762 Record.readAttributes(Attrs);
4763 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::@1651::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.
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)
void VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D)
void VisitUnresolvedUsingIfExistsDecl(UnresolvedUsingIfExistsDecl *D)
void ReadFunctionDefinition(FunctionDecl *FD)
void VisitLabelDecl(LabelDecl *LD)
void VisitObjCCategoryDecl(ObjCCategoryDecl *D)
void VisitUsingDirectiveDecl(UsingDirectiveDecl *D)
void VisitFunctionDecl(FunctionDecl *FD)
void VisitObjCMethodDecl(ObjCMethodDecl *D)
void VisitUsingShadowDecl(UsingShadowDecl *D)
void VisitVarTemplateSpecializationDecl(VarTemplateSpecializationDecl *D)
void VisitVarDecl(VarDecl *VD)
RedeclarableResult VisitTypedefNameDecl(TypedefNameDecl *TD)
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)
RedeclarableResult VisitClassTemplateSpecializationDeclImpl(ClassTemplateSpecializationDecl *D)
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)
RedeclarableResult VisitRedeclarable(Redeclarable< T > *D)
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 VisitTagDecl(TagDecl *TD)
void UpdateDecl(Decl *D, SmallVectorImpl< GlobalDeclID > &)
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)
RedeclarableResult VisitVarDeclImpl(VarDecl *D)
void VisitMSPropertyDecl(MSPropertyDecl *FD)
void mergeTemplatePattern(RedeclarableTemplateDecl *D, RedeclarableTemplateDecl *Existing, bool IsKeyDecl)
Merge together the pattern declarations from two template declarations.
void VisitClassTemplateSpecializationDecl(ClassTemplateSpecializationDecl *D)
void VisitFieldDecl(FieldDecl *FD)
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)
ObjCTypeParamList * ReadObjCTypeParamList()
void VisitHLSLBufferDecl(HLSLBufferDecl *D)
void VisitOMPThreadPrivateDecl(OMPThreadPrivateDecl *D)
void VisitCXXDeductionGuideDecl(CXXDeductionGuideDecl *GD)
void VisitConstructorUsingShadowDecl(ConstructorUsingShadowDecl *D)
RedeclarableResult VisitVarTemplateSpecializationDeclImpl(VarTemplateSpecializationDecl *D)
TODO: Unify with ClassTemplateSpecializationDecl version? May require unifying ClassTemplate(Partial)...
void VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D)
void VisitUsingEnumDecl(UsingEnumDecl *D)
void VisitObjCImplDecl(ObjCImplDecl *D)
void VisitTranslationUnitDecl(TranslationUnitDecl *TU)
RedeclarableResult VisitRedeclarableTemplateDecl(RedeclarableTemplateDecl *D)
void VisitUnnamedGlobalConstantDecl(UnnamedGlobalConstantDecl *D)
void VisitTypeDecl(TypeDecl *TD)
RedeclarableResult VisitRecordDeclImpl(RecordDecl *RD)
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 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 VisitObjCIvarDecl(ObjCIvarDecl *D)
void VisitUsingPackDecl(UsingPackDecl *D)
void VisitFunctionTemplateDecl(FunctionTemplateDecl *D)
static void mergeInheritableAttributes(ASTReader &Reader, Decl *D, Decl *Previous)
void VisitOMPDeclareReductionDecl(OMPDeclareReductionDecl *D)
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 AddLazySpecializations(T *D, SmallVectorImpl< GlobalDeclID > &IDs)
static void attachPreviousDecl(ASTReader &Reader, Decl *D, Decl *Previous, Decl *Canon)
std::pair< uint64_t, uint64_t > VisitDeclContext(DeclContext *DC)
void VisitClassTemplateDecl(ClassTemplateDecl *D)
void VisitCXXDestructorDecl(CXXDestructorDecl *D)
void VisitTemplateDecl(TemplateDecl *D)
void VisitCXXConversionDecl(CXXConversionDecl *D)
void VisitTypedefDecl(TypedefDecl *TD)
void VisitOMPRequiresDecl(OMPRequiresDecl *D)
void VisitDecompositionDecl(DecompositionDecl *DD)
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.
void warnStackExhausted(SourceLocation Loc)
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...
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.
void readAttributes(AttrVec &Attrs)
Reads attributes from the current stream position, advancing Idx.
T * readDeclAs()
Reads a declaration from the given position in the record, advancing Idx.
IdentifierInfo * readIdentifier()
ASTContext & getContext()
Retrieve the AST context that this AST reader supplements.
TypeSourceInfo * readTypeSourceInfo()
Reads a declarator info from the given record, advancing Idx.
SourceRange readSourceRange(LocSeq *Seq=nullptr)
Read a source range, advancing Idx.
OMPTraitInfo * readOMPTraitInfo()
Read an OMPTraitInfo object, advancing Idx.
VersionTuple readVersionTuple()
Read a version tuple, advancing Idx.
uint64_t readInt()
Returns the current value in this record, and advances to the next value.
Attr * readAttr()
Reads one attribute from the current stream position, advancing Idx.
Expr * readExpr()
Reads an expression.
SourceLocation readSourceLocation(LocSeq *Seq=nullptr)
Read a source location, 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
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.
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.
@ ModuleMapModule
This is a module that was defined by a module map and built out of header files.
This represents a decl that may have a name.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
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 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)
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_CXX_CONSTRUCTOR
A CXXConstructorDecl record.
@ DECL_CXX_CONVERSION
A CXXConversionDecl record.
@ DECL_FIELD
A FieldDecl record.
@ DECL_LINKAGE_SPEC
A LinkageSpecDecl record.
@ 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_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_TEMPLATE_SPECIALIZATION
@ 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.
if(T->getSizeExpr()) TRY_TO(TraverseStmt(const_cast< Expr * >(T -> getSizeExpr())))
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)
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.
void runWithSufficientStackSpace(llvm::function_ref< void()> Diag, llvm::function_ref< void()> Fn)
Run a given function on a stack with "sufficient" space.
@ 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.
Describes the categories of an Objective-C class.