57 #include "llvm/ADT/DenseMap.h"
58 #include "llvm/ADT/FoldingSet.h"
59 #include "llvm/ADT/STLExtras.h"
60 #include "llvm/ADT/SmallPtrSet.h"
61 #include "llvm/ADT/SmallVector.h"
62 #include "llvm/ADT/iterator_range.h"
63 #include "llvm/Bitstream/BitstreamReader.h"
64 #include "llvm/Support/Casting.h"
65 #include "llvm/Support/ErrorHandling.h"
66 #include "llvm/Support/SaveAndRestore.h"
74 using namespace clang;
75 using namespace serialization;
86 ASTReader::RecordLocation
Loc;
93 unsigned AnonymousDeclNumber = 0;
100 bool IsDeclMarkedUsed =
false;
106 assert(LocalOffset <
Loc.Offset &&
"offset point after current record");
107 return LocalOffset ?
Loc.Offset - LocalOffset : 0;
112 return Local ?
Record.getGlobalBitOffset(Local) : 0;
116 return Record.readSourceLocation();
120 return Record.readSourceRange();
124 return Record.readTypeSourceInfo();
129 std::string readString() {
130 return Record.readString();
134 for (
unsigned I = 0, Size =
Record.readInt(); I != Size; ++I)
135 IDs.push_back(readDeclID());
155 return Record.getSubmodule(readSubmoduleID());
159 Decl *LambdaContext =
nullptr,
160 unsigned IndexInLambdaContext = 0);
161 void ReadCXXDefinitionData(
struct CXXRecordDecl::DefinitionData &
Data,
163 unsigned IndexInLambdaContext);
165 struct CXXRecordDecl::DefinitionData &&NewDD);
166 void ReadObjCDefinitionData(
struct ObjCInterfaceDecl::DefinitionData &
Data);
168 struct ObjCInterfaceDecl::DefinitionData &&NewDD);
169 void ReadObjCDefinitionData(
struct ObjCProtocolDecl::DefinitionData &
Data);
171 struct ObjCProtocolDecl::DefinitionData &&NewDD);
189 class RedeclarableResult {
196 : MergeWith(MergeWith), FirstID(FirstID), IsKeyDecl(IsKeyDecl) {}
202 bool isKeyDecl()
const {
return IsKeyDecl; }
206 Decl *getKnownMergeTarget()
const {
return MergeWith; }
214 class FindExistingResult {
218 bool AddResult =
false;
219 unsigned AnonymousDeclNumber = 0;
223 FindExistingResult(
ASTReader &Reader) : Reader(Reader) {}
226 unsigned AnonymousDeclNumber,
228 : Reader(Reader), New(New), Existing(Existing), AddResult(
true),
229 AnonymousDeclNumber(AnonymousDeclNumber),
230 TypedefNameForLinkage(TypedefNameForLinkage) {}
232 FindExistingResult(FindExistingResult &&
Other)
234 AddResult(
Other.AddResult),
235 AnonymousDeclNumber(
Other.AnonymousDeclNumber),
236 TypedefNameForLinkage(
Other.TypedefNameForLinkage) {
237 Other.AddResult =
false;
240 FindExistingResult &operator=(FindExistingResult &&) =
delete;
241 ~FindExistingResult();
245 void suppress() { AddResult =
false; }
247 operator NamedDecl*()
const {
return Existing; }
250 operator T*()
const {
return dyn_cast_or_null<T>(Existing); }
255 FindExistingResult findExisting(
NamedDecl *D);
262 ThisDeclLoc(ThisDeclLoc) {}
264 template <
typename T>
273 auto *&LazySpecializations = D->getCommonPtr()->LazySpecializations;
275 if (
auto &Old = LazySpecializations) {
276 IDs.insert(IDs.end(), Old + 1, Old + 1 + Old[0].get());
278 IDs.erase(std::unique(IDs.begin(), IDs.end()), IDs.end());
284 std::copy(IDs.begin(), IDs.end(), Result + 1);
286 LazySpecializations = Result;
289 template <
typename DeclT>
291 static Decl *getMostRecentDeclImpl(...);
292 static Decl *getMostRecentDecl(
Decl *D);
294 static void mergeInheritableAttributes(
ASTReader &Reader,
Decl *D,
297 template <
typename DeclT>
298 static void attachPreviousDeclImpl(
ASTReader &Reader,
301 static void attachPreviousDeclImpl(
ASTReader &Reader, ...);
305 template <
typename DeclT>
307 static void attachLatestDeclImpl(...);
308 static void attachLatestDecl(
Decl *D,
Decl *latest);
310 template <
typename DeclT>
312 static void markIncompleteDeclChainImpl(...);
321 Cat->NextClassCategory = Next;
324 void VisitDecl(
Decl *D);
340 RedeclarableResult VisitTagDecl(
TagDecl *TD);
342 RedeclarableResult VisitRecordDeclImpl(
RecordDecl *RD);
346 RedeclarableResult VisitClassTemplateSpecializationDeclImpl(
351 VisitClassTemplateSpecializationDeclImpl(D);
354 void VisitClassTemplatePartialSpecializationDecl(
360 VisitVarTemplateSpecializationDeclImpl(D);
363 void VisitVarTemplatePartialSpecializationDecl(
382 RedeclarableResult VisitVarDeclImpl(
VarDecl *D);
383 void ReadVarDeclInit(
VarDecl *VD);
392 void VisitImplicitConceptSpecializationDecl(
421 std::pair<uint64_t, uint64_t> VisitDeclContext(
DeclContext *DC);
426 template <
typename T>
427 void mergeRedeclarable(
Redeclarable<T> *D, RedeclarableResult &Redecl);
429 void mergeLambda(
CXXRecordDecl *D, RedeclarableResult &Redecl,
430 Decl *Context,
unsigned Number);
433 RedeclarableResult &Redecl);
435 template <
typename T>
437 RedeclarableResult &Redecl);
479 template <
typename DeclT>
class MergedRedeclIterator {
480 DeclT *Start =
nullptr;
481 DeclT *Canonical =
nullptr;
482 DeclT *Current =
nullptr;
485 MergedRedeclIterator() =
default;
486 MergedRedeclIterator(DeclT *Start) : Start(Start), Current(Start) {}
490 MergedRedeclIterator &operator++() {
491 if (Current->isFirstDecl()) {
493 Current = Current->getMostRecentDecl();
495 Current = Current->getPreviousDecl();
501 if (Current == Start || Current == Canonical)
506 friend bool operator!=(
const MergedRedeclIterator &A,
507 const MergedRedeclIterator &B) {
508 return A.Current != B.Current;
514 template <
typename DeclT>
515 static llvm::iterator_range<MergedRedeclIterator<DeclT>>
517 return llvm::make_range(MergedRedeclIterator<DeclT>(D),
518 MergedRedeclIterator<DeclT>());
521 uint64_t ASTDeclReader::GetCurrentCursorOffset() {
522 return Loc.F->DeclsCursor.GetCurrentBitNo() +
Loc.F->GlobalBitOffset;
527 Reader.DefinitionSource[FD] =
529 Reader.getContext().getLangOpts().BuildingPCHWithObjectFile;
531 if (
auto *CD = dyn_cast<CXXConstructorDecl>(FD)) {
532 CD->setNumCtorInitializers(
Record.readInt());
533 if (CD->getNumCtorInitializers())
534 CD->CtorInitializers = ReadGlobalOffset();
537 Reader.PendingBodies[FD] = GetCurrentCursorOffset();
546 IsDeclMarkedUsed =
false;
548 if (
auto *DD = dyn_cast<DeclaratorDecl>(D)) {
549 if (
auto *TInfo = DD->getTypeSourceInfo())
550 Record.readTypeLoc(TInfo->getTypeLoc());
553 if (
auto *TD = dyn_cast<TypeDecl>(D)) {
555 TD->setTypeForDecl(Reader.GetType(DeferredTypeID).getTypePtrOrNull());
559 if (NamedDeclForTagDecl.isValid())
560 cast<TagDecl>(D)->TypedefNameDeclOrQualifier =
561 cast<TypedefNameDecl>(Reader.GetDecl(NamedDeclForTagDecl));
562 }
else if (
auto *
ID = dyn_cast<ObjCInterfaceDecl>(D)) {
564 ID->TypeForDecl = Reader.GetType(DeferredTypeID).getTypePtrOrNull();
565 }
else if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
568 ReadFunctionDefinition(FD);
569 }
else if (
auto *VD = dyn_cast<VarDecl>(D)) {
571 }
else if (
auto *FD = dyn_cast<FieldDecl>(D)) {
572 if (FD->hasInClassInitializer() &&
Record.readInt()) {
573 FD->setLazyInClassInitializer(
LazyDeclStmtPtr(GetCurrentCursorOffset()));
580 auto ModuleOwnership =
584 IsDeclMarkedUsed |= D->Used;
587 bool HasStandaloneLexicalDC = DeclBits.
getNextBit();
594 isa<ParmVarDecl, ObjCTypeParamDecl>(D)) {
601 GlobalDeclID SemaDCIDForTemplateParmDecl = readDeclID();
604 if (LexicalDCIDForTemplateParmDecl.
isInvalid())
605 LexicalDCIDForTemplateParmDecl = SemaDCIDForTemplateParmDecl;
606 Reader.addPendingDeclContextInfo(D,
607 SemaDCIDForTemplateParmDecl,
608 LexicalDCIDForTemplateParmDecl);
611 auto *SemaDC = readDeclAs<DeclContext>();
613 HasStandaloneLexicalDC ? readDeclAs<DeclContext>() :
nullptr;
619 if (
auto *RD = dyn_cast<CXXRecordDecl>(SemaDC))
620 MergedSemaDC = getOrFakePrimaryClassDefinition(Reader, RD);
622 MergedSemaDC = Reader.MergedDeclContexts.
lookup(SemaDC);
625 D->setDeclContextsImpl(MergedSemaDC ? MergedSemaDC : SemaDC, LexicalDC,
626 Reader.getContext());
632 Record.readAttributes(Attrs);
635 D->setAttrsImpl(Attrs, Reader.getContext());
643 switch (ModuleOwnership) {
661 }
else if (Reader.getContext().getLangOpts().ModulesLocalVisibility) {
669 Reader.HiddenNamesMap[Owner].push_back(D);
671 }
else if (ModulePrivate) {
680 std::string Arg = readString();
681 memcpy(D->getTrailingObjects<
char>(), Arg.data(), Arg.size());
682 D->getTrailingObjects<
char>()[Arg.size()] =
'\0';
688 std::string Name = readString();
689 memcpy(D->getTrailingObjects<
char>(), Name.data(), Name.size());
690 D->getTrailingObjects<
char>()[Name.size()] =
'\0';
692 D->ValueStart = Name.size() + 1;
693 std::string
Value = readString();
694 memcpy(D->getTrailingObjects<
char>() + D->ValueStart,
Value.data(),
696 D->getTrailingObjects<
char>()[D->ValueStart +
Value.size()] =
'\0';
700 llvm_unreachable(
"Translation units are not serialized");
706 AnonymousDeclNumber =
Record.readInt();
713 DeferredTypeID =
Record.getGlobalTypeID(
Record.readInt());
716 ASTDeclReader::RedeclarableResult
718 RedeclarableResult Redecl = VisitRedeclarable(TD);
735 RedeclarableResult Redecl = VisitTypedefNameDecl(TD);
736 mergeRedeclarable(TD, Redecl);
740 RedeclarableResult Redecl = VisitTypedefNameDecl(TD);
741 if (
auto *Template = readDeclAs<TypeAliasTemplateDecl>())
745 mergeRedeclarable(TD, Redecl);
749 RedeclarableResult Redecl = VisitRedeclarable(TD);
768 Record.readQualifierInfo(*Info);
769 TD->TypedefNameDeclOrQualifier = Info;
773 NamedDeclForTagDecl = readDeclID();
774 TypedefNameForLinkage =
Record.readIdentifier();
777 llvm_unreachable(
"unexpected tag info kind");
780 if (!isa<CXXRecordDecl>(TD))
781 mergeRedeclarable(TD, Redecl);
794 ED->setNumPositiveBits(EnumDeclBits.
getNextBits(8));
795 ED->setNumNegativeBits(EnumDeclBits.
getNextBits(8));
796 bool ShouldSkipCheckingODR = EnumDeclBits.
getNextBit();
801 if (!ShouldSkipCheckingODR) {
802 ED->setHasODRHash(
true);
803 ED->ODRHash =
Record.readInt();
814 if (!D->isFromASTFile() && D->isCompleteDefinition()) {
821 Reader.MergedDeclContexts.insert(std::make_pair(ED, OldDef));
823 Reader.mergeDefinitionVisibility(OldDef, ED);
828 Reader.PendingEnumOdrMergeFailures[OldDef].push_back(ED);
834 if (
auto *InstED = readDeclAs<EnumDecl>()) {
837 ED->setInstantiationOfMemberEnum(Reader.getContext(), InstED, TSK);
842 ASTDeclReader::RedeclarableResult
844 RedeclarableResult Redecl = VisitTagDecl(RD);
865 VisitRecordDeclImpl(RD);
869 RD->setODRHash(
Record.readInt());
875 RecordDecl *&OldDef = Reader.RecordDefinitions[Canon];
880 if (!D->isFromASTFile() && D->isCompleteDefinition()) {
887 Reader.MergedDeclContexts.insert(std::make_pair(RD, OldDef));
889 Reader.mergeDefinitionVisibility(OldDef, RD);
891 Reader.PendingRecordOdrMergeFailures[OldDef].push_back(RD);
903 if (isa<FunctionDecl, VarDecl>(VD))
904 DeferredTypeID =
Record.getGlobalTypeID(
Record.readInt());
921 auto *Info =
new (Reader.getContext()) DeclaratorDecl::ExtInfo();
922 Record.readQualifierInfo(*Info);
923 Info->TrailingRequiresClause =
Record.readExpr();
928 TSIType.
isNull() ? nullptr
929 : Reader.getContext().CreateTypeSourceInfo(TSIType));
933 RedeclarableResult Redecl = VisitRedeclarable(FD);
944 auto *Template = readDeclAs<FunctionTemplateDecl>();
950 auto *InstFD = readDeclAs<FunctionDecl>();
953 FD->setInstantiationOfMemberFunction(Reader.getContext(), InstFD, TSK);
958 auto *Template = readDeclAs<FunctionTemplateDecl>();
963 Record.readTemplateArgumentList(TemplArgs,
true);
967 bool HasTemplateArgumentsAsWritten =
Record.readBool();
968 if (HasTemplateArgumentsAsWritten)
969 Record.readTemplateArgumentListInfo(TemplArgsWritten);
979 auto *FD = readDeclAs<FunctionDecl>();
989 C, FD, Template, TSK, TemplArgList,
990 HasTemplateArgumentsAsWritten ? &TemplArgsWritten :
nullptr, POI,
992 FD->TemplateOrSpecialization = FTInfo;
997 auto *CanonTemplate = readDeclAs<FunctionTemplateDecl>();
1003 llvm::FoldingSetNodeID
ID;
1005 void *InsertPos =
nullptr;
1012 assert(Reader.getContext().getLangOpts().Modules &&
1013 "already deserialized this template specialization");
1022 unsigned NumCandidates =
Record.readInt();
1023 while (NumCandidates--)
1024 Candidates.
addDecl(readDeclAs<NamedDecl>());
1028 bool HasTemplateArgumentsAsWritten =
Record.readBool();
1029 if (HasTemplateArgumentsAsWritten)
1030 Record.readTemplateArgumentListInfo(TemplArgsWritten);
1033 Reader.getContext(), Candidates,
1034 HasTemplateArgumentsAsWritten ? &TemplArgsWritten :
nullptr);
1041 VisitDeclaratorDecl(FD);
1053 Reader.PendingDeducedFunctionTypes.push_back({FD, DeferredTypeID});
1055 FD->
setType(Reader.GetType(DeferredTypeID));
1068 bool ShouldSkipCheckingODR = FunctionDeclBits.
getNextBit();
1076 const bool Pure = FunctionDeclBits.
getNextBit();
1094 FD->EndRangeLoc = readSourceLocation();
1098 if (!ShouldSkipCheckingODR) {
1099 FD->ODRHash =
Record.readInt();
1100 FD->setHasODRHash(
true);
1107 if (
auto Info =
Record.readInt()) {
1108 bool HasMessage = Info & 2;
1110 HasMessage ? cast<StringLiteral>(
Record.readExpr()) :
nullptr;
1112 unsigned NumLookups =
Record.readInt();
1114 for (
unsigned I = 0; I != NumLookups; ++I) {
1122 Reader.getContext(), Lookups, DeletedMessage));
1127 mergeRedeclarable(FD, Existing, Redecl);
1133 auto merge = [
this, &Redecl, FD](
auto &&F) {
1134 auto *Existing = cast_or_null<FunctionDecl>(Redecl.getKnownMergeTarget());
1135 RedeclarableResult NewRedecl(Existing ? F(Existing) :
nullptr,
1136 Redecl.getFirstID(), Redecl.isKeyDecl());
1137 mergeRedeclarableTemplate(F(FD), NewRedecl);
1147 mergeRedeclarable(FD, Redecl);
1154 unsigned NumParams =
Record.readInt();
1156 Params.reserve(NumParams);
1157 for (
unsigned I = 0; I != NumParams; ++I)
1158 Params.push_back(readDeclAs<ParmVarDecl>());
1159 FD->setParams(Reader.getContext(), Params);
1167 Reader.PendingBodies[MD] = GetCurrentCursorOffset();
1170 MD->
setCmdDecl(readDeclAs<ImplicitParamDecl>());
1182 Reader.getContext().setObjCMethodRedeclaration(MD,
1183 readDeclAs<ObjCMethodDecl>());
1191 MD->DeclEndLoc = readSourceLocation();
1192 unsigned NumParams =
Record.readInt();
1194 Params.reserve(NumParams);
1195 for (
unsigned I = 0; I != NumParams; ++I)
1196 Params.push_back(readDeclAs<ParmVarDecl>());
1199 unsigned NumStoredSelLocs =
Record.readInt();
1201 SelLocs.reserve(NumStoredSelLocs);
1202 for (
unsigned i = 0; i != NumStoredSelLocs; ++i)
1203 SelLocs.push_back(readSourceLocation());
1205 MD->setParamsAndSelLocs(Reader.getContext(), Params, SelLocs);
1209 VisitTypedefNameDecl(D);
1211 D->Variance =
Record.readInt();
1212 D->Index =
Record.readInt();
1213 D->VarianceLoc = readSourceLocation();
1214 D->ColonLoc = readSourceLocation();
1224 unsigned numParams =
Record.readInt();
1229 typeParams.reserve(numParams);
1230 for (
unsigned i = 0; i != numParams; ++i) {
1231 auto *typeParam = readDeclAs<ObjCTypeParamDecl>();
1235 typeParams.push_back(typeParam);
1242 typeParams, rAngleLoc);
1245 void ASTDeclReader::ReadObjCDefinitionData(
1246 struct ObjCInterfaceDecl::DefinitionData &Data) {
1248 Data.SuperClassTInfo = readTypeSourceInfo();
1250 Data.EndLoc = readSourceLocation();
1251 Data.HasDesignatedInitializers =
Record.readInt();
1253 Data.HasODRHash =
true;
1256 unsigned NumProtocols =
Record.readInt();
1258 Protocols.reserve(NumProtocols);
1259 for (
unsigned I = 0; I != NumProtocols; ++I)
1260 Protocols.push_back(readDeclAs<ObjCProtocolDecl>());
1262 ProtoLocs.reserve(NumProtocols);
1263 for (
unsigned I = 0; I != NumProtocols; ++I)
1264 ProtoLocs.push_back(readSourceLocation());
1265 Data.ReferencedProtocols.set(Protocols.data(), NumProtocols, ProtoLocs.data(),
1266 Reader.getContext());
1269 NumProtocols =
Record.readInt();
1271 Protocols.reserve(NumProtocols);
1272 for (
unsigned I = 0; I != NumProtocols; ++I)
1273 Protocols.push_back(readDeclAs<ObjCProtocolDecl>());
1274 Data.AllReferencedProtocols.set(Protocols.data(), NumProtocols,
1275 Reader.getContext());
1279 struct ObjCInterfaceDecl::DefinitionData &&NewDD) {
1280 struct ObjCInterfaceDecl::DefinitionData &DD = D->data();
1281 if (DD.Definition == NewDD.Definition)
1284 Reader.MergedDeclContexts.insert(
1285 std::make_pair(NewDD.Definition, DD.Definition));
1286 Reader.mergeDefinitionVisibility(DD.Definition, NewDD.Definition);
1289 Reader.PendingObjCInterfaceOdrMergeFailures[DD.Definition].push_back(
1290 {NewDD.Definition, &NewDD});
1294 RedeclarableResult Redecl = VisitRedeclarable(
ID);
1295 VisitObjCContainerDecl(
ID);
1296 DeferredTypeID =
Record.getGlobalTypeID(
Record.readInt());
1297 mergeRedeclarable(
ID, Redecl);
1299 ID->TypeParamList = ReadObjCTypeParamList();
1302 ID->allocateDefinitionData();
1304 ReadObjCDefinitionData(
ID->data());
1306 if (Canon->Data.getPointer()) {
1309 MergeDefinitionData(Canon, std::move(
ID->data()));
1310 ID->Data = Canon->Data;
1314 ID->getCanonicalDecl()->Data =
ID->Data;
1317 ID->setIvarList(
nullptr);
1321 Reader.PendingDefinitions.insert(
ID);
1324 Reader.ObjCClassesLoaded.push_back(
ID);
1326 ID->Data =
ID->getCanonicalDecl()->Data;
1331 VisitFieldDecl(IVD);
1335 bool synth =
Record.readInt();
1350 if (PrevIvar && PrevIvar != IVD) {
1351 auto *ParentExt = dyn_cast<ObjCCategoryDecl>(IVD->
getDeclContext());
1352 auto *PrevParentExt =
1354 if (ParentExt && PrevParentExt) {
1358 .PendingObjCExtensionIvarRedeclarations[std::make_pair(ParentExt,
1360 .push_back(std::make_pair(IVD, PrevIvar));
1361 }
else if (ParentExt || PrevParentExt) {
1365 Reader.Diag(IVD->
getLocation(), diag::err_duplicate_ivar_declaration)
1367 Reader.Diag(PrevIvar->
getLocation(), diag::note_previous_definition);
1372 void ASTDeclReader::ReadObjCDefinitionData(
1373 struct ObjCProtocolDecl::DefinitionData &
Data) {
1374 unsigned NumProtoRefs =
Record.readInt();
1376 ProtoRefs.reserve(NumProtoRefs);
1377 for (
unsigned I = 0; I != NumProtoRefs; ++I)
1378 ProtoRefs.push_back(readDeclAs<ObjCProtocolDecl>());
1380 ProtoLocs.reserve(NumProtoRefs);
1381 for (
unsigned I = 0; I != NumProtoRefs; ++I)
1382 ProtoLocs.push_back(readSourceLocation());
1383 Data.ReferencedProtocols.set(ProtoRefs.data(), NumProtoRefs,
1384 ProtoLocs.data(), Reader.getContext());
1386 Data.HasODRHash =
true;
1389 void ASTDeclReader::MergeDefinitionData(
1391 struct ObjCProtocolDecl::DefinitionData &DD = D->data();
1392 if (DD.Definition == NewDD.Definition)
1395 Reader.MergedDeclContexts.insert(
1396 std::make_pair(NewDD.Definition, DD.Definition));
1397 Reader.mergeDefinitionVisibility(DD.Definition, NewDD.Definition);
1400 Reader.PendingObjCProtocolOdrMergeFailures[DD.Definition].push_back(
1401 {NewDD.Definition, &NewDD});
1405 RedeclarableResult Redecl = VisitRedeclarable(PD);
1406 VisitObjCContainerDecl(PD);
1407 mergeRedeclarable(PD, Redecl);
1411 PD->allocateDefinitionData();
1413 ReadObjCDefinitionData(PD->data());
1416 if (Canon->Data.getPointer()) {
1419 MergeDefinitionData(Canon, std::move(PD->data()));
1420 PD->Data = Canon->Data;
1427 Reader.PendingDefinitions.insert(PD);
1438 VisitObjCContainerDecl(CD);
1446 Reader.CategoriesDeserialized.insert(CD);
1448 CD->ClassInterface = readDeclAs<ObjCInterfaceDecl>();
1449 CD->TypeParamList = ReadObjCTypeParamList();
1450 unsigned NumProtoRefs =
Record.readInt();
1452 ProtoRefs.reserve(NumProtoRefs);
1453 for (
unsigned I = 0; I != NumProtoRefs; ++I)
1454 ProtoRefs.push_back(readDeclAs<ObjCProtocolDecl>());
1456 ProtoLocs.reserve(NumProtoRefs);
1457 for (
unsigned I = 0; I != NumProtoRefs; ++I)
1458 ProtoLocs.push_back(readSourceLocation());
1460 Reader.getContext());
1466 Reader.getContext());
1470 VisitNamedDecl(CAD);
1498 VisitObjCContainerDecl(D);
1503 VisitObjCImplDecl(D);
1504 D->CategoryNameLoc = readSourceLocation();
1508 VisitObjCImplDecl(D);
1510 D->SuperLoc = readSourceLocation();
1515 D->NumIvarInitializers =
Record.readInt();
1516 if (D->NumIvarInitializers)
1517 D->IvarInitializers = ReadGlobalOffset();
1524 D->PropertyIvarDecl = readDeclAs<ObjCIvarDecl>();
1525 D->IvarLoc = readSourceLocation();
1533 VisitDeclaratorDecl(FD);
1534 FD->Mutable =
Record.readInt();
1536 unsigned Bits =
Record.readInt();
1537 FD->StorageKind = Bits >> 1;
1538 if (FD->StorageKind == FieldDecl::ISK_CapturedVLAType)
1540 cast<VariableArrayType>(
Record.readType().getTypePtr());
1545 if (
auto *Tmpl = readDeclAs<FieldDecl>())
1546 Reader.getContext().setInstantiatedFromUnnamedFieldDecl(FD, Tmpl);
1552 VisitDeclaratorDecl(PD);
1553 PD->GetterId =
Record.readIdentifier();
1554 PD->SetterId =
Record.readIdentifier();
1566 if (
MSGuidDecl *Existing = Reader.getContext().MSGuidDecls.GetOrInsertNode(D))
1573 D->Value =
Record.readAPValue();
1577 Reader.getContext().UnnamedGlobalConstantDecls.GetOrInsertNode(D))
1583 D->Value =
Record.readAPValue();
1588 Reader.getContext().TemplateParamObjectDecls.GetOrInsertNode(D))
1595 FD->ChainingSize =
Record.readInt();
1596 assert(FD->ChainingSize >= 2 &&
"Anonymous chaining must be >= 2");
1597 FD->Chaining =
new (Reader.getContext())
NamedDecl*[FD->ChainingSize];
1599 for (
unsigned I = 0; I != FD->ChainingSize; ++I)
1600 FD->Chaining[I] = readDeclAs<NamedDecl>();
1606 RedeclarableResult Redecl = VisitRedeclarable(VD);
1607 VisitDeclaratorDecl(VD);
1611 bool DefGeneratedInModule = VarDeclBits.
getNextBit();
1616 bool HasDeducedType =
false;
1617 if (!isa<ParmVarDecl>(VD)) {
1643 Reader.PendingDeducedVarTypes.push_back({VD, DeferredTypeID});
1645 VD->
setType(Reader.GetType(DeferredTypeID));
1655 if (DefGeneratedInModule) {
1656 Reader.DefinitionSource[VD] =
1658 Reader.getContext().getLangOpts().BuildingPCHWithObjectFile;
1661 if (VD->
hasAttr<BlocksAttr>()) {
1664 Reader.getContext().setBlockVarCopyInit(VD, CopyExpr,
Record.readInt());
1668 VarNotTemplate = 0, VarTemplate, StaticDataMemberSpecialization
1670 switch ((VarKind)
Record.readInt()) {
1671 case VarNotTemplate:
1674 if (!isa<ParmVarDecl>(VD) && !isa<ImplicitParamDecl>(VD) &&
1675 !isa<VarTemplateSpecializationDecl>(VD))
1676 mergeRedeclarable(VD, Redecl);
1682 case StaticDataMemberSpecialization: {
1683 auto *Tmpl = readDeclAs<VarDecl>();
1686 Reader.getContext().setInstantiatedFromStaticDataMember(VD, Tmpl, TSK,POI);
1687 mergeRedeclarable(VD, Redecl);
1704 Reader.getContext().addDestruction(&Eval->
Evaluated);
1710 Eval->
Value = GetCurrentCursorOffset();
1721 unsigned scopeIndex =
Record.readInt();
1723 unsigned isObjCMethodParam = ParmVarDeclBits.
getNextBit();
1724 unsigned scopeDepth = ParmVarDeclBits.
getNextBits(7);
1725 unsigned declQualifier = ParmVarDeclBits.
getNextBits(7);
1726 if (isObjCMethodParam) {
1727 assert(scopeDepth == 0);
1740 PD->ExplicitObjectParameterIntroducerLoc =
Record.readSourceLocation();
1748 auto **BDs = DD->getTrailingObjects<
BindingDecl *>();
1749 for (
unsigned I = 0; I != DD->NumBindings; ++I) {
1750 BDs[I] = readDeclAs<BindingDecl>();
1751 BDs[I]->setDecomposedDecl(DD);
1757 BD->Binding =
Record.readExpr();
1768 D->Statement =
Record.readStmt();
1775 unsigned NumParams =
Record.readInt();
1777 Params.reserve(NumParams);
1778 for (
unsigned I = 0; I != NumParams; ++I)
1779 Params.push_back(readDeclAs<ParmVarDecl>());
1788 bool capturesCXXThis =
Record.readInt();
1789 unsigned numCaptures =
Record.readInt();
1791 captures.reserve(numCaptures);
1792 for (
unsigned i = 0; i != numCaptures; ++i) {
1793 auto *
decl = readDeclAs<VarDecl>();
1794 unsigned flags =
Record.readInt();
1795 bool byRef = (flags & 1);
1796 bool nested = (flags & 2);
1797 Expr *copyExpr = ((flags & 4) ?
Record.readExpr() :
nullptr);
1801 BD->
setCaptures(Reader.getContext(), captures, capturesCXXThis);
1806 unsigned ContextParamPos =
Record.readInt();
1809 for (
unsigned I = 0; I < CD->NumParams; ++I) {
1810 if (I != ContextParamPos)
1811 CD->
setParam(I, readDeclAs<ImplicitParamDecl>());
1826 D->RBraceLoc = readSourceLocation();
1835 RedeclarableResult Redecl = VisitRedeclarable(D);
1841 D->LocStart = readSourceLocation();
1842 D->RBraceLoc = readSourceLocation();
1849 if (Redecl.getFirstID() == ThisDeclID) {
1850 AnonNamespace = readDeclID();
1854 D->AnonOrFirstNamespaceAndFlags.setPointer(D->
getFirstDecl());
1857 mergeRedeclarable(D, Redecl);
1859 if (AnonNamespace.
isValid()) {
1863 auto *Anon = cast<NamespaceDecl>(Reader.GetDecl(AnonNamespace));
1871 VisitDeclContext(D);
1872 D->IsCBuffer =
Record.readBool();
1873 D->KwLoc = readSourceLocation();
1874 D->LBraceLoc = readSourceLocation();
1875 D->RBraceLoc = readSourceLocation();
1879 RedeclarableResult Redecl = VisitRedeclarable(D);
1881 D->NamespaceLoc = readSourceLocation();
1882 D->IdentLoc = readSourceLocation();
1883 D->QualifierLoc =
Record.readNestedNameSpecifierLoc();
1884 D->Namespace = readDeclAs<NamedDecl>();
1885 mergeRedeclarable(D, Redecl);
1891 D->QualifierLoc =
Record.readNestedNameSpecifierLoc();
1893 D->FirstUsingShadow.setPointer(readDeclAs<UsingShadowDecl>());
1895 if (
auto *Pattern = readDeclAs<NamedDecl>())
1896 Reader.getContext().setInstantiatedFromUsingDecl(D, Pattern);
1905 D->FirstUsingShadow.setPointer(readDeclAs<UsingShadowDecl>());
1906 if (
auto *Pattern = readDeclAs<UsingEnumDecl>())
1907 Reader.getContext().setInstantiatedFromUsingEnumDecl(D, Pattern);
1913 D->InstantiatedFrom = readDeclAs<NamedDecl>();
1914 auto **Expansions = D->getTrailingObjects<
NamedDecl *>();
1915 for (
unsigned I = 0; I != D->NumExpansions; ++I)
1916 Expansions[I] = readDeclAs<NamedDecl>();
1921 RedeclarableResult Redecl = VisitRedeclarable(D);
1923 D->Underlying = readDeclAs<NamedDecl>();
1925 D->UsingOrNextShadow = readDeclAs<NamedDecl>();
1926 auto *Pattern = readDeclAs<UsingShadowDecl>();
1928 Reader.getContext().setInstantiatedFromUsingShadowDecl(D, Pattern);
1929 mergeRedeclarable(D, Redecl);
1934 VisitUsingShadowDecl(D);
1935 D->NominatedBaseClassShadowDecl = readDeclAs<ConstructorUsingShadowDecl>();
1936 D->ConstructedBaseClassShadowDecl = readDeclAs<ConstructorUsingShadowDecl>();
1937 D->IsVirtual =
Record.readInt();
1942 D->UsingLoc = readSourceLocation();
1943 D->NamespaceLoc = readSourceLocation();
1944 D->QualifierLoc =
Record.readNestedNameSpecifierLoc();
1945 D->NominatedNamespace = readDeclAs<NamedDecl>();
1946 D->CommonAncestor = readDeclAs<DeclContext>();
1952 D->QualifierLoc =
Record.readNestedNameSpecifierLoc();
1954 D->EllipsisLoc = readSourceLocation();
1961 D->TypenameLocation = readSourceLocation();
1962 D->QualifierLoc =
Record.readNestedNameSpecifierLoc();
1963 D->EllipsisLoc = readSourceLocation();
1972 void ASTDeclReader::ReadCXXDefinitionData(
1974 Decl *LambdaContext,
unsigned IndexInLambdaContext) {
1978 bool ShouldSkipCheckingODR = CXXRecordDeclBits.
getNextBit();
1980 #define FIELD(Name, Width, Merge) \
1981 if (!CXXRecordDeclBits.canGetNextNBits(Width)) \
1982 CXXRecordDeclBits.updateValue(Record.readInt()); \
1983 Data.Name = CXXRecordDeclBits.getNextBits(Width);
1985 #include "clang/AST/CXXRecordDeclDefinitionBits.def"
1989 if (!ShouldSkipCheckingODR) {
1992 Data.HasODRHash =
true;
1996 Reader.DefinitionSource[D] =
1998 Reader.getContext().getLangOpts().BuildingPCHWithObjectFile;
2002 Data.ComputedVisibleConversions =
Record.readInt();
2003 if (
Data.ComputedVisibleConversions)
2004 Record.readUnresolvedSet(
Data.VisibleConversions);
2005 assert(
Data.Definition &&
"Data.Definition should be already set!");
2007 if (!
Data.IsLambda) {
2008 assert(!LambdaContext && !IndexInLambdaContext &&
2009 "given lambda context for non-lambda");
2013 Data.Bases = ReadGlobalOffset();
2017 Data.VBases = ReadGlobalOffset();
2019 Data.FirstFriend = readDeclID().get();
2023 auto &Lambda =
static_cast<CXXRecordDecl::LambdaDefinitionData &
>(
Data);
2026 Lambda.DependencyKind = LambdaBits.getNextBits(2);
2027 Lambda.IsGenericLambda = LambdaBits.getNextBit();
2028 Lambda.CaptureDefault = LambdaBits.getNextBits(2);
2029 Lambda.NumCaptures = LambdaBits.getNextBits(15);
2030 Lambda.HasKnownInternalLinkage = LambdaBits.getNextBit();
2032 Lambda.NumExplicitCaptures =
Record.readInt();
2033 Lambda.ManglingNumber =
Record.readInt();
2034 if (
unsigned DeviceManglingNumber =
Record.readInt())
2035 Reader.getContext().DeviceLambdaManglingNumbers[D] = DeviceManglingNumber;
2036 Lambda.IndexInContext = IndexInLambdaContext;
2037 Lambda.ContextDecl = LambdaContext;
2039 if (Lambda.NumCaptures) {
2040 ToCapture = (
Capture *)Reader.getContext().Allocate(
sizeof(
Capture) *
2041 Lambda.NumCaptures);
2042 Lambda.AddCaptureList(Reader.getContext(), ToCapture);
2044 Lambda.MethodTyInfo = readTypeSourceInfo();
2045 for (
unsigned I = 0, N = Lambda.NumCaptures; I != N; ++I) {
2048 bool IsImplicit = CaptureBits.getNextBit();
2061 auto *Var = readDeclAs<ValueDecl>();
2063 new (ToCapture)
Capture(
Loc, IsImplicit,
Kind, Var, EllipsisLoc);
2071 void ASTDeclReader::MergeDefinitionData(
2072 CXXRecordDecl *D,
struct CXXRecordDecl::DefinitionData &&MergeDD) {
2073 assert(D->DefinitionData &&
2074 "merging class definition into non-definition");
2075 auto &DD = *D->DefinitionData;
2077 if (DD.Definition != MergeDD.Definition) {
2079 Reader.MergedDeclContexts.insert(std::make_pair(MergeDD.Definition,
2081 Reader.PendingDefinitions.erase(MergeDD.Definition);
2082 MergeDD.Definition->setCompleteDefinition(
false);
2083 Reader.mergeDefinitionVisibility(DD.Definition, MergeDD.Definition);
2084 assert(!Reader.Lookups.contains(MergeDD.Definition) &&
2085 "already loaded pending lookups for merged definition");
2088 auto PFDI = Reader.PendingFakeDefinitionData.find(&DD);
2089 if (PFDI != Reader.PendingFakeDefinitionData.end() &&
2090 PFDI->second == ASTReader::PendingFakeDefinitionKind::Fake) {
2093 assert(!DD.IsLambda && !MergeDD.IsLambda &&
"faked up lambda definition?");
2094 PFDI->second = ASTReader::PendingFakeDefinitionKind::FakeLoaded;
2098 auto *Def = DD.Definition;
2099 DD = std::move(MergeDD);
2100 DD.Definition = Def;
2104 bool DetectedOdrViolation =
false;
2106 #define FIELD(Name, Width, Merge) Merge(Name)
2107 #define MERGE_OR(Field) DD.Field |= MergeDD.Field;
2108 #define NO_MERGE(Field) \
2109 DetectedOdrViolation |= DD.Field != MergeDD.Field; \
2111 #include "clang/AST/CXXRecordDeclDefinitionBits.def"
2116 if (DD.NumBases != MergeDD.NumBases || DD.NumVBases != MergeDD.NumVBases)
2117 DetectedOdrViolation =
true;
2123 if (MergeDD.ComputedVisibleConversions && !DD.ComputedVisibleConversions) {
2124 DD.VisibleConversions = std::move(MergeDD.VisibleConversions);
2125 DD.ComputedVisibleConversions =
true;
2132 auto &Lambda1 =
static_cast<CXXRecordDecl::LambdaDefinitionData &
>(DD);
2133 auto &Lambda2 =
static_cast<CXXRecordDecl::LambdaDefinitionData &
>(MergeDD);
2134 DetectedOdrViolation |= Lambda1.DependencyKind != Lambda2.DependencyKind;
2135 DetectedOdrViolation |= Lambda1.IsGenericLambda != Lambda2.IsGenericLambda;
2136 DetectedOdrViolation |= Lambda1.CaptureDefault != Lambda2.CaptureDefault;
2137 DetectedOdrViolation |= Lambda1.NumCaptures != Lambda2.NumCaptures;
2138 DetectedOdrViolation |=
2139 Lambda1.NumExplicitCaptures != Lambda2.NumExplicitCaptures;
2140 DetectedOdrViolation |=
2141 Lambda1.HasKnownInternalLinkage != Lambda2.HasKnownInternalLinkage;
2142 DetectedOdrViolation |= Lambda1.ManglingNumber != Lambda2.ManglingNumber;
2144 if (Lambda1.NumCaptures && Lambda1.NumCaptures == Lambda2.NumCaptures) {
2145 for (
unsigned I = 0, N = Lambda1.NumCaptures; I != N; ++I) {
2150 Lambda1.AddCaptureList(Reader.getContext(), Lambda2.Captures.front());
2159 DetectedOdrViolation =
true;
2162 if (DetectedOdrViolation)
2163 Reader.PendingOdrMergeFailures[DD.Definition].push_back(
2164 {MergeDD.Definition, &MergeDD});
2168 Decl *LambdaContext,
2169 unsigned IndexInLambdaContext) {
2170 struct CXXRecordDecl::DefinitionData *DD;
2175 bool IsLambda =
Record.readInt();
2176 assert(!(IsLambda &&
Update) &&
2177 "lambda definition should not be added by update record");
2179 DD =
new (
C) CXXRecordDecl::LambdaDefinitionData(
2182 DD =
new (
C)
struct CXXRecordDecl::DefinitionData(D);
2188 if (!Canon->DefinitionData)
2189 Canon->DefinitionData = DD;
2190 D->DefinitionData = Canon->DefinitionData;
2191 ReadCXXDefinitionData(*DD, D, LambdaContext, IndexInLambdaContext);
2196 if (Canon->DefinitionData != DD) {
2197 MergeDefinitionData(Canon, std::move(*DD));
2207 if (
Update || Canon != D)
2208 Reader.PendingDefinitions.insert(D);
2211 ASTDeclReader::RedeclarableResult
2213 RedeclarableResult Redecl = VisitRecordDeclImpl(D);
2218 CXXRecNotTemplate = 0,
2220 CXXRecMemberSpecialization,
2224 Decl *LambdaContext =
nullptr;
2225 unsigned IndexInLambdaContext = 0;
2227 switch ((CXXRecKind)
Record.readInt()) {
2228 case CXXRecNotTemplate:
2230 if (!isa<ClassTemplateSpecializationDecl>(D))
2231 mergeRedeclarable(D, Redecl);
2233 case CXXRecTemplate: {
2235 auto *Template = readDeclAs<ClassTemplateDecl>();
2236 D->TemplateOrInstantiation = Template;
2237 if (!Template->getTemplatedDecl()) {
2248 case CXXRecMemberSpecialization: {
2249 auto *RD = readDeclAs<CXXRecordDecl>();
2254 D->TemplateOrInstantiation = MSI;
2255 mergeRedeclarable(D, Redecl);
2259 LambdaContext = readDecl();
2261 IndexInLambdaContext =
Record.readInt();
2262 mergeLambda(D, Redecl, LambdaContext, IndexInLambdaContext);
2267 bool WasDefinition =
Record.readInt();
2269 ReadCXXRecordDefinition(D,
false, LambdaContext,
2270 IndexInLambdaContext);
2277 if (WasDefinition) {
2283 C.KeyFunctions[D] = KeyFn.
get();
2290 D->setExplicitSpecifier(
Record.readExplicitSpec());
2291 D->Ctor = readDeclAs<CXXConstructorDecl>();
2292 VisitFunctionDecl(D);
2298 VisitFunctionDecl(D);
2300 unsigned NumOverridenMethods =
Record.readInt();
2302 while (NumOverridenMethods--) {
2305 if (
auto *MD = readDeclAs<CXXMethodDecl>())
2311 Record.skipInts(NumOverridenMethods);
2320 auto *Shadow = readDeclAs<ConstructorUsingShadowDecl>();
2321 auto *Ctor = readDeclAs<CXXConstructorDecl>();
2326 VisitCXXMethodDecl(D);
2330 VisitCXXMethodDecl(D);
2332 if (
auto *OperatorDelete = readDeclAs<FunctionDecl>()) {
2334 auto *ThisArg =
Record.readExpr();
2336 if (!Canon->OperatorDelete) {
2337 Canon->OperatorDelete = OperatorDelete;
2338 Canon->OperatorDeleteThisArg = ThisArg;
2345 VisitCXXMethodDecl(D);
2350 D->ImportedModule = readModule();
2351 D->setImportComplete(
Record.readInt());
2353 for (
unsigned I = 0, N =
Record.back(); I != N; ++I)
2354 StoredLocs[I] = readSourceLocation();
2366 D->Friend = readDeclAs<NamedDecl>();
2368 D->Friend = readTypeSourceInfo();
2369 for (
unsigned i = 0; i != D->NumTPLists; ++i)
2371 Record.readTemplateParameterList();
2372 D->NextFriend = readDeclID().
get();
2373 D->UnsupportedFriend = (
Record.readInt() != 0);
2374 D->FriendLoc = readSourceLocation();
2379 unsigned NumParams =
Record.readInt();
2380 D->NumParams = NumParams;
2382 for (
unsigned i = 0; i != NumParams; ++i)
2383 D->Params[i] =
Record.readTemplateParameterList();
2385 D->Friend = readDeclAs<NamedDecl>();
2387 D->Friend = readTypeSourceInfo();
2388 D->FriendLoc = readSourceLocation();
2396 D->
init(readDeclAs<NamedDecl>());
2400 VisitTemplateDecl(D);
2411 for (
unsigned I = 0; I < D->NumTemplateArgs; ++I)
2412 Args.push_back(
Record.readTemplateArgument(
true));
2419 ASTDeclReader::RedeclarableResult
2421 RedeclarableResult Redecl = VisitRedeclarable(D);
2428 Reader.PendingDefinitions.insert(CanonD);
2434 if (ThisDeclID == Redecl.getFirstID()) {
2435 if (
auto *RTD = readDeclAs<RedeclarableTemplateDecl>()) {
2436 assert(RTD->getKind() == D->
getKind() &&
2437 "InstantiatedFromMemberTemplate kind mismatch");
2444 VisitTemplateDecl(D);
2451 RedeclarableResult Redecl = VisitRedeclarableTemplateDecl(D);
2452 mergeRedeclarableTemplate(D, Redecl);
2454 if (ThisDeclID == Redecl.getFirstID()) {
2458 readDeclIDList(SpecIDs);
2466 Reader.getContext().getInjectedClassNameType(
2472 llvm_unreachable(
"BuiltinTemplates are not serialized");
2479 RedeclarableResult Redecl = VisitRedeclarableTemplateDecl(D);
2480 mergeRedeclarableTemplate(D, Redecl);
2482 if (ThisDeclID == Redecl.getFirstID()) {
2486 readDeclIDList(SpecIDs);
2491 ASTDeclReader::RedeclarableResult
2494 RedeclarableResult Redecl = VisitCXXRecordDeclImpl(D);
2497 if (
Decl *InstD = readDecl()) {
2498 if (
auto *CTD = dyn_cast<ClassTemplateDecl>(InstD)) {
2499 D->SpecializedTemplate = CTD;
2502 Record.readTemplateArgumentList(TemplArgs);
2507 SpecializedPartialSpecialization();
2508 PS->PartialSpecialization
2509 = cast<ClassTemplatePartialSpecializationDecl>(InstD);
2510 PS->TemplateArgs = ArgList;
2511 D->SpecializedTemplate = PS;
2516 Record.readTemplateArgumentList(TemplArgs,
true);
2518 D->PointOfInstantiation = readSourceLocation();
2521 bool writtenAsCanonicalDecl =
Record.readInt();
2522 if (writtenAsCanonicalDecl) {
2523 auto *CanonPattern = readDeclAs<ClassTemplateDecl>();
2527 if (
auto *Partial = dyn_cast<ClassTemplatePartialSpecializationDecl>(D)) {
2528 CanonSpec = CanonPattern->getCommonPtr()->PartialSpecializations
2529 .GetOrInsertNode(Partial);
2532 CanonPattern->getCommonPtr()->Specializations.GetOrInsertNode(D);
2535 if (CanonSpec != D) {
2536 mergeRedeclarable<TagDecl>(D, CanonSpec, Redecl);
2540 if (
auto *DDD = D->DefinitionData) {
2541 if (CanonSpec->DefinitionData)
2542 MergeDefinitionData(CanonSpec, std::move(*DDD));
2544 CanonSpec->DefinitionData = D->DefinitionData;
2546 D->DefinitionData = CanonSpec->DefinitionData;
2555 ExplicitInfo->TemplateKeywordLoc = readSourceLocation();
2556 D->ExplicitInfo = ExplicitInfo;
2570 D->TemplateParams = Params;
2572 RedeclarableResult Redecl = VisitClassTemplateSpecializationDeclImpl(D);
2575 if (ThisDeclID == Redecl.getFirstID()) {
2576 D->InstantiatedFromMember.setPointer(
2577 readDeclAs<ClassTemplatePartialSpecializationDecl>());
2578 D->InstantiatedFromMember.setInt(
Record.readInt());
2583 RedeclarableResult Redecl = VisitRedeclarableTemplateDecl(D);
2585 if (ThisDeclID == Redecl.getFirstID()) {
2588 readDeclIDList(SpecIDs);
2598 ASTDeclReader::RedeclarableResult
2602 if (
Decl *InstD = readDecl()) {
2603 if (
auto *VTD = dyn_cast<VarTemplateDecl>(InstD)) {
2604 D->SpecializedTemplate = VTD;
2607 Record.readTemplateArgumentList(TemplArgs);
2612 VarTemplateSpecializationDecl::SpecializedPartialSpecialization();
2613 PS->PartialSpecialization =
2614 cast<VarTemplatePartialSpecializationDecl>(InstD);
2615 PS->TemplateArgs = ArgList;
2616 D->SpecializedTemplate = PS;
2624 ExplicitInfo->TemplateKeywordLoc = readSourceLocation();
2625 D->ExplicitInfo = ExplicitInfo;
2632 Record.readTemplateArgumentList(TemplArgs,
true);
2634 D->PointOfInstantiation = readSourceLocation();
2636 D->IsCompleteDefinition =
Record.readInt();
2638 RedeclarableResult Redecl = VisitVarDeclImpl(D);
2640 bool writtenAsCanonicalDecl =
Record.readInt();
2641 if (writtenAsCanonicalDecl) {
2642 auto *CanonPattern = readDeclAs<VarTemplateDecl>();
2645 if (
auto *Partial = dyn_cast<VarTemplatePartialSpecializationDecl>(D)) {
2646 CanonSpec = CanonPattern->getCommonPtr()
2647 ->PartialSpecializations.GetOrInsertNode(Partial);
2650 CanonPattern->getCommonPtr()->Specializations.GetOrInsertNode(D);
2654 mergeRedeclarable<VarDecl>(D, CanonSpec, Redecl);
2669 D->TemplateParams = Params;
2671 RedeclarableResult Redecl = VisitVarTemplateSpecializationDeclImpl(D);
2674 if (ThisDeclID == Redecl.getFirstID()) {
2675 D->InstantiatedFromMember.setPointer(
2676 readDeclAs<VarTemplatePartialSpecializationDecl>());
2677 D->InstantiatedFromMember.setInt(
Record.readInt());
2689 CR =
Record.readConceptReference();
2690 Expr *ImmediatelyDeclaredConstraint =
Record.readExpr();
2693 if ((D->ExpandedParameterPack =
Record.readInt()))
2694 D->NumExpanded =
Record.readInt();
2699 Record.readTemplateArgumentLoc());
2703 VisitDeclaratorDecl(D);
2710 auto TypesAndInfos =
2711 D->getTrailingObjects<std::pair<QualType, TypeSourceInfo *>>();
2714 TypesAndInfos[I].second = readTypeSourceInfo();
2718 D->ParameterPack =
Record.readInt();
2721 Record.readTemplateArgumentLoc());
2726 VisitTemplateDecl(D);
2735 Data[I] =
Record.readTemplateParameterList();
2738 D->ParameterPack =
Record.readInt();
2741 Record.readTemplateArgumentLoc());
2746 RedeclarableResult Redecl = VisitRedeclarableTemplateDecl(D);
2747 mergeRedeclarableTemplate(D, Redecl);
2752 D->AssertExprAndFailed.setPointer(
Record.readExpr());
2753 D->AssertExprAndFailed.setInt(
Record.readInt());
2754 D->Message = cast_or_null<StringLiteral>(
Record.readExpr());
2755 D->RParenLoc = readSourceLocation();
2765 D->ExtendingDecl = readDeclAs<ValueDecl>();
2766 D->ExprWithTemporary =
Record.readStmt();
2771 D->ManglingNumber =
Record.readInt();
2775 std::pair<uint64_t, uint64_t>
2777 uint64_t LexicalOffset = ReadLocalOffset();
2778 uint64_t VisibleOffset = ReadLocalOffset();
2779 return std::make_pair(LexicalOffset, VisibleOffset);
2782 template <
typename T>
2783 ASTDeclReader::RedeclarableResult
2786 Decl *MergeWith =
nullptr;
2788 bool IsKeyDecl = ThisDeclID == FirstDeclID;
2789 bool IsFirstLocalDecl =
false;
2796 FirstDeclID = ThisDeclID;
2798 IsFirstLocalDecl =
true;
2799 }
else if (
unsigned N =
Record.readInt()) {
2803 IsFirstLocalDecl =
true;
2810 for (
unsigned I = 0; I != N - 1; ++I)
2811 MergeWith = readDecl();
2813 RedeclOffset = ReadLocalOffset();
2820 auto *FirstDecl = cast_or_null<T>(Reader.GetDecl(FirstDeclID));
2821 if (FirstDecl != D) {
2827 D->
First = FirstDecl->getCanonicalDecl();
2830 auto *DAsT =
static_cast<T *
>(D);
2836 if (IsFirstLocalDecl)
2837 Reader.PendingDeclChains.push_back(std::make_pair(DAsT, RedeclOffset));
2839 return RedeclarableResult(MergeWith, FirstDeclID, IsKeyDecl);
2844 template <
typename T>
2846 RedeclarableResult &Redecl) {
2848 if (!Reader.getContext().getLangOpts().Modules)
2855 auto *D =
static_cast<T *
>(DBase);
2857 if (
auto *Existing = Redecl.getKnownMergeTarget())
2859 mergeRedeclarable(D, cast<T>(Existing), Redecl);
2860 else if (FindExistingResult ExistingRes = findExisting(D))
2861 if (
T *Existing = ExistingRes)
2862 mergeRedeclarable(D, Existing, Redecl);
2872 Decl *Context,
unsigned IndexInContext) {
2876 return mergeRedeclarable(D, Redecl);
2879 if (!Reader.getContext().getLangOpts().Modules)
2886 if (
auto *Existing = Redecl.getKnownMergeTarget())
2888 mergeRedeclarable(D, cast<TagDecl>(Existing), Redecl);
2892 NamedDecl *&Slot = Reader.LambdaDeclarationsForMerging[{
2893 Context->getCanonicalDecl(), IndexInContext}];
2895 mergeRedeclarable(D, cast<TagDecl>(Slot), Redecl);
2901 RedeclarableResult &Redecl) {
2902 mergeRedeclarable(D, Redecl);
2914 llvm_unreachable(
"bad assert_cast");
2924 RedeclarableResult Result(
2926 GlobalDeclID(DPattern->getCanonicalDecl()->getGlobalID()), IsKeyDecl);
2928 if (
auto *DClass = dyn_cast<CXXRecordDecl>(DPattern)) {
2931 auto *ExistingClass =
2932 cast<CXXRecordDecl>(ExistingPattern)->getCanonicalDecl();
2933 if (
auto *DDD = DClass->DefinitionData) {
2934 if (ExistingClass->DefinitionData) {
2935 MergeDefinitionData(ExistingClass, std::move(*DDD));
2937 ExistingClass->DefinitionData = DClass->DefinitionData;
2940 Reader.PendingDefinitions.insert(DClass);
2943 DClass->DefinitionData = ExistingClass->DefinitionData;
2945 return mergeRedeclarable(DClass, cast<TagDecl>(ExistingPattern),
2948 if (
auto *DFunction = dyn_cast<FunctionDecl>(DPattern))
2949 return mergeRedeclarable(DFunction, cast<FunctionDecl>(ExistingPattern),
2951 if (
auto *DVar = dyn_cast<VarDecl>(DPattern))
2952 return mergeRedeclarable(DVar, cast<VarDecl>(ExistingPattern), Result);
2953 if (
auto *DAlias = dyn_cast<TypeAliasDecl>(DPattern))
2954 return mergeRedeclarable(DAlias, cast<TypedefNameDecl>(ExistingPattern),
2956 llvm_unreachable(
"merged an unknown kind of redeclarable template");
2961 template <
typename T>
2963 RedeclarableResult &Redecl) {
2964 auto *D =
static_cast<T *
>(DBase);
2965 T *ExistingCanon = Existing->getCanonicalDecl();
2967 if (ExistingCanon != DCanon) {
2972 D->
First = ExistingCanon;
2973 ExistingCanon->Used |= D->Used;
2979 if (
auto *Namespace = dyn_cast<NamespaceDecl>(D))
2980 Namespace->AnonOrFirstNamespaceAndFlags.setPointer(
2981 assert_cast<NamespaceDecl *>(ExistingCanon));
2984 if (
auto *DTemplate = dyn_cast<RedeclarableTemplateDecl>(D))
2985 mergeTemplatePattern(
2986 DTemplate, assert_cast<RedeclarableTemplateDecl *>(ExistingCanon),
2987 Redecl.isKeyDecl());
2990 if (Redecl.isKeyDecl())
2991 Reader.KeyDecls[ExistingCanon].push_back(Redecl.getFirstID());
3004 if (isa<EnumConstantDecl, FieldDecl, IndirectFieldDecl>(ND))
3013 if (!Reader.getContext().getLangOpts().Modules)
3019 Reader.LETemporaryForMerging[std::make_pair(
3022 Reader.getContext().setPrimaryMergedDecl(LETDecl,
3032 template<
typename T>
3035 if (!Reader.getContext().getLangOpts().Modules)
3042 if (!Reader.getContext().getLangOpts().CPlusPlus &&
3046 if (FindExistingResult ExistingRes = findExisting(
static_cast<T*
>(D)))
3047 if (
T *Existing = ExistingRes)
3048 Reader.getContext().setPrimaryMergedDecl(
static_cast<T *
>(D),
3049 Existing->getCanonicalDecl());
3081 D->PrevDeclInScope = readDeclID().
get();
3087 D->VarName =
Record.readDeclarationName();
3088 D->PrevDeclInScope = readDeclID().
get();
3110 bool readBool() {
return Reader.
readBool(); }
3124 std::string readString() {
3136 VersionTuple readVersionTuple() {
3142 template <
typename T>
T *GetLocalDeclAs(
LocalDeclID LocalID) {
3149 AttrReader
Record(*
this);
3154 Attr *New =
nullptr;
3164 unsigned ParsedKind =
Record.readInt();
3165 unsigned Syntax =
Record.readInt();
3166 unsigned SpellingIndex =
Record.readInt();
3167 bool IsAlignas = (ParsedKind == AttributeCommonInfo::AT_Aligned &&
3169 SpellingIndex == AlignedAttr::Keyword_alignas);
3170 bool IsRegularKeywordAttribute =
Record.readBool();
3175 IsAlignas, IsRegularKeywordAttribute});
3177 #include "clang/Serialization/AttrPCHRead.inc"
3179 assert(New &&
"Unable to decode attribute?");
3185 for (
unsigned I = 0, E = readInt(); I != E; ++I)
3186 if (
auto *A = readAttr())
3200 inline void ASTReader::LoadedDecl(
unsigned Index,
Decl *D) {
3201 assert(!DeclsLoaded[Index] &&
"Decl loaded twice?");
3202 DeclsLoaded[Index] = D;
3211 bool ASTReader::isConsumerInterestedIn(
Decl *D) {
3220 getContext().DeclMustBeEmitted(D))
3230 if (
const auto *Var = dyn_cast<VarDecl>(D))
3231 return Var->isFileVarDecl() &&
3233 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(Var));
3234 if (
const auto *Func = dyn_cast<FunctionDecl>(D))
3235 return Func->doesThisDeclarationHaveABody() || PendingBodies.count(D);
3245 ASTReader::RecordLocation ASTReader::DeclCursorForID(
GlobalDeclID ID,
3247 GlobalDeclMapType::iterator I = GlobalDeclMap.find(
ID);
3248 assert(I != GlobalDeclMap.end() &&
"Corrupted global declaration map");
3256 ASTReader::RecordLocation ASTReader::getLocalBitOffset(
uint64_t GlobalOffset) {
3257 auto I = GlobalBitOffsetsMap.find(GlobalOffset);
3259 assert(I != GlobalBitOffsetsMap.end() &&
"Corrupted global bit offsets map");
3260 return RecordLocation(I->second, GlobalOffset - I->second->GlobalBitOffset);
3268 ASTDeclReader::getOrFakePrimaryClassDefinition(
ASTReader &Reader,
3271 auto *DD = RD->DefinitionData;
3280 DD =
new (Reader.
getContext())
struct CXXRecordDecl::DefinitionData(RD);
3282 RD->DefinitionData = DD;
3286 Reader.PendingFakeDefinitionData.insert(
3287 std::make_pair(DD, ASTReader::PendingFakeDefinitionKind::Fake));
3290 return DD->Definition;
3297 if (
auto *ND = dyn_cast<NamespaceDecl>(DC))
3298 return ND->getOriginalNamespace();
3300 if (
auto *RD = dyn_cast<CXXRecordDecl>(DC))
3301 return getOrFakePrimaryClassDefinition(Reader, RD);
3303 if (
auto *RD = dyn_cast<RecordDecl>(DC))
3306 if (
auto *ED = dyn_cast<EnumDecl>(DC))
3309 if (
auto *OID = dyn_cast<ObjCInterfaceDecl>(DC))
3314 if (
auto *TU = dyn_cast<TranslationUnitDecl>(DC))
3320 ASTDeclReader::FindExistingResult::~FindExistingResult() {
3323 if (TypedefNameForLinkage) {
3325 Reader.ImportedTypedefNamesForLinkage.insert(
3326 std::make_pair(std::make_pair(DC, TypedefNameForLinkage), New));
3330 if (!AddResult || Existing)
3336 setAnonymousDeclForMerging(Reader, New->getLexicalDeclContext(),
3337 AnonymousDeclNumber, New);
3341 Reader.PendingFakeLookupResults[Name.getAsIdentifierInfo()]
3343 }
else if (
DeclContext *MergeDC = getPrimaryContextForMerging(Reader, DC)) {
3346 MergeDC->makeDeclVisibleInContextImpl(New,
true);
3354 bool IsTypedefNameForLinkage) {
3355 if (!IsTypedefNameForLinkage)
3364 if (
auto *TND = dyn_cast<TypedefNameDecl>(Found))
3365 return TND->getAnonDeclWithTypedefName(
true);
3374 ASTDeclReader::getPrimaryDCForAnonymousDecl(
DeclContext *LexicalDC) {
3376 if (
auto *RD = dyn_cast<CXXRecordDecl>(LexicalDC)) {
3378 return DD ? DD->Definition :
nullptr;
3379 }
else if (
auto *OID = dyn_cast<ObjCInterfaceDecl>(LexicalDC)) {
3380 return OID->getCanonicalDecl()->getDefinition();
3387 if (
auto *FD = dyn_cast<FunctionDecl>(D))
3388 if (FD->isThisDeclarationADefinition())
3390 if (
auto *MD = dyn_cast<ObjCMethodDecl>(D))
3391 if (MD->isThisDeclarationADefinition())
3393 if (
auto *RD = dyn_cast<RecordDecl>(D))
3410 auto &
Previous = Reader.AnonymousDeclarationsForMerging[CanonDC];
3416 auto *PrimaryDC = getPrimaryDCForAnonymousDecl(DC);
3417 if (PrimaryDC && !cast<Decl>(PrimaryDC)->isFromASTFile()) {
3429 void ASTDeclReader::setAnonymousDeclForMerging(
ASTReader &Reader,
3432 auto *CanonDC = cast<Decl>(DC)->getCanonicalDecl();
3434 auto &
Previous = Reader.AnonymousDeclarationsForMerging[CanonDC];
3441 ASTDeclReader::FindExistingResult ASTDeclReader::findExisting(
NamedDecl *D) {
3448 FindExistingResult Result(Reader, D,
nullptr,
3449 AnonymousDeclNumber, TypedefNameForLinkage);
3456 if (TypedefNameForLinkage) {
3457 auto It = Reader.ImportedTypedefNamesForLinkage.find(
3458 std::make_pair(DC, TypedefNameForLinkage));
3459 if (It != Reader.ImportedTypedefNamesForLinkage.end())
3460 if (
C.isSameEntity(It->second, D))
3461 return FindExistingResult(Reader, D, It->second, AnonymousDeclNumber,
3462 TypedefNameForLinkage);
3470 if (
auto *Existing = getAnonymousDeclForMerging(
3472 if (
C.isSameEntity(Existing, D))
3473 return FindExistingResult(Reader, D, Existing, AnonymousDeclNumber,
3474 TypedefNameForLinkage);
3481 class UpToDateIdentifierRAII {
3483 bool WasOutToDate =
false;
3494 ~UpToDateIdentifierRAII() {
3498 } UpToDate(Name.getAsIdentifierInfo());
3501 IEnd = IdResolver.
end();
3504 if (
C.isSameEntity(Existing, D))
3505 return FindExistingResult(Reader, D, Existing, AnonymousDeclNumber,
3506 TypedefNameForLinkage);
3508 }
else if (
DeclContext *MergeDC = getPrimaryContextForMerging(Reader, DC)) {
3512 if (
C.isSameEntity(Existing, D))
3513 return FindExistingResult(Reader, D, Existing, AnonymousDeclNumber,
3514 TypedefNameForLinkage);
3518 return FindExistingResult(Reader);
3530 if (MergedDCIt != Reader.MergedDeclContexts.end() &&
3532 Reader.PendingOdrMergeChecks.push_back(D);
3534 return FindExistingResult(Reader, D,
nullptr,
3535 AnonymousDeclNumber, TypedefNameForLinkage);
3538 template<
typename DeclT>
3544 llvm_unreachable(
"getMostRecentDecl on non-redeclarable declaration");
3551 #define ABSTRACT_DECL(TYPE)
3552 #define DECL(TYPE, BASE) \
3554 return getMostRecentDeclImpl(cast<TYPE##Decl>(D));
3555 #include "clang/AST/DeclNodes.inc"
3557 llvm_unreachable(
"unknown decl kind");
3560 Decl *ASTReader::getMostRecentExistingDecl(
Decl *D) {
3568 const auto *IA =
Previous->getAttr<MSInheritanceAttr>();
3570 if (IA && !D->
hasAttr<MSInheritanceAttr>()) {
3571 NewAttr = cast<InheritableAttr>(IA->clone(Context));
3576 const auto *AA =
Previous->getAttr<AvailabilityAttr>();
3577 if (AA && !D->
hasAttr<AvailabilityAttr>()) {
3578 NewAttr = AA->
clone(Context);
3584 template<
typename DeclT>
3598 auto *VD =
static_cast<VarDecl *
>(D);
3599 auto *PrevVD = cast<VarDecl>(
Previous);
3610 VD->demoteThisDefinitionToDeclaration();
3627 auto *PrevFD = cast<FunctionDecl>(
Previous);
3629 FD->RedeclLink.setPrevious(PrevFD);
3630 FD->First = PrevFD->First;
3634 if (PrevFD->isInlined() != FD->isInlined()) {
3650 FD->setImplicitlyInline(
true);
3655 if (FPT && PrevFPT) {
3659 bool WasUnresolved =
3661 if (IsUnresolved != WasUnresolved)
3662 Reader.PendingExceptionSpecUpdates.insert(
3663 {Canon, IsUnresolved ? PrevFD : FD});
3669 if (IsUndeduced != WasUndeduced)
3670 Reader.PendingDeducedTypeUpdates.insert(
3671 {cast<FunctionDecl>(Canon),
3672 (IsUndeduced ? PrevFPT : FPT)->getReturnType()});
3679 llvm_unreachable(
"attachPreviousDecl on non-redeclarable declaration");
3684 template <
typename ParmDecl>
3687 auto *To = cast<ParmDecl>(ToD);
3688 if (!From->hasDefaultArgument())
3690 To->setInheritedDefaultArgument(Context, From);
3699 assert(FromTP->size() == ToTP->size() &&
"merged mismatched templates?");
3701 for (
unsigned I = 0, N = FromTP->size(); I != N; ++I) {
3702 NamedDecl *FromParam = FromTP->getParam(I);
3705 if (
auto *FTTP = dyn_cast<TemplateTypeParmDecl>(FromParam))
3707 else if (
auto *FNTTP = dyn_cast<NonTypeTemplateParmDecl>(FromParam))
3711 Context, cast<TemplateTemplateParmDecl>(FromParam), ToParam);
3720 #define ABSTRACT_DECL(TYPE)
3721 #define DECL(TYPE, BASE) \
3723 attachPreviousDeclImpl(Reader, cast<TYPE##Decl>(D), Previous, Canon); \
3725 #include "clang/AST/DeclNodes.inc"
3739 if (
auto *TD = dyn_cast<TemplateDecl>(D))
3747 mergeInheritableAttributes(Reader, D,
Previous);
3750 template<
typename DeclT>
3756 llvm_unreachable(
"attachLatestDecl on non-redeclarable declaration");
3760 assert(D && Latest);
3763 #define ABSTRACT_DECL(TYPE)
3764 #define DECL(TYPE, BASE) \
3766 attachLatestDeclImpl(cast<TYPE##Decl>(D), Latest); \
3768 #include "clang/AST/DeclNodes.inc"
3772 template<
typename DeclT>
3778 llvm_unreachable(
"markIncompleteDeclChain on non-redeclarable declaration");
3781 void ASTReader::markIncompleteDeclChain(
Decl *D) {
3783 #define ABSTRACT_DECL(TYPE)
3784 #define DECL(TYPE, BASE) \
3786 ASTDeclReader::markIncompleteDeclChainImpl(cast<TYPE##Decl>(D)); \
3788 #include "clang/AST/DeclNodes.inc"
3796 RecordLocation
Loc = DeclCursorForID(
ID, DeclLoc);
3797 llvm::BitstreamCursor &DeclsCursor =
Loc.F->DeclsCursor;
3802 ReadingKindTracker ReadingKind(Read_Decl, *
this);
3805 Deserializing ADecl(
this);
3807 auto Fail = [](
const char *what, llvm::Error &&Err) {
3808 llvm::report_fatal_error(Twine(
"ASTReader::readDeclRecord failed ") + what +
3812 if (llvm::Error JumpFailed = DeclsCursor.JumpToBit(
Loc.Offset))
3813 Fail(
"jumping", std::move(JumpFailed));
3818 Fail(
"reading code", MaybeCode.takeError());
3819 unsigned Code = MaybeCode.get();
3825 llvm::report_fatal_error(
3826 Twine(
"ASTReader::readDeclRecord failed reading decl code: ") +
3827 toString(MaybeDeclCode.takeError()));
3829 switch ((
DeclCode)MaybeDeclCode.get()) {
3832 llvm_unreachable(
"Record cannot be de-serialized with readDeclRecord");
3942 bool HasTypeConstraint =
Record.readInt();
3948 bool HasTypeConstraint =
Record.readInt();
3954 bool HasTypeConstraint =
Record.readInt();
3956 Context,
ID,
Record.readInt(), HasTypeConstraint);
4045 D = MSGuidDecl::CreateDeserialized(Context,
ID);
4048 D = UnnamedGlobalConstantDecl::CreateDeserialized(Context,
ID);
4051 D = TemplateParamObjectDecl::CreateDeserialized(Context,
ID);
4057 Error(
"attempt to read a C++ base-specifier record as a declaration");
4060 Error(
"attempt to read a C++ ctor initializer record as a declaration");
4069 unsigned NumChildren =
Record.readInt();
4075 unsigned NumClauses =
Record.readInt();
4076 unsigned NumVars =
Record.readInt();
4082 unsigned NumClauses =
Record.readInt();
4091 unsigned NumClauses =
Record.readInt();
4124 assert(D &&
"Unknown declaration reading AST file");
4125 LoadedDecl(Index, D);
4134 if (
auto *DC = dyn_cast<DeclContext>(D)) {
4135 std::pair<uint64_t, uint64_t> Offsets = Reader.VisitDeclContext(DC);
4140 if (!Offsets.first && !Offsets.second && isa<NamespaceDecl>(D))
4141 if (
auto Iter = DelayedNamespaceOffsetMap.find(
ID);
4142 Iter != DelayedNamespaceOffsetMap.end())
4143 Offsets =
Iter->second;
4145 if (Offsets.first &&
4146 ReadLexicalDeclContextStorage(*
Loc.F, DeclsCursor, Offsets.first, DC))
4148 if (Offsets.second &&
4149 ReadVisibleDeclContextStorage(*
Loc.F, DeclsCursor, Offsets.second,
ID))
4155 PendingUpdateRecords.push_back(
4156 PendingUpdateRecord(
ID, D,
true));
4159 if (
auto *Class = dyn_cast<ObjCInterfaceDecl>(D))
4162 if (
Class->isThisDeclarationADefinition() ||
4163 PendingDefinitions.count(Class))
4164 loadObjCCategories(
ID, Class);
4170 PotentiallyInterestingDecls.push_back(D);
4175 void ASTReader::PassInterestingDeclsToConsumer() {
4178 if (PassingDeclsToConsumer)
4183 SaveAndRestore GuardPassingDeclsToConsumer(PassingDeclsToConsumer,
true);
4187 for (
auto ID : EagerlyDeserializedDecls)
4189 EagerlyDeserializedDecls.clear();
4191 auto ConsumingPotentialInterestingDecls = [
this]() {
4192 while (!PotentiallyInterestingDecls.empty()) {
4193 Decl *D = PotentiallyInterestingDecls.front();
4194 PotentiallyInterestingDecls.pop_front();
4195 if (isConsumerInterestedIn(D))
4196 PassInterestingDeclToConsumer(D);
4199 std::deque<Decl *> MaybeInterestingDecls =
4200 std::move(PotentiallyInterestingDecls);
4201 assert(PotentiallyInterestingDecls.empty());
4202 while (!MaybeInterestingDecls.empty()) {
4203 Decl *D = MaybeInterestingDecls.front();
4204 MaybeInterestingDecls.pop_front();
4210 if (
auto *VD = dyn_cast<VarDecl>(D);
4211 VD && VD->isFileVarDecl() && !VD->isExternallyVisible())
4213 ConsumingPotentialInterestingDecls();
4214 if (isConsumerInterestedIn(D))
4215 PassInterestingDeclToConsumer(D);
4219 ConsumingPotentialInterestingDecls();
4222 void ASTReader::loadDeclUpdateRecords(PendingUpdateRecord &
Record) {
4228 ProcessingUpdatesRAIIObj ProcessingUpdates(*
this);
4229 DeclUpdateOffsetsMap::iterator UpdI = DeclUpdateOffsets.find(
ID);
4233 if (UpdI != DeclUpdateOffsets.end()) {
4234 auto UpdateOffsets = std::move(UpdI->second);
4235 DeclUpdateOffsets.erase(UpdI);
4241 bool WasInteresting =
Record.JustLoaded || isConsumerInterestedIn(D);
4242 for (
auto &FileAndOffset : UpdateOffsets) {
4249 llvm::report_fatal_error(
4250 Twine(
"ASTReader::loadDeclUpdateRecords failed jumping: ") +
4254 llvm::report_fatal_error(
4255 Twine(
"ASTReader::loadDeclUpdateRecords failed reading code: ") +
4257 unsigned Code = MaybeCode.get();
4261 "Expected DECL_UPDATES record!");
4263 llvm::report_fatal_error(
4264 Twine(
"ASTReader::loadDeclUpdateRecords failed reading rec code: ") +
4269 Reader.UpdateDecl(D, PendingLazySpecializationIDs);
4273 if (!WasInteresting && isConsumerInterestedIn(D)) {
4274 PotentiallyInterestingDecls.push_back(D);
4275 WasInteresting =
true;
4280 assert((PendingLazySpecializationIDs.empty() || isa<ClassTemplateDecl>(D) ||
4281 isa<FunctionTemplateDecl, VarTemplateDecl>(D)) &&
4282 "Must not have pending specializations");
4283 if (
auto *CTD = dyn_cast<ClassTemplateDecl>(D))
4285 else if (
auto *FTD = dyn_cast<FunctionTemplateDecl>(D))
4287 else if (
auto *VTD = dyn_cast<VarTemplateDecl>(D))
4289 PendingLazySpecializationIDs.clear();
4292 auto I = PendingVisibleUpdates.find(
ID);
4293 if (I != PendingVisibleUpdates.end()) {
4294 auto VisibleUpdates = std::move(I->second);
4295 PendingVisibleUpdates.erase(I);
4298 for (
const auto &Update : VisibleUpdates)
4299 Lookups[DC].Table.add(
4306 void ASTReader::loadPendingDeclChain(
Decl *FirstLocal,
uint64_t LocalOffset) {
4309 if (FirstLocal != CanonDecl) {
4312 *
this, FirstLocal, PrevMostRecent ? PrevMostRecent : CanonDecl,
4322 ModuleFile *M = getOwningModuleFile(FirstLocal);
4323 assert(M &&
"imported decl from no module file");
4327 if (llvm::Error JumpFailed =
Cursor.JumpToBit(LocalOffset))
4328 llvm::report_fatal_error(
4329 Twine(
"ASTReader::loadPendingDeclChain failed jumping: ") +
4335 llvm::report_fatal_error(
4336 Twine(
"ASTReader::loadPendingDeclChain failed reading code: ") +
4338 unsigned Code = MaybeCode.get();
4341 "expected LOCAL_REDECLARATIONS record!");
4343 llvm::report_fatal_error(
4344 Twine(
"ASTReader::loadPendingDeclChain failed reading rec code: ") +
4349 Decl *MostRecent = FirstLocal;
4350 for (
unsigned I = 0, N =
Record.size(); I != N; ++I) {
4362 class ObjCCategoriesVisitor {
4365 llvm::SmallPtrSetImpl<ObjCCategoryDecl *> &Deserialized;
4367 llvm::DenseMap<DeclarationName, ObjCCategoryDecl *> NameCategoryMap;
4369 unsigned PreviousGeneration;
4373 if (!Deserialized.erase(Cat))
4388 if (!Ctx.IsEquivalent(Cat, Existing)) {
4393 diag::note_previous_definition);
4395 }
else if (!Existing) {
4410 ObjCCategoriesVisitor(
4412 llvm::SmallPtrSetImpl<ObjCCategoryDecl *> &Deserialized,
4415 InterfaceID(InterfaceID), PreviousGeneration(PreviousGeneration) {
4417 for (
auto *Cat :
Interface->known_categories()) {
4448 Result->DefinitionID != LocalID) {
4456 unsigned Offset = Result->Offset;
4459 for (
unsigned I = 0; I != N; ++I)
4460 add(cast_or_null<ObjCCategoryDecl>(
4469 unsigned PreviousGeneration) {
4470 ObjCCategoriesVisitor Visitor(*
this, D, CategoriesDeserialized,
ID,
4471 PreviousGeneration);
4472 ModuleMgr.visit(Visitor);
4475 template<
typename DeclT,
typename Fn>
4484 for (
auto *Redecl = MostRecent; Redecl && !Found;
4486 Found = (Redecl == D);
4490 for (
auto *Redecl = MostRecent; Redecl != D;
4502 auto *RD = cast<CXXRecordDecl>(D);
4504 assert(MD &&
"couldn't read decl from update record");
4505 Reader.PendingAddedClassMembers.push_back({RD, MD});
4511 PendingLazySpecializationIDs.push_back(readDeclID());
4515 auto *Anon = readDeclAs<NamespaceDecl>();
4520 if (!
Record.isModule()) {
4521 if (
auto *TU = dyn_cast<TranslationUnitDecl>(D))
4522 TU->setAnonymousNamespace(Anon);
4524 cast<NamespaceDecl>(D)->setAnonymousNamespace(Anon);
4530 auto *VD = cast<VarDecl>(D);
4531 VD->NonParmVarDeclBits.IsInline =
Record.readInt();
4532 VD->NonParmVarDeclBits.IsInlineSpecified =
Record.readInt();
4533 ReadVarDeclInit(VD);
4539 if (
auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D)) {
4540 VTSD->setPointOfInstantiation(POI);
4541 }
else if (
auto *VD = dyn_cast<VarDecl>(D)) {
4543 assert(MSInfo &&
"No member specialization information");
4546 auto *FD = cast<FunctionDecl>(D);
4547 if (
auto *FTSInfo = FD->TemplateOrSpecialization
4549 FTSInfo->setPointOfInstantiation(POI);
4552 ->setPointOfInstantiation(POI);
4558 auto *Param = cast<ParmVarDecl>(D);
4563 auto *DefaultArg =
Record.readExpr();
4567 if (Param->hasUninstantiatedDefaultArg())
4568 Param->setDefaultArg(DefaultArg);
4573 auto *FD = cast<FieldDecl>(D);
4574 auto *DefaultInit =
Record.readExpr();
4578 if (FD->hasInClassInitializer() && !FD->hasNonNullInClassInitializer()) {
4580 FD->setInClassInitializer(DefaultInit);
4584 FD->removeInClassInitializer();
4590 auto *FD = cast<FunctionDecl>(D);
4591 if (Reader.PendingBodies[FD]) {
4605 FD->setInnerLocStart(readSourceLocation());
4606 ReadFunctionDefinition(FD);
4607 assert(
Record.getIdx() ==
Record.size() &&
"lazy body must be last");
4612 auto *RD = cast<CXXRecordDecl>(D);
4614 bool HadRealDefinition =
4615 OldDD && (OldDD->Definition != RD ||
4616 !Reader.PendingFakeDefinitionData.count(OldDD));
4620 ReadCXXRecordDefinition(RD,
true);
4623 uint64_t LexicalOffset = ReadLocalOffset();
4624 if (!HadRealDefinition && LexicalOffset) {
4625 Record.readLexicalDeclContextStorage(LexicalOffset, RD);
4626 Reader.PendingFakeDefinitionData.erase(OldDD);
4633 MSInfo->setTemplateSpecializationKind(TSK);
4634 MSInfo->setPointOfInstantiation(POI);
4636 auto *Spec = cast<ClassTemplateSpecializationDecl>(RD);
4637 Spec->setTemplateSpecializationKind(TSK);
4638 Spec->setPointOfInstantiation(POI);
4642 readDeclAs<ClassTemplatePartialSpecializationDecl>();
4644 Record.readTemplateArgumentList(TemplArgs);
4650 if (!Spec->getSpecializedTemplateOrPartial()
4652 Spec->setInstantiationOf(PartialSpec, TemplArgList);
4663 Record.readAttributes(Attrs);
4675 auto *Del = readDeclAs<FunctionDecl>();
4677 auto *ThisArg =
Record.readExpr();
4679 if (!
First->OperatorDelete) {
4680 First->OperatorDelete = Del;
4681 First->OperatorDeleteThisArg = ThisArg;
4688 auto ESI =
Record.readExceptionSpecInfo(ExceptionStorage);
4691 auto *FD = cast<FunctionDecl>(D);
4697 FPT->getReturnType(), FPT->getParamTypes(),
4698 FPT->getExtProtoInfo().withExceptionSpec(ESI)));
4702 Reader.PendingExceptionSpecUpdates.insert(
4703 std::make_pair(FD->getCanonicalDecl(), FD));
4709 auto *FD = cast<FunctionDecl>(D);
4711 Reader.PendingDeducedTypeUpdates.insert(
4712 {FD->getCanonicalDecl(), DeducedResultType});
4733 readSourceRange()));
4737 auto AllocatorKind =
4738 static_cast<OMPAllocateDeclAttr::AllocatorTypeTy
>(
Record.readInt());
4742 D->
addAttr(OMPAllocateDeclAttr::CreateImplicit(
4743 Reader.
getContext(), AllocatorKind, Allocator, Alignment, SR));
4749 auto *Exported = cast<NamedDecl>(D);
4752 Reader.PendingMergedDefinitionsToDeduplicate.insert(Exported);
4757 auto MapType =
Record.readEnum<OMPDeclareTargetDeclAttr::MapTypeTy>();
4758 auto DevType =
Record.readEnum<OMPDeclareTargetDeclAttr::DevTypeTy>();
4762 D->
addAttr(OMPDeclareTargetDeclAttr::CreateImplicit(
4764 readSourceRange()));
4770 Record.readAttributes(Attrs);
4771 assert(Attrs.size() == 1);
This file provides AST data structures related to concepts.
Defines the clang::ASTContext interface.
static NamedDecl * getDeclForMerging(NamedDecl *Found, bool IsTypedefNameForLinkage)
Find the declaration that should be merged into, given the declaration found by name lookup.
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 bool inheritDefaultTemplateArgument(ASTContext &Context, ParmDecl *From, Decl *ToD)
Inherit the default template argument from From to To.
static void inheritDefaultTemplateArguments(ASTContext &Context, TemplateDecl *From, TemplateDecl *To)
static void forAllLaterRedecls(DeclT *D, Fn F)
static llvm::iterator_range< MergedRedeclIterator< DeclT > > merged_redecls(DeclT *D)
Defines the clang::attr::Kind enum.
clang::CharUnits operator*(clang::CharUnits::QuantityType Scale, const clang::CharUnits &CU)
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.
Defines the clang::SourceLocation class and associated facilities.
Defines various enumerations that describe declaration and type specifiers.
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 ...
const LangOptions & getLangOpts() const
void setStaticLocalNumber(const VarDecl *VD, unsigned Number)
void setManglingNumber(const NamedDecl *ND, unsigned Number)
QualType getFunctionType(QualType ResultTy, ArrayRef< QualType > Args, const FunctionProtoType::ExtProtoInfo &EPI) const
Return a normal function type with a typed argument list.
ExternalASTSource * getExternalSource() const
Retrieve a pointer to the external AST source associated with this AST context, if any.
void addDestruction(T *Ptr) const
If T isn't trivially destructible, calls AddDeallocation to register it for destruction.
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...
TranslationUnitDecl * getTranslationUnitDecl() const
void VisitTemplateParamObjectDecl(TemplateParamObjectDecl *D)
void VisitObjCImplementationDecl(ObjCImplementationDecl *D)
void mergeRedeclarableTemplate(RedeclarableTemplateDecl *D, RedeclarableResult &Redecl)
void VisitImportDecl(ImportDecl *D)
void VisitBindingDecl(BindingDecl *BD)
void VisitNamespaceDecl(NamespaceDecl *D)
void VisitTopLevelStmtDecl(TopLevelStmtDecl *D)
void VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D)
void VisitUnresolvedUsingIfExistsDecl(UnresolvedUsingIfExistsDecl *D)
void ReadFunctionDefinition(FunctionDecl *FD)
void VisitLabelDecl(LabelDecl *LD)
void VisitObjCCategoryDecl(ObjCCategoryDecl *D)
void VisitUsingDirectiveDecl(UsingDirectiveDecl *D)
void VisitFunctionDecl(FunctionDecl *FD)
void VisitObjCMethodDecl(ObjCMethodDecl *D)
void VisitUsingShadowDecl(UsingShadowDecl *D)
void VisitVarTemplateSpecializationDecl(VarTemplateSpecializationDecl *D)
void VisitVarDecl(VarDecl *VD)
RedeclarableResult VisitTypedefNameDecl(TypedefNameDecl *TD)
void VisitMSGuidDecl(MSGuidDecl *D)
void VisitPragmaCommentDecl(PragmaCommentDecl *D)
void VisitRecordDecl(RecordDecl *RD)
void VisitLifetimeExtendedTemporaryDecl(LifetimeExtendedTemporaryDecl *D)
void VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D)
void VisitRequiresExprBodyDecl(RequiresExprBodyDecl *D)
void ReadVarDeclInit(VarDecl *VD)
RedeclarableResult VisitClassTemplateSpecializationDeclImpl(ClassTemplateSpecializationDecl *D)
static Decl * getMostRecentDeclImpl(Redeclarable< DeclT > *D)
void VisitNamespaceAliasDecl(NamespaceAliasDecl *D)
void VisitIndirectFieldDecl(IndirectFieldDecl *FD)
void VisitObjCContainerDecl(ObjCContainerDecl *D)
void VisitBlockDecl(BlockDecl *BD)
void VisitExportDecl(ExportDecl *D)
static void attachLatestDecl(Decl *D, Decl *latest)
void VisitStaticAssertDecl(StaticAssertDecl *D)
void VisitEmptyDecl(EmptyDecl *D)
void VisitOMPCapturedExprDecl(OMPCapturedExprDecl *D)
void VisitValueDecl(ValueDecl *VD)
RedeclarableResult VisitRedeclarable(Redeclarable< T > *D)
void VisitEnumDecl(EnumDecl *ED)
void mergeRedeclarable(Redeclarable< T > *D, RedeclarableResult &Redecl)
Attempts to merge the given declaration (D) with another declaration of the same entity.
void VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D)
void VisitFriendTemplateDecl(FriendTemplateDecl *D)
void VisitObjCProtocolDecl(ObjCProtocolDecl *D)
void VisitClassTemplatePartialSpecializationDecl(ClassTemplatePartialSpecializationDecl *D)
void VisitObjCTypeParamDecl(ObjCTypeParamDecl *D)
void VisitDeclaratorDecl(DeclaratorDecl *DD)
RedeclarableResult VisitTagDecl(TagDecl *TD)
void UpdateDecl(Decl *D, SmallVectorImpl< GlobalDeclID > &)
void VisitFriendDecl(FriendDecl *D)
void VisitLinkageSpecDecl(LinkageSpecDecl *D)
void VisitCXXRecordDecl(CXXRecordDecl *D)
ASTDeclReader(ASTReader &Reader, ASTRecordReader &Record, ASTReader::RecordLocation Loc, GlobalDeclID thisDeclID, SourceLocation ThisDeclLoc)
void VisitFileScopeAsmDecl(FileScopeAsmDecl *AD)
void VisitImplicitConceptSpecializationDecl(ImplicitConceptSpecializationDecl *D)
void VisitNamedDecl(NamedDecl *ND)
void mergeMergeable(Mergeable< T > *D)
Attempts to merge the given declaration (D) with another declaration of the same entity,...
void VisitBuiltinTemplateDecl(BuiltinTemplateDecl *D)
static Decl * getMostRecentDecl(Decl *D)
void VisitObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *D)
void VisitCXXConstructorDecl(CXXConstructorDecl *D)
void VisitPragmaDetectMismatchDecl(PragmaDetectMismatchDecl *D)
void VisitImplicitParamDecl(ImplicitParamDecl *PD)
void VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D)
static void setNextObjCCategory(ObjCCategoryDecl *Cat, ObjCCategoryDecl *Next)
RedeclarableResult VisitVarDeclImpl(VarDecl *D)
void VisitMSPropertyDecl(MSPropertyDecl *FD)
void mergeTemplatePattern(RedeclarableTemplateDecl *D, RedeclarableTemplateDecl *Existing, bool IsKeyDecl)
Merge together the pattern declarations from two template declarations.
void VisitClassTemplateSpecializationDecl(ClassTemplateSpecializationDecl *D)
void VisitFieldDecl(FieldDecl *FD)
void VisitOMPDeclareMapperDecl(OMPDeclareMapperDecl *D)
void VisitCapturedDecl(CapturedDecl *CD)
void VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D)
void VisitObjCInterfaceDecl(ObjCInterfaceDecl *D)
RedeclarableResult VisitCXXRecordDeclImpl(CXXRecordDecl *D)
void VisitAccessSpecDecl(AccessSpecDecl *D)
void VisitCXXMethodDecl(CXXMethodDecl *D)
void VisitOMPAllocateDecl(OMPAllocateDecl *D)
void VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D)
static void attachLatestDeclImpl(Redeclarable< DeclT > *D, Decl *Latest)
static void markIncompleteDeclChainImpl(Redeclarable< DeclT > *D)
ObjCTypeParamList * ReadObjCTypeParamList()
void VisitHLSLBufferDecl(HLSLBufferDecl *D)
void VisitOMPThreadPrivateDecl(OMPThreadPrivateDecl *D)
void VisitCXXDeductionGuideDecl(CXXDeductionGuideDecl *GD)
void VisitConstructorUsingShadowDecl(ConstructorUsingShadowDecl *D)
RedeclarableResult VisitVarTemplateSpecializationDeclImpl(VarTemplateSpecializationDecl *D)
TODO: Unify with ClassTemplateSpecializationDecl version? May require unifying ClassTemplate(Partial)...
void VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D)
void VisitUsingEnumDecl(UsingEnumDecl *D)
void VisitObjCImplDecl(ObjCImplDecl *D)
void VisitTranslationUnitDecl(TranslationUnitDecl *TU)
RedeclarableResult VisitRedeclarableTemplateDecl(RedeclarableTemplateDecl *D)
void VisitUnnamedGlobalConstantDecl(UnnamedGlobalConstantDecl *D)
void VisitTypeDecl(TypeDecl *TD)
RedeclarableResult VisitRecordDeclImpl(RecordDecl *RD)
void VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D)
void VisitEnumConstantDecl(EnumConstantDecl *ECD)
void VisitTypeAliasDecl(TypeAliasDecl *TD)
static void attachPreviousDeclImpl(ASTReader &Reader, Redeclarable< DeclT > *D, Decl *Previous, Decl *Canon)
void VisitConceptDecl(ConceptDecl *D)
void VisitObjCPropertyDecl(ObjCPropertyDecl *D)
void mergeLambda(CXXRecordDecl *D, RedeclarableResult &Redecl, Decl *Context, unsigned Number)
Attempt to merge D with a previous declaration of the same lambda, which is found by its index within...
void VisitObjCIvarDecl(ObjCIvarDecl *D)
void VisitUsingPackDecl(UsingPackDecl *D)
void VisitFunctionTemplateDecl(FunctionTemplateDecl *D)
static void mergeInheritableAttributes(ASTReader &Reader, Decl *D, Decl *Previous)
void VisitOMPDeclareReductionDecl(OMPDeclareReductionDecl *D)
void VisitUsingDecl(UsingDecl *D)
void VisitObjCAtDefsFieldDecl(ObjCAtDefsFieldDecl *D)
void VisitVarTemplatePartialSpecializationDecl(VarTemplatePartialSpecializationDecl *D)
TODO: Unify with ClassTemplatePartialSpecializationDecl version? May require unifying ClassTemplate(P...
void VisitParmVarDecl(ParmVarDecl *PD)
void VisitVarTemplateDecl(VarTemplateDecl *D)
TODO: Unify with ClassTemplateDecl version? May require unifying ClassTemplateDecl and VarTemplateDec...
static void AddLazySpecializations(T *D, SmallVectorImpl< GlobalDeclID > &IDs)
static void attachPreviousDecl(ASTReader &Reader, Decl *D, Decl *Previous, Decl *Canon)
std::pair< uint64_t, uint64_t > VisitDeclContext(DeclContext *DC)
void VisitClassTemplateDecl(ClassTemplateDecl *D)
void VisitCXXDestructorDecl(CXXDestructorDecl *D)
void VisitTemplateDecl(TemplateDecl *D)
void VisitCXXConversionDecl(CXXConversionDecl *D)
void VisitTypedefDecl(TypedefDecl *TD)
void VisitOMPRequiresDecl(OMPRequiresDecl *D)
void VisitDecompositionDecl(DecompositionDecl *DD)
Reads an AST files chain containing the contents of a translation unit.
bool isDeclIDFromModule(GlobalDeclID ID, ModuleFile &M) const
Returns true if global DeclID ID originated from module M.
DiagnosticBuilder Diag(unsigned DiagID) const
Report a diagnostic.
Decl * GetLocalDecl(ModuleFile &F, LocalDeclID LocalID)
Reads a declaration with the given local ID in the given module.
LocalDeclID mapGlobalIDToModuleFileGlobalID(ModuleFile &M, GlobalDeclID GlobalID)
Map a global declaration ID into the declaration ID used to refer to this declaration within the give...
IdentifierResolver & getIdResolver()
Get the identifier resolver used for name lookup / updates in the translation unit scope.
ModuleFile * getOwningModuleFile(const Decl *D)
Retrieve the module file that owns the given declaration, or NULL if the declaration is not from a mo...
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
ASTContext & getContext()
Retrieve the AST context that this AST reader supplements.
An object for streaming information from a record.
bool readBool()
Read a boolean value, advancing Idx.
std::string readString()
Read a string, advancing Idx.
Expr * readExpr()
Reads an expression.
T * GetLocalDeclAs(LocalDeclID LocalID)
Reads a declaration with the given local ID in the given module.
void readAttributes(AttrVec &Attrs)
Reads attributes from the current stream position, advancing Idx.
IdentifierInfo * readIdentifier()
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.
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)
void setColonLoc(SourceLocation CLoc)
Sets the location of the colon.
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)
void setExplicitSpecifier(ExplicitSpecifier ES)
bool isInheritingConstructor() const
Determine whether this is an implicit constructor synthesized to model a call to a constructor inheri...
Represents a C++ conversion function within a class.
void setExplicitSpecifier(ExplicitSpecifier ES)
static CXXConversionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a C++ deduction guide declaration.
void setDeductionCandidateKind(DeductionCandidate K)
static CXXDeductionGuideDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a C++ destructor within a class.
static CXXDestructorDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
CXXDestructorDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Represents a static or instance method of a struct/union/class.
CXXMethodDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
static CXXMethodDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a C++ struct/union/class.
static CXXRecordDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID)
unsigned getODRHash() const
CXXRecordDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this class is an instantiation of a member class of a class template specialization,...
CXXRecordDecl * getDefinition() const
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.
CXXRecordDecl * getTemplatedDecl() const
Get the underlying class declarations of the template.
QualType getInjectedClassNameSpecialization()
Retrieve the template specialization type of the injected-class-name for this 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)
void setTemplateArgsAsWritten(const ASTTemplateArgumentListInfo *ArgsWritten)
Set the template argument list as written in the sources.
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.
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name 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
A simple visitor class that helps create declaration visitors.
Decl - This represents one declaration (or definition), e.g.
ASTContext & getASTContext() const LLVM_READONLY
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.
void setOwningModuleID(unsigned ID)
Set the owning module ID.
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.
Decl * getPreviousDecl()
Retrieve the previous declaration that declares the same entity as this declaration,...
bool isInvalidDecl() const
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
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.
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
void setImplicit(bool I=true)
void setReferenced(bool R=true)
void setLocation(SourceLocation L)
Decl * getMostRecentDecl()
Retrieve the most recent declaration that declares the same entity as this declaration (which may be ...
void setCachedLinkage(Linkage L) const
Module * getImportedOwningModule() const
Get the imported owning module, if this decl is from an imported (non-local) module.
void setDeclContext(DeclContext *DC)
setDeclContext - Set both the semantic and lexical DeclContext to DC.
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.
DeclContext * getDeclContext()
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)
void setFixed(bool Fixed=true)
True if this is an Objective-C, C++11, or Microsoft-style enumeration with a fixed underlying type.
EnumDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
void setIntegerType(QualType T)
Set the underlying integer type.
void setIntegerTypeSourceInfo(TypeSourceInfo *TInfo)
Set the underlying integer type source info.
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this enumeration is an instantiation of a member enumeration of a class template specialization,...
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.
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 ...
FunctionDecl * getFunction() const
Retrieve the declaration of the function template specialization.
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)
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.
void setTemplateArguments(ArrayRef< TemplateArgument > Converted)
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.
void setLocStart(SourceLocation L)
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
ValueDecl * getExtendingDecl()
static LifetimeExtendedTemporaryDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a linkage specification.
void setExternLoc(SourceLocation L)
void setLanguage(LinkageSpecLanguageIDs L)
Set the language specified by this linkage specification.
void setRBraceLoc(SourceLocation L)
static LinkageSpecDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents the results of name lookup.
An instance of this class represents the declaration of a property member.
static MSPropertyDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Provides information a specialization of a member of a class template, which may be a member function...
void setPointOfInstantiation(SourceLocation POI)
Set the first point of instantiation.
Provides common interface for the Decls that cannot be redeclared, but can be merged if the same decl...
Describes a module or submodule.
@ AllVisible
All of the names in this module are visible.
@ ModuleMapModule
This is a module that was defined by a module map and built out of header files.
This represents a decl that may have a name.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
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.
void setAnonymousNamespace(NamespaceDecl *D)
void setNested(bool Nested)
Set whether this is a nested namespace declaration.
void setInline(bool Inline)
Set whether this is an inline namespace declaration.
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)
unsigned getNumExpansionTypes() const
Retrieves the number of expansion types in an expanded parameter pack.
bool isExpandedParameterPack() const
Whether this parameter is a non-type template parameter pack that has a known list of different types...
void setPosition(unsigned P)
void setDepth(unsigned D)
bool hasPlaceholderTypeConstraint() const
Determine whether this non-type template parameter's type has a placeholder with a type-constraint.
void setPlaceholderTypeConstraint(Expr *E)
void setDefaultArgument(const ASTContext &C, const TemplateArgumentLoc &DefArg)
Set the default argument for this template parameter, and whether that default argument was inherited...
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)
OMPChildren * Data
Data, associated with the directive.
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.
void setInitializerData(Expr *OrigE, Expr *PrivE)
Set initializer Orig and Priv vars.
void setInitializer(Expr *E, OMPDeclareReductionInitKind IK)
Set initializer expression for the declare reduction construct.
void setCombiner(Expr *E)
Set combiner expression for the declare reduction construct.
void setCombinerData(Expr *InE, Expr *OutE)
Set combiner In and Out vars.
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)
void setClassInterface(ObjCInterfaceDecl *IFace)
ObjCImplementationDecl - Represents a class definition - this is where method definitions are specifi...
static ObjCImplementationDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setIvarLBraceLoc(SourceLocation Loc)
void setSuperClass(ObjCInterfaceDecl *superCls)
void setIvarRBraceLoc(SourceLocation Loc)
void setHasDestructors(bool val)
void setHasNonZeroConstructors(bool val)
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)
unsigned getODRHash()
Get precomputed ODRHash or add a new one.
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.
void setAtLoc(SourceLocation L)
void setPropertyImplementation(PropertyControl pc)
void setSetterName(Selector Sel, SourceLocation Loc=SourceLocation())
void setPropertyAttributes(ObjCPropertyAttribute::Kind PRVal)
static ObjCPropertyDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setPropertyAttributesAsWritten(ObjCPropertyAttribute::Kind PRVal)
void setLParenLoc(SourceLocation L)
void setPropertyIvarDecl(ObjCIvarDecl *Ivar)
void setSetterMethodDecl(ObjCMethodDecl *gDecl)
void setType(QualType T, TypeSourceInfo *TSI)
void setGetterName(Selector Sel, SourceLocation Loc=SourceLocation())
void setGetterMethodDecl(ObjCMethodDecl *gDecl)
ObjCPropertyImplDecl - Represents implementation declaration of a property in a class or category imp...
void setSetterMethodDecl(ObjCMethodDecl *MD)
void setSetterCXXAssignment(Expr *setterCXXAssignment)
static ObjCPropertyImplDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setGetterMethodDecl(ObjCMethodDecl *MD)
void setAtLoc(SourceLocation Loc)
void setPropertyDecl(ObjCPropertyDecl *Prop)
void setGetterCXXConstructor(Expr *getterCXXConstructor)
Represents an Objective-C protocol declaration.
static ObjCProtocolDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
unsigned getODRHash()
Get precomputed ODRHash or add a new one.
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.
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.
virtual CommonBase * newCommon(ASTContext &C) const =0
RedeclarableTemplateDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this template.
CommonBase * Common
Pointer to the common data shared by all declarations of this template.
void setMemberSpecialization()
Note that this member template is a specialization.
void setInstantiatedFromMemberTemplate(RedeclarableTemplateDecl *TD)
void setPrevious(decl_type *D)
void setLatest(decl_type *D)
Decl * getLatestNotUpdated() const
Provides common interface for the Decls that can be redeclared.
DeclLink RedeclLink
Points to the next redeclaration in the chain.
decl_type * getFirstDecl()
Return the first declaration of this declaration or itself if this is the only declaration.
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.).
TemplateParameterList * TemplateParams
NamedDecl * getTemplatedDecl() const
Get the underlying, templated declaration.
void init(NamedDecl *NewTemplatedDecl)
Initialize the underlying templated declaration.
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
A template parameter object.
TemplateParamObjectDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Stores a list of template parameters for a TemplateDecl and its derived classes.
TemplateTemplateParmDecl - Declares a template template parameter, e.g., "T" in.
unsigned getNumExpansionTemplateParameters() const
Retrieves the number of expansion template parameters in an expanded parameter pack.
static TemplateTemplateParmDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setPosition(unsigned P)
void setDepth(unsigned D)
void setDeclaredWithTypename(bool withTypename)
Set whether this template template parameter was declared with the 'typename' or 'class' keyword.
void setDefaultArgument(const ASTContext &C, const TemplateArgumentLoc &DefArg)
Set the default argument for this template parameter, and whether that default argument was inherited...
bool isExpandedParameterPack() const
Whether this parameter is a template template parameter pack that has a known list of different templ...
Declaration of a template type parameter.
static TemplateTypeParmDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID)
bool hasTypeConstraint() const
Determine whether this template parameter has a type-constraint.
void setTypeConstraint(ConceptReference *CR, Expr *ImmediatelyDeclaredConstraint)
void setDefaultArgument(const ASTContext &C, const TemplateArgumentLoc &DefArg)
Set the default argument for this template parameter.
void setDeclaredWithTypename(bool withTypename)
Set whether this template type parameter was declared with the 'typename' or 'class' keyword.
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.
AutoType * getContainedAutoType() const
Get the AutoType whose type will be deduced for a variable with an initializer of this type.
const T * castAs() const
Member-template castAs<specific 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)
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.
void setUsingLoc(SourceLocation L)
Set the source location of the 'using' keyword.
static UnresolvedUsingValueDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a C++ using-declaration.
void setTypename(bool TN)
Sets whether the using declaration has 'typename'.
void setUsingLoc(SourceLocation L)
Set the source location of the 'using' keyword.
static UsingDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents C++ using-directive.
static UsingDirectiveDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a C++ using-enum-declaration.
void setEnumType(TypeSourceInfo *TSI)
void setEnumLoc(SourceLocation L)
void setUsingLoc(SourceLocation L)
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...
void setTemplateArgsAsWritten(const ASTTemplateArgumentListInfo *ArgsWritten)
Set the template argument list as written in the sources.
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.
serialization::DeclID BaseDeclID
Base declaration ID for declarations local to this module.
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.
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.
bool Init(InterpState &S, CodePtr OpPC)
uint32_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...
@ MK_MainFile
File is a PCH file treated as the actual main file.
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
std::string toString(const til::SExpr *E)
The JSON file list parser is used to communicate input to InstallAPI.
bool isa(CodeGen::Address addr)
SelectorLocationsKind
Whether all locations of the selector identifiers are in a "standard" position.
bool isUnresolvedExceptionSpec(ExceptionSpecificationType ESpecType)
ConstexprSpecKind
Define the kind of constexpr specifier.
LinkageSpecLanguageIDs
Represents the language in a linkage specification.
LazyOffsetPtr< Stmt, uint64_t, &ExternalASTSource::GetExternalDeclStmt > LazyDeclStmtPtr
A lazy pointer to a statement.
LambdaCaptureKind
The different capture forms in a lambda introducer.
@ LCK_ByCopy
Capturing by copy (a.k.a., by value)
@ LCK_ByRef
Capturing by reference.
@ LCK_VLAType
Capturing variable-length array type.
@ LCK_StarThis
Capturing the *this object by copy.
@ LCK_This
Capturing the *this object by reference.
OMPDeclareReductionInitKind
StorageClass
Storage classes.
const unsigned int NUM_PREDEF_DECL_IDS
The number of declaration IDs that are predefined.
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.
TagTypeKind
The kind of a tag type.
ObjCImplementationControl
RecordArgPassingKind
Enum that represents the different ways arguments are passed to and returned from function calls.
static bool isUndeducedReturnType(QualType T)
bool operator!=(CanQual< T > x, CanQual< U > y)
for(const auto &A :T->param_types())
const FunctionProtoType * T
DeductionCandidate
Only used by CXXDeductionGuideDecl.
bool shouldSkipCheckingODR(const Decl *D)
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
@ Interface
The "__interface" keyword introduces the elaborated-type-specifier.
@ Class
The "class" keyword introduces the elaborated-type-specifier.
@ Other
Other implicit parameter.
AccessSpecifier
A C++ access specifier (public, private, protected), plus the special value "none" which means differ...
Structure used to store a statement, the constant value to which it was evaluated (if any),...
bool HasConstantDestruction
Whether this variable is known to have constant destruction.
bool WasEvaluated
Whether this statement was already evaluated.
bool HasConstantInitialization
Whether this variable is known to have constant initialization.
Provides information about an explicit instantiation of a variable or class template.
SourceLocation ExternKeywordLoc
The location of the extern keyword.
Data that is common to all of the declarations of a given function template.
llvm::FoldingSetVector< FunctionTemplateSpecializationInfo > Specializations
The function template specializations for this function template, including explicit specializations ...
T * get(ExternalASTSource *Source) const
Retrieve the pointer to the AST node that this lazy pointer points to.
uint16_t Part2
...-89ab-...
uint32_t Part1
{01234567-...
uint16_t Part3
...-cdef-...
uint8_t Part4And5[8]
...-0123-456789abcdef}
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.