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(); }
191 for (
unsigned I = 0, Size =
Record.readInt(); I != Size; ++I)
192 IDs.push_back(readDeclID());
195 Decl *readDecl() {
return Record.readDecl(); }
197 template <
typename T>
T *readDeclAs() {
return Record.readDeclAs<
T>(); }
206 Module *readModule() {
return Record.getSubmodule(readSubmoduleID()); }
209 Decl *LambdaContext =
nullptr,
210 unsigned IndexInLambdaContext = 0);
211 void ReadCXXDefinitionData(
struct CXXRecordDecl::DefinitionData &
Data,
213 unsigned IndexInLambdaContext);
214 void ReadObjCDefinitionData(
struct ObjCInterfaceDecl::DefinitionData &
Data);
215 void ReadObjCDefinitionData(
struct ObjCProtocolDecl::DefinitionData &
Data);
236 class FindExistingResult {
240 bool AddResult =
false;
241 unsigned AnonymousDeclNumber = 0;
245 FindExistingResult(
ASTReader &Reader) : Reader(Reader) {}
248 unsigned AnonymousDeclNumber,
250 : Reader(Reader), New(New), Existing(Existing), AddResult(
true),
251 AnonymousDeclNumber(AnonymousDeclNumber),
252 TypedefNameForLinkage(TypedefNameForLinkage) {}
254 FindExistingResult(FindExistingResult &&
Other)
256 AddResult(
Other.AddResult),
257 AnonymousDeclNumber(
Other.AnonymousDeclNumber),
258 TypedefNameForLinkage(
Other.TypedefNameForLinkage) {
259 Other.AddResult =
false;
262 FindExistingResult &operator=(FindExistingResult &&) =
delete;
263 ~FindExistingResult();
267 void suppress() { AddResult =
false; }
269 operator NamedDecl *()
const {
return Existing; }
271 template <
typename T>
operator T *()
const {
272 return dyn_cast_or_null<T>(Existing);
278 FindExistingResult findExisting(
NamedDecl *
D);
285 ThisDeclID(thisDeclID), ThisDeclLoc(ThisDeclLoc) {}
287 template <
typename T>
295 auto *&LazySpecializations =
D->getCommonPtr()->LazySpecializations;
297 if (
auto &Old = LazySpecializations) {
298 IDs.insert(IDs.end(), Old + 1, Old + 1 + Old[0].getRawValue());
300 IDs.erase(std::unique(IDs.begin(), IDs.end()), IDs.end());
306 std::copy(IDs.begin(), IDs.end(),
Result + 1);
308 LazySpecializations =
Result;
311 template <
typename DeclT>
316 template <
typename DeclT>
323 template <
typename DeclT>
328 template <
typename DeclT>
339 Cat->NextClassCategory = Next;
441 template <
typename T>
444 template <
typename T>
448 RedeclarableResult &Redecl);
485template <
typename DeclT>
class MergedRedeclIterator {
486 DeclT *Start =
nullptr;
487 DeclT *Canonical =
nullptr;
488 DeclT *Current =
nullptr;
491 MergedRedeclIterator() =
default;
492 MergedRedeclIterator(DeclT *Start) : Start(Start), Current(Start) {}
496 MergedRedeclIterator &operator++() {
497 if (Current->isFirstDecl()) {
499 Current = Current->getMostRecentDecl();
501 Current = Current->getPreviousDecl();
507 if (Current == Start || Current == Canonical)
512 friend bool operator!=(
const MergedRedeclIterator &A,
513 const MergedRedeclIterator &B) {
514 return A.Current != B.Current;
520template <
typename DeclT>
521static llvm::iterator_range<MergedRedeclIterator<DeclT>>
523 return llvm::make_range(MergedRedeclIterator<DeclT>(
D),
524 MergedRedeclIterator<DeclT>());
527uint64_t ASTDeclReader::GetCurrentCursorOffset() {
528 return Loc.F->DeclsCursor.GetCurrentBitNo() + Loc.F->GlobalBitOffset;
533 Reader.DefinitionSource[FD] =
534 Loc.F->Kind == ModuleKind::MK_MainFile ||
537 if (
auto *CD = dyn_cast<CXXConstructorDecl>(FD)) {
538 CD->setNumCtorInitializers(
Record.readInt());
539 if (CD->getNumCtorInitializers())
540 CD->CtorInitializers = ReadGlobalOffset();
543 Reader.PendingBodies[FD] = GetCurrentCursorOffset();
552 IsDeclMarkedUsed =
false;
554 if (
auto *DD = dyn_cast<DeclaratorDecl>(
D)) {
555 if (
auto *TInfo = DD->getTypeSourceInfo())
556 Record.readTypeLoc(TInfo->getTypeLoc());
559 if (
auto *TD = dyn_cast<TypeDecl>(
D)) {
565 if (NamedDeclForTagDecl.
isValid())
566 cast<TagDecl>(
D)->TypedefNameDeclOrQualifier =
567 cast<TypedefNameDecl>(Reader.
GetDecl(NamedDeclForTagDecl));
568 }
else if (
auto *ID = dyn_cast<ObjCInterfaceDecl>(
D)) {
571 }
else if (
auto *FD = dyn_cast<FunctionDecl>(
D)) {
575 }
else if (
auto *VD = dyn_cast<VarDecl>(
D)) {
577 }
else if (
auto *FD = dyn_cast<FieldDecl>(
D)) {
578 if (FD->hasInClassInitializer() &&
Record.readInt()) {
579 FD->setLazyInClassInitializer(
LazyDeclStmtPtr(GetCurrentCursorOffset()));
586 auto ModuleOwnership =
590 IsDeclMarkedUsed |=
D->Used;
593 bool HasStandaloneLexicalDC = DeclBits.
getNextBit();
600 isa<ParmVarDecl, ObjCTypeParamDecl>(
D)) {
607 GlobalDeclID SemaDCIDForTemplateParmDecl = readDeclID();
610 if (LexicalDCIDForTemplateParmDecl.
isInvalid())
611 LexicalDCIDForTemplateParmDecl = SemaDCIDForTemplateParmDecl;
612 Reader.addPendingDeclContextInfo(
D,
613 SemaDCIDForTemplateParmDecl,
614 LexicalDCIDForTemplateParmDecl);
617 auto *SemaDC = readDeclAs<DeclContext>();
619 HasStandaloneLexicalDC ? readDeclAs<DeclContext>() :
nullptr;
625 if (
auto *RD = dyn_cast<CXXRecordDecl>(SemaDC))
626 MergedSemaDC = getOrFakePrimaryClassDefinition(Reader, RD);
628 MergedSemaDC = Reader.MergedDeclContexts.lookup(SemaDC);
631 D->setDeclContextsImpl(MergedSemaDC ? MergedSemaDC : SemaDC, LexicalDC,
638 Record.readAttributes(Attrs);
649 switch (ModuleOwnership) {
675 Reader.HiddenNamesMap[Owner].push_back(
D);
677 }
else if (ModulePrivate) {
686 std::string Arg = readString();
687 memcpy(
D->getTrailingObjects<
char>(), Arg.data(), Arg.size());
688 D->getTrailingObjects<
char>()[Arg.size()] =
'\0';
694 std::string Name = readString();
695 memcpy(
D->getTrailingObjects<
char>(), Name.data(), Name.size());
696 D->getTrailingObjects<
char>()[Name.size()] =
'\0';
698 D->ValueStart = Name.size() + 1;
699 std::string
Value = readString();
700 memcpy(
D->getTrailingObjects<
char>() +
D->ValueStart,
Value.data(),
702 D->getTrailingObjects<
char>()[
D->ValueStart +
Value.size()] =
'\0';
706 llvm_unreachable(
"Translation units are not serialized");
712 AnonymousDeclNumber =
Record.readInt();
719 DeferredTypeID =
Record.getGlobalTypeID(
Record.readInt());
746 if (
auto *Template = readDeclAs<TypeAliasTemplateDecl>())
773 Record.readQualifierInfo(*Info);
774 TD->TypedefNameDeclOrQualifier = Info;
778 NamedDeclForTagDecl = readDeclID();
779 TypedefNameForLinkage =
Record.readIdentifier();
782 llvm_unreachable(
"unexpected tag info kind");
785 if (!isa<CXXRecordDecl>(TD))
799 ED->setNumPositiveBits(EnumDeclBits.
getNextBits(8));
800 ED->setNumNegativeBits(EnumDeclBits.
getNextBits(8));
805 ED->setHasODRHash(
true);
806 ED->ODRHash =
Record.readInt();
823 Reader.MergedDeclContexts.insert(std::make_pair(ED, OldDef));
830 Reader.PendingEnumOdrMergeFailures[OldDef].push_back(ED);
836 if (
auto *InstED = readDeclAs<EnumDecl>()) {
839 ED->setInstantiationOfMemberEnum(Reader.
getContext(), InstED, TSK);
867 RD->setODRHash(
Record.readInt());
873 RecordDecl *&OldDef = Reader.RecordDefinitions[Canon];
885 Reader.MergedDeclContexts.insert(std::make_pair(RD, OldDef));
889 Reader.PendingRecordOdrMergeFailures[OldDef].push_back(RD);
901 if (isa<FunctionDecl, VarDecl>(VD))
902 DeferredTypeID =
Record.getGlobalTypeID(
Record.readInt());
919 auto *Info =
new (Reader.
getContext()) DeclaratorDecl::ExtInfo();
920 Record.readQualifierInfo(*Info);
921 Info->TrailingRequiresClause =
Record.readExpr();
926 TSIType.
isNull() ? nullptr
942 auto *Template = readDeclAs<FunctionTemplateDecl>();
948 auto *InstFD = readDeclAs<FunctionDecl>();
951 FD->setInstantiationOfMemberFunction(Reader.
getContext(), InstFD, TSK);
956 auto *Template = readDeclAs<FunctionTemplateDecl>();
961 Record.readTemplateArgumentList(TemplArgs,
true);
965 bool HasTemplateArgumentsAsWritten =
Record.readBool();
966 if (HasTemplateArgumentsAsWritten)
967 Record.readTemplateArgumentListInfo(TemplArgsWritten);
977 auto *FD = readDeclAs<FunctionDecl>();
987 C, FD, Template, TSK, TemplArgList,
988 HasTemplateArgumentsAsWritten ? &TemplArgsWritten :
nullptr, POI,
990 FD->TemplateOrSpecialization = FTInfo;
995 auto *CanonTemplate = readDeclAs<FunctionTemplateDecl>();
1001 llvm::FoldingSetNodeID ID;
1003 void *InsertPos =
nullptr;
1011 "already deserialized this template specialization");
1020 unsigned NumCandidates =
Record.readInt();
1021 while (NumCandidates--)
1022 Candidates.
addDecl(readDeclAs<NamedDecl>());
1026 bool HasTemplateArgumentsAsWritten =
Record.readBool();
1027 if (HasTemplateArgumentsAsWritten)
1028 Record.readTemplateArgumentListInfo(TemplArgsWritten);
1032 HasTemplateArgumentsAsWritten ? &TemplArgsWritten :
nullptr);
1051 Reader.PendingDeducedFunctionTypes.push_back({FD, DeferredTypeID});
1073 const bool Pure = FunctionDeclBits.
getNextBit();
1091 FD->EndRangeLoc = readSourceLocation();
1095 FD->ODRHash =
Record.readInt();
1096 FD->setHasODRHash(
true);
1102 if (
auto Info =
Record.readInt()) {
1103 bool HasMessage = Info & 2;
1105 HasMessage ? cast<StringLiteral>(
Record.readExpr()) :
nullptr;
1107 unsigned NumLookups =
Record.readInt();
1109 for (
unsigned I = 0; I != NumLookups; ++I) {
1117 Reader.
getContext(), Lookups, DeletedMessage));
1128 auto merge = [
this, &Redecl, FD](
auto &&F) {
1129 auto *Existing = cast_or_null<FunctionDecl>(Redecl.getKnownMergeTarget());
1130 RedeclarableResult NewRedecl(Existing ? F(Existing) :
nullptr,
1131 Redecl.getFirstID(), Redecl.isKeyDecl());
1149 unsigned NumParams =
Record.readInt();
1151 Params.reserve(NumParams);
1152 for (
unsigned I = 0; I != NumParams; ++I)
1153 Params.push_back(readDeclAs<ParmVarDecl>());
1162 Reader.PendingBodies[MD] = GetCurrentCursorOffset();
1165 MD->
setCmdDecl(readDeclAs<ImplicitParamDecl>());
1178 readDeclAs<ObjCMethodDecl>());
1186 MD->DeclEndLoc = readSourceLocation();
1187 unsigned NumParams =
Record.readInt();
1189 Params.reserve(NumParams);
1190 for (
unsigned I = 0; I != NumParams; ++I)
1191 Params.push_back(readDeclAs<ParmVarDecl>());
1194 unsigned NumStoredSelLocs =
Record.readInt();
1196 SelLocs.reserve(NumStoredSelLocs);
1197 for (
unsigned i = 0; i != NumStoredSelLocs; ++i)
1198 SelLocs.push_back(readSourceLocation());
1200 MD->setParamsAndSelLocs(Reader.
getContext(), Params, SelLocs);
1206 D->Variance =
Record.readInt();
1208 D->VarianceLoc = readSourceLocation();
1209 D->ColonLoc = readSourceLocation();
1219 unsigned numParams =
Record.readInt();
1224 typeParams.reserve(numParams);
1225 for (
unsigned i = 0; i != numParams; ++i) {
1226 auto *typeParam = readDeclAs<ObjCTypeParamDecl>();
1230 typeParams.push_back(typeParam);
1237 typeParams, rAngleLoc);
1240void ASTDeclReader::ReadObjCDefinitionData(
1241 struct ObjCInterfaceDecl::DefinitionData &
Data) {
1243 Data.SuperClassTInfo = readTypeSourceInfo();
1245 Data.EndLoc = readSourceLocation();
1246 Data.HasDesignatedInitializers =
Record.readInt();
1248 Data.HasODRHash =
true;
1251 unsigned NumProtocols =
Record.readInt();
1253 Protocols.reserve(NumProtocols);
1254 for (
unsigned I = 0; I != NumProtocols; ++I)
1255 Protocols.push_back(readDeclAs<ObjCProtocolDecl>());
1257 ProtoLocs.reserve(NumProtocols);
1258 for (
unsigned I = 0; I != NumProtocols; ++I)
1259 ProtoLocs.push_back(readSourceLocation());
1260 Data.ReferencedProtocols.set(Protocols.data(), NumProtocols, ProtoLocs.data(),
1264 NumProtocols =
Record.readInt();
1266 Protocols.reserve(NumProtocols);
1267 for (
unsigned I = 0; I != NumProtocols; ++I)
1268 Protocols.push_back(readDeclAs<ObjCProtocolDecl>());
1269 Data.AllReferencedProtocols.set(Protocols.data(), NumProtocols,
1275 struct ObjCInterfaceDecl::DefinitionData &DD =
D->data();
1276 if (DD.Definition == NewDD.Definition)
1279 Reader.MergedDeclContexts.insert(
1280 std::make_pair(NewDD.Definition, DD.Definition));
1283 if (
D->getODRHash() != NewDD.ODRHash)
1284 Reader.PendingObjCInterfaceOdrMergeFailures[DD.Definition].push_back(
1285 {NewDD.Definition, &NewDD});
1291 DeferredTypeID =
Record.getGlobalTypeID(
Record.readInt());
1297 ID->allocateDefinitionData();
1299 ReadObjCDefinitionData(
ID->data());
1301 if (Canon->Data.getPointer()) {
1305 ID->Data = Canon->Data;
1309 ID->getCanonicalDecl()->Data =
ID->Data;
1312 ID->setIvarList(
nullptr);
1316 Reader.PendingDefinitions.insert(
ID);
1319 Reader.ObjCClassesLoaded.push_back(
ID);
1321 ID->Data =
ID->getCanonicalDecl()->Data;
1330 bool synth =
Record.readInt();
1345 if (PrevIvar && PrevIvar != IVD) {
1346 auto *ParentExt = dyn_cast<ObjCCategoryDecl>(IVD->
getDeclContext());
1347 auto *PrevParentExt =
1349 if (ParentExt && PrevParentExt) {
1353 .PendingObjCExtensionIvarRedeclarations[std::make_pair(ParentExt,
1355 .push_back(std::make_pair(IVD, PrevIvar));
1356 }
else if (ParentExt || PrevParentExt) {
1367void ASTDeclReader::ReadObjCDefinitionData(
1368 struct ObjCProtocolDecl::DefinitionData &
Data) {
1369 unsigned NumProtoRefs =
Record.readInt();
1371 ProtoRefs.reserve(NumProtoRefs);
1372 for (
unsigned I = 0; I != NumProtoRefs; ++I)
1373 ProtoRefs.push_back(readDeclAs<ObjCProtocolDecl>());
1375 ProtoLocs.reserve(NumProtoRefs);
1376 for (
unsigned I = 0; I != NumProtoRefs; ++I)
1377 ProtoLocs.push_back(readSourceLocation());
1378 Data.ReferencedProtocols.set(ProtoRefs.data(), NumProtoRefs,
1381 Data.HasODRHash =
true;
1386 struct ObjCProtocolDecl::DefinitionData &DD =
D->data();
1387 if (DD.Definition == NewDD.Definition)
1390 Reader.MergedDeclContexts.insert(
1391 std::make_pair(NewDD.Definition, DD.Definition));
1394 if (
D->getODRHash() != NewDD.ODRHash)
1395 Reader.PendingObjCProtocolOdrMergeFailures[DD.Definition].push_back(
1396 {NewDD.Definition, &NewDD});
1406 PD->allocateDefinitionData();
1408 ReadObjCDefinitionData(PD->data());
1411 if (Canon->Data.getPointer()) {
1415 PD->Data = Canon->Data;
1422 Reader.PendingDefinitions.insert(PD);
1441 Reader.CategoriesDeserialized.insert(CD);
1443 CD->ClassInterface = readDeclAs<ObjCInterfaceDecl>();
1445 unsigned NumProtoRefs =
Record.readInt();
1447 ProtoRefs.reserve(NumProtoRefs);
1448 for (
unsigned I = 0; I != NumProtoRefs; ++I)
1449 ProtoRefs.push_back(readDeclAs<ObjCProtocolDecl>());
1451 ProtoLocs.reserve(NumProtoRefs);
1452 for (
unsigned I = 0; I != NumProtoRefs; ++I)
1453 ProtoLocs.push_back(readSourceLocation());
1471 D->setAtLoc(readSourceLocation());
1472 D->setLParenLoc(readSourceLocation());
1477 D->setPropertyAttributesAsWritten(
1479 D->setPropertyImplementation(
1487 D->setGetterMethodDecl(readDeclAs<ObjCMethodDecl>());
1488 D->setSetterMethodDecl(readDeclAs<ObjCMethodDecl>());
1489 D->setPropertyIvarDecl(readDeclAs<ObjCIvarDecl>());
1494 D->setClassInterface(readDeclAs<ObjCInterfaceDecl>());
1499 D->CategoryNameLoc = readSourceLocation();
1504 D->setSuperClass(readDeclAs<ObjCInterfaceDecl>());
1505 D->SuperLoc = readSourceLocation();
1506 D->setIvarLBraceLoc(readSourceLocation());
1507 D->setIvarRBraceLoc(readSourceLocation());
1508 D->setHasNonZeroConstructors(
Record.readInt());
1509 D->setHasDestructors(
Record.readInt());
1510 D->NumIvarInitializers =
Record.readInt();
1511 if (
D->NumIvarInitializers)
1512 D->IvarInitializers = ReadGlobalOffset();
1517 D->setAtLoc(readSourceLocation());
1518 D->setPropertyDecl(readDeclAs<ObjCPropertyDecl>());
1519 D->PropertyIvarDecl = readDeclAs<ObjCIvarDecl>();
1520 D->IvarLoc = readSourceLocation();
1521 D->setGetterMethodDecl(readDeclAs<ObjCMethodDecl>());
1522 D->setSetterMethodDecl(readDeclAs<ObjCMethodDecl>());
1523 D->setGetterCXXConstructor(
Record.readExpr());
1524 D->setSetterCXXAssignment(
Record.readExpr());
1529 FD->Mutable =
Record.readInt();
1531 unsigned Bits =
Record.readInt();
1532 FD->StorageKind = Bits >> 1;
1533 if (FD->StorageKind == FieldDecl::ISK_CapturedVLAType)
1535 cast<VariableArrayType>(
Record.readType().getTypePtr());
1540 if (
auto *Tmpl = readDeclAs<FieldDecl>())
1548 PD->GetterId =
Record.readIdentifier();
1549 PD->SetterId =
Record.readIdentifier();
1554 D->PartVal.Part1 =
Record.readInt();
1555 D->PartVal.Part2 =
Record.readInt();
1556 D->PartVal.Part3 =
Record.readInt();
1557 for (
auto &
C :
D->PartVal.Part4And5)
1568 D->Value =
Record.readAPValue();
1572 Reader.
getContext().UnnamedGlobalConstantDecls.GetOrInsertNode(
D))
1578 D->Value =
Record.readAPValue();
1583 Reader.
getContext().TemplateParamObjectDecls.GetOrInsertNode(
D))
1590 FD->ChainingSize =
Record.readInt();
1591 assert(FD->ChainingSize >= 2 &&
"Anonymous chaining must be >= 2");
1594 for (
unsigned I = 0; I != FD->ChainingSize; ++I)
1595 FD->Chaining[I] = readDeclAs<NamedDecl>();
1606 bool DefGeneratedInModule = VarDeclBits.
getNextBit();
1611 bool HasDeducedType =
false;
1612 if (!isa<ParmVarDecl>(VD)) {
1638 Reader.PendingDeducedVarTypes.push_back({VD, DeferredTypeID});
1650 if (DefGeneratedInModule) {
1651 Reader.DefinitionSource[VD] =
1652 Loc.F->Kind == ModuleKind::MK_MainFile ||
1656 if (VD->
hasAttr<BlocksAttr>()) {
1663 VarNotTemplate = 0, VarTemplate, StaticDataMemberSpecialization
1665 switch ((VarKind)
Record.readInt()) {
1666 case VarNotTemplate:
1669 if (!isa<ParmVarDecl>(VD) && !isa<ImplicitParamDecl>(VD) &&
1670 !isa<VarTemplateSpecializationDecl>(VD))
1677 case StaticDataMemberSpecialization: {
1678 auto *Tmpl = readDeclAs<VarDecl>();
1691 if (uint64_t Val =
Record.readInt()) {
1705 Eval->
Value = GetCurrentCursorOffset();
1716 unsigned scopeIndex =
Record.readInt();
1718 unsigned isObjCMethodParam = ParmVarDeclBits.
getNextBit();
1719 unsigned scopeDepth = ParmVarDeclBits.
getNextBits(7);
1720 unsigned declQualifier = ParmVarDeclBits.
getNextBits(7);
1721 if (isObjCMethodParam) {
1722 assert(scopeDepth == 0);
1735 PD->ExplicitObjectParameterIntroducerLoc =
Record.readSourceLocation();
1743 auto **BDs = DD->getTrailingObjects<
BindingDecl *>();
1744 for (
unsigned I = 0; I != DD->NumBindings; ++I) {
1745 BDs[I] = readDeclAs<BindingDecl>();
1746 BDs[I]->setDecomposedDecl(DD);
1752 BD->Binding =
Record.readExpr();
1763 D->Statement =
Record.readStmt();
1770 unsigned NumParams =
Record.readInt();
1772 Params.reserve(NumParams);
1773 for (
unsigned I = 0; I != NumParams; ++I)
1774 Params.push_back(readDeclAs<ParmVarDecl>());
1783 bool capturesCXXThis =
Record.readInt();
1784 unsigned numCaptures =
Record.readInt();
1786 captures.reserve(numCaptures);
1787 for (
unsigned i = 0; i != numCaptures; ++i) {
1788 auto *
decl = readDeclAs<VarDecl>();
1789 unsigned flags =
Record.readInt();
1790 bool byRef = (flags & 1);
1791 bool nested = (flags & 2);
1792 Expr *copyExpr = ((flags & 4) ?
Record.readExpr() :
nullptr);
1801 unsigned ContextParamPos =
Record.readInt();
1804 for (
unsigned I = 0; I < CD->NumParams; ++I) {
1805 if (I != ContextParamPos)
1806 CD->
setParam(I, readDeclAs<ImplicitParamDecl>());
1815 D->setExternLoc(readSourceLocation());
1816 D->setRBraceLoc(readSourceLocation());
1821 D->RBraceLoc = readSourceLocation();
1826 D->setLocStart(readSourceLocation());
1836 D->LocStart = readSourceLocation();
1837 D->RBraceLoc = readSourceLocation();
1844 if (Redecl.getFirstID() == ThisDeclID)
1845 AnonNamespace = readDeclID();
1849 if (AnonNamespace.
isValid()) {
1853 auto *Anon = cast<NamespaceDecl>(Reader.
GetDecl(AnonNamespace));
1855 D->setAnonymousNamespace(Anon);
1862 D->IsCBuffer =
Record.readBool();
1863 D->KwLoc = readSourceLocation();
1864 D->LBraceLoc = readSourceLocation();
1865 D->RBraceLoc = readSourceLocation();
1871 D->NamespaceLoc = readSourceLocation();
1872 D->IdentLoc = readSourceLocation();
1873 D->QualifierLoc =
Record.readNestedNameSpecifierLoc();
1874 D->Namespace = readDeclAs<NamedDecl>();
1880 D->setUsingLoc(readSourceLocation());
1881 D->QualifierLoc =
Record.readNestedNameSpecifierLoc();
1882 D->DNLoc =
Record.readDeclarationNameLoc(
D->getDeclName());
1883 D->FirstUsingShadow.setPointer(readDeclAs<UsingShadowDecl>());
1884 D->setTypename(
Record.readInt());
1885 if (
auto *Pattern = readDeclAs<NamedDecl>())
1892 D->setUsingLoc(readSourceLocation());
1893 D->setEnumLoc(readSourceLocation());
1894 D->setEnumType(
Record.readTypeSourceInfo());
1895 D->FirstUsingShadow.setPointer(readDeclAs<UsingShadowDecl>());
1896 if (
auto *Pattern = readDeclAs<UsingEnumDecl>())
1903 D->InstantiatedFrom = readDeclAs<NamedDecl>();
1904 auto **Expansions =
D->getTrailingObjects<
NamedDecl *>();
1905 for (
unsigned I = 0; I !=
D->NumExpansions; ++I)
1906 Expansions[I] = readDeclAs<NamedDecl>();
1913 D->Underlying = readDeclAs<NamedDecl>();
1915 D->UsingOrNextShadow = readDeclAs<NamedDecl>();
1916 auto *Pattern = readDeclAs<UsingShadowDecl>();
1925 D->NominatedBaseClassShadowDecl = readDeclAs<ConstructorUsingShadowDecl>();
1926 D->ConstructedBaseClassShadowDecl = readDeclAs<ConstructorUsingShadowDecl>();
1927 D->IsVirtual =
Record.readInt();
1932 D->UsingLoc = readSourceLocation();
1933 D->NamespaceLoc = readSourceLocation();
1934 D->QualifierLoc =
Record.readNestedNameSpecifierLoc();
1935 D->NominatedNamespace = readDeclAs<NamedDecl>();
1936 D->CommonAncestor = readDeclAs<DeclContext>();
1941 D->setUsingLoc(readSourceLocation());
1942 D->QualifierLoc =
Record.readNestedNameSpecifierLoc();
1943 D->DNLoc =
Record.readDeclarationNameLoc(
D->getDeclName());
1944 D->EllipsisLoc = readSourceLocation();
1951 D->TypenameLocation = readSourceLocation();
1952 D->QualifierLoc =
Record.readNestedNameSpecifierLoc();
1953 D->EllipsisLoc = readSourceLocation();
1962void ASTDeclReader::ReadCXXDefinitionData(
1964 Decl *LambdaContext,
unsigned IndexInLambdaContext) {
1968#define FIELD(Name, Width, Merge) \
1969 if (!CXXRecordDeclBits.canGetNextNBits(Width)) \
1970 CXXRecordDeclBits.updateValue(Record.readInt()); \
1971 Data.Name = CXXRecordDeclBits.getNextBits(Width);
1973#include "clang/AST/CXXRecordDeclDefinitionBits.def"
1978 Data.HasODRHash =
true;
1981 Reader.DefinitionSource[
D] =
1982 Loc.F->Kind == ModuleKind::MK_MainFile ||
1987 Data.ComputedVisibleConversions =
Record.readInt();
1988 if (
Data.ComputedVisibleConversions)
1989 Record.readUnresolvedSet(
Data.VisibleConversions);
1990 assert(
Data.Definition &&
"Data.Definition should be already set!");
1992 if (!
Data.IsLambda) {
1993 assert(!LambdaContext && !IndexInLambdaContext &&
1994 "given lambda context for non-lambda");
1998 Data.Bases = ReadGlobalOffset();
2002 Data.VBases = ReadGlobalOffset();
2008 auto &Lambda =
static_cast<CXXRecordDecl::LambdaDefinitionData &
>(
Data);
2011 Lambda.DependencyKind = LambdaBits.getNextBits(2);
2012 Lambda.IsGenericLambda = LambdaBits.getNextBit();
2013 Lambda.CaptureDefault = LambdaBits.getNextBits(2);
2014 Lambda.NumCaptures = LambdaBits.getNextBits(15);
2015 Lambda.HasKnownInternalLinkage = LambdaBits.getNextBit();
2017 Lambda.NumExplicitCaptures =
Record.readInt();
2018 Lambda.ManglingNumber =
Record.readInt();
2019 if (
unsigned DeviceManglingNumber =
Record.readInt())
2020 Reader.
getContext().DeviceLambdaManglingNumbers[
D] = DeviceManglingNumber;
2021 Lambda.IndexInContext = IndexInLambdaContext;
2022 Lambda.ContextDecl = LambdaContext;
2024 if (Lambda.NumCaptures) {
2026 Lambda.NumCaptures);
2027 Lambda.AddCaptureList(Reader.
getContext(), ToCapture);
2029 Lambda.MethodTyInfo = readTypeSourceInfo();
2030 for (
unsigned I = 0, N = Lambda.NumCaptures; I != N; ++I) {
2033 bool IsImplicit = CaptureBits.getNextBit();
2046 auto *Var = readDeclAs<ValueDecl>();
2048 new (ToCapture)
Capture(
Loc, IsImplicit,
Kind, Var, EllipsisLoc);
2057 CXXRecordDecl *
D,
struct CXXRecordDecl::DefinitionData &&MergeDD) {
2058 assert(
D->DefinitionData &&
2059 "merging class definition into non-definition");
2060 auto &DD = *
D->DefinitionData;
2062 if (DD.Definition != MergeDD.Definition) {
2064 Reader.MergedDeclContexts.insert(std::make_pair(MergeDD.Definition,
2066 Reader.PendingDefinitions.erase(MergeDD.Definition);
2067 MergeDD.Definition->setCompleteDefinition(
false);
2069 assert(!Reader.Lookups.contains(MergeDD.Definition) &&
2070 "already loaded pending lookups for merged definition");
2073 auto PFDI = Reader.PendingFakeDefinitionData.find(&DD);
2074 if (PFDI != Reader.PendingFakeDefinitionData.end() &&
2075 PFDI->second == ASTReader::PendingFakeDefinitionKind::Fake) {
2078 assert(!DD.IsLambda && !MergeDD.IsLambda &&
"faked up lambda definition?");
2079 PFDI->second = ASTReader::PendingFakeDefinitionKind::FakeLoaded;
2083 auto *Def = DD.Definition;
2084 DD = std::move(MergeDD);
2085 DD.Definition = Def;
2089 bool DetectedOdrViolation =
false;
2091 #define FIELD(Name, Width, Merge) Merge(Name)
2092 #define MERGE_OR(Field) DD.Field |= MergeDD.Field;
2093 #define NO_MERGE(Field) \
2094 DetectedOdrViolation |= DD.Field != MergeDD.Field; \
2096 #include "clang/AST/CXXRecordDeclDefinitionBits.def"
2101 if (DD.NumBases != MergeDD.NumBases || DD.NumVBases != MergeDD.NumVBases)
2102 DetectedOdrViolation =
true;
2108 if (MergeDD.ComputedVisibleConversions && !DD.ComputedVisibleConversions) {
2109 DD.VisibleConversions = std::move(MergeDD.VisibleConversions);
2110 DD.ComputedVisibleConversions =
true;
2117 auto &Lambda1 =
static_cast<CXXRecordDecl::LambdaDefinitionData &
>(DD);
2118 auto &Lambda2 =
static_cast<CXXRecordDecl::LambdaDefinitionData &
>(MergeDD);
2119 DetectedOdrViolation |= Lambda1.DependencyKind != Lambda2.DependencyKind;
2120 DetectedOdrViolation |= Lambda1.IsGenericLambda != Lambda2.IsGenericLambda;
2121 DetectedOdrViolation |= Lambda1.CaptureDefault != Lambda2.CaptureDefault;
2122 DetectedOdrViolation |= Lambda1.NumCaptures != Lambda2.NumCaptures;
2123 DetectedOdrViolation |=
2124 Lambda1.NumExplicitCaptures != Lambda2.NumExplicitCaptures;
2125 DetectedOdrViolation |=
2126 Lambda1.HasKnownInternalLinkage != Lambda2.HasKnownInternalLinkage;
2127 DetectedOdrViolation |= Lambda1.ManglingNumber != Lambda2.ManglingNumber;
2129 if (Lambda1.NumCaptures && Lambda1.NumCaptures == Lambda2.NumCaptures) {
2130 for (
unsigned I = 0, N = Lambda1.NumCaptures; I != N; ++I) {
2135 Lambda1.AddCaptureList(Reader.
getContext(), Lambda2.Captures.front());
2143 if (
D->getODRHash() != MergeDD.ODRHash) {
2144 DetectedOdrViolation =
true;
2147 if (DetectedOdrViolation)
2148 Reader.PendingOdrMergeFailures[DD.Definition].push_back(
2149 {MergeDD.Definition, &MergeDD});
2153 Decl *LambdaContext,
2154 unsigned IndexInLambdaContext) {
2155 struct CXXRecordDecl::DefinitionData *DD;
2160 bool IsLambda =
Record.readInt();
2161 assert(!(IsLambda &&
Update) &&
2162 "lambda definition should not be added by update record");
2164 DD =
new (
C) CXXRecordDecl::LambdaDefinitionData(
2167 DD =
new (
C)
struct CXXRecordDecl::DefinitionData(
D);
2173 if (!Canon->DefinitionData)
2174 Canon->DefinitionData = DD;
2175 D->DefinitionData = Canon->DefinitionData;
2176 ReadCXXDefinitionData(*DD,
D, LambdaContext, IndexInLambdaContext);
2181 if (Canon->DefinitionData != DD) {
2187 D->setCompleteDefinition(
true);
2193 Reader.PendingDefinitions.insert(
D);
2202 CXXRecNotTemplate = 0,
2204 CXXRecMemberSpecialization,
2208 Decl *LambdaContext =
nullptr;
2209 unsigned IndexInLambdaContext = 0;
2211 switch ((CXXRecKind)
Record.readInt()) {
2212 case CXXRecNotTemplate:
2214 if (!isa<ClassTemplateSpecializationDecl>(
D))
2217 case CXXRecTemplate: {
2219 auto *Template = readDeclAs<ClassTemplateDecl>();
2220 D->TemplateOrInstantiation = Template;
2221 if (!Template->getTemplatedDecl()) {
2232 case CXXRecMemberSpecialization: {
2233 auto *RD = readDeclAs<CXXRecordDecl>();
2238 D->TemplateOrInstantiation = MSI;
2243 LambdaContext = readDecl();
2245 IndexInLambdaContext =
Record.readInt();
2247 MergeImpl.
mergeLambda(
D, Redecl, *LambdaContext, IndexInLambdaContext);
2256 bool WasDefinition =
Record.readInt();
2258 ReadCXXRecordDefinition(
D,
false, LambdaContext,
2259 IndexInLambdaContext);
2266 if (WasDefinition) {
2268 if (KeyFn.
isValid() &&
D->isCompleteDefinition())
2279 D->setExplicitSpecifier(
Record.readExplicitSpec());
2280 D->Ctor = readDeclAs<CXXConstructorDecl>();
2282 D->setDeductionCandidateKind(
2289 unsigned NumOverridenMethods =
Record.readInt();
2291 while (NumOverridenMethods--) {
2294 if (
auto *MD = readDeclAs<CXXMethodDecl>())
2300 Record.skipInts(NumOverridenMethods);
2307 D->setExplicitSpecifier(
Record.readExplicitSpec());
2308 if (
D->isInheritingConstructor()) {
2309 auto *Shadow = readDeclAs<ConstructorUsingShadowDecl>();
2310 auto *Ctor = readDeclAs<CXXConstructorDecl>();
2321 if (
auto *OperatorDelete = readDeclAs<FunctionDecl>()) {
2323 auto *ThisArg =
Record.readExpr();
2325 if (!Canon->OperatorDelete) {
2326 Canon->OperatorDelete = OperatorDelete;
2327 Canon->OperatorDeleteThisArg = ThisArg;
2333 D->setExplicitSpecifier(
Record.readExplicitSpec());
2339 D->ImportedModule = readModule();
2340 D->setImportComplete(
Record.readInt());
2342 for (
unsigned I = 0, N =
Record.back(); I != N; ++I)
2343 StoredLocs[I] = readSourceLocation();
2349 D->setColonLoc(readSourceLocation());
2355 D->Friend = readDeclAs<NamedDecl>();
2357 D->Friend = readTypeSourceInfo();
2358 for (
unsigned i = 0; i !=
D->NumTPLists; ++i)
2360 Record.readTemplateParameterList();
2362 D->UnsupportedFriend = (
Record.readInt() != 0);
2363 D->FriendLoc = readSourceLocation();
2364 D->EllipsisLoc = readSourceLocation();
2369 unsigned NumParams =
Record.readInt();
2370 D->NumParams = NumParams;
2372 for (
unsigned i = 0; i != NumParams; ++i)
2373 D->Params[i] =
Record.readTemplateParameterList();
2375 D->Friend = readDeclAs<NamedDecl>();
2377 D->Friend = readTypeSourceInfo();
2378 D->FriendLoc = readSourceLocation();
2384 assert(!
D->TemplateParams &&
"TemplateParams already set!");
2385 D->TemplateParams =
Record.readTemplateParameterList();
2386 D->init(readDeclAs<NamedDecl>());
2391 D->ConstraintExpr =
Record.readExpr();
2401 for (
unsigned I = 0; I <
D->NumTemplateArgs; ++I)
2402 Args.push_back(
Record.readTemplateArgument(
true));
2403 D->setTemplateArguments(Args);
2418 Reader.PendingDefinitions.insert(CanonD);
2424 if (ThisDeclID == Redecl.getFirstID()) {
2425 if (
auto *RTD = readDeclAs<RedeclarableTemplateDecl>()) {
2426 assert(RTD->getKind() ==
D->
getKind() &&
2427 "InstantiatedFromMemberTemplate kind mismatch");
2428 D->setInstantiatedFromMemberTemplate(RTD);
2430 D->setMemberSpecialization();
2444 if (ThisDeclID == Redecl.getFirstID()) {
2448 readDeclIDList(SpecIDs);
2452 if (
D->getTemplatedDecl()->TemplateOrInstantiation) {
2457 D->getTemplatedDecl(),
D->getInjectedClassNameSpecialization());
2462 llvm_unreachable(
"BuiltinTemplates are not serialized");
2472 if (ThisDeclID == Redecl.getFirstID()) {
2476 readDeclIDList(SpecIDs);
2486 if (
Decl *InstD = readDecl()) {
2487 if (
auto *CTD = dyn_cast<ClassTemplateDecl>(InstD)) {
2488 D->SpecializedTemplate = CTD;
2491 Record.readTemplateArgumentList(TemplArgs);
2496 SpecializedPartialSpecialization();
2497 PS->PartialSpecialization
2498 = cast<ClassTemplatePartialSpecializationDecl>(InstD);
2499 PS->TemplateArgs = ArgList;
2500 D->SpecializedTemplate = PS;
2505 Record.readTemplateArgumentList(TemplArgs,
true);
2507 D->PointOfInstantiation = readSourceLocation();
2510 bool writtenAsCanonicalDecl =
Record.readInt();
2511 if (writtenAsCanonicalDecl) {
2512 auto *CanonPattern = readDeclAs<ClassTemplateDecl>();
2516 if (
auto *Partial = dyn_cast<ClassTemplatePartialSpecializationDecl>(
D)) {
2517 CanonSpec = CanonPattern->getCommonPtr()->PartialSpecializations
2518 .GetOrInsertNode(Partial);
2521 CanonPattern->getCommonPtr()->Specializations.GetOrInsertNode(
D);
2524 if (CanonSpec !=
D) {
2529 if (
auto *DDD =
D->DefinitionData) {
2530 if (CanonSpec->DefinitionData)
2533 CanonSpec->DefinitionData =
D->DefinitionData;
2535 D->DefinitionData = CanonSpec->DefinitionData;
2544 ExplicitInfo->TemplateKeywordLoc = readSourceLocation();
2545 D->ExplicitInfo = ExplicitInfo;
2549 D->setTemplateArgsAsWritten(
Record.readASTTemplateArgumentListInfo());
2559 D->TemplateParams = Params;
2564 if (ThisDeclID == Redecl.getFirstID()) {
2565 D->InstantiatedFromMember.setPointer(
2566 readDeclAs<ClassTemplatePartialSpecializationDecl>());
2567 D->InstantiatedFromMember.setInt(
Record.readInt());
2574 if (ThisDeclID == Redecl.getFirstID()) {
2577 readDeclIDList(SpecIDs);
2590 if (
Decl *InstD = readDecl()) {
2591 if (
auto *VTD = dyn_cast<VarTemplateDecl>(InstD)) {
2592 D->SpecializedTemplate = VTD;
2595 Record.readTemplateArgumentList(TemplArgs);
2600 VarTemplateSpecializationDecl::SpecializedPartialSpecialization();
2601 PS->PartialSpecialization =
2602 cast<VarTemplatePartialSpecializationDecl>(InstD);
2603 PS->TemplateArgs = ArgList;
2604 D->SpecializedTemplate = PS;
2612 ExplicitInfo->TemplateKeywordLoc = readSourceLocation();
2613 D->ExplicitInfo = ExplicitInfo;
2617 D->setTemplateArgsAsWritten(
Record.readASTTemplateArgumentListInfo());
2620 Record.readTemplateArgumentList(TemplArgs,
true);
2622 D->PointOfInstantiation = readSourceLocation();
2624 D->IsCompleteDefinition =
Record.readInt();
2628 bool writtenAsCanonicalDecl =
Record.readInt();
2629 if (writtenAsCanonicalDecl) {
2630 auto *CanonPattern = readDeclAs<VarTemplateDecl>();
2633 if (
auto *Partial = dyn_cast<VarTemplatePartialSpecializationDecl>(
D)) {
2634 CanonSpec = CanonPattern->getCommonPtr()
2635 ->PartialSpecializations.GetOrInsertNode(Partial);
2638 CanonPattern->getCommonPtr()->Specializations.GetOrInsertNode(
D);
2657 D->TemplateParams = Params;
2662 if (ThisDeclID == Redecl.getFirstID()) {
2663 D->InstantiatedFromMember.setPointer(
2664 readDeclAs<VarTemplatePartialSpecializationDecl>());
2665 D->InstantiatedFromMember.setInt(
Record.readInt());
2672 D->setDeclaredWithTypename(
Record.readInt());
2674 if (
D->hasTypeConstraint()) {
2677 CR =
Record.readConceptReference();
2678 Expr *ImmediatelyDeclaredConstraint =
Record.readExpr();
2680 D->setTypeConstraint(CR, ImmediatelyDeclaredConstraint);
2681 if ((
D->ExpandedParameterPack =
Record.readInt()))
2682 D->NumExpanded =
Record.readInt();
2687 Record.readTemplateArgumentLoc());
2693 D->setDepth(
Record.readInt());
2694 D->setPosition(
Record.readInt());
2695 if (
D->hasPlaceholderTypeConstraint())
2696 D->setPlaceholderTypeConstraint(
Record.readExpr());
2697 if (
D->isExpandedParameterPack()) {
2698 auto TypesAndInfos =
2699 D->getTrailingObjects<std::pair<QualType, TypeSourceInfo *>>();
2700 for (
unsigned I = 0, N =
D->getNumExpansionTypes(); I != N; ++I) {
2702 TypesAndInfos[I].second = readTypeSourceInfo();
2706 D->ParameterPack =
Record.readInt();
2709 Record.readTemplateArgumentLoc());
2715 D->setDeclaredWithTypename(
Record.readBool());
2717 D->setDepth(
Record.readInt());
2718 D->setPosition(
Record.readInt());
2719 if (
D->isExpandedParameterPack()) {
2721 for (
unsigned I = 0, N =
D->getNumExpansionTemplateParameters();
2723 Data[I] =
Record.readTemplateParameterList();
2726 D->ParameterPack =
Record.readInt();
2729 Record.readTemplateArgumentLoc());
2740 D->AssertExprAndFailed.setPointer(
Record.readExpr());
2741 D->AssertExprAndFailed.setInt(
Record.readInt());
2742 D->Message = cast_or_null<StringLiteral>(
Record.readExpr());
2743 D->RParenLoc = readSourceLocation();
2753 D->ExtendingDecl = readDeclAs<ValueDecl>();
2754 D->ExprWithTemporary =
Record.readStmt();
2759 D->ManglingNumber =
Record.readInt();
2763std::pair<uint64_t, uint64_t>
2765 uint64_t LexicalOffset = ReadLocalOffset();
2766 uint64_t VisibleOffset = ReadLocalOffset();
2767 return std::make_pair(LexicalOffset, VisibleOffset);
2770template <
typename T>
2773 Decl *MergeWith =
nullptr;
2775 bool IsKeyDecl = ThisDeclID == FirstDeclID;
2776 bool IsFirstLocalDecl =
false;
2778 uint64_t RedeclOffset = 0;
2783 FirstDeclID = ThisDeclID;
2785 IsFirstLocalDecl =
true;
2786 }
else if (
unsigned N =
Record.readInt()) {
2790 IsFirstLocalDecl =
true;
2797 for (
unsigned I = 0; I != N - 1; ++I)
2798 MergeWith = readDecl();
2800 RedeclOffset = ReadLocalOffset();
2807 auto *FirstDecl = cast_or_null<T>(Reader.
GetDecl(FirstDeclID));
2808 if (FirstDecl !=
D) {
2817 auto *DAsT =
static_cast<T *
>(
D);
2823 if (IsFirstLocalDecl)
2824 Reader.PendingDeclChains.push_back(std::make_pair(DAsT, RedeclOffset));
2826 return RedeclarableResult(MergeWith, FirstDeclID, IsKeyDecl);
2831template <
typename T>
2833 RedeclarableResult &Redecl) {
2842 auto *
D =
static_cast<T *
>(DBase);
2844 if (
auto *Existing = Redecl.getKnownMergeTarget())
2847 else if (FindExistingResult ExistingRes = findExisting(
D))
2848 if (
T *Existing = ExistingRes)
2859 Decl &Context,
unsigned IndexInContext) {
2868 if (
auto *Existing = Redecl.getKnownMergeTarget())
2874 NamedDecl *&Slot = Reader.LambdaDeclarationsForMerging[{
2875 Context.getCanonicalDecl(), IndexInContext}];
2883 RedeclarableResult &Redecl) {
2896 llvm_unreachable(
"bad assert_cast");
2904 auto *DPattern =
D->getTemplatedDecl();
2906 RedeclarableResult
Result(
2908 DPattern->getCanonicalDecl()->getGlobalID(), IsKeyDecl);
2910 if (
auto *DClass = dyn_cast<CXXRecordDecl>(DPattern)) {
2913 auto *ExistingClass =
2914 cast<CXXRecordDecl>(ExistingPattern)->getCanonicalDecl();
2915 if (
auto *DDD = DClass->DefinitionData) {
2916 if (ExistingClass->DefinitionData) {
2919 ExistingClass->DefinitionData = DClass->DefinitionData;
2922 Reader.PendingDefinitions.insert(DClass);
2925 DClass->DefinitionData = ExistingClass->DefinitionData;
2930 if (
auto *DFunction = dyn_cast<FunctionDecl>(DPattern))
2933 if (
auto *DVar = dyn_cast<VarDecl>(DPattern))
2935 if (
auto *DAlias = dyn_cast<TypeAliasDecl>(DPattern))
2938 llvm_unreachable(
"merged an unknown kind of redeclarable template");
2943template <
typename T>
2946 auto *
D =
static_cast<T *
>(DBase);
2947 T *ExistingCanon = Existing->getCanonicalDecl();
2949 if (ExistingCanon != DCanon) {
2954 D->First = ExistingCanon;
2955 ExistingCanon->Used |=
D->Used;
2958 bool IsKeyDecl = KeyDeclID.
isValid();
2961 if (
auto *DTemplate = dyn_cast<RedeclarableTemplateDecl>(
D))
2963 DTemplate, assert_cast<RedeclarableTemplateDecl *>(ExistingCanon),
2968 Reader.KeyDecls[ExistingCanon].push_back(KeyDeclID);
2981 if (isa<EnumConstantDecl, FieldDecl, IndirectFieldDecl>(ND))
2996 Reader.LETemporaryForMerging[std::make_pair(
3023 if (FindExistingResult ExistingRes = findExisting(
static_cast<T*
>(
D)))
3024 if (
T *Existing = ExistingRes)
3026 Existing->getCanonicalDecl());
3030 Record.readOMPChildren(
D->Data);
3035 Record.readOMPChildren(
D->Data);
3040 Record.readOMPChildren(
D->Data);
3049 D->setCombinerData(In, Out);
3051 D->setCombiner(Combiner);
3054 D->setInitializerData(Orig, Priv);
3057 D->setInitializer(
Init, IK);
3062 Record.readOMPChildren(
D->Data);
3064 D->VarName =
Record.readDeclarationName();
3083 uint64_t readInt() {
3087 bool readBool() {
return Reader.
readBool(); }
3101 std::string readString() {
3113 VersionTuple readVersionTuple() {
3119 template <
typename T>
T *readDeclAs() {
return Reader.
readDeclAs<
T>(); }
3124 AttrReader
Record(*
this);
3129 Attr *New =
nullptr;
3139 unsigned ParsedKind =
Record.readInt();
3140 unsigned Syntax =
Record.readInt();
3141 unsigned SpellingIndex =
Record.readInt();
3142 bool IsAlignas = (ParsedKind == AttributeCommonInfo::AT_Aligned &&
3144 SpellingIndex == AlignedAttr::Keyword_alignas);
3145 bool IsRegularKeywordAttribute =
Record.readBool();
3150 IsAlignas, IsRegularKeywordAttribute});
3152#include "clang/Serialization/AttrPCHRead.inc"
3154 assert(New &&
"Unable to decode attribute?");
3160 for (
unsigned I = 0,
E =
readInt(); I !=
E; ++I)
3175inline void ASTReader::LoadedDecl(
unsigned Index,
Decl *
D) {
3176 assert(!DeclsLoaded[Index] &&
"Decl loaded twice?");
3177 DeclsLoaded[Index] =
D;
3186bool ASTReader::isConsumerInterestedIn(
Decl *
D) {
3205 if (
const auto *Var = dyn_cast<VarDecl>(
D))
3206 return Var->isFileVarDecl() &&
3208 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(Var));
3209 if (
const auto *
Func = dyn_cast<FunctionDecl>(
D))
3210 return Func->doesThisDeclarationHaveABody() || PendingBodies.count(
D);
3220ASTReader::RecordLocation ASTReader::DeclCursorForID(
GlobalDeclID ID,
3224 unsigned LocalDeclIndex =
ID.getLocalDeclIndex();
3230ASTReader::RecordLocation ASTReader::getLocalBitOffset(uint64_t GlobalOffset) {
3231 auto I = GlobalBitOffsetsMap.find(GlobalOffset);
3233 assert(I != GlobalBitOffsetsMap.end() &&
"Corrupted global bit offsets map");
3234 return RecordLocation(I->second, GlobalOffset - I->second->GlobalBitOffset);
3242ASTDeclReader::getOrFakePrimaryClassDefinition(
ASTReader &Reader,
3245 auto *DD = RD->DefinitionData;
3254 DD =
new (Reader.
getContext())
struct CXXRecordDecl::DefinitionData(RD);
3256 RD->DefinitionData = DD;
3260 Reader.PendingFakeDefinitionData.insert(
3261 std::make_pair(DD, ASTReader::PendingFakeDefinitionKind::Fake));
3264 return DD->Definition;
3271 if (
auto *ND = dyn_cast<NamespaceDecl>(DC))
3272 return ND->getFirstDecl();
3274 if (
auto *RD = dyn_cast<CXXRecordDecl>(DC))
3275 return getOrFakePrimaryClassDefinition(Reader, RD);
3277 if (
auto *RD = dyn_cast<RecordDecl>(DC))
3280 if (
auto *ED = dyn_cast<EnumDecl>(DC))
3283 if (
auto *OID = dyn_cast<ObjCInterfaceDecl>(DC))
3288 if (
auto *TU = dyn_cast<TranslationUnitDecl>(DC))
3294ASTDeclReader::FindExistingResult::~FindExistingResult() {
3297 if (TypedefNameForLinkage) {
3299 Reader.ImportedTypedefNamesForLinkage.insert(
3300 std::make_pair(std::make_pair(DC, TypedefNameForLinkage), New));
3304 if (!AddResult || Existing)
3310 setAnonymousDeclForMerging(Reader, New->getLexicalDeclContext(),
3311 AnonymousDeclNumber, New);
3315 Reader.PendingFakeLookupResults[Name.getAsIdentifierInfo()]
3317 }
else if (
DeclContext *MergeDC = getPrimaryContextForMerging(Reader, DC)) {
3320 MergeDC->makeDeclVisibleInContextImpl(New,
true);
3328 bool IsTypedefNameForLinkage) {
3329 if (!IsTypedefNameForLinkage)
3335 if (
Found->isFromASTFile())
3338 if (
auto *TND = dyn_cast<TypedefNameDecl>(
Found))
3339 return TND->getAnonDeclWithTypedefName(
true);
3348ASTDeclReader::getPrimaryDCForAnonymousDecl(
DeclContext *LexicalDC) {
3350 if (
auto *RD = dyn_cast<CXXRecordDecl>(LexicalDC)) {
3352 return DD ? DD->Definition :
nullptr;
3353 }
else if (
auto *OID = dyn_cast<ObjCInterfaceDecl>(LexicalDC)) {
3354 return OID->getCanonicalDecl()->getDefinition();
3361 if (
auto *FD = dyn_cast<FunctionDecl>(
D))
3362 if (FD->isThisDeclarationADefinition())
3364 if (
auto *MD = dyn_cast<ObjCMethodDecl>(
D))
3365 if (MD->isThisDeclarationADefinition())
3367 if (
auto *RD = dyn_cast<RecordDecl>(
D))
3384 auto &
Previous = Reader.AnonymousDeclarationsForMerging[CanonDC];
3390 auto *PrimaryDC = getPrimaryDCForAnonymousDecl(DC);
3391 if (PrimaryDC && !cast<Decl>(PrimaryDC)->isFromASTFile()) {
3403void ASTDeclReader::setAnonymousDeclForMerging(
ASTReader &Reader,
3406 auto *CanonDC = cast<Decl>(DC)->getCanonicalDecl();
3408 auto &
Previous = Reader.AnonymousDeclarationsForMerging[CanonDC];
3415ASTDeclReader::FindExistingResult ASTDeclReader::findExisting(
NamedDecl *
D) {
3422 FindExistingResult
Result(Reader,
D,
nullptr,
3423 AnonymousDeclNumber, TypedefNameForLinkage);
3430 if (TypedefNameForLinkage) {
3431 auto It = Reader.ImportedTypedefNamesForLinkage.find(
3432 std::make_pair(DC, TypedefNameForLinkage));
3433 if (It != Reader.ImportedTypedefNamesForLinkage.end())
3434 if (
C.isSameEntity(It->second,
D))
3435 return FindExistingResult(Reader,
D, It->second, AnonymousDeclNumber,
3436 TypedefNameForLinkage);
3444 if (
auto *Existing = getAnonymousDeclForMerging(
3446 if (
C.isSameEntity(Existing,
D))
3447 return FindExistingResult(Reader,
D, Existing, AnonymousDeclNumber,
3448 TypedefNameForLinkage);
3455 class UpToDateIdentifierRAII {
3457 bool WasOutToDate =
false;
3468 ~UpToDateIdentifierRAII() {
3472 } UpToDate(Name.getAsIdentifierInfo());
3475 IEnd = IdResolver.
end();
3478 if (
C.isSameEntity(Existing,
D))
3479 return FindExistingResult(Reader,
D, Existing, AnonymousDeclNumber,
3480 TypedefNameForLinkage);
3482 }
else if (
DeclContext *MergeDC = getPrimaryContextForMerging(Reader, DC)) {
3486 if (
C.isSameEntity(Existing,
D))
3487 return FindExistingResult(Reader,
D, Existing, AnonymousDeclNumber,
3488 TypedefNameForLinkage);
3492 return FindExistingResult(Reader);
3504 if (MergedDCIt != Reader.MergedDeclContexts.end() &&
3506 Reader.PendingOdrMergeChecks.push_back(
D);
3508 return FindExistingResult(Reader,
D,
nullptr,
3509 AnonymousDeclNumber, TypedefNameForLinkage);
3512template<
typename DeclT>
3514 return D->RedeclLink.getLatestNotUpdated();
3518 llvm_unreachable(
"getMostRecentDecl on non-redeclarable declaration");
3525#define ABSTRACT_DECL(TYPE)
3526#define DECL(TYPE, BASE) \
3528 return getMostRecentDeclImpl(cast<TYPE##Decl>(D));
3529#include "clang/AST/DeclNodes.inc"
3531 llvm_unreachable(
"unknown decl kind");
3534Decl *ASTReader::getMostRecentExistingDecl(
Decl *
D) {
3542 const auto *IA =
Previous->getAttr<MSInheritanceAttr>();
3544 if (IA && !
D->
hasAttr<MSInheritanceAttr>()) {
3545 NewAttr = cast<InheritableAttr>(IA->clone(Context));
3550 const auto *AA =
Previous->getAttr<AvailabilityAttr>();
3551 if (AA && !
D->
hasAttr<AvailabilityAttr>()) {
3552 NewAttr = AA->
clone(Context);
3559template<
typename DeclT>
3563 D->RedeclLink.setPrevious(cast<DeclT>(
Previous));
3564 D->First = cast<DeclT>(
Previous)->First;
3573 auto *VD =
static_cast<VarDecl *
>(
D);
3574 auto *PrevVD = cast<VarDecl>(
Previous);
3575 D->RedeclLink.setPrevious(PrevVD);
3576 D->First = PrevVD->First;
3585 VD->demoteThisDefinitionToDeclaration();
3602 auto *PrevFD = cast<FunctionDecl>(
Previous);
3604 FD->RedeclLink.setPrevious(PrevFD);
3605 FD->First = PrevFD->First;
3609 if (PrevFD->isInlined() != FD->isInlined()) {
3625 FD->setImplicitlyInline(
true);
3630 if (FPT && PrevFPT) {
3634 bool WasUnresolved =
3636 if (IsUnresolved != WasUnresolved)
3637 Reader.PendingExceptionSpecUpdates.insert(
3638 {Canon, IsUnresolved ? PrevFD : FD});
3644 if (IsUndeduced != WasUndeduced)
3645 Reader.PendingDeducedTypeUpdates.insert(
3646 {cast<FunctionDecl>(Canon),
3647 (IsUndeduced ? PrevFPT : FPT)->getReturnType()});
3654 llvm_unreachable(
"attachPreviousDecl on non-redeclarable declaration");
3659template <
typename ParmDecl>
3662 auto *To = cast<ParmDecl>(ToD);
3663 if (!From->hasDefaultArgument())
3665 To->setInheritedDefaultArgument(Context, From);
3674 assert(FromTP->size() == ToTP->size() &&
"merged mismatched templates?");
3676 for (
unsigned I = 0, N = FromTP->size(); I != N; ++I) {
3677 NamedDecl *FromParam = FromTP->getParam(I);
3680 if (
auto *FTTP = dyn_cast<TemplateTypeParmDecl>(FromParam))
3682 else if (
auto *FNTTP = dyn_cast<NonTypeTemplateParmDecl>(FromParam))
3686 Context, cast<TemplateTemplateParmDecl>(FromParam), ToParam);
3709 if (!isa<VarDecl, FunctionDecl, TagDecl, RedeclarableTemplateDecl>(
Previous))
3717 if (
auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(
Previous);
3718 VTSD && !VTSD->isExplicitSpecialization())
3720 if (
auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(
Previous);
3721 CTSD && !CTSD->isExplicitSpecialization())
3724 if (
auto *FTSI =
Func->getTemplateSpecializationInfo();
3725 FTSI && !FTSI->isExplicitSpecialization())
3733 diag::err_multiple_decl_in_different_modules)
3743#define ABSTRACT_DECL(TYPE)
3744#define DECL(TYPE, BASE) \
3746 attachPreviousDeclImpl(Reader, cast<TYPE##Decl>(D), Previous, Canon); \
3748#include "clang/AST/DeclNodes.inc"
3764 if (
auto *TD = dyn_cast<TemplateDecl>(
D))
3772 mergeInheritableAttributes(Reader,
D,
Previous);
3775template<
typename DeclT>
3777 D->RedeclLink.setLatest(cast<DeclT>(Latest));
3781 llvm_unreachable(
"attachLatestDecl on non-redeclarable declaration");
3785 assert(
D && Latest);
3788#define ABSTRACT_DECL(TYPE)
3789#define DECL(TYPE, BASE) \
3791 attachLatestDeclImpl(cast<TYPE##Decl>(D), Latest); \
3793#include "clang/AST/DeclNodes.inc"
3797template<
typename DeclT>
3799 D->RedeclLink.markIncomplete();
3803 llvm_unreachable(
"markIncompleteDeclChain on non-redeclarable declaration");
3806void ASTReader::markIncompleteDeclChain(
Decl *
D) {
3808#define ABSTRACT_DECL(TYPE)
3809#define DECL(TYPE, BASE) \
3811 ASTDeclReader::markIncompleteDeclChainImpl(cast<TYPE##Decl>(D)); \
3813#include "clang/AST/DeclNodes.inc"
3820 RecordLocation
Loc = DeclCursorForID(ID, DeclLoc);
3821 llvm::BitstreamCursor &DeclsCursor =
Loc.F->DeclsCursor;
3826 ReadingKindTracker ReadingKind(Read_Decl, *
this);
3829 Deserializing ADecl(
this);
3831 auto Fail = [](
const char *what, llvm::Error &&Err) {
3832 llvm::report_fatal_error(Twine(
"ASTReader::readDeclRecord failed ") + what +
3836 if (llvm::Error JumpFailed = DeclsCursor.JumpToBit(
Loc.Offset))
3837 Fail(
"jumping", std::move(JumpFailed));
3842 Fail(
"reading code", MaybeCode.takeError());
3843 unsigned Code = MaybeCode.get();
3849 llvm::report_fatal_error(
3850 Twine(
"ASTReader::readDeclRecord failed reading decl code: ") +
3851 toString(MaybeDeclCode.takeError()));
3853 switch ((
DeclCode)MaybeDeclCode.get()) {
3856 llvm_unreachable(
"Record cannot be de-serialized with readDeclRecord");
3966 bool HasTypeConstraint =
Record.readInt();
3972 bool HasTypeConstraint =
Record.readInt();
3978 bool HasTypeConstraint =
Record.readInt();
3980 Context, ID,
Record.readInt(), HasTypeConstraint);
4069 D = MSGuidDecl::CreateDeserialized(Context, ID);
4072 D = UnnamedGlobalConstantDecl::CreateDeserialized(Context, ID);
4075 D = TemplateParamObjectDecl::CreateDeserialized(Context, ID);
4081 Error(
"attempt to read a C++ base-specifier record as a declaration");
4084 Error(
"attempt to read a C++ ctor initializer record as a declaration");
4093 unsigned NumChildren =
Record.readInt();
4099 unsigned NumClauses =
Record.readInt();
4100 unsigned NumVars =
Record.readInt();
4106 unsigned NumClauses =
Record.readInt();
4115 unsigned NumClauses =
Record.readInt();
4148 assert(
D &&
"Unknown declaration reading AST file");
4149 LoadedDecl(translateGlobalDeclIDToIndex(ID),
D);
4157 [&] { Reader.Visit(
D); });
4161 if (
auto *DC = dyn_cast<DeclContext>(
D)) {
4162 std::pair<uint64_t, uint64_t> Offsets = Reader.VisitDeclContext(DC);
4167 if (!Offsets.first && !Offsets.second && isa<NamespaceDecl>(
D))
4168 if (
auto Iter = DelayedNamespaceOffsetMap.find(ID);
4169 Iter != DelayedNamespaceOffsetMap.end())
4170 Offsets =
Iter->second;
4172 if (Offsets.first &&
4173 ReadLexicalDeclContextStorage(*
Loc.F, DeclsCursor, Offsets.first, DC))
4175 if (Offsets.second &&
4176 ReadVisibleDeclContextStorage(*
Loc.F, DeclsCursor, Offsets.second, ID))
4182 PendingUpdateRecords.push_back(
4183 PendingUpdateRecord(ID,
D,
true));
4186 if (
auto *
Class = dyn_cast<ObjCInterfaceDecl>(
D))
4189 if (
Class->isThisDeclarationADefinition() ||
4190 PendingDefinitions.count(
Class))
4191 loadObjCCategories(ID,
Class);
4197 PotentiallyInterestingDecls.push_back(
D);
4202void ASTReader::PassInterestingDeclsToConsumer() {
4205 if (PassingDeclsToConsumer)
4210 SaveAndRestore GuardPassingDeclsToConsumer(PassingDeclsToConsumer,
true);
4214 for (
auto ID : EagerlyDeserializedDecls)
4216 EagerlyDeserializedDecls.clear();
4218 auto ConsumingPotentialInterestingDecls = [
this]() {
4219 while (!PotentiallyInterestingDecls.empty()) {
4220 Decl *
D = PotentiallyInterestingDecls.front();
4221 PotentiallyInterestingDecls.pop_front();
4222 if (isConsumerInterestedIn(
D))
4223 PassInterestingDeclToConsumer(
D);
4226 std::deque<Decl *> MaybeInterestingDecls =
4227 std::move(PotentiallyInterestingDecls);
4228 PotentiallyInterestingDecls.clear();
4229 assert(PotentiallyInterestingDecls.empty());
4230 while (!MaybeInterestingDecls.empty()) {
4231 Decl *
D = MaybeInterestingDecls.front();
4232 MaybeInterestingDecls.pop_front();
4238 if (
auto *VD = dyn_cast<VarDecl>(
D);
4239 VD && VD->isFileVarDecl() && !VD->isExternallyVisible())
4241 ConsumingPotentialInterestingDecls();
4242 if (isConsumerInterestedIn(
D))
4243 PassInterestingDeclToConsumer(
D);
4247 ConsumingPotentialInterestingDecls();
4250 auto *RD = cast<CXXRecordDecl>(
GetDecl(ID));
4252 PassVTableToConsumer(RD);
4254 VTablesToEmit.clear();
4257void ASTReader::loadDeclUpdateRecords(PendingUpdateRecord &
Record) {
4263 ProcessingUpdatesRAIIObj ProcessingUpdates(*
this);
4264 DeclUpdateOffsetsMap::iterator UpdI = DeclUpdateOffsets.find(ID);
4268 if (UpdI != DeclUpdateOffsets.end()) {
4269 auto UpdateOffsets = std::move(UpdI->second);
4270 DeclUpdateOffsets.erase(UpdI);
4276 bool WasInteresting =
Record.JustLoaded || isConsumerInterestedIn(
D);
4277 for (
auto &FileAndOffset : UpdateOffsets) {
4279 uint64_t Offset = FileAndOffset.second;
4282 if (llvm::Error JumpFailed =
Cursor.JumpToBit(Offset))
4284 llvm::report_fatal_error(
4285 Twine(
"ASTReader::loadDeclUpdateRecords failed jumping: ") +
4289 llvm::report_fatal_error(
4290 Twine(
"ASTReader::loadDeclUpdateRecords failed reading code: ") +
4292 unsigned Code = MaybeCode.get();
4296 "Expected DECL_UPDATES record!");
4298 llvm::report_fatal_error(
4299 Twine(
"ASTReader::loadDeclUpdateRecords failed reading rec code: ") +
4304 Reader.UpdateDecl(
D, PendingLazySpecializationIDs);
4308 if (!WasInteresting && isConsumerInterestedIn(
D)) {
4309 PotentiallyInterestingDecls.push_back(
D);
4310 WasInteresting =
true;
4315 assert((PendingLazySpecializationIDs.empty() || isa<ClassTemplateDecl>(
D) ||
4316 isa<FunctionTemplateDecl, VarTemplateDecl>(
D)) &&
4317 "Must not have pending specializations");
4318 if (
auto *CTD = dyn_cast<ClassTemplateDecl>(
D))
4320 else if (
auto *FTD = dyn_cast<FunctionTemplateDecl>(
D))
4322 else if (
auto *VTD = dyn_cast<VarTemplateDecl>(
D))
4324 PendingLazySpecializationIDs.clear();
4327 auto I = PendingVisibleUpdates.find(ID);
4328 if (I != PendingVisibleUpdates.end()) {
4329 auto VisibleUpdates = std::move(I->second);
4330 PendingVisibleUpdates.erase(I);
4333 for (
const auto &
Update : VisibleUpdates)
4334 Lookups[DC].Table.add(
4341void ASTReader::loadPendingDeclChain(
Decl *FirstLocal, uint64_t LocalOffset) {
4344 if (FirstLocal != CanonDecl) {
4347 *
this, FirstLocal, PrevMostRecent ? PrevMostRecent : CanonDecl,
4358 assert(M &&
"imported decl from no module file");
4362 if (llvm::Error JumpFailed =
Cursor.JumpToBit(LocalOffset))
4363 llvm::report_fatal_error(
4364 Twine(
"ASTReader::loadPendingDeclChain failed jumping: ") +
4370 llvm::report_fatal_error(
4371 Twine(
"ASTReader::loadPendingDeclChain failed reading code: ") +
4373 unsigned Code = MaybeCode.get();
4376 "expected LOCAL_REDECLARATIONS record!");
4378 llvm::report_fatal_error(
4379 Twine(
"ASTReader::loadPendingDeclChain failed reading rec code: ") +
4384 Decl *MostRecent = FirstLocal;
4385 for (
unsigned I = 0, N =
Record.size(); I != N; ++I) {
4386 unsigned Idx = N - I - 1;
4398 class ObjCCategoriesVisitor {
4401 llvm::SmallPtrSetImpl<ObjCCategoryDecl *> &Deserialized;
4403 llvm::DenseMap<DeclarationName, ObjCCategoryDecl *> NameCategoryMap;
4405 unsigned PreviousGeneration;
4409 if (!Deserialized.erase(Cat))
4417 llvm::DenseSet<std::pair<Decl *, Decl *>> NonEquivalentDecls;
4420 NonEquivalentDecls, StructuralEquivalenceKind::Default,
4424 if (!Ctx.IsEquivalent(Cat, Existing)) {
4429 diag::note_previous_definition);
4431 }
else if (!Existing) {
4446 ObjCCategoriesVisitor(
4448 llvm::SmallPtrSetImpl<ObjCCategoryDecl *> &Deserialized,
4451 InterfaceID(InterfaceID), PreviousGeneration(PreviousGeneration) {
4453 for (
auto *Cat :
Interface->known_categories()) {
4484 LocalID != Result->getDefinitionID()) {
4492 unsigned Offset = Result->Offset;
4495 for (
unsigned I = 0; I != N; ++I)
4504 unsigned PreviousGeneration) {
4505 ObjCCategoriesVisitor Visitor(*
this,
D, CategoriesDeserialized, ID,
4506 PreviousGeneration);
4507 ModuleMgr.
visit(Visitor);
4510template<
typename DeclT,
typename Fn>
4519 for (
auto *Redecl = MostRecent; Redecl && !
Found;
4520 Redecl = Redecl->getPreviousDecl())
4525 for (
auto *Redecl = MostRecent; Redecl !=
D;
4537 auto *RD = cast<CXXRecordDecl>(
D);
4539 assert(MD &&
"couldn't read decl from update record");
4540 Reader.PendingAddedClassMembers.push_back({RD, MD});
4546 PendingLazySpecializationIDs.push_back(readDeclID());
4550 auto *Anon = readDeclAs<NamespaceDecl>();
4555 if (!
Record.isModule()) {
4556 if (
auto *TU = dyn_cast<TranslationUnitDecl>(
D))
4557 TU->setAnonymousNamespace(Anon);
4559 cast<NamespaceDecl>(
D)->setAnonymousNamespace(Anon);
4565 auto *VD = cast<VarDecl>(
D);
4566 VD->NonParmVarDeclBits.IsInline =
Record.readInt();
4567 VD->NonParmVarDeclBits.IsInlineSpecified =
Record.readInt();
4574 if (
auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(
D)) {
4575 VTSD->setPointOfInstantiation(POI);
4576 }
else if (
auto *VD = dyn_cast<VarDecl>(
D)) {
4578 assert(MSInfo &&
"No member specialization information");
4581 auto *FD = cast<FunctionDecl>(
D);
4582 if (
auto *FTSInfo = FD->TemplateOrSpecialization
4584 FTSInfo->setPointOfInstantiation(POI);
4587 ->setPointOfInstantiation(POI);
4593 auto *Param = cast<ParmVarDecl>(
D);
4598 auto *DefaultArg =
Record.readExpr();
4602 if (Param->hasUninstantiatedDefaultArg())
4603 Param->setDefaultArg(DefaultArg);
4608 auto *FD = cast<FieldDecl>(
D);
4609 auto *DefaultInit =
Record.readExpr();
4613 if (FD->hasInClassInitializer() && !FD->hasNonNullInClassInitializer()) {
4615 FD->setInClassInitializer(DefaultInit);
4619 FD->removeInClassInitializer();
4625 auto *FD = cast<FunctionDecl>(
D);
4626 if (Reader.PendingBodies[FD]) {
4640 FD->setInnerLocStart(readSourceLocation());
4642 assert(
Record.getIdx() ==
Record.size() &&
"lazy body must be last");
4647 auto *RD = cast<CXXRecordDecl>(
D);
4649 bool HadRealDefinition =
4650 OldDD && (OldDD->Definition != RD ||
4651 !Reader.PendingFakeDefinitionData.count(OldDD));
4655 ReadCXXRecordDefinition(RD,
true);
4658 uint64_t LexicalOffset = ReadLocalOffset();
4659 if (!HadRealDefinition && LexicalOffset) {
4660 Record.readLexicalDeclContextStorage(LexicalOffset, RD);
4661 Reader.PendingFakeDefinitionData.erase(OldDD);
4668 MSInfo->setTemplateSpecializationKind(TSK);
4669 MSInfo->setPointOfInstantiation(POI);
4671 auto *Spec = cast<ClassTemplateSpecializationDecl>(RD);
4672 Spec->setTemplateSpecializationKind(TSK);
4673 Spec->setPointOfInstantiation(POI);
4677 readDeclAs<ClassTemplatePartialSpecializationDecl>();
4679 Record.readTemplateArgumentList(TemplArgs);
4685 if (!Spec->getSpecializedTemplateOrPartial()
4687 Spec->setInstantiationOf(PartialSpec, TemplArgList);
4698 Record.readAttributes(Attrs);
4710 auto *Del = readDeclAs<FunctionDecl>();
4712 auto *ThisArg =
Record.readExpr();
4714 if (!
First->OperatorDelete) {
4715 First->OperatorDelete = Del;
4716 First->OperatorDeleteThisArg = ThisArg;
4723 auto ESI =
Record.readExceptionSpecInfo(ExceptionStorage);
4726 auto *FD = cast<FunctionDecl>(
D);
4732 FPT->getReturnType(), FPT->getParamTypes(),
4733 FPT->getExtProtoInfo().withExceptionSpec(ESI)));
4737 Reader.PendingExceptionSpecUpdates.insert(
4738 std::make_pair(FD->getCanonicalDecl(), FD));
4744 auto *FD = cast<FunctionDecl>(
D);
4746 Reader.PendingDeducedTypeUpdates.insert(
4747 {FD->getCanonicalDecl(), DeducedResultType});
4768 readSourceRange()));
4772 auto AllocatorKind =
4773 static_cast<OMPAllocateDeclAttr::AllocatorTypeTy
>(
Record.readInt());
4777 D->
addAttr(OMPAllocateDeclAttr::CreateImplicit(
4778 Reader.
getContext(), AllocatorKind, Allocator, Alignment, SR));
4784 auto *Exported = cast<NamedDecl>(
D);
4787 Reader.PendingMergedDefinitionsToDeduplicate.insert(Exported);
4792 auto MapType =
Record.readEnum<OMPDeclareTargetDeclAttr::MapTypeTy>();
4793 auto DevType =
Record.readEnum<OMPDeclareTargetDeclAttr::DevTypeTy>();
4796 unsigned Level =
Record.readInt();
4797 D->
addAttr(OMPDeclareTargetDeclAttr::CreateImplicit(
4799 readSourceRange()));
4805 Record.readAttributes(Attrs);
4806 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)
static void checkMultipleDefinitionInNamedModules(ASTReader &Reader, Decl *D, Decl *Previous)
Defines the clang::attr::Kind enum.
clang::CharUnits operator*(clang::CharUnits::QuantityType Scale, const clang::CharUnits &CU)
enum clang::sema::@1655::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 UpdateDecl(Decl *D, SmallVectorImpl< GlobalDeclID > &)
void VisitFriendDecl(FriendDecl *D)
void VisitLinkageSpecDecl(LinkageSpecDecl *D)
void VisitCXXRecordDecl(CXXRecordDecl *D)
ASTDeclReader(ASTReader &Reader, ASTRecordReader &Record, ASTReader::RecordLocation Loc, GlobalDeclID thisDeclID, SourceLocation ThisDeclLoc)
void VisitFileScopeAsmDecl(FileScopeAsmDecl *AD)
void VisitImplicitConceptSpecializationDecl(ImplicitConceptSpecializationDecl *D)
void VisitNamedDecl(NamedDecl *ND)
void mergeMergeable(Mergeable< T > *D)
Attempts to merge the given declaration (D) with another declaration of the same entity,...
void VisitBuiltinTemplateDecl(BuiltinTemplateDecl *D)
static Decl * getMostRecentDecl(Decl *D)
void VisitObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *D)
void VisitCXXConstructorDecl(CXXConstructorDecl *D)
void VisitPragmaDetectMismatchDecl(PragmaDetectMismatchDecl *D)
void VisitImplicitParamDecl(ImplicitParamDecl *PD)
void VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D)
static void setNextObjCCategory(ObjCCategoryDecl *Cat, ObjCCategoryDecl *Next)
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)
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 AddLazySpecializations(T *D, SmallVectorImpl< GlobalDeclID > &IDs)
static void attachPreviousDecl(ASTReader &Reader, Decl *D, Decl *Previous, Decl *Canon)
std::pair< uint64_t, uint64_t > VisitDeclContext(DeclContext *DC)
void VisitClassTemplateDecl(ClassTemplateDecl *D)
void VisitCXXDestructorDecl(CXXDestructorDecl *D)
void VisitTemplateDecl(TemplateDecl *D)
void VisitCXXConversionDecl(CXXConversionDecl *D)
void VisitTypedefDecl(TypedefDecl *TD)
void VisitOMPRequiresDecl(OMPRequiresDecl *D)
RedeclarableResult VisitRecordDeclImpl(RecordDecl *RD)
void VisitDecompositionDecl(DecompositionDecl *DD)
Reads an AST files chain containing the contents of a translation unit.
bool isDeclIDFromModule(GlobalDeclID ID, ModuleFile &M) const
Returns true if global DeclID ID originated from module M.
DiagnosticBuilder Diag(unsigned DiagID) const
Report a diagnostic.
ASTContext & getContext()
Retrieve the AST context that this AST reader supplements.
Decl * ReadDecl(ModuleFile &F, const RecordDataImpl &R, unsigned &I)
Reads a declaration from the given position in a record in the given module.
ModuleFile * getOwningModuleFile(const Decl *D) const
Retrieve the module file that owns the given declaration, or NULL if the declaration is not from a mo...
T * ReadDeclAs(ModuleFile &F, const RecordDataImpl &R, unsigned &I)
Reads a declaration from the given position in a record in the given module.
SourceLocation ReadSourceLocation(ModuleFile &MF, RawLocEncoding Raw, LocSeq *Seq=nullptr) const
Read a source location from raw form.
LocalDeclID mapGlobalIDToModuleFileGlobalID(ModuleFile &M, GlobalDeclID GlobalID)
Map a global declaration ID into the declaration ID used to refer to this declaration within the give...
QualType GetType(serialization::TypeID ID)
Resolve a type ID into a type, potentially building a new type.
void warnStackExhausted(SourceLocation Loc)
IdentifierResolver & getIdResolver()
Get the identifier resolver used for name lookup / updates in the translation unit scope.
Decl * GetDecl(GlobalDeclID ID)
Resolve a declaration ID into a declaration, potentially building a new declaration.
Module * getSubmodule(serialization::SubmoduleID GlobalID)
Retrieve the submodule that corresponds to a global submodule ID.
void mergeDefinitionVisibility(NamedDecl *Def, NamedDecl *MergedDef)
Note that MergedDef is a redefinition of the canonical definition Def, so Def should be visible whene...
SmallVector< uint64_t, 64 > RecordData
An object for streaming information from a record.
bool readBool()
Read a boolean value, advancing Idx.
std::string readString()
Read a string, advancing Idx.
void readAttributes(AttrVec &Attrs)
Reads attributes from the current stream position, advancing Idx.
T * readDeclAs()
Reads a declaration from the given position in the record, advancing Idx.
IdentifierInfo * readIdentifier()
ASTContext & getContext()
Retrieve the AST context that this AST reader supplements.
TypeSourceInfo * readTypeSourceInfo()
Reads a declarator info from the given record, advancing Idx.
SourceRange readSourceRange(LocSeq *Seq=nullptr)
Read a source range, advancing Idx.
OMPTraitInfo * readOMPTraitInfo()
Read an OMPTraitInfo object, advancing Idx.
VersionTuple readVersionTuple()
Read a version tuple, advancing Idx.
uint64_t readInt()
Returns the current value in this record, and advances to the next value.
Attr * readAttr()
Reads one attribute from the current stream position, advancing Idx.
Expr * readExpr()
Reads an expression.
SourceLocation readSourceLocation(LocSeq *Seq=nullptr)
Read a source location, advancing Idx.
Represents an access specifier followed by colon ':'.
static AccessSpecDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Attr - This represents one attribute.
Attr * clone(ASTContext &C) const
Syntax
The style used to specify an attribute.
@ AS_Keyword
__ptr16, alignas(...), etc.
A binding in a decomposition declaration.
static BindingDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
A simple helper class to unpack an integer to bits and consuming the bits in order.
uint32_t getNextBits(uint32_t Width)
A class which contains all the information about a particular captured value.
Represents a block literal declaration, which is like an unnamed FunctionDecl.
void setParams(ArrayRef< ParmVarDecl * > NewParamInfo)
void setDoesNotEscape(bool B=true)
void setSignatureAsWritten(TypeSourceInfo *Sig)
void setCanAvoidCopyToHeap(bool B=true)
void setIsConversionFromLambda(bool val=true)
void setBlockMissingReturnType(bool val=true)
static BlockDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setIsVariadic(bool value)
void setBody(CompoundStmt *B)
void setCaptures(ASTContext &Context, ArrayRef< Capture > Captures, bool CapturesCXXThis)
Represents the builtin template declaration which is used to implement __make_integer_seq and other b...
Represents a C++ constructor within a class.
static CXXConstructorDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, uint64_t AllocKind)
Represents a C++ conversion function within a class.
static CXXConversionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a C++ deduction guide declaration.
static CXXDeductionGuideDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a C++ destructor within a class.
static CXXDestructorDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a static or instance method of a struct/union/class.
static CXXMethodDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a C++ struct/union/class.
CXXRecordDecl * getDefinition() const
static CXXRecordDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID)
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this class is an instantiation of a member class of a class template specialization,...
CXXRecordDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Represents the body of a CapturedStmt, and serves as its DeclContext.
static CapturedDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumParams)
void setContextParam(unsigned i, ImplicitParamDecl *P)
void setNothrow(bool Nothrow=true)
void setParam(unsigned i, ImplicitParamDecl *P)
Declaration of a class template.
static ClassTemplateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Create an empty class template node.
static ClassTemplatePartialSpecializationDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a class template specialization, which refers to a class template with a given set of temp...
static ClassTemplateSpecializationDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Declaration of a C++20 concept.
static ConceptDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
A reference to a concept and its template args, as it appears in the code.
Represents a shadow constructor declaration introduced into a class by a C++11 using-declaration that...
static ConstructorUsingShadowDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
static DeclAccessPair make(NamedDecl *D, AccessSpecifier AS)
The results of name lookup within a DeclContext.
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
void setHasExternalVisibleStorage(bool ES=true) const
State whether this DeclContext has external storage for declarations visible in this context.
bool isTranslationUnit() const
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
DeclContext * getPrimaryContext()
getPrimaryContext - There may be many different declarations of the same entity (including forward de...
bool isFunctionOrMethod() const
DeclID getRawValue() const
A simple visitor class that helps create declaration visitors.
Decl - This represents one declaration (or definition), e.g.
Decl * getPreviousDecl()
Retrieve the previous declaration that declares the same entity as this declaration,...
Decl * getMostRecentDecl()
Retrieve the most recent declaration that declares the same entity as this declaration (which may be ...
ASTContext & getASTContext() const LLVM_READONLY
void setOwningModuleID(unsigned ID)
Set the owning module ID.
void setLocalExternDecl()
Changes the namespace of this declaration to reflect that it's a function-local extern declaration.
void setTopLevelDeclInObjCContainer(bool V=true)
void markUsed(ASTContext &C)
Mark the declaration used, in the sense of odr-use.
bool isCanonicalDecl() const
Whether this particular Decl is a canonical one.
Module * getOwningModule() const
Get the module that owns this declaration (for visibility purposes).
bool isFirstDecl() const
True if this is the first declaration in its redeclaration chain.
Module * getImportedOwningModule() const
Get the imported owning module, if this decl is from an imported (non-local) module.
ObjCDeclQualifier
ObjCDeclQualifier - 'Qualifiers' written next to the return and parameter types in method declaration...
bool isFromASTFile() const
Determine whether this declaration came from an AST file (such as a precompiled header or module) rat...
bool isTemplateParameter() const
isTemplateParameter - Determines whether this declaration is a template parameter.
bool isInvalidDecl() const
unsigned FromASTFile
Whether this declaration was loaded from an AST file.
void setAccess(AccessSpecifier AS)
SourceLocation getLocation() const
IdentifierNamespace
IdentifierNamespace - The different namespaces in which declarations may appear.
@ IDNS_Ordinary
Ordinary names.
@ IDNS_Type
Types, declared with 'struct foo', typedefs, etc.
@ IDNS_Tag
Tags, declared with 'struct foo;' and referenced with 'struct foo'.
bool isTemplateParameterPack() const
isTemplateParameter - Determines whether this declaration is a template parameter pack.
void setImplicit(bool I=true)
void setReferenced(bool R=true)
void setLocation(SourceLocation L)
DeclContext * getDeclContext()
void setCachedLinkage(Linkage L) const
void setDeclContext(DeclContext *DC)
setDeclContext - Set both the semantic and lexical DeclContext to DC.
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
ModuleOwnershipKind
The kind of ownership a declaration has, for visibility purposes.
@ VisibleWhenImported
This declaration has an owning module, and is visible when that module is imported.
@ Unowned
This declaration is not owned by a module.
@ ReachableWhenImported
This declaration has an owning module, and is visible to lookups that occurs within that module.
@ ModulePrivate
This declaration has an owning module, but is only visible to lookups that occur within that module.
@ Visible
This declaration has an owning module, but is globally visible (typically because its owning module i...
void setModuleOwnershipKind(ModuleOwnershipKind MOK)
Set whether this declaration is hidden from name lookup.
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.
@ 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?
This represents a decl that may have a name.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
void setDeclName(DeclarationName N)
Set the name of this declaration.
Represents a C++ namespace alias.
static NamespaceAliasDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represent a C++ namespace.
static NamespaceDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
static NonTypeTemplateParmDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, bool HasTypeConstraint)
This represents '#pragma omp allocate ...' directive.
static OMPAllocateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NVars, unsigned NClauses)
Pseudo declaration for capturing expressions.
static OMPCapturedExprDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
This represents '#pragma omp declare mapper ...' directive.
static OMPDeclareMapperDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned N)
Creates deserialized declare mapper node.
This represents '#pragma omp declare reduction ...' directive.
static OMPDeclareReductionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Create deserialized declare reduction node.
This represents '#pragma omp requires...' directive.
static OMPRequiresDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned N)
Create deserialized requires node.
This represents '#pragma omp threadprivate ...' directive.
static OMPThreadPrivateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned N)
Helper data structure representing the traits in a match clause of an declare variant or metadirectiv...
Represents a field declaration created by an @defs(...).
static ObjCAtDefsFieldDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
ObjCCategoryDecl - Represents a category declaration.
void setProtocolList(ObjCProtocolDecl *const *List, unsigned Num, const SourceLocation *Locs, ASTContext &C)
setProtocolList - Set the list of protocols that this interface implements.
static ObjCCategoryDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setIvarLBraceLoc(SourceLocation Loc)
void setCategoryNameLoc(SourceLocation Loc)
void setIvarRBraceLoc(SourceLocation Loc)
bool IsClassExtension() const
ObjCCategoryImplDecl - An object of this class encapsulates a category @implementation declaration.
static ObjCCategoryImplDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
ObjCCompatibleAliasDecl - Represents alias of a class.
static ObjCCompatibleAliasDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setClassInterface(ObjCInterfaceDecl *D)
ObjCContainerDecl - Represents a container for method declarations.
void setAtStartLoc(SourceLocation Loc)
void setAtEndRange(SourceRange atEnd)
ObjCImplementationDecl - Represents a class definition - this is where method definitions are specifi...
static ObjCImplementationDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents an ObjC class declaration.
void mergeClassExtensionProtocolList(ObjCProtocolDecl *const *List, unsigned Num, ASTContext &C)
mergeClassExtensionProtocolList - Merge class extension's protocol list into the protocol list for th...
ObjCIvarDecl * lookupInstanceVariable(IdentifierInfo *IVarName, ObjCInterfaceDecl *&ClassDeclared)
static ObjCInterfaceDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID)
ObjCInterfaceDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this Objective-C class.
ObjCIvarDecl - Represents an ObjC instance variable.
void setAccessControl(AccessControl ac)
void setNextIvar(ObjCIvarDecl *ivar)
ObjCInterfaceDecl * getContainingInterface()
Return the class interface that this ivar is logically contained in; this is either the interface whe...
void setSynthesize(bool synth)
static ObjCIvarDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
ObjCMethodDecl - Represents an instance or class method declaration.
void setSynthesizedAccessorStub(bool isSynthesizedAccessorStub)
void setObjCDeclQualifier(ObjCDeclQualifier QV)
void setDefined(bool isDefined)
void setSelfDecl(ImplicitParamDecl *SD)
void setReturnTypeSourceInfo(TypeSourceInfo *TInfo)
void setHasRedeclaration(bool HRD) const
void setIsRedeclaration(bool RD)
void setCmdDecl(ImplicitParamDecl *CD)
bool hasRedeclaration() const
True if redeclared in the same interface.
void setRelatedResultType(bool RRT=true)
Note whether this method has a related result type.
void setOverriding(bool IsOver)
void setPropertyAccessor(bool isAccessor)
void setDeclImplementation(ObjCImplementationControl ic)
void setReturnType(QualType T)
static ObjCMethodDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setHasSkippedBody(bool Skipped=true)
void setInstanceMethod(bool isInst)
void setVariadic(bool isVar)
Represents one property declaration in an Objective-C interface.
static ObjCPropertyDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
ObjCPropertyImplDecl - Represents implementation declaration of a property in a class or category imp...
static ObjCPropertyImplDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents an Objective-C protocol declaration.
static ObjCProtocolDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
ObjCProtocolDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this Objective-C protocol.
Represents the declaration of an Objective-C type parameter.
static ObjCTypeParamDecl * CreateDeserialized(ASTContext &ctx, GlobalDeclID ID)
Stores a list of Objective-C type parameters for a parameterized class or a category/extension thereo...
static ObjCTypeParamList * create(ASTContext &ctx, SourceLocation lAngleLoc, ArrayRef< ObjCTypeParamDecl * > typeParams, SourceLocation rAngleLoc)
Create a new Objective-C type parameter list.
Represents a parameter to a function.
static ParmVarDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setUninstantiatedDefaultArg(Expr *arg)
void setScopeInfo(unsigned scopeDepth, unsigned parameterIndex)
void setObjCMethodScopeInfo(unsigned parameterIndex)
Represents a #pragma detect_mismatch line.
static PragmaDetectMismatchDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NameValueSize)
A (possibly-)qualified type.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
const Type * getTypePtrOrNull() const
Represents a struct/union/class.
unsigned getODRHash()
Get precomputed ODRHash or add a new one.
void setAnonymousStructOrUnion(bool Anon)
void setArgPassingRestrictions(RecordArgPassingKind Kind)
void setNonTrivialToPrimitiveCopy(bool V)
void setHasNonTrivialToPrimitiveCopyCUnion(bool V)
void setHasNonTrivialToPrimitiveDestructCUnion(bool V)
void setHasFlexibleArrayMember(bool V)
void setParamDestroyedInCallee(bool V)
void setNonTrivialToPrimitiveDestroy(bool V)
void setHasObjectMember(bool val)
void setHasVolatileMember(bool val)
void setHasNonTrivialToPrimitiveDefaultInitializeCUnion(bool V)
static RecordDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID)
void setNonTrivialToPrimitiveDefaultInitialize(bool V)
Declaration of a redeclarable template.
CommonBase * Common
Pointer to the common data shared by all declarations of this template.
virtual CommonBase * newCommon(ASTContext &C) const =0
Provides common interface for the Decls that can be redeclared.
decl_type * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
bool isFirstDecl() const
True if this is the first declaration in its redeclaration chain.
static DeclLink PreviousDeclLink(decl_type *D)
Represents the body of a requires-expression.
static RequiresExprBodyDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Encodes a location in the source.
A trivial tuple used to represent a source range.
Represents a C++11 static_assert declaration.
static StaticAssertDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
StringLiteral - This represents a string literal expression, e.g.
Represents the declaration of a struct/union/class/enum.
void setTagKind(TagKind TK)
void setCompleteDefinitionRequired(bool V=true)
True if this complete decl is required to be complete for some existing use.
void demoteThisDefinitionToDeclaration()
Mark a definition as a declaration and maintain information it was a definition.
bool isThisDeclarationADefinition() const
Return true if this declaration is a completion definition of the type.
void setEmbeddedInDeclarator(bool isInDeclarator)
True if this tag declaration is "embedded" (i.e., defined or declared for the very first time) in the...
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
TagDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
void setFreeStanding(bool isFreeStanding=true)
True if this tag is free standing, e.g. "struct foo;".
void setBraceRange(SourceRange R)
void setCompleteDefinition(bool V=true)
True if this decl has its body fully specified.
A convenient class for passing around template argument information.
A template argument list.
static TemplateArgumentList * CreateCopy(ASTContext &Context, ArrayRef< TemplateArgument > Args)
Create a new template argument list that copies the given set of template arguments.
The base class of all kinds of template declarations (e.g., class, function, etc.).
NamedDecl * getTemplatedDecl() const
Get the underlying, templated declaration.
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
A template parameter object.
Stores a list of template parameters for a TemplateDecl and its derived classes.
TemplateTemplateParmDecl - Declares a template template parameter, e.g., "T" in.
static TemplateTemplateParmDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Declaration of a template type parameter.
static TemplateTypeParmDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID)
A declaration that models statements at global scope.
static TopLevelStmtDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
The top declaration context.
Represents the declaration of a typedef-name via a C++11 alias-declaration.
static TypeAliasDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setDescribedAliasTemplate(TypeAliasTemplateDecl *TAT)
Declaration of an alias template.
static TypeAliasTemplateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Create an empty alias template node.
Represents a declaration of a type.
void setLocStart(SourceLocation L)
A container of type source information.
QualType getType() const
Return the type wrapped by this type source info.
const T * castAs() const
Member-template castAs<specific type>.
AutoType * getContainedAutoType() const
Get the AutoType whose type will be deduced for a variable with an initializer of this type.
DeducedType * getContainedDeducedType() const
Get the DeducedType whose type will be deduced for a variable with an initializer of this type.
const T * getAs() const
Member-template getAs<specific type>'.
Represents the declaration of a typedef-name via the 'typedef' type specifier.
static TypedefDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Base class for declarations which introduce a typedef-name.
void setModedTypeSourceInfo(TypeSourceInfo *unmodedTSI, QualType modedTy)
void setTypeSourceInfo(TypeSourceInfo *newType)
An artificial decl, representing a global anonymous constant value which is uniquified by value withi...
void addDecl(NamedDecl *D)
A set of unresolved declarations.
This node is generated when a using-declaration that was annotated with attribute((using_if_exists)) ...
static UnresolvedUsingIfExistsDecl * CreateDeserialized(ASTContext &Ctx, GlobalDeclID ID)
Represents a dependent using declaration which was marked with typename.
static UnresolvedUsingTypenameDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a dependent using declaration which was not marked with typename.
static UnresolvedUsingValueDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a C++ using-declaration.
static UsingDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents C++ using-directive.
static UsingDirectiveDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a C++ using-enum-declaration.
static UsingEnumDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a pack of using declarations that a single using-declarator pack-expanded into.
static UsingPackDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumExpansions)
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
static UsingShadowDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
void setType(QualType newType)
Represents a variable declaration or definition.
ParmVarDeclBitfields ParmVarDeclBits
static VarDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
VarDeclBitfields VarDeclBits
EvaluatedStmt * ensureEvaluatedStmt() const
Convert the initializer for this declaration to the elaborated EvaluatedStmt form,...
NonParmVarDeclBitfields NonParmVarDeclBits
@ Definition
This declaration is definitely a definition.
void setDescribedVarTemplate(VarTemplateDecl *Template)
StorageClass getStorageClass() const
Returns the storage class as written in the source.
Declaration of a variable template.
static VarTemplateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Create an empty variable template node.
static VarTemplatePartialSpecializationDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a variable template specialization, which refers to a variable template with a given set o...
static VarTemplateSpecializationDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Source location and bit offset of a declaration.
RawLocEncoding getRawLoc() const
uint64_t getBitOffset(const uint64_t DeclTypesBlockStartOffset) const
Information about a module that has been loaded by the ASTReader.
const serialization::ObjCCategoriesInfo * ObjCCategoriesMap
Array of category list location information within this module file, sorted by the definition ID.
unsigned LocalNumObjCCategoriesInMap
The number of redeclaration info entries in ObjCCategoriesMap.
llvm::BitstreamCursor DeclsCursor
DeclsCursor - This is a cursor to the start of the DECLTYPES_BLOCK block.
uint64_t GlobalBitOffset
The global bit offset (or base) of this module.
const DeclOffset * DeclOffsets
Offset of each declaration within the bitstream, indexed by the declaration ID (-1).
unsigned Generation
The generation of which this module file is a part.
uint64_t DeclsBlockStartOffset
The offset to the start of the DECLTYPES_BLOCK block.
SmallVector< uint64_t, 1 > ObjCCategories
The Objective-C category lists for categories known to this module.
void visit(llvm::function_ref< bool(ModuleFile &M)> Visitor, llvm::SmallPtrSetImpl< ModuleFile * > *ModuleFilesHit=nullptr)
Visit each of the modules.
Class that performs name lookup into a DeclContext stored in an AST file.
const unsigned int LOCAL_REDECLARATIONS
Record code for a list of local redeclarations of a declaration.
DeclCode
Record codes for each kind of declaration.
const unsigned int DECL_UPDATES
Record of updates for a declaration that was modified after being deserialized.
@ DECL_EMPTY
An EmptyDecl record.
@ DECL_CAPTURED
A CapturedDecl record.
@ DECL_CXX_BASE_SPECIFIERS
A record containing CXXBaseSpecifiers.
@ DECL_CXX_RECORD
A CXXRecordDecl record.
@ DECL_VAR_TEMPLATE_PARTIAL_SPECIALIZATION
A VarTemplatePartialSpecializationDecl record.
@ DECL_OMP_ALLOCATE
An OMPAllocateDcl record.
@ DECL_MS_PROPERTY
A MSPropertyDecl record.
@ DECL_OMP_DECLARE_MAPPER
An OMPDeclareMapperDecl record.
@ DECL_TOP_LEVEL_STMT_DECL
A TopLevelStmtDecl record.
@ DECL_REQUIRES_EXPR_BODY
A RequiresExprBodyDecl record.
@ DECL_STATIC_ASSERT
A StaticAssertDecl record.
@ DECL_INDIRECTFIELD
A IndirectFieldDecl record.
@ DECL_TEMPLATE_TEMPLATE_PARM
A TemplateTemplateParmDecl record.
@ DECL_IMPORT
An ImportDecl recording a module import.
@ DECL_UNNAMED_GLOBAL_CONSTANT
A UnnamedGlobalConstantDecl record.
@ DECL_ACCESS_SPEC
An AccessSpecDecl record.
@ DECL_OBJC_TYPE_PARAM
An ObjCTypeParamDecl record.
@ DECL_OBJC_CATEGORY_IMPL
A ObjCCategoryImplDecl record.
@ DECL_ENUM_CONSTANT
An EnumConstantDecl record.
@ DECL_PARM_VAR
A ParmVarDecl record.
@ DECL_TYPEDEF
A TypedefDecl record.
@ DECL_EXPANDED_TEMPLATE_TEMPLATE_PARM_PACK
A TemplateTemplateParmDecl record that stores an expanded template template parameter pack.
@ DECL_HLSL_BUFFER
A HLSLBufferDecl record.
@ DECL_NAMESPACE_ALIAS
A NamespaceAliasDecl record.
@ DECL_TYPEALIAS
A TypeAliasDecl record.
@ DECL_FUNCTION_TEMPLATE
A FunctionTemplateDecl record.
@ DECL_MS_GUID
A MSGuidDecl record.
@ DECL_UNRESOLVED_USING_TYPENAME
An UnresolvedUsingTypenameDecl record.
@ DECL_CLASS_TEMPLATE_SPECIALIZATION
A ClassTemplateSpecializationDecl record.
@ DECL_FILE_SCOPE_ASM
A FileScopeAsmDecl record.
@ DECL_CXX_CONSTRUCTOR
A CXXConstructorDecl record.
@ DECL_CXX_CONVERSION
A CXXConversionDecl record.
@ DECL_FIELD
A FieldDecl record.
@ DECL_LINKAGE_SPEC
A LinkageSpecDecl record.
@ DECL_NAMESPACE
A NamespaceDecl record.
@ DECL_NON_TYPE_TEMPLATE_PARM
A NonTypeTemplateParmDecl record.
@ DECL_USING_PACK
A UsingPackDecl record.
@ DECL_FUNCTION
A FunctionDecl record.
@ DECL_USING_DIRECTIVE
A UsingDirecitveDecl record.
@ DECL_RECORD
A RecordDecl record.
@ DECL_CONTEXT_LEXICAL
A record that stores the set of declarations that are lexically stored within a given DeclContext.
@ DECL_BLOCK
A BlockDecl record.
@ DECL_UNRESOLVED_USING_VALUE
An UnresolvedUsingValueDecl record.
@ DECL_TYPE_ALIAS_TEMPLATE
A TypeAliasTemplateDecl record.
@ DECL_CXX_CTOR_INITIALIZERS
A record containing CXXCtorInitializers.
@ DECL_OBJC_CATEGORY
A ObjCCategoryDecl record.
@ DECL_VAR
A VarDecl record.
@ DECL_UNRESOLVED_USING_IF_EXISTS
An UnresolvedUsingIfExistsDecl record.
@ DECL_USING
A UsingDecl record.
@ DECL_OBJC_PROTOCOL
A ObjCProtocolDecl record.
@ DECL_TEMPLATE_TYPE_PARM
A TemplateTypeParmDecl record.
@ DECL_VAR_TEMPLATE_SPECIALIZATION
A VarTemplateSpecializationDecl record.
@ DECL_OBJC_IMPLEMENTATION
A ObjCImplementationDecl record.
@ DECL_LABEL
A LabelDecl record.
@ DECL_OBJC_COMPATIBLE_ALIAS
A ObjCCompatibleAliasDecl record.
@ DECL_CONSTRUCTOR_USING_SHADOW
A ConstructorUsingShadowDecl record.
@ DECL_USING_ENUM
A UsingEnumDecl record.
@ DECL_FRIEND_TEMPLATE
A FriendTemplateDecl record.
@ DECL_PRAGMA_DETECT_MISMATCH
A PragmaDetectMismatchDecl record.
@ DECL_EXPANDED_NON_TYPE_TEMPLATE_PARM_PACK
A NonTypeTemplateParmDecl record that stores an expanded non-type template parameter pack.
@ DECL_OBJC_AT_DEFS_FIELD
A ObjCAtDefsFieldDecl record.
@ DECL_IMPLICIT_PARAM
An ImplicitParamDecl record.
@ DECL_FRIEND
A FriendDecl record.
@ DECL_CXX_METHOD
A CXXMethodDecl record.
@ DECL_EXPORT
An ExportDecl record.
@ DECL_BINDING
A BindingDecl record.
@ DECL_PRAGMA_COMMENT
A PragmaCommentDecl record.
@ DECL_ENUM
An EnumDecl record.
@ DECL_DECOMPOSITION
A DecompositionDecl record.
@ DECL_OMP_DECLARE_REDUCTION
An OMPDeclareReductionDecl record.
@ DECL_OMP_THREADPRIVATE
An OMPThreadPrivateDecl record.
@ DECL_OBJC_METHOD
A ObjCMethodDecl record.
@ DECL_CXX_DESTRUCTOR
A CXXDestructorDecl record.
@ DECL_OMP_CAPTUREDEXPR
An OMPCapturedExprDecl record.
@ DECL_CLASS_TEMPLATE
A ClassTemplateDecl record.
@ DECL_USING_SHADOW
A UsingShadowDecl record.
@ DECL_CONCEPT
A ConceptDecl record.
@ DECL_CXX_DEDUCTION_GUIDE
A CXXDeductionGuideDecl record.
@ DECL_OMP_REQUIRES
An OMPRequiresDecl record.
@ DECL_OBJC_IVAR
A ObjCIvarDecl record.
@ DECL_OBJC_PROPERTY
A ObjCPropertyDecl record.
@ DECL_TEMPLATE_PARAM_OBJECT
A TemplateParamObjectDecl record.
@ DECL_OBJC_INTERFACE
A ObjCInterfaceDecl record.
@ DECL_VAR_TEMPLATE
A VarTemplateDecl record.
@ DECL_LIFETIME_EXTENDED_TEMPORARY
An LifetimeExtendedTemporaryDecl record.
@ DECL_CLASS_TEMPLATE_PARTIAL_SPECIALIZATION
A ClassTemplatePartialSpecializationDecl record.
@ DECL_IMPLICIT_CONCEPT_SPECIALIZATION
An ImplicitConceptSpecializationDecl record.
@ DECL_CONTEXT_VISIBLE
A record that stores the set of declarations that are visible from a given DeclContext.
@ DECL_OBJC_PROPERTY_IMPL
A ObjCPropertyImplDecl record.
Defines the Linkage enumeration and various utility functions.
const internal::VariadicAllOfMatcher< Decl > decl
Matches declarations.
ComparisonCategoryResult Compare(const T &X, const T &Y)
Helper to compare two comparable types.
uint64_t TypeID
An ID number that refers to a type in an AST file.
uint32_t SubmoduleID
An ID number that refers to a submodule in a module file.
bool needsAnonymousDeclarationNumber(const NamedDecl *D)
Determine whether the given declaration needs an anonymous declaration number.
void numberAnonymousDeclsWithin(const DeclContext *DC, Fn Visit)
Visit each declaration within DC that needs an anonymous declaration number and call Visit with the d...
bool isPartOfPerModuleInitializer(const Decl *D)
Determine whether the given declaration will be included in the per-module initializer if it needs to...
@ UPD_CXX_RESOLVED_DTOR_DELETE
@ UPD_CXX_INSTANTIATED_DEFAULT_MEMBER_INITIALIZER
@ UPD_CXX_DEDUCED_RETURN_TYPE
@ UPD_CXX_ADDED_TEMPLATE_SPECIALIZATION
@ UPD_CXX_ADDED_IMPLICIT_MEMBER
@ UPD_DECL_MARKED_OPENMP_DECLARETARGET
@ UPD_CXX_POINT_OF_INSTANTIATION
@ UPD_CXX_RESOLVED_EXCEPTION_SPEC
@ UPD_CXX_ADDED_FUNCTION_DEFINITION
@ UPD_DECL_MARKED_OPENMP_THREADPRIVATE
@ UPD_STATIC_LOCAL_NUMBER
@ UPD_CXX_INSTANTIATED_DEFAULT_ARGUMENT
@ UPD_ADDED_ATTR_TO_RECORD
@ UPD_DECL_MARKED_OPENMP_ALLOCATE
@ UPD_CXX_ADDED_ANONYMOUS_NAMESPACE
@ UPD_CXX_INSTANTIATED_CLASS_DEFINITION
@ UPD_CXX_ADDED_VAR_DEFINITION
The JSON file list parser is used to communicate input to InstallAPI.
SelectorLocationsKind
Whether all locations of the selector identifiers are in a "standard" position.
if(T->getSizeExpr()) TRY_TO(TraverseStmt(const_cast< Expr * >(T -> getSizeExpr())))
bool isUnresolvedExceptionSpec(ExceptionSpecificationType ESpecType)
ConstexprSpecKind
Define the kind of constexpr specifier.
LinkageSpecLanguageIDs
Represents the language in a linkage specification.
LazyOffsetPtr< Stmt, uint64_t, &ExternalASTSource::GetExternalDeclStmt > LazyDeclStmtPtr
A lazy pointer to a statement.
LambdaCaptureKind
The different capture forms in a lambda introducer.
@ LCK_ByCopy
Capturing by copy (a.k.a., by value)
@ LCK_ByRef
Capturing by reference.
@ LCK_VLAType
Capturing variable-length array type.
@ LCK_StarThis
Capturing the *this object by copy.
@ LCK_This
Capturing the *this object by reference.
OMPDeclareReductionInitKind
StorageClass
Storage classes.
Linkage
Describes the different kinds of linkage (C++ [basic.link], C99 6.2.2) that an entity may have.
@ None
No linkage, which means that the entity is unique and can only be referred to from within its scope.
@ Result
The result type of a method or function.
TagTypeKind
The kind of a tag type.
ObjCImplementationControl
RecordArgPassingKind
Enum that represents the different ways arguments are passed to and returned from function calls.
static bool isUndeducedReturnType(QualType T)
bool operator!=(CanQual< T > x, CanQual< U > y)
for(const auto &A :T->param_types())
const FunctionProtoType * T
DeductionCandidate
Only used by CXXDeductionGuideDecl.
bool shouldSkipCheckingODR(const Decl *D)
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
@ Interface
The "__interface" keyword introduces the elaborated-type-specifier.
@ Class
The "class" keyword introduces the elaborated-type-specifier.
void runWithSufficientStackSpace(llvm::function_ref< void()> Diag, llvm::function_ref< void()> Fn)
Run a given function on a stack with "sufficient" space.
@ Other
Other implicit parameter.
AccessSpecifier
A C++ access specifier (public, private, protected), plus the special value "none" which means differ...
Structure used to store a statement, the constant value to which it was evaluated (if any),...
bool HasConstantDestruction
Whether this variable is known to have constant destruction.
bool WasEvaluated
Whether this statement was already evaluated.
bool HasConstantInitialization
Whether this variable is known to have constant initialization.
Provides information about an explicit instantiation of a variable or class template.
SourceLocation ExternKeywordLoc
The location of the extern keyword.
Data that is common to all of the declarations of a given function template.
llvm::FoldingSetVector< FunctionTemplateSpecializationInfo > Specializations
The function template specializations for this function template, including explicit specializations ...
A struct with extended info about a syntactic name qualifier, to be used for the case of out-of-line ...
Helper class that saves the current stream position and then restores it when destroyed.
Describes the categories of an Objective-C class.