clang: lib/Serialization/ASTReaderDecl.cpp Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13
57#include "llvm/ADT/DenseMap.h"
58#include "llvm/ADT/FoldingSet.h"
59#include "llvm/ADT/SmallPtrSet.h"
60#include "llvm/ADT/SmallVector.h"
61#include "llvm/ADT/iterator_range.h"
62#include "llvm/Bitstream/BitstreamReader.h"
63#include "llvm/Support/ErrorHandling.h"
64#include "llvm/Support/SaveAndRestore.h"
65#include
66#include
67#include
68#include
69#include
70#include
71
72using namespace clang;
74
75
76
77
78
79namespace {
80
81class RedeclarableResult {
82 Decl *MergeWith;
83 GlobalDeclID FirstID;
84 bool IsKeyDecl;
85
86public:
87 RedeclarableResult(Decl *MergeWith, GlobalDeclID FirstID, bool IsKeyDecl)
88 : MergeWith(MergeWith), FirstID(FirstID), IsKeyDecl(IsKeyDecl) {}
89
90
91 GlobalDeclID getFirstID() const { return FirstID; }
92
93
94 bool isKeyDecl() const { return IsKeyDecl; }
95
96
97
98 Decl *getKnownMergeTarget() const { return MergeWith; }
99};
100}
101
105
106public:
108
110 unsigned Number);
111
112
113
114
115
116 template
119
120 template
122 RedeclarableResult &Redecl) {
124 D, Existing, Redecl.isKeyDecl() ? Redecl.getFirstID() : GlobalDeclID());
125 }
126
129
131 struct CXXRecordDecl::DefinitionData &&NewDD);
133 struct ObjCInterfaceDecl::DefinitionData &&NewDD);
135 struct ObjCProtocolDecl::DefinitionData &&NewDD);
136};
137}
138
139
140
141
142
148 ASTReader::RecordLocation Loc;
151
153
154 TypeID DeferredTypeID = 0;
155 unsigned AnonymousDeclNumber = 0;
158
159
160
161
162 bool IsDeclMarkedUsed = false;
163
164 uint64_t GetCurrentCursorOffset();
165
166 uint64_t ReadLocalOffset() {
167 uint64_t LocalOffset = Record.readInt();
168 assert(LocalOffset < Loc.Offset && "offset point after current record");
169 return LocalOffset ? Loc.Offset - LocalOffset : 0;
170 }
171
172 uint64_t ReadGlobalOffset() {
173 uint64_t Local = ReadLocalOffset();
174 return Local ? Record.getGlobalBitOffset(Local) : 0;
175 }
176
177 SourceLocation readSourceLocation() { return Record.readSourceLocation(); }
178
179 SourceRange readSourceRange() { return Record.readSourceRange(); }
180
181 TypeSourceInfo *readTypeSourceInfo() { return Record.readTypeSourceInfo(); }
182
183 GlobalDeclID readDeclID() { return Record.readDeclID(); }
184
185 std::string readString() { return Record.readString(); }
186
187 Decl *readDecl() { return Record.readDecl(); }
188
189 template T *readDeclAs() { return Record.readDeclAs<T>(); }
190
192 if (Record.getIdx() == Record.size())
193 return 0;
194
195 return Record.getGlobalSubmoduleID(Record.readInt());
196 }
197
198 Module *readModule() { return Record.getSubmodule(readSubmoduleID()); }
199
201 Decl *LambdaContext = nullptr,
202 unsigned IndexInLambdaContext = 0);
203 void ReadCXXDefinitionData(struct CXXRecordDecl::DefinitionData &Data,
205 unsigned IndexInLambdaContext);
206 void ReadObjCDefinitionData(struct ObjCInterfaceDecl::DefinitionData &Data);
207 void ReadObjCDefinitionData(struct ObjCProtocolDecl::DefinitionData &Data);
208
210
215
216
217
218
219
222
223
224
225
226
227
228 class FindExistingResult {
232 bool AddResult = false;
233 unsigned AnonymousDeclNumber = 0;
235
236 public:
237 FindExistingResult(ASTReader &Reader) : Reader(Reader) {}
238
240 unsigned AnonymousDeclNumber,
242 : Reader(Reader), New(New), Existing(Existing), AddResult(true),
243 AnonymousDeclNumber(AnonymousDeclNumber),
244 TypedefNameForLinkage(TypedefNameForLinkage) {}
245
246 FindExistingResult(FindExistingResult &&Other)
248 AddResult(Other.AddResult),
249 AnonymousDeclNumber(Other.AnonymousDeclNumber),
250 TypedefNameForLinkage(Other.TypedefNameForLinkage) {
251 Other.AddResult = false;
252 }
253
254 FindExistingResult &operator=(FindExistingResult &&) = delete;
255 ~FindExistingResult();
256
257
258
259 void suppress() { AddResult = false; }
260
261 operator NamedDecl *() const { return Existing; }
262
263 template operator T *() const {
264 return dyn_cast_or_null(Existing);
265 }
266 };
267
270 FindExistingResult findExisting(NamedDecl *D);
271
272public:
274 ASTReader::RecordLocation Loc, GlobalDeclID thisDeclID,
276 : Reader(Reader), MergeImpl(Reader), Record(Record), Loc(Loc),
277 ThisDeclID(thisDeclID), ThisDeclLoc(ThisDeclLoc) {}
278
279 template
283
284 template
289 Decl *Canon);
290
293
294 template
298
299 template
302
304 llvm::BitstreamCursor &DeclsCursor, bool IsPartial);
305
308
310
313 Cat->NextClassCategory = Next;
314 }
315
338 RedeclarableResult
340
341 void
345
348 RedeclarableResult
350
354
384 void
413
416
418
419 template
421
422 template
424
426 RedeclarableResult &Redecl);
427
429
431
433
434
455};
456}
457
458namespace {
459
460
461
462template class MergedRedeclIterator {
463 DeclT *Start = nullptr;
464 DeclT *Canonical = nullptr;
465 DeclT *Current = nullptr;
466
467public:
468 MergedRedeclIterator() = default;
469 MergedRedeclIterator(DeclT *Start) : Start(Start), Current(Start) {}
470
471 DeclT *operator*() { return Current; }
472
473 MergedRedeclIterator &operator++() {
474 if (Current->isFirstDecl()) {
475 Canonical = Current;
476 Current = Current->getMostRecentDecl();
477 } else
478 Current = Current->getPreviousDecl();
479
480
481
482
483
484 if (Current == Start || Current == Canonical)
485 Current = nullptr;
486 return *this;
487 }
488
489 friend bool operator!=(const MergedRedeclIterator &A,
490 const MergedRedeclIterator &B) {
491 return A.Current != B.Current;
492 }
493};
494
495}
496
497template
498static llvm::iterator_range<MergedRedeclIterator>
500 return llvm::make_range(MergedRedeclIterator(D),
501 MergedRedeclIterator());
502}
503
504uint64_t ASTDeclReader::GetCurrentCursorOffset() {
505 return Loc.F->DeclsCursor.GetCurrentBitNo() + Loc.F->GlobalBitOffset;
506}
507
509 if (Record.readInt()) {
510 Reader.DefinitionSource[FD] =
512 Reader.getContext().getLangOpts().BuildingPCHWithObjectFile;
513 }
514 if (auto *CD = dyn_cast(FD)) {
515 CD->setNumCtorInitializers(Record.readInt());
516 if (CD->getNumCtorInitializers())
517 CD->CtorInitializers = ReadGlobalOffset();
518 }
519
520 Reader.PendingBodies[FD] = GetCurrentCursorOffset();
521
523 Reader.ThisDeclarationWasADefinitionSet.insert(FD);
524}
525
528
529
530
532 IsDeclMarkedUsed = false;
533
534 if (auto *DD = dyn_cast(D)) {
535 if (auto *TInfo = DD->getTypeSourceInfo())
536 Record.readTypeLoc(TInfo->getTypeLoc());
537 }
538
539 if (auto *TD = dyn_cast(D)) {
540
542 assert(DeferredTypeID == 0 &&
543 "Deferred type not used for TagDecls and Typedefs");
544 else
545 TD->setTypeForDecl(Reader.GetType(DeferredTypeID).getTypePtrOrNull());
546
547
548
549 if (NamedDeclForTagDecl.isValid())
552 } else if (auto *ID = dyn_cast(D)) {
553
554 ID->TypeForDecl = Reader.GetType(DeferredTypeID).getTypePtrOrNull();
555 } else if (auto *FD = dyn_cast(D)) {
556
557 if (Record.readInt())
559 } else if (auto *VD = dyn_cast(D)) {
561 } else if (auto *FD = dyn_cast(D)) {
562 if (FD->hasInClassInitializer() && Record.readInt()) {
563 FD->setLazyInClassInitializer(LazyDeclStmtPtr(GetCurrentCursorOffset()));
564 }
565 }
566}
567
570 auto ModuleOwnership =
574 IsDeclMarkedUsed |= D->Used;
577 bool HasStandaloneLexicalDC = DeclBits.getNextBit();
578 bool HasAttrs = DeclBits.getNextBit();
580 D->InvalidDecl = DeclBits.getNextBit();
582
585
586
587
588
589
590
591 GlobalDeclID SemaDCIDForTemplateParmDecl = readDeclID();
592 GlobalDeclID LexicalDCIDForTemplateParmDecl =
593 HasStandaloneLexicalDC ? readDeclID() : GlobalDeclID();
594 if (LexicalDCIDForTemplateParmDecl.isInvalid())
595 LexicalDCIDForTemplateParmDecl = SemaDCIDForTemplateParmDecl;
596 Reader.addPendingDeclContextInfo(D,
597 SemaDCIDForTemplateParmDecl,
598 LexicalDCIDForTemplateParmDecl);
599 D->setDeclContext(Reader.getContext().getTranslationUnitDecl());
600 } else {
601 auto *SemaDC = readDeclAs();
602 auto *LexicalDC =
603 HasStandaloneLexicalDC ? readDeclAs() : nullptr;
604 if (!LexicalDC)
605 LexicalDC = SemaDC;
606
607
609 if (auto *RD = dyn_cast(SemaDC))
610 MergedSemaDC = getOrFakePrimaryClassDefinition(Reader, RD);
611 else
612 MergedSemaDC = Reader.MergedDeclContexts.lookup(SemaDC);
613
614
615 D->setDeclContextsImpl(MergedSemaDC ? MergedSemaDC : SemaDC, LexicalDC,
616 Reader.getContext());
617 }
619
620 if (HasAttrs) {
622 Record.readAttributes(Attrs);
623
624
625 D->setAttrsImpl(Attrs, Reader.getContext());
626 }
627
628
629
630 bool ModulePrivate =
632 if (unsigned SubmoduleID = readSubmoduleID()) {
633 switch (ModuleOwnership) {
636 break;
641 break;
642 }
643
645
647
648 if (ModulePrivate) {
649
650
651 } else if (Reader.getContext().getLangOpts().ModulesLocalVisibility) {
652
653
655
658 else
659 Reader.HiddenNamesMap[Owner].push_back(D);
660 }
661 } else if (ModulePrivate) {
663 }
664}
665
670 std::string Arg = readString();
671 memcpy(D->getTrailingObjects(), Arg.data(), Arg.size());
672 D->getTrailingObjects()[Arg.size()] = '\0';
673}
674
678 std::string Name = readString();
679 memcpy(D->getTrailingObjects(), Name.data(), Name.size());
680 D->getTrailingObjects()[Name.size()] = '\0';
681
682 D->ValueStart = Name.size() + 1;
683 std::string Value = readString();
684 memcpy(D->getTrailingObjects() + D->ValueStart, Value.data(), Value.size());
685 D->getTrailingObjects()[D->ValueStart + Value.size()] = '\0';
686}
687
689 llvm_unreachable("Translation units are not serialized");
690}
691
694 ND->setDeclName(Record.readDeclarationName());
695 AnonymousDeclNumber = Record.readInt();
696}
697
701
703 DeferredTypeID = Record.getGlobalTypeID(Record.readInt());
704}
705
710 if (Record.readInt()) {
711 QualType modedT = Record.readType();
713 } else
715
716
717
718
719 readDecl();
720 return Redecl;
721}
722
727
730 if (auto *Template = readDeclAs())
731
733 else
735}
736
740
742
751
752 switch (TagDeclBits.getNextBits(2)) {
753 case 0:
754 break;
755 case 1: {
756 auto *Info = new (Reader.getContext()) TagDecl::ExtInfo();
757 Record.readQualifierInfo(*Info);
758 TD->TypedefNameDeclOrQualifier = Info;
759 break;
760 }
761 case 2:
762 NamedDeclForTagDecl = readDeclID();
763 TypedefNameForLinkage = Record.readIdentifier();
764 break;
765 default:
766 llvm_unreachable("unexpected tag info kind");
767 }
768
771 return Redecl;
772}
773
778 else
781
783 ED->setNumPositiveBits(EnumDeclBits.getNextBits(8));
784 ED->setNumNegativeBits(EnumDeclBits.getNextBits(8));
788
789 ED->setHasODRHash(true);
790 ED->ODRHash = Record.readInt();
791
792
793
794 if (ED->isCompleteDefinition() && Reader.getContext().getLangOpts().Modules) {
796 if (!OldDef) {
797
798
800 if (!D->isFromASTFile() && D->isCompleteDefinition()) {
801 OldDef = D;
802 break;
803 }
804 }
805 }
806 if (OldDef) {
807 Reader.MergedDeclContexts.insert(std::make_pair(ED, OldDef));
809 Reader.mergeDefinitionVisibility(OldDef, ED);
810
811
814 Reader.PendingEnumOdrMergeFailures[OldDef].push_back(ED);
815 } else {
816 OldDef = ED;
817 }
818 }
819
820 if (auto *InstED = readDeclAs()) {
823 ED->setInstantiationOfMemberEnum(Reader.getContext(), InstED, TSK);
825 }
826}
827
829 RedeclarableResult Redecl = VisitTagDecl(RD);
830
831 BitsUnpacker RecordDeclBits(Record.readInt());
847 return Redecl;
848}
849
852 RD->setODRHash(Record.readInt());
853
854
855
858 RecordDecl *&OldDef = Reader.RecordDefinitions[Canon];
859 if (!OldDef) {
860
861
863 if (!D->isFromASTFile() && D->isCompleteDefinition()) {
864 OldDef = D;
865 break;
866 }
867 }
868 }
869 if (OldDef) {
870 Reader.MergedDeclContexts.insert(std::make_pair(RD, OldDef));
872 Reader.mergeDefinitionVisibility(OldDef, RD);
874 Reader.PendingRecordOdrMergeFailures[OldDef].push_back(RD);
875 } else {
876 OldDef = RD;
877 }
878 }
879}
880
883
884
885
887 DeferredTypeID = Record.getGlobalTypeID(Record.readInt());
888 else
889 VD->setType(Record.readType());
890}
891
894 if (Record.readInt())
896 ECD->setInitVal(Reader.getContext(), Record.readAPSInt());
898}
899
903 if (Record.readInt()) {
904 auto *Info = new (Reader.getContext()) DeclaratorDecl::ExtInfo();
905 Record.readQualifierInfo(*Info);
907 Record.readExpr(),
909 DD->DeclInfo = Info;
910 }
911 QualType TSIType = Record.readType();
913 TSIType.isNull() ? nullptr
914 : Reader.getContext().CreateTypeSourceInfo(TSIType));
915}
916
919
921
924 break;
927 break;
929 auto *Template = readDeclAs();
932 break;
933 }
935 auto *InstFD = readDeclAs();
938 FD->setInstantiationOfMemberFunction(Reader.getContext(), InstFD, TSK);
940 break;
941 }
943 auto *Template = readDeclAs();
945
946
948 Record.readTemplateArgumentList(TemplArgs, true);
949
950
952 bool HasTemplateArgumentsAsWritten = Record.readBool();
953 if (HasTemplateArgumentsAsWritten)
954 Record.readTemplateArgumentListInfo(TemplArgsWritten);
955
957
961
963 if (Record.readInt()) {
964 auto *FD = readDeclAs();
967
970 }
971
974 C, FD, Template, TSK, TemplArgList,
975 HasTemplateArgumentsAsWritten ? &TemplArgsWritten : nullptr, POI,
976 MSInfo);
977 FD->TemplateOrSpecialization = FTInfo;
978
979 if (FD->isCanonicalDecl()) {
980
981
982 auto *CanonTemplate = readDeclAs();
983
984
985
986
987
988 llvm::FoldingSetNodeID ID;
990 void *InsertPos = nullptr;
993 CommonPtr->Specializations.FindNodeOrInsertPos(ID, InsertPos);
994 if (InsertPos)
995 CommonPtr->Specializations.InsertNode(FTInfo, InsertPos);
996 else {
997 assert(Reader.getContext().getLangOpts().Modules &&
998 "already deserialized this template specialization");
1000 }
1001 }
1002 break;
1003 }
1005
1007 unsigned NumCandidates = Record.readInt();
1008 while (NumCandidates--)
1009 Candidates.addDecl(readDeclAs());
1010
1011
1013 bool HasTemplateArgumentsAsWritten = Record.readBool();
1014 if (HasTemplateArgumentsAsWritten)
1015 Record.readTemplateArgumentListInfo(TemplArgsWritten);
1016
1018 Reader.getContext(), Candidates,
1019 HasTemplateArgumentsAsWritten ? &TemplArgsWritten : nullptr);
1020
1021
1022 break;
1023 }
1024 }
1025
1027
1028
1029
1035
1036
1038 Reader.PendingDeducedFunctionTypes.push_back({FD, DeferredTypeID});
1039 } else {
1040 FD->setType(Reader.GetType(DeferredTypeID));
1041 }
1042 DeferredTypeID = 0;
1043
1044 FD->DNLoc = Record.readDeclarationNameLoc(FD->getDeclName());
1046
1047
1048
1049 BitsUnpacker FunctionDeclBits(Record.readInt());
1050
1057
1058
1059
1060 const bool Pure = FunctionDeclBits.getNextBit();
1080
1081 FD->EndRangeLoc = readSourceLocation();
1084
1085 FD->ODRHash = Record.readInt();
1086 FD->setHasODRHash(true);
1087
1089
1090
1091
1092 if (auto Info = Record.readInt()) {
1093 bool HasMessage = Info & 2;
1096
1097 unsigned NumLookups = Record.readInt();
1099 for (unsigned I = 0; I != NumLookups; ++I) {
1103 }
1104
1107 Reader.getContext(), Lookups, DeletedMessage));
1108 }
1109 }
1110
1111 if (Existing)
1112 MergeImpl.mergeRedeclarable(FD, Existing, Redecl);
1116
1117
1118 auto merge = [this, &Redecl, FD](auto &&F) {
1119 auto *Existing = cast_or_null(Redecl.getKnownMergeTarget());
1120 RedeclarableResult NewRedecl(Existing ? F(Existing) : nullptr,
1121 Redecl.getFirstID(), Redecl.isKeyDecl());
1123 };
1125 merge(
1127 else
1130 });
1131 } else
1133
1134
1135
1137
1138
1139 unsigned NumParams = Record.readInt();
1141 Params.reserve(NumParams);
1142 for (unsigned I = 0; I != NumParams; ++I)
1143 Params.push_back(readDeclAs());
1144 FD->setParams(Reader.getContext(), Params);
1145
1146
1147
1148
1149 if (FD->hasAttr()) {
1150 auto *SKEPAttr = FD->getAttr();
1152 const SYCLKernelInfo *SKI = C.findSYCLKernelInfo(SKEPAttr->getKernelName());
1153 if (SKI) {
1155 Reader.Diag(FD->getLocation(), diag::err_sycl_kernel_name_conflict)
1156 << SKEPAttr;
1158 diag::note_previous_declaration);
1159 SKEPAttr->setInvalidAttr();
1160 }
1161 } else {
1162 C.registerSYCLEntryPointFunction(FD);
1163 }
1164 }
1165}
1166
1169 if (Record.readInt()) {
1170
1171
1172 Reader.PendingBodies[MD] = GetCurrentCursorOffset();
1173 }
1174 MD->setSelfDecl(readDeclAs());
1175 MD->setCmdDecl(readDeclAs());
1183
1187 Reader.getContext().setObjCMethodRedeclaration(MD,
1188 readDeclAs());
1189
1196 MD->DeclEndLoc = readSourceLocation();
1197 unsigned NumParams = Record.readInt();
1199 Params.reserve(NumParams);
1200 for (unsigned I = 0; I != NumParams; ++I)
1201 Params.push_back(readDeclAs());
1202
1204 unsigned NumStoredSelLocs = Record.readInt();
1206 SelLocs.reserve(NumStoredSelLocs);
1207 for (unsigned i = 0; i != NumStoredSelLocs; ++i)
1208 SelLocs.push_back(readSourceLocation());
1209
1210 MD->setParamsAndSelLocs(Reader.getContext(), Params, SelLocs);
1211}
1212
1215
1216 D->Variance = Record.readInt();
1217 D->Index = Record.readInt();
1218 D->VarianceLoc = readSourceLocation();
1219 D->ColonLoc = readSourceLocation();
1220}
1221
1227
1229 unsigned numParams = Record.readInt();
1230 if (numParams == 0)
1231 return nullptr;
1232
1234 typeParams.reserve(numParams);
1235 for (unsigned i = 0; i != numParams; ++i) {
1236 auto *typeParam = readDeclAs();
1237 if (!typeParam)
1238 return nullptr;
1239
1240 typeParams.push_back(typeParam);
1241 }
1242
1245
1247 typeParams, rAngleLoc);
1248}
1249
1250void ASTDeclReader::ReadObjCDefinitionData(
1251 struct ObjCInterfaceDecl::DefinitionData &Data) {
1252
1253 Data.SuperClassTInfo = readTypeSourceInfo();
1254
1255 Data.EndLoc = readSourceLocation();
1256 Data.HasDesignatedInitializers = Record.readInt();
1258 Data.HasODRHash = true;
1259
1260
1261 unsigned NumProtocols = Record.readInt();
1263 Protocols.reserve(NumProtocols);
1264 for (unsigned I = 0; I != NumProtocols; ++I)
1265 Protocols.push_back(readDeclAs());
1267 ProtoLocs.reserve(NumProtocols);
1268 for (unsigned I = 0; I != NumProtocols; ++I)
1269 ProtoLocs.push_back(readSourceLocation());
1270 Data.ReferencedProtocols.set(Protocols.data(), NumProtocols, ProtoLocs.data(),
1272
1273
1274 NumProtocols = Record.readInt();
1275 Protocols.clear();
1276 Protocols.reserve(NumProtocols);
1277 for (unsigned I = 0; I != NumProtocols; ++I)
1278 Protocols.push_back(readDeclAs());
1279 Data.AllReferencedProtocols.set(Protocols.data(), NumProtocols,
1281}
1282
1284 ObjCInterfaceDecl *D, struct ObjCInterfaceDecl::DefinitionData &&NewDD) {
1285 struct ObjCInterfaceDecl::DefinitionData &DD = D->data();
1286 if (DD.Definition == NewDD.Definition)
1287 return;
1288
1289 Reader.MergedDeclContexts.insert(
1290 std::make_pair(NewDD.Definition, DD.Definition));
1291 Reader.mergeDefinitionVisibility(DD.Definition, NewDD.Definition);
1292
1293 if (D->getODRHash() != NewDD.ODRHash)
1294 Reader.PendingObjCInterfaceOdrMergeFailures[DD.Definition].push_back(
1295 {NewDD.Definition, &NewDD});
1296}
1297
1301 DeferredTypeID = Record.getGlobalTypeID(Record.readInt());
1303
1305 if (Record.readInt()) {
1306
1307 ID->allocateDefinitionData();
1308
1309 ReadObjCDefinitionData(ID->data());
1311 if (Canon->Data.getPointer()) {
1312
1313
1314 MergeImpl.MergeDefinitionData(Canon, std::move(ID->data()));
1315 ID->Data = Canon->Data;
1316 } else {
1317
1318
1319 ID->getCanonicalDecl()->Data = ID->Data;
1320
1321
1322 ID->setIvarList(nullptr);
1323 }
1324
1325
1326 Reader.PendingDefinitions.insert(ID);
1327
1328
1329 Reader.ObjCClassesLoaded.push_back(ID);
1330 } else {
1331 ID->Data = ID->getCanonicalDecl()->Data;
1332 }
1333}
1334
1338
1340 bool synth = Record.readInt();
1342
1343
1345 return;
1346
1347
1348
1350 return;
1355 if (PrevIvar && PrevIvar != IVD) {
1356 auto *ParentExt = dyn_cast(IVD->getDeclContext());
1357 auto *PrevParentExt =
1358 dyn_cast(PrevIvar->getDeclContext());
1359 if (ParentExt && PrevParentExt) {
1360
1361
1362 Reader
1363 .PendingObjCExtensionIvarRedeclarations[std::make_pair(ParentExt,
1364 PrevParentExt)]
1365 .push_back(std::make_pair(IVD, PrevIvar));
1366 } else if (ParentExt || PrevParentExt) {
1367
1368
1369
1370 Reader.Diag(IVD->getLocation(), diag::err_duplicate_ivar_declaration)
1371 << II;
1372 Reader.Diag(PrevIvar->getLocation(), diag::note_previous_definition);
1373 }
1374 }
1375}
1376
1377void ASTDeclReader::ReadObjCDefinitionData(
1378 struct ObjCProtocolDecl::DefinitionData &Data) {
1379 unsigned NumProtoRefs = Record.readInt();
1381 ProtoRefs.reserve(NumProtoRefs);
1382 for (unsigned I = 0; I != NumProtoRefs; ++I)
1383 ProtoRefs.push_back(readDeclAs());
1385 ProtoLocs.reserve(NumProtoRefs);
1386 for (unsigned I = 0; I != NumProtoRefs; ++I)
1387 ProtoLocs.push_back(readSourceLocation());
1388 Data.ReferencedProtocols.set(ProtoRefs.data(), NumProtoRefs,
1389 ProtoLocs.data(), Reader.getContext());
1391 Data.HasODRHash = true;
1392}
1393
1395 ObjCProtocolDecl *D, struct ObjCProtocolDecl::DefinitionData &&NewDD) {
1396 struct ObjCProtocolDecl::DefinitionData &DD = D->data();
1397 if (DD.Definition == NewDD.Definition)
1398 return;
1399
1400 Reader.MergedDeclContexts.insert(
1401 std::make_pair(NewDD.Definition, DD.Definition));
1402 Reader.mergeDefinitionVisibility(DD.Definition, NewDD.Definition);
1403
1404 if (D->getODRHash() != NewDD.ODRHash)
1405 Reader.PendingObjCProtocolOdrMergeFailures[DD.Definition].push_back(
1406 {NewDD.Definition, &NewDD});
1407}
1408
1413
1414 if (Record.readInt()) {
1415
1416 PD->allocateDefinitionData();
1417
1418 ReadObjCDefinitionData(PD->data());
1419
1421 if (Canon->Data.getPointer()) {
1422
1423
1424 MergeImpl.MergeDefinitionData(Canon, std::move(PD->data()));
1425 PD->Data = Canon->Data;
1426 } else {
1427
1428
1430 }
1431
1432 Reader.PendingDefinitions.insert(PD);
1433 } else {
1435 }
1436}
1437
1441
1447
1448
1449
1450
1451 Reader.CategoriesDeserialized.insert(CD);
1452
1453 CD->ClassInterface = readDeclAs();
1455 unsigned NumProtoRefs = Record.readInt();
1457 ProtoRefs.reserve(NumProtoRefs);
1458 for (unsigned I = 0; I != NumProtoRefs; ++I)
1459 ProtoRefs.push_back(readDeclAs());
1461 ProtoLocs.reserve(NumProtoRefs);
1462 for (unsigned I = 0; I != NumProtoRefs; ++I)
1463 ProtoLocs.push_back(readSourceLocation());
1464 CD->setProtocolList(ProtoRefs.data(), NumProtoRefs, ProtoLocs.data(),
1465 Reader.getContext());
1466
1467
1468 if (NumProtoRefs > 0 && CD->ClassInterface && CD->IsClassExtension())
1471 Reader.getContext());
1472}
1473
1478
1501
1506
1509 D->CategoryNameLoc = readSourceLocation();
1510}
1511
1514 D->setSuperClass(readDeclAs());
1515 D->SuperLoc = readSourceLocation();
1520 D->NumIvarInitializers = Record.readInt();
1521 if (D->NumIvarInitializers)
1522 D->IvarInitializers = ReadGlobalOffset();
1523}
1524
1527 D->setAtLoc(readSourceLocation());
1529 D->PropertyIvarDecl = readDeclAs();
1530 D->IvarLoc = readSourceLocation();
1535}
1536
1539 FD->Mutable = Record.readInt();
1540
1541 unsigned Bits = Record.readInt();
1542 FD->StorageKind = Bits >> 1;
1543 if (FD->StorageKind == FieldDecl::ISK_CapturedVLAType)
1546 else if (Bits & 1)
1548
1551 if (auto *Tmpl = readDeclAs())
1552 Reader.getContext().setInstantiatedFromUnnamedFieldDecl(FD, Tmpl);
1553 }
1555}
1556
1559 PD->GetterId = Record.readIdentifier();
1560 PD->SetterId = Record.readIdentifier();
1561}
1562
1565 D->PartVal.Part1 = Record.readInt();
1566 D->PartVal.Part2 = Record.readInt();
1567 D->PartVal.Part3 = Record.readInt();
1568 for (auto &C : D->PartVal.Part4And5)
1569 C = Record.readInt();
1570
1571
1572 if (MSGuidDecl *Existing = Reader.getContext().MSGuidDecls.GetOrInsertNode(D))
1573 Reader.getContext().setPrimaryMergedDecl(D, Existing->getCanonicalDecl());
1574}
1575
1579 D->Value = Record.readAPValue();
1580
1581
1583 Reader.getContext().UnnamedGlobalConstantDecls.GetOrInsertNode(D))
1584 Reader.getContext().setPrimaryMergedDecl(D, Existing->getCanonicalDecl());
1585}
1586
1589 D->Value = Record.readAPValue();
1590
1591
1592
1594 Reader.getContext().TemplateParamObjectDecls.GetOrInsertNode(D))
1595 Reader.getContext().setPrimaryMergedDecl(D, Existing->getCanonicalDecl());
1596}
1597
1600
1601 FD->ChainingSize = Record.readInt();
1602 assert(FD->ChainingSize >= 2 && "Anonymous chaining must be >= 2");
1603 FD->Chaining = new (Reader.getContext())NamedDecl*[FD->ChainingSize];
1604
1605 for (unsigned I = 0; I != FD->ChainingSize; ++I)
1606 FD->Chaining[I] = readDeclAs();
1607
1609}
1610
1614
1617 bool DefGeneratedInModule = VarDeclBits.getNextBit();
1622 bool HasDeducedType = false;
1629
1636
1638 HasDeducedType = VarDeclBits.getNextBit();
1641
1644 }
1645
1646
1647
1648
1649 if (HasDeducedType)
1650 Reader.PendingDeducedVarTypes.push_back({VD, DeferredTypeID});
1651 else
1652 VD->setType(Reader.GetType(DeferredTypeID));
1653 DeferredTypeID = 0;
1654
1656
1657
1661
1662 if (DefGeneratedInModule) {
1663 Reader.DefinitionSource[VD] =
1665 Reader.getContext().getLangOpts().BuildingPCHWithObjectFile;
1666 }
1667
1668 if (VD->hasAttr()) {
1669 Expr *CopyExpr = Record.readExpr();
1670 if (CopyExpr)
1671 Reader.getContext().setBlockVarCopyInit(VD, CopyExpr, Record.readInt());
1672 }
1673
1674 enum VarKind {
1675 VarNotTemplate = 0, VarTemplate, StaticDataMemberSpecialization
1676 };
1677 switch ((VarKind)Record.readInt()) {
1678 case VarNotTemplate:
1679
1680
1684 break;
1686
1688 break;
1689 case StaticDataMemberSpecialization: {
1690 auto *Tmpl = readDeclAs();
1693 Reader.getContext().setInstantiatedFromStaticDataMember(VD, Tmpl, TSK,POI);
1695 break;
1696 }
1697 }
1698
1699 return Redecl;
1700}
1701
1703 if (uint64_t Val = Record.readInt()) {
1711 Eval->Evaluated = Record.readAPValue();
1713 Reader.getContext().addDestruction(&Eval->Evaluated);
1714 }
1715
1716
1717
1718
1719 Eval->Value = GetCurrentCursorOffset();
1720 }
1721}
1722
1726
1729
1730 unsigned scopeIndex = Record.readInt();
1731 BitsUnpacker ParmVarDeclBits(Record.readInt());
1732 unsigned isObjCMethodParam = ParmVarDeclBits.getNextBit();
1733 unsigned scopeDepth = ParmVarDeclBits.getNextBits(7);
1734 unsigned declQualifier = ParmVarDeclBits.getNextBits(7);
1735 if (isObjCMethodParam) {
1736 assert(scopeDepth == 0);
1738 PD->ParmVarDeclBits.ScopeDepthOrObjCQuals = declQualifier;
1739 } else {
1741 }
1743
1745 if (ParmVarDeclBits.getNextBit())
1747
1748 if (ParmVarDeclBits.getNextBit())
1749 PD->ExplicitObjectParameterIntroducerLoc = Record.readSourceLocation();
1750
1751
1752
1753}
1754
1757 auto **BDs = DD->getTrailingObjects();
1758 for (unsigned I = 0; I != DD->NumBindings; ++I) {
1759 BDs[I] = readDeclAs();
1760 BDs[I]->setDecomposedDecl(DD);
1761 }
1762}
1763
1766 BD->Binding = Record.readExpr();
1767}
1768
1774
1777 D->Statement = Record.readStmt();
1778}
1779
1782 BD->setBody(cast_or_null(Record.readStmt()));
1784 unsigned NumParams = Record.readInt();
1786 Params.reserve(NumParams);
1787 for (unsigned I = 0; I != NumParams; ++I)
1788 Params.push_back(readDeclAs());
1790
1796
1797 bool capturesCXXThis = Record.readInt();
1798 unsigned numCaptures = Record.readInt();
1800 captures.reserve(numCaptures);
1801 for (unsigned i = 0; i != numCaptures; ++i) {
1802 auto *decl = readDeclAs();
1803 unsigned flags = Record.readInt();
1804 bool byRef = (flags & 1);
1805 bool nested = (flags & 2);
1806 Expr *copyExpr = ((flags & 4) ? Record.readExpr() : nullptr);
1807
1809 }
1810 BD->setCaptures(Reader.getContext(), captures, capturesCXXThis);
1811}
1812
1814
1816 for (unsigned I = 0; I < D->NumParams; ++I)
1817 D->setParam(I, readDeclAs());
1818 D->setNothrow(Record.readInt() != 0);
1819 D->setBody(cast_or_null(Record.readStmt()));
1820}
1821
1824 unsigned ContextParamPos = Record.readInt();
1825 CD->setNothrow(Record.readInt() != 0);
1826
1827 for (unsigned I = 0; I < CD->NumParams; ++I) {
1828 if (I != ContextParamPos)
1829 CD->setParam(I, readDeclAs());
1830 else
1831 CD->setContextParam(I, readDeclAs());
1832 }
1833}
1834
1841
1844 D->RBraceLoc = readSourceLocation();
1845}
1846
1851
1855
1856 BitsUnpacker NamespaceDeclBits(Record.readInt());
1859 D->LocStart = readSourceLocation();
1860 D->RBraceLoc = readSourceLocation();
1861
1862
1863
1864
1865
1867 if (Redecl.getFirstID() == ThisDeclID)
1868 AnonNamespace = readDeclID();
1869
1871
1872 if (AnonNamespace.isValid()) {
1873
1874
1875
1877 if (!Record.isModule())
1879 }
1880}
1881
1886 D->IsCBuffer = Record.readBool();
1887 D->KwLoc = readSourceLocation();
1888 D->LBraceLoc = readSourceLocation();
1889 D->RBraceLoc = readSourceLocation();
1890}
1891
1895 D->NamespaceLoc = readSourceLocation();
1896 D->IdentLoc = readSourceLocation();
1897 D->QualifierLoc = Record.readNestedNameSpecifierLoc();
1898 D->Namespace = readDeclAs();
1900}
1901
1905 D->QualifierLoc = Record.readNestedNameSpecifierLoc();
1906 D->DNLoc = Record.readDeclarationNameLoc(D->getDeclName());
1907 D->FirstUsingShadow.setPointer(readDeclAs());
1909 if (auto *Pattern = readDeclAs())
1910 Reader.getContext().setInstantiatedFromUsingDecl(D, Pattern);
1912}
1913
1917 D->setEnumLoc(readSourceLocation());
1918 D->setEnumType(Record.readTypeSourceInfo());
1919 D->FirstUsingShadow.setPointer(readDeclAs());
1920 if (auto *Pattern = readDeclAs())
1921 Reader.getContext().setInstantiatedFromUsingEnumDecl(D, Pattern);
1923}
1924
1927 D->InstantiatedFrom = readDeclAs();
1928 auto **Expansions = D->getTrailingObjects();
1929 for (unsigned I = 0; I != D->NumExpansions; ++I)
1930 Expansions[I] = readDeclAs();
1932}
1933
1937 D->Underlying = readDeclAs();
1939 D->UsingOrNextShadow = readDeclAs();
1940 auto *Pattern = readDeclAs();
1941 if (Pattern)
1942 Reader.getContext().setInstantiatedFromUsingShadowDecl(D, Pattern);
1944}
1945
1949 D->NominatedBaseClassShadowDecl = readDeclAs();
1950 D->ConstructedBaseClassShadowDecl = readDeclAs();
1951 D->IsVirtual = Record.readInt();
1952}
1953
1956 D->UsingLoc = readSourceLocation();
1957 D->NamespaceLoc = readSourceLocation();
1958 D->QualifierLoc = Record.readNestedNameSpecifierLoc();
1959 D->NominatedNamespace = readDeclAs();
1960 D->CommonAncestor = readDeclAs();
1961}
1962
1966 D->QualifierLoc = Record.readNestedNameSpecifierLoc();
1967 D->DNLoc = Record.readDeclarationNameLoc(D->getDeclName());
1968 D->EllipsisLoc = readSourceLocation();
1970}
1971
1975 D->TypenameLocation = readSourceLocation();
1976 D->QualifierLoc = Record.readNestedNameSpecifierLoc();
1977 D->EllipsisLoc = readSourceLocation();
1979}
1980
1985
1986void ASTDeclReader::ReadCXXDefinitionData(
1987 struct CXXRecordDecl::DefinitionData &Data, const CXXRecordDecl *D,
1988 Decl *LambdaContext, unsigned IndexInLambdaContext) {
1989
1991
1992#define FIELD(Name, Width, Merge) \
1993 if (!CXXRecordDeclBits.canGetNextNBits(Width)) \
1994 CXXRecordDeclBits.updateValue(Record.readInt()); \
1995 Data.Name = CXXRecordDeclBits.getNextBits(Width);
1996
1997#include "clang/AST/CXXRecordDeclDefinitionBits.def"
1998#undef FIELD
1999
2000
2002 Data.HasODRHash = true;
2003
2004 if (Record.readInt()) {
2005 Reader.DefinitionSource[D] =
2006 Loc.F->Kind == ModuleKind::MK_MainFile ||
2008 }
2009
2010 Record.readUnresolvedSet(Data.Conversions);
2011 Data.ComputedVisibleConversions = Record.readInt();
2012 if (Data.ComputedVisibleConversions)
2013 Record.readUnresolvedSet(Data.VisibleConversions);
2014 assert(Data.Definition && "Data.Definition should be already set!");
2015
2016 if (.IsLambda) {
2017 assert(!LambdaContext && !IndexInLambdaContext &&
2018 "given lambda context for non-lambda");
2019
2021 if (Data.NumBases)
2022 Data.Bases = ReadGlobalOffset();
2023
2025 if (Data.NumVBases)
2026 Data.VBases = ReadGlobalOffset();
2027
2029 } else {
2030 using Capture = LambdaCapture;
2031
2032 auto &Lambda = static_cast<CXXRecordDecl::LambdaDefinitionData &>(Data);
2033
2034 BitsUnpacker LambdaBits(Record.readInt());
2035 Lambda.DependencyKind = LambdaBits.getNextBits(2);
2036 Lambda.IsGenericLambda = LambdaBits.getNextBit();
2037 Lambda.CaptureDefault = LambdaBits.getNextBits(2);
2038 Lambda.NumCaptures = LambdaBits.getNextBits(15);
2039 Lambda.HasKnownInternalLinkage = LambdaBits.getNextBit();
2040
2041 Lambda.NumExplicitCaptures = Record.readInt();
2042 Lambda.ManglingNumber = Record.readInt();
2043 if (unsigned DeviceManglingNumber = Record.readInt())
2044 Reader.getContext().DeviceLambdaManglingNumbers[D] = DeviceManglingNumber;
2045 Lambda.IndexInContext = IndexInLambdaContext;
2046 Lambda.ContextDecl = LambdaContext;
2047 Capture *ToCapture = nullptr;
2048 if (Lambda.NumCaptures) {
2049 ToCapture = (Capture *)Reader.getContext().Allocate(sizeof(Capture) *
2050 Lambda.NumCaptures);
2051 Lambda.AddCaptureList(Reader.getContext(), ToCapture);
2052 }
2053 Lambda.MethodTyInfo = readTypeSourceInfo();
2054 for (unsigned I = 0, N = Lambda.NumCaptures; I != N; ++I) {
2055 SourceLocation Loc = readSourceLocation();
2056 BitsUnpacker CaptureBits(Record.readInt());
2057 bool IsImplicit = CaptureBits.getNextBit();
2059 static_cast<LambdaCaptureKind>(CaptureBits.getNextBits(3));
2060 switch (Kind) {
2064 new (ToCapture)
2065 Capture(Loc, IsImplicit, Kind, nullptr, SourceLocation());
2066 ToCapture++;
2067 break;
2070 auto *Var = readDeclAs();
2071 SourceLocation EllipsisLoc = readSourceLocation();
2072 new (ToCapture) Capture(Loc, IsImplicit, Kind, Var, EllipsisLoc);
2073 ToCapture++;
2074 break;
2075 }
2076 }
2077 }
2078}
2079
2081 CXXRecordDecl *D, struct CXXRecordDecl::DefinitionData &&MergeDD) {
2082 assert(D->DefinitionData &&
2083 "merging class definition into non-definition");
2084 auto &DD = *D->DefinitionData;
2085
2086 if (DD.Definition != MergeDD.Definition) {
2087
2088 Reader.MergedDeclContexts.insert(std::make_pair(MergeDD.Definition,
2089 DD.Definition));
2090 Reader.PendingDefinitions.erase(MergeDD.Definition);
2091 MergeDD.Definition->demoteThisDefinitionToDeclaration();
2092 Reader.mergeDefinitionVisibility(DD.Definition, MergeDD.Definition);
2093 assert(!Reader.Lookups.contains(MergeDD.Definition) &&
2094 "already loaded pending lookups for merged definition");
2095 }
2096
2097 auto PFDI = Reader.PendingFakeDefinitionData.find(&DD);
2098 if (PFDI != Reader.PendingFakeDefinitionData.end() &&
2099 PFDI->second == ASTReader::PendingFakeDefinitionKind::Fake) {
2100
2101
2102 assert(!DD.IsLambda && !MergeDD.IsLambda && "faked up lambda definition?");
2103 PFDI->second = ASTReader::PendingFakeDefinitionKind::FakeLoaded;
2104
2105
2106
2107 auto *Def = DD.Definition;
2108 DD = std::move(MergeDD);
2109 DD.Definition = Def;
2110 for (auto *D : Def->redecls())
2112 return;
2113 }
2114
2115 bool DetectedOdrViolation = false;
2116
2117 #define FIELD(Name, Width, Merge) Merge(Name)
2118 #define MERGE_OR(Field) DD.Field |= MergeDD.Field;
2119 #define NO_MERGE(Field) \
2120 DetectedOdrViolation |= DD.Field != MergeDD.Field; \
2121 MERGE_OR(Field)
2122 #include "clang/AST/CXXRecordDeclDefinitionBits.def"
2124 #undef NO_MERGE
2125 #undef MERGE_OR
2126
2127 if (DD.NumBases != MergeDD.NumBases || DD.NumVBases != MergeDD.NumVBases)
2128 DetectedOdrViolation = true;
2129
2130
2131
2132
2133
2134 if (MergeDD.ComputedVisibleConversions && !DD.ComputedVisibleConversions) {
2135 DD.VisibleConversions = std::move(MergeDD.VisibleConversions);
2136 DD.ComputedVisibleConversions = true;
2137 }
2138
2139
2140
2141
2142 if (DD.IsLambda) {
2143 auto &Lambda1 = static_cast<CXXRecordDecl::LambdaDefinitionData &>(DD);
2144 auto &Lambda2 = static_cast<CXXRecordDecl::LambdaDefinitionData &>(MergeDD);
2145 DetectedOdrViolation |= Lambda1.DependencyKind != Lambda2.DependencyKind;
2146 DetectedOdrViolation |= Lambda1.IsGenericLambda != Lambda2.IsGenericLambda;
2147 DetectedOdrViolation |= Lambda1.CaptureDefault != Lambda2.CaptureDefault;
2148 DetectedOdrViolation |= Lambda1.NumCaptures != Lambda2.NumCaptures;
2149 DetectedOdrViolation |=
2150 Lambda1.NumExplicitCaptures != Lambda2.NumExplicitCaptures;
2151 DetectedOdrViolation |=
2152 Lambda1.HasKnownInternalLinkage != Lambda2.HasKnownInternalLinkage;
2153 DetectedOdrViolation |= Lambda1.ManglingNumber != Lambda2.ManglingNumber;
2154
2155 if (Lambda1.NumCaptures && Lambda1.NumCaptures == Lambda2.NumCaptures) {
2156 for (unsigned I = 0, N = Lambda1.NumCaptures; I != N; ++I) {
2157 LambdaCapture &Cap1 = Lambda1.Captures.front()[I];
2158 LambdaCapture &Cap2 = Lambda2.Captures.front()[I];
2160 }
2161 Lambda1.AddCaptureList(Reader.getContext(), Lambda2.Captures.front());
2162 }
2163 }
2164
2165
2167 return;
2168
2169 if (D->getODRHash() != MergeDD.ODRHash) {
2170 DetectedOdrViolation = true;
2171 }
2172
2173 if (DetectedOdrViolation)
2174 Reader.PendingOdrMergeFailures[DD.Definition].push_back(
2175 {MergeDD.Definition, &MergeDD});
2176}
2177
2178void ASTDeclReader::ReadCXXRecordDefinition(CXXRecordDecl *D, bool Update,
2179 Decl *LambdaContext,
2180 unsigned IndexInLambdaContext) {
2181 struct CXXRecordDecl::DefinitionData *DD;
2183
2184
2185
2186 bool IsLambda = Record.readInt();
2187 assert(!(IsLambda && Update) &&
2188 "lambda definition should not be added by update record");
2189 if (IsLambda)
2190 DD = new (C) CXXRecordDecl::LambdaDefinitionData(
2192 else
2193 DD = new (C) struct CXXRecordDecl::DefinitionData(D);
2194
2196
2197
2198
2199 if (!Canon->DefinitionData)
2200 Canon->DefinitionData = DD;
2201 D->DefinitionData = Canon->DefinitionData;
2202 ReadCXXDefinitionData(*DD, D, LambdaContext, IndexInLambdaContext);
2203
2204
2206
2207
2208
2209
2210 if (Canon->DefinitionData != DD) {
2212 return;
2213 }
2214
2215
2216
2217
2218 if (Update || Canon != D)
2219 Reader.PendingDefinitions.insert(D);
2220}
2221
2224
2226
2227 enum CXXRecKind {
2228 CXXRecNotTemplate = 0,
2229 CXXRecTemplate,
2230 CXXRecMemberSpecialization,
2231 CXXLambda
2232 };
2233
2234 Decl *LambdaContext = nullptr;
2235 unsigned IndexInLambdaContext = 0;
2236
2237 switch ((CXXRecKind)Record.readInt()) {
2238 case CXXRecNotTemplate:
2239
2242 break;
2243 case CXXRecTemplate: {
2244
2245 auto *Template = readDeclAs();
2246 D->TemplateOrInstantiation = Template;
2247 break;
2248 }
2249 case CXXRecMemberSpecialization: {
2250 auto *RD = readDeclAs();
2255 D->TemplateOrInstantiation = MSI;
2257 break;
2258 }
2259 case CXXLambda: {
2260 LambdaContext = readDecl();
2261 if (LambdaContext)
2262 IndexInLambdaContext = Record.readInt();
2263 if (LambdaContext)
2264 MergeImpl.mergeLambda(D, Redecl, *LambdaContext, IndexInLambdaContext);
2265 else
2266
2267
2269 break;
2270 }
2271 }
2272
2273 bool WasDefinition = Record.readInt();
2274 if (WasDefinition)
2275 ReadCXXRecordDefinition(D, false, LambdaContext,
2276 IndexInLambdaContext);
2277 else
2278
2280
2281
2282
2283 if (WasDefinition) {
2286
2287
2288
2290 }
2291
2292 return Redecl;
2293}
2294
2296 D->setExplicitSpecifier(Record.readExplicitSpec());
2297 D->Ctor = readDeclAs();
2304 Record.readInt()));
2305}
2306
2309
2310 unsigned NumOverridenMethods = Record.readInt();
2312 while (NumOverridenMethods--) {
2313
2314
2315 if (auto *MD = readDeclAs())
2316 Reader.getContext().addOverriddenMethod(D, MD->getCanonicalDecl());
2317 }
2318 } else {
2319
2320
2321 Record.skipInts(NumOverridenMethods);
2322 }
2323}
2324
2326
2327
2330 auto *Shadow = readDeclAs();
2331 auto *Ctor = readDeclAs();
2334 }
2335
2337}
2338
2341
2344 if (auto *OperatorDelete = readDeclAs()) {
2345 auto *ThisArg = Record.readExpr();
2346
2348 C.addOperatorDeleteForVDtor(D, OperatorDelete,
2350 Canon->OperatorDeleteThisArg = ThisArg;
2351 }
2352 }
2353 if (auto *OperatorGlobDelete = readDeclAs()) {
2354 if (.dtorHasOperatorDelete(D,
2356 C.addOperatorDeleteForVDtor(
2358 }
2359 if (auto *OperatorArrayDelete = readDeclAs()) {
2361 C.addOperatorDeleteForVDtor(D, OperatorArrayDelete,
2363 }
2364 if (auto *OperatorGlobArrayDelete = readDeclAs()) {
2365 if (.dtorHasOperatorDelete(D,
2367 C.addOperatorDeleteForVDtor(D, OperatorGlobArrayDelete,
2369 }
2370}
2371
2376
2379 D->ImportedModule = readModule();
2380 D->setImportComplete(Record.readInt());
2381 auto *StoredLocs = D->getTrailingObjects();
2382 for (unsigned I = 0, N = Record.back(); I != N; ++I)
2383 StoredLocs[I] = readSourceLocation();
2384 Record.skipInts(1);
2385}
2386
2391
2394 if (Record.readInt())
2395 D->Friend = readDeclAs();
2396 else
2397 D->Friend = readTypeSourceInfo();
2398 for (unsigned i = 0; i != D->NumTPLists; ++i)
2399 D->getTrailingObjects()[i] = Record.readTemplateParameterList();
2400 D->NextFriend = readDeclID().getRawValue();
2401 D->UnsupportedFriend = (Record.readInt() != 0);
2402 D->FriendLoc = readSourceLocation();
2403 D->EllipsisLoc = readSourceLocation();
2404}
2405
2408 unsigned NumParams = Record.readInt();
2409 D->NumParams = NumParams;
2411 for (unsigned i = 0; i != NumParams; ++i)
2412 D->Params[i] = Record.readTemplateParameterList();
2413 if (Record.readInt())
2414 D->Friend = readDeclAs();
2415 else
2416 D->Friend = readTypeSourceInfo();
2417 D->FriendLoc = readSourceLocation();
2418}
2419
2422
2423 assert(!D->TemplateParams && "TemplateParams already set!");
2424 D->TemplateParams = Record.readTemplateParameterList();
2425 D->init(readDeclAs());
2426}
2427
2433
2436
2437
2440 for (unsigned I = 0; I < D->NumTemplateArgs; ++I)
2441 Args.push_back(Record.readTemplateArgument(false));
2443}
2444
2447
2449 llvm::BitstreamCursor &DeclsCursor,
2450 bool IsPartial) {
2451 uint64_t Offset = ReadLocalOffset();
2452 bool Failed =
2453 Reader.ReadSpecializations(M, DeclsCursor, Offset, D, IsPartial);
2454 (void)Failed;
2455 assert(!Failed);
2456}
2457
2458RedeclarableResult
2461
2462
2463
2465 if (!CanonD->Common) {
2466 CanonD->Common = CanonD->newCommon(Reader.getContext());
2467 Reader.PendingDefinitions.insert(CanonD);
2468 }
2470
2471
2472
2473 if (ThisDeclID == Redecl.getFirstID()) {
2474 if (auto *RTD = readDeclAs()) {
2475 assert(RTD->getKind() == D->getKind() &&
2476 "InstantiatedFromMemberTemplate kind mismatch");
2478 if (Record.readInt())
2480 }
2481 }
2482
2485
2486 return Redecl;
2487}
2488
2492
2493 if (ThisDeclID == Redecl.getFirstID()) {
2494
2495
2496 ReadSpecializations(*Loc.F, D, Loc.F->DeclsCursor, false);
2498 }
2499}
2500
2502 llvm_unreachable("BuiltinTemplates are not serialized");
2503}
2504
2505
2506
2507
2511
2512 if (ThisDeclID == Redecl.getFirstID()) {
2513
2514
2515 ReadSpecializations(*Loc.F, D, Loc.F->DeclsCursor, false);
2517 }
2518}
2519
2523
2525 if (Decl *InstD = readDecl()) {
2526 if (auto *CTD = dyn_cast(InstD)) {
2527 D->SpecializedTemplate = CTD;
2528 } else {
2530 Record.readTemplateArgumentList(TemplArgs);
2533 auto *PS =
2535 SpecializedPartialSpecialization();
2536 PS->PartialSpecialization
2538 PS->TemplateArgs = ArgList;
2539 D->SpecializedTemplate = PS;
2540 }
2541 }
2542
2544 Record.readTemplateArgumentList(TemplArgs, true);
2546 D->PointOfInstantiation = readSourceLocation();
2548 D->StrictPackMatch = Record.readBool();
2549
2550 bool writtenAsCanonicalDecl = Record.readInt();
2551 if (writtenAsCanonicalDecl) {
2552 auto *CanonPattern = readDeclAs();
2553 if (D->isCanonicalDecl()) {
2554
2556 if (auto *Partial = dyn_cast(D)) {
2557 CanonSpec = CanonPattern->getCommonPtr()->PartialSpecializations
2558 .GetOrInsertNode(Partial);
2559 } else {
2560 CanonSpec =
2561 CanonPattern->getCommonPtr()->Specializations.GetOrInsertNode(D);
2562 }
2563
2564 if (CanonSpec != D) {
2565 MergeImpl.mergeRedeclarable<TagDecl>(D, CanonSpec, Redecl);
2566
2567
2568
2569 if (auto *DDD = D->DefinitionData) {
2570 if (CanonSpec->DefinitionData)
2571 MergeImpl.MergeDefinitionData(CanonSpec, std::move(*DDD));
2572 else
2573 CanonSpec->DefinitionData = D->DefinitionData;
2574 }
2575 D->DefinitionData = CanonSpec->DefinitionData;
2576 }
2577 }
2578 }
2579
2580
2581 if (Record.readBool()) {
2584 ExplicitInfo->TemplateKeywordLoc = readSourceLocation();
2585 D->ExplicitInfo = ExplicitInfo;
2586 }
2587
2588 if (Record.readBool())
2590
2591 return Redecl;
2592}
2593
2596
2597
2599 D->TemplateParams = Params;
2600
2602
2603
2604 if (ThisDeclID == Redecl.getFirstID()) {
2605 D->InstantiatedFromMember.setPointer(
2606 readDeclAs());
2607 D->InstantiatedFromMember.setInt(Record.readInt());
2608 }
2609}
2610
2613
2614 if (ThisDeclID == Redecl.getFirstID()) {
2615
2616 ReadSpecializations(*Loc.F, D, Loc.F->DeclsCursor, false);
2617 }
2618}
2619
2620
2621
2622
2623
2624
2628 if (Decl *InstD = readDecl()) {
2629 if (auto *VTD = dyn_cast(InstD)) {
2630 D->SpecializedTemplate = VTD;
2631 } else {
2633 Record.readTemplateArgumentList(TemplArgs);
2635 C, TemplArgs);
2636 auto *PS =
2637 new (C)
2638 VarTemplateSpecializationDecl::SpecializedPartialSpecialization();
2639 PS->PartialSpecialization =
2641 PS->TemplateArgs = ArgList;
2642 D->SpecializedTemplate = PS;
2643 }
2644 }
2645
2646
2647 if (Record.readBool()) {
2650 ExplicitInfo->TemplateKeywordLoc = readSourceLocation();
2651 D->ExplicitInfo = ExplicitInfo;
2652 }
2653
2654 if (Record.readBool())
2656
2658 Record.readTemplateArgumentList(TemplArgs, true);
2660 D->PointOfInstantiation = readSourceLocation();
2662 D->IsCompleteDefinition = Record.readInt();
2663
2665
2666 bool writtenAsCanonicalDecl = Record.readInt();
2667 if (writtenAsCanonicalDecl) {
2668 auto *CanonPattern = readDeclAs();
2669 if (D->isCanonicalDecl()) {
2671 if (auto *Partial = dyn_cast(D)) {
2672 CanonSpec = CanonPattern->getCommonPtr()
2673 ->PartialSpecializations.GetOrInsertNode(Partial);
2674 } else {
2675 CanonSpec =
2676 CanonPattern->getCommonPtr()->Specializations.GetOrInsertNode(D);
2677 }
2678
2679 if (CanonSpec != D)
2680 MergeImpl.mergeRedeclarable<VarDecl>(D, CanonSpec, Redecl);
2681 }
2682 }
2683
2684 return Redecl;
2685}
2686
2687
2688
2689
2690
2691
2695 D->TemplateParams = Params;
2696
2698
2699
2700 if (ThisDeclID == Redecl.getFirstID()) {
2701 D->InstantiatedFromMember.setPointer(
2702 readDeclAs());
2703 D->InstantiatedFromMember.setInt(Record.readInt());
2704 }
2705}
2706
2709
2711
2712 bool TypeConstraintInitialized = D->hasTypeConstraint() && Record.readBool();
2713 if (TypeConstraintInitialized) {
2715 if (Record.readBool())
2716 CR = Record.readConceptReference();
2717 Expr *ImmediatelyDeclaredConstraint = Record.readExpr();
2718 UnsignedOrNone ArgPackSubstIndex = Record.readUnsignedOrNone();
2719
2720 D->setTypeConstraint(CR, ImmediatelyDeclaredConstraint, ArgPackSubstIndex);
2721 D->NumExpanded = Record.readUnsignedOrNone();
2722 }
2723
2724 if (Record.readInt())
2726 Record.readTemplateArgumentLoc());
2727}
2728
2731
2732 D->setDepth(Record.readInt());
2737 auto TypesAndInfos =
2738 D->getTrailingObjects<std::pair<QualType, TypeSourceInfo *>>();
2740 new (&TypesAndInfos[I].first) QualType(Record.readType());
2741 TypesAndInfos[I].second = readTypeSourceInfo();
2742 }
2743 } else {
2744
2745 D->ParameterPack = Record.readInt();
2746 if (Record.readInt())
2748 Record.readTemplateArgumentLoc());
2749 }
2750}
2751
2754 D->ParameterKind = static_cast<TemplateNameKind>(Record.readInt());
2756
2757 D->setDepth(Record.readInt());
2760 auto **Data = D->getTrailingObjects();
2762 I != N; ++I)
2763 Data[I] = Record.readTemplateParameterList();
2764 } else {
2765
2766 D->ParameterPack = Record.readInt();
2767 if (Record.readInt())
2769 Record.readTemplateArgumentLoc());
2770 }
2771}
2772
2777
2780 D->AssertExprAndFailed.setPointer(Record.readExpr());
2781 D->AssertExprAndFailed.setInt(Record.readInt());
2782 D->Message = cast_or_null(Record.readExpr());
2783 D->RParenLoc = readSourceLocation();
2784}
2785
2789
2793 D->ExtendingDecl = readDeclAs();
2794 D->ExprWithTemporary = Record.readStmt();
2795 if (Record.readInt()) {
2798 }
2799 D->ManglingNumber = Record.readInt();
2801}
2802
2810
2811template
2814 Decl *MergeWith = nullptr;
2815
2816 bool IsKeyDecl = ThisDeclID == FirstDeclID;
2817 bool IsFirstLocalDecl = false;
2818
2819 uint64_t RedeclOffset = 0;
2820
2821
2822
2824 FirstDeclID = ThisDeclID;
2825 IsKeyDecl = true;
2826 IsFirstLocalDecl = true;
2827 } else if (unsigned N = Record.readInt()) {
2828
2829
2830 IsKeyDecl = N == 1;
2831 IsFirstLocalDecl = true;
2832
2833
2834
2835
2836
2837
2838 for (unsigned I = 0; I != N - 1; ++I)
2839 MergeWith = readDecl();
2840
2841 RedeclOffset = ReadLocalOffset();
2842 } else {
2843
2844
2845 (void)readDecl();
2846 }
2847
2848 auto *FirstDecl = cast_or_null(Reader.GetDecl(FirstDeclID));
2849 if (FirstDecl != D) {
2850
2851
2852
2853
2855 D->First = FirstDecl->getCanonicalDecl();
2856 }
2857
2858 auto *DAsT = static_cast<T *>(D);
2859
2860
2861
2862
2863
2864 if (IsFirstLocalDecl)
2865 Reader.PendingDeclChains.push_back(std::make_pair(DAsT, RedeclOffset));
2866
2867 return RedeclarableResult(MergeWith, FirstDeclID, IsKeyDecl);
2868}
2869
2870
2871
2872template
2874 RedeclarableResult &Redecl) {
2875
2876 if (!Reader.getContext().getLangOpts().Modules)
2877 return;
2878
2879
2881 return;
2882
2883 auto *D = static_cast<T *>(DBase);
2884
2885 if (auto *Existing = Redecl.getKnownMergeTarget())
2886
2887 MergeImpl.mergeRedeclarable(D, cast(Existing), Redecl);
2888 else if (FindExistingResult ExistingRes = findExisting(D))
2889 if (T *Existing = ExistingRes)
2890 MergeImpl.mergeRedeclarable(D, Existing, Redecl);
2891}
2892
2893
2894
2895
2896
2897
2898
2900 Decl &Context, unsigned IndexInContext) {
2901
2902 if (!Reader.getContext().getLangOpts().Modules)
2903 return;
2904
2905
2907 return;
2908
2909 if (auto *Existing = Redecl.getKnownMergeTarget())
2910
2912
2913
2914
2915 NamedDecl *&Slot = Reader.LambdaDeclarationsForMerging[{
2916 Context.getCanonicalDecl(), IndexInContext}];
2917 if (Slot)
2919 else
2920 Slot = D;
2921}
2922
2924 RedeclarableResult &Redecl) {
2926
2927
2928
2930}
2931
2932
2933
2934
2937 llvm_unreachable("bad assert_cast");
2938}
2939
2940
2941
2944 bool IsKeyDecl) {
2947 RedeclarableResult Result(
2948 ExistingPattern,
2949 DPattern->getCanonicalDecl()->getGlobalID(), IsKeyDecl);
2950
2951 if (auto *DClass = dyn_cast(DPattern)) {
2952
2953
2954 auto *ExistingClass =
2956 if (auto *DDD = DClass->DefinitionData) {
2957 if (ExistingClass->DefinitionData) {
2959 } else {
2960 ExistingClass->DefinitionData = DClass->DefinitionData;
2961
2962
2963 Reader.PendingDefinitions.insert(DClass);
2964 }
2965 }
2966 DClass->DefinitionData = ExistingClass->DefinitionData;
2967
2970 }
2971 if (auto *DFunction = dyn_cast(DPattern))
2974 if (auto *DVar = dyn_cast(DPattern))
2976 if (auto *DAlias = dyn_cast(DPattern))
2979 llvm_unreachable("merged an unknown kind of redeclarable template");
2980}
2981
2982
2983
2984template
2987 auto *D = static_cast<T *>(DBase);
2988 T *ExistingCanon = Existing->getCanonicalDecl();
2990 if (ExistingCanon != DCanon) {
2991
2992
2993
2995 D->First = ExistingCanon;
2996 ExistingCanon->Used |= D->Used;
2997 D->Used = false;
2998
2999 bool IsKeyDecl = KeyDeclID.isValid();
3000
3001
3002 if (auto *DTemplate = dyn_cast(D))
3005 IsKeyDecl);
3006
3007
3008 if (IsKeyDecl)
3009 Reader.KeyDecls[ExistingCanon].push_back(KeyDeclID);
3010 }
3011}
3012
3013
3014
3015
3016
3017
3019 if (!ND)
3020 return false;
3021
3023 return true;
3024 return false;
3025}
3026
3027
3028
3030
3031 if (!Reader.getContext().getLangOpts().Modules)
3032 return;
3033
3035
3037 Reader.LETemporaryForMerging[std::make_pair(
3040 Reader.getContext().setPrimaryMergedDecl(LETDecl,
3042 else
3044}
3045
3046
3047
3048
3049
3050template
3052
3053 if (!Reader.getContext().getLangOpts().Modules)
3054 return;
3055
3056
3057
3058
3059
3060 if (!Reader.getContext().getLangOpts().CPlusPlus &&
3062 return;
3063
3064 if (FindExistingResult ExistingRes = findExisting(static_cast<T*>(D)))
3065 if (T *Existing = ExistingRes)
3066 Reader.getContext().setPrimaryMergedDecl(static_cast<T *>(D),
3067 Existing->getCanonicalDecl());
3068}
3069
3071 Record.readOMPChildren(D->Data);
3073}
3074
3076 Record.readOMPChildren(D->Data);
3078}
3079
3081 Record.readOMPChildren(D->Data);
3083}
3084
3088 Expr *In = Record.readExpr();
3089 Expr *Out = Record.readExpr();
3091 Expr *Combiner = Record.readExpr();
3093 Expr *Orig = Record.readExpr();
3094 Expr *Priv = Record.readExpr();
3096 Expr *Init = Record.readExpr();
3099 D->PrevDeclInScope = readDeclID().getRawValue();
3100}
3101
3103 Record.readOMPChildren(D->Data);
3105 D->VarName = Record.readDeclarationName();
3106 D->PrevDeclInScope = readDeclID().getRawValue();
3107}
3108
3112
3116 D->DirectiveLoc = Record.readSourceLocation();
3117 D->EndLoc = Record.readSourceLocation();
3118 Record.readOpenACCClauseList(D->Clauses);
3119}
3123 D->DirectiveLoc = Record.readSourceLocation();
3124 D->EndLoc = Record.readSourceLocation();
3125 D->ParensLoc = Record.readSourceRange();
3126 D->FuncRef = Record.readExpr();
3127 Record.readOpenACCClauseList(D->Clauses);
3128}
3129
3130
3131
3132
3133
3134namespace {
3135class AttrReader {
3137
3138public:
3140
3141 uint64_t readInt() {
3142 return Reader.readInt();
3143 }
3144
3145 bool readBool() { return Reader.readBool(); }
3146
3147 SourceRange readSourceRange() {
3149 }
3150
3151 SourceLocation readSourceLocation() {
3153 }
3154
3155 Expr *readExpr() { return Reader.readExpr(); }
3156
3157 Attr *readAttr() { return Reader.readAttr(); }
3158
3159 std::string readString() {
3161 }
3162
3163 TypeSourceInfo *readTypeSourceInfo() {
3165 }
3166
3167 IdentifierInfo *readIdentifier() {
3169 }
3170
3171 VersionTuple readVersionTuple() {
3173 }
3174
3175 OMPTraitInfo *readOMPTraitInfo() { return Reader.readOMPTraitInfo(); }
3176
3177 template T *readDeclAs() { return Reader.readDeclAs<T>(); }
3178};
3179}
3180
3182 AttrReader Record(*this);
3183 auto V = Record.readInt();
3184 if ()
3185 return nullptr;
3186
3188
3189
3190 auto Kind = static_cast<attr::Kind>(V - 1);
3192
3194 IdentifierInfo *ScopeName = Record.readIdentifier();
3195 SourceRange AttrRange = Record.readSourceRange();
3196 SourceLocation ScopeLoc = Record.readSourceLocation();
3197 unsigned ParsedKind = Record.readInt();
3198 unsigned Syntax = Record.readInt();
3199 unsigned SpellingIndex = Record.readInt();
3200 bool IsAlignas = (ParsedKind == AttributeCommonInfo::AT_Aligned &&
3202 SpellingIndex == AlignedAttr::Keyword_alignas);
3203 bool IsRegularKeywordAttribute = Record.readBool();
3204
3208 IsAlignas, IsRegularKeywordAttribute});
3209
3210#include "clang/Serialization/AttrPCHRead.inc"
3211
3212 assert(New && "Unable to decode attribute?");
3213 return New;
3214}
3215
3216
3218 for (unsigned I = 0, E = readInt(); I != E; ++I)
3220 Attrs.push_back(A);
3221}
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233inline void ASTReader::LoadedDecl(unsigned Index, Decl *D) {
3234 assert(!DeclsLoaded[Index] && "Decl loaded twice?");
3235 DeclsLoaded[Index] = D;
3236}
3237
3238
3239
3240
3241
3242
3243
3244bool ASTReader::isConsumerInterestedIn(Decl *D) {
3245
3246
3247
3248
3249
3254 return false;
3255 }
3256
3257 if (isa<FileScopeAsmDecl, TopLevelStmtDecl, ObjCProtocolDecl, ObjCImplDecl,
3258 ImportDecl, PragmaCommentDecl, PragmaDetectMismatchDecl>(D))
3259 return true;
3260 if (isa<OMPThreadPrivateDecl, OMPDeclareReductionDecl, OMPDeclareMapperDecl,
3261 OMPAllocateDecl, OMPRequiresDecl>(D))
3263 if (const auto *Var = dyn_cast(D))
3264 return Var->isFileVarDecl() &&
3266 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(Var));
3267 if (const auto *Func = dyn_cast(D))
3268 return Func->doesThisDeclarationHaveABody() || PendingBodies.count(D);
3269
3272 return true;
3273
3274 return false;
3275}
3276
3277
3278ASTReader::RecordLocation ASTReader::DeclCursorForID(GlobalDeclID ID,
3281 assert(M);
3282 unsigned LocalDeclIndex = ID.getLocalDeclIndex();
3283 const DeclOffset &DOffs = M->DeclOffsets[LocalDeclIndex];
3286}
3287
3288ASTReader::RecordLocation ASTReader::getLocalBitOffset(uint64_t GlobalOffset) {
3289 auto I = GlobalBitOffsetsMap.find(GlobalOffset);
3290
3291 assert(I != GlobalBitOffsetsMap.end() && "Corrupted global bit offsets map");
3292 return RecordLocation(I->second, GlobalOffset - I->second->GlobalBitOffset);
3293}
3294
3295uint64_t ASTReader::getGlobalBitOffset(ModuleFile &M, uint64_t LocalOffset) {
3297}
3298
3300ASTDeclReader::getOrFakePrimaryClassDefinition(ASTReader &Reader,
3302
3303 auto *DD = RD->DefinitionData;
3304 if (!DD)
3306
3307
3308
3309
3310
3311 if (!DD) {
3312 DD = new (Reader.getContext()) struct CXXRecordDecl::DefinitionData(RD);
3314 RD->DefinitionData = DD;
3316
3317
3318 Reader.PendingFakeDefinitionData.insert(
3319 std::make_pair(DD, ASTReader::PendingFakeDefinitionKind::Fake));
3320 }
3321
3322 return DD->Definition;
3323}
3324
3325
3326
3329 if (auto *ND = dyn_cast(DC))
3330 return ND->getFirstDecl();
3331
3332 if (auto *RD = dyn_cast(DC))
3333 return getOrFakePrimaryClassDefinition(Reader, RD);
3334
3335 if (auto *RD = dyn_cast(DC))
3337
3338 if (auto *ED = dyn_cast(DC))
3340
3341 if (auto *OID = dyn_cast(DC))
3343
3344
3345
3346 if (auto *TU = dyn_cast(DC))
3348
3349 return nullptr;
3350}
3351
3352ASTDeclReader::FindExistingResult::~FindExistingResult() {
3353
3354
3355 if (TypedefNameForLinkage) {
3356 DeclContext *DC = New->getDeclContext()->getRedeclContext();
3357 Reader.ImportedTypedefNamesForLinkage.insert(
3358 std::make_pair(std::make_pair(DC, TypedefNameForLinkage), New));
3359 return;
3360 }
3361
3362 if (!AddResult || Existing)
3363 return;
3364
3365 DeclarationName Name = New->getDeclName();
3366 DeclContext *DC = New->getDeclContext()->getRedeclContext();
3368 setAnonymousDeclForMerging(Reader, New->getLexicalDeclContext(),
3369 AnonymousDeclNumber, New);
3371 !Reader.getContext().getLangOpts().CPlusPlus) {
3372 if (Reader.getIdResolver().tryAddTopLevelDecl(New, Name))
3374 .push_back(New);
3375 } else if (DeclContext *MergeDC = getPrimaryContextForMerging(Reader, DC)) {
3376
3377
3378 MergeDC->makeDeclVisibleInContextImpl(New, true);
3379 }
3380}
3381
3382
3383
3384
3386 bool IsTypedefNameForLinkage) {
3387 if (!IsTypedefNameForLinkage)
3389
3390
3391
3392
3393 if (Found->isFromASTFile())
3394 return nullptr;
3395
3396 if (auto *TND = dyn_cast(Found))
3397 return TND->getAnonDeclWithTypedefName(true);
3398
3399 return nullptr;
3400}
3401
3402
3403
3404
3405DeclContext *
3406ASTDeclReader::getPrimaryDCForAnonymousDecl(DeclContext *LexicalDC) {
3407
3408 if (auto *RD = dyn_cast(LexicalDC)) {
3410 return DD ? DD->Definition : nullptr;
3411 } else if (auto *OID = dyn_cast(LexicalDC)) {
3412 return OID->getCanonicalDecl()->getDefinition();
3413 }
3414
3415
3416
3417
3419 if (auto *FD = dyn_cast(D))
3420 if (FD->isThisDeclarationADefinition())
3421 return FD;
3422 if (auto *MD = dyn_cast(D))
3423 if (MD->isThisDeclarationADefinition())
3424 return MD;
3425 if (auto *RD = dyn_cast(D))
3427 return RD;
3428 }
3429
3430
3431 return nullptr;
3432}
3433
3434NamedDecl *ASTDeclReader::getAnonymousDeclForMerging(ASTReader &Reader,
3435 DeclContext *DC,
3436 unsigned Index) {
3437
3438
3439 auto *CanonDC = cast(DC)->getCanonicalDecl();
3440
3441
3442 auto &Previous = Reader.AnonymousDeclarationsForMerging[CanonDC];
3445
3446
3447
3448 auto *PrimaryDC = getPrimaryDCForAnonymousDecl(DC);
3449 auto needToNumberAnonymousDeclsWithin = [](Decl *D) {
3451 return true;
3452
3453
3454
3455
3456
3457 auto *CTSD = dyn_cast(D);
3458 return CTSD && !CTSD->noload_field_empty() &&
3459 !CTSD->hasLoadedFieldsFromExternalStorage();
3460 };
3461 if (PrimaryDC && needToNumberAnonymousDeclsWithin(cast(PrimaryDC))) {
3463 if (Previous.size() == Number)
3465 else
3467 });
3468 }
3469
3471}
3472
3473void ASTDeclReader::setAnonymousDeclForMerging(ASTReader &Reader,
3474 DeclContext *DC, unsigned Index,
3475 NamedDecl *D) {
3476 auto *CanonDC = cast(DC)->getCanonicalDecl();
3477
3478 auto &Previous = Reader.AnonymousDeclarationsForMerging[CanonDC];
3479 if (Index >= Previous.size())
3483}
3484
3485ASTDeclReader::FindExistingResult ASTDeclReader::findExisting(NamedDecl *D) {
3486 DeclarationName Name = TypedefNameForLinkage ? TypedefNameForLinkage
3488
3490
3491
3492 FindExistingResult Result(Reader, D, nullptr,
3493 AnonymousDeclNumber, TypedefNameForLinkage);
3496 }
3497
3498 ASTContext &C = Reader.getContext();
3500 if (TypedefNameForLinkage) {
3501 auto It = Reader.ImportedTypedefNamesForLinkage.find(
3502 std::make_pair(DC, TypedefNameForLinkage));
3503 if (It != Reader.ImportedTypedefNamesForLinkage.end())
3504 if (C.isSameEntity(It->second, D))
3505 return FindExistingResult(Reader, D, It->second, AnonymousDeclNumber,
3506 TypedefNameForLinkage);
3507
3508
3509 }
3510
3512
3513
3514 if (auto *Existing = getAnonymousDeclForMerging(
3516 if (C.isSameEntity(Existing, D))
3517 return FindExistingResult(Reader, D, Existing, AnonymousDeclNumber,
3518 TypedefNameForLinkage);
3520 !Reader.getContext().getLangOpts().CPlusPlus) {
3521 IdentifierResolver &IdResolver = Reader.getIdResolver();
3522
3523
3524
3525 class UpToDateIdentifierRAII {
3526 IdentifierInfo *II;
3527 bool WasOutToDate = false;
3528
3529 public:
3530 explicit UpToDateIdentifierRAII(IdentifierInfo *II) : II(II) {
3531 if (II) {
3533 if (WasOutToDate)
3535 }
3536 }
3537
3538 ~UpToDateIdentifierRAII() {
3539 if (WasOutToDate)
3541 }
3543
3544 for (IdentifierResolver::iterator I = IdResolver.begin(Name),
3545 IEnd = IdResolver.end();
3546 I != IEnd; ++I) {
3547 if (NamedDecl *Existing = getDeclForMerging(*I, TypedefNameForLinkage))
3548 if (C.isSameEntity(Existing, D))
3549 return FindExistingResult(Reader, D, Existing, AnonymousDeclNumber,
3550 TypedefNameForLinkage);
3551 }
3552 } else if (DeclContext *MergeDC = getPrimaryContextForMerging(Reader, DC)) {
3555 if (NamedDecl *Existing = getDeclForMerging(*I, TypedefNameForLinkage))
3556 if (C.isSameEntity(Existing, D))
3557 return FindExistingResult(Reader, D, Existing, AnonymousDeclNumber,
3558 TypedefNameForLinkage);
3559 }
3560 } else {
3561
3562 return FindExistingResult(Reader);
3563 }
3564
3565
3566
3567
3568
3569
3570
3571
3572
3574 if (MergedDCIt != Reader.MergedDeclContexts.end() &&
3577 Reader.PendingOdrMergeChecks.push_back(D);
3578
3579 return FindExistingResult(Reader, D, nullptr,
3580 AnonymousDeclNumber, TypedefNameForLinkage);
3581}
3582
3583template
3587
3589 llvm_unreachable("getMostRecentDecl on non-redeclarable declaration");
3590}
3591
3593 assert(D);
3594
3596#define ABSTRACT_DECL(TYPE)
3597#define DECL(TYPE, BASE) \
3598 case Decl::TYPE: \
3599 return getMostRecentDeclImpl(cast<TYPE##Decl>(D));
3600#include "clang/AST/DeclNodes.inc"
3601 }
3602 llvm_unreachable("unknown decl kind");
3603}
3604
3605Decl *ASTReader::getMostRecentExistingDecl(Decl *D) {
3607}
3608
3609namespace {
3613 const auto *IA = Previous->getAttr();
3614
3615 if (IA && !D->hasAttr()) {
3619 }
3620
3621 const auto *AA = Previous->getAttr();
3622 if (AA && !D->hasAttr()) {
3623 NewAttr = AA->clone(Context);
3626 }
3627}
3628}
3629
3630template
3637
3638namespace clang {
3639
3640template<>
3644 auto *VD = static_cast<VarDecl *>(D);
3647 D->First = PrevVD->First;
3648
3649
3650
3651
3655 Reader.mergeDefinitionVisibility(CurD, VD);
3656 VD->demoteThisDefinitionToDeclaration();
3657 break;
3658 }
3659 }
3660 }
3661}
3662
3664 auto *DT = T->getContainedDeducedType();
3665 return DT && !DT->isDeduced();
3666}
3667
3668template<>
3674
3675 FD->RedeclLink.setPrevious(PrevFD);
3676 FD->First = PrevFD->First;
3677
3678
3679
3680 if (PrevFD->isInlined() != FD->isInlined()) {
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696 FD->setImplicitlyInline(true);
3697 }
3698
3701 if (FPT && PrevFPT) {
3702
3703
3705 bool WasUnresolved =
3707 if (IsUnresolved != WasUnresolved)
3708 Reader.PendingExceptionSpecUpdates.insert(
3709 {Canon, IsUnresolved ? PrevFD : FD});
3710
3711
3712
3715 if (IsUndeduced != WasUndeduced)
3716 Reader.PendingDeducedTypeUpdates.insert(
3718 (IsUndeduced ? PrevFPT : FPT)->getReturnType()});
3719 }
3720}
3721
3722}
3723
3725 llvm_unreachable("attachPreviousDecl on non-redeclarable declaration");
3726}
3727
3728
3729
3730template
3732 Decl *ToD) {
3734 if (!From->hasDefaultArgument())
3735 return false;
3736 To->setInheritedDefaultArgument(Context, From);
3737 return true;
3738}
3739
3745 assert(FromTP->size() == ToTP->size() && "merged mismatched templates?");
3746
3747 for (unsigned I = 0, N = FromTP->size(); I != N; ++I) {
3748 NamedDecl *FromParam = FromTP->getParam(I);
3749 NamedDecl *ToParam = ToTP->getParam(I);
3750
3751 if (auto *FTTP = dyn_cast(FromParam))
3753 else if (auto *FNTTP = dyn_cast(FromParam))
3755 else
3758 }
3759}
3760
3761
3762
3763
3767
3768
3770 return;
3771
3772
3773
3774
3776 return;
3777
3778
3779
3780
3781
3782
3784 return;
3786 return;
3787 if (auto *Func = dyn_cast(Previous);
3788 Func && Func->getTemplateSpecializationInfo())
3789 return;
3790
3791
3792
3794 return;
3795
3796
3797 if (->getLexicalDeclContext()
3798 ->getNonTransparentContext()
3799 ->isFileContext() ||
3801 return;
3802
3804 if (!M)
3805 return;
3806
3807
3809
3811 return;
3812
3815 return;
3816
3817 Reader.PendingWarningForDuplicatedDefsInModuleUnits.push_back(
3819 return;
3820 }
3821
3822
3823 if (Reader.getContext().isInSameModule(M, D->getOwningModule()))
3824 return;
3825
3826 Reader.Diag(Previous->getLocation(),
3827 diag::err_multiple_decl_in_different_modules)
3829 Reader.Diag(D->getLocation(), diag::note_also_found);
3830}
3831
3835
3837#define ABSTRACT_DECL(TYPE)
3838#define DECL(TYPE, BASE) \
3839 case Decl::TYPE: \
3840 attachPreviousDeclImpl(Reader, cast<TYPE##Decl>(D), Previous, Canon); \
3841 break;
3842#include "clang/AST/DeclNodes.inc"
3843 }
3844
3846
3847
3848
3849
3850
3851
3853 Previous->IdentifierNamespace &
3855
3856
3857
3858 if (auto *TD = dyn_cast(D))
3861
3862
3863
3864
3865
3866 mergeInheritableAttributes(Reader, D, Previous);
3867}
3868
3869template
3873
3875 llvm_unreachable("attachLatestDecl on non-redeclarable declaration");
3876}
3877
3879 assert(D && Latest);
3880
3882#define ABSTRACT_DECL(TYPE)
3883#define DECL(TYPE, BASE) \
3884 case Decl::TYPE: \
3885 attachLatestDeclImpl(cast<TYPE##Decl>(D), Latest); \
3886 break;
3887#include "clang/AST/DeclNodes.inc"
3888 }
3889}
3890
3891template
3895
3897 llvm_unreachable("markIncompleteDeclChain on non-redeclarable declaration");
3898}
3899
3900void ASTReader::markIncompleteDeclChain(Decl *D) {
3902#define ABSTRACT_DECL(TYPE)
3903#define DECL(TYPE, BASE) \
3904 case Decl::TYPE: \
3905 ASTDeclReader::markIncompleteDeclChainImpl(cast<TYPE##Decl>(D)); \
3906 break;
3907#include "clang/AST/DeclNodes.inc"
3908 }
3909}
3910
3911
3913 SourceLocation DeclLoc;
3914 RecordLocation Loc = DeclCursorForID(ID, DeclLoc);
3915 llvm::BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
3916
3917
3918 SavedStreamPosition SavedPosition(DeclsCursor);
3919
3920 ReadingKindTracker ReadingKind(Read_Decl, *this);
3921
3922
3924
3925 auto Fail = [](const char *what, llvm::Error &&Err) {
3926 llvm::report_fatal_error(Twine("ASTReader::readDeclRecord failed ") + what +
3927 ": " + toString(std::move(Err)));
3928 };
3929
3930 if (llvm::Error JumpFailed = DeclsCursor.JumpToBit(Loc.Offset))
3931 Fail("jumping", std::move(JumpFailed));
3934 Expected MaybeCode = DeclsCursor.ReadCode();
3935 if (!MaybeCode)
3936 Fail("reading code", MaybeCode.takeError());
3937 unsigned Code = MaybeCode.get();
3938
3940 Decl *D = nullptr;
3941 Expected MaybeDeclCode = Record.readRecord(DeclsCursor, Code);
3942 if (!MaybeDeclCode)
3943 llvm::report_fatal_error(
3944 Twine("ASTReader::readDeclRecord failed reading decl code: ") +
3945 toString(MaybeDeclCode.takeError()));
3946
3947 switch ((DeclCode)MaybeDeclCode.get()) {
3954 llvm_unreachable("Record cannot be de-serialized with readDeclRecord");
3957 break;
3960 break;
3963 break;
3966 break;
3969 break;
3972 break;
3975 break;
3978 break;
3981 break;
3984 break;
3987 break;
3990 break;
3993 break;
3996 break;
3999 break;
4002 break;
4005 break;
4008 break;
4011 break;
4014 break;
4017 break;
4020 break;
4023 break;
4026 break;
4029 break;
4032 break;
4035 break;
4038 break;
4041 break;
4044 break;
4047 break;
4050 break;
4053 break;
4056 break;
4059 break;
4062 break;
4064 bool HasTypeConstraint = Record.readInt();
4066 HasTypeConstraint);
4067 break;
4068 }
4070 bool HasTypeConstraint = Record.readInt();
4072 HasTypeConstraint);
4073 break;
4074 }
4076 bool HasTypeConstraint = Record.readInt();
4078 Context, ID, Record.readInt(), HasTypeConstraint);
4079 break;
4080 }
4083 break;
4087 break;
4090 break;
4093 break;
4096 break;
4099 break;
4102 break;
4105 break;
4108 break;
4111 break;
4114 break;
4117 break;
4120 break;
4123 break;
4126 break;
4129 break;
4132 break;
4135 break;
4138 break;
4141 break;
4144 break;
4147 break;
4150 break;
4153 break;
4156 break;
4159 break;
4162 break;
4165 break;
4167 D = MSGuidDecl::CreateDeserialized(Context, ID);
4168 break;
4170 D = UnnamedGlobalConstantDecl::CreateDeserialized(Context, ID);
4171 break;
4173 D = TemplateParamObjectDecl::CreateDeserialized(Context, ID);
4174 break;
4177 break;
4180 break;
4182 Error("attempt to read a C++ base-specifier record as a declaration");
4183 return nullptr;
4185 Error("attempt to read a C++ ctor initializer record as a declaration");
4186 return nullptr;
4188
4189
4191 break;
4194 unsigned NumChildren = Record.readInt();
4197 break;
4198 }
4200 unsigned NumClauses = Record.readInt();
4201 unsigned NumVars = Record.readInt();
4204 break;
4205 }
4207 unsigned NumClauses = Record.readInt();
4210 break;
4211 }
4214 break;
4216 unsigned NumClauses = Record.readInt();
4219 break;
4220 }
4223 break;
4226 break;
4230 break;
4233 break;
4236 break;
4239 break;
4242 break;
4246 break;
4249 break;
4252 break;
4253 }
4254
4255 assert(D && "Unknown declaration reading AST file");
4256 LoadedDecl(translateGlobalDeclIDToIndex(ID), D);
4257
4258
4259
4261
4262
4264
4265
4266
4267 if (auto *DC = dyn_cast(D)) {
4268 LookupBlockOffsets Offsets;
4269
4270 Reader.VisitDeclContext(DC, Offsets);
4271
4272
4273
4274
4276 if (auto Iter = DelayedNamespaceOffsetMap.find(ID);
4277 Iter != DelayedNamespaceOffsetMap.end())
4278 Offsets = Iter->second;
4279
4281 ReadVisibleDeclContextStorage(
4283 VisibleDeclContextStorageKind::GenerallyVisible))
4284 return nullptr;
4286 ReadVisibleDeclContextStorage(
4288 VisibleDeclContextStorageKind::ModuleLocalVisible))
4289 return nullptr;
4291 ReadVisibleDeclContextStorage(
4293 VisibleDeclContextStorageKind::TULocalVisible))
4294 return nullptr;
4295
4297 ReadLexicalDeclContextStorage(*Loc.F, DeclsCursor,
4299 return nullptr;
4300 }
4302
4303
4304 PendingUpdateRecords.push_back(
4305 PendingUpdateRecord(ID, D, true));
4306
4307
4308 if (auto *Class = dyn_cast(D))
4309
4310
4311 if (Class->isThisDeclarationADefinition() ||
4312 PendingDefinitions.count(Class))
4313 loadObjCCategories(ID, Class);
4314
4315
4316
4317
4318
4319 PotentiallyInterestingDecls.push_back(D);
4320
4321 return D;
4322}
4323
4324void ASTReader::PassInterestingDeclsToConsumer() {
4325 assert(Consumer);
4326
4327 if (!CanPassDeclsToConsumer)
4328 return;
4329
4330
4331
4332 SaveAndRestore GuardPassingDeclsToConsumer(CanPassDeclsToConsumer,
4333 false);
4334
4335
4336
4337 for (auto ID : EagerlyDeserializedDecls)
4339 EagerlyDeserializedDecls.clear();
4340
4341 auto ConsumingPotentialInterestingDecls = [this]() {
4342 while (!PotentiallyInterestingDecls.empty()) {
4343 Decl *D = PotentiallyInterestingDecls.front();
4344 PotentiallyInterestingDecls.pop_front();
4345 if (isConsumerInterestedIn(D))
4346 PassInterestingDeclToConsumer(D);
4347 }
4348 };
4349 std::deque<Decl *> MaybeInterestingDecls =
4350 std::move(PotentiallyInterestingDecls);
4351 PotentiallyInterestingDecls.clear();
4352 assert(PotentiallyInterestingDecls.empty());
4353 while (!MaybeInterestingDecls.empty()) {
4354 Decl *D = MaybeInterestingDecls.front();
4355 MaybeInterestingDecls.pop_front();
4356
4357
4358
4359
4360
4361 if (auto *VD = dyn_cast(D);
4362 VD && VD->isFileVarDecl() && !VD->isExternallyVisible())
4363 VD->getInit();
4364 ConsumingPotentialInterestingDecls();
4365 if (isConsumerInterestedIn(D))
4366 PassInterestingDeclToConsumer(D);
4367 }
4368
4369
4370 ConsumingPotentialInterestingDecls();
4371
4372 for (GlobalDeclID ID : VTablesToEmit) {
4375 PassVTableToConsumer(RD);
4376 }
4377 VTablesToEmit.clear();
4378}
4379
4380void ASTReader::loadDeclUpdateRecords(PendingUpdateRecord &Record) {
4381
4382
4383
4384 GlobalDeclID ID = Record.ID;
4386 ProcessingUpdatesRAIIObj ProcessingUpdates(*this);
4387 DeclUpdateOffsetsMap::iterator UpdI = DeclUpdateOffsets.find(ID);
4388
4389 if (UpdI != DeclUpdateOffsets.end()) {
4390 auto UpdateOffsets = std::move(UpdI->second);
4391 DeclUpdateOffsets.erase(UpdI);
4392
4393
4394
4395
4396
4397 bool WasInteresting = Record.JustLoaded || isConsumerInterestedIn(D);
4398 for (auto &FileAndOffset : UpdateOffsets) {
4399 ModuleFile *F = FileAndOffset.first;
4400 uint64_t Offset = FileAndOffset.second;
4402 SavedStreamPosition SavedPosition(Cursor);
4403 if (llvm::Error JumpFailed = Cursor.JumpToBit(Offset))
4404
4405 llvm::report_fatal_error(
4406 Twine("ASTReader::loadDeclUpdateRecords failed jumping: ") +
4407 toString(std::move(JumpFailed)));
4408 Expected MaybeCode = Cursor.ReadCode();
4409 if (!MaybeCode)
4410 llvm::report_fatal_error(
4411 Twine("ASTReader::loadDeclUpdateRecords failed reading code: ") +
4412 toString(MaybeCode.takeError()));
4413 unsigned Code = MaybeCode.get();
4415 if (Expected MaybeRecCode = Record.readRecord(Cursor, Code))
4416 assert(MaybeRecCode.get() == DECL_UPDATES &&
4417 "Expected DECL_UPDATES record!");
4418 else
4419 llvm::report_fatal_error(
4420 Twine("ASTReader::loadDeclUpdateRecords failed reading rec code: ") +
4421 toString(MaybeCode.takeError()));
4422
4424 SourceLocation());
4425 Reader.UpdateDecl(D);
4426
4427
4428
4429 if (!WasInteresting && isConsumerInterestedIn(D)) {
4430 PotentiallyInterestingDecls.push_back(D);
4431 WasInteresting = true;
4432 }
4433 }
4434 }
4435
4436
4437 if (auto I = PendingVisibleUpdates.find(ID);
4438 I != PendingVisibleUpdates.end()) {
4439 auto VisibleUpdates = std::move(I->second);
4440 PendingVisibleUpdates.erase(I);
4441
4443 for (const auto &Update : VisibleUpdates)
4444 Lookups[DC].Table.add(
4446 reader::ASTDeclContextNameLookupTrait(*this, *Update.Mod));
4448 }
4449
4450 if (auto I = PendingModuleLocalVisibleUpdates.find(ID);
4451 I != PendingModuleLocalVisibleUpdates.end()) {
4452 auto ModuleLocalVisibleUpdates = std::move(I->second);
4453 PendingModuleLocalVisibleUpdates.erase(I);
4454
4456 for (const auto &Update : ModuleLocalVisibleUpdates)
4457 ModuleLocalLookups[DC].Table.add(
4459 reader::ModuleLocalNameLookupTrait(*this, *Update.Mod));
4460
4461
4463 }
4464
4465 if (auto I = TULocalUpdates.find(ID); I != TULocalUpdates.end()) {
4466 auto Updates = std::move(I->second);
4467 TULocalUpdates.erase(I);
4468
4470 for (const auto &Update : Updates)
4471 TULocalLookups[DC].Table.add(
4473 reader::ASTDeclContextNameLookupTrait(*this, *Update.Mod));
4475 }
4476
4477
4479 if (auto IT = RelatedDeclsMap.find(ID); IT != RelatedDeclsMap.end()) {
4480 for (auto LID : IT->second)
4482 RelatedDeclsMap.erase(IT);
4483 }
4484 }
4485
4486
4487 if (auto I = PendingSpecializationsUpdates.find(ID);
4488 I != PendingSpecializationsUpdates.end()) {
4489 auto SpecializationUpdates = std::move(I->second);
4490 PendingSpecializationsUpdates.erase(I);
4491
4492 for (const auto &Update : SpecializationUpdates)
4493 AddSpecializations(D, Update.Data, *Update.Mod, false);
4494 }
4495
4496
4497 if (auto I = PendingPartialSpecializationsUpdates.find(ID);
4498 I != PendingPartialSpecializationsUpdates.end()) {
4499 auto SpecializationUpdates = std::move(I->second);
4500 PendingPartialSpecializationsUpdates.erase(I);
4501
4502 for (const auto &Update : SpecializationUpdates)
4503 AddSpecializations(D, Update.Data, *Update.Mod, true);
4504 }
4505}
4506
4507void ASTReader::loadPendingDeclChain(Decl *FirstLocal, uint64_t LocalOffset) {
4508
4510 if (FirstLocal != CanonDecl) {
4513 *this, FirstLocal, PrevMostRecent ? PrevMostRecent : CanonDecl,
4514 CanonDecl);
4515 }
4516
4517 if (!LocalOffset) {
4519 return;
4520 }
4521
4522
4524 assert(M && "imported decl from no module file");
4525
4527 SavedStreamPosition SavedPosition(Cursor);
4528 if (llvm::Error JumpFailed = Cursor.JumpToBit(LocalOffset))
4529 llvm::report_fatal_error(
4530 Twine("ASTReader::loadPendingDeclChain failed jumping: ") +
4531 toString(std::move(JumpFailed)));
4532
4534 Expected MaybeCode = Cursor.ReadCode();
4535 if (!MaybeCode)
4536 llvm::report_fatal_error(
4537 Twine("ASTReader::loadPendingDeclChain failed reading code: ") +
4538 toString(MaybeCode.takeError()));
4539 unsigned Code = MaybeCode.get();
4540 if (Expected MaybeRecCode = Cursor.readRecord(Code, Record))
4542 "expected LOCAL_REDECLARATIONS record!");
4543 else
4544 llvm::report_fatal_error(
4545 Twine("ASTReader::loadPendingDeclChain failed reading rec code: ") +
4546 toString(MaybeCode.takeError()));
4547
4548
4549
4550 Decl *MostRecent = FirstLocal;
4551 for (unsigned I = 0, N = Record.size(); I != N; ++I) {
4552 unsigned Idx = N - I - 1;
4555 MostRecent = D;
4556 }
4558}
4559
4560namespace {
4561
4562
4563
4564 class ObjCCategoriesVisitor {
4565 ASTReader &Reader;
4567 llvm::SmallPtrSetImpl<ObjCCategoryDecl *> &Deserialized;
4568 ObjCCategoryDecl *Tail = nullptr;
4569 llvm::DenseMap<DeclarationName, ObjCCategoryDecl *> NameCategoryMap;
4570 GlobalDeclID InterfaceID;
4571 unsigned PreviousGeneration;
4572
4573 void add(ObjCCategoryDecl *Cat) {
4574
4575 if (!Deserialized.erase(Cat))
4576 return;
4577
4578
4580 ObjCCategoryDecl *&Existing = NameCategoryMap[Cat->getDeclName()];
4584 StructuralEquivalenceContext Ctx(
4587 StructuralEquivalenceKind::Default,
4588 false,
4589 false,
4590 true);
4591 if (!Ctx.IsEquivalent(Cat, Existing)) {
4592
4593 Reader.Diag(Cat->getLocation(), diag::warn_dup_category_def)
4596 diag::note_previous_definition);
4597 }
4598 } else if (!Existing) {
4599
4600 Existing = Cat;
4601 }
4602 }
4603
4604
4605 if (Tail)
4607 else
4608 Interface->setCategoryListRaw(Cat);
4609 Tail = Cat;
4610 }
4611
4612 public:
4613 ObjCCategoriesVisitor(
4614 ASTReader &Reader, ObjCInterfaceDecl *Interface,
4615 llvm::SmallPtrSetImpl<ObjCCategoryDecl *> &Deserialized,
4616 GlobalDeclID InterfaceID, unsigned PreviousGeneration)
4618 InterfaceID(InterfaceID), PreviousGeneration(PreviousGeneration) {
4619
4620 for (auto *Cat : Interface->known_categories()) {
4621 if (Cat->getDeclName())
4622 NameCategoryMap[Cat->getDeclName()] = Cat;
4623
4624
4625 Tail = Cat;
4626 }
4627 }
4628
4629 bool operator()(ModuleFile &M) {
4630
4631
4632 if (M.Generation <= PreviousGeneration)
4633 return true;
4634
4635
4636
4637
4638 LocalDeclID LocalID =
4641 return true;
4642
4643
4644
4645 const ObjCCategoriesInfo Compare = {LocalID, 0};
4646 const ObjCCategoriesInfo *Result = std::lower_bound(
4650 LocalID != Result->getDefinitionID()) {
4651
4652
4653
4655 }
4656
4657
4658 unsigned Offset = Result->Offset;
4660 M.ObjCCategories[Offset++] = 0;
4661 for (unsigned I = 0; I != N; ++I)
4663 return true;
4664 }
4665 };
4666
4667}
4668
4670 unsigned PreviousGeneration) {
4671 ObjCCategoriesVisitor Visitor(*this, D, CategoriesDeserialized, ID,
4672 PreviousGeneration);
4673 ModuleMgr.visit(Visitor);
4674}
4675
4676template<typename DeclT, typename Fn>
4678 F(D);
4679
4680
4681
4682
4684 bool Found = false;
4685 for (auto *Redecl = MostRecent; Redecl && ;
4686 Redecl = Redecl->getPreviousDecl())
4687 Found = (Redecl == D);
4688
4689
4691 for (auto *Redecl = MostRecent; Redecl != D;
4693 F(Redecl);
4694 }
4695}
4696
4698 while (Record.getIdx() < Record.size()) {
4702 Decl *MD = Record.readDecl();
4703 assert(MD && "couldn't read decl from update record");
4704 Reader.PendingAddedClassMembers.push_back({RD, MD});
4705 break;
4706 }
4707
4709 auto *Anon = readDeclAs();
4710
4711
4712
4713
4714 if (!Record.isModule()) {
4715 if (auto *TU = dyn_cast(D))
4716 TU->setAnonymousNamespace(Anon);
4717 else
4719 }
4720 break;
4721 }
4722
4725 VD->NonParmVarDeclBits.IsInline = Record.readInt();
4726 VD->NonParmVarDeclBits.IsInlineSpecified = Record.readInt();
4728 break;
4729 }
4730
4733 if (auto *VTSD = dyn_cast(D)) {
4734 VTSD->setPointOfInstantiation(POI);
4735 } else if (auto *VD = dyn_cast(D)) {
4737 assert(MSInfo && "No member specialization information");
4739 } else {
4741 if (auto *FTSInfo = dyn_cast<FunctionTemplateSpecializationInfo *>(
4742 FD->TemplateOrSpecialization))
4743 FTSInfo->setPointOfInstantiation(POI);
4744 else
4746 ->setPointOfInstantiation(POI);
4747 }
4748 break;
4749 }
4750
4753
4754
4755
4756
4757 auto *DefaultArg = Record.readExpr();
4758
4759
4760
4761 if (Param->hasUninstantiatedDefaultArg())
4762 Param->setDefaultArg(DefaultArg);
4763 break;
4764 }
4765
4768 auto *DefaultInit = Record.readExpr();
4769
4770
4771
4772 if (FD->hasInClassInitializer() && !FD->hasNonNullInClassInitializer()) {
4773 if (DefaultInit)
4774 FD->setInClassInitializer(DefaultInit);
4775 else
4776
4777
4778 FD->removeInClassInitializer();
4779 }
4780 break;
4781 }
4782
4785 if (Reader.PendingBodies[FD]) {
4786
4787
4788 return;
4789 }
4790
4791 if (Record.readInt()) {
4792
4793
4794
4797 });
4798 }
4799 FD->setInnerLocStart(readSourceLocation());
4801 assert(Record.getIdx() == Record.size() && "lazy body must be last");
4802 break;
4803 }
4804
4808 bool HadRealDefinition =
4809 OldDD && (OldDD->Definition != RD ||
4810 !Reader.PendingFakeDefinitionData.count(OldDD));
4814 ReadCXXRecordDefinition(RD, true);
4815
4816
4817 uint64_t LexicalOffset = ReadLocalOffset();
4818 if (!HadRealDefinition && LexicalOffset) {
4819 Record.readLexicalDeclContextStorage(LexicalOffset, RD);
4820 Reader.PendingFakeDefinitionData.erase(OldDD);
4821 }
4822
4827 MSInfo->setTemplateSpecializationKind(TSK);
4828 MSInfo->setPointOfInstantiation(POI);
4829 } else {
4831 Spec->setTemplateSpecializationKind(TSK);
4832 Spec->setPointOfInstantiation(POI);
4833
4834 if (Record.readInt()) {
4835 auto *PartialSpec =
4836 readDeclAs();
4838 Record.readTemplateArgumentList(TemplArgs);
4840 Reader.getContext(), TemplArgs);
4841
4842
4843
4845 Spec->getSpecializedTemplateOrPartial()))
4846 Spec->setInstantiationOf(PartialSpec, TemplArgList);
4847 }
4848 }
4849
4854
4855 if (Record.readInt()) {
4857 Record.readAttributes(Attrs);
4858
4859
4861 D->setAttrsImpl(Attrs, Reader.getContext());
4862 }
4863 break;
4864 }
4865
4867
4868
4871 auto *Del = readDeclAs();
4872 auto *ThisArg = Record.readExpr();
4874
4875 if (.dtorHasOperatorDelete(Dtor,
4877 C.addOperatorDeleteForVDtor(Dtor, Del,
4879 Canon->OperatorDeleteThisArg = ThisArg;
4880 }
4881 break;
4882 }
4883
4885 auto *Del = readDeclAs();
4888 if (.dtorHasOperatorDelete(
4890 C.addOperatorDeleteForVDtor(
4892 break;
4893 }
4895 auto *Del = readDeclAs();
4899 C.addOperatorDeleteForVDtor(Dtor, Del,
4901 break;
4902 }
4904 auto *Del = readDeclAs();
4907 if (.dtorHasOperatorDelete(Dtor,
4909 C.addOperatorDeleteForVDtor(
4911 break;
4912 }
4913
4916 auto ESI = Record.readExceptionSpecInfo(ExceptionStorage);
4917
4918
4921
4922
4924 FD->setType(Reader.getContext().getFunctionType(
4925 FPT->getReturnType(), FPT->getParamTypes(),
4926 FPT->getExtProtoInfo().withExceptionSpec(ESI)));
4927
4928
4929
4930 Reader.PendingExceptionSpecUpdates.insert(
4931 std::make_pair(FD->getCanonicalDecl(), FD));
4932 }
4933 break;
4934 }
4935
4938 QualType DeducedResultType = Record.readType();
4939 Reader.PendingDeducedTypeUpdates.insert(
4940 {FD->getCanonicalDecl(), DeducedResultType});
4941 break;
4942 }
4943
4945
4946 D->markUsed(Reader.getContext());
4947 break;
4948
4950 Reader.getContext().setManglingNumber(cast(D),
4951 Record.readInt());
4952 break;
4953
4955 Reader.getContext().setStaticLocalNumber(cast(D),
4956 Record.readInt());
4957 break;
4958
4960 D->addAttr(OMPThreadPrivateDeclAttr::CreateImplicit(Reader.getContext(),
4961 readSourceRange()));
4962 break;
4963
4965 auto AllocatorKind =
4966 static_castOMPAllocateDeclAttr::AllocatorTypeTy\(Record.readInt());
4967 Expr *Allocator = Record.readExpr();
4968 Expr *Alignment = Record.readExpr();
4970 D->addAttr(OMPAllocateDeclAttr::CreateImplicit(
4971 Reader.getContext(), AllocatorKind, Allocator, Alignment, SR));
4972 break;
4973 }
4974
4976 unsigned SubmoduleID = readSubmoduleID();
4979 Reader.getContext().mergeDefinitionIntoModule(Exported, Owner);
4980 Reader.PendingMergedDefinitionsToDeduplicate.insert(Exported);
4981 break;
4982 }
4983
4985 auto MapType = Record.readEnumOMPDeclareTargetDeclAttr::MapTypeTy();
4986 auto DevType = Record.readEnumOMPDeclareTargetDeclAttr::DevTypeTy();
4987 Expr *IndirectE = Record.readExpr();
4988 bool Indirect = Record.readBool();
4989 unsigned Level = Record.readInt();
4990 D->addAttr(OMPDeclareTargetDeclAttr::CreateImplicit(
4991 Reader.getContext(), MapType, DevType, IndirectE, Indirect, Level,
4992 readSourceRange()));
4993 break;
4994 }
4995
4998 Record.readAttributes(Attrs);
4999 assert(Attrs.size() == 1);
5001 break;
5002 }
5003 }
5004}
This file provides AST data structures related to concepts.
Defines the clang::ASTContext interface.
static T assert_cast(T t)
"Cast" to type T, asserting if we don't have an implicit conversion.
Definition ASTReaderDecl.cpp:2935
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...
Definition ASTReaderDecl.cpp:3018
static NamedDecl * getDeclForMerging(NamedDecl *Found, bool IsTypedefNameForLinkage)
Find the declaration that should be merged into, given the declaration found by name lookup.
Definition ASTReaderDecl.cpp:3385
static bool inheritDefaultTemplateArgument(ASTContext &Context, ParmDecl *From, Decl *ToD)
Inherit the default template argument from From to To.
Definition ASTReaderDecl.cpp:3731
static void inheritDefaultTemplateArguments(ASTContext &Context, TemplateDecl *From, TemplateDecl *To)
Definition ASTReaderDecl.cpp:3740
static void forAllLaterRedecls(DeclT *D, Fn F)
Definition ASTReaderDecl.cpp:4677
static llvm::iterator_range< MergedRedeclIterator< DeclT > > merged_redecls(DeclT *D)
Definition ASTReaderDecl.cpp:499
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.
FormatToken * Previous
The previous token in the unwrapped line.
FormatToken * Next
The next token in the unwrapped line.
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines the LambdaCapture class.
Defines several types used to describe C++ lambda expressions that are shared between the parser and ...
Defines the clang::LangOptions interface.
llvm::MachO::Record Record
Defines the clang::Module class, which describes a module in the source code.
This file defines OpenMP AST classes for clauses.
static std::string toString(const clang::SanitizerSet &Sanitizers)
Produce a string containing comma-separated names of sanitizers in Sanitizers set.
Defines the clang::SourceLocation class and associated facilities.
Defines various enumerations that describe declaration and type specifiers.
C Language Family Type Representation.
__DEVICE__ void * memcpy(void *__a, const void *__b, size_t __c)
bool needsCleanup() const
Returns whether the object performed allocations.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
TranslationUnitDecl * getTranslationUnitDecl() const
const LangOptions & getLangOpts() const
void addDestruction(T *Ptr) const
If T isn't trivially destructible, calls AddDeallocation to register it for destruction.
ExternalASTSource * getExternalSource() const
Retrieve a pointer to the external AST source associated with this AST context, if any.
Definition ASTReaderDecl.cpp:103
void mergeTemplatePattern(RedeclarableTemplateDecl *D, RedeclarableTemplateDecl *Existing, bool IsKeyDecl)
Merge together the pattern declarations from two template declarations.
Definition ASTReaderDecl.cpp:2942
ASTDeclMerger(ASTReader &Reader)
Definition ASTReaderDecl.cpp:107
void mergeRedeclarable(Redeclarable< T > *D, T *Existing, RedeclarableResult &Redecl)
Definition ASTReaderDecl.cpp:121
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...
Definition ASTReaderDecl.cpp:2899
void MergeDefinitionData(CXXRecordDecl *D, struct CXXRecordDecl::DefinitionData &&NewDD)
Definition ASTReaderDecl.cpp:2080
void mergeRedeclarableImpl(Redeclarable< T > *D, T *Existing, GlobalDeclID KeyDeclID)
Attempts to merge the given declaration (D) with another declaration of the same entity.
Definition ASTReaderDecl.cpp:2985
void VisitTemplateParamObjectDecl(TemplateParamObjectDecl *D)
Definition ASTReaderDecl.cpp:1587
void VisitObjCImplementationDecl(ObjCImplementationDecl *D)
Definition ASTReaderDecl.cpp:1512
void mergeRedeclarableTemplate(RedeclarableTemplateDecl *D, RedeclarableResult &Redecl)
Definition ASTReaderDecl.cpp:2923
void VisitImportDecl(ImportDecl *D)
Definition ASTReaderDecl.cpp:2377
void VisitBindingDecl(BindingDecl *BD)
Definition ASTReaderDecl.cpp:1764
void VisitNamespaceDecl(NamespaceDecl *D)
Definition ASTReaderDecl.cpp:1852
void VisitTopLevelStmtDecl(TopLevelStmtDecl *D)
Definition ASTReaderDecl.cpp:1775
RedeclarableResult VisitRedeclarableTemplateDecl(RedeclarableTemplateDecl *D)
Definition ASTReaderDecl.cpp:2459
void VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D)
Definition ASTReaderDecl.cpp:2707
void VisitUnresolvedUsingIfExistsDecl(UnresolvedUsingIfExistsDecl *D)
Definition ASTReaderDecl.cpp:1981
void ReadFunctionDefinition(FunctionDecl *FD)
Definition ASTReaderDecl.cpp:508
void VisitLabelDecl(LabelDecl *LD)
Definition ASTReaderDecl.cpp:1847
void VisitObjCCategoryDecl(ObjCCategoryDecl *D)
Definition ASTReaderDecl.cpp:1442
void VisitUsingDirectiveDecl(UsingDirectiveDecl *D)
Definition ASTReaderDecl.cpp:1954
RedeclarableResult VisitClassTemplateSpecializationDeclImpl(ClassTemplateSpecializationDecl *D)
Definition ASTReaderDecl.cpp:2520
void VisitFunctionDecl(FunctionDecl *FD)
Definition ASTReaderDecl.cpp:917
void VisitObjCMethodDecl(ObjCMethodDecl *D)
Definition ASTReaderDecl.cpp:1167
void VisitUsingShadowDecl(UsingShadowDecl *D)
Definition ASTReaderDecl.cpp:1934
void VisitVarTemplateSpecializationDecl(VarTemplateSpecializationDecl *D)
Definition ASTReaderDecl.cpp:351
void VisitVarDecl(VarDecl *VD)
Definition ASTReaderDecl.cpp:376
RedeclarableResult VisitRedeclarable(Redeclarable< T > *D)
Definition ASTReaderDecl.cpp:2812
void VisitDeclContext(DeclContext *DC, LookupBlockOffsets &Offsets)
Definition ASTReaderDecl.cpp:2803
void VisitMSGuidDecl(MSGuidDecl *D)
Definition ASTReaderDecl.cpp:1563
void VisitPragmaCommentDecl(PragmaCommentDecl *D)
Definition ASTReaderDecl.cpp:666
void VisitRecordDecl(RecordDecl *RD)
Definition ASTReaderDecl.cpp:850
void VisitLifetimeExtendedTemporaryDecl(LifetimeExtendedTemporaryDecl *D)
Definition ASTReaderDecl.cpp:2790
void VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D)
Definition ASTReaderDecl.cpp:2773
void VisitRequiresExprBodyDecl(RequiresExprBodyDecl *D)
Definition ASTReaderDecl.cpp:2445
void ReadVarDeclInit(VarDecl *VD)
Definition ASTReaderDecl.cpp:1702
static Decl * getMostRecentDeclImpl(Redeclarable< DeclT > *D)
Definition ASTReaderDecl.cpp:3584
void VisitNamespaceAliasDecl(NamespaceAliasDecl *D)
Definition ASTReaderDecl.cpp:1892
void VisitIndirectFieldDecl(IndirectFieldDecl *FD)
Definition ASTReaderDecl.cpp:1598
void VisitObjCContainerDecl(ObjCContainerDecl *D)
Definition ASTReaderDecl.cpp:1222
void VisitBlockDecl(BlockDecl *BD)
Definition ASTReaderDecl.cpp:1780
void VisitOpenACCRoutineDecl(OpenACCRoutineDecl *D)
Definition ASTReaderDecl.cpp:3120
void UpdateDecl(Decl *D)
Definition ASTReaderDecl.cpp:4697
void VisitExportDecl(ExportDecl *D)
Definition ASTReaderDecl.cpp:1842
static void attachLatestDecl(Decl *D, Decl *latest)
Definition ASTReaderDecl.cpp:3878
void VisitStaticAssertDecl(StaticAssertDecl *D)
Definition ASTReaderDecl.cpp:2778
void VisitEmptyDecl(EmptyDecl *D)
Definition ASTReaderDecl.cpp:2786
void VisitOMPCapturedExprDecl(OMPCapturedExprDecl *D)
Definition ASTReaderDecl.cpp:3109
void VisitValueDecl(ValueDecl *VD)
Definition ASTReaderDecl.cpp:881
void VisitEnumDecl(EnumDecl *ED)
Definition ASTReaderDecl.cpp:774
void mergeRedeclarable(Redeclarable< T > *D, RedeclarableResult &Redecl)
Attempts to merge the given declaration (D) with another declaration of the same entity.
Definition ASTReaderDecl.cpp:2873
void VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D)
Definition ASTReaderDecl.cpp:1972
void VisitFriendTemplateDecl(FriendTemplateDecl *D)
Definition ASTReaderDecl.cpp:2406
void VisitObjCProtocolDecl(ObjCProtocolDecl *D)
Definition ASTReaderDecl.cpp:1409
void VisitClassTemplatePartialSpecializationDecl(ClassTemplatePartialSpecializationDecl *D)
Definition ASTReaderDecl.cpp:2594
void VisitObjCTypeParamDecl(ObjCTypeParamDecl *D)
Definition ASTReaderDecl.cpp:1213
void VisitDeclaratorDecl(DeclaratorDecl *DD)
Definition ASTReaderDecl.cpp:900
RedeclarableResult VisitTypedefNameDecl(TypedefNameDecl *TD)
Definition ASTReaderDecl.cpp:706
void VisitFriendDecl(FriendDecl *D)
Definition ASTReaderDecl.cpp:2392
void VisitLinkageSpecDecl(LinkageSpecDecl *D)
Definition ASTReaderDecl.cpp:1835
void VisitCXXRecordDecl(CXXRecordDecl *D)
Definition ASTReaderDecl.cpp:337
ASTDeclReader(ASTReader &Reader, ASTRecordReader &Record, ASTReader::RecordLocation Loc, GlobalDeclID thisDeclID, SourceLocation ThisDeclLoc)
Definition ASTReaderDecl.cpp:273
void VisitFileScopeAsmDecl(FileScopeAsmDecl *AD)
Definition ASTReaderDecl.cpp:1769
void VisitImplicitConceptSpecializationDecl(ImplicitConceptSpecializationDecl *D)
Definition ASTReaderDecl.cpp:2434
void VisitNamedDecl(NamedDecl *ND)
Definition ASTReaderDecl.cpp:692
void mergeMergeable(Mergeable< T > *D)
Attempts to merge the given declaration (D) with another declaration of the same entity,...
Definition ASTReaderDecl.cpp:3051
void VisitBuiltinTemplateDecl(BuiltinTemplateDecl *D)
Definition ASTReaderDecl.cpp:2501
static Decl * getMostRecentDecl(Decl *D)
Definition ASTReaderDecl.cpp:3592
void VisitObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *D)
Definition ASTReaderDecl.cpp:1474
void VisitCXXConstructorDecl(CXXConstructorDecl *D)
Definition ASTReaderDecl.cpp:2325
void VisitPragmaDetectMismatchDecl(PragmaDetectMismatchDecl *D)
Definition ASTReaderDecl.cpp:675
void VisitImplicitParamDecl(ImplicitParamDecl *PD)
Definition ASTReaderDecl.cpp:1723
void VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D)
Definition ASTReaderDecl.cpp:1963
void Visit(Decl *D)
Definition ASTReaderDecl.cpp:526
static void setNextObjCCategory(ObjCCategoryDecl *Cat, ObjCCategoryDecl *Next)
Definition ASTReaderDecl.cpp:311
void VisitMSPropertyDecl(MSPropertyDecl *FD)
Definition ASTReaderDecl.cpp:1557
void VisitClassTemplateSpecializationDecl(ClassTemplateSpecializationDecl *D)
Definition ASTReaderDecl.cpp:342
void VisitFieldDecl(FieldDecl *FD)
Definition ASTReaderDecl.cpp:1537
RedeclarableResult VisitVarDeclImpl(VarDecl *D)
Definition ASTReaderDecl.cpp:1611
void VisitOMPDeclareMapperDecl(OMPDeclareMapperDecl *D)
Definition ASTReaderDecl.cpp:3102
void VisitCapturedDecl(CapturedDecl *CD)
Definition ASTReaderDecl.cpp:1822
void VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D)
Definition ASTReaderDecl.cpp:2729
void VisitObjCInterfaceDecl(ObjCInterfaceDecl *D)
Definition ASTReaderDecl.cpp:1298
RedeclarableResult VisitCXXRecordDeclImpl(CXXRecordDecl *D)
Definition ASTReaderDecl.cpp:2222
void VisitAccessSpecDecl(AccessSpecDecl *D)
Definition ASTReaderDecl.cpp:2387
void VisitCXXMethodDecl(CXXMethodDecl *D)
Definition ASTReaderDecl.cpp:2307
void VisitOpenACCDeclareDecl(OpenACCDeclareDecl *D)
Definition ASTReaderDecl.cpp:3113
void VisitOMPAllocateDecl(OMPAllocateDecl *D)
Definition ASTReaderDecl.cpp:3075
void VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D)
Definition ASTReaderDecl.cpp:1525
static void attachLatestDeclImpl(Redeclarable< DeclT > *D, Decl *Latest)
Definition ASTReaderDecl.cpp:3870
static void markIncompleteDeclChainImpl(Redeclarable< DeclT > *D)
Definition ASTReaderDecl.cpp:3892
RedeclarableResult VisitTagDecl(TagDecl *TD)
Definition ASTReaderDecl.cpp:737
ObjCTypeParamList * ReadObjCTypeParamList()
Definition ASTReaderDecl.cpp:1228
void VisitHLSLBufferDecl(HLSLBufferDecl *D)
Definition ASTReaderDecl.cpp:1882
void VisitOMPThreadPrivateDecl(OMPThreadPrivateDecl *D)
Definition ASTReaderDecl.cpp:3070
void VisitDecl(Decl *D)
Definition ASTReaderDecl.cpp:568
void VisitCXXDeductionGuideDecl(CXXDeductionGuideDecl *GD)
Definition ASTReaderDecl.cpp:2295
void VisitConstructorUsingShadowDecl(ConstructorUsingShadowDecl *D)
Definition ASTReaderDecl.cpp:1946
void VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D)
Definition ASTReaderDecl.cpp:2752
static void checkMultipleDefinitionInNamedModules(ASTReader &Reader, Decl *D, Decl *Previous)
Definition ASTReaderDecl.cpp:3764
void VisitUsingEnumDecl(UsingEnumDecl *D)
Definition ASTReaderDecl.cpp:1914
void VisitObjCImplDecl(ObjCImplDecl *D)
Definition ASTReaderDecl.cpp:1502
void VisitTranslationUnitDecl(TranslationUnitDecl *TU)
Definition ASTReaderDecl.cpp:688
void VisitUnnamedGlobalConstantDecl(UnnamedGlobalConstantDecl *D)
Definition ASTReaderDecl.cpp:1576
void VisitTypeDecl(TypeDecl *TD)
Definition ASTReaderDecl.cpp:698
void VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D)
Definition ASTReaderDecl.cpp:1507
void VisitEnumConstantDecl(EnumConstantDecl *ECD)
Definition ASTReaderDecl.cpp:892
void VisitTypeAliasDecl(TypeAliasDecl *TD)
Definition ASTReaderDecl.cpp:728
static void attachPreviousDeclImpl(ASTReader &Reader, Redeclarable< DeclT > *D, Decl *Previous, Decl *Canon)
Definition ASTReaderDecl.cpp:3631
void VisitConceptDecl(ConceptDecl *D)
Definition ASTReaderDecl.cpp:2428
void VisitObjCPropertyDecl(ObjCPropertyDecl *D)
Definition ASTReaderDecl.cpp:1479
void VisitOutlinedFunctionDecl(OutlinedFunctionDecl *D)
Definition ASTReaderDecl.cpp:1813
void VisitObjCIvarDecl(ObjCIvarDecl *D)
Definition ASTReaderDecl.cpp:1335
void VisitUsingPackDecl(UsingPackDecl *D)
Definition ASTReaderDecl.cpp:1925
void VisitFunctionTemplateDecl(FunctionTemplateDecl *D)
Definition ASTReaderDecl.cpp:2611
void VisitOMPDeclareReductionDecl(OMPDeclareReductionDecl *D)
Definition ASTReaderDecl.cpp:3085
RedeclarableResult VisitVarTemplateSpecializationDeclImpl(VarTemplateSpecializationDecl *D)
TODO: Unify with ClassTemplateSpecializationDecl version?
Definition ASTReaderDecl.cpp:2625
void VisitUsingDecl(UsingDecl *D)
Definition ASTReaderDecl.cpp:1902
void VisitObjCAtDefsFieldDecl(ObjCAtDefsFieldDecl *D)
Definition ASTReaderDecl.cpp:1438
void VisitVarTemplatePartialSpecializationDecl(VarTemplatePartialSpecializationDecl *D)
TODO: Unify with ClassTemplatePartialSpecializationDecl version?
Definition ASTReaderDecl.cpp:2692
void VisitParmVarDecl(ParmVarDecl *PD)
Definition ASTReaderDecl.cpp:1727
void VisitVarTemplateDecl(VarTemplateDecl *D)
TODO: Unify with ClassTemplateDecl version?
Definition ASTReaderDecl.cpp:2508
static void attachPreviousDecl(ASTReader &Reader, Decl *D, Decl *Previous, Decl *Canon)
Definition ASTReaderDecl.cpp:3832
void VisitClassTemplateDecl(ClassTemplateDecl *D)
Definition ASTReaderDecl.cpp:2489
void VisitCXXDestructorDecl(CXXDestructorDecl *D)
Definition ASTReaderDecl.cpp:2339
void VisitTemplateDecl(TemplateDecl *D)
Definition ASTReaderDecl.cpp:2420
void VisitCXXConversionDecl(CXXConversionDecl *D)
Definition ASTReaderDecl.cpp:2372
void VisitTypedefDecl(TypedefDecl *TD)
Definition ASTReaderDecl.cpp:723
void VisitOMPRequiresDecl(OMPRequiresDecl *D)
Definition ASTReaderDecl.cpp:3080
RedeclarableResult VisitRecordDeclImpl(RecordDecl *RD)
Definition ASTReaderDecl.cpp:828
void VisitDecompositionDecl(DecompositionDecl *DD)
Definition ASTReaderDecl.cpp:1755
void ReadSpecializations(ModuleFile &M, Decl *D, llvm::BitstreamCursor &DeclsCursor, bool IsPartial)
Definition ASTReaderDecl.cpp:2448
Reads an AST files chain containing the contents of a translation unit.
bool isDeclIDFromModule(GlobalDeclID ID, ModuleFile &M) const
Returns true if global DeclID ID originated from module M.
DiagnosticBuilder Diag(unsigned DiagID) const
Report a diagnostic.
ASTContext & getContext()
Retrieve the AST context that this AST reader supplements.
Decl * ReadDecl(ModuleFile &F, const RecordDataImpl &R, unsigned &I)
Reads a declaration from the given position in a record in the given module.
ModuleFile * getOwningModuleFile(const Decl *D) const
Retrieve the module file that owns the given declaration, or NULL if the declaration is not from a mo...
T * ReadDeclAs(ModuleFile &F, const RecordDataImpl &R, unsigned &I)
Reads a declaration from the given position in a record in the given module.
LocalDeclID mapGlobalIDToModuleFileGlobalID(ModuleFile &M, GlobalDeclID GlobalID)
Map a global declaration ID into the declaration ID used to refer to this declaration within the give...
friend class ASTDeclReader
Decl * GetDecl(GlobalDeclID ID)
Resolve a declaration ID into a declaration, potentially building a new declaration.
SourceLocation ReadSourceLocation(ModuleFile &MF, RawLocEncoding Raw) const
Read a source location from raw form.
void runWithSufficientStackSpace(SourceLocation Loc, llvm::function_ref< void()> Fn)
friend class ASTRecordReader
SmallVector< uint64_t, 64 > RecordData
serialization::ModuleFile ModuleFile
An object for streaming information from a record.
bool readBool()
Read a boolean value, advancing Idx.
std::string readString()
Read a string, advancing Idx.
SourceRange readSourceRange()
Read a source range, advancing Idx.
SourceLocation readSourceLocation()
Read a source location, advancing Idx.
void readAttributes(AttrVec &Attrs)
Reads attributes from the current stream position, advancing Idx.
Definition ASTReaderDecl.cpp:3217
T * readDeclAs()
Reads a declaration from the given position in the record, advancing Idx.
IdentifierInfo * readIdentifier()
ASTContext & getContext()
Retrieve the AST context that this AST reader supplements.
TypeSourceInfo * readTypeSourceInfo()
Reads a declarator info from the given record, advancing Idx.
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.
Definition ASTReaderDecl.cpp:3181
Expr * readExpr()
Reads an expression.
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)
void setSourceDeductionGuide(CXXDeductionGuideDecl *DG)
static CXXDeductionGuideDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setSourceDeductionGuideKind(SourceDeductionGuideKind SK)
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.
static CXXMethodDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
CXXMethodDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Represents a C++ struct/union/class.
CXXRecordDecl * getDefinition() const
static CXXRecordDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID)
unsigned getODRHash() const
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this class is an instantiation of a member class of a class template specialization,...
CXXRecordDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Represents the body of a CapturedStmt, and serves as its DeclContext.
static CapturedDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumParams)
void setContextParam(unsigned i, ImplicitParamDecl *P)
void setNothrow(bool Nothrow=true)
void setParam(unsigned i, ImplicitParamDecl *P)
Declaration of a class template.
static ClassTemplateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Create an empty class template node.
static ClassTemplatePartialSpecializationDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a class template specialization, which refers to a class template with a given set of temp...
static ClassTemplateSpecializationDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
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)
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
lookup_result::iterator lookup_iterator
bool isFileContext() const
void setHasExternalVisibleStorage(bool ES=true) const
State whether this DeclContext has external storage for declarations visible in this context.
DeclContextLookupResult lookup_result
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
DeclContext * getNonTransparentContext()
DeclID getRawValue() const
A simple visitor class that helps create declaration visitors.
Decl - This represents one declaration (or definition), e.g.
Decl * getPreviousDecl()
Retrieve the previous declaration that declares the same entity as this declaration,...
Decl * getMostRecentDecl()
Retrieve the most recent declaration that declares the same entity as this declaration (which may be ...
FriendObjectKind getFriendObjectKind() const
Determines whether this declaration is the object of a friend declaration and, if so,...
ASTContext & getASTContext() const LLVM_READONLY
void setOwningModuleID(unsigned ID)
Set the owning module ID.
void setLocalExternDecl()
Changes the namespace of this declaration to reflect that it's a function-local extern declaration.
void setTopLevelDeclInObjCContainer(bool V=true)
void markUsed(ASTContext &C)
Mark the declaration used, in the sense of odr-use.
bool isCanonicalDecl() const
Whether this particular Decl is a canonical one.
Module * getOwningModule() const
Get the module that owns this declaration (for visibility purposes).
Module * getImportedOwningModule() const
Get the imported owning module, if this decl is from an imported (non-local) module.
ObjCDeclQualifier
ObjCDeclQualifier - 'Qualifiers' written next to the return and parameter types in method declaration...
bool isFromASTFile() const
Determine whether this declaration came from an AST file (such as a precompiled header or module) rat...
bool isTemplateParameter() const
isTemplateParameter - Determines whether this declaration is a template parameter.
bool isInvalidDecl() const
unsigned FromASTFile
Whether this declaration was loaded from an AST file.
void setAccess(AccessSpecifier AS)
SourceLocation getLocation() const
IdentifierNamespace
IdentifierNamespace - The different namespaces in which declarations may appear.
@ IDNS_Ordinary
Ordinary names.
@ IDNS_Type
Types, declared with 'struct foo', typedefs, etc.
@ IDNS_Tag
Tags, declared with 'struct foo;' and referenced with 'struct foo'.
bool isTemplateParameterPack() const
isTemplateParameter - Determines whether this declaration is a template parameter pack.
void setImplicit(bool I=true)
void setReferenced(bool R=true)
void setLocation(SourceLocation L)
DeclContext * getDeclContext()
void setCachedLinkage(Linkage L) const
void setDeclContext(DeclContext *DC)
setDeclContext - Set both the semantic and lexical DeclContext to DC.
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
ModuleOwnershipKind
The kind of ownership a declaration has, for visibility purposes.
@ VisibleWhenImported
This declaration has an owning module, and is visible when that module is imported.
@ Unowned
This declaration is not owned by a module.
@ ReachableWhenImported
This declaration has an owning module, and is visible to lookups that occurs within that module.
@ ModulePrivate
This declaration has an owning module, but is only visible to lookups that occur within that module.
@ Visible
This declaration has an owning module, but is globally visible (typically because its owning module i...
void setModuleOwnershipKind(ModuleOwnershipKind MOK)
Set whether this declaration is hidden from name lookup.
bool shouldEmitInExternalSource() const
Whether the definition of the declaration should be emitted in external sources.
void setVisibleDespiteOwningModule()
Set that this declaration is globally visible, even if it came from a module that is not visible.
The name of a declaration.
IdentifierInfo * getAsIdentifierInfo() const
Retrieve the IdentifierInfo * stored in this declaration name, or null if this declaration name isn't...
Selector getObjCSelector() const
Get the Objective-C selector stored in this declaration name.
Represents a ValueDecl that came out of a declarator.
void setInnerLocStart(SourceLocation L)
void setTypeSourceInfo(TypeSourceInfo *TI)
TypeSourceInfo * getTypeSourceInfo() const
A decomposition declaration.
static DecompositionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumBindings)
Represents an empty-declaration.
static EmptyDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
An instance of this object exists for each enum constant that is defined.
static EnumConstantDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setInitExpr(Expr *E)
void setInitVal(const ASTContext &C, const llvm::APSInt &V)
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this enumeration is an instantiation of a member enumeration of a class template specialization,...
void setFixed(bool Fixed=true)
True if this is an Objective-C, C++11, or Microsoft-style enumeration with a fixed underlying type.
void setIntegerType(QualType T)
Set the underlying integer type.
void setIntegerTypeSourceInfo(TypeSourceInfo *TInfo)
Set the underlying integer type source info.
static EnumDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setScoped(bool Scoped=true)
True if this tag declaration is a scoped enumeration.
void setPromotionType(QualType T)
Set the promotion type.
EnumDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
void setScopedUsingClassTag(bool ScopedUCT=true)
If this tag declaration is a scoped enum, then this is true if the scoped enum was declared using the...
Represents a standard C++ module export declaration.
static ExportDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
This represents one expression.
RAII class for safely pairing a StartedDeserializing call with FinishedDeserializing.
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(Expr *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 setInstantiatedFromMemberTemplate(bool Val=true)
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 setIsDestroyingOperatorDelete(bool IsDestroyingDelete)
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)
void setIsTypeAwareOperatorNewOrDelete(bool IsTypeAwareOperator=true)
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 ...
FunctionTemplateDecl * getTemplate() const
Retrieve the template from which this function was specialized.
static FunctionTemplateSpecializationInfo * Create(ASTContext &C, FunctionDecl *FD, FunctionTemplateDecl *Template, TemplateSpecializationKind TSK, TemplateArgumentList *TemplateArgs, const TemplateArgumentListInfo *TemplateArgsAsWritten, SourceLocation POI, MemberSpecializationInfo *MSInfo)
void Profile(llvm::FoldingSetNodeID &ID)
FunctionDecl * getFunction() const
Retrieve the declaration of the function template specialization.
FunctionType - C99 6.7.5.3 - Function Declarators.
QualType getReturnType() const
HLSLBufferDecl - Represent a cbuffer or tbuffer declaration.
static HLSLBufferDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
One of these records is kept for each identifier that is lexed.
void setOutOfDate(bool OOD)
Set whether the information for this identifier is out of date with respect to the external source.
bool isOutOfDate() const
Determine whether the information for this identifier is out of date with respect to the external sou...
iterator begin(DeclarationName Name)
Returns an iterator over decls with the name 'Name'.
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
static LifetimeExtendedTemporaryDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
ValueDecl * getExtendingDecl()
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.
std::string Name
The name of this module.
bool isGlobalModule() const
Does this Module scope describe a fragment of the global module within some C++ module.
@ ModuleMapModule
This is a module that was defined by a module map and built out of header files.
bool isNamedModule() const
Does this Module is a named module of a standard named module?
Module * getTopLevelModule()
Retrieve the top-level module for this (sub)module, which may be this module.
This represents a decl that may have a name.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
bool isPlaceholderVar(const LangOptions &LangOpts) const
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
void setDeclName(DeclarationName N)
Set the name of this declaration.
Represents a C++ namespace alias.
static NamespaceAliasDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represent a C++ namespace.
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)
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)
ObjCProtocolDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this Objective-C protocol.
unsigned getODRHash()
Get precomputed ODRHash or add a new one.
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.
static OpenACCDeclareDecl * CreateDeserialized(ASTContext &Ctx, GlobalDeclID ID, unsigned NumClauses)
static OpenACCRoutineDecl * CreateDeserialized(ASTContext &Ctx, GlobalDeclID ID, unsigned NumClauses)
Represents a partial function definition.
void setNothrow(bool Nothrow=true)
static OutlinedFunctionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumParams)
void setParam(unsigned i, ImplicitParamDecl *P)
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 setHasUninitializedExplicitInitFields(bool V)
void setNonTrivialToPrimitiveDefaultInitialize(bool V)
Declaration of a redeclarable template.
CommonBase * Common
Pointer to the common data shared by all declarations of this template.
virtual CommonBase * newCommon(ASTContext &C) const =0
RedeclarableTemplateDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this template.
void setMemberSpecialization()
Note that this member template is a specialization.
void setInstantiatedFromMemberTemplate(RedeclarableTemplateDecl *TD)
void setPrevious(decl_type *D)
Decl * getLatestNotUpdated() const
void setLatest(decl_type *D)
Provides common interface for the Decls that can be redeclared.
DeclLink RedeclLink
Points to the next redeclaration in the chain.
bool isFirstDecl() const
True if this is the first declaration in its redeclaration chain.
static DeclLink PreviousDeclLink(decl_type *D)
Represents the body of a requires-expression.
static RequiresExprBodyDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
const FunctionDecl * getKernelEntryPointDecl() const
Encodes a location in the source.
A trivial tuple used to represent a source range.
Represents a C++11 static_assert declaration.
static StaticAssertDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
StringLiteral - This represents a string literal expression, e.g.
Represents the declaration of a struct/union/class/enum.
void setTagKind(TagKind TK)
void setCompleteDefinitionRequired(bool V=true)
True if this complete decl is required to be complete for some existing use.
void demoteThisDefinitionToDeclaration()
Mark a definition as a declaration and maintain information it was a definition.
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
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.
bool isFirstDecl() const
True if this is the first declaration in its redeclaration chain.
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
void init(NamedDecl *NewTemplatedDecl)
Initialize the underlying templated declaration.
NamedDecl * getTemplatedDecl() const
Get 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.
void setTypeConstraint(ConceptReference *CR, Expr *ImmediatelyDeclaredConstraint, UnsignedOrNone ArgPackSubstIndex)
static TemplateTypeParmDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID)
bool hasTypeConstraint() const
Determine whether this template parameter has a type-constraint.
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.
const T * castAs() const
Member-template castAs.
AutoType * getContainedAutoType() const
Get the AutoType whose type will be deduced for a variable with an initializer of this type.
const T * getAs() const
Member-template getAs'.
Represents the declaration of a typedef-name via the 'typedef' type specifier.
static TypedefDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Base class for declarations which introduce a typedef-name.
void setModedTypeSourceInfo(TypeSourceInfo *unmodedTSI, QualType modedTy)
void setTypeSourceInfo(TypeSourceInfo *newType)
An artificial decl, representing a global anonymous constant value which is uniquified by value withi...
void addDecl(NamedDecl *D)
A set of unresolved declarations.
This node is generated when a using-declaration that was annotated with attribute((using_if_exists)) ...
static UnresolvedUsingIfExistsDecl * CreateDeserialized(ASTContext &Ctx, GlobalDeclID ID)
Represents a dependent using declaration which was marked with typename.
static UnresolvedUsingTypenameDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a dependent using declaration which was not marked with typename.
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.
VarDecl * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
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)
RawLocEncoding getRawLoc() const
uint64_t getBitOffset(const uint64_t DeclTypesBlockStartOffset) const
Information about a module that has been loaded by the ASTReader.
const serialization::ObjCCategoriesInfo * ObjCCategoriesMap
Array of category list location information within this module file, sorted by the definition ID.
unsigned LocalNumObjCCategoriesInMap
The number of redeclaration info entries in ObjCCategoriesMap.
llvm::BitstreamCursor DeclsCursor
DeclsCursor - This is a cursor to the start of the DECLTYPES_BLOCK block.
uint64_t GlobalBitOffset
The global bit offset (or base) of this module.
const DeclOffset * DeclOffsets
Offset of each declaration within the bitstream, indexed by the declaration ID (-1).
unsigned Generation
The generation of which this module file is a part.
uint64_t DeclsBlockStartOffset
The offset to the start of the DECLTYPES_BLOCK block.
ModuleKind Kind
The type of this module.
SmallVector< uint64_t, 1 > ObjCCategories
The Objective-C category lists for categories known to this module.
const unsigned int LOCAL_REDECLARATIONS
Record code for a list of local redeclarations of a declaration.
DeclCode
Record codes for each kind of declaration.
const unsigned int DECL_UPDATES
Record of updates for a declaration that was modified after being deserialized.
@ DECL_EMPTY
An EmptyDecl record.
@ DECL_CAPTURED
A CapturedDecl record.
@ DECL_CXX_BASE_SPECIFIERS
A record containing CXXBaseSpecifiers.
@ DECL_CXX_RECORD
A CXXRecordDecl record.
@ DECL_VAR_TEMPLATE_PARTIAL_SPECIALIZATION
A VarTemplatePartialSpecializationDecl record.
@ DECL_OMP_ALLOCATE
An OMPAllocateDcl record.
@ DECL_MS_PROPERTY
A MSPropertyDecl record.
@ DECL_OMP_DECLARE_MAPPER
An OMPDeclareMapperDecl record.
@ DECL_TOP_LEVEL_STMT_DECL
A TopLevelStmtDecl record.
@ DECL_REQUIRES_EXPR_BODY
A RequiresExprBodyDecl record.
@ DECL_STATIC_ASSERT
A StaticAssertDecl record.
@ DECL_INDIRECTFIELD
A IndirectFieldDecl record.
@ DECL_TEMPLATE_TEMPLATE_PARM
A TemplateTemplateParmDecl record.
@ DECL_IMPORT
An ImportDecl recording a module import.
@ DECL_UNNAMED_GLOBAL_CONSTANT
A UnnamedGlobalConstantDecl record.
@ DECL_ACCESS_SPEC
An AccessSpecDecl record.
@ DECL_OBJC_TYPE_PARAM
An ObjCTypeParamDecl record.
@ DECL_OBJC_CATEGORY_IMPL
A ObjCCategoryImplDecl record.
@ DECL_ENUM_CONSTANT
An EnumConstantDecl record.
@ DECL_PARM_VAR
A ParmVarDecl record.
@ DECL_TYPEDEF
A TypedefDecl record.
@ DECL_EXPANDED_TEMPLATE_TEMPLATE_PARM_PACK
A TemplateTemplateParmDecl record that stores an expanded template template parameter pack.
@ DECL_HLSL_BUFFER
A HLSLBufferDecl record.
@ DECL_NAMESPACE_ALIAS
A NamespaceAliasDecl record.
@ DECL_TYPEALIAS
A TypeAliasDecl record.
@ DECL_FUNCTION_TEMPLATE
A FunctionTemplateDecl record.
@ DECL_MS_GUID
A MSGuidDecl record.
@ DECL_UNRESOLVED_USING_TYPENAME
An UnresolvedUsingTypenameDecl record.
@ DECL_CLASS_TEMPLATE_SPECIALIZATION
A ClassTemplateSpecializationDecl record.
@ DECL_FILE_SCOPE_ASM
A FileScopeAsmDecl record.
@ DECL_PARTIAL_SPECIALIZATIONS
@ DECL_CXX_CONSTRUCTOR
A CXXConstructorDecl record.
@ DECL_CXX_CONVERSION
A CXXConversionDecl record.
@ DECL_FIELD
A FieldDecl record.
@ DECL_LINKAGE_SPEC
A LinkageSpecDecl record.
@ DECL_CONTEXT_TU_LOCAL_VISIBLE
A record that stores the set of declarations that are only visible to the TU.
@ 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_OUTLINEDFUNCTION
A OutlinedFunctionDecl record.
@ 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_CONTEXT_MODULE_LOCAL_VISIBLE
A record containing the set of declarations that are only visible from DeclContext in the same module...
@ 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.
std::variant< struct RequiresDecl, struct HeaderDecl, struct UmbrellaDirDecl, struct ModuleDecl, struct ExcludeDecl, struct ExportDecl, struct ExportAsDecl, struct ExternModuleDecl, struct UseDecl, struct LinkDecl, struct ConfigMacrosDecl, struct ConflictDecl > Decl
All declarations that can appear in a module declaration.
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...
uint64_t TypeID
An ID number that refers to a type in an AST file.
@ MK_MainFile
File is a PCH file treated as the actual main file.
uint32_t SubmoduleID
An ID number that refers to a submodule in a module file.
bool isPartOfPerModuleInitializer(const Decl *D)
Determine whether the given declaration will be included in the per-module initializer if it needs to...
@ DeclMarkedOpenMPThreadPrivate
@ CXXResolvedDtorGlobArrayDelete
@ CXXInstantiatedClassDefinition
@ CXXResolvedExceptionSpec
@ CXXResolvedDtorArrayDelete
@ CXXInstantiatedDefaultArgument
@ CXXInstantiatedDefaultMemberInitializer
@ CXXAddedAnonymousNamespace
@ CXXResolvedDtorGlobDelete
@ CXXAddedFunctionDefinition
@ CXXPointOfInstantiation
@ DeclMarkedOpenMPDeclareTarget
@ DeclMarkedOpenMPAllocate
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.
LazyOffsetPtr< Stmt, uint64_t, &ExternalASTSource::GetExternalDeclStmt > LazyDeclStmtPtr
A lazy pointer to a statement.
bool isUnresolvedExceptionSpec(ExceptionSpecificationType ESpecType)
ConstexprSpecKind
Define the kind of constexpr specifier.
LinkageSpecLanguageIDs
Represents the language in a linkage specification.
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.
AccessSpecifier
A C++ access specifier (public, private, protected), plus the special value "none" which means differ...
SmallVector< Attr *, 4 > AttrVec
AttrVec - A vector of Attr, which is how they are stored on the AST.
OMPDeclareReductionInitKind
StorageClass
Storage classes.
Linkage
Describes the different kinds of linkage (C++ [basic.link], C99 6.2.2) that an entity may have.
@ None
No linkage, which means that the entity is unique and can only be referred to from within its scope.
@ Result
The result type of a method or function.
const FunctionProtoType * T
@ Template
We are parsing a template declaration.
TagTypeKind
The kind of a tag type.
@ VarTemplate
The name was classified as a variable template name.
ObjCImplementationControl
RecordArgPassingKind
Enum that represents the different ways arguments are passed to and returned from function calls.
static bool isUndeducedReturnType(QualType T)
Definition ASTReaderDecl.cpp:3663
bool operator!=(CanQual< T > x, CanQual< U > y)
TemplateNameKind
Specifies the kind of template name that an identifier refers to.
DeductionCandidate
Only used by CXXDeductionGuideDecl.
bool shouldSkipCheckingODR(const Decl *D)
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
U cast(CodeGen::Address addr)
@ Interface
The "__interface" keyword introduces the elaborated-type-specifier.
@ Class
The "class" keyword introduces the elaborated-type-specifier.
@ Other
Other implicit parameter.
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 CheckedForSideEffects
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 ...
uint16_t Part2
...-89ab-...
uint32_t Part1
{01234567-...
uint16_t Part3
...-cdef-...
uint8_t Part4And5[8]
...-0123-456789abcdef}
llvm::DenseSet< std::tuple< Decl *, Decl *, int > > NonEquivalentDeclSet
Store declaration pairs already found to be non-equivalent.
static constexpr UnsignedOrNone fromInternalRepresentation(unsigned Rep)
uint64_t ModuleLocalOffset