58#include "llvm/ADT/DenseMap.h"
59#include "llvm/ADT/FoldingSet.h"
60#include "llvm/ADT/STLExtras.h"
61#include "llvm/ADT/SmallPtrSet.h"
62#include "llvm/ADT/SmallVector.h"
63#include "llvm/ADT/iterator_range.h"
64#include "llvm/Bitstream/BitstreamReader.h"
65#include "llvm/Support/Casting.h"
66#include "llvm/Support/ErrorHandling.h"
67#include "llvm/Support/SaveAndRestore.h"
76using namespace serialization;
84class RedeclarableResult {
91 : MergeWith(MergeWith), FirstID(FirstID), IsKeyDecl(IsKeyDecl) {}
97 bool isKeyDecl()
const {
return IsKeyDecl; }
101 Decl *getKnownMergeTarget()
const {
return MergeWith; }
119 template <
typename T>
123 template <
typename T>
125 RedeclarableResult &Redecl) {
127 D, Existing, Redecl.isKeyDecl() ? Redecl.getFirstID() :
GlobalDeclID());
134 struct CXXRecordDecl::DefinitionData &&NewDD);
136 struct ObjCInterfaceDecl::DefinitionData &&NewDD);
138 struct ObjCProtocolDecl::DefinitionData &&NewDD);
151 ASTReader::RecordLocation Loc;
157 TypeID DeferredTypeID = 0;
158 unsigned AnonymousDeclNumber = 0;
165 bool IsDeclMarkedUsed =
false;
167 uint64_t GetCurrentCursorOffset();
169 uint64_t ReadLocalOffset() {
170 uint64_t LocalOffset =
Record.readInt();
171 assert(LocalOffset <
Loc.Offset &&
"offset point after current record");
172 return LocalOffset ?
Loc.Offset - LocalOffset : 0;
175 uint64_t ReadGlobalOffset() {
176 uint64_t Local = ReadLocalOffset();
177 return Local ?
Record.getGlobalBitOffset(Local) : 0;
188 std::string readString() {
return Record.readString(); }
190 Decl *readDecl() {
return Record.readDecl(); }
192 template <
typename T>
T *readDeclAs() {
return Record.readDeclAs<
T>(); }
201 Module *readModule() {
return Record.getSubmodule(readSubmoduleID()); }
204 Decl *LambdaContext =
nullptr,
205 unsigned IndexInLambdaContext = 0);
206 void ReadCXXDefinitionData(
struct CXXRecordDecl::DefinitionData &
Data,
208 unsigned IndexInLambdaContext);
209 void ReadObjCDefinitionData(
struct ObjCInterfaceDecl::DefinitionData &
Data);
210 void ReadObjCDefinitionData(
struct ObjCProtocolDecl::DefinitionData &
Data);
231 class FindExistingResult {
235 bool AddResult =
false;
236 unsigned AnonymousDeclNumber = 0;
240 FindExistingResult(
ASTReader &Reader) : Reader(Reader) {}
243 unsigned AnonymousDeclNumber,
245 : Reader(Reader), New(New), Existing(Existing), AddResult(
true),
246 AnonymousDeclNumber(AnonymousDeclNumber),
247 TypedefNameForLinkage(TypedefNameForLinkage) {}
249 FindExistingResult(FindExistingResult &&
Other)
251 AddResult(
Other.AddResult),
252 AnonymousDeclNumber(
Other.AnonymousDeclNumber),
253 TypedefNameForLinkage(
Other.TypedefNameForLinkage) {
254 Other.AddResult =
false;
257 FindExistingResult &operator=(FindExistingResult &&) =
delete;
258 ~FindExistingResult();
262 void suppress() { AddResult =
false; }
264 operator NamedDecl *()
const {
return Existing; }
266 template <
typename T>
operator T *()
const {
267 return dyn_cast_or_null<T>(Existing);
273 FindExistingResult findExisting(
NamedDecl *
D);
280 ThisDeclID(thisDeclID), ThisDeclLoc(ThisDeclLoc) {}
282 template <
typename DeclT>
287 template <
typename DeclT>
297 template <
typename DeclT>
302 template <
typename DeclT>
307 llvm::BitstreamCursor &DeclsCursor,
bool IsPartial);
316 Cat->NextClassCategory = Next;
418 template <
typename T>
421 template <
typename T>
425 RedeclarableResult &Redecl);
461template <
typename DeclT>
class MergedRedeclIterator {
462 DeclT *Start =
nullptr;
463 DeclT *Canonical =
nullptr;
464 DeclT *Current =
nullptr;
467 MergedRedeclIterator() =
default;
468 MergedRedeclIterator(DeclT *Start) : Start(Start), Current(Start) {}
472 MergedRedeclIterator &operator++() {
473 if (Current->isFirstDecl()) {
475 Current = Current->getMostRecentDecl();
477 Current = Current->getPreviousDecl();
483 if (Current == Start || Current == Canonical)
488 friend bool operator!=(
const MergedRedeclIterator &A,
489 const MergedRedeclIterator &B) {
490 return A.Current != B.Current;
496template <
typename DeclT>
497static llvm::iterator_range<MergedRedeclIterator<DeclT>>
499 return llvm::make_range(MergedRedeclIterator<DeclT>(
D),
500 MergedRedeclIterator<DeclT>());
503uint64_t ASTDeclReader::GetCurrentCursorOffset() {
504 return Loc.F->DeclsCursor.GetCurrentBitNo() + Loc.F->GlobalBitOffset;
509 Reader.DefinitionSource[FD] =
510 Loc.F->Kind == ModuleKind::MK_MainFile ||
513 if (
auto *CD = dyn_cast<CXXConstructorDecl>(FD)) {
514 CD->setNumCtorInitializers(
Record.readInt());
515 if (CD->getNumCtorInitializers())
516 CD->CtorInitializers = ReadGlobalOffset();
519 Reader.PendingBodies[FD] = GetCurrentCursorOffset();
528 IsDeclMarkedUsed =
false;
530 if (
auto *DD = dyn_cast<DeclaratorDecl>(
D)) {
531 if (
auto *TInfo = DD->getTypeSourceInfo())
532 Record.readTypeLoc(TInfo->getTypeLoc());
535 if (
auto *TD = dyn_cast<TypeDecl>(
D)) {
541 if (NamedDeclForTagDecl.
isValid())
542 cast<TagDecl>(
D)->TypedefNameDeclOrQualifier =
543 cast<TypedefNameDecl>(Reader.
GetDecl(NamedDeclForTagDecl));
544 }
else if (
auto *ID = dyn_cast<ObjCInterfaceDecl>(
D)) {
547 }
else if (
auto *FD = dyn_cast<FunctionDecl>(
D)) {
551 }
else if (
auto *VD = dyn_cast<VarDecl>(
D)) {
553 }
else if (
auto *FD = dyn_cast<FieldDecl>(
D)) {
554 if (FD->hasInClassInitializer() &&
Record.readInt()) {
555 FD->setLazyInClassInitializer(
LazyDeclStmtPtr(GetCurrentCursorOffset()));
562 auto ModuleOwnership =
566 IsDeclMarkedUsed |=
D->Used;
569 bool HasStandaloneLexicalDC = DeclBits.
getNextBit();
576 isa<ParmVarDecl, ObjCTypeParamDecl>(
D)) {
583 GlobalDeclID SemaDCIDForTemplateParmDecl = readDeclID();
586 if (LexicalDCIDForTemplateParmDecl.
isInvalid())
587 LexicalDCIDForTemplateParmDecl = SemaDCIDForTemplateParmDecl;
588 Reader.addPendingDeclContextInfo(
D,
589 SemaDCIDForTemplateParmDecl,
590 LexicalDCIDForTemplateParmDecl);
593 auto *SemaDC = readDeclAs<DeclContext>();
595 HasStandaloneLexicalDC ? readDeclAs<DeclContext>() :
nullptr;
601 if (
auto *RD = dyn_cast<CXXRecordDecl>(SemaDC))
602 MergedSemaDC = getOrFakePrimaryClassDefinition(Reader, RD);
604 MergedSemaDC = Reader.MergedDeclContexts.lookup(SemaDC);
607 D->setDeclContextsImpl(MergedSemaDC ? MergedSemaDC : SemaDC, LexicalDC,
614 Record.readAttributes(Attrs);
625 switch (ModuleOwnership) {
651 Reader.HiddenNamesMap[Owner].push_back(
D);
653 }
else if (ModulePrivate) {
662 std::string Arg = readString();
663 memcpy(
D->getTrailingObjects<
char>(), Arg.data(), Arg.size());
664 D->getTrailingObjects<
char>()[Arg.size()] =
'\0';
670 std::string Name = readString();
671 memcpy(
D->getTrailingObjects<
char>(), Name.data(), Name.size());
672 D->getTrailingObjects<
char>()[Name.size()] =
'\0';
674 D->ValueStart = Name.size() + 1;
675 std::string
Value = readString();
676 memcpy(
D->getTrailingObjects<
char>() +
D->ValueStart,
Value.data(),
678 D->getTrailingObjects<
char>()[
D->ValueStart +
Value.size()] =
'\0';
682 llvm_unreachable(
"Translation units are not serialized");
688 AnonymousDeclNumber =
Record.readInt();
695 DeferredTypeID =
Record.getGlobalTypeID(
Record.readInt());
722 if (
auto *Template = readDeclAs<TypeAliasTemplateDecl>())
749 Record.readQualifierInfo(*Info);
750 TD->TypedefNameDeclOrQualifier = Info;
754 NamedDeclForTagDecl = readDeclID();
755 TypedefNameForLinkage =
Record.readIdentifier();
758 llvm_unreachable(
"unexpected tag info kind");
761 if (!isa<CXXRecordDecl>(TD))
775 ED->setNumPositiveBits(EnumDeclBits.
getNextBits(8));
776 ED->setNumNegativeBits(EnumDeclBits.
getNextBits(8));
781 ED->setHasODRHash(
true);
782 ED->ODRHash =
Record.readInt();
799 Reader.MergedDeclContexts.insert(std::make_pair(ED, OldDef));
806 Reader.PendingEnumOdrMergeFailures[OldDef].push_back(ED);
812 if (
auto *InstED = readDeclAs<EnumDecl>()) {
815 ED->setInstantiationOfMemberEnum(Reader.
getContext(), InstED, TSK);
843 RD->setODRHash(
Record.readInt());
849 RecordDecl *&OldDef = Reader.RecordDefinitions[Canon];
861 Reader.MergedDeclContexts.insert(std::make_pair(RD, OldDef));
865 Reader.PendingRecordOdrMergeFailures[OldDef].push_back(RD);
877 if (isa<FunctionDecl, VarDecl>(VD))
878 DeferredTypeID =
Record.getGlobalTypeID(
Record.readInt());
895 auto *Info =
new (Reader.
getContext()) DeclaratorDecl::ExtInfo();
896 Record.readQualifierInfo(*Info);
897 Info->TrailingRequiresClause =
Record.readExpr();
902 TSIType.
isNull() ? nullptr
918 auto *Template = readDeclAs<FunctionTemplateDecl>();
924 auto *InstFD = readDeclAs<FunctionDecl>();
927 FD->setInstantiationOfMemberFunction(Reader.
getContext(), InstFD, TSK);
932 auto *Template = readDeclAs<FunctionTemplateDecl>();
937 Record.readTemplateArgumentList(TemplArgs,
true);
941 bool HasTemplateArgumentsAsWritten =
Record.readBool();
942 if (HasTemplateArgumentsAsWritten)
943 Record.readTemplateArgumentListInfo(TemplArgsWritten);
953 auto *FD = readDeclAs<FunctionDecl>();
963 C, FD, Template, TSK, TemplArgList,
964 HasTemplateArgumentsAsWritten ? &TemplArgsWritten :
nullptr, POI,
966 FD->TemplateOrSpecialization = FTInfo;
971 auto *CanonTemplate = readDeclAs<FunctionTemplateDecl>();
977 llvm::FoldingSetNodeID ID;
979 void *InsertPos =
nullptr;
987 "already deserialized this template specialization");
996 unsigned NumCandidates =
Record.readInt();
997 while (NumCandidates--)
998 Candidates.
addDecl(readDeclAs<NamedDecl>());
1002 bool HasTemplateArgumentsAsWritten =
Record.readBool();
1003 if (HasTemplateArgumentsAsWritten)
1004 Record.readTemplateArgumentListInfo(TemplArgsWritten);
1008 HasTemplateArgumentsAsWritten ? &TemplArgsWritten :
nullptr);
1027 Reader.PendingDeducedFunctionTypes.push_back({FD, DeferredTypeID});
1049 const bool Pure = FunctionDeclBits.
getNextBit();
1067 FD->EndRangeLoc = readSourceLocation();
1071 FD->ODRHash =
Record.readInt();
1072 FD->setHasODRHash(
true);
1078 if (
auto Info =
Record.readInt()) {
1079 bool HasMessage = Info & 2;
1081 HasMessage ? cast<StringLiteral>(
Record.readExpr()) :
nullptr;
1083 unsigned NumLookups =
Record.readInt();
1085 for (
unsigned I = 0; I != NumLookups; ++I) {
1093 Reader.
getContext(), Lookups, DeletedMessage));
1104 auto merge = [
this, &Redecl, FD](
auto &&F) {
1105 auto *Existing = cast_or_null<FunctionDecl>(Redecl.getKnownMergeTarget());
1106 RedeclarableResult NewRedecl(Existing ? F(Existing) :
nullptr,
1107 Redecl.getFirstID(), Redecl.isKeyDecl());
1125 unsigned NumParams =
Record.readInt();
1127 Params.reserve(NumParams);
1128 for (
unsigned I = 0; I != NumParams; ++I)
1129 Params.push_back(readDeclAs<ParmVarDecl>());
1135 if (FD->
hasAttr<SYCLKernelEntryPointAttr>()) {
1136 auto *SKEPAttr = FD->
getAttr<SYCLKernelEntryPointAttr>();
1138 const SYCLKernelInfo *SKI =
C.findSYCLKernelInfo(SKEPAttr->getKernelName());
1143 diag::note_previous_declaration);
1144 SKEPAttr->setInvalidAttr();
1147 C.registerSYCLEntryPointFunction(FD);
1157 Reader.PendingBodies[MD] = GetCurrentCursorOffset();
1160 MD->
setCmdDecl(readDeclAs<ImplicitParamDecl>());
1173 readDeclAs<ObjCMethodDecl>());
1181 MD->DeclEndLoc = readSourceLocation();
1182 unsigned NumParams =
Record.readInt();
1184 Params.reserve(NumParams);
1185 for (
unsigned I = 0; I != NumParams; ++I)
1186 Params.push_back(readDeclAs<ParmVarDecl>());
1189 unsigned NumStoredSelLocs =
Record.readInt();
1191 SelLocs.reserve(NumStoredSelLocs);
1192 for (
unsigned i = 0; i != NumStoredSelLocs; ++i)
1193 SelLocs.push_back(readSourceLocation());
1195 MD->setParamsAndSelLocs(Reader.
getContext(), Params, SelLocs);
1201 D->Variance =
Record.readInt();
1203 D->VarianceLoc = readSourceLocation();
1204 D->ColonLoc = readSourceLocation();
1214 unsigned numParams =
Record.readInt();
1219 typeParams.reserve(numParams);
1220 for (
unsigned i = 0; i != numParams; ++i) {
1221 auto *typeParam = readDeclAs<ObjCTypeParamDecl>();
1225 typeParams.push_back(typeParam);
1232 typeParams, rAngleLoc);
1235void ASTDeclReader::ReadObjCDefinitionData(
1236 struct ObjCInterfaceDecl::DefinitionData &
Data) {
1238 Data.SuperClassTInfo = readTypeSourceInfo();
1240 Data.EndLoc = readSourceLocation();
1241 Data.HasDesignatedInitializers =
Record.readInt();
1243 Data.HasODRHash =
true;
1246 unsigned NumProtocols =
Record.readInt();
1248 Protocols.reserve(NumProtocols);
1249 for (
unsigned I = 0; I != NumProtocols; ++I)
1250 Protocols.push_back(readDeclAs<ObjCProtocolDecl>());
1252 ProtoLocs.reserve(NumProtocols);
1253 for (
unsigned I = 0; I != NumProtocols; ++I)
1254 ProtoLocs.push_back(readSourceLocation());
1255 Data.ReferencedProtocols.set(Protocols.data(), NumProtocols, ProtoLocs.data(),
1259 NumProtocols =
Record.readInt();
1261 Protocols.reserve(NumProtocols);
1262 for (
unsigned I = 0; I != NumProtocols; ++I)
1263 Protocols.push_back(readDeclAs<ObjCProtocolDecl>());
1264 Data.AllReferencedProtocols.set(Protocols.data(), NumProtocols,
1270 struct ObjCInterfaceDecl::DefinitionData &DD =
D->data();
1271 if (DD.Definition == NewDD.Definition)
1274 Reader.MergedDeclContexts.insert(
1275 std::make_pair(NewDD.Definition, DD.Definition));
1278 if (
D->getODRHash() != NewDD.ODRHash)
1279 Reader.PendingObjCInterfaceOdrMergeFailures[DD.Definition].push_back(
1280 {NewDD.Definition, &NewDD});
1286 DeferredTypeID =
Record.getGlobalTypeID(
Record.readInt());
1292 ID->allocateDefinitionData();
1294 ReadObjCDefinitionData(
ID->data());
1296 if (Canon->Data.getPointer()) {
1300 ID->Data = Canon->Data;
1304 ID->getCanonicalDecl()->Data =
ID->Data;
1307 ID->setIvarList(
nullptr);
1311 Reader.PendingDefinitions.insert(
ID);
1314 Reader.ObjCClassesLoaded.push_back(
ID);
1316 ID->Data =
ID->getCanonicalDecl()->Data;
1325 bool synth =
Record.readInt();
1340 if (PrevIvar && PrevIvar != IVD) {
1341 auto *ParentExt = dyn_cast<ObjCCategoryDecl>(IVD->
getDeclContext());
1342 auto *PrevParentExt =
1344 if (ParentExt && PrevParentExt) {
1348 .PendingObjCExtensionIvarRedeclarations[std::make_pair(ParentExt,
1350 .push_back(std::make_pair(IVD, PrevIvar));
1351 }
else if (ParentExt || PrevParentExt) {
1362void ASTDeclReader::ReadObjCDefinitionData(
1363 struct ObjCProtocolDecl::DefinitionData &
Data) {
1364 unsigned NumProtoRefs =
Record.readInt();
1366 ProtoRefs.reserve(NumProtoRefs);
1367 for (
unsigned I = 0; I != NumProtoRefs; ++I)
1368 ProtoRefs.push_back(readDeclAs<ObjCProtocolDecl>());
1370 ProtoLocs.reserve(NumProtoRefs);
1371 for (
unsigned I = 0; I != NumProtoRefs; ++I)
1372 ProtoLocs.push_back(readSourceLocation());
1373 Data.ReferencedProtocols.set(ProtoRefs.data(), NumProtoRefs,
1376 Data.HasODRHash =
true;
1381 struct ObjCProtocolDecl::DefinitionData &DD =
D->data();
1382 if (DD.Definition == NewDD.Definition)
1385 Reader.MergedDeclContexts.insert(
1386 std::make_pair(NewDD.Definition, DD.Definition));
1389 if (
D->getODRHash() != NewDD.ODRHash)
1390 Reader.PendingObjCProtocolOdrMergeFailures[DD.Definition].push_back(
1391 {NewDD.Definition, &NewDD});
1401 PD->allocateDefinitionData();
1403 ReadObjCDefinitionData(PD->data());
1406 if (Canon->Data.getPointer()) {
1410 PD->Data = Canon->Data;
1417 Reader.PendingDefinitions.insert(PD);
1436 Reader.CategoriesDeserialized.insert(CD);
1438 CD->ClassInterface = readDeclAs<ObjCInterfaceDecl>();
1440 unsigned NumProtoRefs =
Record.readInt();
1442 ProtoRefs.reserve(NumProtoRefs);
1443 for (
unsigned I = 0; I != NumProtoRefs; ++I)
1444 ProtoRefs.push_back(readDeclAs<ObjCProtocolDecl>());
1446 ProtoLocs.reserve(NumProtoRefs);
1447 for (
unsigned I = 0; I != NumProtoRefs; ++I)
1448 ProtoLocs.push_back(readSourceLocation());
1466 D->setAtLoc(readSourceLocation());
1467 D->setLParenLoc(readSourceLocation());
1472 D->setPropertyAttributesAsWritten(
1474 D->setPropertyImplementation(
1482 D->setGetterMethodDecl(readDeclAs<ObjCMethodDecl>());
1483 D->setSetterMethodDecl(readDeclAs<ObjCMethodDecl>());
1484 D->setPropertyIvarDecl(readDeclAs<ObjCIvarDecl>());
1489 D->setClassInterface(readDeclAs<ObjCInterfaceDecl>());
1494 D->CategoryNameLoc = readSourceLocation();
1499 D->setSuperClass(readDeclAs<ObjCInterfaceDecl>());
1500 D->SuperLoc = readSourceLocation();
1501 D->setIvarLBraceLoc(readSourceLocation());
1502 D->setIvarRBraceLoc(readSourceLocation());
1503 D->setHasNonZeroConstructors(
Record.readInt());
1504 D->setHasDestructors(
Record.readInt());
1505 D->NumIvarInitializers =
Record.readInt();
1506 if (
D->NumIvarInitializers)
1507 D->IvarInitializers = ReadGlobalOffset();
1512 D->setAtLoc(readSourceLocation());
1513 D->setPropertyDecl(readDeclAs<ObjCPropertyDecl>());
1514 D->PropertyIvarDecl = readDeclAs<ObjCIvarDecl>();
1515 D->IvarLoc = readSourceLocation();
1516 D->setGetterMethodDecl(readDeclAs<ObjCMethodDecl>());
1517 D->setSetterMethodDecl(readDeclAs<ObjCMethodDecl>());
1518 D->setGetterCXXConstructor(
Record.readExpr());
1519 D->setSetterCXXAssignment(
Record.readExpr());
1524 FD->Mutable =
Record.readInt();
1526 unsigned Bits =
Record.readInt();
1527 FD->StorageKind = Bits >> 1;
1528 if (FD->StorageKind == FieldDecl::ISK_CapturedVLAType)
1530 cast<VariableArrayType>(
Record.readType().getTypePtr());
1536 if (
auto *Tmpl = readDeclAs<FieldDecl>())
1544 PD->GetterId =
Record.readIdentifier();
1545 PD->SetterId =
Record.readIdentifier();
1550 D->PartVal.Part1 =
Record.readInt();
1551 D->PartVal.Part2 =
Record.readInt();
1552 D->PartVal.Part3 =
Record.readInt();
1553 for (
auto &
C :
D->PartVal.Part4And5)
1564 D->Value =
Record.readAPValue();
1568 Reader.
getContext().UnnamedGlobalConstantDecls.GetOrInsertNode(
D))
1574 D->Value =
Record.readAPValue();
1579 Reader.
getContext().TemplateParamObjectDecls.GetOrInsertNode(
D))
1586 FD->ChainingSize =
Record.readInt();
1587 assert(FD->ChainingSize >= 2 &&
"Anonymous chaining must be >= 2");
1590 for (
unsigned I = 0; I != FD->ChainingSize; ++I)
1591 FD->Chaining[I] = readDeclAs<NamedDecl>();
1602 bool DefGeneratedInModule = VarDeclBits.
getNextBit();
1607 bool HasDeducedType =
false;
1608 if (!isa<ParmVarDecl>(VD)) {
1634 Reader.PendingDeducedVarTypes.push_back({VD, DeferredTypeID});
1646 if (DefGeneratedInModule) {
1647 Reader.DefinitionSource[VD] =
1648 Loc.F->Kind == ModuleKind::MK_MainFile ||
1652 if (VD->
hasAttr<BlocksAttr>()) {
1659 VarNotTemplate = 0, VarTemplate, StaticDataMemberSpecialization
1661 switch ((VarKind)
Record.readInt()) {
1662 case VarNotTemplate:
1665 if (!isa<ParmVarDecl>(VD) && !isa<ImplicitParamDecl>(VD) &&
1666 !isa<VarTemplateSpecializationDecl>(VD))
1673 case StaticDataMemberSpecialization: {
1674 auto *Tmpl = readDeclAs<VarDecl>();
1687 if (uint64_t Val =
Record.readInt()) {
1701 Eval->
Value = GetCurrentCursorOffset();
1712 unsigned scopeIndex =
Record.readInt();
1714 unsigned isObjCMethodParam = ParmVarDeclBits.
getNextBit();
1715 unsigned scopeDepth = ParmVarDeclBits.
getNextBits(7);
1716 unsigned declQualifier = ParmVarDeclBits.
getNextBits(7);
1717 if (isObjCMethodParam) {
1718 assert(scopeDepth == 0);
1731 PD->ExplicitObjectParameterIntroducerLoc =
Record.readSourceLocation();
1739 auto **BDs = DD->getTrailingObjects<
BindingDecl *>();
1740 for (
unsigned I = 0; I != DD->NumBindings; ++I) {
1741 BDs[I] = readDeclAs<BindingDecl>();
1742 BDs[I]->setDecomposedDecl(DD);
1748 BD->Binding =
Record.readExpr();
1759 D->Statement =
Record.readStmt();
1766 unsigned NumParams =
Record.readInt();
1768 Params.reserve(NumParams);
1769 for (
unsigned I = 0; I != NumParams; ++I)
1770 Params.push_back(readDeclAs<ParmVarDecl>());
1779 bool capturesCXXThis =
Record.readInt();
1780 unsigned numCaptures =
Record.readInt();
1782 captures.reserve(numCaptures);
1783 for (
unsigned i = 0; i != numCaptures; ++i) {
1784 auto *
decl = readDeclAs<VarDecl>();
1785 unsigned flags =
Record.readInt();
1786 bool byRef = (flags & 1);
1787 bool nested = (flags & 2);
1788 Expr *copyExpr = ((flags & 4) ?
Record.readExpr() :
nullptr);
1797 unsigned ContextParamPos =
Record.readInt();
1800 for (
unsigned I = 0; I < CD->NumParams; ++I) {
1801 if (I != ContextParamPos)
1802 CD->
setParam(I, readDeclAs<ImplicitParamDecl>());
1811 D->setExternLoc(readSourceLocation());
1812 D->setRBraceLoc(readSourceLocation());
1817 D->RBraceLoc = readSourceLocation();
1822 D->setLocStart(readSourceLocation());
1832 D->LocStart = readSourceLocation();
1833 D->RBraceLoc = readSourceLocation();
1840 if (Redecl.getFirstID() == ThisDeclID)
1841 AnonNamespace = readDeclID();
1845 if (AnonNamespace.
isValid()) {
1849 auto *Anon = cast<NamespaceDecl>(Reader.
GetDecl(AnonNamespace));
1851 D->setAnonymousNamespace(Anon);
1858 D->IsCBuffer =
Record.readBool();
1859 D->KwLoc = readSourceLocation();
1860 D->LBraceLoc = readSourceLocation();
1861 D->RBraceLoc = readSourceLocation();
1867 D->NamespaceLoc = readSourceLocation();
1868 D->IdentLoc = readSourceLocation();
1869 D->QualifierLoc =
Record.readNestedNameSpecifierLoc();
1870 D->Namespace = readDeclAs<NamedDecl>();
1876 D->setUsingLoc(readSourceLocation());
1877 D->QualifierLoc =
Record.readNestedNameSpecifierLoc();
1878 D->DNLoc =
Record.readDeclarationNameLoc(
D->getDeclName());
1879 D->FirstUsingShadow.setPointer(readDeclAs<UsingShadowDecl>());
1880 D->setTypename(
Record.readInt());
1881 if (
auto *Pattern = readDeclAs<NamedDecl>())
1888 D->setUsingLoc(readSourceLocation());
1889 D->setEnumLoc(readSourceLocation());
1890 D->setEnumType(
Record.readTypeSourceInfo());
1891 D->FirstUsingShadow.setPointer(readDeclAs<UsingShadowDecl>());
1892 if (
auto *Pattern = readDeclAs<UsingEnumDecl>())
1899 D->InstantiatedFrom = readDeclAs<NamedDecl>();
1900 auto **Expansions =
D->getTrailingObjects<
NamedDecl *>();
1901 for (
unsigned I = 0; I !=
D->NumExpansions; ++I)
1902 Expansions[I] = readDeclAs<NamedDecl>();
1909 D->Underlying = readDeclAs<NamedDecl>();
1911 D->UsingOrNextShadow = readDeclAs<NamedDecl>();
1912 auto *Pattern = readDeclAs<UsingShadowDecl>();
1921 D->NominatedBaseClassShadowDecl = readDeclAs<ConstructorUsingShadowDecl>();
1922 D->ConstructedBaseClassShadowDecl = readDeclAs<ConstructorUsingShadowDecl>();
1923 D->IsVirtual =
Record.readInt();
1928 D->UsingLoc = readSourceLocation();
1929 D->NamespaceLoc = readSourceLocation();
1930 D->QualifierLoc =
Record.readNestedNameSpecifierLoc();
1931 D->NominatedNamespace = readDeclAs<NamedDecl>();
1932 D->CommonAncestor = readDeclAs<DeclContext>();
1937 D->setUsingLoc(readSourceLocation());
1938 D->QualifierLoc =
Record.readNestedNameSpecifierLoc();
1939 D->DNLoc =
Record.readDeclarationNameLoc(
D->getDeclName());
1940 D->EllipsisLoc = readSourceLocation();
1947 D->TypenameLocation = readSourceLocation();
1948 D->QualifierLoc =
Record.readNestedNameSpecifierLoc();
1949 D->EllipsisLoc = readSourceLocation();
1958void ASTDeclReader::ReadCXXDefinitionData(
1960 Decl *LambdaContext,
unsigned IndexInLambdaContext) {
1964#define FIELD(Name, Width, Merge) \
1965 if (!CXXRecordDeclBits.canGetNextNBits(Width)) \
1966 CXXRecordDeclBits.updateValue(Record.readInt()); \
1967 Data.Name = CXXRecordDeclBits.getNextBits(Width);
1969#include "clang/AST/CXXRecordDeclDefinitionBits.def"
1974 Data.HasODRHash =
true;
1977 Reader.DefinitionSource[
D] =
1978 Loc.F->Kind == ModuleKind::MK_MainFile ||
1983 Data.ComputedVisibleConversions =
Record.readInt();
1984 if (
Data.ComputedVisibleConversions)
1985 Record.readUnresolvedSet(
Data.VisibleConversions);
1986 assert(
Data.Definition &&
"Data.Definition should be already set!");
1988 if (!
Data.IsLambda) {
1989 assert(!LambdaContext && !IndexInLambdaContext &&
1990 "given lambda context for non-lambda");
1994 Data.Bases = ReadGlobalOffset();
1998 Data.VBases = ReadGlobalOffset();
2004 auto &Lambda =
static_cast<CXXRecordDecl::LambdaDefinitionData &
>(
Data);
2007 Lambda.DependencyKind = LambdaBits.getNextBits(2);
2008 Lambda.IsGenericLambda = LambdaBits.getNextBit();
2009 Lambda.CaptureDefault = LambdaBits.getNextBits(2);
2010 Lambda.NumCaptures = LambdaBits.getNextBits(15);
2011 Lambda.HasKnownInternalLinkage = LambdaBits.getNextBit();
2013 Lambda.NumExplicitCaptures =
Record.readInt();
2014 Lambda.ManglingNumber =
Record.readInt();
2015 if (
unsigned DeviceManglingNumber =
Record.readInt())
2016 Reader.
getContext().DeviceLambdaManglingNumbers[
D] = DeviceManglingNumber;
2017 Lambda.IndexInContext = IndexInLambdaContext;
2018 Lambda.ContextDecl = LambdaContext;
2020 if (Lambda.NumCaptures) {
2022 Lambda.NumCaptures);
2023 Lambda.AddCaptureList(Reader.
getContext(), ToCapture);
2025 Lambda.MethodTyInfo = readTypeSourceInfo();
2026 for (
unsigned I = 0, N = Lambda.NumCaptures; I != N; ++I) {
2029 bool IsImplicit = CaptureBits.getNextBit();
2042 auto *Var = readDeclAs<ValueDecl>();
2044 new (ToCapture)
Capture(
Loc, IsImplicit,
Kind, Var, EllipsisLoc);
2053 CXXRecordDecl *
D,
struct CXXRecordDecl::DefinitionData &&MergeDD) {
2054 assert(
D->DefinitionData &&
2055 "merging class definition into non-definition");
2056 auto &DD = *
D->DefinitionData;
2058 if (DD.Definition != MergeDD.Definition) {
2060 Reader.MergedDeclContexts.insert(std::make_pair(MergeDD.Definition,
2062 Reader.PendingDefinitions.erase(MergeDD.Definition);
2063 MergeDD.Definition->demoteThisDefinitionToDeclaration();
2065 assert(!Reader.Lookups.contains(MergeDD.Definition) &&
2066 "already loaded pending lookups for merged definition");
2069 auto PFDI = Reader.PendingFakeDefinitionData.find(&DD);
2070 if (PFDI != Reader.PendingFakeDefinitionData.end() &&
2071 PFDI->second == ASTReader::PendingFakeDefinitionKind::Fake) {
2074 assert(!DD.IsLambda && !MergeDD.IsLambda &&
"faked up lambda definition?");
2075 PFDI->second = ASTReader::PendingFakeDefinitionKind::FakeLoaded;
2079 auto *Def = DD.Definition;
2080 DD = std::move(MergeDD);
2081 DD.Definition = Def;
2085 bool DetectedOdrViolation =
false;
2087 #define FIELD(Name, Width, Merge) Merge(Name)
2088 #define MERGE_OR(Field) DD.Field |= MergeDD.Field;
2089 #define NO_MERGE(Field) \
2090 DetectedOdrViolation |= DD.Field != MergeDD.Field; \
2092 #include "clang/AST/CXXRecordDeclDefinitionBits.def"
2097 if (DD.NumBases != MergeDD.NumBases || DD.NumVBases != MergeDD.NumVBases)
2098 DetectedOdrViolation =
true;
2104 if (MergeDD.ComputedVisibleConversions && !DD.ComputedVisibleConversions) {
2105 DD.VisibleConversions = std::move(MergeDD.VisibleConversions);
2106 DD.ComputedVisibleConversions =
true;
2113 auto &Lambda1 =
static_cast<CXXRecordDecl::LambdaDefinitionData &
>(DD);
2114 auto &Lambda2 =
static_cast<CXXRecordDecl::LambdaDefinitionData &
>(MergeDD);
2115 DetectedOdrViolation |= Lambda1.DependencyKind != Lambda2.DependencyKind;
2116 DetectedOdrViolation |= Lambda1.IsGenericLambda != Lambda2.IsGenericLambda;
2117 DetectedOdrViolation |= Lambda1.CaptureDefault != Lambda2.CaptureDefault;
2118 DetectedOdrViolation |= Lambda1.NumCaptures != Lambda2.NumCaptures;
2119 DetectedOdrViolation |=
2120 Lambda1.NumExplicitCaptures != Lambda2.NumExplicitCaptures;
2121 DetectedOdrViolation |=
2122 Lambda1.HasKnownInternalLinkage != Lambda2.HasKnownInternalLinkage;
2123 DetectedOdrViolation |= Lambda1.ManglingNumber != Lambda2.ManglingNumber;
2125 if (Lambda1.NumCaptures && Lambda1.NumCaptures == Lambda2.NumCaptures) {
2126 for (
unsigned I = 0, N = Lambda1.NumCaptures; I != N; ++I) {
2131 Lambda1.AddCaptureList(Reader.
getContext(), Lambda2.Captures.front());
2139 if (
D->getODRHash() != MergeDD.ODRHash) {
2140 DetectedOdrViolation =
true;
2143 if (DetectedOdrViolation)
2144 Reader.PendingOdrMergeFailures[DD.Definition].push_back(
2145 {MergeDD.Definition, &MergeDD});
2149 Decl *LambdaContext,
2150 unsigned IndexInLambdaContext) {
2151 struct CXXRecordDecl::DefinitionData *DD;
2156 bool IsLambda =
Record.readInt();
2157 assert(!(IsLambda &&
Update) &&
2158 "lambda definition should not be added by update record");
2160 DD =
new (
C) CXXRecordDecl::LambdaDefinitionData(
2163 DD =
new (
C)
struct CXXRecordDecl::DefinitionData(
D);
2169 if (!Canon->DefinitionData)
2170 Canon->DefinitionData = DD;
2171 D->DefinitionData = Canon->DefinitionData;
2172 ReadCXXDefinitionData(*DD,
D, LambdaContext, IndexInLambdaContext);
2175 D->setCompleteDefinition(
true);
2180 if (Canon->DefinitionData != DD) {
2189 Reader.PendingDefinitions.insert(
D);
2198 CXXRecNotTemplate = 0,
2200 CXXRecMemberSpecialization,
2204 Decl *LambdaContext =
nullptr;
2205 unsigned IndexInLambdaContext = 0;
2207 switch ((CXXRecKind)
Record.readInt()) {
2208 case CXXRecNotTemplate:
2210 if (!isa<ClassTemplateSpecializationDecl>(
D))
2213 case CXXRecTemplate: {
2215 auto *Template = readDeclAs<ClassTemplateDecl>();
2216 D->TemplateOrInstantiation = Template;
2217 if (!Template->getTemplatedDecl()) {
2228 case CXXRecMemberSpecialization: {
2229 auto *RD = readDeclAs<CXXRecordDecl>();
2234 D->TemplateOrInstantiation = MSI;
2239 LambdaContext = readDecl();
2241 IndexInLambdaContext =
Record.readInt();
2243 MergeImpl.
mergeLambda(
D, Redecl, *LambdaContext, IndexInLambdaContext);
2252 bool WasDefinition =
Record.readInt();
2254 ReadCXXRecordDefinition(
D,
false, LambdaContext,
2255 IndexInLambdaContext);
2262 if (WasDefinition) {
2264 if (KeyFn.
isValid() &&
D->isCompleteDefinition())
2275 D->setExplicitSpecifier(
Record.readExplicitSpec());
2276 D->Ctor = readDeclAs<CXXConstructorDecl>();
2278 D->setDeductionCandidateKind(
2285 unsigned NumOverridenMethods =
Record.readInt();
2287 while (NumOverridenMethods--) {
2290 if (
auto *MD = readDeclAs<CXXMethodDecl>())
2296 Record.skipInts(NumOverridenMethods);
2303 D->setExplicitSpecifier(
Record.readExplicitSpec());
2304 if (
D->isInheritingConstructor()) {
2305 auto *Shadow = readDeclAs<ConstructorUsingShadowDecl>();
2306 auto *Ctor = readDeclAs<CXXConstructorDecl>();
2317 if (
auto *OperatorDelete = readDeclAs<FunctionDecl>()) {
2319 auto *ThisArg =
Record.readExpr();
2321 if (!Canon->OperatorDelete) {
2322 Canon->OperatorDelete = OperatorDelete;
2323 Canon->OperatorDeleteThisArg = ThisArg;
2329 D->setExplicitSpecifier(
Record.readExplicitSpec());
2335 D->ImportedModule = readModule();
2336 D->setImportComplete(
Record.readInt());
2338 for (
unsigned I = 0, N =
Record.back(); I != N; ++I)
2339 StoredLocs[I] = readSourceLocation();
2345 D->setColonLoc(readSourceLocation());
2351 D->Friend = readDeclAs<NamedDecl>();
2353 D->Friend = readTypeSourceInfo();
2354 for (
unsigned i = 0; i !=
D->NumTPLists; ++i)
2356 Record.readTemplateParameterList();
2358 D->UnsupportedFriend = (
Record.readInt() != 0);
2359 D->FriendLoc = readSourceLocation();
2360 D->EllipsisLoc = readSourceLocation();
2365 unsigned NumParams =
Record.readInt();
2366 D->NumParams = NumParams;
2368 for (
unsigned i = 0; i != NumParams; ++i)
2369 D->Params[i] =
Record.readTemplateParameterList();
2371 D->Friend = readDeclAs<NamedDecl>();
2373 D->Friend = readTypeSourceInfo();
2374 D->FriendLoc = readSourceLocation();
2380 assert(!
D->TemplateParams &&
"TemplateParams already set!");
2381 D->TemplateParams =
Record.readTemplateParameterList();
2382 D->init(readDeclAs<NamedDecl>());
2387 D->ConstraintExpr =
Record.readExpr();
2397 for (
unsigned I = 0; I <
D->NumTemplateArgs; ++I)
2398 Args.push_back(
Record.readTemplateArgument(
true));
2399 D->setTemplateArguments(Args);
2406 llvm::BitstreamCursor &DeclsCursor,
2408 uint64_t Offset = ReadLocalOffset();
2410 Reader.ReadSpecializations(M, DeclsCursor, Offset,
D, IsPartial);
2424 Reader.PendingDefinitions.insert(CanonD);
2430 if (ThisDeclID == Redecl.getFirstID()) {
2431 if (
auto *RTD = readDeclAs<RedeclarableTemplateDecl>()) {
2432 assert(RTD->getKind() ==
D->
getKind() &&
2433 "InstantiatedFromMemberTemplate kind mismatch");
2434 D->setInstantiatedFromMemberTemplate(RTD);
2436 D->setMemberSpecialization();
2450 if (ThisDeclID == Redecl.getFirstID()) {
2457 if (
D->getTemplatedDecl()->TemplateOrInstantiation) {
2462 D->getTemplatedDecl(),
D->getInjectedClassNameSpecialization());
2467 llvm_unreachable(
"BuiltinTemplates are not serialized");
2477 if (ThisDeclID == Redecl.getFirstID()) {
2490 if (
Decl *InstD = readDecl()) {
2491 if (
auto *CTD = dyn_cast<ClassTemplateDecl>(InstD)) {
2492 D->SpecializedTemplate = CTD;
2495 Record.readTemplateArgumentList(TemplArgs);
2500 SpecializedPartialSpecialization();
2501 PS->PartialSpecialization
2502 = cast<ClassTemplatePartialSpecializationDecl>(InstD);
2503 PS->TemplateArgs = ArgList;
2504 D->SpecializedTemplate = PS;
2509 Record.readTemplateArgumentList(TemplArgs,
true);
2511 D->PointOfInstantiation = readSourceLocation();
2514 bool writtenAsCanonicalDecl =
Record.readInt();
2515 if (writtenAsCanonicalDecl) {
2516 auto *CanonPattern = readDeclAs<ClassTemplateDecl>();
2520 if (
auto *Partial = dyn_cast<ClassTemplatePartialSpecializationDecl>(
D)) {
2521 CanonSpec = CanonPattern->getCommonPtr()->PartialSpecializations
2522 .GetOrInsertNode(Partial);
2525 CanonPattern->getCommonPtr()->Specializations.GetOrInsertNode(
D);
2528 if (CanonSpec !=
D) {
2533 if (
auto *DDD =
D->DefinitionData) {
2534 if (CanonSpec->DefinitionData)
2537 CanonSpec->DefinitionData =
D->DefinitionData;
2539 D->DefinitionData = CanonSpec->DefinitionData;
2548 ExplicitInfo->TemplateKeywordLoc = readSourceLocation();
2549 D->ExplicitInfo = ExplicitInfo;
2553 D->setTemplateArgsAsWritten(
Record.readASTTemplateArgumentListInfo());
2563 D->TemplateParams = Params;
2568 if (ThisDeclID == Redecl.getFirstID()) {
2569 D->InstantiatedFromMember.setPointer(
2570 readDeclAs<ClassTemplatePartialSpecializationDecl>());
2571 D->InstantiatedFromMember.setInt(
Record.readInt());
2578 if (ThisDeclID == Redecl.getFirstID()) {
2592 if (
Decl *InstD = readDecl()) {
2593 if (
auto *VTD = dyn_cast<VarTemplateDecl>(InstD)) {
2594 D->SpecializedTemplate = VTD;
2597 Record.readTemplateArgumentList(TemplArgs);
2602 VarTemplateSpecializationDecl::SpecializedPartialSpecialization();
2603 PS->PartialSpecialization =
2604 cast<VarTemplatePartialSpecializationDecl>(InstD);
2605 PS->TemplateArgs = ArgList;
2606 D->SpecializedTemplate = PS;
2614 ExplicitInfo->TemplateKeywordLoc = readSourceLocation();
2615 D->ExplicitInfo = ExplicitInfo;
2619 D->setTemplateArgsAsWritten(
Record.readASTTemplateArgumentListInfo());
2622 Record.readTemplateArgumentList(TemplArgs,
true);
2624 D->PointOfInstantiation = readSourceLocation();
2626 D->IsCompleteDefinition =
Record.readInt();
2630 bool writtenAsCanonicalDecl =
Record.readInt();
2631 if (writtenAsCanonicalDecl) {
2632 auto *CanonPattern = readDeclAs<VarTemplateDecl>();
2635 if (
auto *Partial = dyn_cast<VarTemplatePartialSpecializationDecl>(
D)) {
2636 CanonSpec = CanonPattern->getCommonPtr()
2637 ->PartialSpecializations.GetOrInsertNode(Partial);
2640 CanonPattern->getCommonPtr()->Specializations.GetOrInsertNode(
D);
2659 D->TemplateParams = Params;
2664 if (ThisDeclID == Redecl.getFirstID()) {
2665 D->InstantiatedFromMember.setPointer(
2666 readDeclAs<VarTemplatePartialSpecializationDecl>());
2667 D->InstantiatedFromMember.setInt(
Record.readInt());
2674 D->setDeclaredWithTypename(
Record.readInt());
2676 bool TypeConstraintInitialized =
D->hasTypeConstraint() &&
Record.readBool();
2677 if (TypeConstraintInitialized) {
2680 CR =
Record.readConceptReference();
2681 Expr *ImmediatelyDeclaredConstraint =
Record.readExpr();
2683 D->setTypeConstraint(CR, ImmediatelyDeclaredConstraint);
2684 if ((
D->ExpandedParameterPack =
Record.readInt()))
2685 D->NumExpanded =
Record.readInt();
2690 Record.readTemplateArgumentLoc());
2696 D->setDepth(
Record.readInt());
2697 D->setPosition(
Record.readInt());
2698 if (
D->hasPlaceholderTypeConstraint())
2699 D->setPlaceholderTypeConstraint(
Record.readExpr());
2700 if (
D->isExpandedParameterPack()) {
2701 auto TypesAndInfos =
2702 D->getTrailingObjects<std::pair<QualType, TypeSourceInfo *>>();
2703 for (
unsigned I = 0, N =
D->getNumExpansionTypes(); I != N; ++I) {
2705 TypesAndInfos[I].second = readTypeSourceInfo();
2709 D->ParameterPack =
Record.readInt();
2712 Record.readTemplateArgumentLoc());
2718 D->setDeclaredWithTypename(
Record.readBool());
2720 D->setDepth(
Record.readInt());
2721 D->setPosition(
Record.readInt());
2722 if (
D->isExpandedParameterPack()) {
2724 for (
unsigned I = 0, N =
D->getNumExpansionTemplateParameters();
2726 Data[I] =
Record.readTemplateParameterList();
2729 D->ParameterPack =
Record.readInt();
2732 Record.readTemplateArgumentLoc());
2743 D->AssertExprAndFailed.setPointer(
Record.readExpr());
2744 D->AssertExprAndFailed.setInt(
Record.readInt());
2745 D->Message = cast_or_null<StringLiteral>(
Record.readExpr());
2746 D->RParenLoc = readSourceLocation();
2756 D->ExtendingDecl = readDeclAs<ValueDecl>();
2757 D->ExprWithTemporary =
Record.readStmt();
2762 D->ManglingNumber =
Record.readInt();
2766std::pair<uint64_t, uint64_t>
2768 uint64_t LexicalOffset = ReadLocalOffset();
2769 uint64_t VisibleOffset = ReadLocalOffset();
2770 return std::make_pair(LexicalOffset, VisibleOffset);
2773template <
typename T>
2776 Decl *MergeWith =
nullptr;
2778 bool IsKeyDecl = ThisDeclID == FirstDeclID;
2779 bool IsFirstLocalDecl =
false;
2781 uint64_t RedeclOffset = 0;
2786 FirstDeclID = ThisDeclID;
2788 IsFirstLocalDecl =
true;
2789 }
else if (
unsigned N =
Record.readInt()) {
2793 IsFirstLocalDecl =
true;
2800 for (
unsigned I = 0; I != N - 1; ++I)
2801 MergeWith = readDecl();
2803 RedeclOffset = ReadLocalOffset();
2810 auto *FirstDecl = cast_or_null<T>(Reader.
GetDecl(FirstDeclID));
2811 if (FirstDecl !=
D) {
2820 auto *DAsT =
static_cast<T *
>(
D);
2826 if (IsFirstLocalDecl)
2827 Reader.PendingDeclChains.push_back(std::make_pair(DAsT, RedeclOffset));
2829 return RedeclarableResult(MergeWith, FirstDeclID, IsKeyDecl);
2834template <
typename T>
2836 RedeclarableResult &Redecl) {
2845 auto *
D =
static_cast<T *
>(DBase);
2847 if (
auto *Existing = Redecl.getKnownMergeTarget())
2850 else if (FindExistingResult ExistingRes = findExisting(
D))
2851 if (
T *Existing = ExistingRes)
2862 Decl &Context,
unsigned IndexInContext) {
2871 if (
auto *Existing = Redecl.getKnownMergeTarget())
2877 NamedDecl *&Slot = Reader.LambdaDeclarationsForMerging[{
2878 Context.getCanonicalDecl(), IndexInContext}];
2886 RedeclarableResult &Redecl) {
2899 llvm_unreachable(
"bad assert_cast");
2907 auto *DPattern =
D->getTemplatedDecl();
2909 RedeclarableResult
Result(
2911 DPattern->getCanonicalDecl()->getGlobalID(), IsKeyDecl);
2913 if (
auto *DClass = dyn_cast<CXXRecordDecl>(DPattern)) {
2916 auto *ExistingClass =
2917 cast<CXXRecordDecl>(ExistingPattern)->getCanonicalDecl();
2918 if (
auto *DDD = DClass->DefinitionData) {
2919 if (ExistingClass->DefinitionData) {
2922 ExistingClass->DefinitionData = DClass->DefinitionData;
2925 Reader.PendingDefinitions.insert(DClass);
2928 DClass->DefinitionData = ExistingClass->DefinitionData;
2933 if (
auto *DFunction = dyn_cast<FunctionDecl>(DPattern))
2936 if (
auto *DVar = dyn_cast<VarDecl>(DPattern))
2938 if (
auto *DAlias = dyn_cast<TypeAliasDecl>(DPattern))
2941 llvm_unreachable(
"merged an unknown kind of redeclarable template");
2946template <
typename T>
2949 auto *
D =
static_cast<T *
>(DBase);
2950 T *ExistingCanon = Existing->getCanonicalDecl();
2952 if (ExistingCanon != DCanon) {
2957 D->First = ExistingCanon;
2958 ExistingCanon->Used |=
D->Used;
2961 bool IsKeyDecl = KeyDeclID.
isValid();
2964 if (
auto *DTemplate = dyn_cast<RedeclarableTemplateDecl>(
D))
2966 DTemplate, assert_cast<RedeclarableTemplateDecl *>(ExistingCanon),
2971 Reader.KeyDecls[ExistingCanon].push_back(KeyDeclID);
2984 if (isa<EnumConstantDecl, FieldDecl, IndirectFieldDecl>(ND))
2999 Reader.LETemporaryForMerging[std::make_pair(
3026 if (FindExistingResult ExistingRes = findExisting(
static_cast<T*
>(
D)))
3027 if (
T *Existing = ExistingRes)
3029 Existing->getCanonicalDecl());
3033 Record.readOMPChildren(
D->Data);
3038 Record.readOMPChildren(
D->Data);
3043 Record.readOMPChildren(
D->Data);
3052 D->setCombinerData(In, Out);
3054 D->setCombiner(Combiner);
3057 D->setInitializerData(Orig, Priv);
3060 D->setInitializer(
Init, IK);
3065 Record.readOMPChildren(
D->Data);
3067 D->VarName =
Record.readDeclarationName();
3086 uint64_t readInt() {
3090 bool readBool() {
return Reader.
readBool(); }
3104 std::string readString() {
3116 VersionTuple readVersionTuple() {
3122 template <
typename T>
T *readDeclAs() {
return Reader.
readDeclAs<
T>(); }
3127 AttrReader
Record(*
this);
3132 Attr *New =
nullptr;
3142 unsigned ParsedKind =
Record.readInt();
3143 unsigned Syntax =
Record.readInt();
3144 unsigned SpellingIndex =
Record.readInt();
3145 bool IsAlignas = (ParsedKind == AttributeCommonInfo::AT_Aligned &&
3147 SpellingIndex == AlignedAttr::Keyword_alignas);
3148 bool IsRegularKeywordAttribute =
Record.readBool();
3153 IsAlignas, IsRegularKeywordAttribute});
3155#include "clang/Serialization/AttrPCHRead.inc"
3157 assert(New &&
"Unable to decode attribute?");
3163 for (
unsigned I = 0,
E =
readInt(); I !=
E; ++I)
3178inline void ASTReader::LoadedDecl(
unsigned Index,
Decl *
D) {
3179 assert(!DeclsLoaded[Index] &&
"Decl loaded twice?");
3180 DeclsLoaded[Index] =
D;
3189bool ASTReader::isConsumerInterestedIn(
Decl *
D) {
3208 if (
const auto *Var = dyn_cast<VarDecl>(
D))
3209 return Var->isFileVarDecl() &&
3211 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(Var));
3212 if (
const auto *
Func = dyn_cast<FunctionDecl>(
D))
3213 return Func->doesThisDeclarationHaveABody() || PendingBodies.count(
D);
3223ASTReader::RecordLocation ASTReader::DeclCursorForID(
GlobalDeclID ID,
3227 unsigned LocalDeclIndex =
ID.getLocalDeclIndex();
3233ASTReader::RecordLocation ASTReader::getLocalBitOffset(uint64_t GlobalOffset) {
3234 auto I = GlobalBitOffsetsMap.find(GlobalOffset);
3236 assert(I != GlobalBitOffsetsMap.end() &&
"Corrupted global bit offsets map");
3237 return RecordLocation(I->second, GlobalOffset - I->second->GlobalBitOffset);
3245ASTDeclReader::getOrFakePrimaryClassDefinition(
ASTReader &Reader,
3248 auto *DD = RD->DefinitionData;
3257 DD =
new (Reader.
getContext())
struct CXXRecordDecl::DefinitionData(RD);
3259 RD->DefinitionData = DD;
3263 Reader.PendingFakeDefinitionData.insert(
3264 std::make_pair(DD, ASTReader::PendingFakeDefinitionKind::Fake));
3267 return DD->Definition;
3274 if (
auto *ND = dyn_cast<NamespaceDecl>(DC))
3275 return ND->getFirstDecl();
3277 if (
auto *RD = dyn_cast<CXXRecordDecl>(DC))
3278 return getOrFakePrimaryClassDefinition(Reader, RD);
3280 if (
auto *RD = dyn_cast<RecordDecl>(DC))
3283 if (
auto *ED = dyn_cast<EnumDecl>(DC))
3286 if (
auto *OID = dyn_cast<ObjCInterfaceDecl>(DC))
3291 if (
auto *TU = dyn_cast<TranslationUnitDecl>(DC))
3297ASTDeclReader::FindExistingResult::~FindExistingResult() {
3300 if (TypedefNameForLinkage) {
3302 Reader.ImportedTypedefNamesForLinkage.insert(
3303 std::make_pair(std::make_pair(DC, TypedefNameForLinkage), New));
3307 if (!AddResult || Existing)
3313 setAnonymousDeclForMerging(Reader, New->getLexicalDeclContext(),
3314 AnonymousDeclNumber, New);
3318 Reader.PendingFakeLookupResults[Name.getAsIdentifierInfo()]
3320 }
else if (
DeclContext *MergeDC = getPrimaryContextForMerging(Reader, DC)) {
3323 MergeDC->makeDeclVisibleInContextImpl(New,
true);
3331 bool IsTypedefNameForLinkage) {
3332 if (!IsTypedefNameForLinkage)
3338 if (
Found->isFromASTFile())
3341 if (
auto *TND = dyn_cast<TypedefNameDecl>(
Found))
3342 return TND->getAnonDeclWithTypedefName(
true);
3351ASTDeclReader::getPrimaryDCForAnonymousDecl(
DeclContext *LexicalDC) {
3353 if (
auto *RD = dyn_cast<CXXRecordDecl>(LexicalDC)) {
3355 return DD ? DD->Definition :
nullptr;
3356 }
else if (
auto *OID = dyn_cast<ObjCInterfaceDecl>(LexicalDC)) {
3357 return OID->getCanonicalDecl()->getDefinition();
3364 if (
auto *FD = dyn_cast<FunctionDecl>(
D))
3365 if (FD->isThisDeclarationADefinition())
3367 if (
auto *MD = dyn_cast<ObjCMethodDecl>(
D))
3368 if (MD->isThisDeclarationADefinition())
3370 if (
auto *RD = dyn_cast<RecordDecl>(
D))
3387 auto &
Previous = Reader.AnonymousDeclarationsForMerging[CanonDC];
3393 auto *PrimaryDC = getPrimaryDCForAnonymousDecl(DC);
3394 if (PrimaryDC && !cast<Decl>(PrimaryDC)->isFromASTFile()) {
3406void ASTDeclReader::setAnonymousDeclForMerging(
ASTReader &Reader,
3409 auto *CanonDC = cast<Decl>(DC)->getCanonicalDecl();
3411 auto &
Previous = Reader.AnonymousDeclarationsForMerging[CanonDC];
3418ASTDeclReader::FindExistingResult ASTDeclReader::findExisting(
NamedDecl *
D) {
3425 FindExistingResult
Result(Reader,
D,
nullptr,
3426 AnonymousDeclNumber, TypedefNameForLinkage);
3433 if (TypedefNameForLinkage) {
3434 auto It = Reader.ImportedTypedefNamesForLinkage.find(
3435 std::make_pair(DC, TypedefNameForLinkage));
3436 if (It != Reader.ImportedTypedefNamesForLinkage.end())
3437 if (
C.isSameEntity(It->second,
D))
3438 return FindExistingResult(Reader,
D, It->second, AnonymousDeclNumber,
3439 TypedefNameForLinkage);
3447 if (
auto *Existing = getAnonymousDeclForMerging(
3449 if (
C.isSameEntity(Existing,
D))
3450 return FindExistingResult(Reader,
D, Existing, AnonymousDeclNumber,
3451 TypedefNameForLinkage);
3458 class UpToDateIdentifierRAII {
3460 bool WasOutToDate =
false;
3471 ~UpToDateIdentifierRAII() {
3475 } UpToDate(Name.getAsIdentifierInfo());
3478 IEnd = IdResolver.
end();
3481 if (
C.isSameEntity(Existing,
D))
3482 return FindExistingResult(Reader,
D, Existing, AnonymousDeclNumber,
3483 TypedefNameForLinkage);
3485 }
else if (
DeclContext *MergeDC = getPrimaryContextForMerging(Reader, DC)) {
3489 if (
C.isSameEntity(Existing,
D))
3490 return FindExistingResult(Reader,
D, Existing, AnonymousDeclNumber,
3491 TypedefNameForLinkage);
3495 return FindExistingResult(Reader);
3507 if (MergedDCIt != Reader.MergedDeclContexts.end() &&
3510 Reader.PendingOdrMergeChecks.push_back(
D);
3512 return FindExistingResult(Reader,
D,
nullptr,
3513 AnonymousDeclNumber, TypedefNameForLinkage);
3516template<
typename DeclT>
3518 return D->RedeclLink.getLatestNotUpdated();
3522 llvm_unreachable(
"getMostRecentDecl on non-redeclarable declaration");
3529#define ABSTRACT_DECL(TYPE)
3530#define DECL(TYPE, BASE) \
3532 return getMostRecentDeclImpl(cast<TYPE##Decl>(D));
3533#include "clang/AST/DeclNodes.inc"
3535 llvm_unreachable(
"unknown decl kind");
3538Decl *ASTReader::getMostRecentExistingDecl(
Decl *
D) {
3546 const auto *IA =
Previous->getAttr<MSInheritanceAttr>();
3548 if (IA && !
D->
hasAttr<MSInheritanceAttr>()) {
3549 NewAttr = cast<InheritableAttr>(IA->clone(Context));
3554 const auto *AA =
Previous->getAttr<AvailabilityAttr>();
3555 if (AA && !
D->
hasAttr<AvailabilityAttr>()) {
3556 NewAttr = AA->
clone(Context);
3563template<
typename DeclT>
3567 D->RedeclLink.setPrevious(cast<DeclT>(
Previous));
3568 D->First = cast<DeclT>(
Previous)->First;
3577 auto *VD =
static_cast<VarDecl *
>(
D);
3578 auto *PrevVD = cast<VarDecl>(
Previous);
3579 D->RedeclLink.setPrevious(PrevVD);
3580 D->First = PrevVD->First;
3589 VD->demoteThisDefinitionToDeclaration();
3606 auto *PrevFD = cast<FunctionDecl>(
Previous);
3608 FD->RedeclLink.setPrevious(PrevFD);
3609 FD->First = PrevFD->First;
3613 if (PrevFD->isInlined() != FD->isInlined()) {
3629 FD->setImplicitlyInline(
true);
3634 if (FPT && PrevFPT) {
3638 bool WasUnresolved =
3640 if (IsUnresolved != WasUnresolved)
3641 Reader.PendingExceptionSpecUpdates.insert(
3642 {Canon, IsUnresolved ? PrevFD : FD});
3648 if (IsUndeduced != WasUndeduced)
3649 Reader.PendingDeducedTypeUpdates.insert(
3650 {cast<FunctionDecl>(Canon),
3651 (IsUndeduced ? PrevFPT : FPT)->getReturnType()});
3658 llvm_unreachable(
"attachPreviousDecl on non-redeclarable declaration");
3663template <
typename ParmDecl>
3666 auto *To = cast<ParmDecl>(ToD);
3667 if (!From->hasDefaultArgument())
3669 To->setInheritedDefaultArgument(Context, From);
3678 assert(FromTP->size() == ToTP->size() &&
"merged mismatched templates?");
3680 for (
unsigned I = 0, N = FromTP->size(); I != N; ++I) {
3681 NamedDecl *FromParam = FromTP->getParam(I);
3684 if (
auto *FTTP = dyn_cast<TemplateTypeParmDecl>(FromParam))
3686 else if (
auto *FNTTP = dyn_cast<NonTypeTemplateParmDecl>(FromParam))
3690 Context, cast<TemplateTemplateParmDecl>(FromParam), ToParam);
3708 if (!isa<VarDecl, FunctionDecl, TagDecl, RedeclarableTemplateDecl>(
Previous))
3716 if (isa<VarTemplateSpecializationDecl>(
Previous))
3718 if (isa<ClassTemplateSpecializationDecl>(
Previous))
3721 Func &&
Func->getTemplateSpecializationInfo())
3738 Reader.PendingWarningForDuplicatedDefsInModuleUnits.push_back(
3748 diag::err_multiple_decl_in_different_modules)
3758#define ABSTRACT_DECL(TYPE)
3759#define DECL(TYPE, BASE) \
3761 attachPreviousDeclImpl(Reader, cast<TYPE##Decl>(D), Previous, Canon); \
3763#include "clang/AST/DeclNodes.inc"
3779 if (
auto *TD = dyn_cast<TemplateDecl>(
D))
3787 mergeInheritableAttributes(Reader,
D,
Previous);
3790template<
typename DeclT>
3792 D->RedeclLink.setLatest(cast<DeclT>(Latest));
3796 llvm_unreachable(
"attachLatestDecl on non-redeclarable declaration");
3800 assert(
D && Latest);
3803#define ABSTRACT_DECL(TYPE)
3804#define DECL(TYPE, BASE) \
3806 attachLatestDeclImpl(cast<TYPE##Decl>(D), Latest); \
3808#include "clang/AST/DeclNodes.inc"
3812template<
typename DeclT>
3814 D->RedeclLink.markIncomplete();
3818 llvm_unreachable(
"markIncompleteDeclChain on non-redeclarable declaration");
3821void ASTReader::markIncompleteDeclChain(
Decl *
D) {
3823#define ABSTRACT_DECL(TYPE)
3824#define DECL(TYPE, BASE) \
3826 ASTDeclReader::markIncompleteDeclChainImpl(cast<TYPE##Decl>(D)); \
3828#include "clang/AST/DeclNodes.inc"
3835 RecordLocation
Loc = DeclCursorForID(ID, DeclLoc);
3836 llvm::BitstreamCursor &DeclsCursor =
Loc.F->DeclsCursor;
3841 ReadingKindTracker ReadingKind(Read_Decl, *
this);
3844 Deserializing ADecl(
this);
3846 auto Fail = [](
const char *what, llvm::Error &&Err) {
3847 llvm::report_fatal_error(Twine(
"ASTReader::readDeclRecord failed ") + what +
3851 if (llvm::Error JumpFailed = DeclsCursor.JumpToBit(
Loc.Offset))
3852 Fail(
"jumping", std::move(JumpFailed));
3857 Fail(
"reading code", MaybeCode.takeError());
3858 unsigned Code = MaybeCode.get();
3864 llvm::report_fatal_error(
3865 Twine(
"ASTReader::readDeclRecord failed reading decl code: ") +
3866 toString(MaybeDeclCode.takeError()));
3868 switch ((
DeclCode)MaybeDeclCode.get()) {
3873 llvm_unreachable(
"Record cannot be de-serialized with readDeclRecord");
3983 bool HasTypeConstraint =
Record.readInt();
3989 bool HasTypeConstraint =
Record.readInt();
3995 bool HasTypeConstraint =
Record.readInt();
3997 Context, ID,
Record.readInt(), HasTypeConstraint);
4086 D = MSGuidDecl::CreateDeserialized(Context, ID);
4089 D = UnnamedGlobalConstantDecl::CreateDeserialized(Context, ID);
4092 D = TemplateParamObjectDecl::CreateDeserialized(Context, ID);
4098 Error(
"attempt to read a C++ base-specifier record as a declaration");
4101 Error(
"attempt to read a C++ ctor initializer record as a declaration");
4110 unsigned NumChildren =
Record.readInt();
4116 unsigned NumClauses =
Record.readInt();
4117 unsigned NumVars =
Record.readInt();
4123 unsigned NumClauses =
Record.readInt();
4132 unsigned NumClauses =
Record.readInt();
4165 assert(
D &&
"Unknown declaration reading AST file");
4166 LoadedDecl(translateGlobalDeclIDToIndex(ID),
D);
4177 if (
auto *DC = dyn_cast<DeclContext>(
D)) {
4178 std::pair<uint64_t, uint64_t> Offsets = Reader.VisitDeclContext(DC);
4183 if (!Offsets.first && !Offsets.second && isa<NamespaceDecl>(
D))
4184 if (
auto Iter = DelayedNamespaceOffsetMap.find(ID);
4185 Iter != DelayedNamespaceOffsetMap.end())
4186 Offsets =
Iter->second;
4188 if (Offsets.first &&
4189 ReadLexicalDeclContextStorage(*
Loc.F, DeclsCursor, Offsets.first, DC))
4191 if (Offsets.second &&
4192 ReadVisibleDeclContextStorage(*
Loc.F, DeclsCursor, Offsets.second, ID))
4198 PendingUpdateRecords.push_back(
4199 PendingUpdateRecord(ID,
D,
true));
4202 if (
auto *
Class = dyn_cast<ObjCInterfaceDecl>(
D))
4205 if (
Class->isThisDeclarationADefinition() ||
4206 PendingDefinitions.count(
Class))
4207 loadObjCCategories(ID,
Class);
4213 PotentiallyInterestingDecls.push_back(
D);
4218void ASTReader::PassInterestingDeclsToConsumer() {
4221 if (PassingDeclsToConsumer)
4226 SaveAndRestore GuardPassingDeclsToConsumer(PassingDeclsToConsumer,
true);
4230 for (
auto ID : EagerlyDeserializedDecls)
4232 EagerlyDeserializedDecls.clear();
4234 auto ConsumingPotentialInterestingDecls = [
this]() {
4235 while (!PotentiallyInterestingDecls.empty()) {
4236 Decl *
D = PotentiallyInterestingDecls.front();
4237 PotentiallyInterestingDecls.pop_front();
4238 if (isConsumerInterestedIn(
D))
4239 PassInterestingDeclToConsumer(
D);
4242 std::deque<Decl *> MaybeInterestingDecls =
4243 std::move(PotentiallyInterestingDecls);
4244 PotentiallyInterestingDecls.clear();
4245 assert(PotentiallyInterestingDecls.empty());
4246 while (!MaybeInterestingDecls.empty()) {
4247 Decl *
D = MaybeInterestingDecls.front();
4248 MaybeInterestingDecls.pop_front();
4254 if (
auto *VD = dyn_cast<VarDecl>(
D);
4255 VD && VD->isFileVarDecl() && !VD->isExternallyVisible())
4257 ConsumingPotentialInterestingDecls();
4258 if (isConsumerInterestedIn(
D))
4259 PassInterestingDeclToConsumer(
D);
4263 ConsumingPotentialInterestingDecls();
4266 auto *RD = cast<CXXRecordDecl>(
GetDecl(ID));
4268 PassVTableToConsumer(RD);
4270 VTablesToEmit.clear();
4273void ASTReader::loadDeclUpdateRecords(PendingUpdateRecord &
Record) {
4279 ProcessingUpdatesRAIIObj ProcessingUpdates(*
this);
4280 DeclUpdateOffsetsMap::iterator UpdI = DeclUpdateOffsets.find(ID);
4282 if (UpdI != DeclUpdateOffsets.end()) {
4283 auto UpdateOffsets = std::move(UpdI->second);
4284 DeclUpdateOffsets.erase(UpdI);
4290 bool WasInteresting =
Record.JustLoaded || isConsumerInterestedIn(
D);
4291 for (
auto &FileAndOffset : UpdateOffsets) {
4293 uint64_t Offset = FileAndOffset.second;
4296 if (llvm::Error JumpFailed =
Cursor.JumpToBit(Offset))
4298 llvm::report_fatal_error(
4299 Twine(
"ASTReader::loadDeclUpdateRecords failed jumping: ") +
4303 llvm::report_fatal_error(
4304 Twine(
"ASTReader::loadDeclUpdateRecords failed reading code: ") +
4306 unsigned Code = MaybeCode.get();
4310 "Expected DECL_UPDATES record!");
4312 llvm::report_fatal_error(
4313 Twine(
"ASTReader::loadDeclUpdateRecords failed reading rec code: ") +
4318 Reader.UpdateDecl(
D);
4322 if (!WasInteresting && isConsumerInterestedIn(
D)) {
4323 PotentiallyInterestingDecls.push_back(
D);
4324 WasInteresting =
true;
4330 auto I = PendingVisibleUpdates.find(ID);
4331 if (I != PendingVisibleUpdates.end()) {
4332 auto VisibleUpdates = std::move(I->second);
4333 PendingVisibleUpdates.erase(I);
4336 for (
const auto &
Update : VisibleUpdates)
4337 Lookups[DC].Table.add(
4345 if (
auto IT = RelatedDeclsMap.find(ID); IT != RelatedDeclsMap.end()) {
4346 for (
auto LID : IT->second)
4348 RelatedDeclsMap.erase(IT);
4353 if (
auto I = PendingSpecializationsUpdates.find(ID);
4354 I != PendingSpecializationsUpdates.end()) {
4355 auto SpecializationUpdates = std::move(I->second);
4356 PendingSpecializationsUpdates.erase(I);
4358 for (
const auto &
Update : SpecializationUpdates)
4363 if (
auto I = PendingPartialSpecializationsUpdates.find(ID);
4364 I != PendingPartialSpecializationsUpdates.end()) {
4365 auto SpecializationUpdates = std::move(I->second);
4366 PendingPartialSpecializationsUpdates.erase(I);
4368 for (
const auto &
Update : SpecializationUpdates)
4373void ASTReader::loadPendingDeclChain(
Decl *FirstLocal, uint64_t LocalOffset) {
4376 if (FirstLocal != CanonDecl) {
4379 *
this, FirstLocal, PrevMostRecent ? PrevMostRecent : CanonDecl,
4390 assert(M &&
"imported decl from no module file");
4394 if (llvm::Error JumpFailed =
Cursor.JumpToBit(LocalOffset))
4395 llvm::report_fatal_error(
4396 Twine(
"ASTReader::loadPendingDeclChain failed jumping: ") +
4402 llvm::report_fatal_error(
4403 Twine(
"ASTReader::loadPendingDeclChain failed reading code: ") +
4405 unsigned Code = MaybeCode.get();
4408 "expected LOCAL_REDECLARATIONS record!");
4410 llvm::report_fatal_error(
4411 Twine(
"ASTReader::loadPendingDeclChain failed reading rec code: ") +
4416 Decl *MostRecent = FirstLocal;
4417 for (
unsigned I = 0, N =
Record.size(); I != N; ++I) {
4418 unsigned Idx = N - I - 1;
4430 class ObjCCategoriesVisitor {
4433 llvm::SmallPtrSetImpl<ObjCCategoryDecl *> &Deserialized;
4435 llvm::DenseMap<DeclarationName, ObjCCategoryDecl *> NameCategoryMap;
4437 unsigned PreviousGeneration;
4441 if (!Deserialized.erase(Cat))
4452 NonEquivalentDecls, StructuralEquivalenceKind::Default,
4456 if (!Ctx.IsEquivalent(Cat, Existing)) {
4461 diag::note_previous_definition);
4463 }
else if (!Existing) {
4478 ObjCCategoriesVisitor(
4480 llvm::SmallPtrSetImpl<ObjCCategoryDecl *> &Deserialized,
4483 InterfaceID(InterfaceID), PreviousGeneration(PreviousGeneration) {
4485 for (
auto *Cat :
Interface->known_categories()) {
4516 LocalID != Result->getDefinitionID()) {
4524 unsigned Offset = Result->Offset;
4527 for (
unsigned I = 0; I != N; ++I)
4536 unsigned PreviousGeneration) {
4537 ObjCCategoriesVisitor Visitor(*
this,
D, CategoriesDeserialized, ID,
4538 PreviousGeneration);
4539 ModuleMgr.
visit(Visitor);
4542template<
typename DeclT,
typename Fn>
4551 for (
auto *Redecl = MostRecent; Redecl && !
Found;
4552 Redecl = Redecl->getPreviousDecl())
4557 for (
auto *Redecl = MostRecent; Redecl !=
D;
4567 auto *RD = cast<CXXRecordDecl>(
D);
4569 assert(MD &&
"couldn't read decl from update record");
4570 Reader.PendingAddedClassMembers.push_back({RD, MD});
4575 auto *Anon = readDeclAs<NamespaceDecl>();
4580 if (!
Record.isModule()) {
4581 if (
auto *TU = dyn_cast<TranslationUnitDecl>(
D))
4582 TU->setAnonymousNamespace(Anon);
4584 cast<NamespaceDecl>(
D)->setAnonymousNamespace(Anon);
4590 auto *VD = cast<VarDecl>(
D);
4591 VD->NonParmVarDeclBits.IsInline =
Record.readInt();
4592 VD->NonParmVarDeclBits.IsInlineSpecified =
Record.readInt();
4599 if (
auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(
D)) {
4600 VTSD->setPointOfInstantiation(POI);
4601 }
else if (
auto *VD = dyn_cast<VarDecl>(
D)) {
4603 assert(MSInfo &&
"No member specialization information");
4606 auto *FD = cast<FunctionDecl>(
D);
4607 if (
auto *FTSInfo = FD->TemplateOrSpecialization
4609 FTSInfo->setPointOfInstantiation(POI);
4611 cast<MemberSpecializationInfo *>(FD->TemplateOrSpecialization)
4612 ->setPointOfInstantiation(POI);
4618 auto *Param = cast<ParmVarDecl>(
D);
4623 auto *DefaultArg =
Record.readExpr();
4627 if (Param->hasUninstantiatedDefaultArg())
4628 Param->setDefaultArg(DefaultArg);
4633 auto *FD = cast<FieldDecl>(
D);
4634 auto *DefaultInit =
Record.readExpr();
4638 if (FD->hasInClassInitializer() && !FD->hasNonNullInClassInitializer()) {
4640 FD->setInClassInitializer(DefaultInit);
4644 FD->removeInClassInitializer();
4650 auto *FD = cast<FunctionDecl>(
D);
4651 if (Reader.PendingBodies[FD]) {
4665 FD->setInnerLocStart(readSourceLocation());
4667 assert(
Record.getIdx() ==
Record.size() &&
"lazy body must be last");
4672 auto *RD = cast<CXXRecordDecl>(
D);
4674 bool HadRealDefinition =
4675 OldDD && (OldDD->Definition != RD ||
4676 !Reader.PendingFakeDefinitionData.count(OldDD));
4680 ReadCXXRecordDefinition(RD,
true);
4683 uint64_t LexicalOffset = ReadLocalOffset();
4684 if (!HadRealDefinition && LexicalOffset) {
4685 Record.readLexicalDeclContextStorage(LexicalOffset, RD);
4686 Reader.PendingFakeDefinitionData.erase(OldDD);
4693 MSInfo->setTemplateSpecializationKind(TSK);
4694 MSInfo->setPointOfInstantiation(POI);
4696 auto *Spec = cast<ClassTemplateSpecializationDecl>(RD);
4697 Spec->setTemplateSpecializationKind(TSK);
4698 Spec->setPointOfInstantiation(POI);
4702 readDeclAs<ClassTemplatePartialSpecializationDecl>();
4704 Record.readTemplateArgumentList(TemplArgs);
4710 if (!isa<ClassTemplatePartialSpecializationDecl *>(
4711 Spec->getSpecializedTemplateOrPartial()))
4712 Spec->setInstantiationOf(PartialSpec, TemplArgList);
4723 Record.readAttributes(Attrs);
4735 auto *Del = readDeclAs<FunctionDecl>();
4737 auto *ThisArg =
Record.readExpr();
4739 if (!
First->OperatorDelete) {
4740 First->OperatorDelete = Del;
4741 First->OperatorDeleteThisArg = ThisArg;
4748 auto ESI =
Record.readExceptionSpecInfo(ExceptionStorage);
4751 auto *FD = cast<FunctionDecl>(
D);
4757 FPT->getReturnType(), FPT->getParamTypes(),
4758 FPT->getExtProtoInfo().withExceptionSpec(ESI)));
4762 Reader.PendingExceptionSpecUpdates.insert(
4763 std::make_pair(FD->getCanonicalDecl(), FD));
4769 auto *FD = cast<FunctionDecl>(
D);
4771 Reader.PendingDeducedTypeUpdates.insert(
4772 {FD->getCanonicalDecl(), DeducedResultType});
4793 readSourceRange()));
4797 auto AllocatorKind =
4798 static_cast<OMPAllocateDeclAttr::AllocatorTypeTy
>(
Record.readInt());
4802 D->
addAttr(OMPAllocateDeclAttr::CreateImplicit(
4803 Reader.
getContext(), AllocatorKind, Allocator, Alignment, SR));
4809 auto *Exported = cast<NamedDecl>(
D);
4812 Reader.PendingMergedDefinitionsToDeduplicate.insert(Exported);
4817 auto MapType =
Record.readEnum<OMPDeclareTargetDeclAttr::MapTypeTy>();
4818 auto DevType =
Record.readEnum<OMPDeclareTargetDeclAttr::DevTypeTy>();
4821 unsigned Level =
Record.readInt();
4822 D->
addAttr(OMPDeclareTargetDeclAttr::CreateImplicit(
4824 readSourceRange()));
4830 Record.readAttributes(Attrs);
4831 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::@1724::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 mergeTemplatePattern(RedeclarableTemplateDecl *D, RedeclarableTemplateDecl *Existing, bool IsKeyDecl)
Merge together the pattern declarations from two template declarations.
ASTDeclMerger(ASTReader &Reader)
void mergeRedeclarable(Redeclarable< T > *D, T *Existing, RedeclarableResult &Redecl)
void mergeLambda(CXXRecordDecl *D, RedeclarableResult &Redecl, Decl &Context, unsigned Number)
Attempt to merge D with a previous declaration of the same lambda, which is found by its index within...
void MergeDefinitionData(CXXRecordDecl *D, struct CXXRecordDecl::DefinitionData &&NewDD)
void mergeRedeclarableImpl(Redeclarable< T > *D, T *Existing, GlobalDeclID KeyDeclID)
Attempts to merge the given declaration (D) with another declaration of the same entity.
void VisitTemplateParamObjectDecl(TemplateParamObjectDecl *D)
void VisitObjCImplementationDecl(ObjCImplementationDecl *D)
void mergeRedeclarableTemplate(RedeclarableTemplateDecl *D, RedeclarableResult &Redecl)
void VisitImportDecl(ImportDecl *D)
void VisitBindingDecl(BindingDecl *BD)
void VisitNamespaceDecl(NamespaceDecl *D)
void VisitTopLevelStmtDecl(TopLevelStmtDecl *D)
RedeclarableResult VisitRedeclarableTemplateDecl(RedeclarableTemplateDecl *D)
void VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D)
void VisitUnresolvedUsingIfExistsDecl(UnresolvedUsingIfExistsDecl *D)
void ReadFunctionDefinition(FunctionDecl *FD)
void VisitLabelDecl(LabelDecl *LD)
void VisitObjCCategoryDecl(ObjCCategoryDecl *D)
void VisitUsingDirectiveDecl(UsingDirectiveDecl *D)
RedeclarableResult VisitClassTemplateSpecializationDeclImpl(ClassTemplateSpecializationDecl *D)
void VisitFunctionDecl(FunctionDecl *FD)
void VisitObjCMethodDecl(ObjCMethodDecl *D)
void VisitUsingShadowDecl(UsingShadowDecl *D)
void VisitVarTemplateSpecializationDecl(VarTemplateSpecializationDecl *D)
void VisitVarDecl(VarDecl *VD)
RedeclarableResult VisitRedeclarable(Redeclarable< T > *D)
void VisitMSGuidDecl(MSGuidDecl *D)
void VisitPragmaCommentDecl(PragmaCommentDecl *D)
void VisitRecordDecl(RecordDecl *RD)
void VisitLifetimeExtendedTemporaryDecl(LifetimeExtendedTemporaryDecl *D)
void VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D)
void VisitRequiresExprBodyDecl(RequiresExprBodyDecl *D)
void ReadVarDeclInit(VarDecl *VD)
static Decl * getMostRecentDeclImpl(Redeclarable< DeclT > *D)
void VisitNamespaceAliasDecl(NamespaceAliasDecl *D)
void VisitIndirectFieldDecl(IndirectFieldDecl *FD)
void VisitObjCContainerDecl(ObjCContainerDecl *D)
void VisitBlockDecl(BlockDecl *BD)
void VisitExportDecl(ExportDecl *D)
static void attachLatestDecl(Decl *D, Decl *latest)
void VisitStaticAssertDecl(StaticAssertDecl *D)
void VisitEmptyDecl(EmptyDecl *D)
void VisitOMPCapturedExprDecl(OMPCapturedExprDecl *D)
void VisitValueDecl(ValueDecl *VD)
void VisitEnumDecl(EnumDecl *ED)
void mergeRedeclarable(Redeclarable< T > *D, RedeclarableResult &Redecl)
Attempts to merge the given declaration (D) with another declaration of the same entity.
void VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D)
void VisitFriendTemplateDecl(FriendTemplateDecl *D)
void VisitObjCProtocolDecl(ObjCProtocolDecl *D)
void VisitClassTemplatePartialSpecializationDecl(ClassTemplatePartialSpecializationDecl *D)
void VisitObjCTypeParamDecl(ObjCTypeParamDecl *D)
void VisitDeclaratorDecl(DeclaratorDecl *DD)
RedeclarableResult VisitTypedefNameDecl(TypedefNameDecl *TD)
void VisitFriendDecl(FriendDecl *D)
void VisitLinkageSpecDecl(LinkageSpecDecl *D)
void VisitCXXRecordDecl(CXXRecordDecl *D)
ASTDeclReader(ASTReader &Reader, ASTRecordReader &Record, ASTReader::RecordLocation Loc, GlobalDeclID thisDeclID, SourceLocation ThisDeclLoc)
void VisitFileScopeAsmDecl(FileScopeAsmDecl *AD)
void VisitImplicitConceptSpecializationDecl(ImplicitConceptSpecializationDecl *D)
void VisitNamedDecl(NamedDecl *ND)
void mergeMergeable(Mergeable< T > *D)
Attempts to merge the given declaration (D) with another declaration of the same entity,...
void VisitBuiltinTemplateDecl(BuiltinTemplateDecl *D)
static Decl * getMostRecentDecl(Decl *D)
void VisitObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *D)
void VisitCXXConstructorDecl(CXXConstructorDecl *D)
void VisitPragmaDetectMismatchDecl(PragmaDetectMismatchDecl *D)
void VisitImplicitParamDecl(ImplicitParamDecl *PD)
void VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D)
static void setNextObjCCategory(ObjCCategoryDecl *Cat, ObjCCategoryDecl *Next)
void VisitMSPropertyDecl(MSPropertyDecl *FD)
void VisitClassTemplateSpecializationDecl(ClassTemplateSpecializationDecl *D)
void VisitFieldDecl(FieldDecl *FD)
RedeclarableResult VisitVarDeclImpl(VarDecl *D)
void VisitOMPDeclareMapperDecl(OMPDeclareMapperDecl *D)
void VisitCapturedDecl(CapturedDecl *CD)
void VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D)
void VisitObjCInterfaceDecl(ObjCInterfaceDecl *D)
RedeclarableResult VisitCXXRecordDeclImpl(CXXRecordDecl *D)
void VisitAccessSpecDecl(AccessSpecDecl *D)
void VisitCXXMethodDecl(CXXMethodDecl *D)
void VisitOMPAllocateDecl(OMPAllocateDecl *D)
void VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D)
static void attachLatestDeclImpl(Redeclarable< DeclT > *D, Decl *Latest)
static void markIncompleteDeclChainImpl(Redeclarable< DeclT > *D)
RedeclarableResult VisitTagDecl(TagDecl *TD)
ObjCTypeParamList * ReadObjCTypeParamList()
void VisitHLSLBufferDecl(HLSLBufferDecl *D)
void VisitOMPThreadPrivateDecl(OMPThreadPrivateDecl *D)
void VisitCXXDeductionGuideDecl(CXXDeductionGuideDecl *GD)
void VisitConstructorUsingShadowDecl(ConstructorUsingShadowDecl *D)
void VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D)
static void checkMultipleDefinitionInNamedModules(ASTReader &Reader, Decl *D, Decl *Previous)
void VisitUsingEnumDecl(UsingEnumDecl *D)
void VisitObjCImplDecl(ObjCImplDecl *D)
void VisitTranslationUnitDecl(TranslationUnitDecl *TU)
void VisitUnnamedGlobalConstantDecl(UnnamedGlobalConstantDecl *D)
void VisitTypeDecl(TypeDecl *TD)
void VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D)
void VisitEnumConstantDecl(EnumConstantDecl *ECD)
void VisitTypeAliasDecl(TypeAliasDecl *TD)
static void attachPreviousDeclImpl(ASTReader &Reader, Redeclarable< DeclT > *D, Decl *Previous, Decl *Canon)
void VisitConceptDecl(ConceptDecl *D)
void VisitObjCPropertyDecl(ObjCPropertyDecl *D)
void VisitObjCIvarDecl(ObjCIvarDecl *D)
void VisitUsingPackDecl(UsingPackDecl *D)
void VisitFunctionTemplateDecl(FunctionTemplateDecl *D)
void VisitOMPDeclareReductionDecl(OMPDeclareReductionDecl *D)
RedeclarableResult VisitVarTemplateSpecializationDeclImpl(VarTemplateSpecializationDecl *D)
TODO: Unify with ClassTemplateSpecializationDecl version? May require unifying ClassTemplate(Partial)...
void VisitUsingDecl(UsingDecl *D)
void VisitObjCAtDefsFieldDecl(ObjCAtDefsFieldDecl *D)
void VisitVarTemplatePartialSpecializationDecl(VarTemplatePartialSpecializationDecl *D)
TODO: Unify with ClassTemplatePartialSpecializationDecl version? May require unifying ClassTemplate(P...
void VisitParmVarDecl(ParmVarDecl *PD)
void VisitVarTemplateDecl(VarTemplateDecl *D)
TODO: Unify with ClassTemplateDecl version? May require unifying ClassTemplateDecl and VarTemplateDec...
static void attachPreviousDecl(ASTReader &Reader, Decl *D, Decl *Previous, Decl *Canon)
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)
RedeclarableResult VisitRecordDeclImpl(RecordDecl *RD)
void VisitDecompositionDecl(DecompositionDecl *DD)
void ReadSpecializations(ModuleFile &M, Decl *D, llvm::BitstreamCursor &DeclsCursor, bool IsPartial)
Reads an AST files chain containing the contents of a translation unit.
bool isDeclIDFromModule(GlobalDeclID ID, ModuleFile &M) const
Returns true if global DeclID ID originated from module M.
DiagnosticBuilder Diag(unsigned DiagID) const
Report a diagnostic.
ASTContext & getContext()
Retrieve the AST context that this AST reader supplements.
Decl * ReadDecl(ModuleFile &F, const RecordDataImpl &R, unsigned &I)
Reads a declaration from the given position in a record in the given module.
ModuleFile * getOwningModuleFile(const Decl *D) const
Retrieve the module file that owns the given declaration, or NULL if the declaration is not from a mo...
T * ReadDeclAs(ModuleFile &F, const RecordDataImpl &R, unsigned &I)
Reads a declaration from the given position in a record in the given module.
SourceLocation ReadSourceLocation(ModuleFile &MF, RawLocEncoding Raw, LocSeq *Seq=nullptr) const
Read a source location from raw form.
LocalDeclID mapGlobalIDToModuleFileGlobalID(ModuleFile &M, GlobalDeclID GlobalID)
Map a global declaration ID into the declaration ID used to refer to this declaration within the give...
QualType GetType(serialization::TypeID ID)
Resolve a type ID into a type, potentially building a new type.
IdentifierResolver & getIdResolver()
Get the identifier resolver used for name lookup / updates in the translation unit scope.
Decl * GetDecl(GlobalDeclID ID)
Resolve a declaration ID into a declaration, potentially building a new declaration.
Module * getSubmodule(serialization::SubmoduleID GlobalID)
Retrieve the submodule that corresponds to a global submodule ID.
void mergeDefinitionVisibility(NamedDecl *Def, NamedDecl *MergedDef)
Note that MergedDef is a redefinition of the canonical definition Def, so Def should be visible whene...
void runWithSufficientStackSpace(SourceLocation Loc, llvm::function_ref< void()> Fn)
SmallVector< uint64_t, 64 > RecordData
An object for streaming information from a record.
bool readBool()
Read a boolean value, advancing Idx.
std::string readString()
Read a string, advancing Idx.
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.
bool shouldEmitInExternalSource() const
Whether the definition of the declaration should be emitted in external sources.
void setVisibleDespiteOwningModule()
Set that this declaration is globally visible, even if it came from a module that is not visible.
The name of a declaration.
Selector getObjCSelector() const
Get the Objective-C selector stored in this declaration name.
Represents a ValueDecl that came out of a declarator.
void setInnerLocStart(SourceLocation L)
void setTypeSourceInfo(TypeSourceInfo *TI)
TypeSourceInfo * getTypeSourceInfo() const
A decomposition declaration.
static DecompositionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumBindings)
Represents an empty-declaration.
static EmptyDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
An instance of this object exists for each enum constant that is defined.
static EnumConstantDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setInitExpr(Expr *E)
void setInitVal(const ASTContext &C, const llvm::APSInt &V)
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this enumeration is an instantiation of a member enumeration of a class template specialization,...
void setFixed(bool Fixed=true)
True if this is an Objective-C, C++11, or Microsoft-style enumeration with a fixed underlying type.
void setIntegerType(QualType T)
Set the underlying integer type.
void setIntegerTypeSourceInfo(TypeSourceInfo *TInfo)
Set the underlying integer type source info.
static EnumDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setScoped(bool Scoped=true)
True if this tag declaration is a scoped enumeration.
void setPromotionType(QualType T)
Set the promotion type.
EnumDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
void setScopedUsingClassTag(bool ScopedUCT=true)
If this tag declaration is a scoped enum, then this is true if the scoped enum was declared using the...
Represents a standard C++ module export declaration.
static ExportDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
This represents one expression.
Represents a member of a struct/union/class.
void setBitWidth(Expr *Width)
Set the bit-field width for this member.
static FieldDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
const VariableArrayType * CapturedVLAType
void setRParenLoc(SourceLocation L)
void setAsmString(StringLiteral *Asm)
static FileScopeAsmDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
FriendDecl - Represents the declaration of a friend entity, which can be a function,...
static FriendDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned FriendTypeNumTPLists)
Declaration of a friend template.
static FriendTemplateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
static DefaultedOrDeletedFunctionInfo * Create(ASTContext &Context, ArrayRef< DeclAccessPair > Lookups, StringLiteral *DeletedMessage=nullptr)
Represents a function declaration or definition.
void setDescribedFunctionTemplate(FunctionTemplateDecl *Template)
FunctionTemplateDecl * getDescribedFunctionTemplate() const
Retrieves the function template that is described by this function declaration.
void setIsPureVirtual(bool P=true)
void setDefaultedOrDeletedInfo(DefaultedOrDeletedFunctionInfo *Info)
void setFriendConstraintRefersToEnclosingTemplate(bool V=true)
void setHasSkippedBody(bool Skipped=true)
static FunctionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setUsesSEHTry(bool UST)
void setIsMultiVersion(bool V=true)
Sets the multiversion state for this declaration and all of its redeclarations.
void setHasWrittenPrototype(bool P=true)
State that this function has a written prototype.
bool isExplicitlyDefaulted() const
Whether this function is explicitly defaulted.
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this function is an instantiation of a member function of a class template specialization,...
FunctionTemplateSpecializationInfo * getTemplateSpecializationInfo() const
If this function is actually a function template specialization, retrieve information about this func...
void setDefaultLoc(SourceLocation NewLoc)
void setInlineSpecified(bool I)
Set whether the "inline" keyword was specified for this function.
TemplatedKind
The kind of templated function a FunctionDecl can be.
@ TK_MemberSpecialization
@ TK_DependentNonTemplate
@ TK_FunctionTemplateSpecialization
@ TK_DependentFunctionTemplateSpecialization
TemplatedKind getTemplatedKind() const
What kind of templated function this is.
void setInstantiatedFromDecl(FunctionDecl *FD)
Specify that this function declaration was instantiated from a FunctionDecl FD.
bool isDeletedAsWritten() const
void setHasInheritedPrototype(bool P=true)
State that this function inherited its prototype from a previous declaration.
void setDependentTemplateSpecialization(ASTContext &Context, const UnresolvedSetImpl &Templates, const TemplateArgumentListInfo *TemplateArgs)
Specifies that this function declaration is actually a dependent function template specialization.
void setVirtualAsWritten(bool V)
State that this function is marked as virtual explicitly.
void setLateTemplateParsed(bool ILT=true)
State that this templated function will be late parsed.
void setImplicitlyInline(bool I=true)
Flag that this function is implicitly inline.
void setTrivialForCall(bool IT)
bool isDefaulted() const
Whether this function is defaulted.
void setIneligibleOrNotSelected(bool II)
void setConstexprKind(ConstexprSpecKind CSK)
void setDefaulted(bool D=true)
void setStorageClass(StorageClass SClass)
Sets the storage class as written in the source.
void setDeletedAsWritten(bool D=true, StringLiteral *Message=nullptr)
void setExplicitlyDefaulted(bool ED=true)
State that this function is explicitly defaulted.
void setHasImplicitReturnZero(bool IRZ)
State that falling off this function implicitly returns null/zero.
Represents a prototype with parameter type info, e.g.
ExceptionSpecificationType getExceptionSpecType() const
Get the kind of exception specification on this function.
Declaration of a template function.
static FunctionTemplateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Create an empty function template node.
Provides information about a function template specialization, which is a FunctionDecl that has been ...
static FunctionTemplateSpecializationInfo * Create(ASTContext &C, FunctionDecl *FD, FunctionTemplateDecl *Template, TemplateSpecializationKind TSK, TemplateArgumentList *TemplateArgs, const TemplateArgumentListInfo *TemplateArgsAsWritten, SourceLocation POI, MemberSpecializationInfo *MSInfo)
void Profile(llvm::FoldingSetNodeID &ID)
FunctionDecl * getFunction() const
Retrieve the declaration of the function template specialization.
FunctionType - C99 6.7.5.3 - Function Declarators.
QualType getReturnType() const
HLSLBufferDecl - Represent a cbuffer or tbuffer declaration.
static HLSLBufferDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
One of these records is kept for each identifier that is lexed.
void setOutOfDate(bool OOD)
Set whether the information for this identifier is out of date with respect to the external source.
bool isOutOfDate() const
Determine whether the information for this identifier is out of date with respect to the external sou...
iterator - Iterate over the decls of a specified declaration name.
IdentifierResolver - Keeps track of shadowed decls on enclosing scopes.
iterator begin(DeclarationName Name)
Returns an iterator over decls with the name 'Name'.
bool tryAddTopLevelDecl(NamedDecl *D, DeclarationName Name)
Try to add the given declaration to the top level scope, if it (or a redeclaration of it) hasn't alre...
iterator end()
Returns the end iterator.
static ImplicitConceptSpecializationDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID, unsigned NumTemplateArgs)
static ImplicitParamDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Describes a module import declaration, which makes the contents of the named module visible in the cu...
static ImportDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumLocations)
Create a new, deserialized module import declaration.
Represents a field injected from an anonymous union/struct into the parent scope.
static IndirectFieldDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setInherited(bool I)
Description of a constructor that was inherited from a base class.
Represents the declaration of a label.
static LabelDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Describes the capture of a variable or of this, or of a C++1y init-capture.
LambdaCaptureKind getCaptureKind() const
Determine the kind of capture.
Implicit declaration of a temporary that was materialized by a MaterializeTemporaryExpr and lifetime-...
unsigned getManglingNumber() const
static LifetimeExtendedTemporaryDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
ValueDecl * getExtendingDecl()
Represents a linkage specification.
static LinkageSpecDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents the results of name lookup.
An instance of this class represents the declaration of a property member.
static MSPropertyDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Provides information a specialization of a member of a class template, which may be a member function...
void setPointOfInstantiation(SourceLocation POI)
Set the first point of instantiation.
Provides common interface for the Decls that cannot be redeclared, but can be merged if the same decl...
Describes a module or submodule.
@ AllVisible
All of the names in this module are visible.
std::string Name
The name of this module.
bool isGlobalModule() const
Does this Module scope describe a fragment of the global module within some C++ module.
@ ModuleMapModule
This is a module that was defined by a module map and built out of header files.
bool isNamedModule() const
Does this Module is a named module of a standard named module?
Module * getTopLevelModule()
Retrieve the top-level module for this (sub)module, which may be this module.
This represents a decl that may have a name.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
bool isPlaceholderVar(const LangOptions &LangOpts) const
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
void setDeclName(DeclarationName N)
Set the name of this declaration.
Represents a C++ namespace alias.
static NamespaceAliasDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represent a C++ namespace.
static NamespaceDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
static NonTypeTemplateParmDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, bool HasTypeConstraint)
This represents '#pragma omp allocate ...' directive.
static OMPAllocateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NVars, unsigned NClauses)
Pseudo declaration for capturing expressions.
static OMPCapturedExprDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
This represents '#pragma omp declare mapper ...' directive.
static OMPDeclareMapperDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned N)
Creates deserialized declare mapper node.
This represents '#pragma omp declare reduction ...' directive.
static OMPDeclareReductionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Create deserialized declare reduction node.
This represents '#pragma omp requires...' directive.
static OMPRequiresDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned N)
Create deserialized requires node.
This represents '#pragma omp threadprivate ...' directive.
static OMPThreadPrivateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned N)
Helper data structure representing the traits in a match clause of an declare variant or metadirectiv...
Represents a field declaration created by an @defs(...).
static ObjCAtDefsFieldDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
ObjCCategoryDecl - Represents a category declaration.
void setProtocolList(ObjCProtocolDecl *const *List, unsigned Num, const SourceLocation *Locs, ASTContext &C)
setProtocolList - Set the list of protocols that this interface implements.
static ObjCCategoryDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setIvarLBraceLoc(SourceLocation Loc)
void setCategoryNameLoc(SourceLocation Loc)
void setIvarRBraceLoc(SourceLocation Loc)
bool IsClassExtension() const
ObjCCategoryImplDecl - An object of this class encapsulates a category @implementation declaration.
static ObjCCategoryImplDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
ObjCCompatibleAliasDecl - Represents alias of a class.
static ObjCCompatibleAliasDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setClassInterface(ObjCInterfaceDecl *D)
ObjCContainerDecl - Represents a container for method declarations.
void setAtStartLoc(SourceLocation Loc)
void setAtEndRange(SourceRange atEnd)
ObjCImplementationDecl - Represents a class definition - this is where method definitions are specifi...
static ObjCImplementationDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents an ObjC class declaration.
void mergeClassExtensionProtocolList(ObjCProtocolDecl *const *List, unsigned Num, ASTContext &C)
mergeClassExtensionProtocolList - Merge class extension's protocol list into the protocol list for th...
ObjCIvarDecl * lookupInstanceVariable(IdentifierInfo *IVarName, ObjCInterfaceDecl *&ClassDeclared)
static ObjCInterfaceDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID)
ObjCInterfaceDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this Objective-C class.
ObjCIvarDecl - Represents an ObjC instance variable.
void setAccessControl(AccessControl ac)
void setNextIvar(ObjCIvarDecl *ivar)
ObjCInterfaceDecl * getContainingInterface()
Return the class interface that this ivar is logically contained in; this is either the interface whe...
void setSynthesize(bool synth)
static ObjCIvarDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
ObjCMethodDecl - Represents an instance or class method declaration.
void setSynthesizedAccessorStub(bool isSynthesizedAccessorStub)
void setObjCDeclQualifier(ObjCDeclQualifier QV)
void setDefined(bool isDefined)
void setSelfDecl(ImplicitParamDecl *SD)
void setReturnTypeSourceInfo(TypeSourceInfo *TInfo)
void setHasRedeclaration(bool HRD) const
void setIsRedeclaration(bool RD)
void setCmdDecl(ImplicitParamDecl *CD)
bool hasRedeclaration() const
True if redeclared in the same interface.
void setRelatedResultType(bool RRT=true)
Note whether this method has a related result type.
void setOverriding(bool IsOver)
void setPropertyAccessor(bool isAccessor)
void setDeclImplementation(ObjCImplementationControl ic)
void setReturnType(QualType T)
static ObjCMethodDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setHasSkippedBody(bool Skipped=true)
void setInstanceMethod(bool isInst)
void setVariadic(bool isVar)
Represents one property declaration in an Objective-C interface.
static ObjCPropertyDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
ObjCPropertyImplDecl - Represents implementation declaration of a property in a class or category imp...
static ObjCPropertyImplDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents an Objective-C protocol declaration.
static ObjCProtocolDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
ObjCProtocolDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this Objective-C protocol.
Represents the declaration of an Objective-C type parameter.
static ObjCTypeParamDecl * CreateDeserialized(ASTContext &ctx, GlobalDeclID ID)
Stores a list of Objective-C type parameters for a parameterized class or a category/extension thereo...
static ObjCTypeParamList * create(ASTContext &ctx, SourceLocation lAngleLoc, ArrayRef< ObjCTypeParamDecl * > typeParams, SourceLocation rAngleLoc)
Create a new Objective-C type parameter list.
Represents a parameter to a function.
static ParmVarDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setUninstantiatedDefaultArg(Expr *arg)
void setScopeInfo(unsigned scopeDepth, unsigned parameterIndex)
void setObjCMethodScopeInfo(unsigned parameterIndex)
Represents a #pragma detect_mismatch line.
static PragmaDetectMismatchDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NameValueSize)
A (possibly-)qualified type.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
const Type * getTypePtrOrNull() const
Represents a struct/union/class.
unsigned getODRHash()
Get precomputed ODRHash or add a new one.
void setAnonymousStructOrUnion(bool Anon)
void setArgPassingRestrictions(RecordArgPassingKind Kind)
void setNonTrivialToPrimitiveCopy(bool V)
void setHasNonTrivialToPrimitiveCopyCUnion(bool V)
void setHasNonTrivialToPrimitiveDestructCUnion(bool V)
void setHasFlexibleArrayMember(bool V)
void setParamDestroyedInCallee(bool V)
void setNonTrivialToPrimitiveDestroy(bool V)
void setHasObjectMember(bool val)
void setHasVolatileMember(bool val)
void setHasNonTrivialToPrimitiveDefaultInitializeCUnion(bool V)
static RecordDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID)
void setNonTrivialToPrimitiveDefaultInitialize(bool V)
Declaration of a redeclarable template.
CommonBase * Common
Pointer to the common data shared by all declarations of this template.
virtual CommonBase * newCommon(ASTContext &C) const =0
Provides common interface for the Decls that can be redeclared.
decl_type * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
bool isFirstDecl() const
True if this is the first declaration in its redeclaration chain.
static DeclLink PreviousDeclLink(decl_type *D)
Represents the body of a requires-expression.
static RequiresExprBodyDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
const FunctionDecl * getKernelEntryPointDecl() const
Encodes a location in the source.
A trivial tuple used to represent a source range.
Represents a C++11 static_assert declaration.
static StaticAssertDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
StringLiteral - This represents a string literal expression, e.g.
Represents the declaration of a struct/union/class/enum.
void setTagKind(TagKind TK)
void setCompleteDefinitionRequired(bool V=true)
True if this complete decl is required to be complete for some existing use.
void demoteThisDefinitionToDeclaration()
Mark a definition as a declaration and maintain information it was a definition.
bool isThisDeclarationADefinition() const
Return true if this declaration is a completion definition of the type.
void setEmbeddedInDeclarator(bool isInDeclarator)
True if this tag declaration is "embedded" (i.e., defined or declared for the very first time) in the...
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
TagDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
void setFreeStanding(bool isFreeStanding=true)
True if this tag is free standing, e.g. "struct foo;".
void setBraceRange(SourceRange R)
void setCompleteDefinition(bool V=true)
True if this decl has its body fully specified.
A convenient class for passing around template argument information.
A template argument list.
static TemplateArgumentList * CreateCopy(ASTContext &Context, ArrayRef< TemplateArgument > Args)
Create a new template argument list that copies the given set of template arguments.
The base class of all kinds of template declarations (e.g., class, function, etc.).
NamedDecl * getTemplatedDecl() const
Get the underlying, templated declaration.
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
A template parameter object.
Stores a list of template parameters for a TemplateDecl and its derived classes.
TemplateTemplateParmDecl - Declares a template template parameter, e.g., "T" in.
static TemplateTemplateParmDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Declaration of a template type parameter.
static TemplateTypeParmDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID)
A declaration that models statements at global scope.
static TopLevelStmtDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
The top declaration context.
Represents the declaration of a typedef-name via a C++11 alias-declaration.
static TypeAliasDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setDescribedAliasTemplate(TypeAliasTemplateDecl *TAT)
Declaration of an alias template.
static TypeAliasTemplateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Create an empty alias template node.
Represents a declaration of a type.
void setLocStart(SourceLocation L)
A container of type source information.
QualType getType() const
Return the type wrapped by this type source info.
const T * castAs() const
Member-template castAs<specific type>.
AutoType * getContainedAutoType() const
Get the AutoType whose type will be deduced for a variable with an initializer of this type.
DeducedType * getContainedDeducedType() const
Get the DeducedType whose type will be deduced for a variable with an initializer of this type.
const T * getAs() const
Member-template getAs<specific type>'.
Represents the declaration of a typedef-name via the 'typedef' type specifier.
static TypedefDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Base class for declarations which introduce a typedef-name.
void setModedTypeSourceInfo(TypeSourceInfo *unmodedTSI, QualType modedTy)
void setTypeSourceInfo(TypeSourceInfo *newType)
An artificial decl, representing a global anonymous constant value which is uniquified by value withi...
void addDecl(NamedDecl *D)
A set of unresolved declarations.
This node is generated when a using-declaration that was annotated with attribute((using_if_exists)) ...
static UnresolvedUsingIfExistsDecl * CreateDeserialized(ASTContext &Ctx, GlobalDeclID ID)
Represents a dependent using declaration which was marked with typename.
static UnresolvedUsingTypenameDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a dependent using declaration which was not marked with typename.
static UnresolvedUsingValueDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a C++ using-declaration.
static UsingDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents C++ using-directive.
static UsingDirectiveDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a C++ using-enum-declaration.
static UsingEnumDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a pack of using declarations that a single using-declarator pack-expanded into.
static UsingPackDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumExpansions)
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
static UsingShadowDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
void setType(QualType newType)
Represents a variable declaration or definition.
ParmVarDeclBitfields ParmVarDeclBits
static VarDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
VarDeclBitfields VarDeclBits
EvaluatedStmt * ensureEvaluatedStmt() const
Convert the initializer for this declaration to the elaborated EvaluatedStmt form,...
NonParmVarDeclBitfields NonParmVarDeclBits
@ Definition
This declaration is definitely a definition.
void setDescribedVarTemplate(VarTemplateDecl *Template)
StorageClass getStorageClass() const
Returns the storage class as written in the source.
Declaration of a variable template.
static VarTemplateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Create an empty variable template node.
static VarTemplatePartialSpecializationDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a variable template specialization, which refers to a variable template with a given set o...
static VarTemplateSpecializationDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Source location and bit offset of a declaration.
RawLocEncoding getRawLoc() const
uint64_t getBitOffset(const uint64_t DeclTypesBlockStartOffset) const
Information about a module that has been loaded by the ASTReader.
const serialization::ObjCCategoriesInfo * ObjCCategoriesMap
Array of category list location information within this module file, sorted by the definition ID.
unsigned LocalNumObjCCategoriesInMap
The number of redeclaration info entries in ObjCCategoriesMap.
llvm::BitstreamCursor DeclsCursor
DeclsCursor - This is a cursor to the start of the DECLTYPES_BLOCK block.
uint64_t GlobalBitOffset
The global bit offset (or base) of this module.
const DeclOffset * DeclOffsets
Offset of each declaration within the bitstream, indexed by the declaration ID (-1).
unsigned Generation
The generation of which this module file is a part.
uint64_t DeclsBlockStartOffset
The offset to the start of the DECLTYPES_BLOCK block.
SmallVector< uint64_t, 1 > ObjCCategories
The Objective-C category lists for categories known to this module.
void visit(llvm::function_ref< bool(ModuleFile &M)> Visitor, llvm::SmallPtrSetImpl< ModuleFile * > *ModuleFilesHit=nullptr)
Visit each of the modules.
Class that performs name lookup into a DeclContext stored in an AST file.
const unsigned int LOCAL_REDECLARATIONS
Record code for a list of local redeclarations of a declaration.
DeclCode
Record codes for each kind of declaration.
const unsigned int DECL_UPDATES
Record of updates for a declaration that was modified after being deserialized.
@ DECL_EMPTY
An EmptyDecl record.
@ DECL_CAPTURED
A CapturedDecl record.
@ DECL_CXX_BASE_SPECIFIERS
A record containing CXXBaseSpecifiers.
@ DECL_CXX_RECORD
A CXXRecordDecl record.
@ DECL_VAR_TEMPLATE_PARTIAL_SPECIALIZATION
A VarTemplatePartialSpecializationDecl record.
@ DECL_OMP_ALLOCATE
An OMPAllocateDcl record.
@ DECL_MS_PROPERTY
A MSPropertyDecl record.
@ DECL_OMP_DECLARE_MAPPER
An OMPDeclareMapperDecl record.
@ DECL_TOP_LEVEL_STMT_DECL
A TopLevelStmtDecl record.
@ DECL_REQUIRES_EXPR_BODY
A RequiresExprBodyDecl record.
@ DECL_STATIC_ASSERT
A StaticAssertDecl record.
@ DECL_INDIRECTFIELD
A IndirectFieldDecl record.
@ DECL_TEMPLATE_TEMPLATE_PARM
A TemplateTemplateParmDecl record.
@ DECL_IMPORT
An ImportDecl recording a module import.
@ DECL_UNNAMED_GLOBAL_CONSTANT
A UnnamedGlobalConstantDecl record.
@ DECL_ACCESS_SPEC
An AccessSpecDecl record.
@ DECL_OBJC_TYPE_PARAM
An ObjCTypeParamDecl record.
@ DECL_OBJC_CATEGORY_IMPL
A ObjCCategoryImplDecl record.
@ DECL_ENUM_CONSTANT
An EnumConstantDecl record.
@ DECL_PARM_VAR
A ParmVarDecl record.
@ DECL_TYPEDEF
A TypedefDecl record.
@ DECL_EXPANDED_TEMPLATE_TEMPLATE_PARM_PACK
A TemplateTemplateParmDecl record that stores an expanded template template parameter pack.
@ DECL_HLSL_BUFFER
A HLSLBufferDecl record.
@ DECL_NAMESPACE_ALIAS
A NamespaceAliasDecl record.
@ DECL_TYPEALIAS
A TypeAliasDecl record.
@ DECL_FUNCTION_TEMPLATE
A FunctionTemplateDecl record.
@ DECL_MS_GUID
A MSGuidDecl record.
@ DECL_UNRESOLVED_USING_TYPENAME
An UnresolvedUsingTypenameDecl record.
@ DECL_CLASS_TEMPLATE_SPECIALIZATION
A ClassTemplateSpecializationDecl record.
@ DECL_FILE_SCOPE_ASM
A FileScopeAsmDecl record.
@ DECL_PARTIAL_SPECIALIZATIONS
@ DECL_CXX_CONSTRUCTOR
A CXXConstructorDecl record.
@ DECL_CXX_CONVERSION
A CXXConversionDecl record.
@ DECL_FIELD
A FieldDecl record.
@ DECL_LINKAGE_SPEC
A LinkageSpecDecl record.
@ DECL_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_IMPLICIT_MEMBER
@ UPD_DECL_MARKED_OPENMP_DECLARETARGET
@ UPD_CXX_POINT_OF_INSTANTIATION
@ UPD_CXX_RESOLVED_EXCEPTION_SPEC
@ UPD_CXX_ADDED_FUNCTION_DEFINITION
@ UPD_DECL_MARKED_OPENMP_THREADPRIVATE
@ UPD_STATIC_LOCAL_NUMBER
@ UPD_CXX_INSTANTIATED_DEFAULT_ARGUMENT
@ UPD_ADDED_ATTR_TO_RECORD
@ UPD_DECL_MARKED_OPENMP_ALLOCATE
@ UPD_CXX_ADDED_ANONYMOUS_NAMESPACE
@ UPD_CXX_INSTANTIATED_CLASS_DEFINITION
@ UPD_CXX_ADDED_VAR_DEFINITION
The JSON file list parser is used to communicate input to InstallAPI.
SelectorLocationsKind
Whether all locations of the selector identifiers are in a "standard" position.
bool isUnresolvedExceptionSpec(ExceptionSpecificationType ESpecType)
ConstexprSpecKind
Define the kind of constexpr specifier.
LinkageSpecLanguageIDs
Represents the language in a linkage specification.
LazyOffsetPtr< Stmt, uint64_t, &ExternalASTSource::GetExternalDeclStmt > LazyDeclStmtPtr
A lazy pointer to a statement.
LambdaCaptureKind
The different capture forms in a lambda introducer.
@ LCK_ByCopy
Capturing by copy (a.k.a., by value)
@ LCK_ByRef
Capturing by reference.
@ LCK_VLAType
Capturing variable-length array type.
@ LCK_StarThis
Capturing the *this object by copy.
@ LCK_This
Capturing the *this object by reference.
OMPDeclareReductionInitKind
StorageClass
Storage classes.
Linkage
Describes the different kinds of linkage (C++ [basic.link], C99 6.2.2) that an entity may have.
@ None
No linkage, which means that the entity is unique and can only be referred to from within its scope.
@ Result
The result type of a method or function.
TagTypeKind
The kind of a tag type.
ObjCImplementationControl
RecordArgPassingKind
Enum that represents the different ways arguments are passed to and returned from function calls.
static bool isUndeducedReturnType(QualType T)
bool operator!=(CanQual< T > x, CanQual< U > y)
for(const auto &A :T->param_types())
const FunctionProtoType * T
DeductionCandidate
Only used by CXXDeductionGuideDecl.
bool shouldSkipCheckingODR(const Decl *D)
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
@ Interface
The "__interface" keyword introduces the elaborated-type-specifier.
@ Class
The "class" keyword introduces the elaborated-type-specifier.
@ Other
Other implicit parameter.
AccessSpecifier
A C++ access specifier (public, private, protected), plus the special value "none" which means differ...
Structure used to store a statement, the constant value to which it was evaluated (if any),...
bool HasConstantDestruction
Whether this variable is known to have constant destruction.
bool WasEvaluated
Whether this statement was already evaluated.
bool HasConstantInitialization
Whether this variable is known to have constant initialization.
Provides information about an explicit instantiation of a variable or class template.
SourceLocation ExternKeywordLoc
The location of the extern keyword.
Data that is common to all of the declarations of a given function template.
llvm::FoldingSetVector< FunctionTemplateSpecializationInfo > Specializations
The function template specializations for this function template, including explicit specializations ...
A struct with extended info about a syntactic name qualifier, to be used for the case of out-of-line ...
Helper class that saves the current stream position and then restores it when destroyed.
llvm::DenseSet< std::tuple< Decl *, Decl *, int > > NonEquivalentDeclSet
Store declaration pairs already found to be non-equivalent.
Describes the categories of an Objective-C class.