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 bool TypeConstraintInitialized =
D->hasTypeConstraint() &&
Record.readBool();
2667 if (TypeConstraintInitialized) {
2670 CR =
Record.readConceptReference();
2671 Expr *ImmediatelyDeclaredConstraint =
Record.readExpr();
2673 D->setTypeConstraint(CR, ImmediatelyDeclaredConstraint);
2674 if ((
D->ExpandedParameterPack =
Record.readInt()))
2675 D->NumExpanded =
Record.readInt();
2680 Record.readTemplateArgumentLoc());
2686 D->setDepth(
Record.readInt());
2687 D->setPosition(
Record.readInt());
2688 if (
D->hasPlaceholderTypeConstraint())
2689 D->setPlaceholderTypeConstraint(
Record.readExpr());
2690 if (
D->isExpandedParameterPack()) {
2691 auto TypesAndInfos =
2692 D->getTrailingObjects<std::pair<QualType, TypeSourceInfo *>>();
2693 for (
unsigned I = 0, N =
D->getNumExpansionTypes(); I != N; ++I) {
2695 TypesAndInfos[I].second = readTypeSourceInfo();
2699 D->ParameterPack =
Record.readInt();
2702 Record.readTemplateArgumentLoc());
2708 D->setDeclaredWithTypename(
Record.readBool());
2710 D->setDepth(
Record.readInt());
2711 D->setPosition(
Record.readInt());
2712 if (
D->isExpandedParameterPack()) {
2714 for (
unsigned I = 0, N =
D->getNumExpansionTemplateParameters();
2716 Data[I] =
Record.readTemplateParameterList();
2719 D->ParameterPack =
Record.readInt();
2722 Record.readTemplateArgumentLoc());
2733 D->AssertExprAndFailed.setPointer(
Record.readExpr());
2734 D->AssertExprAndFailed.setInt(
Record.readInt());
2735 D->Message = cast_or_null<StringLiteral>(
Record.readExpr());
2736 D->RParenLoc = readSourceLocation();
2746 D->ExtendingDecl = readDeclAs<ValueDecl>();
2747 D->ExprWithTemporary =
Record.readStmt();
2752 D->ManglingNumber =
Record.readInt();
2756std::pair<uint64_t, uint64_t>
2758 uint64_t LexicalOffset = ReadLocalOffset();
2759 uint64_t VisibleOffset = ReadLocalOffset();
2760 return std::make_pair(LexicalOffset, VisibleOffset);
2763template <
typename T>
2766 Decl *MergeWith =
nullptr;
2768 bool IsKeyDecl = ThisDeclID == FirstDeclID;
2769 bool IsFirstLocalDecl =
false;
2771 uint64_t RedeclOffset = 0;
2776 FirstDeclID = ThisDeclID;
2778 IsFirstLocalDecl =
true;
2779 }
else if (
unsigned N =
Record.readInt()) {
2783 IsFirstLocalDecl =
true;
2790 for (
unsigned I = 0; I != N - 1; ++I)
2791 MergeWith = readDecl();
2793 RedeclOffset = ReadLocalOffset();
2800 auto *FirstDecl = cast_or_null<T>(Reader.
GetDecl(FirstDeclID));
2801 if (FirstDecl !=
D) {
2810 auto *DAsT =
static_cast<T *
>(
D);
2816 if (IsFirstLocalDecl)
2817 Reader.PendingDeclChains.push_back(std::make_pair(DAsT, RedeclOffset));
2819 return RedeclarableResult(MergeWith, FirstDeclID, IsKeyDecl);
2824template <
typename T>
2826 RedeclarableResult &Redecl) {
2835 auto *
D =
static_cast<T *
>(DBase);
2837 if (
auto *Existing = Redecl.getKnownMergeTarget())
2840 else if (FindExistingResult ExistingRes = findExisting(
D))
2841 if (
T *Existing = ExistingRes)
2852 Decl &Context,
unsigned IndexInContext) {
2861 if (
auto *Existing = Redecl.getKnownMergeTarget())
2867 NamedDecl *&Slot = Reader.LambdaDeclarationsForMerging[{
2868 Context.getCanonicalDecl(), IndexInContext}];
2876 RedeclarableResult &Redecl) {
2889 llvm_unreachable(
"bad assert_cast");
2897 auto *DPattern =
D->getTemplatedDecl();
2899 RedeclarableResult
Result(
2901 DPattern->getCanonicalDecl()->getGlobalID(), IsKeyDecl);
2903 if (
auto *DClass = dyn_cast<CXXRecordDecl>(DPattern)) {
2906 auto *ExistingClass =
2907 cast<CXXRecordDecl>(ExistingPattern)->getCanonicalDecl();
2908 if (
auto *DDD = DClass->DefinitionData) {
2909 if (ExistingClass->DefinitionData) {
2912 ExistingClass->DefinitionData = DClass->DefinitionData;
2915 Reader.PendingDefinitions.insert(DClass);
2918 DClass->DefinitionData = ExistingClass->DefinitionData;
2923 if (
auto *DFunction = dyn_cast<FunctionDecl>(DPattern))
2926 if (
auto *DVar = dyn_cast<VarDecl>(DPattern))
2928 if (
auto *DAlias = dyn_cast<TypeAliasDecl>(DPattern))
2931 llvm_unreachable(
"merged an unknown kind of redeclarable template");
2936template <
typename T>
2939 auto *
D =
static_cast<T *
>(DBase);
2940 T *ExistingCanon = Existing->getCanonicalDecl();
2942 if (ExistingCanon != DCanon) {
2947 D->First = ExistingCanon;
2948 ExistingCanon->Used |=
D->Used;
2951 bool IsKeyDecl = KeyDeclID.
isValid();
2954 if (
auto *DTemplate = dyn_cast<RedeclarableTemplateDecl>(
D))
2956 DTemplate, assert_cast<RedeclarableTemplateDecl *>(ExistingCanon),
2961 Reader.KeyDecls[ExistingCanon].push_back(KeyDeclID);
2974 if (isa<EnumConstantDecl, FieldDecl, IndirectFieldDecl>(ND))
2989 Reader.LETemporaryForMerging[std::make_pair(
3016 if (FindExistingResult ExistingRes = findExisting(
static_cast<T*
>(
D)))
3017 if (
T *Existing = ExistingRes)
3019 Existing->getCanonicalDecl());
3023 Record.readOMPChildren(
D->Data);
3028 Record.readOMPChildren(
D->Data);
3033 Record.readOMPChildren(
D->Data);
3042 D->setCombinerData(In, Out);
3044 D->setCombiner(Combiner);
3047 D->setInitializerData(Orig, Priv);
3050 D->setInitializer(
Init, IK);
3055 Record.readOMPChildren(
D->Data);
3057 D->VarName =
Record.readDeclarationName();
3076 uint64_t readInt() {
3080 bool readBool() {
return Reader.
readBool(); }
3094 std::string readString() {
3106 VersionTuple readVersionTuple() {
3112 template <
typename T>
T *readDeclAs() {
return Reader.
readDeclAs<
T>(); }
3117 AttrReader
Record(*
this);
3122 Attr *New =
nullptr;
3132 unsigned ParsedKind =
Record.readInt();
3133 unsigned Syntax =
Record.readInt();
3134 unsigned SpellingIndex =
Record.readInt();
3135 bool IsAlignas = (ParsedKind == AttributeCommonInfo::AT_Aligned &&
3137 SpellingIndex == AlignedAttr::Keyword_alignas);
3138 bool IsRegularKeywordAttribute =
Record.readBool();
3143 IsAlignas, IsRegularKeywordAttribute});
3145#include "clang/Serialization/AttrPCHRead.inc"
3147 assert(New &&
"Unable to decode attribute?");
3153 for (
unsigned I = 0,
E =
readInt(); I !=
E; ++I)
3168inline void ASTReader::LoadedDecl(
unsigned Index,
Decl *
D) {
3169 assert(!DeclsLoaded[Index] &&
"Decl loaded twice?");
3170 DeclsLoaded[Index] =
D;
3179bool ASTReader::isConsumerInterestedIn(
Decl *
D) {
3198 if (
const auto *Var = dyn_cast<VarDecl>(
D))
3199 return Var->isFileVarDecl() &&
3201 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(Var));
3202 if (
const auto *
Func = dyn_cast<FunctionDecl>(
D))
3203 return Func->doesThisDeclarationHaveABody() || PendingBodies.count(
D);
3213ASTReader::RecordLocation ASTReader::DeclCursorForID(
GlobalDeclID ID,
3217 unsigned LocalDeclIndex =
ID.getLocalDeclIndex();
3223ASTReader::RecordLocation ASTReader::getLocalBitOffset(uint64_t GlobalOffset) {
3224 auto I = GlobalBitOffsetsMap.find(GlobalOffset);
3226 assert(I != GlobalBitOffsetsMap.end() &&
"Corrupted global bit offsets map");
3227 return RecordLocation(I->second, GlobalOffset - I->second->GlobalBitOffset);
3235ASTDeclReader::getOrFakePrimaryClassDefinition(
ASTReader &Reader,
3238 auto *DD = RD->DefinitionData;
3247 DD =
new (Reader.
getContext())
struct CXXRecordDecl::DefinitionData(RD);
3249 RD->DefinitionData = DD;
3253 Reader.PendingFakeDefinitionData.insert(
3254 std::make_pair(DD, ASTReader::PendingFakeDefinitionKind::Fake));
3257 return DD->Definition;
3264 if (
auto *ND = dyn_cast<NamespaceDecl>(DC))
3265 return ND->getFirstDecl();
3267 if (
auto *RD = dyn_cast<CXXRecordDecl>(DC))
3268 return getOrFakePrimaryClassDefinition(Reader, RD);
3270 if (
auto *RD = dyn_cast<RecordDecl>(DC))
3273 if (
auto *ED = dyn_cast<EnumDecl>(DC))
3276 if (
auto *OID = dyn_cast<ObjCInterfaceDecl>(DC))
3281 if (
auto *TU = dyn_cast<TranslationUnitDecl>(DC))
3287ASTDeclReader::FindExistingResult::~FindExistingResult() {
3290 if (TypedefNameForLinkage) {
3292 Reader.ImportedTypedefNamesForLinkage.insert(
3293 std::make_pair(std::make_pair(DC, TypedefNameForLinkage), New));
3297 if (!AddResult || Existing)
3303 setAnonymousDeclForMerging(Reader, New->getLexicalDeclContext(),
3304 AnonymousDeclNumber, New);
3308 Reader.PendingFakeLookupResults[Name.getAsIdentifierInfo()]
3310 }
else if (
DeclContext *MergeDC = getPrimaryContextForMerging(Reader, DC)) {
3313 MergeDC->makeDeclVisibleInContextImpl(New,
true);
3321 bool IsTypedefNameForLinkage) {
3322 if (!IsTypedefNameForLinkage)
3328 if (
Found->isFromASTFile())
3331 if (
auto *TND = dyn_cast<TypedefNameDecl>(
Found))
3332 return TND->getAnonDeclWithTypedefName(
true);
3341ASTDeclReader::getPrimaryDCForAnonymousDecl(
DeclContext *LexicalDC) {
3343 if (
auto *RD = dyn_cast<CXXRecordDecl>(LexicalDC)) {
3345 return DD ? DD->Definition :
nullptr;
3346 }
else if (
auto *OID = dyn_cast<ObjCInterfaceDecl>(LexicalDC)) {
3347 return OID->getCanonicalDecl()->getDefinition();
3354 if (
auto *FD = dyn_cast<FunctionDecl>(
D))
3355 if (FD->isThisDeclarationADefinition())
3357 if (
auto *MD = dyn_cast<ObjCMethodDecl>(
D))
3358 if (MD->isThisDeclarationADefinition())
3360 if (
auto *RD = dyn_cast<RecordDecl>(
D))
3377 auto &
Previous = Reader.AnonymousDeclarationsForMerging[CanonDC];
3383 auto *PrimaryDC = getPrimaryDCForAnonymousDecl(DC);
3384 if (PrimaryDC && !cast<Decl>(PrimaryDC)->isFromASTFile()) {
3396void ASTDeclReader::setAnonymousDeclForMerging(
ASTReader &Reader,
3399 auto *CanonDC = cast<Decl>(DC)->getCanonicalDecl();
3401 auto &
Previous = Reader.AnonymousDeclarationsForMerging[CanonDC];
3408ASTDeclReader::FindExistingResult ASTDeclReader::findExisting(
NamedDecl *
D) {
3415 FindExistingResult
Result(Reader,
D,
nullptr,
3416 AnonymousDeclNumber, TypedefNameForLinkage);
3423 if (TypedefNameForLinkage) {
3424 auto It = Reader.ImportedTypedefNamesForLinkage.find(
3425 std::make_pair(DC, TypedefNameForLinkage));
3426 if (It != Reader.ImportedTypedefNamesForLinkage.end())
3427 if (
C.isSameEntity(It->second,
D))
3428 return FindExistingResult(Reader,
D, It->second, AnonymousDeclNumber,
3429 TypedefNameForLinkage);
3437 if (
auto *Existing = getAnonymousDeclForMerging(
3439 if (
C.isSameEntity(Existing,
D))
3440 return FindExistingResult(Reader,
D, Existing, AnonymousDeclNumber,
3441 TypedefNameForLinkage);
3448 class UpToDateIdentifierRAII {
3450 bool WasOutToDate =
false;
3461 ~UpToDateIdentifierRAII() {
3465 } UpToDate(Name.getAsIdentifierInfo());
3468 IEnd = IdResolver.
end();
3471 if (
C.isSameEntity(Existing,
D))
3472 return FindExistingResult(Reader,
D, Existing, AnonymousDeclNumber,
3473 TypedefNameForLinkage);
3475 }
else if (
DeclContext *MergeDC = getPrimaryContextForMerging(Reader, DC)) {
3479 if (
C.isSameEntity(Existing,
D))
3480 return FindExistingResult(Reader,
D, Existing, AnonymousDeclNumber,
3481 TypedefNameForLinkage);
3485 return FindExistingResult(Reader);
3497 if (MergedDCIt != Reader.MergedDeclContexts.end() &&
3500 Reader.PendingOdrMergeChecks.push_back(
D);
3502 return FindExistingResult(Reader,
D,
nullptr,
3503 AnonymousDeclNumber, TypedefNameForLinkage);
3506template<
typename DeclT>
3508 return D->RedeclLink.getLatestNotUpdated();
3512 llvm_unreachable(
"getMostRecentDecl on non-redeclarable declaration");
3519#define ABSTRACT_DECL(TYPE)
3520#define DECL(TYPE, BASE) \
3522 return getMostRecentDeclImpl(cast<TYPE##Decl>(D));
3523#include "clang/AST/DeclNodes.inc"
3525 llvm_unreachable(
"unknown decl kind");
3528Decl *ASTReader::getMostRecentExistingDecl(
Decl *
D) {
3536 const auto *IA =
Previous->getAttr<MSInheritanceAttr>();
3538 if (IA && !
D->
hasAttr<MSInheritanceAttr>()) {
3539 NewAttr = cast<InheritableAttr>(IA->clone(Context));
3544 const auto *AA =
Previous->getAttr<AvailabilityAttr>();
3545 if (AA && !
D->
hasAttr<AvailabilityAttr>()) {
3546 NewAttr = AA->
clone(Context);
3553template<
typename DeclT>
3557 D->RedeclLink.setPrevious(cast<DeclT>(
Previous));
3558 D->First = cast<DeclT>(
Previous)->First;
3567 auto *VD =
static_cast<VarDecl *
>(
D);
3568 auto *PrevVD = cast<VarDecl>(
Previous);
3569 D->RedeclLink.setPrevious(PrevVD);
3570 D->First = PrevVD->First;
3579 VD->demoteThisDefinitionToDeclaration();
3596 auto *PrevFD = cast<FunctionDecl>(
Previous);
3598 FD->RedeclLink.setPrevious(PrevFD);
3599 FD->First = PrevFD->First;
3603 if (PrevFD->isInlined() != FD->isInlined()) {
3619 FD->setImplicitlyInline(
true);
3624 if (FPT && PrevFPT) {
3628 bool WasUnresolved =
3630 if (IsUnresolved != WasUnresolved)
3631 Reader.PendingExceptionSpecUpdates.insert(
3632 {Canon, IsUnresolved ? PrevFD : FD});
3638 if (IsUndeduced != WasUndeduced)
3639 Reader.PendingDeducedTypeUpdates.insert(
3640 {cast<FunctionDecl>(Canon),
3641 (IsUndeduced ? PrevFPT : FPT)->getReturnType()});
3648 llvm_unreachable(
"attachPreviousDecl on non-redeclarable declaration");
3653template <
typename ParmDecl>
3656 auto *To = cast<ParmDecl>(ToD);
3657 if (!From->hasDefaultArgument())
3659 To->setInheritedDefaultArgument(Context, From);
3668 assert(FromTP->size() == ToTP->size() &&
"merged mismatched templates?");
3670 for (
unsigned I = 0, N = FromTP->size(); I != N; ++I) {
3671 NamedDecl *FromParam = FromTP->getParam(I);
3674 if (
auto *FTTP = dyn_cast<TemplateTypeParmDecl>(FromParam))
3676 else if (
auto *FNTTP = dyn_cast<NonTypeTemplateParmDecl>(FromParam))
3680 Context, cast<TemplateTemplateParmDecl>(FromParam), ToParam);
3698 if (!isa<VarDecl, FunctionDecl, TagDecl, RedeclarableTemplateDecl>(
Previous))
3706 if (isa<VarTemplateSpecializationDecl>(
Previous))
3708 if (isa<ClassTemplateSpecializationDecl>(
Previous))
3711 Func &&
Func->getTemplateSpecializationInfo())
3728 Reader.PendingWarningForDuplicatedDefsInModuleUnits.push_back(
3738 diag::err_multiple_decl_in_different_modules)
3748#define ABSTRACT_DECL(TYPE)
3749#define DECL(TYPE, BASE) \
3751 attachPreviousDeclImpl(Reader, cast<TYPE##Decl>(D), Previous, Canon); \
3753#include "clang/AST/DeclNodes.inc"
3769 if (
auto *TD = dyn_cast<TemplateDecl>(
D))
3777 mergeInheritableAttributes(Reader,
D,
Previous);
3780template<
typename DeclT>
3782 D->RedeclLink.setLatest(cast<DeclT>(Latest));
3786 llvm_unreachable(
"attachLatestDecl on non-redeclarable declaration");
3790 assert(
D && Latest);
3793#define ABSTRACT_DECL(TYPE)
3794#define DECL(TYPE, BASE) \
3796 attachLatestDeclImpl(cast<TYPE##Decl>(D), Latest); \
3798#include "clang/AST/DeclNodes.inc"
3802template<
typename DeclT>
3804 D->RedeclLink.markIncomplete();
3808 llvm_unreachable(
"markIncompleteDeclChain on non-redeclarable declaration");
3811void ASTReader::markIncompleteDeclChain(
Decl *
D) {
3813#define ABSTRACT_DECL(TYPE)
3814#define DECL(TYPE, BASE) \
3816 ASTDeclReader::markIncompleteDeclChainImpl(cast<TYPE##Decl>(D)); \
3818#include "clang/AST/DeclNodes.inc"
3825 RecordLocation
Loc = DeclCursorForID(ID, DeclLoc);
3826 llvm::BitstreamCursor &DeclsCursor =
Loc.F->DeclsCursor;
3831 ReadingKindTracker ReadingKind(Read_Decl, *
this);
3834 Deserializing ADecl(
this);
3836 auto Fail = [](
const char *what, llvm::Error &&Err) {
3837 llvm::report_fatal_error(Twine(
"ASTReader::readDeclRecord failed ") + what +
3841 if (llvm::Error JumpFailed = DeclsCursor.JumpToBit(
Loc.Offset))
3842 Fail(
"jumping", std::move(JumpFailed));
3847 Fail(
"reading code", MaybeCode.takeError());
3848 unsigned Code = MaybeCode.get();
3854 llvm::report_fatal_error(
3855 Twine(
"ASTReader::readDeclRecord failed reading decl code: ") +
3856 toString(MaybeDeclCode.takeError()));
3858 switch ((
DeclCode)MaybeDeclCode.get()) {
3863 llvm_unreachable(
"Record cannot be de-serialized with readDeclRecord");
3973 bool HasTypeConstraint =
Record.readInt();
3979 bool HasTypeConstraint =
Record.readInt();
3985 bool HasTypeConstraint =
Record.readInt();
3987 Context, ID,
Record.readInt(), HasTypeConstraint);
4076 D = MSGuidDecl::CreateDeserialized(Context, ID);
4079 D = UnnamedGlobalConstantDecl::CreateDeserialized(Context, ID);
4082 D = TemplateParamObjectDecl::CreateDeserialized(Context, ID);
4088 Error(
"attempt to read a C++ base-specifier record as a declaration");
4091 Error(
"attempt to read a C++ ctor initializer record as a declaration");
4100 unsigned NumChildren =
Record.readInt();
4106 unsigned NumClauses =
Record.readInt();
4107 unsigned NumVars =
Record.readInt();
4113 unsigned NumClauses =
Record.readInt();
4122 unsigned NumClauses =
Record.readInt();
4155 assert(
D &&
"Unknown declaration reading AST file");
4156 LoadedDecl(translateGlobalDeclIDToIndex(ID),
D);
4167 if (
auto *DC = dyn_cast<DeclContext>(
D)) {
4168 std::pair<uint64_t, uint64_t> Offsets = Reader.VisitDeclContext(DC);
4173 if (!Offsets.first && !Offsets.second && isa<NamespaceDecl>(
D))
4174 if (
auto Iter = DelayedNamespaceOffsetMap.find(ID);
4175 Iter != DelayedNamespaceOffsetMap.end())
4176 Offsets =
Iter->second;
4178 if (Offsets.first &&
4179 ReadLexicalDeclContextStorage(*
Loc.F, DeclsCursor, Offsets.first, DC))
4181 if (Offsets.second &&
4182 ReadVisibleDeclContextStorage(*
Loc.F, DeclsCursor, Offsets.second, ID))
4188 PendingUpdateRecords.push_back(
4189 PendingUpdateRecord(ID,
D,
true));
4192 if (
auto *
Class = dyn_cast<ObjCInterfaceDecl>(
D))
4195 if (
Class->isThisDeclarationADefinition() ||
4196 PendingDefinitions.count(
Class))
4197 loadObjCCategories(ID,
Class);
4203 PotentiallyInterestingDecls.push_back(
D);
4208void ASTReader::PassInterestingDeclsToConsumer() {
4211 if (PassingDeclsToConsumer)
4216 SaveAndRestore GuardPassingDeclsToConsumer(PassingDeclsToConsumer,
true);
4220 for (
auto ID : EagerlyDeserializedDecls)
4222 EagerlyDeserializedDecls.clear();
4224 auto ConsumingPotentialInterestingDecls = [
this]() {
4225 while (!PotentiallyInterestingDecls.empty()) {
4226 Decl *
D = PotentiallyInterestingDecls.front();
4227 PotentiallyInterestingDecls.pop_front();
4228 if (isConsumerInterestedIn(
D))
4229 PassInterestingDeclToConsumer(
D);
4232 std::deque<Decl *> MaybeInterestingDecls =
4233 std::move(PotentiallyInterestingDecls);
4234 PotentiallyInterestingDecls.clear();
4235 assert(PotentiallyInterestingDecls.empty());
4236 while (!MaybeInterestingDecls.empty()) {
4237 Decl *
D = MaybeInterestingDecls.front();
4238 MaybeInterestingDecls.pop_front();
4244 if (
auto *VD = dyn_cast<VarDecl>(
D);
4245 VD && VD->isFileVarDecl() && !VD->isExternallyVisible())
4247 ConsumingPotentialInterestingDecls();
4248 if (isConsumerInterestedIn(
D))
4249 PassInterestingDeclToConsumer(
D);
4253 ConsumingPotentialInterestingDecls();
4256 auto *RD = cast<CXXRecordDecl>(
GetDecl(ID));
4258 PassVTableToConsumer(RD);
4260 VTablesToEmit.clear();
4263void ASTReader::loadDeclUpdateRecords(PendingUpdateRecord &
Record) {
4269 ProcessingUpdatesRAIIObj ProcessingUpdates(*
this);
4270 DeclUpdateOffsetsMap::iterator UpdI = DeclUpdateOffsets.find(ID);
4272 if (UpdI != DeclUpdateOffsets.end()) {
4273 auto UpdateOffsets = std::move(UpdI->second);
4274 DeclUpdateOffsets.erase(UpdI);
4280 bool WasInteresting =
Record.JustLoaded || isConsumerInterestedIn(
D);
4281 for (
auto &FileAndOffset : UpdateOffsets) {
4283 uint64_t Offset = FileAndOffset.second;
4286 if (llvm::Error JumpFailed =
Cursor.JumpToBit(Offset))
4288 llvm::report_fatal_error(
4289 Twine(
"ASTReader::loadDeclUpdateRecords failed jumping: ") +
4293 llvm::report_fatal_error(
4294 Twine(
"ASTReader::loadDeclUpdateRecords failed reading code: ") +
4296 unsigned Code = MaybeCode.get();
4300 "Expected DECL_UPDATES record!");
4302 llvm::report_fatal_error(
4303 Twine(
"ASTReader::loadDeclUpdateRecords failed reading rec code: ") +
4308 Reader.UpdateDecl(
D);
4312 if (!WasInteresting && isConsumerInterestedIn(
D)) {
4313 PotentiallyInterestingDecls.push_back(
D);
4314 WasInteresting =
true;
4320 auto I = PendingVisibleUpdates.find(ID);
4321 if (I != PendingVisibleUpdates.end()) {
4322 auto VisibleUpdates = std::move(I->second);
4323 PendingVisibleUpdates.erase(I);
4326 for (
const auto &
Update : VisibleUpdates)
4327 Lookups[DC].Table.add(
4335 if (
auto IT = RelatedDeclsMap.find(ID); IT != RelatedDeclsMap.end()) {
4336 for (
auto LID : IT->second)
4338 RelatedDeclsMap.erase(IT);
4343 if (
auto I = PendingSpecializationsUpdates.find(ID);
4344 I != PendingSpecializationsUpdates.end()) {
4345 auto SpecializationUpdates = std::move(I->second);
4346 PendingSpecializationsUpdates.erase(I);
4348 for (
const auto &
Update : SpecializationUpdates)
4353 if (
auto I = PendingPartialSpecializationsUpdates.find(ID);
4354 I != PendingPartialSpecializationsUpdates.end()) {
4355 auto SpecializationUpdates = std::move(I->second);
4356 PendingPartialSpecializationsUpdates.erase(I);
4358 for (
const auto &
Update : SpecializationUpdates)
4363void ASTReader::loadPendingDeclChain(
Decl *FirstLocal, uint64_t LocalOffset) {
4366 if (FirstLocal != CanonDecl) {
4369 *
this, FirstLocal, PrevMostRecent ? PrevMostRecent : CanonDecl,
4380 assert(M &&
"imported decl from no module file");
4384 if (llvm::Error JumpFailed =
Cursor.JumpToBit(LocalOffset))
4385 llvm::report_fatal_error(
4386 Twine(
"ASTReader::loadPendingDeclChain failed jumping: ") +
4392 llvm::report_fatal_error(
4393 Twine(
"ASTReader::loadPendingDeclChain failed reading code: ") +
4395 unsigned Code = MaybeCode.get();
4398 "expected LOCAL_REDECLARATIONS record!");
4400 llvm::report_fatal_error(
4401 Twine(
"ASTReader::loadPendingDeclChain failed reading rec code: ") +
4406 Decl *MostRecent = FirstLocal;
4407 for (
unsigned I = 0, N =
Record.size(); I != N; ++I) {
4408 unsigned Idx = N - I - 1;
4420 class ObjCCategoriesVisitor {
4423 llvm::SmallPtrSetImpl<ObjCCategoryDecl *> &Deserialized;
4425 llvm::DenseMap<DeclarationName, ObjCCategoryDecl *> NameCategoryMap;
4427 unsigned PreviousGeneration;
4431 if (!Deserialized.erase(Cat))
4442 NonEquivalentDecls, StructuralEquivalenceKind::Default,
4446 if (!Ctx.IsEquivalent(Cat, Existing)) {
4451 diag::note_previous_definition);
4453 }
else if (!Existing) {
4468 ObjCCategoriesVisitor(
4470 llvm::SmallPtrSetImpl<ObjCCategoryDecl *> &Deserialized,
4473 InterfaceID(InterfaceID), PreviousGeneration(PreviousGeneration) {
4475 for (
auto *Cat :
Interface->known_categories()) {
4506 LocalID != Result->getDefinitionID()) {
4514 unsigned Offset = Result->Offset;
4517 for (
unsigned I = 0; I != N; ++I)
4526 unsigned PreviousGeneration) {
4527 ObjCCategoriesVisitor Visitor(*
this,
D, CategoriesDeserialized, ID,
4528 PreviousGeneration);
4529 ModuleMgr.
visit(Visitor);
4532template<
typename DeclT,
typename Fn>
4541 for (
auto *Redecl = MostRecent; Redecl && !
Found;
4542 Redecl = Redecl->getPreviousDecl())
4547 for (
auto *Redecl = MostRecent; Redecl !=
D;
4557 auto *RD = cast<CXXRecordDecl>(
D);
4559 assert(MD &&
"couldn't read decl from update record");
4560 Reader.PendingAddedClassMembers.push_back({RD, MD});
4565 auto *Anon = readDeclAs<NamespaceDecl>();
4570 if (!
Record.isModule()) {
4571 if (
auto *TU = dyn_cast<TranslationUnitDecl>(
D))
4572 TU->setAnonymousNamespace(Anon);
4574 cast<NamespaceDecl>(
D)->setAnonymousNamespace(Anon);
4580 auto *VD = cast<VarDecl>(
D);
4581 VD->NonParmVarDeclBits.IsInline =
Record.readInt();
4582 VD->NonParmVarDeclBits.IsInlineSpecified =
Record.readInt();
4589 if (
auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(
D)) {
4590 VTSD->setPointOfInstantiation(POI);
4591 }
else if (
auto *VD = dyn_cast<VarDecl>(
D)) {
4593 assert(MSInfo &&
"No member specialization information");
4596 auto *FD = cast<FunctionDecl>(
D);
4597 if (
auto *FTSInfo = FD->TemplateOrSpecialization
4599 FTSInfo->setPointOfInstantiation(POI);
4601 cast<MemberSpecializationInfo *>(FD->TemplateOrSpecialization)
4602 ->setPointOfInstantiation(POI);
4608 auto *Param = cast<ParmVarDecl>(
D);
4613 auto *DefaultArg =
Record.readExpr();
4617 if (Param->hasUninstantiatedDefaultArg())
4618 Param->setDefaultArg(DefaultArg);
4623 auto *FD = cast<FieldDecl>(
D);
4624 auto *DefaultInit =
Record.readExpr();
4628 if (FD->hasInClassInitializer() && !FD->hasNonNullInClassInitializer()) {
4630 FD->setInClassInitializer(DefaultInit);
4634 FD->removeInClassInitializer();
4640 auto *FD = cast<FunctionDecl>(
D);
4641 if (Reader.PendingBodies[FD]) {
4655 FD->setInnerLocStart(readSourceLocation());
4657 assert(
Record.getIdx() ==
Record.size() &&
"lazy body must be last");
4662 auto *RD = cast<CXXRecordDecl>(
D);
4664 bool HadRealDefinition =
4665 OldDD && (OldDD->Definition != RD ||
4666 !Reader.PendingFakeDefinitionData.count(OldDD));
4670 ReadCXXRecordDefinition(RD,
true);
4673 uint64_t LexicalOffset = ReadLocalOffset();
4674 if (!HadRealDefinition && LexicalOffset) {
4675 Record.readLexicalDeclContextStorage(LexicalOffset, RD);
4676 Reader.PendingFakeDefinitionData.erase(OldDD);
4683 MSInfo->setTemplateSpecializationKind(TSK);
4684 MSInfo->setPointOfInstantiation(POI);
4686 auto *Spec = cast<ClassTemplateSpecializationDecl>(RD);
4687 Spec->setTemplateSpecializationKind(TSK);
4688 Spec->setPointOfInstantiation(POI);
4692 readDeclAs<ClassTemplatePartialSpecializationDecl>();
4694 Record.readTemplateArgumentList(TemplArgs);
4700 if (!isa<ClassTemplatePartialSpecializationDecl *>(
4701 Spec->getSpecializedTemplateOrPartial()))
4702 Spec->setInstantiationOf(PartialSpec, TemplArgList);
4713 Record.readAttributes(Attrs);
4725 auto *Del = readDeclAs<FunctionDecl>();
4727 auto *ThisArg =
Record.readExpr();
4729 if (!
First->OperatorDelete) {
4730 First->OperatorDelete = Del;
4731 First->OperatorDeleteThisArg = ThisArg;
4738 auto ESI =
Record.readExceptionSpecInfo(ExceptionStorage);
4741 auto *FD = cast<FunctionDecl>(
D);
4747 FPT->getReturnType(), FPT->getParamTypes(),
4748 FPT->getExtProtoInfo().withExceptionSpec(ESI)));
4752 Reader.PendingExceptionSpecUpdates.insert(
4753 std::make_pair(FD->getCanonicalDecl(), FD));
4759 auto *FD = cast<FunctionDecl>(
D);
4761 Reader.PendingDeducedTypeUpdates.insert(
4762 {FD->getCanonicalDecl(), DeducedResultType});
4783 readSourceRange()));
4787 auto AllocatorKind =
4788 static_cast<OMPAllocateDeclAttr::AllocatorTypeTy
>(
Record.readInt());
4792 D->
addAttr(OMPAllocateDeclAttr::CreateImplicit(
4793 Reader.
getContext(), AllocatorKind, Allocator, Alignment, SR));
4799 auto *Exported = cast<NamedDecl>(
D);
4802 Reader.PendingMergedDefinitionsToDeduplicate.insert(Exported);
4807 auto MapType =
Record.readEnum<OMPDeclareTargetDeclAttr::MapTypeTy>();
4808 auto DevType =
Record.readEnum<OMPDeclareTargetDeclAttr::DevTypeTy>();
4811 unsigned Level =
Record.readInt();
4812 D->
addAttr(OMPDeclareTargetDeclAttr::CreateImplicit(
4814 readSourceRange()));
4820 Record.readAttributes(Attrs);
4821 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)
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)
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.