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);
462template <
typename DeclT>
class MergedRedeclIterator {
463 DeclT *Start =
nullptr;
464 DeclT *Canonical =
nullptr;
465 DeclT *Current =
nullptr;
468 MergedRedeclIterator() =
default;
469 MergedRedeclIterator(DeclT *Start) : Start(Start), Current(Start) {}
473 MergedRedeclIterator &operator++() {
474 if (Current->isFirstDecl()) {
476 Current = Current->getMostRecentDecl();
478 Current = Current->getPreviousDecl();
484 if (Current == Start || Current == Canonical)
489 friend bool operator!=(
const MergedRedeclIterator &A,
490 const MergedRedeclIterator &B) {
491 return A.Current != B.Current;
497template <
typename DeclT>
498static llvm::iterator_range<MergedRedeclIterator<DeclT>>
500 return llvm::make_range(MergedRedeclIterator<DeclT>(
D),
501 MergedRedeclIterator<DeclT>());
504uint64_t ASTDeclReader::GetCurrentCursorOffset() {
505 return Loc.F->DeclsCursor.GetCurrentBitNo() + Loc.F->GlobalBitOffset;
510 Reader.DefinitionSource[FD] =
511 Loc.F->Kind == ModuleKind::MK_MainFile ||
514 if (
auto *CD = dyn_cast<CXXConstructorDecl>(FD)) {
515 CD->setNumCtorInitializers(
Record.readInt());
516 if (CD->getNumCtorInitializers())
517 CD->CtorInitializers = ReadGlobalOffset();
520 Reader.PendingBodies[FD] = GetCurrentCursorOffset();
529 IsDeclMarkedUsed =
false;
531 if (
auto *DD = dyn_cast<DeclaratorDecl>(
D)) {
532 if (
auto *TInfo = DD->getTypeSourceInfo())
533 Record.readTypeLoc(TInfo->getTypeLoc());
536 if (
auto *TD = dyn_cast<TypeDecl>(
D)) {
542 if (NamedDeclForTagDecl.
isValid())
543 cast<TagDecl>(
D)->TypedefNameDeclOrQualifier =
544 cast<TypedefNameDecl>(Reader.
GetDecl(NamedDeclForTagDecl));
545 }
else if (
auto *ID = dyn_cast<ObjCInterfaceDecl>(
D)) {
548 }
else if (
auto *FD = dyn_cast<FunctionDecl>(
D)) {
552 }
else if (
auto *VD = dyn_cast<VarDecl>(
D)) {
554 }
else if (
auto *FD = dyn_cast<FieldDecl>(
D)) {
555 if (FD->hasInClassInitializer() &&
Record.readInt()) {
556 FD->setLazyInClassInitializer(
LazyDeclStmtPtr(GetCurrentCursorOffset()));
563 auto ModuleOwnership =
567 IsDeclMarkedUsed |=
D->Used;
570 bool HasStandaloneLexicalDC = DeclBits.
getNextBit();
577 isa<ParmVarDecl, ObjCTypeParamDecl>(
D)) {
584 GlobalDeclID SemaDCIDForTemplateParmDecl = readDeclID();
587 if (LexicalDCIDForTemplateParmDecl.
isInvalid())
588 LexicalDCIDForTemplateParmDecl = SemaDCIDForTemplateParmDecl;
589 Reader.addPendingDeclContextInfo(
D,
590 SemaDCIDForTemplateParmDecl,
591 LexicalDCIDForTemplateParmDecl);
594 auto *SemaDC = readDeclAs<DeclContext>();
596 HasStandaloneLexicalDC ? readDeclAs<DeclContext>() :
nullptr;
602 if (
auto *RD = dyn_cast<CXXRecordDecl>(SemaDC))
603 MergedSemaDC = getOrFakePrimaryClassDefinition(Reader, RD);
605 MergedSemaDC = Reader.MergedDeclContexts.lookup(SemaDC);
608 D->setDeclContextsImpl(MergedSemaDC ? MergedSemaDC : SemaDC, LexicalDC,
615 Record.readAttributes(Attrs);
626 switch (ModuleOwnership) {
652 Reader.HiddenNamesMap[Owner].push_back(
D);
654 }
else if (ModulePrivate) {
663 std::string Arg = readString();
664 memcpy(
D->getTrailingObjects<
char>(), Arg.data(), Arg.size());
665 D->getTrailingObjects<
char>()[Arg.size()] =
'\0';
671 std::string Name = readString();
672 memcpy(
D->getTrailingObjects<
char>(), Name.data(), Name.size());
673 D->getTrailingObjects<
char>()[Name.size()] =
'\0';
675 D->ValueStart = Name.size() + 1;
676 std::string
Value = readString();
677 memcpy(
D->getTrailingObjects<
char>() +
D->ValueStart,
Value.data(),
679 D->getTrailingObjects<
char>()[
D->ValueStart +
Value.size()] =
'\0';
683 llvm_unreachable(
"Translation units are not serialized");
689 AnonymousDeclNumber =
Record.readInt();
696 DeferredTypeID =
Record.getGlobalTypeID(
Record.readInt());
723 if (
auto *Template = readDeclAs<TypeAliasTemplateDecl>())
750 Record.readQualifierInfo(*Info);
751 TD->TypedefNameDeclOrQualifier = Info;
755 NamedDeclForTagDecl = readDeclID();
756 TypedefNameForLinkage =
Record.readIdentifier();
759 llvm_unreachable(
"unexpected tag info kind");
762 if (!isa<CXXRecordDecl>(TD))
776 ED->setNumPositiveBits(EnumDeclBits.
getNextBits(8));
777 ED->setNumNegativeBits(EnumDeclBits.
getNextBits(8));
782 ED->setHasODRHash(
true);
783 ED->ODRHash =
Record.readInt();
800 Reader.MergedDeclContexts.insert(std::make_pair(ED, OldDef));
807 Reader.PendingEnumOdrMergeFailures[OldDef].push_back(ED);
813 if (
auto *InstED = readDeclAs<EnumDecl>()) {
816 ED->setInstantiationOfMemberEnum(Reader.
getContext(), InstED, TSK);
844 RD->setODRHash(
Record.readInt());
850 RecordDecl *&OldDef = Reader.RecordDefinitions[Canon];
862 Reader.MergedDeclContexts.insert(std::make_pair(RD, OldDef));
866 Reader.PendingRecordOdrMergeFailures[OldDef].push_back(RD);
878 if (isa<FunctionDecl, VarDecl>(VD))
879 DeferredTypeID =
Record.getGlobalTypeID(
Record.readInt());
896 auto *Info =
new (Reader.
getContext()) DeclaratorDecl::ExtInfo();
897 Record.readQualifierInfo(*Info);
898 Info->TrailingRequiresClause =
Record.readExpr();
903 TSIType.
isNull() ? nullptr
919 auto *Template = readDeclAs<FunctionTemplateDecl>();
925 auto *InstFD = readDeclAs<FunctionDecl>();
928 FD->setInstantiationOfMemberFunction(Reader.
getContext(), InstFD, TSK);
933 auto *Template = readDeclAs<FunctionTemplateDecl>();
938 Record.readTemplateArgumentList(TemplArgs,
true);
942 bool HasTemplateArgumentsAsWritten =
Record.readBool();
943 if (HasTemplateArgumentsAsWritten)
944 Record.readTemplateArgumentListInfo(TemplArgsWritten);
954 auto *FD = readDeclAs<FunctionDecl>();
964 C, FD, Template, TSK, TemplArgList,
965 HasTemplateArgumentsAsWritten ? &TemplArgsWritten :
nullptr, POI,
967 FD->TemplateOrSpecialization = FTInfo;
972 auto *CanonTemplate = readDeclAs<FunctionTemplateDecl>();
978 llvm::FoldingSetNodeID ID;
980 void *InsertPos =
nullptr;
988 "already deserialized this template specialization");
997 unsigned NumCandidates =
Record.readInt();
998 while (NumCandidates--)
999 Candidates.
addDecl(readDeclAs<NamedDecl>());
1003 bool HasTemplateArgumentsAsWritten =
Record.readBool();
1004 if (HasTemplateArgumentsAsWritten)
1005 Record.readTemplateArgumentListInfo(TemplArgsWritten);
1009 HasTemplateArgumentsAsWritten ? &TemplArgsWritten :
nullptr);
1028 Reader.PendingDeducedFunctionTypes.push_back({FD, DeferredTypeID});
1050 const bool Pure = FunctionDeclBits.
getNextBit();
1068 FD->EndRangeLoc = readSourceLocation();
1072 FD->ODRHash =
Record.readInt();
1073 FD->setHasODRHash(
true);
1079 if (
auto Info =
Record.readInt()) {
1080 bool HasMessage = Info & 2;
1082 HasMessage ? cast<StringLiteral>(
Record.readExpr()) :
nullptr;
1084 unsigned NumLookups =
Record.readInt();
1086 for (
unsigned I = 0; I != NumLookups; ++I) {
1094 Reader.
getContext(), Lookups, DeletedMessage));
1105 auto merge = [
this, &Redecl, FD](
auto &&F) {
1106 auto *Existing = cast_or_null<FunctionDecl>(Redecl.getKnownMergeTarget());
1107 RedeclarableResult NewRedecl(Existing ? F(Existing) :
nullptr,
1108 Redecl.getFirstID(), Redecl.isKeyDecl());
1126 unsigned NumParams =
Record.readInt();
1128 Params.reserve(NumParams);
1129 for (
unsigned I = 0; I != NumParams; ++I)
1130 Params.push_back(readDeclAs<ParmVarDecl>());
1136 if (FD->
hasAttr<SYCLKernelEntryPointAttr>()) {
1138 C.registerSYCLEntryPointFunction(FD);
1147 Reader.PendingBodies[MD] = GetCurrentCursorOffset();
1150 MD->
setCmdDecl(readDeclAs<ImplicitParamDecl>());
1163 readDeclAs<ObjCMethodDecl>());
1171 MD->DeclEndLoc = readSourceLocation();
1172 unsigned NumParams =
Record.readInt();
1174 Params.reserve(NumParams);
1175 for (
unsigned I = 0; I != NumParams; ++I)
1176 Params.push_back(readDeclAs<ParmVarDecl>());
1179 unsigned NumStoredSelLocs =
Record.readInt();
1181 SelLocs.reserve(NumStoredSelLocs);
1182 for (
unsigned i = 0; i != NumStoredSelLocs; ++i)
1183 SelLocs.push_back(readSourceLocation());
1185 MD->setParamsAndSelLocs(Reader.
getContext(), Params, SelLocs);
1191 D->Variance =
Record.readInt();
1193 D->VarianceLoc = readSourceLocation();
1194 D->ColonLoc = readSourceLocation();
1204 unsigned numParams =
Record.readInt();
1209 typeParams.reserve(numParams);
1210 for (
unsigned i = 0; i != numParams; ++i) {
1211 auto *typeParam = readDeclAs<ObjCTypeParamDecl>();
1215 typeParams.push_back(typeParam);
1222 typeParams, rAngleLoc);
1225void ASTDeclReader::ReadObjCDefinitionData(
1226 struct ObjCInterfaceDecl::DefinitionData &
Data) {
1228 Data.SuperClassTInfo = readTypeSourceInfo();
1230 Data.EndLoc = readSourceLocation();
1231 Data.HasDesignatedInitializers =
Record.readInt();
1233 Data.HasODRHash =
true;
1236 unsigned NumProtocols =
Record.readInt();
1238 Protocols.reserve(NumProtocols);
1239 for (
unsigned I = 0; I != NumProtocols; ++I)
1240 Protocols.push_back(readDeclAs<ObjCProtocolDecl>());
1242 ProtoLocs.reserve(NumProtocols);
1243 for (
unsigned I = 0; I != NumProtocols; ++I)
1244 ProtoLocs.push_back(readSourceLocation());
1245 Data.ReferencedProtocols.set(Protocols.data(), NumProtocols, ProtoLocs.data(),
1249 NumProtocols =
Record.readInt();
1251 Protocols.reserve(NumProtocols);
1252 for (
unsigned I = 0; I != NumProtocols; ++I)
1253 Protocols.push_back(readDeclAs<ObjCProtocolDecl>());
1254 Data.AllReferencedProtocols.set(Protocols.data(), NumProtocols,
1260 struct ObjCInterfaceDecl::DefinitionData &DD =
D->data();
1261 if (DD.Definition == NewDD.Definition)
1264 Reader.MergedDeclContexts.insert(
1265 std::make_pair(NewDD.Definition, DD.Definition));
1268 if (
D->getODRHash() != NewDD.ODRHash)
1269 Reader.PendingObjCInterfaceOdrMergeFailures[DD.Definition].push_back(
1270 {NewDD.Definition, &NewDD});
1276 DeferredTypeID =
Record.getGlobalTypeID(
Record.readInt());
1282 ID->allocateDefinitionData();
1284 ReadObjCDefinitionData(
ID->data());
1286 if (Canon->Data.getPointer()) {
1290 ID->Data = Canon->Data;
1294 ID->getCanonicalDecl()->Data =
ID->Data;
1297 ID->setIvarList(
nullptr);
1301 Reader.PendingDefinitions.insert(
ID);
1304 Reader.ObjCClassesLoaded.push_back(
ID);
1306 ID->Data =
ID->getCanonicalDecl()->Data;
1315 bool synth =
Record.readInt();
1330 if (PrevIvar && PrevIvar != IVD) {
1331 auto *ParentExt = dyn_cast<ObjCCategoryDecl>(IVD->
getDeclContext());
1332 auto *PrevParentExt =
1334 if (ParentExt && PrevParentExt) {
1338 .PendingObjCExtensionIvarRedeclarations[std::make_pair(ParentExt,
1340 .push_back(std::make_pair(IVD, PrevIvar));
1341 }
else if (ParentExt || PrevParentExt) {
1352void ASTDeclReader::ReadObjCDefinitionData(
1353 struct ObjCProtocolDecl::DefinitionData &
Data) {
1354 unsigned NumProtoRefs =
Record.readInt();
1356 ProtoRefs.reserve(NumProtoRefs);
1357 for (
unsigned I = 0; I != NumProtoRefs; ++I)
1358 ProtoRefs.push_back(readDeclAs<ObjCProtocolDecl>());
1360 ProtoLocs.reserve(NumProtoRefs);
1361 for (
unsigned I = 0; I != NumProtoRefs; ++I)
1362 ProtoLocs.push_back(readSourceLocation());
1363 Data.ReferencedProtocols.set(ProtoRefs.data(), NumProtoRefs,
1366 Data.HasODRHash =
true;
1371 struct ObjCProtocolDecl::DefinitionData &DD =
D->data();
1372 if (DD.Definition == NewDD.Definition)
1375 Reader.MergedDeclContexts.insert(
1376 std::make_pair(NewDD.Definition, DD.Definition));
1379 if (
D->getODRHash() != NewDD.ODRHash)
1380 Reader.PendingObjCProtocolOdrMergeFailures[DD.Definition].push_back(
1381 {NewDD.Definition, &NewDD});
1391 PD->allocateDefinitionData();
1393 ReadObjCDefinitionData(PD->data());
1396 if (Canon->Data.getPointer()) {
1400 PD->Data = Canon->Data;
1407 Reader.PendingDefinitions.insert(PD);
1426 Reader.CategoriesDeserialized.insert(CD);
1428 CD->ClassInterface = readDeclAs<ObjCInterfaceDecl>();
1430 unsigned NumProtoRefs =
Record.readInt();
1432 ProtoRefs.reserve(NumProtoRefs);
1433 for (
unsigned I = 0; I != NumProtoRefs; ++I)
1434 ProtoRefs.push_back(readDeclAs<ObjCProtocolDecl>());
1436 ProtoLocs.reserve(NumProtoRefs);
1437 for (
unsigned I = 0; I != NumProtoRefs; ++I)
1438 ProtoLocs.push_back(readSourceLocation());
1456 D->setAtLoc(readSourceLocation());
1457 D->setLParenLoc(readSourceLocation());
1462 D->setPropertyAttributesAsWritten(
1464 D->setPropertyImplementation(
1472 D->setGetterMethodDecl(readDeclAs<ObjCMethodDecl>());
1473 D->setSetterMethodDecl(readDeclAs<ObjCMethodDecl>());
1474 D->setPropertyIvarDecl(readDeclAs<ObjCIvarDecl>());
1479 D->setClassInterface(readDeclAs<ObjCInterfaceDecl>());
1484 D->CategoryNameLoc = readSourceLocation();
1489 D->setSuperClass(readDeclAs<ObjCInterfaceDecl>());
1490 D->SuperLoc = readSourceLocation();
1491 D->setIvarLBraceLoc(readSourceLocation());
1492 D->setIvarRBraceLoc(readSourceLocation());
1493 D->setHasNonZeroConstructors(
Record.readInt());
1494 D->setHasDestructors(
Record.readInt());
1495 D->NumIvarInitializers =
Record.readInt();
1496 if (
D->NumIvarInitializers)
1497 D->IvarInitializers = ReadGlobalOffset();
1502 D->setAtLoc(readSourceLocation());
1503 D->setPropertyDecl(readDeclAs<ObjCPropertyDecl>());
1504 D->PropertyIvarDecl = readDeclAs<ObjCIvarDecl>();
1505 D->IvarLoc = readSourceLocation();
1506 D->setGetterMethodDecl(readDeclAs<ObjCMethodDecl>());
1507 D->setSetterMethodDecl(readDeclAs<ObjCMethodDecl>());
1508 D->setGetterCXXConstructor(
Record.readExpr());
1509 D->setSetterCXXAssignment(
Record.readExpr());
1514 FD->Mutable =
Record.readInt();
1516 unsigned Bits =
Record.readInt();
1517 FD->StorageKind = Bits >> 1;
1518 if (FD->StorageKind == FieldDecl::ISK_CapturedVLAType)
1520 cast<VariableArrayType>(
Record.readType().getTypePtr());
1526 if (
auto *Tmpl = readDeclAs<FieldDecl>())
1534 PD->GetterId =
Record.readIdentifier();
1535 PD->SetterId =
Record.readIdentifier();
1540 D->PartVal.Part1 =
Record.readInt();
1541 D->PartVal.Part2 =
Record.readInt();
1542 D->PartVal.Part3 =
Record.readInt();
1543 for (
auto &
C :
D->PartVal.Part4And5)
1554 D->Value =
Record.readAPValue();
1558 Reader.
getContext().UnnamedGlobalConstantDecls.GetOrInsertNode(
D))
1564 D->Value =
Record.readAPValue();
1569 Reader.
getContext().TemplateParamObjectDecls.GetOrInsertNode(
D))
1576 FD->ChainingSize =
Record.readInt();
1577 assert(FD->ChainingSize >= 2 &&
"Anonymous chaining must be >= 2");
1580 for (
unsigned I = 0; I != FD->ChainingSize; ++I)
1581 FD->Chaining[I] = readDeclAs<NamedDecl>();
1592 bool DefGeneratedInModule = VarDeclBits.
getNextBit();
1597 bool HasDeducedType =
false;
1598 if (!isa<ParmVarDecl>(VD)) {
1624 Reader.PendingDeducedVarTypes.push_back({VD, DeferredTypeID});
1636 if (DefGeneratedInModule) {
1637 Reader.DefinitionSource[VD] =
1638 Loc.F->Kind == ModuleKind::MK_MainFile ||
1642 if (VD->
hasAttr<BlocksAttr>()) {
1649 VarNotTemplate = 0, VarTemplate, StaticDataMemberSpecialization
1651 switch ((VarKind)
Record.readInt()) {
1652 case VarNotTemplate:
1655 if (!isa<ParmVarDecl>(VD) && !isa<ImplicitParamDecl>(VD) &&
1656 !isa<VarTemplateSpecializationDecl>(VD))
1663 case StaticDataMemberSpecialization: {
1664 auto *Tmpl = readDeclAs<VarDecl>();
1677 if (uint64_t Val =
Record.readInt()) {
1691 Eval->
Value = GetCurrentCursorOffset();
1702 unsigned scopeIndex =
Record.readInt();
1704 unsigned isObjCMethodParam = ParmVarDeclBits.
getNextBit();
1705 unsigned scopeDepth = ParmVarDeclBits.
getNextBits(7);
1706 unsigned declQualifier = ParmVarDeclBits.
getNextBits(7);
1707 if (isObjCMethodParam) {
1708 assert(scopeDepth == 0);
1721 PD->ExplicitObjectParameterIntroducerLoc =
Record.readSourceLocation();
1729 auto **BDs = DD->getTrailingObjects<
BindingDecl *>();
1730 for (
unsigned I = 0; I != DD->NumBindings; ++I) {
1731 BDs[I] = readDeclAs<BindingDecl>();
1732 BDs[I]->setDecomposedDecl(DD);
1738 BD->Binding =
Record.readExpr();
1749 D->Statement =
Record.readStmt();
1756 unsigned NumParams =
Record.readInt();
1758 Params.reserve(NumParams);
1759 for (
unsigned I = 0; I != NumParams; ++I)
1760 Params.push_back(readDeclAs<ParmVarDecl>());
1769 bool capturesCXXThis =
Record.readInt();
1770 unsigned numCaptures =
Record.readInt();
1772 captures.reserve(numCaptures);
1773 for (
unsigned i = 0; i != numCaptures; ++i) {
1774 auto *
decl = readDeclAs<VarDecl>();
1775 unsigned flags =
Record.readInt();
1776 bool byRef = (flags & 1);
1777 bool nested = (flags & 2);
1778 Expr *copyExpr = ((flags & 4) ?
Record.readExpr() :
nullptr);
1787 unsigned ContextParamPos =
Record.readInt();
1790 for (
unsigned I = 0; I < CD->NumParams; ++I) {
1791 if (I != ContextParamPos)
1792 CD->
setParam(I, readDeclAs<ImplicitParamDecl>());
1801 D->setExternLoc(readSourceLocation());
1802 D->setRBraceLoc(readSourceLocation());
1807 D->RBraceLoc = readSourceLocation();
1812 D->setLocStart(readSourceLocation());
1822 D->LocStart = readSourceLocation();
1823 D->RBraceLoc = readSourceLocation();
1830 if (Redecl.getFirstID() == ThisDeclID)
1831 AnonNamespace = readDeclID();
1835 if (AnonNamespace.
isValid()) {
1839 auto *Anon = cast<NamespaceDecl>(Reader.
GetDecl(AnonNamespace));
1841 D->setAnonymousNamespace(Anon);
1848 D->IsCBuffer =
Record.readBool();
1849 D->KwLoc = readSourceLocation();
1850 D->LBraceLoc = readSourceLocation();
1851 D->RBraceLoc = readSourceLocation();
1857 D->NamespaceLoc = readSourceLocation();
1858 D->IdentLoc = readSourceLocation();
1859 D->QualifierLoc =
Record.readNestedNameSpecifierLoc();
1860 D->Namespace = readDeclAs<NamedDecl>();
1866 D->setUsingLoc(readSourceLocation());
1867 D->QualifierLoc =
Record.readNestedNameSpecifierLoc();
1868 D->DNLoc =
Record.readDeclarationNameLoc(
D->getDeclName());
1869 D->FirstUsingShadow.setPointer(readDeclAs<UsingShadowDecl>());
1870 D->setTypename(
Record.readInt());
1871 if (
auto *Pattern = readDeclAs<NamedDecl>())
1878 D->setUsingLoc(readSourceLocation());
1879 D->setEnumLoc(readSourceLocation());
1880 D->setEnumType(
Record.readTypeSourceInfo());
1881 D->FirstUsingShadow.setPointer(readDeclAs<UsingShadowDecl>());
1882 if (
auto *Pattern = readDeclAs<UsingEnumDecl>())
1889 D->InstantiatedFrom = readDeclAs<NamedDecl>();
1890 auto **Expansions =
D->getTrailingObjects<
NamedDecl *>();
1891 for (
unsigned I = 0; I !=
D->NumExpansions; ++I)
1892 Expansions[I] = readDeclAs<NamedDecl>();
1899 D->Underlying = readDeclAs<NamedDecl>();
1901 D->UsingOrNextShadow = readDeclAs<NamedDecl>();
1902 auto *Pattern = readDeclAs<UsingShadowDecl>();
1911 D->NominatedBaseClassShadowDecl = readDeclAs<ConstructorUsingShadowDecl>();
1912 D->ConstructedBaseClassShadowDecl = readDeclAs<ConstructorUsingShadowDecl>();
1913 D->IsVirtual =
Record.readInt();
1918 D->UsingLoc = readSourceLocation();
1919 D->NamespaceLoc = readSourceLocation();
1920 D->QualifierLoc =
Record.readNestedNameSpecifierLoc();
1921 D->NominatedNamespace = readDeclAs<NamedDecl>();
1922 D->CommonAncestor = readDeclAs<DeclContext>();
1927 D->setUsingLoc(readSourceLocation());
1928 D->QualifierLoc =
Record.readNestedNameSpecifierLoc();
1929 D->DNLoc =
Record.readDeclarationNameLoc(
D->getDeclName());
1930 D->EllipsisLoc = readSourceLocation();
1937 D->TypenameLocation = readSourceLocation();
1938 D->QualifierLoc =
Record.readNestedNameSpecifierLoc();
1939 D->EllipsisLoc = readSourceLocation();
1948void ASTDeclReader::ReadCXXDefinitionData(
1950 Decl *LambdaContext,
unsigned IndexInLambdaContext) {
1954#define FIELD(Name, Width, Merge) \
1955 if (!CXXRecordDeclBits.canGetNextNBits(Width)) \
1956 CXXRecordDeclBits.updateValue(Record.readInt()); \
1957 Data.Name = CXXRecordDeclBits.getNextBits(Width);
1959#include "clang/AST/CXXRecordDeclDefinitionBits.def"
1964 Data.HasODRHash =
true;
1967 Reader.DefinitionSource[
D] =
1968 Loc.F->Kind == ModuleKind::MK_MainFile ||
1973 Data.ComputedVisibleConversions =
Record.readInt();
1974 if (
Data.ComputedVisibleConversions)
1975 Record.readUnresolvedSet(
Data.VisibleConversions);
1976 assert(
Data.Definition &&
"Data.Definition should be already set!");
1978 if (!
Data.IsLambda) {
1979 assert(!LambdaContext && !IndexInLambdaContext &&
1980 "given lambda context for non-lambda");
1984 Data.Bases = ReadGlobalOffset();
1988 Data.VBases = ReadGlobalOffset();
1994 auto &Lambda =
static_cast<CXXRecordDecl::LambdaDefinitionData &
>(
Data);
1997 Lambda.DependencyKind = LambdaBits.getNextBits(2);
1998 Lambda.IsGenericLambda = LambdaBits.getNextBit();
1999 Lambda.CaptureDefault = LambdaBits.getNextBits(2);
2000 Lambda.NumCaptures = LambdaBits.getNextBits(15);
2001 Lambda.HasKnownInternalLinkage = LambdaBits.getNextBit();
2003 Lambda.NumExplicitCaptures =
Record.readInt();
2004 Lambda.ManglingNumber =
Record.readInt();
2005 if (
unsigned DeviceManglingNumber =
Record.readInt())
2006 Reader.
getContext().DeviceLambdaManglingNumbers[
D] = DeviceManglingNumber;
2007 Lambda.IndexInContext = IndexInLambdaContext;
2008 Lambda.ContextDecl = LambdaContext;
2010 if (Lambda.NumCaptures) {
2012 Lambda.NumCaptures);
2013 Lambda.AddCaptureList(Reader.
getContext(), ToCapture);
2015 Lambda.MethodTyInfo = readTypeSourceInfo();
2016 for (
unsigned I = 0, N = Lambda.NumCaptures; I != N; ++I) {
2019 bool IsImplicit = CaptureBits.getNextBit();
2032 auto *Var = readDeclAs<ValueDecl>();
2034 new (ToCapture)
Capture(
Loc, IsImplicit,
Kind, Var, EllipsisLoc);
2043 CXXRecordDecl *
D,
struct CXXRecordDecl::DefinitionData &&MergeDD) {
2044 assert(
D->DefinitionData &&
2045 "merging class definition into non-definition");
2046 auto &DD = *
D->DefinitionData;
2048 if (DD.Definition != MergeDD.Definition) {
2050 Reader.MergedDeclContexts.insert(std::make_pair(MergeDD.Definition,
2052 Reader.PendingDefinitions.erase(MergeDD.Definition);
2053 MergeDD.Definition->demoteThisDefinitionToDeclaration();
2055 assert(!Reader.Lookups.contains(MergeDD.Definition) &&
2056 "already loaded pending lookups for merged definition");
2059 auto PFDI = Reader.PendingFakeDefinitionData.find(&DD);
2060 if (PFDI != Reader.PendingFakeDefinitionData.end() &&
2061 PFDI->second == ASTReader::PendingFakeDefinitionKind::Fake) {
2064 assert(!DD.IsLambda && !MergeDD.IsLambda &&
"faked up lambda definition?");
2065 PFDI->second = ASTReader::PendingFakeDefinitionKind::FakeLoaded;
2069 auto *Def = DD.Definition;
2070 DD = std::move(MergeDD);
2071 DD.Definition = Def;
2075 bool DetectedOdrViolation =
false;
2077 #define FIELD(Name, Width, Merge) Merge(Name)
2078 #define MERGE_OR(Field) DD.Field |= MergeDD.Field;
2079 #define NO_MERGE(Field) \
2080 DetectedOdrViolation |= DD.Field != MergeDD.Field; \
2082 #include "clang/AST/CXXRecordDeclDefinitionBits.def"
2087 if (DD.NumBases != MergeDD.NumBases || DD.NumVBases != MergeDD.NumVBases)
2088 DetectedOdrViolation =
true;
2094 if (MergeDD.ComputedVisibleConversions && !DD.ComputedVisibleConversions) {
2095 DD.VisibleConversions = std::move(MergeDD.VisibleConversions);
2096 DD.ComputedVisibleConversions =
true;
2103 auto &Lambda1 =
static_cast<CXXRecordDecl::LambdaDefinitionData &
>(DD);
2104 auto &Lambda2 =
static_cast<CXXRecordDecl::LambdaDefinitionData &
>(MergeDD);
2105 DetectedOdrViolation |= Lambda1.DependencyKind != Lambda2.DependencyKind;
2106 DetectedOdrViolation |= Lambda1.IsGenericLambda != Lambda2.IsGenericLambda;
2107 DetectedOdrViolation |= Lambda1.CaptureDefault != Lambda2.CaptureDefault;
2108 DetectedOdrViolation |= Lambda1.NumCaptures != Lambda2.NumCaptures;
2109 DetectedOdrViolation |=
2110 Lambda1.NumExplicitCaptures != Lambda2.NumExplicitCaptures;
2111 DetectedOdrViolation |=
2112 Lambda1.HasKnownInternalLinkage != Lambda2.HasKnownInternalLinkage;
2113 DetectedOdrViolation |= Lambda1.ManglingNumber != Lambda2.ManglingNumber;
2115 if (Lambda1.NumCaptures && Lambda1.NumCaptures == Lambda2.NumCaptures) {
2116 for (
unsigned I = 0, N = Lambda1.NumCaptures; I != N; ++I) {
2121 Lambda1.AddCaptureList(Reader.
getContext(), Lambda2.Captures.front());
2129 if (
D->getODRHash() != MergeDD.ODRHash) {
2130 DetectedOdrViolation =
true;
2133 if (DetectedOdrViolation)
2134 Reader.PendingOdrMergeFailures[DD.Definition].push_back(
2135 {MergeDD.Definition, &MergeDD});
2139 Decl *LambdaContext,
2140 unsigned IndexInLambdaContext) {
2141 struct CXXRecordDecl::DefinitionData *DD;
2146 bool IsLambda =
Record.readInt();
2147 assert(!(IsLambda &&
Update) &&
2148 "lambda definition should not be added by update record");
2150 DD =
new (
C) CXXRecordDecl::LambdaDefinitionData(
2153 DD =
new (
C)
struct CXXRecordDecl::DefinitionData(
D);
2159 if (!Canon->DefinitionData)
2160 Canon->DefinitionData = DD;
2161 D->DefinitionData = Canon->DefinitionData;
2162 ReadCXXDefinitionData(*DD,
D, LambdaContext, IndexInLambdaContext);
2165 D->setCompleteDefinition(
true);
2170 if (Canon->DefinitionData != DD) {
2179 Reader.PendingDefinitions.insert(
D);
2188 CXXRecNotTemplate = 0,
2190 CXXRecMemberSpecialization,
2194 Decl *LambdaContext =
nullptr;
2195 unsigned IndexInLambdaContext = 0;
2197 switch ((CXXRecKind)
Record.readInt()) {
2198 case CXXRecNotTemplate:
2200 if (!isa<ClassTemplateSpecializationDecl>(
D))
2203 case CXXRecTemplate: {
2205 auto *Template = readDeclAs<ClassTemplateDecl>();
2206 D->TemplateOrInstantiation = Template;
2207 if (!Template->getTemplatedDecl()) {
2218 case CXXRecMemberSpecialization: {
2219 auto *RD = readDeclAs<CXXRecordDecl>();
2224 D->TemplateOrInstantiation = MSI;
2229 LambdaContext = readDecl();
2231 IndexInLambdaContext =
Record.readInt();
2233 MergeImpl.
mergeLambda(
D, Redecl, *LambdaContext, IndexInLambdaContext);
2242 bool WasDefinition =
Record.readInt();
2244 ReadCXXRecordDefinition(
D,
false, LambdaContext,
2245 IndexInLambdaContext);
2252 if (WasDefinition) {
2254 if (KeyFn.
isValid() &&
D->isCompleteDefinition())
2265 D->setExplicitSpecifier(
Record.readExplicitSpec());
2266 D->Ctor = readDeclAs<CXXConstructorDecl>();
2268 D->setDeductionCandidateKind(
2275 unsigned NumOverridenMethods =
Record.readInt();
2277 while (NumOverridenMethods--) {
2280 if (
auto *MD = readDeclAs<CXXMethodDecl>())
2286 Record.skipInts(NumOverridenMethods);
2293 D->setExplicitSpecifier(
Record.readExplicitSpec());
2294 if (
D->isInheritingConstructor()) {
2295 auto *Shadow = readDeclAs<ConstructorUsingShadowDecl>();
2296 auto *Ctor = readDeclAs<CXXConstructorDecl>();
2307 if (
auto *OperatorDelete = readDeclAs<FunctionDecl>()) {
2309 auto *ThisArg =
Record.readExpr();
2311 if (!Canon->OperatorDelete) {
2312 Canon->OperatorDelete = OperatorDelete;
2313 Canon->OperatorDeleteThisArg = ThisArg;
2319 D->setExplicitSpecifier(
Record.readExplicitSpec());
2325 D->ImportedModule = readModule();
2326 D->setImportComplete(
Record.readInt());
2328 for (
unsigned I = 0, N =
Record.back(); I != N; ++I)
2329 StoredLocs[I] = readSourceLocation();
2335 D->setColonLoc(readSourceLocation());
2341 D->Friend = readDeclAs<NamedDecl>();
2343 D->Friend = readTypeSourceInfo();
2344 for (
unsigned i = 0; i !=
D->NumTPLists; ++i)
2346 Record.readTemplateParameterList();
2348 D->UnsupportedFriend = (
Record.readInt() != 0);
2349 D->FriendLoc = readSourceLocation();
2350 D->EllipsisLoc = readSourceLocation();
2355 unsigned NumParams =
Record.readInt();
2356 D->NumParams = NumParams;
2358 for (
unsigned i = 0; i != NumParams; ++i)
2359 D->Params[i] =
Record.readTemplateParameterList();
2361 D->Friend = readDeclAs<NamedDecl>();
2363 D->Friend = readTypeSourceInfo();
2364 D->FriendLoc = readSourceLocation();
2370 assert(!
D->TemplateParams &&
"TemplateParams already set!");
2371 D->TemplateParams =
Record.readTemplateParameterList();
2372 D->init(readDeclAs<NamedDecl>());
2377 D->ConstraintExpr =
Record.readExpr();
2387 for (
unsigned I = 0; I <
D->NumTemplateArgs; ++I)
2388 Args.push_back(
Record.readTemplateArgument(
true));
2389 D->setTemplateArguments(Args);
2396 llvm::BitstreamCursor &DeclsCursor,
2398 uint64_t Offset = ReadLocalOffset();
2400 Reader.ReadSpecializations(M, DeclsCursor, Offset,
D, IsPartial);
2414 Reader.PendingDefinitions.insert(CanonD);
2420 if (ThisDeclID == Redecl.getFirstID()) {
2421 if (
auto *RTD = readDeclAs<RedeclarableTemplateDecl>()) {
2422 assert(RTD->getKind() ==
D->
getKind() &&
2423 "InstantiatedFromMemberTemplate kind mismatch");
2424 D->setInstantiatedFromMemberTemplate(RTD);
2426 D->setMemberSpecialization();
2440 if (ThisDeclID == Redecl.getFirstID()) {
2447 if (
D->getTemplatedDecl()->TemplateOrInstantiation) {
2452 D->getTemplatedDecl(),
D->getInjectedClassNameSpecialization());
2457 llvm_unreachable(
"BuiltinTemplates are not serialized");
2467 if (ThisDeclID == Redecl.getFirstID()) {
2480 if (
Decl *InstD = readDecl()) {
2481 if (
auto *CTD = dyn_cast<ClassTemplateDecl>(InstD)) {
2482 D->SpecializedTemplate = CTD;
2485 Record.readTemplateArgumentList(TemplArgs);
2490 SpecializedPartialSpecialization();
2491 PS->PartialSpecialization
2492 = cast<ClassTemplatePartialSpecializationDecl>(InstD);
2493 PS->TemplateArgs = ArgList;
2494 D->SpecializedTemplate = PS;
2499 Record.readTemplateArgumentList(TemplArgs,
true);
2501 D->PointOfInstantiation = readSourceLocation();
2504 bool writtenAsCanonicalDecl =
Record.readInt();
2505 if (writtenAsCanonicalDecl) {
2506 auto *CanonPattern = readDeclAs<ClassTemplateDecl>();
2510 if (
auto *Partial = dyn_cast<ClassTemplatePartialSpecializationDecl>(
D)) {
2511 CanonSpec = CanonPattern->getCommonPtr()->PartialSpecializations
2512 .GetOrInsertNode(Partial);
2515 CanonPattern->getCommonPtr()->Specializations.GetOrInsertNode(
D);
2518 if (CanonSpec !=
D) {
2523 if (
auto *DDD =
D->DefinitionData) {
2524 if (CanonSpec->DefinitionData)
2527 CanonSpec->DefinitionData =
D->DefinitionData;
2529 D->DefinitionData = CanonSpec->DefinitionData;
2538 ExplicitInfo->TemplateKeywordLoc = readSourceLocation();
2539 D->ExplicitInfo = ExplicitInfo;
2543 D->setTemplateArgsAsWritten(
Record.readASTTemplateArgumentListInfo());
2553 D->TemplateParams = Params;
2558 if (ThisDeclID == Redecl.getFirstID()) {
2559 D->InstantiatedFromMember.setPointer(
2560 readDeclAs<ClassTemplatePartialSpecializationDecl>());
2561 D->InstantiatedFromMember.setInt(
Record.readInt());
2568 if (ThisDeclID == Redecl.getFirstID()) {
2582 if (
Decl *InstD = readDecl()) {
2583 if (
auto *VTD = dyn_cast<VarTemplateDecl>(InstD)) {
2584 D->SpecializedTemplate = VTD;
2587 Record.readTemplateArgumentList(TemplArgs);
2592 VarTemplateSpecializationDecl::SpecializedPartialSpecialization();
2593 PS->PartialSpecialization =
2594 cast<VarTemplatePartialSpecializationDecl>(InstD);
2595 PS->TemplateArgs = ArgList;
2596 D->SpecializedTemplate = PS;
2604 ExplicitInfo->TemplateKeywordLoc = readSourceLocation();
2605 D->ExplicitInfo = ExplicitInfo;
2609 D->setTemplateArgsAsWritten(
Record.readASTTemplateArgumentListInfo());
2612 Record.readTemplateArgumentList(TemplArgs,
true);
2614 D->PointOfInstantiation = readSourceLocation();
2616 D->IsCompleteDefinition =
Record.readInt();
2620 bool writtenAsCanonicalDecl =
Record.readInt();
2621 if (writtenAsCanonicalDecl) {
2622 auto *CanonPattern = readDeclAs<VarTemplateDecl>();
2625 if (
auto *Partial = dyn_cast<VarTemplatePartialSpecializationDecl>(
D)) {
2626 CanonSpec = CanonPattern->getCommonPtr()
2627 ->PartialSpecializations.GetOrInsertNode(Partial);
2630 CanonPattern->getCommonPtr()->Specializations.GetOrInsertNode(
D);
2649 D->TemplateParams = Params;
2654 if (ThisDeclID == Redecl.getFirstID()) {
2655 D->InstantiatedFromMember.setPointer(
2656 readDeclAs<VarTemplatePartialSpecializationDecl>());
2657 D->InstantiatedFromMember.setInt(
Record.readInt());
2664 D->setDeclaredWithTypename(
Record.readInt());
2666 if (
D->hasTypeConstraint()) {
2669 CR =
Record.readConceptReference();
2670 Expr *ImmediatelyDeclaredConstraint =
Record.readExpr();
2672 D->setTypeConstraint(CR, ImmediatelyDeclaredConstraint);
2673 if ((
D->ExpandedParameterPack =
Record.readInt()))
2674 D->NumExpanded =
Record.readInt();
2679 Record.readTemplateArgumentLoc());
2685 D->setDepth(
Record.readInt());
2686 D->setPosition(
Record.readInt());
2687 if (
D->hasPlaceholderTypeConstraint())
2688 D->setPlaceholderTypeConstraint(
Record.readExpr());
2689 if (
D->isExpandedParameterPack()) {
2690 auto TypesAndInfos =
2691 D->getTrailingObjects<std::pair<QualType, TypeSourceInfo *>>();
2692 for (
unsigned I = 0, N =
D->getNumExpansionTypes(); I != N; ++I) {
2694 TypesAndInfos[I].second = readTypeSourceInfo();
2698 D->ParameterPack =
Record.readInt();
2701 Record.readTemplateArgumentLoc());
2707 D->setDeclaredWithTypename(
Record.readBool());
2709 D->setDepth(
Record.readInt());
2710 D->setPosition(
Record.readInt());
2711 if (
D->isExpandedParameterPack()) {
2713 for (
unsigned I = 0, N =
D->getNumExpansionTemplateParameters();
2715 Data[I] =
Record.readTemplateParameterList();
2718 D->ParameterPack =
Record.readInt();
2721 Record.readTemplateArgumentLoc());
2732 D->AssertExprAndFailed.setPointer(
Record.readExpr());
2733 D->AssertExprAndFailed.setInt(
Record.readInt());
2734 D->Message = cast_or_null<StringLiteral>(
Record.readExpr());
2735 D->RParenLoc = readSourceLocation();
2745 D->ExtendingDecl = readDeclAs<ValueDecl>();
2746 D->ExprWithTemporary =
Record.readStmt();
2751 D->ManglingNumber =
Record.readInt();
2755std::pair<uint64_t, uint64_t>
2757 uint64_t LexicalOffset = ReadLocalOffset();
2758 uint64_t VisibleOffset = ReadLocalOffset();
2759 return std::make_pair(LexicalOffset, VisibleOffset);
2762template <
typename T>
2765 Decl *MergeWith =
nullptr;
2767 bool IsKeyDecl = ThisDeclID == FirstDeclID;
2768 bool IsFirstLocalDecl =
false;
2770 uint64_t RedeclOffset = 0;
2775 FirstDeclID = ThisDeclID;
2777 IsFirstLocalDecl =
true;
2778 }
else if (
unsigned N =
Record.readInt()) {
2782 IsFirstLocalDecl =
true;
2789 for (
unsigned I = 0; I != N - 1; ++I)
2790 MergeWith = readDecl();
2792 RedeclOffset = ReadLocalOffset();
2799 auto *FirstDecl = cast_or_null<T>(Reader.
GetDecl(FirstDeclID));
2800 if (FirstDecl !=
D) {
2809 auto *DAsT =
static_cast<T *
>(
D);
2815 if (IsFirstLocalDecl)
2816 Reader.PendingDeclChains.push_back(std::make_pair(DAsT, RedeclOffset));
2818 return RedeclarableResult(MergeWith, FirstDeclID, IsKeyDecl);
2823template <
typename T>
2825 RedeclarableResult &Redecl) {
2834 auto *
D =
static_cast<T *
>(DBase);
2836 if (
auto *Existing = Redecl.getKnownMergeTarget())
2839 else if (FindExistingResult ExistingRes = findExisting(
D))
2840 if (
T *Existing = ExistingRes)
2851 Decl &Context,
unsigned IndexInContext) {
2860 if (
auto *Existing = Redecl.getKnownMergeTarget())
2866 NamedDecl *&Slot = Reader.LambdaDeclarationsForMerging[{
2867 Context.getCanonicalDecl(), IndexInContext}];
2875 RedeclarableResult &Redecl) {
2888 llvm_unreachable(
"bad assert_cast");
2896 auto *DPattern =
D->getTemplatedDecl();
2898 RedeclarableResult
Result(
2900 DPattern->getCanonicalDecl()->getGlobalID(), IsKeyDecl);
2902 if (
auto *DClass = dyn_cast<CXXRecordDecl>(DPattern)) {
2905 auto *ExistingClass =
2906 cast<CXXRecordDecl>(ExistingPattern)->getCanonicalDecl();
2907 if (
auto *DDD = DClass->DefinitionData) {
2908 if (ExistingClass->DefinitionData) {
2911 ExistingClass->DefinitionData = DClass->DefinitionData;
2914 Reader.PendingDefinitions.insert(DClass);
2917 DClass->DefinitionData = ExistingClass->DefinitionData;
2922 if (
auto *DFunction = dyn_cast<FunctionDecl>(DPattern))
2925 if (
auto *DVar = dyn_cast<VarDecl>(DPattern))
2927 if (
auto *DAlias = dyn_cast<TypeAliasDecl>(DPattern))
2930 llvm_unreachable(
"merged an unknown kind of redeclarable template");
2935template <
typename T>
2938 auto *
D =
static_cast<T *
>(DBase);
2939 T *ExistingCanon = Existing->getCanonicalDecl();
2941 if (ExistingCanon != DCanon) {
2946 D->First = ExistingCanon;
2947 ExistingCanon->Used |=
D->Used;
2950 bool IsKeyDecl = KeyDeclID.
isValid();
2953 if (
auto *DTemplate = dyn_cast<RedeclarableTemplateDecl>(
D))
2955 DTemplate, assert_cast<RedeclarableTemplateDecl *>(ExistingCanon),
2960 Reader.KeyDecls[ExistingCanon].push_back(KeyDeclID);
2973 if (isa<EnumConstantDecl, FieldDecl, IndirectFieldDecl>(ND))
2988 Reader.LETemporaryForMerging[std::make_pair(
3015 if (FindExistingResult ExistingRes = findExisting(
static_cast<T*
>(
D)))
3016 if (
T *Existing = ExistingRes)
3018 Existing->getCanonicalDecl());
3022 Record.readOMPChildren(
D->Data);
3027 Record.readOMPChildren(
D->Data);
3032 Record.readOMPChildren(
D->Data);
3041 D->setCombinerData(In, Out);
3043 D->setCombiner(Combiner);
3046 D->setInitializerData(Orig, Priv);
3049 D->setInitializer(
Init, IK);
3054 Record.readOMPChildren(
D->Data);
3056 D->VarName =
Record.readDeclarationName();
3075 uint64_t readInt() {
3079 bool readBool() {
return Reader.
readBool(); }
3093 std::string readString() {
3105 VersionTuple readVersionTuple() {
3111 template <
typename T>
T *readDeclAs() {
return Reader.
readDeclAs<
T>(); }
3116 AttrReader
Record(*
this);
3121 Attr *New =
nullptr;
3131 unsigned ParsedKind =
Record.readInt();
3132 unsigned Syntax =
Record.readInt();
3133 unsigned SpellingIndex =
Record.readInt();
3134 bool IsAlignas = (ParsedKind == AttributeCommonInfo::AT_Aligned &&
3136 SpellingIndex == AlignedAttr::Keyword_alignas);
3137 bool IsRegularKeywordAttribute =
Record.readBool();
3142 IsAlignas, IsRegularKeywordAttribute});
3144#include "clang/Serialization/AttrPCHRead.inc"
3146 assert(New &&
"Unable to decode attribute?");
3152 for (
unsigned I = 0,
E =
readInt(); I !=
E; ++I)
3167inline void ASTReader::LoadedDecl(
unsigned Index,
Decl *
D) {
3168 assert(!DeclsLoaded[Index] &&
"Decl loaded twice?");
3169 DeclsLoaded[Index] =
D;
3178bool ASTReader::isConsumerInterestedIn(
Decl *
D) {
3197 if (
const auto *Var = dyn_cast<VarDecl>(
D))
3198 return Var->isFileVarDecl() &&
3200 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(Var));
3201 if (
const auto *
Func = dyn_cast<FunctionDecl>(
D))
3202 return Func->doesThisDeclarationHaveABody() || PendingBodies.count(
D);
3212ASTReader::RecordLocation ASTReader::DeclCursorForID(
GlobalDeclID ID,
3216 unsigned LocalDeclIndex =
ID.getLocalDeclIndex();
3222ASTReader::RecordLocation ASTReader::getLocalBitOffset(uint64_t GlobalOffset) {
3223 auto I = GlobalBitOffsetsMap.find(GlobalOffset);
3225 assert(I != GlobalBitOffsetsMap.end() &&
"Corrupted global bit offsets map");
3226 return RecordLocation(I->second, GlobalOffset - I->second->GlobalBitOffset);
3234ASTDeclReader::getOrFakePrimaryClassDefinition(
ASTReader &Reader,
3237 auto *DD = RD->DefinitionData;
3246 DD =
new (Reader.
getContext())
struct CXXRecordDecl::DefinitionData(RD);
3248 RD->DefinitionData = DD;
3252 Reader.PendingFakeDefinitionData.insert(
3253 std::make_pair(DD, ASTReader::PendingFakeDefinitionKind::Fake));
3256 return DD->Definition;
3263 if (
auto *ND = dyn_cast<NamespaceDecl>(DC))
3264 return ND->getFirstDecl();
3266 if (
auto *RD = dyn_cast<CXXRecordDecl>(DC))
3267 return getOrFakePrimaryClassDefinition(Reader, RD);
3269 if (
auto *RD = dyn_cast<RecordDecl>(DC))
3272 if (
auto *ED = dyn_cast<EnumDecl>(DC))
3275 if (
auto *OID = dyn_cast<ObjCInterfaceDecl>(DC))
3280 if (
auto *TU = dyn_cast<TranslationUnitDecl>(DC))
3286ASTDeclReader::FindExistingResult::~FindExistingResult() {
3289 if (TypedefNameForLinkage) {
3291 Reader.ImportedTypedefNamesForLinkage.insert(
3292 std::make_pair(std::make_pair(DC, TypedefNameForLinkage), New));
3296 if (!AddResult || Existing)
3302 setAnonymousDeclForMerging(Reader, New->getLexicalDeclContext(),
3303 AnonymousDeclNumber, New);
3307 Reader.PendingFakeLookupResults[Name.getAsIdentifierInfo()]
3309 }
else if (
DeclContext *MergeDC = getPrimaryContextForMerging(Reader, DC)) {
3312 MergeDC->makeDeclVisibleInContextImpl(New,
true);
3320 bool IsTypedefNameForLinkage) {
3321 if (!IsTypedefNameForLinkage)
3327 if (
Found->isFromASTFile())
3330 if (
auto *TND = dyn_cast<TypedefNameDecl>(
Found))
3331 return TND->getAnonDeclWithTypedefName(
true);
3340ASTDeclReader::getPrimaryDCForAnonymousDecl(
DeclContext *LexicalDC) {
3342 if (
auto *RD = dyn_cast<CXXRecordDecl>(LexicalDC)) {
3344 return DD ? DD->Definition :
nullptr;
3345 }
else if (
auto *OID = dyn_cast<ObjCInterfaceDecl>(LexicalDC)) {
3346 return OID->getCanonicalDecl()->getDefinition();
3353 if (
auto *FD = dyn_cast<FunctionDecl>(
D))
3354 if (FD->isThisDeclarationADefinition())
3356 if (
auto *MD = dyn_cast<ObjCMethodDecl>(
D))
3357 if (MD->isThisDeclarationADefinition())
3359 if (
auto *RD = dyn_cast<RecordDecl>(
D))
3376 auto &
Previous = Reader.AnonymousDeclarationsForMerging[CanonDC];
3382 auto *PrimaryDC = getPrimaryDCForAnonymousDecl(DC);
3383 if (PrimaryDC && !cast<Decl>(PrimaryDC)->isFromASTFile()) {
3395void ASTDeclReader::setAnonymousDeclForMerging(
ASTReader &Reader,
3398 auto *CanonDC = cast<Decl>(DC)->getCanonicalDecl();
3400 auto &
Previous = Reader.AnonymousDeclarationsForMerging[CanonDC];
3407ASTDeclReader::FindExistingResult ASTDeclReader::findExisting(
NamedDecl *
D) {
3414 FindExistingResult
Result(Reader,
D,
nullptr,
3415 AnonymousDeclNumber, TypedefNameForLinkage);
3422 if (TypedefNameForLinkage) {
3423 auto It = Reader.ImportedTypedefNamesForLinkage.find(
3424 std::make_pair(DC, TypedefNameForLinkage));
3425 if (It != Reader.ImportedTypedefNamesForLinkage.end())
3426 if (
C.isSameEntity(It->second,
D))
3427 return FindExistingResult(Reader,
D, It->second, AnonymousDeclNumber,
3428 TypedefNameForLinkage);
3436 if (
auto *Existing = getAnonymousDeclForMerging(
3438 if (
C.isSameEntity(Existing,
D))
3439 return FindExistingResult(Reader,
D, Existing, AnonymousDeclNumber,
3440 TypedefNameForLinkage);
3447 class UpToDateIdentifierRAII {
3449 bool WasOutToDate =
false;
3460 ~UpToDateIdentifierRAII() {
3464 } UpToDate(Name.getAsIdentifierInfo());
3467 IEnd = IdResolver.
end();
3470 if (
C.isSameEntity(Existing,
D))
3471 return FindExistingResult(Reader,
D, Existing, AnonymousDeclNumber,
3472 TypedefNameForLinkage);
3474 }
else if (
DeclContext *MergeDC = getPrimaryContextForMerging(Reader, DC)) {
3478 if (
C.isSameEntity(Existing,
D))
3479 return FindExistingResult(Reader,
D, Existing, AnonymousDeclNumber,
3480 TypedefNameForLinkage);
3484 return FindExistingResult(Reader);
3496 if (MergedDCIt != Reader.MergedDeclContexts.end() &&
3499 Reader.PendingOdrMergeChecks.push_back(
D);
3501 return FindExistingResult(Reader,
D,
nullptr,
3502 AnonymousDeclNumber, TypedefNameForLinkage);
3505template<
typename DeclT>
3507 return D->RedeclLink.getLatestNotUpdated();
3511 llvm_unreachable(
"getMostRecentDecl on non-redeclarable declaration");
3518#define ABSTRACT_DECL(TYPE)
3519#define DECL(TYPE, BASE) \
3521 return getMostRecentDeclImpl(cast<TYPE##Decl>(D));
3522#include "clang/AST/DeclNodes.inc"
3524 llvm_unreachable(
"unknown decl kind");
3527Decl *ASTReader::getMostRecentExistingDecl(
Decl *
D) {
3535 const auto *IA =
Previous->getAttr<MSInheritanceAttr>();
3537 if (IA && !
D->
hasAttr<MSInheritanceAttr>()) {
3538 NewAttr = cast<InheritableAttr>(IA->clone(Context));
3543 const auto *AA =
Previous->getAttr<AvailabilityAttr>();
3544 if (AA && !
D->
hasAttr<AvailabilityAttr>()) {
3545 NewAttr = AA->
clone(Context);
3552template<
typename DeclT>
3556 D->RedeclLink.setPrevious(cast<DeclT>(
Previous));
3557 D->First = cast<DeclT>(
Previous)->First;
3566 auto *VD =
static_cast<VarDecl *
>(
D);
3567 auto *PrevVD = cast<VarDecl>(
Previous);
3568 D->RedeclLink.setPrevious(PrevVD);
3569 D->First = PrevVD->First;
3578 VD->demoteThisDefinitionToDeclaration();
3595 auto *PrevFD = cast<FunctionDecl>(
Previous);
3597 FD->RedeclLink.setPrevious(PrevFD);
3598 FD->First = PrevFD->First;
3602 if (PrevFD->isInlined() != FD->isInlined()) {
3618 FD->setImplicitlyInline(
true);
3623 if (FPT && PrevFPT) {
3627 bool WasUnresolved =
3629 if (IsUnresolved != WasUnresolved)
3630 Reader.PendingExceptionSpecUpdates.insert(
3631 {Canon, IsUnresolved ? PrevFD : FD});
3637 if (IsUndeduced != WasUndeduced)
3638 Reader.PendingDeducedTypeUpdates.insert(
3639 {cast<FunctionDecl>(Canon),
3640 (IsUndeduced ? PrevFPT : FPT)->getReturnType()});
3647 llvm_unreachable(
"attachPreviousDecl on non-redeclarable declaration");
3652template <
typename ParmDecl>
3655 auto *To = cast<ParmDecl>(ToD);
3656 if (!From->hasDefaultArgument())
3658 To->setInheritedDefaultArgument(Context, From);
3667 assert(FromTP->size() == ToTP->size() &&
"merged mismatched templates?");
3669 for (
unsigned I = 0, N = FromTP->size(); I != N; ++I) {
3670 NamedDecl *FromParam = FromTP->getParam(I);
3673 if (
auto *FTTP = dyn_cast<TemplateTypeParmDecl>(FromParam))
3675 else if (
auto *FNTTP = dyn_cast<NonTypeTemplateParmDecl>(FromParam))
3679 Context, cast<TemplateTemplateParmDecl>(FromParam), ToParam);
3697 if (!isa<VarDecl, FunctionDecl, TagDecl, RedeclarableTemplateDecl>(
Previous))
3705 if (isa<VarTemplateSpecializationDecl>(
Previous))
3707 if (isa<ClassTemplateSpecializationDecl>(
Previous))
3710 Func &&
Func->getTemplateSpecializationInfo())
3727 Reader.PendingWarningForDuplicatedDefsInModuleUnits.push_back(
3737 diag::err_multiple_decl_in_different_modules)
3747#define ABSTRACT_DECL(TYPE)
3748#define DECL(TYPE, BASE) \
3750 attachPreviousDeclImpl(Reader, cast<TYPE##Decl>(D), Previous, Canon); \
3752#include "clang/AST/DeclNodes.inc"
3768 if (
auto *TD = dyn_cast<TemplateDecl>(
D))
3776 mergeInheritableAttributes(Reader,
D,
Previous);
3779template<
typename DeclT>
3781 D->RedeclLink.setLatest(cast<DeclT>(Latest));
3785 llvm_unreachable(
"attachLatestDecl on non-redeclarable declaration");
3789 assert(
D && Latest);
3792#define ABSTRACT_DECL(TYPE)
3793#define DECL(TYPE, BASE) \
3795 attachLatestDeclImpl(cast<TYPE##Decl>(D), Latest); \
3797#include "clang/AST/DeclNodes.inc"
3801template<
typename DeclT>
3803 D->RedeclLink.markIncomplete();
3807 llvm_unreachable(
"markIncompleteDeclChain on non-redeclarable declaration");
3810void ASTReader::markIncompleteDeclChain(
Decl *
D) {
3812#define ABSTRACT_DECL(TYPE)
3813#define DECL(TYPE, BASE) \
3815 ASTDeclReader::markIncompleteDeclChainImpl(cast<TYPE##Decl>(D)); \
3817#include "clang/AST/DeclNodes.inc"
3824 RecordLocation
Loc = DeclCursorForID(ID, DeclLoc);
3825 llvm::BitstreamCursor &DeclsCursor =
Loc.F->DeclsCursor;
3830 ReadingKindTracker ReadingKind(Read_Decl, *
this);
3833 Deserializing ADecl(
this);
3835 auto Fail = [](
const char *what, llvm::Error &&Err) {
3836 llvm::report_fatal_error(Twine(
"ASTReader::readDeclRecord failed ") + what +
3840 if (llvm::Error JumpFailed = DeclsCursor.JumpToBit(
Loc.Offset))
3841 Fail(
"jumping", std::move(JumpFailed));
3846 Fail(
"reading code", MaybeCode.takeError());
3847 unsigned Code = MaybeCode.get();
3853 llvm::report_fatal_error(
3854 Twine(
"ASTReader::readDeclRecord failed reading decl code: ") +
3855 toString(MaybeDeclCode.takeError()));
3857 switch ((
DeclCode)MaybeDeclCode.get()) {
3862 llvm_unreachable(
"Record cannot be de-serialized with readDeclRecord");
3972 bool HasTypeConstraint =
Record.readInt();
3978 bool HasTypeConstraint =
Record.readInt();
3984 bool HasTypeConstraint =
Record.readInt();
3986 Context, ID,
Record.readInt(), HasTypeConstraint);
4075 D = MSGuidDecl::CreateDeserialized(Context, ID);
4078 D = UnnamedGlobalConstantDecl::CreateDeserialized(Context, ID);
4081 D = TemplateParamObjectDecl::CreateDeserialized(Context, ID);
4087 Error(
"attempt to read a C++ base-specifier record as a declaration");
4090 Error(
"attempt to read a C++ ctor initializer record as a declaration");
4099 unsigned NumChildren =
Record.readInt();
4105 unsigned NumClauses =
Record.readInt();
4106 unsigned NumVars =
Record.readInt();
4112 unsigned NumClauses =
Record.readInt();
4121 unsigned NumClauses =
Record.readInt();
4154 assert(
D &&
"Unknown declaration reading AST file");
4155 LoadedDecl(translateGlobalDeclIDToIndex(ID),
D);
4166 if (
auto *DC = dyn_cast<DeclContext>(
D)) {
4167 std::pair<uint64_t, uint64_t> Offsets = Reader.VisitDeclContext(DC);
4172 if (!Offsets.first && !Offsets.second && isa<NamespaceDecl>(
D))
4173 if (
auto Iter = DelayedNamespaceOffsetMap.find(ID);
4174 Iter != DelayedNamespaceOffsetMap.end())
4175 Offsets =
Iter->second;
4177 if (Offsets.first &&
4178 ReadLexicalDeclContextStorage(*
Loc.F, DeclsCursor, Offsets.first, DC))
4180 if (Offsets.second &&
4181 ReadVisibleDeclContextStorage(*
Loc.F, DeclsCursor, Offsets.second, ID))
4187 PendingUpdateRecords.push_back(
4188 PendingUpdateRecord(ID,
D,
true));
4191 if (
auto *
Class = dyn_cast<ObjCInterfaceDecl>(
D))
4194 if (
Class->isThisDeclarationADefinition() ||
4195 PendingDefinitions.count(
Class))
4196 loadObjCCategories(ID,
Class);
4202 PotentiallyInterestingDecls.push_back(
D);
4207void ASTReader::PassInterestingDeclsToConsumer() {
4210 if (PassingDeclsToConsumer)
4215 SaveAndRestore GuardPassingDeclsToConsumer(PassingDeclsToConsumer,
true);
4219 for (
auto ID : EagerlyDeserializedDecls)
4221 EagerlyDeserializedDecls.clear();
4223 auto ConsumingPotentialInterestingDecls = [
this]() {
4224 while (!PotentiallyInterestingDecls.empty()) {
4225 Decl *
D = PotentiallyInterestingDecls.front();
4226 PotentiallyInterestingDecls.pop_front();
4227 if (isConsumerInterestedIn(
D))
4228 PassInterestingDeclToConsumer(
D);
4231 std::deque<Decl *> MaybeInterestingDecls =
4232 std::move(PotentiallyInterestingDecls);
4233 PotentiallyInterestingDecls.clear();
4234 assert(PotentiallyInterestingDecls.empty());
4235 while (!MaybeInterestingDecls.empty()) {
4236 Decl *
D = MaybeInterestingDecls.front();
4237 MaybeInterestingDecls.pop_front();
4243 if (
auto *VD = dyn_cast<VarDecl>(
D);
4244 VD && VD->isFileVarDecl() && !VD->isExternallyVisible())
4246 ConsumingPotentialInterestingDecls();
4247 if (isConsumerInterestedIn(
D))
4248 PassInterestingDeclToConsumer(
D);
4252 ConsumingPotentialInterestingDecls();
4255 auto *RD = cast<CXXRecordDecl>(
GetDecl(ID));
4257 PassVTableToConsumer(RD);
4259 VTablesToEmit.clear();
4262void ASTReader::loadDeclUpdateRecords(PendingUpdateRecord &
Record) {
4268 ProcessingUpdatesRAIIObj ProcessingUpdates(*
this);
4269 DeclUpdateOffsetsMap::iterator UpdI = DeclUpdateOffsets.find(ID);
4271 if (UpdI != DeclUpdateOffsets.end()) {
4272 auto UpdateOffsets = std::move(UpdI->second);
4273 DeclUpdateOffsets.erase(UpdI);
4279 bool WasInteresting =
Record.JustLoaded || isConsumerInterestedIn(
D);
4280 for (
auto &FileAndOffset : UpdateOffsets) {
4282 uint64_t Offset = FileAndOffset.second;
4285 if (llvm::Error JumpFailed =
Cursor.JumpToBit(Offset))
4287 llvm::report_fatal_error(
4288 Twine(
"ASTReader::loadDeclUpdateRecords failed jumping: ") +
4292 llvm::report_fatal_error(
4293 Twine(
"ASTReader::loadDeclUpdateRecords failed reading code: ") +
4295 unsigned Code = MaybeCode.get();
4299 "Expected DECL_UPDATES record!");
4301 llvm::report_fatal_error(
4302 Twine(
"ASTReader::loadDeclUpdateRecords failed reading rec code: ") +
4307 Reader.UpdateDecl(
D);
4311 if (!WasInteresting && isConsumerInterestedIn(
D)) {
4312 PotentiallyInterestingDecls.push_back(
D);
4313 WasInteresting =
true;
4319 auto I = PendingVisibleUpdates.find(ID);
4320 if (I != PendingVisibleUpdates.end()) {
4321 auto VisibleUpdates = std::move(I->second);
4322 PendingVisibleUpdates.erase(I);
4325 for (
const auto &
Update : VisibleUpdates)
4326 Lookups[DC].Table.add(
4334 if (
auto IT = RelatedDeclsMap.find(ID); IT != RelatedDeclsMap.end()) {
4335 for (
auto LID : IT->second)
4337 RelatedDeclsMap.erase(IT);
4342 if (
auto I = PendingSpecializationsUpdates.find(ID);
4343 I != PendingSpecializationsUpdates.end()) {
4344 auto SpecializationUpdates = std::move(I->second);
4345 PendingSpecializationsUpdates.erase(I);
4347 for (
const auto &
Update : SpecializationUpdates)
4352 if (
auto I = PendingPartialSpecializationsUpdates.find(ID);
4353 I != PendingPartialSpecializationsUpdates.end()) {
4354 auto SpecializationUpdates = std::move(I->second);
4355 PendingPartialSpecializationsUpdates.erase(I);
4357 for (
const auto &
Update : SpecializationUpdates)
4362void ASTReader::loadPendingDeclChain(
Decl *FirstLocal, uint64_t LocalOffset) {
4365 if (FirstLocal != CanonDecl) {
4368 *
this, FirstLocal, PrevMostRecent ? PrevMostRecent : CanonDecl,
4379 assert(M &&
"imported decl from no module file");
4383 if (llvm::Error JumpFailed =
Cursor.JumpToBit(LocalOffset))
4384 llvm::report_fatal_error(
4385 Twine(
"ASTReader::loadPendingDeclChain failed jumping: ") +
4391 llvm::report_fatal_error(
4392 Twine(
"ASTReader::loadPendingDeclChain failed reading code: ") +
4394 unsigned Code = MaybeCode.get();
4397 "expected LOCAL_REDECLARATIONS record!");
4399 llvm::report_fatal_error(
4400 Twine(
"ASTReader::loadPendingDeclChain failed reading rec code: ") +
4405 Decl *MostRecent = FirstLocal;
4406 for (
unsigned I = 0, N =
Record.size(); I != N; ++I) {
4407 unsigned Idx = N - I - 1;
4419 class ObjCCategoriesVisitor {
4422 llvm::SmallPtrSetImpl<ObjCCategoryDecl *> &Deserialized;
4424 llvm::DenseMap<DeclarationName, ObjCCategoryDecl *> NameCategoryMap;
4426 unsigned PreviousGeneration;
4430 if (!Deserialized.erase(Cat))
4441 NonEquivalentDecls, StructuralEquivalenceKind::Default,
4445 if (!Ctx.IsEquivalent(Cat, Existing)) {
4450 diag::note_previous_definition);
4452 }
else if (!Existing) {
4467 ObjCCategoriesVisitor(
4469 llvm::SmallPtrSetImpl<ObjCCategoryDecl *> &Deserialized,
4472 InterfaceID(InterfaceID), PreviousGeneration(PreviousGeneration) {
4474 for (
auto *Cat :
Interface->known_categories()) {
4505 LocalID != Result->getDefinitionID()) {
4513 unsigned Offset = Result->Offset;
4516 for (
unsigned I = 0; I != N; ++I)
4525 unsigned PreviousGeneration) {
4526 ObjCCategoriesVisitor Visitor(*
this,
D, CategoriesDeserialized, ID,
4527 PreviousGeneration);
4528 ModuleMgr.
visit(Visitor);
4531template<
typename DeclT,
typename Fn>
4540 for (
auto *Redecl = MostRecent; Redecl && !
Found;
4541 Redecl = Redecl->getPreviousDecl())
4546 for (
auto *Redecl = MostRecent; Redecl !=
D;
4556 auto *RD = cast<CXXRecordDecl>(
D);
4558 assert(MD &&
"couldn't read decl from update record");
4559 Reader.PendingAddedClassMembers.push_back({RD, MD});
4564 auto *Anon = readDeclAs<NamespaceDecl>();
4569 if (!
Record.isModule()) {
4570 if (
auto *TU = dyn_cast<TranslationUnitDecl>(
D))
4571 TU->setAnonymousNamespace(Anon);
4573 cast<NamespaceDecl>(
D)->setAnonymousNamespace(Anon);
4579 auto *VD = cast<VarDecl>(
D);
4580 VD->NonParmVarDeclBits.IsInline =
Record.readInt();
4581 VD->NonParmVarDeclBits.IsInlineSpecified =
Record.readInt();
4588 if (
auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(
D)) {
4589 VTSD->setPointOfInstantiation(POI);
4590 }
else if (
auto *VD = dyn_cast<VarDecl>(
D)) {
4592 assert(MSInfo &&
"No member specialization information");
4595 auto *FD = cast<FunctionDecl>(
D);
4596 if (
auto *FTSInfo = FD->TemplateOrSpecialization
4598 FTSInfo->setPointOfInstantiation(POI);
4600 cast<MemberSpecializationInfo *>(FD->TemplateOrSpecialization)
4601 ->setPointOfInstantiation(POI);
4607 auto *Param = cast<ParmVarDecl>(
D);
4612 auto *DefaultArg =
Record.readExpr();
4616 if (Param->hasUninstantiatedDefaultArg())
4617 Param->setDefaultArg(DefaultArg);
4622 auto *FD = cast<FieldDecl>(
D);
4623 auto *DefaultInit =
Record.readExpr();
4627 if (FD->hasInClassInitializer() && !FD->hasNonNullInClassInitializer()) {
4629 FD->setInClassInitializer(DefaultInit);
4633 FD->removeInClassInitializer();
4639 auto *FD = cast<FunctionDecl>(
D);
4640 if (Reader.PendingBodies[FD]) {
4654 FD->setInnerLocStart(readSourceLocation());
4656 assert(
Record.getIdx() ==
Record.size() &&
"lazy body must be last");
4661 auto *RD = cast<CXXRecordDecl>(
D);
4663 bool HadRealDefinition =
4664 OldDD && (OldDD->Definition != RD ||
4665 !Reader.PendingFakeDefinitionData.count(OldDD));
4669 ReadCXXRecordDefinition(RD,
true);
4672 uint64_t LexicalOffset = ReadLocalOffset();
4673 if (!HadRealDefinition && LexicalOffset) {
4674 Record.readLexicalDeclContextStorage(LexicalOffset, RD);
4675 Reader.PendingFakeDefinitionData.erase(OldDD);
4682 MSInfo->setTemplateSpecializationKind(TSK);
4683 MSInfo->setPointOfInstantiation(POI);
4685 auto *Spec = cast<ClassTemplateSpecializationDecl>(RD);
4686 Spec->setTemplateSpecializationKind(TSK);
4687 Spec->setPointOfInstantiation(POI);
4691 readDeclAs<ClassTemplatePartialSpecializationDecl>();
4693 Record.readTemplateArgumentList(TemplArgs);
4699 if (!isa<ClassTemplatePartialSpecializationDecl *>(
4700 Spec->getSpecializedTemplateOrPartial()))
4701 Spec->setInstantiationOf(PartialSpec, TemplArgList);