4965 lines · cpp
1//===- ASTReaderDecl.cpp - Decl Deserialization ---------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// This file implements the ASTReader::readDeclRecord method, which is the10// entrypoint for loading a decl.11//12//===----------------------------------------------------------------------===//13 14#include "ASTCommon.h"15#include "ASTReaderInternals.h"16#include "clang/AST/ASTConcept.h"17#include "clang/AST/ASTContext.h"18#include "clang/AST/ASTStructuralEquivalence.h"19#include "clang/AST/Attr.h"20#include "clang/AST/AttrIterator.h"21#include "clang/AST/Decl.h"22#include "clang/AST/DeclBase.h"23#include "clang/AST/DeclCXX.h"24#include "clang/AST/DeclFriend.h"25#include "clang/AST/DeclObjC.h"26#include "clang/AST/DeclOpenMP.h"27#include "clang/AST/DeclTemplate.h"28#include "clang/AST/DeclVisitor.h"29#include "clang/AST/DeclarationName.h"30#include "clang/AST/Expr.h"31#include "clang/AST/ExternalASTSource.h"32#include "clang/AST/LambdaCapture.h"33#include "clang/AST/NestedNameSpecifier.h"34#include "clang/AST/OpenMPClause.h"35#include "clang/AST/Redeclarable.h"36#include "clang/AST/Stmt.h"37#include "clang/AST/TemplateBase.h"38#include "clang/AST/Type.h"39#include "clang/AST/UnresolvedSet.h"40#include "clang/Basic/AttrKinds.h"41#include "clang/Basic/DiagnosticSema.h"42#include "clang/Basic/ExceptionSpecificationType.h"43#include "clang/Basic/IdentifierTable.h"44#include "clang/Basic/LLVM.h"45#include "clang/Basic/Lambda.h"46#include "clang/Basic/LangOptions.h"47#include "clang/Basic/Linkage.h"48#include "clang/Basic/Module.h"49#include "clang/Basic/PragmaKinds.h"50#include "clang/Basic/SourceLocation.h"51#include "clang/Basic/Specifiers.h"52#include "clang/Sema/IdentifierResolver.h"53#include "clang/Serialization/ASTBitCodes.h"54#include "clang/Serialization/ASTRecordReader.h"55#include "clang/Serialization/ContinuousRangeMap.h"56#include "clang/Serialization/ModuleFile.h"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 <algorithm>66#include <cassert>67#include <cstdint>68#include <cstring>69#include <string>70#include <utility>71 72using namespace clang;73using namespace serialization;74 75//===----------------------------------------------------------------------===//76// Declaration Merging77//===----------------------------------------------------------------------===//78 79namespace {80/// Results from loading a RedeclarableDecl.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 /// Retrieve the first ID.91 GlobalDeclID getFirstID() const { return FirstID; }92 93 /// Is this declaration a key declaration?94 bool isKeyDecl() const { return IsKeyDecl; }95 96 /// Get a known declaration that this should be merged with, if97 /// any.98 Decl *getKnownMergeTarget() const { return MergeWith; }99};100} // namespace101 102namespace clang {103class ASTDeclMerger {104 ASTReader &Reader;105 106public:107 ASTDeclMerger(ASTReader &Reader) : Reader(Reader) {}108 109 void mergeLambda(CXXRecordDecl *D, RedeclarableResult &Redecl, Decl &Context,110 unsigned Number);111 112 /// \param KeyDeclID the decl ID of the key declaration \param D.113 /// GlobalDeclID() if \param is not a key declaration.114 /// See the comments of ASTReader::KeyDecls for the explanation115 /// of key declaration.116 template <typename T>117 void mergeRedeclarableImpl(Redeclarable<T> *D, T *Existing,118 GlobalDeclID KeyDeclID);119 120 template <typename T>121 void mergeRedeclarable(Redeclarable<T> *D, T *Existing,122 RedeclarableResult &Redecl) {123 mergeRedeclarableImpl(124 D, Existing, Redecl.isKeyDecl() ? Redecl.getFirstID() : GlobalDeclID());125 }126 127 void mergeTemplatePattern(RedeclarableTemplateDecl *D,128 RedeclarableTemplateDecl *Existing, bool IsKeyDecl);129 130 void MergeDefinitionData(CXXRecordDecl *D,131 struct CXXRecordDecl::DefinitionData &&NewDD);132 void MergeDefinitionData(ObjCInterfaceDecl *D,133 struct ObjCInterfaceDecl::DefinitionData &&NewDD);134 void MergeDefinitionData(ObjCProtocolDecl *D,135 struct ObjCProtocolDecl::DefinitionData &&NewDD);136};137} // namespace clang138 139//===----------------------------------------------------------------------===//140// Declaration deserialization141//===----------------------------------------------------------------------===//142 143namespace clang {144class ASTDeclReader : public DeclVisitor<ASTDeclReader, void> {145 ASTReader &Reader;146 ASTDeclMerger MergeImpl;147 ASTRecordReader &Record;148 ASTReader::RecordLocation Loc;149 const GlobalDeclID ThisDeclID;150 const SourceLocation ThisDeclLoc;151 152 using RecordData = ASTReader::RecordData;153 154 TypeID DeferredTypeID = 0;155 unsigned AnonymousDeclNumber = 0;156 GlobalDeclID NamedDeclForTagDecl = GlobalDeclID();157 IdentifierInfo *TypedefNameForLinkage = nullptr;158 159 /// A flag to carry the information for a decl from the entity is160 /// used. We use it to delay the marking of the canonical decl as used until161 /// the entire declaration is deserialized and merged.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 <typename T> T *readDeclAs() { return Record.readDeclAs<T>(); }190 191 serialization::SubmoduleID readSubmoduleID() {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 200 void ReadCXXRecordDefinition(CXXRecordDecl *D, bool Update,201 Decl *LambdaContext = nullptr,202 unsigned IndexInLambdaContext = 0);203 void ReadCXXDefinitionData(struct CXXRecordDecl::DefinitionData &Data,204 const CXXRecordDecl *D, Decl *LambdaContext,205 unsigned IndexInLambdaContext);206 void ReadObjCDefinitionData(struct ObjCInterfaceDecl::DefinitionData &Data);207 void ReadObjCDefinitionData(struct ObjCProtocolDecl::DefinitionData &Data);208 209 static DeclContext *getPrimaryDCForAnonymousDecl(DeclContext *LexicalDC);210 211 static NamedDecl *getAnonymousDeclForMerging(ASTReader &Reader,212 DeclContext *DC, unsigned Index);213 static void setAnonymousDeclForMerging(ASTReader &Reader, DeclContext *DC,214 unsigned Index, NamedDecl *D);215 216 /// Commit to a primary definition of the class RD, which is known to be217 /// a definition of the class. We might not have read the definition data218 /// for it yet. If we haven't then allocate placeholder definition data219 /// now too.220 static CXXRecordDecl *getOrFakePrimaryClassDefinition(ASTReader &Reader,221 CXXRecordDecl *RD);222 223 /// Class used to capture the result of searching for an existing224 /// declaration of a specific kind and name, along with the ability225 /// to update the place where this result was found (the declaration226 /// chain hanging off an identifier or the DeclContext we searched in)227 /// if requested.228 class FindExistingResult {229 ASTReader &Reader;230 NamedDecl *New = nullptr;231 NamedDecl *Existing = nullptr;232 bool AddResult = false;233 unsigned AnonymousDeclNumber = 0;234 IdentifierInfo *TypedefNameForLinkage = nullptr;235 236 public:237 FindExistingResult(ASTReader &Reader) : Reader(Reader) {}238 239 FindExistingResult(ASTReader &Reader, NamedDecl *New, NamedDecl *Existing,240 unsigned AnonymousDeclNumber,241 IdentifierInfo *TypedefNameForLinkage)242 : Reader(Reader), New(New), Existing(Existing), AddResult(true),243 AnonymousDeclNumber(AnonymousDeclNumber),244 TypedefNameForLinkage(TypedefNameForLinkage) {}245 246 FindExistingResult(FindExistingResult &&Other)247 : Reader(Other.Reader), New(Other.New), Existing(Other.Existing),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 /// Suppress the addition of this result into the known set of258 /// names.259 void suppress() { AddResult = false; }260 261 operator NamedDecl *() const { return Existing; }262 263 template <typename T> operator T *() const {264 return dyn_cast_or_null<T>(Existing);265 }266 };267 268 static DeclContext *getPrimaryContextForMerging(ASTReader &Reader,269 DeclContext *DC);270 FindExistingResult findExisting(NamedDecl *D);271 272public:273 ASTDeclReader(ASTReader &Reader, ASTRecordReader &Record,274 ASTReader::RecordLocation Loc, GlobalDeclID thisDeclID,275 SourceLocation ThisDeclLoc)276 : Reader(Reader), MergeImpl(Reader), Record(Record), Loc(Loc),277 ThisDeclID(thisDeclID), ThisDeclLoc(ThisDeclLoc) {}278 279 template <typename DeclT>280 static Decl *getMostRecentDeclImpl(Redeclarable<DeclT> *D);281 static Decl *getMostRecentDeclImpl(...);282 static Decl *getMostRecentDecl(Decl *D);283 284 template <typename DeclT>285 static void attachPreviousDeclImpl(ASTReader &Reader, Redeclarable<DeclT> *D,286 Decl *Previous, Decl *Canon);287 static void attachPreviousDeclImpl(ASTReader &Reader, ...);288 static void attachPreviousDecl(ASTReader &Reader, Decl *D, Decl *Previous,289 Decl *Canon);290 291 static void checkMultipleDefinitionInNamedModules(ASTReader &Reader, Decl *D,292 Decl *Previous);293 294 template <typename DeclT>295 static void attachLatestDeclImpl(Redeclarable<DeclT> *D, Decl *Latest);296 static void attachLatestDeclImpl(...);297 static void attachLatestDecl(Decl *D, Decl *latest);298 299 template <typename DeclT>300 static void markIncompleteDeclChainImpl(Redeclarable<DeclT> *D);301 static void markIncompleteDeclChainImpl(...);302 303 void ReadSpecializations(ModuleFile &M, Decl *D,304 llvm::BitstreamCursor &DeclsCursor, bool IsPartial);305 306 void ReadFunctionDefinition(FunctionDecl *FD);307 void Visit(Decl *D);308 309 void UpdateDecl(Decl *D);310 311 static void setNextObjCCategory(ObjCCategoryDecl *Cat,312 ObjCCategoryDecl *Next) {313 Cat->NextClassCategory = Next;314 }315 316 void VisitDecl(Decl *D);317 void VisitPragmaCommentDecl(PragmaCommentDecl *D);318 void VisitPragmaDetectMismatchDecl(PragmaDetectMismatchDecl *D);319 void VisitTranslationUnitDecl(TranslationUnitDecl *TU);320 void VisitNamedDecl(NamedDecl *ND);321 void VisitLabelDecl(LabelDecl *LD);322 void VisitNamespaceDecl(NamespaceDecl *D);323 void VisitHLSLBufferDecl(HLSLBufferDecl *D);324 void VisitUsingDirectiveDecl(UsingDirectiveDecl *D);325 void VisitNamespaceAliasDecl(NamespaceAliasDecl *D);326 void VisitTypeDecl(TypeDecl *TD);327 RedeclarableResult VisitTypedefNameDecl(TypedefNameDecl *TD);328 void VisitTypedefDecl(TypedefDecl *TD);329 void VisitTypeAliasDecl(TypeAliasDecl *TD);330 void VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D);331 void VisitUnresolvedUsingIfExistsDecl(UnresolvedUsingIfExistsDecl *D);332 RedeclarableResult VisitTagDecl(TagDecl *TD);333 void VisitEnumDecl(EnumDecl *ED);334 RedeclarableResult VisitRecordDeclImpl(RecordDecl *RD);335 void VisitRecordDecl(RecordDecl *RD);336 RedeclarableResult VisitCXXRecordDeclImpl(CXXRecordDecl *D);337 void VisitCXXRecordDecl(CXXRecordDecl *D) { VisitCXXRecordDeclImpl(D); }338 RedeclarableResult339 VisitClassTemplateSpecializationDeclImpl(ClassTemplateSpecializationDecl *D);340 341 void342 VisitClassTemplateSpecializationDecl(ClassTemplateSpecializationDecl *D) {343 VisitClassTemplateSpecializationDeclImpl(D);344 }345 346 void VisitClassTemplatePartialSpecializationDecl(347 ClassTemplatePartialSpecializationDecl *D);348 RedeclarableResult349 VisitVarTemplateSpecializationDeclImpl(VarTemplateSpecializationDecl *D);350 351 void VisitVarTemplateSpecializationDecl(VarTemplateSpecializationDecl *D) {352 VisitVarTemplateSpecializationDeclImpl(D);353 }354 355 void VisitVarTemplatePartialSpecializationDecl(356 VarTemplatePartialSpecializationDecl *D);357 void VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D);358 void VisitValueDecl(ValueDecl *VD);359 void VisitEnumConstantDecl(EnumConstantDecl *ECD);360 void VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D);361 void VisitDeclaratorDecl(DeclaratorDecl *DD);362 void VisitFunctionDecl(FunctionDecl *FD);363 void VisitCXXDeductionGuideDecl(CXXDeductionGuideDecl *GD);364 void VisitCXXMethodDecl(CXXMethodDecl *D);365 void VisitCXXConstructorDecl(CXXConstructorDecl *D);366 void VisitCXXDestructorDecl(CXXDestructorDecl *D);367 void VisitCXXConversionDecl(CXXConversionDecl *D);368 void VisitFieldDecl(FieldDecl *FD);369 void VisitMSPropertyDecl(MSPropertyDecl *FD);370 void VisitMSGuidDecl(MSGuidDecl *D);371 void VisitUnnamedGlobalConstantDecl(UnnamedGlobalConstantDecl *D);372 void VisitTemplateParamObjectDecl(TemplateParamObjectDecl *D);373 void VisitIndirectFieldDecl(IndirectFieldDecl *FD);374 RedeclarableResult VisitVarDeclImpl(VarDecl *D);375 void ReadVarDeclInit(VarDecl *VD);376 void VisitVarDecl(VarDecl *VD) { VisitVarDeclImpl(VD); }377 void VisitImplicitParamDecl(ImplicitParamDecl *PD);378 void VisitParmVarDecl(ParmVarDecl *PD);379 void VisitDecompositionDecl(DecompositionDecl *DD);380 void VisitBindingDecl(BindingDecl *BD);381 void VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D);382 void VisitTemplateDecl(TemplateDecl *D);383 void VisitConceptDecl(ConceptDecl *D);384 void385 VisitImplicitConceptSpecializationDecl(ImplicitConceptSpecializationDecl *D);386 void VisitRequiresExprBodyDecl(RequiresExprBodyDecl *D);387 RedeclarableResult VisitRedeclarableTemplateDecl(RedeclarableTemplateDecl *D);388 void VisitClassTemplateDecl(ClassTemplateDecl *D);389 void VisitBuiltinTemplateDecl(BuiltinTemplateDecl *D);390 void VisitVarTemplateDecl(VarTemplateDecl *D);391 void VisitFunctionTemplateDecl(FunctionTemplateDecl *D);392 void VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D);393 void VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D);394 void VisitUsingDecl(UsingDecl *D);395 void VisitUsingEnumDecl(UsingEnumDecl *D);396 void VisitUsingPackDecl(UsingPackDecl *D);397 void VisitUsingShadowDecl(UsingShadowDecl *D);398 void VisitConstructorUsingShadowDecl(ConstructorUsingShadowDecl *D);399 void VisitLinkageSpecDecl(LinkageSpecDecl *D);400 void VisitExportDecl(ExportDecl *D);401 void VisitFileScopeAsmDecl(FileScopeAsmDecl *AD);402 void VisitTopLevelStmtDecl(TopLevelStmtDecl *D);403 void VisitImportDecl(ImportDecl *D);404 void VisitAccessSpecDecl(AccessSpecDecl *D);405 void VisitFriendDecl(FriendDecl *D);406 void VisitFriendTemplateDecl(FriendTemplateDecl *D);407 void VisitStaticAssertDecl(StaticAssertDecl *D);408 void VisitBlockDecl(BlockDecl *BD);409 void VisitOutlinedFunctionDecl(OutlinedFunctionDecl *D);410 void VisitCapturedDecl(CapturedDecl *CD);411 void VisitEmptyDecl(EmptyDecl *D);412 void VisitLifetimeExtendedTemporaryDecl(LifetimeExtendedTemporaryDecl *D);413 414 void VisitOpenACCDeclareDecl(OpenACCDeclareDecl *D);415 void VisitOpenACCRoutineDecl(OpenACCRoutineDecl *D);416 417 void VisitDeclContext(DeclContext *DC, LookupBlockOffsets &Offsets);418 419 template <typename T>420 RedeclarableResult VisitRedeclarable(Redeclarable<T> *D);421 422 template <typename T>423 void mergeRedeclarable(Redeclarable<T> *D, RedeclarableResult &Redecl);424 425 void mergeRedeclarableTemplate(RedeclarableTemplateDecl *D,426 RedeclarableResult &Redecl);427 428 template <typename T> void mergeMergeable(Mergeable<T> *D);429 430 void mergeMergeable(LifetimeExtendedTemporaryDecl *D);431 432 ObjCTypeParamList *ReadObjCTypeParamList();433 434 // FIXME: Reorder according to DeclNodes.td?435 void VisitObjCMethodDecl(ObjCMethodDecl *D);436 void VisitObjCTypeParamDecl(ObjCTypeParamDecl *D);437 void VisitObjCContainerDecl(ObjCContainerDecl *D);438 void VisitObjCInterfaceDecl(ObjCInterfaceDecl *D);439 void VisitObjCIvarDecl(ObjCIvarDecl *D);440 void VisitObjCProtocolDecl(ObjCProtocolDecl *D);441 void VisitObjCAtDefsFieldDecl(ObjCAtDefsFieldDecl *D);442 void VisitObjCCategoryDecl(ObjCCategoryDecl *D);443 void VisitObjCImplDecl(ObjCImplDecl *D);444 void VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D);445 void VisitObjCImplementationDecl(ObjCImplementationDecl *D);446 void VisitObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *D);447 void VisitObjCPropertyDecl(ObjCPropertyDecl *D);448 void VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D);449 void VisitOMPThreadPrivateDecl(OMPThreadPrivateDecl *D);450 void VisitOMPAllocateDecl(OMPAllocateDecl *D);451 void VisitOMPDeclareReductionDecl(OMPDeclareReductionDecl *D);452 void VisitOMPDeclareMapperDecl(OMPDeclareMapperDecl *D);453 void VisitOMPRequiresDecl(OMPRequiresDecl *D);454 void VisitOMPCapturedExprDecl(OMPCapturedExprDecl *D);455};456} // namespace clang457 458namespace {459 460/// Iterator over the redeclarations of a declaration that have already461/// been merged into the same redeclaration chain.462template <typename DeclT> 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 } else478 Current = Current->getPreviousDecl();479 480 // If we started in the merged portion, we'll reach our start position481 // eventually. Otherwise, we'll never reach it, but the second declaration482 // we reached was the canonical declaration, so stop when we see that one483 // again.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} // namespace496 497template <typename DeclT>498static llvm::iterator_range<MergedRedeclIterator<DeclT>>499merged_redecls(DeclT *D) {500 return llvm::make_range(MergedRedeclIterator<DeclT>(D),501 MergedRedeclIterator<DeclT>());502}503 504uint64_t ASTDeclReader::GetCurrentCursorOffset() {505 return Loc.F->DeclsCursor.GetCurrentBitNo() + Loc.F->GlobalBitOffset;506}507 508void ASTDeclReader::ReadFunctionDefinition(FunctionDecl *FD) {509 if (Record.readInt()) {510 Reader.DefinitionSource[FD] =511 Loc.F->Kind == ModuleKind::MK_MainFile ||512 Reader.getContext().getLangOpts().BuildingPCHWithObjectFile;513 }514 if (auto *CD = dyn_cast<CXXConstructorDecl>(FD)) {515 CD->setNumCtorInitializers(Record.readInt());516 if (CD->getNumCtorInitializers())517 CD->CtorInitializers = ReadGlobalOffset();518 }519 // Store the offset of the body so we can lazily load it later.520 Reader.PendingBodies[FD] = GetCurrentCursorOffset();521 // For now remember ThisDeclarationWasADefinition only for friend functions.522 if (FD->getFriendObjectKind())523 Reader.ThisDeclarationWasADefinitionSet.insert(FD);524}525 526void ASTDeclReader::Visit(Decl *D) {527 DeclVisitor<ASTDeclReader, void>::Visit(D);528 529 // At this point we have deserialized and merged the decl and it is safe to530 // update its canonical decl to signal that the entire entity is used.531 D->getCanonicalDecl()->Used |= IsDeclMarkedUsed;532 IsDeclMarkedUsed = false;533 534 if (auto *DD = dyn_cast<DeclaratorDecl>(D)) {535 if (auto *TInfo = DD->getTypeSourceInfo())536 Record.readTypeLoc(TInfo->getTypeLoc());537 }538 539 if (auto *TD = dyn_cast<TypeDecl>(D)) {540 // We have a fully initialized TypeDecl. Read its type now.541 if (isa<TagDecl, TypedefDecl, TypeAliasDecl>(TD))542 assert(DeferredTypeID == 0 &&543 "Deferred type not used for TagDecls and Typedefs");544 else545 TD->setTypeForDecl(Reader.GetType(DeferredTypeID).getTypePtrOrNull());546 547 // If this is a tag declaration with a typedef name for linkage, it's safe548 // to load that typedef now.549 if (NamedDeclForTagDecl.isValid())550 cast<TagDecl>(D)->TypedefNameDeclOrQualifier =551 cast<TypedefNameDecl>(Reader.GetDecl(NamedDeclForTagDecl));552 } else if (auto *ID = dyn_cast<ObjCInterfaceDecl>(D)) {553 // if we have a fully initialized TypeDecl, we can safely read its type now.554 ID->TypeForDecl = Reader.GetType(DeferredTypeID).getTypePtrOrNull();555 } else if (auto *FD = dyn_cast<FunctionDecl>(D)) {556 // FunctionDecl's body was written last after all other Stmts/Exprs.557 if (Record.readInt())558 ReadFunctionDefinition(FD);559 } else if (auto *VD = dyn_cast<VarDecl>(D)) {560 ReadVarDeclInit(VD);561 } else if (auto *FD = dyn_cast<FieldDecl>(D)) {562 if (FD->hasInClassInitializer() && Record.readInt()) {563 FD->setLazyInClassInitializer(LazyDeclStmtPtr(GetCurrentCursorOffset()));564 }565 }566}567 568void ASTDeclReader::VisitDecl(Decl *D) {569 BitsUnpacker DeclBits(Record.readInt());570 auto ModuleOwnership =571 (Decl::ModuleOwnershipKind)DeclBits.getNextBits(/*Width=*/3);572 D->setReferenced(DeclBits.getNextBit());573 D->Used = DeclBits.getNextBit();574 IsDeclMarkedUsed |= D->Used;575 D->setAccess((AccessSpecifier)DeclBits.getNextBits(/*Width=*/2));576 D->setImplicit(DeclBits.getNextBit());577 bool HasStandaloneLexicalDC = DeclBits.getNextBit();578 bool HasAttrs = DeclBits.getNextBit();579 D->setTopLevelDeclInObjCContainer(DeclBits.getNextBit());580 D->InvalidDecl = DeclBits.getNextBit();581 D->FromASTFile = true;582 583 if (D->isTemplateParameter() || D->isTemplateParameterPack() ||584 isa<ParmVarDecl, ObjCTypeParamDecl>(D)) {585 // We don't want to deserialize the DeclContext of a template586 // parameter or of a parameter of a function template immediately. These587 // entities might be used in the formulation of its DeclContext (for588 // example, a function parameter can be used in decltype() in trailing589 // return type of the function). Use the translation unit DeclContext as a590 // placeholder.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<DeclContext>();602 auto *LexicalDC =603 HasStandaloneLexicalDC ? readDeclAs<DeclContext>() : nullptr;604 if (!LexicalDC)605 LexicalDC = SemaDC;606 // If the context is a class, we might not have actually merged it yet, in607 // the case where the definition comes from an update record.608 DeclContext *MergedSemaDC;609 if (auto *RD = dyn_cast<CXXRecordDecl>(SemaDC))610 MergedSemaDC = getOrFakePrimaryClassDefinition(Reader, RD);611 else612 MergedSemaDC = Reader.MergedDeclContexts.lookup(SemaDC);613 // Avoid calling setLexicalDeclContext() directly because it uses614 // Decl::getASTContext() internally which is unsafe during derialization.615 D->setDeclContextsImpl(MergedSemaDC ? MergedSemaDC : SemaDC, LexicalDC,616 Reader.getContext());617 }618 D->setLocation(ThisDeclLoc);619 620 if (HasAttrs) {621 AttrVec Attrs;622 Record.readAttributes(Attrs);623 // Avoid calling setAttrs() directly because it uses Decl::getASTContext()624 // internally which is unsafe during derialization.625 D->setAttrsImpl(Attrs, Reader.getContext());626 }627 628 // Determine whether this declaration is part of a (sub)module. If so, it629 // may not yet be visible.630 bool ModulePrivate =631 (ModuleOwnership == Decl::ModuleOwnershipKind::ModulePrivate);632 if (unsigned SubmoduleID = readSubmoduleID()) {633 switch (ModuleOwnership) {634 case Decl::ModuleOwnershipKind::Visible:635 ModuleOwnership = Decl::ModuleOwnershipKind::VisibleWhenImported;636 break;637 case Decl::ModuleOwnershipKind::Unowned:638 case Decl::ModuleOwnershipKind::VisibleWhenImported:639 case Decl::ModuleOwnershipKind::ReachableWhenImported:640 case Decl::ModuleOwnershipKind::ModulePrivate:641 break;642 }643 644 D->setModuleOwnershipKind(ModuleOwnership);645 // Store the owning submodule ID in the declaration.646 D->setOwningModuleID(SubmoduleID);647 648 if (ModulePrivate) {649 // Module-private declarations are never visible, so there is no work to650 // do.651 } else if (Reader.getContext().getLangOpts().ModulesLocalVisibility) {652 // If local visibility is being tracked, this declaration will become653 // hidden and visible as the owning module does.654 } else if (Module *Owner = Reader.getSubmodule(SubmoduleID)) {655 // Mark the declaration as visible when its owning module becomes visible.656 if (Owner->NameVisibility == Module::AllVisible)657 D->setVisibleDespiteOwningModule();658 else659 Reader.HiddenNamesMap[Owner].push_back(D);660 }661 } else if (ModulePrivate) {662 D->setModuleOwnershipKind(Decl::ModuleOwnershipKind::ModulePrivate);663 }664}665 666void ASTDeclReader::VisitPragmaCommentDecl(PragmaCommentDecl *D) {667 VisitDecl(D);668 D->setLocation(readSourceLocation());669 D->CommentKind = (PragmaMSCommentKind)Record.readInt();670 std::string Arg = readString();671 memcpy(D->getTrailingObjects(), Arg.data(), Arg.size());672 D->getTrailingObjects()[Arg.size()] = '\0';673}674 675void ASTDeclReader::VisitPragmaDetectMismatchDecl(PragmaDetectMismatchDecl *D) {676 VisitDecl(D);677 D->setLocation(readSourceLocation());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 688void ASTDeclReader::VisitTranslationUnitDecl(TranslationUnitDecl *TU) {689 llvm_unreachable("Translation units are not serialized");690}691 692void ASTDeclReader::VisitNamedDecl(NamedDecl *ND) {693 VisitDecl(ND);694 ND->setDeclName(Record.readDeclarationName());695 AnonymousDeclNumber = Record.readInt();696}697 698void ASTDeclReader::VisitTypeDecl(TypeDecl *TD) {699 VisitNamedDecl(TD);700 TD->setLocStart(readSourceLocation());701 // Delay type reading until after we have fully initialized the decl.702 if (!isa<TagDecl, TypedefDecl, TypeAliasDecl>(TD))703 DeferredTypeID = Record.getGlobalTypeID(Record.readInt());704}705 706RedeclarableResult ASTDeclReader::VisitTypedefNameDecl(TypedefNameDecl *TD) {707 RedeclarableResult Redecl = VisitRedeclarable(TD);708 VisitTypeDecl(TD);709 TypeSourceInfo *TInfo = readTypeSourceInfo();710 if (Record.readInt()) { // isModed711 QualType modedT = Record.readType();712 TD->setModedTypeSourceInfo(TInfo, modedT);713 } else714 TD->setTypeSourceInfo(TInfo);715 // Read and discard the declaration for which this is a typedef name for716 // linkage, if it exists. We cannot rely on our type to pull in this decl,717 // because it might have been merged with a type from another module and718 // thus might not refer to our version of the declaration.719 readDecl();720 return Redecl;721}722 723void ASTDeclReader::VisitTypedefDecl(TypedefDecl *TD) {724 RedeclarableResult Redecl = VisitTypedefNameDecl(TD);725 mergeRedeclarable(TD, Redecl);726}727 728void ASTDeclReader::VisitTypeAliasDecl(TypeAliasDecl *TD) {729 RedeclarableResult Redecl = VisitTypedefNameDecl(TD);730 if (auto *Template = readDeclAs<TypeAliasTemplateDecl>())731 // Merged when we merge the template.732 TD->setDescribedAliasTemplate(Template);733 else734 mergeRedeclarable(TD, Redecl);735}736 737RedeclarableResult ASTDeclReader::VisitTagDecl(TagDecl *TD) {738 RedeclarableResult Redecl = VisitRedeclarable(TD);739 VisitTypeDecl(TD);740 741 TD->IdentifierNamespace = Record.readInt();742 743 BitsUnpacker TagDeclBits(Record.readInt());744 TD->setTagKind(745 static_cast<TagTypeKind>(TagDeclBits.getNextBits(/*Width=*/3)));746 TD->setCompleteDefinition(TagDeclBits.getNextBit());747 TD->setEmbeddedInDeclarator(TagDeclBits.getNextBit());748 TD->setFreeStanding(TagDeclBits.getNextBit());749 TD->setCompleteDefinitionRequired(TagDeclBits.getNextBit());750 TD->setBraceRange(readSourceRange());751 752 switch (TagDeclBits.getNextBits(/*Width=*/2)) {753 case 0:754 break;755 case 1: { // ExtInfo756 auto *Info = new (Reader.getContext()) TagDecl::ExtInfo();757 Record.readQualifierInfo(*Info);758 TD->TypedefNameDeclOrQualifier = Info;759 break;760 }761 case 2: // TypedefNameForAnonDecl762 NamedDeclForTagDecl = readDeclID();763 TypedefNameForLinkage = Record.readIdentifier();764 break;765 default:766 llvm_unreachable("unexpected tag info kind");767 }768 769 if (!isa<CXXRecordDecl>(TD))770 mergeRedeclarable(TD, Redecl);771 return Redecl;772}773 774void ASTDeclReader::VisitEnumDecl(EnumDecl *ED) {775 VisitTagDecl(ED);776 if (TypeSourceInfo *TI = readTypeSourceInfo())777 ED->setIntegerTypeSourceInfo(TI);778 else779 ED->setIntegerType(Record.readType());780 ED->setPromotionType(Record.readType());781 782 BitsUnpacker EnumDeclBits(Record.readInt());783 ED->setNumPositiveBits(EnumDeclBits.getNextBits(/*Width=*/8));784 ED->setNumNegativeBits(EnumDeclBits.getNextBits(/*Width=*/8));785 ED->setScoped(EnumDeclBits.getNextBit());786 ED->setScopedUsingClassTag(EnumDeclBits.getNextBit());787 ED->setFixed(EnumDeclBits.getNextBit());788 789 ED->setHasODRHash(true);790 ED->ODRHash = Record.readInt();791 792 // If this is a definition subject to the ODR, and we already have a793 // definition, merge this one into it.794 if (ED->isCompleteDefinition() && Reader.getContext().getLangOpts().Modules) {795 EnumDecl *&OldDef = Reader.EnumDefinitions[ED->getCanonicalDecl()];796 if (!OldDef) {797 // This is the first time we've seen an imported definition. Look for a798 // local definition before deciding that we are the first definition.799 for (auto *D : merged_redecls(ED->getCanonicalDecl())) {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));808 ED->demoteThisDefinitionToDeclaration();809 Reader.mergeDefinitionVisibility(OldDef, ED);810 // We don't want to check the ODR hash value for declarations from global811 // module fragment.812 if (!shouldSkipCheckingODR(ED) && !shouldSkipCheckingODR(OldDef) &&813 OldDef->getODRHash() != ED->getODRHash())814 Reader.PendingEnumOdrMergeFailures[OldDef].push_back(ED);815 } else {816 OldDef = ED;817 }818 }819 820 if (auto *InstED = readDeclAs<EnumDecl>()) {821 auto TSK = (TemplateSpecializationKind)Record.readInt();822 SourceLocation POI = readSourceLocation();823 ED->setInstantiationOfMemberEnum(Reader.getContext(), InstED, TSK);824 ED->getMemberSpecializationInfo()->setPointOfInstantiation(POI);825 }826}827 828RedeclarableResult ASTDeclReader::VisitRecordDeclImpl(RecordDecl *RD) {829 RedeclarableResult Redecl = VisitTagDecl(RD);830 831 BitsUnpacker RecordDeclBits(Record.readInt());832 RD->setHasFlexibleArrayMember(RecordDeclBits.getNextBit());833 RD->setAnonymousStructOrUnion(RecordDeclBits.getNextBit());834 RD->setHasObjectMember(RecordDeclBits.getNextBit());835 RD->setHasVolatileMember(RecordDeclBits.getNextBit());836 RD->setNonTrivialToPrimitiveDefaultInitialize(RecordDeclBits.getNextBit());837 RD->setNonTrivialToPrimitiveCopy(RecordDeclBits.getNextBit());838 RD->setNonTrivialToPrimitiveDestroy(RecordDeclBits.getNextBit());839 RD->setHasNonTrivialToPrimitiveDefaultInitializeCUnion(840 RecordDeclBits.getNextBit());841 RD->setHasNonTrivialToPrimitiveDestructCUnion(RecordDeclBits.getNextBit());842 RD->setHasNonTrivialToPrimitiveCopyCUnion(RecordDeclBits.getNextBit());843 RD->setHasUninitializedExplicitInitFields(RecordDeclBits.getNextBit());844 RD->setParamDestroyedInCallee(RecordDeclBits.getNextBit());845 RD->setArgPassingRestrictions(846 (RecordArgPassingKind)RecordDeclBits.getNextBits(/*Width=*/2));847 return Redecl;848}849 850void ASTDeclReader::VisitRecordDecl(RecordDecl *RD) {851 VisitRecordDeclImpl(RD);852 RD->setODRHash(Record.readInt());853 854 // Maintain the invariant of a redeclaration chain containing only855 // a single definition.856 if (RD->isCompleteDefinition()) {857 RecordDecl *Canon = static_cast<RecordDecl *>(RD->getCanonicalDecl());858 RecordDecl *&OldDef = Reader.RecordDefinitions[Canon];859 if (!OldDef) {860 // This is the first time we've seen an imported definition. Look for a861 // local definition before deciding that we are the first definition.862 for (auto *D : merged_redecls(Canon)) {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));871 RD->demoteThisDefinitionToDeclaration();872 Reader.mergeDefinitionVisibility(OldDef, RD);873 if (OldDef->getODRHash() != RD->getODRHash())874 Reader.PendingRecordOdrMergeFailures[OldDef].push_back(RD);875 } else {876 OldDef = RD;877 }878 }879}880 881void ASTDeclReader::VisitValueDecl(ValueDecl *VD) {882 VisitNamedDecl(VD);883 // For function or variable declarations, defer reading the type in case the884 // declaration has a deduced type that references an entity declared within885 // the function definition or variable initializer.886 if (isa<FunctionDecl, VarDecl>(VD))887 DeferredTypeID = Record.getGlobalTypeID(Record.readInt());888 else889 VD->setType(Record.readType());890}891 892void ASTDeclReader::VisitEnumConstantDecl(EnumConstantDecl *ECD) {893 VisitValueDecl(ECD);894 if (Record.readInt())895 ECD->setInitExpr(Record.readExpr());896 ECD->setInitVal(Reader.getContext(), Record.readAPSInt());897 mergeMergeable(ECD);898}899 900void ASTDeclReader::VisitDeclaratorDecl(DeclaratorDecl *DD) {901 VisitValueDecl(DD);902 DD->setInnerLocStart(readSourceLocation());903 if (Record.readInt()) { // hasExtInfo904 auto *Info = new (Reader.getContext()) DeclaratorDecl::ExtInfo();905 Record.readQualifierInfo(*Info);906 Info->TrailingRequiresClause = AssociatedConstraint(907 Record.readExpr(),908 UnsignedOrNone::fromInternalRepresentation(Record.readUInt32()));909 DD->DeclInfo = Info;910 }911 QualType TSIType = Record.readType();912 DD->setTypeSourceInfo(913 TSIType.isNull() ? nullptr914 : Reader.getContext().CreateTypeSourceInfo(TSIType));915}916 917void ASTDeclReader::VisitFunctionDecl(FunctionDecl *FD) {918 RedeclarableResult Redecl = VisitRedeclarable(FD);919 920 FunctionDecl *Existing = nullptr;921 922 switch ((FunctionDecl::TemplatedKind)Record.readInt()) {923 case FunctionDecl::TK_NonTemplate:924 break;925 case FunctionDecl::TK_DependentNonTemplate:926 FD->setInstantiatedFromDecl(readDeclAs<FunctionDecl>());927 break;928 case FunctionDecl::TK_FunctionTemplate: {929 auto *Template = readDeclAs<FunctionTemplateDecl>();930 Template->init(FD);931 FD->setDescribedFunctionTemplate(Template);932 break;933 }934 case FunctionDecl::TK_MemberSpecialization: {935 auto *InstFD = readDeclAs<FunctionDecl>();936 auto TSK = (TemplateSpecializationKind)Record.readInt();937 SourceLocation POI = readSourceLocation();938 FD->setInstantiationOfMemberFunction(Reader.getContext(), InstFD, TSK);939 FD->getMemberSpecializationInfo()->setPointOfInstantiation(POI);940 break;941 }942 case FunctionDecl::TK_FunctionTemplateSpecialization: {943 auto *Template = readDeclAs<FunctionTemplateDecl>();944 auto TSK = (TemplateSpecializationKind)Record.readInt();945 946 // Template arguments.947 SmallVector<TemplateArgument, 8> TemplArgs;948 Record.readTemplateArgumentList(TemplArgs, /*Canonicalize*/ true);949 950 // Template args as written.951 TemplateArgumentListInfo TemplArgsWritten;952 bool HasTemplateArgumentsAsWritten = Record.readBool();953 if (HasTemplateArgumentsAsWritten)954 Record.readTemplateArgumentListInfo(TemplArgsWritten);955 956 SourceLocation POI = readSourceLocation();957 958 ASTContext &C = Reader.getContext();959 TemplateArgumentList *TemplArgList =960 TemplateArgumentList::CreateCopy(C, TemplArgs);961 962 MemberSpecializationInfo *MSInfo = nullptr;963 if (Record.readInt()) {964 auto *FD = readDeclAs<FunctionDecl>();965 auto TSK = (TemplateSpecializationKind)Record.readInt();966 SourceLocation POI = readSourceLocation();967 968 MSInfo = new (C) MemberSpecializationInfo(FD, TSK);969 MSInfo->setPointOfInstantiation(POI);970 }971 972 FunctionTemplateSpecializationInfo *FTInfo =973 FunctionTemplateSpecializationInfo::Create(974 C, FD, Template, TSK, TemplArgList,975 HasTemplateArgumentsAsWritten ? &TemplArgsWritten : nullptr, POI,976 MSInfo);977 FD->TemplateOrSpecialization = FTInfo;978 979 if (FD->isCanonicalDecl()) { // if canonical add to template's set.980 // The template that contains the specializations set. It's not safe to981 // use getCanonicalDecl on Template since it may still be initializing.982 auto *CanonTemplate = readDeclAs<FunctionTemplateDecl>();983 // Get the InsertPos by FindNodeOrInsertPos() instead of calling984 // InsertNode(FTInfo) directly to avoid the getASTContext() call in985 // FunctionTemplateSpecializationInfo's Profile().986 // We avoid getASTContext because a decl in the parent hierarchy may987 // be initializing.988 llvm::FoldingSetNodeID ID;989 FunctionTemplateSpecializationInfo::Profile(ID, TemplArgs, C);990 void *InsertPos = nullptr;991 FunctionTemplateDecl::Common *CommonPtr = CanonTemplate->getCommonPtr();992 FunctionTemplateSpecializationInfo *ExistingInfo =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");999 Existing = ExistingInfo->getFunction();1000 }1001 }1002 break;1003 }1004 case FunctionDecl::TK_DependentFunctionTemplateSpecialization: {1005 // Templates.1006 UnresolvedSet<8> Candidates;1007 unsigned NumCandidates = Record.readInt();1008 while (NumCandidates--)1009 Candidates.addDecl(readDeclAs<NamedDecl>());1010 1011 // Templates args.1012 TemplateArgumentListInfo TemplArgsWritten;1013 bool HasTemplateArgumentsAsWritten = Record.readBool();1014 if (HasTemplateArgumentsAsWritten)1015 Record.readTemplateArgumentListInfo(TemplArgsWritten);1016 1017 FD->setDependentTemplateSpecialization(1018 Reader.getContext(), Candidates,1019 HasTemplateArgumentsAsWritten ? &TemplArgsWritten : nullptr);1020 // These are not merged; we don't need to merge redeclarations of dependent1021 // template friends.1022 break;1023 }1024 }1025 1026 VisitDeclaratorDecl(FD);1027 1028 // Attach a type to this function. Use the real type if possible, but fall1029 // back to the type as written if it involves a deduced return type.1030 if (FD->getTypeSourceInfo() && FD->getTypeSourceInfo()1031 ->getType()1032 ->castAs<FunctionType>()1033 ->getReturnType()1034 ->getContainedAutoType()) {1035 // We'll set up the real type in Visit, once we've finished loading the1036 // function.1037 FD->setType(FD->getTypeSourceInfo()->getType());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());1045 FD->IdentifierNamespace = Record.readInt();1046 1047 // FunctionDecl's body is handled last at ASTDeclReader::Visit,1048 // after everything else is read.1049 BitsUnpacker FunctionDeclBits(Record.readInt());1050 1051 FD->setCachedLinkage((Linkage)FunctionDeclBits.getNextBits(/*Width=*/3));1052 FD->setStorageClass((StorageClass)FunctionDeclBits.getNextBits(/*Width=*/3));1053 FD->setInlineSpecified(FunctionDeclBits.getNextBit());1054 FD->setImplicitlyInline(FunctionDeclBits.getNextBit());1055 FD->setHasSkippedBody(FunctionDeclBits.getNextBit());1056 FD->setVirtualAsWritten(FunctionDeclBits.getNextBit());1057 // We defer calling `FunctionDecl::setPure()` here as for methods of1058 // `CXXTemplateSpecializationDecl`s, we may not have connected up the1059 // definition (which is required for `setPure`).1060 const bool Pure = FunctionDeclBits.getNextBit();1061 FD->setHasInheritedPrototype(FunctionDeclBits.getNextBit());1062 FD->setHasWrittenPrototype(FunctionDeclBits.getNextBit());1063 FD->setDeletedAsWritten(FunctionDeclBits.getNextBit());1064 FD->setTrivial(FunctionDeclBits.getNextBit());1065 FD->setTrivialForCall(FunctionDeclBits.getNextBit());1066 FD->setDefaulted(FunctionDeclBits.getNextBit());1067 FD->setExplicitlyDefaulted(FunctionDeclBits.getNextBit());1068 FD->setIneligibleOrNotSelected(FunctionDeclBits.getNextBit());1069 FD->setConstexprKind(1070 (ConstexprSpecKind)FunctionDeclBits.getNextBits(/*Width=*/2));1071 FD->setHasImplicitReturnZero(FunctionDeclBits.getNextBit());1072 FD->setIsMultiVersion(FunctionDeclBits.getNextBit());1073 FD->setLateTemplateParsed(FunctionDeclBits.getNextBit());1074 FD->setInstantiatedFromMemberTemplate(FunctionDeclBits.getNextBit());1075 FD->setFriendConstraintRefersToEnclosingTemplate(1076 FunctionDeclBits.getNextBit());1077 FD->setUsesSEHTry(FunctionDeclBits.getNextBit());1078 FD->setIsDestroyingOperatorDelete(FunctionDeclBits.getNextBit());1079 FD->setIsTypeAwareOperatorNewOrDelete(FunctionDeclBits.getNextBit());1080 1081 FD->EndRangeLoc = readSourceLocation();1082 if (FD->isExplicitlyDefaulted())1083 FD->setDefaultLoc(readSourceLocation());1084 1085 FD->ODRHash = Record.readInt();1086 FD->setHasODRHash(true);1087 1088 if (FD->isDefaulted() || FD->isDeletedAsWritten()) {1089 // If 'Info' is nonzero, we need to read an DefaultedOrDeletedInfo; if,1090 // additionally, the second bit is also set, we also need to read1091 // a DeletedMessage for the DefaultedOrDeletedInfo.1092 if (auto Info = Record.readInt()) {1093 bool HasMessage = Info & 2;1094 StringLiteral *DeletedMessage =1095 HasMessage ? cast<StringLiteral>(Record.readExpr()) : nullptr;1096 1097 unsigned NumLookups = Record.readInt();1098 SmallVector<DeclAccessPair, 8> Lookups;1099 for (unsigned I = 0; I != NumLookups; ++I) {1100 NamedDecl *ND = Record.readDeclAs<NamedDecl>();1101 AccessSpecifier AS = (AccessSpecifier)Record.readInt();1102 Lookups.push_back(DeclAccessPair::make(ND, AS));1103 }1104 1105 FD->setDefaultedOrDeletedInfo(1106 FunctionDecl::DefaultedOrDeletedFunctionInfo::Create(1107 Reader.getContext(), Lookups, DeletedMessage));1108 }1109 }1110 1111 if (Existing)1112 MergeImpl.mergeRedeclarable(FD, Existing, Redecl);1113 else if (auto Kind = FD->getTemplatedKind();1114 Kind == FunctionDecl::TK_FunctionTemplate ||1115 Kind == FunctionDecl::TK_FunctionTemplateSpecialization) {1116 // Function Templates have their FunctionTemplateDecls merged instead of1117 // their FunctionDecls.1118 auto merge = [this, &Redecl, FD](auto &&F) {1119 auto *Existing = cast_or_null<FunctionDecl>(Redecl.getKnownMergeTarget());1120 RedeclarableResult NewRedecl(Existing ? F(Existing) : nullptr,1121 Redecl.getFirstID(), Redecl.isKeyDecl());1122 mergeRedeclarableTemplate(F(FD), NewRedecl);1123 };1124 if (Kind == FunctionDecl::TK_FunctionTemplate)1125 merge(1126 [](FunctionDecl *FD) { return FD->getDescribedFunctionTemplate(); });1127 else1128 merge([](FunctionDecl *FD) {1129 return FD->getTemplateSpecializationInfo()->getTemplate();1130 });1131 } else1132 mergeRedeclarable(FD, Redecl);1133 1134 // Defer calling `setPure` until merging above has guaranteed we've set1135 // `DefinitionData` (as this will need to access it).1136 FD->setIsPureVirtual(Pure);1137 1138 // Read in the parameters.1139 unsigned NumParams = Record.readInt();1140 SmallVector<ParmVarDecl *, 16> Params;1141 Params.reserve(NumParams);1142 for (unsigned I = 0; I != NumParams; ++I)1143 Params.push_back(readDeclAs<ParmVarDecl>());1144 FD->setParams(Reader.getContext(), Params);1145 1146 // If the declaration is a SYCL kernel entry point function as indicated by1147 // the presence of a sycl_kernel_entry_point attribute, register it so that1148 // associated metadata is recreated.1149 if (FD->hasAttr<SYCLKernelEntryPointAttr>()) {1150 auto *SKEPAttr = FD->getAttr<SYCLKernelEntryPointAttr>();1151 ASTContext &C = Reader.getContext();1152 const SYCLKernelInfo *SKI = C.findSYCLKernelInfo(SKEPAttr->getKernelName());1153 if (SKI) {1154 if (!declaresSameEntity(FD, SKI->getKernelEntryPointDecl())) {1155 Reader.Diag(FD->getLocation(), diag::err_sycl_kernel_name_conflict)1156 << SKEPAttr;1157 Reader.Diag(SKI->getKernelEntryPointDecl()->getLocation(),1158 diag::note_previous_declaration);1159 SKEPAttr->setInvalidAttr();1160 }1161 } else {1162 C.registerSYCLEntryPointFunction(FD);1163 }1164 }1165}1166 1167void ASTDeclReader::VisitObjCMethodDecl(ObjCMethodDecl *MD) {1168 VisitNamedDecl(MD);1169 if (Record.readInt()) {1170 // Load the body on-demand. Most clients won't care, because method1171 // definitions rarely show up in headers.1172 Reader.PendingBodies[MD] = GetCurrentCursorOffset();1173 }1174 MD->setSelfDecl(readDeclAs<ImplicitParamDecl>());1175 MD->setCmdDecl(readDeclAs<ImplicitParamDecl>());1176 MD->setInstanceMethod(Record.readInt());1177 MD->setVariadic(Record.readInt());1178 MD->setPropertyAccessor(Record.readInt());1179 MD->setSynthesizedAccessorStub(Record.readInt());1180 MD->setDefined(Record.readInt());1181 MD->setOverriding(Record.readInt());1182 MD->setHasSkippedBody(Record.readInt());1183 1184 MD->setIsRedeclaration(Record.readInt());1185 MD->setHasRedeclaration(Record.readInt());1186 if (MD->hasRedeclaration())1187 Reader.getContext().setObjCMethodRedeclaration(MD,1188 readDeclAs<ObjCMethodDecl>());1189 1190 MD->setDeclImplementation(1191 static_cast<ObjCImplementationControl>(Record.readInt()));1192 MD->setObjCDeclQualifier((Decl::ObjCDeclQualifier)Record.readInt());1193 MD->setRelatedResultType(Record.readInt());1194 MD->setReturnType(Record.readType());1195 MD->setReturnTypeSourceInfo(readTypeSourceInfo());1196 MD->DeclEndLoc = readSourceLocation();1197 unsigned NumParams = Record.readInt();1198 SmallVector<ParmVarDecl *, 16> Params;1199 Params.reserve(NumParams);1200 for (unsigned I = 0; I != NumParams; ++I)1201 Params.push_back(readDeclAs<ParmVarDecl>());1202 1203 MD->setSelLocsKind((SelectorLocationsKind)Record.readInt());1204 unsigned NumStoredSelLocs = Record.readInt();1205 SmallVector<SourceLocation, 16> SelLocs;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 1213void ASTDeclReader::VisitObjCTypeParamDecl(ObjCTypeParamDecl *D) {1214 VisitTypedefNameDecl(D);1215 1216 D->Variance = Record.readInt();1217 D->Index = Record.readInt();1218 D->VarianceLoc = readSourceLocation();1219 D->ColonLoc = readSourceLocation();1220}1221 1222void ASTDeclReader::VisitObjCContainerDecl(ObjCContainerDecl *CD) {1223 VisitNamedDecl(CD);1224 CD->setAtStartLoc(readSourceLocation());1225 CD->setAtEndRange(readSourceRange());1226}1227 1228ObjCTypeParamList *ASTDeclReader::ReadObjCTypeParamList() {1229 unsigned numParams = Record.readInt();1230 if (numParams == 0)1231 return nullptr;1232 1233 SmallVector<ObjCTypeParamDecl *, 4> typeParams;1234 typeParams.reserve(numParams);1235 for (unsigned i = 0; i != numParams; ++i) {1236 auto *typeParam = readDeclAs<ObjCTypeParamDecl>();1237 if (!typeParam)1238 return nullptr;1239 1240 typeParams.push_back(typeParam);1241 }1242 1243 SourceLocation lAngleLoc = readSourceLocation();1244 SourceLocation rAngleLoc = readSourceLocation();1245 1246 return ObjCTypeParamList::create(Reader.getContext(), lAngleLoc,1247 typeParams, rAngleLoc);1248}1249 1250void ASTDeclReader::ReadObjCDefinitionData(1251 struct ObjCInterfaceDecl::DefinitionData &Data) {1252 // Read the superclass.1253 Data.SuperClassTInfo = readTypeSourceInfo();1254 1255 Data.EndLoc = readSourceLocation();1256 Data.HasDesignatedInitializers = Record.readInt();1257 Data.ODRHash = Record.readInt();1258 Data.HasODRHash = true;1259 1260 // Read the directly referenced protocols and their SourceLocations.1261 unsigned NumProtocols = Record.readInt();1262 SmallVector<ObjCProtocolDecl *, 16> Protocols;1263 Protocols.reserve(NumProtocols);1264 for (unsigned I = 0; I != NumProtocols; ++I)1265 Protocols.push_back(readDeclAs<ObjCProtocolDecl>());1266 SmallVector<SourceLocation, 16> ProtoLocs;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(),1271 Reader.getContext());1272 1273 // Read the transitive closure of protocols referenced by this class.1274 NumProtocols = Record.readInt();1275 Protocols.clear();1276 Protocols.reserve(NumProtocols);1277 for (unsigned I = 0; I != NumProtocols; ++I)1278 Protocols.push_back(readDeclAs<ObjCProtocolDecl>());1279 Data.AllReferencedProtocols.set(Protocols.data(), NumProtocols,1280 Reader.getContext());1281}1282 1283void ASTDeclMerger::MergeDefinitionData(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 1298void ASTDeclReader::VisitObjCInterfaceDecl(ObjCInterfaceDecl *ID) {1299 RedeclarableResult Redecl = VisitRedeclarable(ID);1300 VisitObjCContainerDecl(ID);1301 DeferredTypeID = Record.getGlobalTypeID(Record.readInt());1302 mergeRedeclarable(ID, Redecl);1303 1304 ID->TypeParamList = ReadObjCTypeParamList();1305 if (Record.readInt()) {1306 // Read the definition.1307 ID->allocateDefinitionData();1308 1309 ReadObjCDefinitionData(ID->data());1310 ObjCInterfaceDecl *Canon = ID->getCanonicalDecl();1311 if (Canon->Data.getPointer()) {1312 // If we already have a definition, keep the definition invariant and1313 // merge the data.1314 MergeImpl.MergeDefinitionData(Canon, std::move(ID->data()));1315 ID->Data = Canon->Data;1316 } else {1317 // Set the definition data of the canonical declaration, so other1318 // redeclarations will see it.1319 ID->getCanonicalDecl()->Data = ID->Data;1320 1321 // We will rebuild this list lazily.1322 ID->setIvarList(nullptr);1323 }1324 1325 // Note that we have deserialized a definition.1326 Reader.PendingDefinitions.insert(ID);1327 1328 // Note that we've loaded this Objective-C class.1329 Reader.ObjCClassesLoaded.push_back(ID);1330 } else {1331 ID->Data = ID->getCanonicalDecl()->Data;1332 }1333}1334 1335void ASTDeclReader::VisitObjCIvarDecl(ObjCIvarDecl *IVD) {1336 VisitFieldDecl(IVD);1337 IVD->setAccessControl((ObjCIvarDecl::AccessControl)Record.readInt());1338 // This field will be built lazily.1339 IVD->setNextIvar(nullptr);1340 bool synth = Record.readInt();1341 IVD->setSynthesize(synth);1342 1343 // Check ivar redeclaration.1344 if (IVD->isInvalidDecl())1345 return;1346 // Don't check ObjCInterfaceDecl as interfaces are named and mismatches can be1347 // detected in VisitObjCInterfaceDecl. Here we are looking for redeclarations1348 // in extensions.1349 if (isa<ObjCInterfaceDecl>(IVD->getDeclContext()))1350 return;1351 ObjCInterfaceDecl *CanonIntf =1352 IVD->getContainingInterface()->getCanonicalDecl();1353 IdentifierInfo *II = IVD->getIdentifier();1354 ObjCIvarDecl *PrevIvar = CanonIntf->lookupInstanceVariable(II);1355 if (PrevIvar && PrevIvar != IVD) {1356 auto *ParentExt = dyn_cast<ObjCCategoryDecl>(IVD->getDeclContext());1357 auto *PrevParentExt =1358 dyn_cast<ObjCCategoryDecl>(PrevIvar->getDeclContext());1359 if (ParentExt && PrevParentExt) {1360 // Postpone diagnostic as we should merge identical extensions from1361 // different modules.1362 Reader1363 .PendingObjCExtensionIvarRedeclarations[std::make_pair(ParentExt,1364 PrevParentExt)]1365 .push_back(std::make_pair(IVD, PrevIvar));1366 } else if (ParentExt || PrevParentExt) {1367 // Duplicate ivars in extension + implementation are never compatible.1368 // Compatibility of implementation + implementation should be handled in1369 // VisitObjCImplementationDecl.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();1380 SmallVector<ObjCProtocolDecl *, 16> ProtoRefs;1381 ProtoRefs.reserve(NumProtoRefs);1382 for (unsigned I = 0; I != NumProtoRefs; ++I)1383 ProtoRefs.push_back(readDeclAs<ObjCProtocolDecl>());1384 SmallVector<SourceLocation, 16> ProtoLocs;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());1390 Data.ODRHash = Record.readInt();1391 Data.HasODRHash = true;1392}1393 1394void ASTDeclMerger::MergeDefinitionData(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 1409void ASTDeclReader::VisitObjCProtocolDecl(ObjCProtocolDecl *PD) {1410 RedeclarableResult Redecl = VisitRedeclarable(PD);1411 VisitObjCContainerDecl(PD);1412 mergeRedeclarable(PD, Redecl);1413 1414 if (Record.readInt()) {1415 // Read the definition.1416 PD->allocateDefinitionData();1417 1418 ReadObjCDefinitionData(PD->data());1419 1420 ObjCProtocolDecl *Canon = PD->getCanonicalDecl();1421 if (Canon->Data.getPointer()) {1422 // If we already have a definition, keep the definition invariant and1423 // merge the data.1424 MergeImpl.MergeDefinitionData(Canon, std::move(PD->data()));1425 PD->Data = Canon->Data;1426 } else {1427 // Set the definition data of the canonical declaration, so other1428 // redeclarations will see it.1429 PD->getCanonicalDecl()->Data = PD->Data;1430 }1431 // Note that we have deserialized a definition.1432 Reader.PendingDefinitions.insert(PD);1433 } else {1434 PD->Data = PD->getCanonicalDecl()->Data;1435 }1436}1437 1438void ASTDeclReader::VisitObjCAtDefsFieldDecl(ObjCAtDefsFieldDecl *FD) {1439 VisitFieldDecl(FD);1440}1441 1442void ASTDeclReader::VisitObjCCategoryDecl(ObjCCategoryDecl *CD) {1443 VisitObjCContainerDecl(CD);1444 CD->setCategoryNameLoc(readSourceLocation());1445 CD->setIvarLBraceLoc(readSourceLocation());1446 CD->setIvarRBraceLoc(readSourceLocation());1447 1448 // Note that this category has been deserialized. We do this before1449 // deserializing the interface declaration, so that it will consider this1450 /// category.1451 Reader.CategoriesDeserialized.insert(CD);1452 1453 CD->ClassInterface = readDeclAs<ObjCInterfaceDecl>();1454 CD->TypeParamList = ReadObjCTypeParamList();1455 unsigned NumProtoRefs = Record.readInt();1456 SmallVector<ObjCProtocolDecl *, 16> ProtoRefs;1457 ProtoRefs.reserve(NumProtoRefs);1458 for (unsigned I = 0; I != NumProtoRefs; ++I)1459 ProtoRefs.push_back(readDeclAs<ObjCProtocolDecl>());1460 SmallVector<SourceLocation, 16> ProtoLocs;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 // Protocols in the class extension belong to the class.1468 if (NumProtoRefs > 0 && CD->ClassInterface && CD->IsClassExtension())1469 CD->ClassInterface->mergeClassExtensionProtocolList(1470 (ObjCProtocolDecl *const *)ProtoRefs.data(), NumProtoRefs,1471 Reader.getContext());1472}1473 1474void ASTDeclReader::VisitObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *CAD) {1475 VisitNamedDecl(CAD);1476 CAD->setClassInterface(readDeclAs<ObjCInterfaceDecl>());1477}1478 1479void ASTDeclReader::VisitObjCPropertyDecl(ObjCPropertyDecl *D) {1480 VisitNamedDecl(D);1481 D->setAtLoc(readSourceLocation());1482 D->setLParenLoc(readSourceLocation());1483 QualType T = Record.readType();1484 TypeSourceInfo *TSI = readTypeSourceInfo();1485 D->setType(T, TSI);1486 D->setPropertyAttributes((ObjCPropertyAttribute::Kind)Record.readInt());1487 D->setPropertyAttributesAsWritten(1488 (ObjCPropertyAttribute::Kind)Record.readInt());1489 D->setPropertyImplementation(1490 (ObjCPropertyDecl::PropertyControl)Record.readInt());1491 DeclarationName GetterName = Record.readDeclarationName();1492 SourceLocation GetterLoc = readSourceLocation();1493 D->setGetterName(GetterName.getObjCSelector(), GetterLoc);1494 DeclarationName SetterName = Record.readDeclarationName();1495 SourceLocation SetterLoc = readSourceLocation();1496 D->setSetterName(SetterName.getObjCSelector(), SetterLoc);1497 D->setGetterMethodDecl(readDeclAs<ObjCMethodDecl>());1498 D->setSetterMethodDecl(readDeclAs<ObjCMethodDecl>());1499 D->setPropertyIvarDecl(readDeclAs<ObjCIvarDecl>());1500}1501 1502void ASTDeclReader::VisitObjCImplDecl(ObjCImplDecl *D) {1503 VisitObjCContainerDecl(D);1504 D->setClassInterface(readDeclAs<ObjCInterfaceDecl>());1505}1506 1507void ASTDeclReader::VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) {1508 VisitObjCImplDecl(D);1509 D->CategoryNameLoc = readSourceLocation();1510}1511 1512void ASTDeclReader::VisitObjCImplementationDecl(ObjCImplementationDecl *D) {1513 VisitObjCImplDecl(D);1514 D->setSuperClass(readDeclAs<ObjCInterfaceDecl>());1515 D->SuperLoc = readSourceLocation();1516 D->setIvarLBraceLoc(readSourceLocation());1517 D->setIvarRBraceLoc(readSourceLocation());1518 D->setHasNonZeroConstructors(Record.readInt());1519 D->setHasDestructors(Record.readInt());1520 D->NumIvarInitializers = Record.readInt();1521 if (D->NumIvarInitializers)1522 D->IvarInitializers = ReadGlobalOffset();1523}1524 1525void ASTDeclReader::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D) {1526 VisitDecl(D);1527 D->setAtLoc(readSourceLocation());1528 D->setPropertyDecl(readDeclAs<ObjCPropertyDecl>());1529 D->PropertyIvarDecl = readDeclAs<ObjCIvarDecl>();1530 D->IvarLoc = readSourceLocation();1531 D->setGetterMethodDecl(readDeclAs<ObjCMethodDecl>());1532 D->setSetterMethodDecl(readDeclAs<ObjCMethodDecl>());1533 D->setGetterCXXConstructor(Record.readExpr());1534 D->setSetterCXXAssignment(Record.readExpr());1535}1536 1537void ASTDeclReader::VisitFieldDecl(FieldDecl *FD) {1538 VisitDeclaratorDecl(FD);1539 FD->Mutable = Record.readInt();1540 1541 unsigned Bits = Record.readInt();1542 FD->StorageKind = Bits >> 1;1543 if (FD->StorageKind == FieldDecl::ISK_CapturedVLAType)1544 FD->CapturedVLAType =1545 cast<VariableArrayType>(Record.readType().getTypePtr());1546 else if (Bits & 1)1547 FD->setBitWidth(Record.readExpr());1548 1549 if (!FD->getDeclName() ||1550 FD->isPlaceholderVar(Reader.getContext().getLangOpts())) {1551 if (auto *Tmpl = readDeclAs<FieldDecl>())1552 Reader.getContext().setInstantiatedFromUnnamedFieldDecl(FD, Tmpl);1553 }1554 mergeMergeable(FD);1555}1556 1557void ASTDeclReader::VisitMSPropertyDecl(MSPropertyDecl *PD) {1558 VisitDeclaratorDecl(PD);1559 PD->GetterId = Record.readIdentifier();1560 PD->SetterId = Record.readIdentifier();1561}1562 1563void ASTDeclReader::VisitMSGuidDecl(MSGuidDecl *D) {1564 VisitValueDecl(D);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 // Add this GUID to the AST context's lookup structure, and merge if needed.1572 if (MSGuidDecl *Existing = Reader.getContext().MSGuidDecls.GetOrInsertNode(D))1573 Reader.getContext().setPrimaryMergedDecl(D, Existing->getCanonicalDecl());1574}1575 1576void ASTDeclReader::VisitUnnamedGlobalConstantDecl(1577 UnnamedGlobalConstantDecl *D) {1578 VisitValueDecl(D);1579 D->Value = Record.readAPValue();1580 1581 // Add this to the AST context's lookup structure, and merge if needed.1582 if (UnnamedGlobalConstantDecl *Existing =1583 Reader.getContext().UnnamedGlobalConstantDecls.GetOrInsertNode(D))1584 Reader.getContext().setPrimaryMergedDecl(D, Existing->getCanonicalDecl());1585}1586 1587void ASTDeclReader::VisitTemplateParamObjectDecl(TemplateParamObjectDecl *D) {1588 VisitValueDecl(D);1589 D->Value = Record.readAPValue();1590 1591 // Add this template parameter object to the AST context's lookup structure,1592 // and merge if needed.1593 if (TemplateParamObjectDecl *Existing =1594 Reader.getContext().TemplateParamObjectDecls.GetOrInsertNode(D))1595 Reader.getContext().setPrimaryMergedDecl(D, Existing->getCanonicalDecl());1596}1597 1598void ASTDeclReader::VisitIndirectFieldDecl(IndirectFieldDecl *FD) {1599 VisitValueDecl(FD);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<NamedDecl>();1607 1608 mergeMergeable(FD);1609}1610 1611RedeclarableResult ASTDeclReader::VisitVarDeclImpl(VarDecl *VD) {1612 RedeclarableResult Redecl = VisitRedeclarable(VD);1613 VisitDeclaratorDecl(VD);1614 1615 BitsUnpacker VarDeclBits(Record.readInt());1616 auto VarLinkage = Linkage(VarDeclBits.getNextBits(/*Width=*/3));1617 bool DefGeneratedInModule = VarDeclBits.getNextBit();1618 VD->VarDeclBits.SClass = (StorageClass)VarDeclBits.getNextBits(/*Width=*/3);1619 VD->VarDeclBits.TSCSpec = VarDeclBits.getNextBits(/*Width=*/2);1620 VD->VarDeclBits.InitStyle = VarDeclBits.getNextBits(/*Width=*/2);1621 VD->VarDeclBits.ARCPseudoStrong = VarDeclBits.getNextBit();1622 bool HasDeducedType = false;1623 if (!isa<ParmVarDecl>(VD)) {1624 VD->NonParmVarDeclBits.IsThisDeclarationADemotedDefinition =1625 VarDeclBits.getNextBit();1626 VD->NonParmVarDeclBits.ExceptionVar = VarDeclBits.getNextBit();1627 VD->NonParmVarDeclBits.NRVOVariable = VarDeclBits.getNextBit();1628 VD->NonParmVarDeclBits.CXXForRangeDecl = VarDeclBits.getNextBit();1629 1630 VD->NonParmVarDeclBits.IsInline = VarDeclBits.getNextBit();1631 VD->NonParmVarDeclBits.IsInlineSpecified = VarDeclBits.getNextBit();1632 VD->NonParmVarDeclBits.IsConstexpr = VarDeclBits.getNextBit();1633 VD->NonParmVarDeclBits.IsInitCapture = VarDeclBits.getNextBit();1634 VD->NonParmVarDeclBits.PreviousDeclInSameBlockScope =1635 VarDeclBits.getNextBit();1636 1637 VD->NonParmVarDeclBits.EscapingByref = VarDeclBits.getNextBit();1638 HasDeducedType = VarDeclBits.getNextBit();1639 VD->NonParmVarDeclBits.ImplicitParamKind =1640 VarDeclBits.getNextBits(/*Width*/ 3);1641 1642 VD->NonParmVarDeclBits.ObjCForDecl = VarDeclBits.getNextBit();1643 VD->NonParmVarDeclBits.IsCXXForRangeImplicitVar = VarDeclBits.getNextBit();1644 }1645 1646 // If this variable has a deduced type, defer reading that type until we are1647 // done deserializing this variable, because the type might refer back to the1648 // variable.1649 if (HasDeducedType)1650 Reader.PendingDeducedVarTypes.push_back({VD, DeferredTypeID});1651 else1652 VD->setType(Reader.GetType(DeferredTypeID));1653 DeferredTypeID = 0;1654 1655 VD->setCachedLinkage(VarLinkage);1656 1657 // Reconstruct the one piece of the IdentifierNamespace that we need.1658 if (VD->getStorageClass() == SC_Extern && VarLinkage != Linkage::None &&1659 VD->getLexicalDeclContext()->isFunctionOrMethod())1660 VD->setLocalExternDecl();1661 1662 if (DefGeneratedInModule) {1663 Reader.DefinitionSource[VD] =1664 Loc.F->Kind == ModuleKind::MK_MainFile ||1665 Reader.getContext().getLangOpts().BuildingPCHWithObjectFile;1666 }1667 1668 if (VD->hasAttr<BlocksAttr>()) {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, StaticDataMemberSpecialization1676 };1677 switch ((VarKind)Record.readInt()) {1678 case VarNotTemplate:1679 // Only true variables (not parameters or implicit parameters) can be1680 // merged; the other kinds are not really redeclarable at all.1681 if (!isa<ParmVarDecl>(VD) && !isa<ImplicitParamDecl>(VD) &&1682 !isa<VarTemplateSpecializationDecl>(VD))1683 mergeRedeclarable(VD, Redecl);1684 break;1685 case VarTemplate:1686 // Merged when we merge the template.1687 VD->setDescribedVarTemplate(readDeclAs<VarTemplateDecl>());1688 break;1689 case StaticDataMemberSpecialization: { // HasMemberSpecializationInfo.1690 auto *Tmpl = readDeclAs<VarDecl>();1691 auto TSK = (TemplateSpecializationKind)Record.readInt();1692 SourceLocation POI = readSourceLocation();1693 Reader.getContext().setInstantiatedFromStaticDataMember(VD, Tmpl, TSK,POI);1694 mergeRedeclarable(VD, Redecl);1695 break;1696 }1697 }1698 1699 return Redecl;1700}1701 1702void ASTDeclReader::ReadVarDeclInit(VarDecl *VD) {1703 if (uint64_t Val = Record.readInt()) {1704 EvaluatedStmt *Eval = VD->ensureEvaluatedStmt();1705 Eval->HasConstantInitialization = (Val & 2) != 0;1706 Eval->HasConstantDestruction = (Val & 4) != 0;1707 Eval->WasEvaluated = (Val & 8) != 0;1708 Eval->HasSideEffects = (Val & 16) != 0;1709 Eval->CheckedForSideEffects = true;1710 if (Eval->WasEvaluated) {1711 Eval->Evaluated = Record.readAPValue();1712 if (Eval->Evaluated.needsCleanup())1713 Reader.getContext().addDestruction(&Eval->Evaluated);1714 }1715 1716 // Store the offset of the initializer. Don't deserialize it yet: it might1717 // not be needed, and might refer back to the variable, for example if it1718 // contains a lambda.1719 Eval->Value = GetCurrentCursorOffset();1720 }1721}1722 1723void ASTDeclReader::VisitImplicitParamDecl(ImplicitParamDecl *PD) {1724 VisitVarDecl(PD);1725}1726 1727void ASTDeclReader::VisitParmVarDecl(ParmVarDecl *PD) {1728 VisitVarDecl(PD);1729 1730 unsigned scopeIndex = Record.readInt();1731 BitsUnpacker ParmVarDeclBits(Record.readInt());1732 unsigned isObjCMethodParam = ParmVarDeclBits.getNextBit();1733 unsigned scopeDepth = ParmVarDeclBits.getNextBits(/*Width=*/7);1734 unsigned declQualifier = ParmVarDeclBits.getNextBits(/*Width=*/7);1735 if (isObjCMethodParam) {1736 assert(scopeDepth == 0);1737 PD->setObjCMethodScopeInfo(scopeIndex);1738 PD->ParmVarDeclBits.ScopeDepthOrObjCQuals = declQualifier;1739 } else {1740 PD->setScopeInfo(scopeDepth, scopeIndex);1741 }1742 PD->ParmVarDeclBits.IsKNRPromoted = ParmVarDeclBits.getNextBit();1743 1744 PD->ParmVarDeclBits.HasInheritedDefaultArg = ParmVarDeclBits.getNextBit();1745 if (ParmVarDeclBits.getNextBit()) // hasUninstantiatedDefaultArg.1746 PD->setUninstantiatedDefaultArg(Record.readExpr());1747 1748 if (ParmVarDeclBits.getNextBit()) // Valid explicit object parameter1749 PD->ExplicitObjectParameterIntroducerLoc = Record.readSourceLocation();1750 1751 // FIXME: If this is a redeclaration of a function from another module, handle1752 // inheritance of default arguments.1753}1754 1755void ASTDeclReader::VisitDecompositionDecl(DecompositionDecl *DD) {1756 VisitVarDecl(DD);1757 auto **BDs = DD->getTrailingObjects();1758 for (unsigned I = 0; I != DD->NumBindings; ++I) {1759 BDs[I] = readDeclAs<BindingDecl>();1760 BDs[I]->setDecomposedDecl(DD);1761 }1762}1763 1764void ASTDeclReader::VisitBindingDecl(BindingDecl *BD) {1765 VisitValueDecl(BD);1766 BD->Binding = Record.readExpr();1767}1768 1769void ASTDeclReader::VisitFileScopeAsmDecl(FileScopeAsmDecl *AD) {1770 VisitDecl(AD);1771 AD->setAsmString(cast<StringLiteral>(Record.readExpr()));1772 AD->setRParenLoc(readSourceLocation());1773}1774 1775void ASTDeclReader::VisitTopLevelStmtDecl(TopLevelStmtDecl *D) {1776 VisitDecl(D);1777 D->Statement = Record.readStmt();1778}1779 1780void ASTDeclReader::VisitBlockDecl(BlockDecl *BD) {1781 VisitDecl(BD);1782 BD->setBody(cast_or_null<CompoundStmt>(Record.readStmt()));1783 BD->setSignatureAsWritten(readTypeSourceInfo());1784 unsigned NumParams = Record.readInt();1785 SmallVector<ParmVarDecl *, 16> Params;1786 Params.reserve(NumParams);1787 for (unsigned I = 0; I != NumParams; ++I)1788 Params.push_back(readDeclAs<ParmVarDecl>());1789 BD->setParams(Params);1790 1791 BD->setIsVariadic(Record.readInt());1792 BD->setBlockMissingReturnType(Record.readInt());1793 BD->setIsConversionFromLambda(Record.readInt());1794 BD->setDoesNotEscape(Record.readInt());1795 BD->setCanAvoidCopyToHeap(Record.readInt());1796 1797 bool capturesCXXThis = Record.readInt();1798 unsigned numCaptures = Record.readInt();1799 SmallVector<BlockDecl::Capture, 16> captures;1800 captures.reserve(numCaptures);1801 for (unsigned i = 0; i != numCaptures; ++i) {1802 auto *decl = readDeclAs<VarDecl>();1803 unsigned flags = Record.readInt();1804 bool byRef = (flags & 1);1805 bool nested = (flags & 2);1806 Expr *copyExpr = ((flags & 4) ? Record.readExpr() : nullptr);1807 1808 captures.push_back(BlockDecl::Capture(decl, byRef, nested, copyExpr));1809 }1810 BD->setCaptures(Reader.getContext(), captures, capturesCXXThis);1811}1812 1813void ASTDeclReader::VisitOutlinedFunctionDecl(OutlinedFunctionDecl *D) {1814 // NumParams is deserialized by OutlinedFunctionDecl::CreateDeserialized().1815 VisitDecl(D);1816 for (unsigned I = 0; I < D->NumParams; ++I)1817 D->setParam(I, readDeclAs<ImplicitParamDecl>());1818 D->setNothrow(Record.readInt() != 0);1819 D->setBody(cast_or_null<Stmt>(Record.readStmt()));1820}1821 1822void ASTDeclReader::VisitCapturedDecl(CapturedDecl *CD) {1823 VisitDecl(CD);1824 unsigned ContextParamPos = Record.readInt();1825 CD->setNothrow(Record.readInt() != 0);1826 // Body is set by VisitCapturedStmt.1827 for (unsigned I = 0; I < CD->NumParams; ++I) {1828 if (I != ContextParamPos)1829 CD->setParam(I, readDeclAs<ImplicitParamDecl>());1830 else1831 CD->setContextParam(I, readDeclAs<ImplicitParamDecl>());1832 }1833}1834 1835void ASTDeclReader::VisitLinkageSpecDecl(LinkageSpecDecl *D) {1836 VisitDecl(D);1837 D->setLanguage(static_cast<LinkageSpecLanguageIDs>(Record.readInt()));1838 D->setExternLoc(readSourceLocation());1839 D->setRBraceLoc(readSourceLocation());1840}1841 1842void ASTDeclReader::VisitExportDecl(ExportDecl *D) {1843 VisitDecl(D);1844 D->RBraceLoc = readSourceLocation();1845}1846 1847void ASTDeclReader::VisitLabelDecl(LabelDecl *D) {1848 VisitNamedDecl(D);1849 D->setLocStart(readSourceLocation());1850}1851 1852void ASTDeclReader::VisitNamespaceDecl(NamespaceDecl *D) {1853 RedeclarableResult Redecl = VisitRedeclarable(D);1854 VisitNamedDecl(D);1855 1856 BitsUnpacker NamespaceDeclBits(Record.readInt());1857 D->setInline(NamespaceDeclBits.getNextBit());1858 D->setNested(NamespaceDeclBits.getNextBit());1859 D->LocStart = readSourceLocation();1860 D->RBraceLoc = readSourceLocation();1861 1862 // Defer loading the anonymous namespace until we've finished merging1863 // this namespace; loading it might load a later declaration of the1864 // same namespace, and we have an invariant that older declarations1865 // get merged before newer ones try to merge.1866 GlobalDeclID AnonNamespace;1867 if (Redecl.getFirstID() == ThisDeclID)1868 AnonNamespace = readDeclID();1869 1870 mergeRedeclarable(D, Redecl);1871 1872 if (AnonNamespace.isValid()) {1873 // Each module has its own anonymous namespace, which is disjoint from1874 // any other module's anonymous namespaces, so don't attach the anonymous1875 // namespace at all.1876 auto *Anon = cast<NamespaceDecl>(Reader.GetDecl(AnonNamespace));1877 if (!Record.isModule())1878 D->setAnonymousNamespace(Anon);1879 }1880}1881 1882void ASTDeclReader::VisitHLSLBufferDecl(HLSLBufferDecl *D) {1883 VisitNamedDecl(D);1884 LookupBlockOffsets Offsets;1885 VisitDeclContext(D, Offsets);1886 D->IsCBuffer = Record.readBool();1887 D->KwLoc = readSourceLocation();1888 D->LBraceLoc = readSourceLocation();1889 D->RBraceLoc = readSourceLocation();1890}1891 1892void ASTDeclReader::VisitNamespaceAliasDecl(NamespaceAliasDecl *D) {1893 RedeclarableResult Redecl = VisitRedeclarable(D);1894 VisitNamedDecl(D);1895 D->NamespaceLoc = readSourceLocation();1896 D->IdentLoc = readSourceLocation();1897 D->QualifierLoc = Record.readNestedNameSpecifierLoc();1898 D->Namespace = readDeclAs<NamespaceBaseDecl>();1899 mergeRedeclarable(D, Redecl);1900}1901 1902void ASTDeclReader::VisitUsingDecl(UsingDecl *D) {1903 VisitNamedDecl(D);1904 D->setUsingLoc(readSourceLocation());1905 D->QualifierLoc = Record.readNestedNameSpecifierLoc();1906 D->DNLoc = Record.readDeclarationNameLoc(D->getDeclName());1907 D->FirstUsingShadow.setPointer(readDeclAs<UsingShadowDecl>());1908 D->setTypename(Record.readInt());1909 if (auto *Pattern = readDeclAs<NamedDecl>())1910 Reader.getContext().setInstantiatedFromUsingDecl(D, Pattern);1911 mergeMergeable(D);1912}1913 1914void ASTDeclReader::VisitUsingEnumDecl(UsingEnumDecl *D) {1915 VisitNamedDecl(D);1916 D->setUsingLoc(readSourceLocation());1917 D->setEnumLoc(readSourceLocation());1918 D->setEnumType(Record.readTypeSourceInfo());1919 D->FirstUsingShadow.setPointer(readDeclAs<UsingShadowDecl>());1920 if (auto *Pattern = readDeclAs<UsingEnumDecl>())1921 Reader.getContext().setInstantiatedFromUsingEnumDecl(D, Pattern);1922 mergeMergeable(D);1923}1924 1925void ASTDeclReader::VisitUsingPackDecl(UsingPackDecl *D) {1926 VisitNamedDecl(D);1927 D->InstantiatedFrom = readDeclAs<NamedDecl>();1928 auto **Expansions = D->getTrailingObjects();1929 for (unsigned I = 0; I != D->NumExpansions; ++I)1930 Expansions[I] = readDeclAs<NamedDecl>();1931 mergeMergeable(D);1932}1933 1934void ASTDeclReader::VisitUsingShadowDecl(UsingShadowDecl *D) {1935 RedeclarableResult Redecl = VisitRedeclarable(D);1936 VisitNamedDecl(D);1937 D->Underlying = readDeclAs<NamedDecl>();1938 D->IdentifierNamespace = Record.readInt();1939 D->UsingOrNextShadow = readDeclAs<NamedDecl>();1940 auto *Pattern = readDeclAs<UsingShadowDecl>();1941 if (Pattern)1942 Reader.getContext().setInstantiatedFromUsingShadowDecl(D, Pattern);1943 mergeRedeclarable(D, Redecl);1944}1945 1946void ASTDeclReader::VisitConstructorUsingShadowDecl(1947 ConstructorUsingShadowDecl *D) {1948 VisitUsingShadowDecl(D);1949 D->NominatedBaseClassShadowDecl = readDeclAs<ConstructorUsingShadowDecl>();1950 D->ConstructedBaseClassShadowDecl = readDeclAs<ConstructorUsingShadowDecl>();1951 D->IsVirtual = Record.readInt();1952}1953 1954void ASTDeclReader::VisitUsingDirectiveDecl(UsingDirectiveDecl *D) {1955 VisitNamedDecl(D);1956 D->UsingLoc = readSourceLocation();1957 D->NamespaceLoc = readSourceLocation();1958 D->QualifierLoc = Record.readNestedNameSpecifierLoc();1959 D->NominatedNamespace = readDeclAs<NamedDecl>();1960 D->CommonAncestor = readDeclAs<DeclContext>();1961}1962 1963void ASTDeclReader::VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D) {1964 VisitValueDecl(D);1965 D->setUsingLoc(readSourceLocation());1966 D->QualifierLoc = Record.readNestedNameSpecifierLoc();1967 D->DNLoc = Record.readDeclarationNameLoc(D->getDeclName());1968 D->EllipsisLoc = readSourceLocation();1969 mergeMergeable(D);1970}1971 1972void ASTDeclReader::VisitUnresolvedUsingTypenameDecl(1973 UnresolvedUsingTypenameDecl *D) {1974 VisitTypeDecl(D);1975 D->TypenameLocation = readSourceLocation();1976 D->QualifierLoc = Record.readNestedNameSpecifierLoc();1977 D->EllipsisLoc = readSourceLocation();1978 mergeMergeable(D);1979}1980 1981void ASTDeclReader::VisitUnresolvedUsingIfExistsDecl(1982 UnresolvedUsingIfExistsDecl *D) {1983 VisitNamedDecl(D);1984}1985 1986void ASTDeclReader::ReadCXXDefinitionData(1987 struct CXXRecordDecl::DefinitionData &Data, const CXXRecordDecl *D,1988 Decl *LambdaContext, unsigned IndexInLambdaContext) {1989 1990 BitsUnpacker CXXRecordDeclBits = Record.readInt();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 FIELD1999 2000 // Note: the caller has deserialized the IsLambda bit already.2001 Data.ODRHash = Record.readInt();2002 Data.HasODRHash = true;2003 2004 if (Record.readInt()) {2005 Reader.DefinitionSource[D] =2006 Loc.F->Kind == ModuleKind::MK_MainFile ||2007 Reader.getContext().getLangOpts().BuildingPCHWithObjectFile;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 (!Data.IsLambda) {2017 assert(!LambdaContext && !IndexInLambdaContext &&2018 "given lambda context for non-lambda");2019 2020 Data.NumBases = Record.readInt();2021 if (Data.NumBases)2022 Data.Bases = ReadGlobalOffset();2023 2024 Data.NumVBases = Record.readInt();2025 if (Data.NumVBases)2026 Data.VBases = ReadGlobalOffset();2027 2028 Data.FirstFriend = readDeclID().getRawValue();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(/*Width=*/2);2036 Lambda.IsGenericLambda = LambdaBits.getNextBit();2037 Lambda.CaptureDefault = LambdaBits.getNextBits(/*Width=*/2);2038 Lambda.NumCaptures = LambdaBits.getNextBits(/*Width=*/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();2058 auto Kind =2059 static_cast<LambdaCaptureKind>(CaptureBits.getNextBits(/*Width=*/3));2060 switch (Kind) {2061 case LCK_StarThis:2062 case LCK_This:2063 case LCK_VLAType:2064 new (ToCapture)2065 Capture(Loc, IsImplicit, Kind, nullptr, SourceLocation());2066 ToCapture++;2067 break;2068 case LCK_ByCopy:2069 case LCK_ByRef:2070 auto *Var = readDeclAs<ValueDecl>();2071 SourceLocation EllipsisLoc = readSourceLocation();2072 new (ToCapture) Capture(Loc, IsImplicit, Kind, Var, EllipsisLoc);2073 ToCapture++;2074 break;2075 }2076 }2077 }2078}2079 2080void ASTDeclMerger::MergeDefinitionData(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 // Track that we merged the definitions.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 // We faked up this definition data because we found a class for which we'd2101 // not yet loaded the definition. Replace it with the real thing now.2102 assert(!DD.IsLambda && !MergeDD.IsLambda && "faked up lambda definition?");2103 PFDI->second = ASTReader::PendingFakeDefinitionKind::FakeLoaded;2104 2105 // Don't change which declaration is the definition; that is required2106 // to be invariant once we select it.2107 auto *Def = DD.Definition;2108 DD = std::move(MergeDD);2109 DD.Definition = Def;2110 while ((Def = Def->getPreviousDecl()))2111 cast<CXXRecordDecl>(Def)->DefinitionData = ⅅ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"2123 NO_MERGE(IsLambda)2124 #undef NO_MERGE2125 #undef MERGE_OR2126 2127 if (DD.NumBases != MergeDD.NumBases || DD.NumVBases != MergeDD.NumVBases)2128 DetectedOdrViolation = true;2129 // FIXME: Issue a diagnostic if the base classes don't match when we come2130 // to lazily load them.2131 2132 // FIXME: Issue a diagnostic if the list of conversion functions doesn't2133 // match when we come to lazily load them.2134 if (MergeDD.ComputedVisibleConversions && !DD.ComputedVisibleConversions) {2135 DD.VisibleConversions = std::move(MergeDD.VisibleConversions);2136 DD.ComputedVisibleConversions = true;2137 }2138 2139 // FIXME: Issue a diagnostic if FirstFriend doesn't match when we come to2140 // lazily load it.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];2159 DetectedOdrViolation |= Cap1.getCaptureKind() != Cap2.getCaptureKind();2160 }2161 Lambda1.AddCaptureList(Reader.getContext(), Lambda2.Captures.front());2162 }2163 }2164 2165 // We don't want to check ODR for decls in the global module fragment.2166 if (shouldSkipCheckingODR(MergeDD.Definition) || shouldSkipCheckingODR(D))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;2182 ASTContext &C = Reader.getContext();2183 2184 // Determine whether this is a lambda closure type, so that we can2185 // allocate the appropriate DefinitionData structure.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(2191 D, nullptr, CXXRecordDecl::LDK_Unknown, false, LCD_None);2192 else2193 DD = new (C) struct CXXRecordDecl::DefinitionData(D);2194 2195 CXXRecordDecl *Canon = D->getCanonicalDecl();2196 // Set decl definition data before reading it, so that during deserialization2197 // when we read CXXRecordDecl, it already has definition data and we don't2198 // set fake one.2199 if (!Canon->DefinitionData)2200 Canon->DefinitionData = DD;2201 D->DefinitionData = Canon->DefinitionData;2202 ReadCXXDefinitionData(*DD, D, LambdaContext, IndexInLambdaContext);2203 2204 // Mark this declaration as being a definition.2205 D->setCompleteDefinition(true);2206 2207 // We might already have a different definition for this record. This can2208 // happen either because we're reading an update record, or because we've2209 // already done some merging. Either way, just merge into it.2210 if (Canon->DefinitionData != DD) {2211 MergeImpl.MergeDefinitionData(Canon, std::move(*DD));2212 return;2213 }2214 2215 // If this is not the first declaration or is an update record, we can have2216 // other redeclarations already. Make a note that we need to propagate the2217 // DefinitionData pointer onto them.2218 if (Update || Canon != D)2219 Reader.PendingDefinitions.insert(D);2220}2221 2222RedeclarableResult ASTDeclReader::VisitCXXRecordDeclImpl(CXXRecordDecl *D) {2223 RedeclarableResult Redecl = VisitRecordDeclImpl(D);2224 2225 ASTContext &C = Reader.getContext();2226 2227 enum CXXRecKind {2228 CXXRecNotTemplate = 0,2229 CXXRecTemplate,2230 CXXRecMemberSpecialization,2231 CXXLambda2232 };2233 2234 Decl *LambdaContext = nullptr;2235 unsigned IndexInLambdaContext = 0;2236 2237 switch ((CXXRecKind)Record.readInt()) {2238 case CXXRecNotTemplate:2239 // Merged when we merge the folding set entry in the primary template.2240 if (!isa<ClassTemplateSpecializationDecl>(D))2241 mergeRedeclarable(D, Redecl);2242 break;2243 case CXXRecTemplate: {2244 // Merged when we merge the template.2245 auto *Template = readDeclAs<ClassTemplateDecl>();2246 D->TemplateOrInstantiation = Template;2247 break;2248 }2249 case CXXRecMemberSpecialization: {2250 auto *RD = readDeclAs<CXXRecordDecl>();2251 auto TSK = (TemplateSpecializationKind)Record.readInt();2252 SourceLocation POI = readSourceLocation();2253 MemberSpecializationInfo *MSI = new (C) MemberSpecializationInfo(RD, TSK);2254 MSI->setPointOfInstantiation(POI);2255 D->TemplateOrInstantiation = MSI;2256 mergeRedeclarable(D, Redecl);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 else2266 // If we don't have a mangling context, treat this like any other2267 // declaration.2268 mergeRedeclarable(D, Redecl);2269 break;2270 }2271 }2272 2273 bool WasDefinition = Record.readInt();2274 if (WasDefinition)2275 ReadCXXRecordDefinition(D, /*Update=*/false, LambdaContext,2276 IndexInLambdaContext);2277 else2278 // Propagate DefinitionData pointer from the canonical declaration.2279 D->DefinitionData = D->getCanonicalDecl()->DefinitionData;2280 2281 // Lazily load the key function to avoid deserializing every method so we can2282 // compute it.2283 if (WasDefinition) {2284 GlobalDeclID KeyFn = readDeclID();2285 if (KeyFn.isValid() && D->isCompleteDefinition())2286 // FIXME: This is wrong for the ARM ABI, where some other module may have2287 // made this function no longer be a key function. We need an update2288 // record or similar for that case.2289 C.KeyFunctions[D] = KeyFn.getRawValue();2290 }2291 2292 return Redecl;2293}2294 2295void ASTDeclReader::VisitCXXDeductionGuideDecl(CXXDeductionGuideDecl *D) {2296 D->setExplicitSpecifier(Record.readExplicitSpec());2297 D->Ctor = readDeclAs<CXXConstructorDecl>();2298 VisitFunctionDecl(D);2299 D->setDeductionCandidateKind(2300 static_cast<DeductionCandidate>(Record.readInt()));2301 D->setSourceDeductionGuide(readDeclAs<CXXDeductionGuideDecl>());2302 D->setSourceDeductionGuideKind(2303 static_cast<CXXDeductionGuideDecl::SourceDeductionGuideKind>(2304 Record.readInt()));2305}2306 2307void ASTDeclReader::VisitCXXMethodDecl(CXXMethodDecl *D) {2308 VisitFunctionDecl(D);2309 2310 unsigned NumOverridenMethods = Record.readInt();2311 if (D->isCanonicalDecl()) {2312 while (NumOverridenMethods--) {2313 // Avoid invariant checking of CXXMethodDecl::addOverriddenMethod,2314 // MD may be initializing.2315 if (auto *MD = readDeclAs<CXXMethodDecl>())2316 Reader.getContext().addOverriddenMethod(D, MD->getCanonicalDecl());2317 }2318 } else {2319 // We don't care about which declarations this used to override; we get2320 // the relevant information from the canonical declaration.2321 Record.skipInts(NumOverridenMethods);2322 }2323}2324 2325void ASTDeclReader::VisitCXXConstructorDecl(CXXConstructorDecl *D) {2326 // We need the inherited constructor information to merge the declaration,2327 // so we have to read it before we call VisitCXXMethodDecl.2328 D->setExplicitSpecifier(Record.readExplicitSpec());2329 if (D->isInheritingConstructor()) {2330 auto *Shadow = readDeclAs<ConstructorUsingShadowDecl>();2331 auto *Ctor = readDeclAs<CXXConstructorDecl>();2332 *D->getTrailingObjects<InheritedConstructor>() =2333 InheritedConstructor(Shadow, Ctor);2334 }2335 2336 VisitCXXMethodDecl(D);2337}2338 2339void ASTDeclReader::VisitCXXDestructorDecl(CXXDestructorDecl *D) {2340 VisitCXXMethodDecl(D);2341 2342 CXXDestructorDecl *Canon = D->getCanonicalDecl();2343 if (auto *OperatorDelete = readDeclAs<FunctionDecl>()) {2344 auto *ThisArg = Record.readExpr();2345 // FIXME: Check consistency if we have an old and new operator delete.2346 if (!Canon->OperatorDelete) {2347 Canon->OperatorDelete = OperatorDelete;2348 Canon->OperatorDeleteThisArg = ThisArg;2349 }2350 }2351 if (auto *OperatorGlobDelete = readDeclAs<FunctionDecl>()) {2352 if (!Canon->OperatorGlobalDelete) {2353 Canon->OperatorGlobalDelete = OperatorGlobDelete;2354 }2355 }2356}2357 2358void ASTDeclReader::VisitCXXConversionDecl(CXXConversionDecl *D) {2359 D->setExplicitSpecifier(Record.readExplicitSpec());2360 VisitCXXMethodDecl(D);2361}2362 2363void ASTDeclReader::VisitImportDecl(ImportDecl *D) {2364 VisitDecl(D);2365 D->ImportedModule = readModule();2366 D->setImportComplete(Record.readInt());2367 auto *StoredLocs = D->getTrailingObjects();2368 for (unsigned I = 0, N = Record.back(); I != N; ++I)2369 StoredLocs[I] = readSourceLocation();2370 Record.skipInts(1); // The number of stored source locations.2371}2372 2373void ASTDeclReader::VisitAccessSpecDecl(AccessSpecDecl *D) {2374 VisitDecl(D);2375 D->setColonLoc(readSourceLocation());2376}2377 2378void ASTDeclReader::VisitFriendDecl(FriendDecl *D) {2379 VisitDecl(D);2380 if (Record.readInt()) // hasFriendDecl2381 D->Friend = readDeclAs<NamedDecl>();2382 else2383 D->Friend = readTypeSourceInfo();2384 for (unsigned i = 0; i != D->NumTPLists; ++i)2385 D->getTrailingObjects()[i] = Record.readTemplateParameterList();2386 D->NextFriend = readDeclID().getRawValue();2387 D->UnsupportedFriend = (Record.readInt() != 0);2388 D->FriendLoc = readSourceLocation();2389 D->EllipsisLoc = readSourceLocation();2390}2391 2392void ASTDeclReader::VisitFriendTemplateDecl(FriendTemplateDecl *D) {2393 VisitDecl(D);2394 unsigned NumParams = Record.readInt();2395 D->NumParams = NumParams;2396 D->Params = new (Reader.getContext()) TemplateParameterList *[NumParams];2397 for (unsigned i = 0; i != NumParams; ++i)2398 D->Params[i] = Record.readTemplateParameterList();2399 if (Record.readInt()) // HasFriendDecl2400 D->Friend = readDeclAs<NamedDecl>();2401 else2402 D->Friend = readTypeSourceInfo();2403 D->FriendLoc = readSourceLocation();2404}2405 2406void ASTDeclReader::VisitTemplateDecl(TemplateDecl *D) {2407 VisitNamedDecl(D);2408 2409 assert(!D->TemplateParams && "TemplateParams already set!");2410 D->TemplateParams = Record.readTemplateParameterList();2411 D->init(readDeclAs<NamedDecl>());2412}2413 2414void ASTDeclReader::VisitConceptDecl(ConceptDecl *D) {2415 VisitTemplateDecl(D);2416 D->ConstraintExpr = Record.readExpr();2417 mergeMergeable(D);2418}2419 2420void ASTDeclReader::VisitImplicitConceptSpecializationDecl(2421 ImplicitConceptSpecializationDecl *D) {2422 // The size of the template list was read during creation of the Decl, so we2423 // don't have to re-read it here.2424 VisitDecl(D);2425 llvm::SmallVector<TemplateArgument, 4> Args;2426 for (unsigned I = 0; I < D->NumTemplateArgs; ++I)2427 Args.push_back(Record.readTemplateArgument(/*Canonicalize=*/false));2428 D->setTemplateArguments(Args);2429}2430 2431void ASTDeclReader::VisitRequiresExprBodyDecl(RequiresExprBodyDecl *D) {2432}2433 2434void ASTDeclReader::ReadSpecializations(ModuleFile &M, Decl *D,2435 llvm::BitstreamCursor &DeclsCursor,2436 bool IsPartial) {2437 uint64_t Offset = ReadLocalOffset();2438 bool Failed =2439 Reader.ReadSpecializations(M, DeclsCursor, Offset, D, IsPartial);2440 (void)Failed;2441 assert(!Failed);2442}2443 2444RedeclarableResult2445ASTDeclReader::VisitRedeclarableTemplateDecl(RedeclarableTemplateDecl *D) {2446 RedeclarableResult Redecl = VisitRedeclarable(D);2447 2448 // Make sure we've allocated the Common pointer first. We do this before2449 // VisitTemplateDecl so that getCommonPtr() can be used during initialization.2450 RedeclarableTemplateDecl *CanonD = D->getCanonicalDecl();2451 if (!CanonD->Common) {2452 CanonD->Common = CanonD->newCommon(Reader.getContext());2453 Reader.PendingDefinitions.insert(CanonD);2454 }2455 D->Common = CanonD->Common;2456 2457 // If this is the first declaration of the template, fill in the information2458 // for the 'common' pointer.2459 if (ThisDeclID == Redecl.getFirstID()) {2460 if (auto *RTD = readDeclAs<RedeclarableTemplateDecl>()) {2461 assert(RTD->getKind() == D->getKind() &&2462 "InstantiatedFromMemberTemplate kind mismatch");2463 D->setInstantiatedFromMemberTemplate(RTD);2464 if (Record.readInt())2465 D->setMemberSpecialization();2466 }2467 }2468 2469 VisitTemplateDecl(D);2470 D->IdentifierNamespace = Record.readInt();2471 2472 return Redecl;2473}2474 2475void ASTDeclReader::VisitClassTemplateDecl(ClassTemplateDecl *D) {2476 RedeclarableResult Redecl = VisitRedeclarableTemplateDecl(D);2477 mergeRedeclarableTemplate(D, Redecl);2478 2479 if (ThisDeclID == Redecl.getFirstID()) {2480 // This ClassTemplateDecl owns a CommonPtr; read it to keep track of all of2481 // the specializations.2482 ReadSpecializations(*Loc.F, D, Loc.F->DeclsCursor, /*IsPartial=*/false);2483 ReadSpecializations(*Loc.F, D, Loc.F->DeclsCursor, /*IsPartial=*/true);2484 }2485}2486 2487void ASTDeclReader::VisitBuiltinTemplateDecl(BuiltinTemplateDecl *D) {2488 llvm_unreachable("BuiltinTemplates are not serialized");2489}2490 2491/// TODO: Unify with ClassTemplateDecl version?2492/// May require unifying ClassTemplateDecl and2493/// VarTemplateDecl beyond TemplateDecl...2494void ASTDeclReader::VisitVarTemplateDecl(VarTemplateDecl *D) {2495 RedeclarableResult Redecl = VisitRedeclarableTemplateDecl(D);2496 mergeRedeclarableTemplate(D, Redecl);2497 2498 if (ThisDeclID == Redecl.getFirstID()) {2499 // This VarTemplateDecl owns a CommonPtr; read it to keep track of all of2500 // the specializations.2501 ReadSpecializations(*Loc.F, D, Loc.F->DeclsCursor, /*IsPartial=*/false);2502 ReadSpecializations(*Loc.F, D, Loc.F->DeclsCursor, /*IsPartial=*/true);2503 }2504}2505 2506RedeclarableResult ASTDeclReader::VisitClassTemplateSpecializationDeclImpl(2507 ClassTemplateSpecializationDecl *D) {2508 RedeclarableResult Redecl = VisitCXXRecordDeclImpl(D);2509 2510 ASTContext &C = Reader.getContext();2511 if (Decl *InstD = readDecl()) {2512 if (auto *CTD = dyn_cast<ClassTemplateDecl>(InstD)) {2513 D->SpecializedTemplate = CTD;2514 } else {2515 SmallVector<TemplateArgument, 8> TemplArgs;2516 Record.readTemplateArgumentList(TemplArgs);2517 TemplateArgumentList *ArgList2518 = TemplateArgumentList::CreateCopy(C, TemplArgs);2519 auto *PS =2520 new (C) ClassTemplateSpecializationDecl::2521 SpecializedPartialSpecialization();2522 PS->PartialSpecialization2523 = cast<ClassTemplatePartialSpecializationDecl>(InstD);2524 PS->TemplateArgs = ArgList;2525 D->SpecializedTemplate = PS;2526 }2527 }2528 2529 SmallVector<TemplateArgument, 8> TemplArgs;2530 Record.readTemplateArgumentList(TemplArgs, /*Canonicalize*/ true);2531 D->TemplateArgs = TemplateArgumentList::CreateCopy(C, TemplArgs);2532 D->PointOfInstantiation = readSourceLocation();2533 D->SpecializationKind = (TemplateSpecializationKind)Record.readInt();2534 D->StrictPackMatch = Record.readBool();2535 2536 bool writtenAsCanonicalDecl = Record.readInt();2537 if (writtenAsCanonicalDecl) {2538 auto *CanonPattern = readDeclAs<ClassTemplateDecl>();2539 if (D->isCanonicalDecl()) { // It's kept in the folding set.2540 // Set this as, or find, the canonical declaration for this specialization2541 ClassTemplateSpecializationDecl *CanonSpec;2542 if (auto *Partial = dyn_cast<ClassTemplatePartialSpecializationDecl>(D)) {2543 CanonSpec = CanonPattern->getCommonPtr()->PartialSpecializations2544 .GetOrInsertNode(Partial);2545 } else {2546 CanonSpec =2547 CanonPattern->getCommonPtr()->Specializations.GetOrInsertNode(D);2548 }2549 // If there was already a canonical specialization, merge into it.2550 if (CanonSpec != D) {2551 MergeImpl.mergeRedeclarable<TagDecl>(D, CanonSpec, Redecl);2552 2553 // This declaration might be a definition. Merge with any existing2554 // definition.2555 if (auto *DDD = D->DefinitionData) {2556 if (CanonSpec->DefinitionData)2557 MergeImpl.MergeDefinitionData(CanonSpec, std::move(*DDD));2558 else2559 CanonSpec->DefinitionData = D->DefinitionData;2560 }2561 D->DefinitionData = CanonSpec->DefinitionData;2562 }2563 }2564 }2565 2566 // extern/template keyword locations for explicit instantiations2567 if (Record.readBool()) {2568 auto *ExplicitInfo = new (C) ExplicitInstantiationInfo;2569 ExplicitInfo->ExternKeywordLoc = readSourceLocation();2570 ExplicitInfo->TemplateKeywordLoc = readSourceLocation();2571 D->ExplicitInfo = ExplicitInfo;2572 }2573 2574 if (Record.readBool())2575 D->setTemplateArgsAsWritten(Record.readASTTemplateArgumentListInfo());2576 2577 return Redecl;2578}2579 2580void ASTDeclReader::VisitClassTemplatePartialSpecializationDecl(2581 ClassTemplatePartialSpecializationDecl *D) {2582 // We need to read the template params first because redeclarable is going to2583 // need them for profiling2584 TemplateParameterList *Params = Record.readTemplateParameterList();2585 D->TemplateParams = Params;2586 2587 RedeclarableResult Redecl = VisitClassTemplateSpecializationDeclImpl(D);2588 2589 // These are read/set from/to the first declaration.2590 if (ThisDeclID == Redecl.getFirstID()) {2591 D->InstantiatedFromMember.setPointer(2592 readDeclAs<ClassTemplatePartialSpecializationDecl>());2593 D->InstantiatedFromMember.setInt(Record.readInt());2594 }2595}2596 2597void ASTDeclReader::VisitFunctionTemplateDecl(FunctionTemplateDecl *D) {2598 RedeclarableResult Redecl = VisitRedeclarableTemplateDecl(D);2599 2600 if (ThisDeclID == Redecl.getFirstID()) {2601 // This FunctionTemplateDecl owns a CommonPtr; read it.2602 ReadSpecializations(*Loc.F, D, Loc.F->DeclsCursor, /*IsPartial=*/false);2603 }2604}2605 2606/// TODO: Unify with ClassTemplateSpecializationDecl version?2607/// May require unifying ClassTemplate(Partial)SpecializationDecl and2608/// VarTemplate(Partial)SpecializationDecl with a new data2609/// structure Template(Partial)SpecializationDecl, and2610/// using Template(Partial)SpecializationDecl as input type.2611RedeclarableResult ASTDeclReader::VisitVarTemplateSpecializationDeclImpl(2612 VarTemplateSpecializationDecl *D) {2613 ASTContext &C = Reader.getContext();2614 if (Decl *InstD = readDecl()) {2615 if (auto *VTD = dyn_cast<VarTemplateDecl>(InstD)) {2616 D->SpecializedTemplate = VTD;2617 } else {2618 SmallVector<TemplateArgument, 8> TemplArgs;2619 Record.readTemplateArgumentList(TemplArgs);2620 TemplateArgumentList *ArgList = TemplateArgumentList::CreateCopy(2621 C, TemplArgs);2622 auto *PS =2623 new (C)2624 VarTemplateSpecializationDecl::SpecializedPartialSpecialization();2625 PS->PartialSpecialization =2626 cast<VarTemplatePartialSpecializationDecl>(InstD);2627 PS->TemplateArgs = ArgList;2628 D->SpecializedTemplate = PS;2629 }2630 }2631 2632 // extern/template keyword locations for explicit instantiations2633 if (Record.readBool()) {2634 auto *ExplicitInfo = new (C) ExplicitInstantiationInfo;2635 ExplicitInfo->ExternKeywordLoc = readSourceLocation();2636 ExplicitInfo->TemplateKeywordLoc = readSourceLocation();2637 D->ExplicitInfo = ExplicitInfo;2638 }2639 2640 if (Record.readBool())2641 D->setTemplateArgsAsWritten(Record.readASTTemplateArgumentListInfo());2642 2643 SmallVector<TemplateArgument, 8> TemplArgs;2644 Record.readTemplateArgumentList(TemplArgs, /*Canonicalize*/ true);2645 D->TemplateArgs = TemplateArgumentList::CreateCopy(C, TemplArgs);2646 D->PointOfInstantiation = readSourceLocation();2647 D->SpecializationKind = (TemplateSpecializationKind)Record.readInt();2648 D->IsCompleteDefinition = Record.readInt();2649 2650 RedeclarableResult Redecl = VisitVarDeclImpl(D);2651 2652 bool writtenAsCanonicalDecl = Record.readInt();2653 if (writtenAsCanonicalDecl) {2654 auto *CanonPattern = readDeclAs<VarTemplateDecl>();2655 if (D->isCanonicalDecl()) { // It's kept in the folding set.2656 VarTemplateSpecializationDecl *CanonSpec;2657 if (auto *Partial = dyn_cast<VarTemplatePartialSpecializationDecl>(D)) {2658 CanonSpec = CanonPattern->getCommonPtr()2659 ->PartialSpecializations.GetOrInsertNode(Partial);2660 } else {2661 CanonSpec =2662 CanonPattern->getCommonPtr()->Specializations.GetOrInsertNode(D);2663 }2664 // If we already have a matching specialization, merge it.2665 if (CanonSpec != D)2666 MergeImpl.mergeRedeclarable<VarDecl>(D, CanonSpec, Redecl);2667 }2668 }2669 2670 return Redecl;2671}2672 2673/// TODO: Unify with ClassTemplatePartialSpecializationDecl version?2674/// May require unifying ClassTemplate(Partial)SpecializationDecl and2675/// VarTemplate(Partial)SpecializationDecl with a new data2676/// structure Template(Partial)SpecializationDecl, and2677/// using Template(Partial)SpecializationDecl as input type.2678void ASTDeclReader::VisitVarTemplatePartialSpecializationDecl(2679 VarTemplatePartialSpecializationDecl *D) {2680 TemplateParameterList *Params = Record.readTemplateParameterList();2681 D->TemplateParams = Params;2682 2683 RedeclarableResult Redecl = VisitVarTemplateSpecializationDeclImpl(D);2684 2685 // These are read/set from/to the first declaration.2686 if (ThisDeclID == Redecl.getFirstID()) {2687 D->InstantiatedFromMember.setPointer(2688 readDeclAs<VarTemplatePartialSpecializationDecl>());2689 D->InstantiatedFromMember.setInt(Record.readInt());2690 }2691}2692 2693void ASTDeclReader::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) {2694 VisitTypeDecl(D);2695 2696 D->setDeclaredWithTypename(Record.readInt());2697 2698 bool TypeConstraintInitialized = D->hasTypeConstraint() && Record.readBool();2699 if (TypeConstraintInitialized) {2700 ConceptReference *CR = nullptr;2701 if (Record.readBool())2702 CR = Record.readConceptReference();2703 Expr *ImmediatelyDeclaredConstraint = Record.readExpr();2704 UnsignedOrNone ArgPackSubstIndex = Record.readUnsignedOrNone();2705 2706 D->setTypeConstraint(CR, ImmediatelyDeclaredConstraint, ArgPackSubstIndex);2707 D->NumExpanded = Record.readUnsignedOrNone();2708 }2709 2710 if (Record.readInt())2711 D->setDefaultArgument(Reader.getContext(),2712 Record.readTemplateArgumentLoc());2713}2714 2715void ASTDeclReader::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) {2716 VisitDeclaratorDecl(D);2717 // TemplateParmPosition.2718 D->setDepth(Record.readInt());2719 D->setPosition(Record.readInt());2720 if (D->hasPlaceholderTypeConstraint())2721 D->setPlaceholderTypeConstraint(Record.readExpr());2722 if (D->isExpandedParameterPack()) {2723 auto TypesAndInfos =2724 D->getTrailingObjects<std::pair<QualType, TypeSourceInfo *>>();2725 for (unsigned I = 0, N = D->getNumExpansionTypes(); I != N; ++I) {2726 new (&TypesAndInfos[I].first) QualType(Record.readType());2727 TypesAndInfos[I].second = readTypeSourceInfo();2728 }2729 } else {2730 // Rest of NonTypeTemplateParmDecl.2731 D->ParameterPack = Record.readInt();2732 if (Record.readInt())2733 D->setDefaultArgument(Reader.getContext(),2734 Record.readTemplateArgumentLoc());2735 }2736}2737 2738void ASTDeclReader::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) {2739 VisitTemplateDecl(D);2740 D->ParameterKind = static_cast<TemplateNameKind>(Record.readInt());2741 D->setDeclaredWithTypename(Record.readBool());2742 // TemplateParmPosition.2743 D->setDepth(Record.readInt());2744 D->setPosition(Record.readInt());2745 if (D->isExpandedParameterPack()) {2746 auto **Data = D->getTrailingObjects();2747 for (unsigned I = 0, N = D->getNumExpansionTemplateParameters();2748 I != N; ++I)2749 Data[I] = Record.readTemplateParameterList();2750 } else {2751 // Rest of TemplateTemplateParmDecl.2752 D->ParameterPack = Record.readInt();2753 if (Record.readInt())2754 D->setDefaultArgument(Reader.getContext(),2755 Record.readTemplateArgumentLoc());2756 }2757}2758 2759void ASTDeclReader::VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D) {2760 RedeclarableResult Redecl = VisitRedeclarableTemplateDecl(D);2761 mergeRedeclarableTemplate(D, Redecl);2762}2763 2764void ASTDeclReader::VisitStaticAssertDecl(StaticAssertDecl *D) {2765 VisitDecl(D);2766 D->AssertExprAndFailed.setPointer(Record.readExpr());2767 D->AssertExprAndFailed.setInt(Record.readInt());2768 D->Message = cast_or_null<StringLiteral>(Record.readExpr());2769 D->RParenLoc = readSourceLocation();2770}2771 2772void ASTDeclReader::VisitEmptyDecl(EmptyDecl *D) {2773 VisitDecl(D);2774}2775 2776void ASTDeclReader::VisitLifetimeExtendedTemporaryDecl(2777 LifetimeExtendedTemporaryDecl *D) {2778 VisitDecl(D);2779 D->ExtendingDecl = readDeclAs<ValueDecl>();2780 D->ExprWithTemporary = Record.readStmt();2781 if (Record.readInt()) {2782 D->Value = new (D->getASTContext()) APValue(Record.readAPValue());2783 D->getASTContext().addDestruction(D->Value);2784 }2785 D->ManglingNumber = Record.readInt();2786 mergeMergeable(D);2787}2788 2789void ASTDeclReader::VisitDeclContext(DeclContext *DC,2790 LookupBlockOffsets &Offsets) {2791 Offsets.LexicalOffset = ReadLocalOffset();2792 Offsets.VisibleOffset = ReadLocalOffset();2793 Offsets.ModuleLocalOffset = ReadLocalOffset();2794 Offsets.TULocalOffset = ReadLocalOffset();2795}2796 2797template <typename T>2798RedeclarableResult ASTDeclReader::VisitRedeclarable(Redeclarable<T> *D) {2799 GlobalDeclID FirstDeclID = readDeclID();2800 Decl *MergeWith = nullptr;2801 2802 bool IsKeyDecl = ThisDeclID == FirstDeclID;2803 bool IsFirstLocalDecl = false;2804 2805 uint64_t RedeclOffset = 0;2806 2807 // invalid FirstDeclID indicates that this declaration was the only2808 // declaration of its entity, and is used for space optimization.2809 if (FirstDeclID.isInvalid()) {2810 FirstDeclID = ThisDeclID;2811 IsKeyDecl = true;2812 IsFirstLocalDecl = true;2813 } else if (unsigned N = Record.readInt()) {2814 // This declaration was the first local declaration, but may have imported2815 // other declarations.2816 IsKeyDecl = N == 1;2817 IsFirstLocalDecl = true;2818 2819 // We have some declarations that must be before us in our redeclaration2820 // chain. Read them now, and remember that we ought to merge with one of2821 // them.2822 // FIXME: Provide a known merge target to the second and subsequent such2823 // declaration.2824 for (unsigned I = 0; I != N - 1; ++I)2825 MergeWith = readDecl();2826 2827 RedeclOffset = ReadLocalOffset();2828 } else {2829 // This declaration was not the first local declaration. Read the first2830 // local declaration now, to trigger the import of other redeclarations.2831 (void)readDecl();2832 }2833 2834 auto *FirstDecl = cast_or_null<T>(Reader.GetDecl(FirstDeclID));2835 if (FirstDecl != D) {2836 // We delay loading of the redeclaration chain to avoid deeply nested calls.2837 // We temporarily set the first (canonical) declaration as the previous one2838 // which is the one that matters and mark the real previous DeclID to be2839 // loaded & attached later on.2840 D->RedeclLink = Redeclarable<T>::PreviousDeclLink(FirstDecl);2841 D->First = FirstDecl->getCanonicalDecl();2842 }2843 2844 auto *DAsT = static_cast<T *>(D);2845 2846 // Note that we need to load local redeclarations of this decl and build a2847 // decl chain for them. This must happen *after* we perform the preloading2848 // above; this ensures that the redeclaration chain is built in the correct2849 // order.2850 if (IsFirstLocalDecl)2851 Reader.PendingDeclChains.push_back(std::make_pair(DAsT, RedeclOffset));2852 2853 return RedeclarableResult(MergeWith, FirstDeclID, IsKeyDecl);2854}2855 2856/// Attempts to merge the given declaration (D) with another declaration2857/// of the same entity.2858template <typename T>2859void ASTDeclReader::mergeRedeclarable(Redeclarable<T> *DBase,2860 RedeclarableResult &Redecl) {2861 // If modules are not available, there is no reason to perform this merge.2862 if (!Reader.getContext().getLangOpts().Modules)2863 return;2864 2865 // If we're not the canonical declaration, we don't need to merge.2866 if (!DBase->isFirstDecl())2867 return;2868 2869 auto *D = static_cast<T *>(DBase);2870 2871 if (auto *Existing = Redecl.getKnownMergeTarget())2872 // We already know of an existing declaration we should merge with.2873 MergeImpl.mergeRedeclarable(D, cast<T>(Existing), Redecl);2874 else if (FindExistingResult ExistingRes = findExisting(D))2875 if (T *Existing = ExistingRes)2876 MergeImpl.mergeRedeclarable(D, Existing, Redecl);2877}2878 2879/// Attempt to merge D with a previous declaration of the same lambda, which is2880/// found by its index within its context declaration, if it has one.2881///2882/// We can't look up lambdas in their enclosing lexical or semantic context in2883/// general, because for lambdas in variables, both of those might be a2884/// namespace or the translation unit.2885void ASTDeclMerger::mergeLambda(CXXRecordDecl *D, RedeclarableResult &Redecl,2886 Decl &Context, unsigned IndexInContext) {2887 // If modules are not available, there is no reason to perform this merge.2888 if (!Reader.getContext().getLangOpts().Modules)2889 return;2890 2891 // If we're not the canonical declaration, we don't need to merge.2892 if (!D->isFirstDecl())2893 return;2894 2895 if (auto *Existing = Redecl.getKnownMergeTarget())2896 // We already know of an existing declaration we should merge with.2897 mergeRedeclarable(D, cast<TagDecl>(Existing), Redecl);2898 2899 // Look up this lambda to see if we've seen it before. If so, merge with the2900 // one we already loaded.2901 NamedDecl *&Slot = Reader.LambdaDeclarationsForMerging[{2902 Context.getCanonicalDecl(), IndexInContext}];2903 if (Slot)2904 mergeRedeclarable(D, cast<TagDecl>(Slot), Redecl);2905 else2906 Slot = D;2907}2908 2909void ASTDeclReader::mergeRedeclarableTemplate(RedeclarableTemplateDecl *D,2910 RedeclarableResult &Redecl) {2911 mergeRedeclarable(D, Redecl);2912 // If we merged the template with a prior declaration chain, merge the2913 // common pointer.2914 // FIXME: Actually merge here, don't just overwrite.2915 D->Common = D->getCanonicalDecl()->Common;2916}2917 2918/// "Cast" to type T, asserting if we don't have an implicit conversion.2919/// We use this to put code in a template that will only be valid for certain2920/// instantiations.2921template<typename T> static T assert_cast(T t) { return t; }2922template<typename T> static T assert_cast(...) {2923 llvm_unreachable("bad assert_cast");2924}2925 2926/// Merge together the pattern declarations from two template2927/// declarations.2928void ASTDeclMerger::mergeTemplatePattern(RedeclarableTemplateDecl *D,2929 RedeclarableTemplateDecl *Existing,2930 bool IsKeyDecl) {2931 auto *DPattern = D->getTemplatedDecl();2932 auto *ExistingPattern = Existing->getTemplatedDecl();2933 RedeclarableResult Result(2934 /*MergeWith*/ ExistingPattern,2935 DPattern->getCanonicalDecl()->getGlobalID(), IsKeyDecl);2936 2937 if (auto *DClass = dyn_cast<CXXRecordDecl>(DPattern)) {2938 // Merge with any existing definition.2939 // FIXME: This is duplicated in several places. Refactor.2940 auto *ExistingClass =2941 cast<CXXRecordDecl>(ExistingPattern)->getCanonicalDecl();2942 if (auto *DDD = DClass->DefinitionData) {2943 if (ExistingClass->DefinitionData) {2944 MergeDefinitionData(ExistingClass, std::move(*DDD));2945 } else {2946 ExistingClass->DefinitionData = DClass->DefinitionData;2947 // We may have skipped this before because we thought that DClass2948 // was the canonical declaration.2949 Reader.PendingDefinitions.insert(DClass);2950 }2951 }2952 DClass->DefinitionData = ExistingClass->DefinitionData;2953 2954 return mergeRedeclarable(DClass, cast<TagDecl>(ExistingPattern),2955 Result);2956 }2957 if (auto *DFunction = dyn_cast<FunctionDecl>(DPattern))2958 return mergeRedeclarable(DFunction, cast<FunctionDecl>(ExistingPattern),2959 Result);2960 if (auto *DVar = dyn_cast<VarDecl>(DPattern))2961 return mergeRedeclarable(DVar, cast<VarDecl>(ExistingPattern), Result);2962 if (auto *DAlias = dyn_cast<TypeAliasDecl>(DPattern))2963 return mergeRedeclarable(DAlias, cast<TypedefNameDecl>(ExistingPattern),2964 Result);2965 llvm_unreachable("merged an unknown kind of redeclarable template");2966}2967 2968/// Attempts to merge the given declaration (D) with another declaration2969/// of the same entity.2970template <typename T>2971void ASTDeclMerger::mergeRedeclarableImpl(Redeclarable<T> *DBase, T *Existing,2972 GlobalDeclID KeyDeclID) {2973 auto *D = static_cast<T *>(DBase);2974 T *ExistingCanon = Existing->getCanonicalDecl();2975 T *DCanon = D->getCanonicalDecl();2976 if (ExistingCanon != DCanon) {2977 // Have our redeclaration link point back at the canonical declaration2978 // of the existing declaration, so that this declaration has the2979 // appropriate canonical declaration.2980 D->RedeclLink = Redeclarable<T>::PreviousDeclLink(ExistingCanon);2981 D->First = ExistingCanon;2982 ExistingCanon->Used |= D->Used;2983 D->Used = false;2984 2985 bool IsKeyDecl = KeyDeclID.isValid();2986 2987 // When we merge a template, merge its pattern.2988 if (auto *DTemplate = dyn_cast<RedeclarableTemplateDecl>(D))2989 mergeTemplatePattern(2990 DTemplate, assert_cast<RedeclarableTemplateDecl *>(ExistingCanon),2991 IsKeyDecl);2992 2993 // If this declaration is a key declaration, make a note of that.2994 if (IsKeyDecl)2995 Reader.KeyDecls[ExistingCanon].push_back(KeyDeclID);2996 }2997}2998 2999/// ODR-like semantics for C/ObjC allow us to merge tag types and a structural3000/// check in Sema guarantees the types can be merged (see C11 6.2.7/1 or C893001/// 6.1.2.6/1). Although most merging is done in Sema, we need to guarantee3002/// that some types are mergeable during deserialization, otherwise name3003/// lookup fails. This is the case for EnumConstantDecl.3004static bool allowODRLikeMergeInC(NamedDecl *ND) {3005 if (!ND)3006 return false;3007 // TODO: implement merge for other necessary decls.3008 if (isa<EnumConstantDecl, FieldDecl, IndirectFieldDecl>(ND))3009 return true;3010 return false;3011}3012 3013/// Attempts to merge LifetimeExtendedTemporaryDecl with3014/// identical class definitions from two different modules.3015void ASTDeclReader::mergeMergeable(LifetimeExtendedTemporaryDecl *D) {3016 // If modules are not available, there is no reason to perform this merge.3017 if (!Reader.getContext().getLangOpts().Modules)3018 return;3019 3020 LifetimeExtendedTemporaryDecl *LETDecl = D;3021 3022 LifetimeExtendedTemporaryDecl *&LookupResult =3023 Reader.LETemporaryForMerging[std::make_pair(3024 LETDecl->getExtendingDecl(), LETDecl->getManglingNumber())];3025 if (LookupResult)3026 Reader.getContext().setPrimaryMergedDecl(LETDecl,3027 LookupResult->getCanonicalDecl());3028 else3029 LookupResult = LETDecl;3030}3031 3032/// Attempts to merge the given declaration (D) with another declaration3033/// of the same entity, for the case where the entity is not actually3034/// redeclarable. This happens, for instance, when merging the fields of3035/// identical class definitions from two different modules.3036template<typename T>3037void ASTDeclReader::mergeMergeable(Mergeable<T> *D) {3038 // If modules are not available, there is no reason to perform this merge.3039 if (!Reader.getContext().getLangOpts().Modules)3040 return;3041 3042 // ODR-based merging is performed in C++ and in some cases (tag types) in C.3043 // Note that C identically-named things in different translation units are3044 // not redeclarations, but may still have compatible types, where ODR-like3045 // semantics may apply.3046 if (!Reader.getContext().getLangOpts().CPlusPlus &&3047 !allowODRLikeMergeInC(dyn_cast<NamedDecl>(static_cast<T*>(D))))3048 return;3049 3050 if (FindExistingResult ExistingRes = findExisting(static_cast<T*>(D)))3051 if (T *Existing = ExistingRes)3052 Reader.getContext().setPrimaryMergedDecl(static_cast<T *>(D),3053 Existing->getCanonicalDecl());3054}3055 3056void ASTDeclReader::VisitOMPThreadPrivateDecl(OMPThreadPrivateDecl *D) {3057 Record.readOMPChildren(D->Data);3058 VisitDecl(D);3059}3060 3061void ASTDeclReader::VisitOMPAllocateDecl(OMPAllocateDecl *D) {3062 Record.readOMPChildren(D->Data);3063 VisitDecl(D);3064}3065 3066void ASTDeclReader::VisitOMPRequiresDecl(OMPRequiresDecl * D) {3067 Record.readOMPChildren(D->Data);3068 VisitDecl(D);3069}3070 3071void ASTDeclReader::VisitOMPDeclareReductionDecl(OMPDeclareReductionDecl *D) {3072 VisitValueDecl(D);3073 D->setLocation(readSourceLocation());3074 Expr *In = Record.readExpr();3075 Expr *Out = Record.readExpr();3076 D->setCombinerData(In, Out);3077 Expr *Combiner = Record.readExpr();3078 D->setCombiner(Combiner);3079 Expr *Orig = Record.readExpr();3080 Expr *Priv = Record.readExpr();3081 D->setInitializerData(Orig, Priv);3082 Expr *Init = Record.readExpr();3083 auto IK = static_cast<OMPDeclareReductionInitKind>(Record.readInt());3084 D->setInitializer(Init, IK);3085 D->PrevDeclInScope = readDeclID().getRawValue();3086}3087 3088void ASTDeclReader::VisitOMPDeclareMapperDecl(OMPDeclareMapperDecl *D) {3089 Record.readOMPChildren(D->Data);3090 VisitValueDecl(D);3091 D->VarName = Record.readDeclarationName();3092 D->PrevDeclInScope = readDeclID().getRawValue();3093}3094 3095void ASTDeclReader::VisitOMPCapturedExprDecl(OMPCapturedExprDecl *D) {3096 VisitVarDecl(D);3097}3098 3099void ASTDeclReader::VisitOpenACCDeclareDecl(OpenACCDeclareDecl *D) {3100 VisitDecl(D);3101 D->DirKind = Record.readEnum<OpenACCDirectiveKind>();3102 D->DirectiveLoc = Record.readSourceLocation();3103 D->EndLoc = Record.readSourceLocation();3104 Record.readOpenACCClauseList(D->Clauses);3105}3106void ASTDeclReader::VisitOpenACCRoutineDecl(OpenACCRoutineDecl *D) {3107 VisitDecl(D);3108 D->DirKind = Record.readEnum<OpenACCDirectiveKind>();3109 D->DirectiveLoc = Record.readSourceLocation();3110 D->EndLoc = Record.readSourceLocation();3111 D->ParensLoc = Record.readSourceRange();3112 D->FuncRef = Record.readExpr();3113 Record.readOpenACCClauseList(D->Clauses);3114}3115 3116//===----------------------------------------------------------------------===//3117// Attribute Reading3118//===----------------------------------------------------------------------===//3119 3120namespace {3121class AttrReader {3122 ASTRecordReader &Reader;3123 3124public:3125 AttrReader(ASTRecordReader &Reader) : Reader(Reader) {}3126 3127 uint64_t readInt() {3128 return Reader.readInt();3129 }3130 3131 bool readBool() { return Reader.readBool(); }3132 3133 SourceRange readSourceRange() {3134 return Reader.readSourceRange();3135 }3136 3137 SourceLocation readSourceLocation() {3138 return Reader.readSourceLocation();3139 }3140 3141 Expr *readExpr() { return Reader.readExpr(); }3142 3143 Attr *readAttr() { return Reader.readAttr(); }3144 3145 std::string readString() {3146 return Reader.readString();3147 }3148 3149 TypeSourceInfo *readTypeSourceInfo() {3150 return Reader.readTypeSourceInfo();3151 }3152 3153 IdentifierInfo *readIdentifier() {3154 return Reader.readIdentifier();3155 }3156 3157 VersionTuple readVersionTuple() {3158 return Reader.readVersionTuple();3159 }3160 3161 OMPTraitInfo *readOMPTraitInfo() { return Reader.readOMPTraitInfo(); }3162 3163 template <typename T> T *readDeclAs() { return Reader.readDeclAs<T>(); }3164};3165}3166 3167Attr *ASTRecordReader::readAttr() {3168 AttrReader Record(*this);3169 auto V = Record.readInt();3170 if (!V)3171 return nullptr;3172 3173 Attr *New = nullptr;3174 // Kind is stored as a 1-based integer because 0 is used to indicate a null3175 // Attr pointer.3176 auto Kind = static_cast<attr::Kind>(V - 1);3177 ASTContext &Context = getContext();3178 3179 IdentifierInfo *AttrName = Record.readIdentifier();3180 IdentifierInfo *ScopeName = Record.readIdentifier();3181 SourceRange AttrRange = Record.readSourceRange();3182 SourceLocation ScopeLoc = Record.readSourceLocation();3183 unsigned ParsedKind = Record.readInt();3184 unsigned Syntax = Record.readInt();3185 unsigned SpellingIndex = Record.readInt();3186 bool IsAlignas = (ParsedKind == AttributeCommonInfo::AT_Aligned &&3187 Syntax == AttributeCommonInfo::AS_Keyword &&3188 SpellingIndex == AlignedAttr::Keyword_alignas);3189 bool IsRegularKeywordAttribute = Record.readBool();3190 3191 AttributeCommonInfo Info(AttrName, AttributeScopeInfo(ScopeName, ScopeLoc),3192 AttrRange, AttributeCommonInfo::Kind(ParsedKind),3193 {AttributeCommonInfo::Syntax(Syntax), SpellingIndex,3194 IsAlignas, IsRegularKeywordAttribute});3195 3196#include "clang/Serialization/AttrPCHRead.inc"3197 3198 assert(New && "Unable to decode attribute?");3199 return New;3200}3201 3202/// Reads attributes from the current stream position.3203void ASTRecordReader::readAttributes(AttrVec &Attrs) {3204 for (unsigned I = 0, E = readInt(); I != E; ++I)3205 if (auto *A = readAttr())3206 Attrs.push_back(A);3207}3208 3209//===----------------------------------------------------------------------===//3210// ASTReader Implementation3211//===----------------------------------------------------------------------===//3212 3213/// Note that we have loaded the declaration with the given3214/// Index.3215///3216/// This routine notes that this declaration has already been loaded,3217/// so that future GetDecl calls will return this declaration rather3218/// than trying to load a new declaration.3219inline void ASTReader::LoadedDecl(unsigned Index, Decl *D) {3220 assert(!DeclsLoaded[Index] && "Decl loaded twice?");3221 DeclsLoaded[Index] = D;3222}3223 3224/// Determine whether the consumer will be interested in seeing3225/// this declaration (via HandleTopLevelDecl).3226///3227/// This routine should return true for anything that might affect3228/// code generation, e.g., inline function definitions, Objective-C3229/// declarations with metadata, etc.3230bool ASTReader::isConsumerInterestedIn(Decl *D) {3231 // An ObjCMethodDecl is never considered as "interesting" because its3232 // implementation container always is.3233 3234 // An ImportDecl or VarDecl imported from a module map module will get3235 // emitted when we import the relevant module.3236 if (isPartOfPerModuleInitializer(D)) {3237 auto *M = D->getImportedOwningModule();3238 if (M && M->Kind == Module::ModuleMapModule &&3239 getContext().DeclMustBeEmitted(D))3240 return false;3241 }3242 3243 if (isa<FileScopeAsmDecl, TopLevelStmtDecl, ObjCProtocolDecl, ObjCImplDecl,3244 ImportDecl, PragmaCommentDecl, PragmaDetectMismatchDecl>(D))3245 return true;3246 if (isa<OMPThreadPrivateDecl, OMPDeclareReductionDecl, OMPDeclareMapperDecl,3247 OMPAllocateDecl, OMPRequiresDecl>(D))3248 return !D->getDeclContext()->isFunctionOrMethod();3249 if (const auto *Var = dyn_cast<VarDecl>(D))3250 return Var->isFileVarDecl() &&3251 (Var->isThisDeclarationADefinition() == VarDecl::Definition ||3252 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(Var));3253 if (const auto *Func = dyn_cast<FunctionDecl>(D))3254 return Func->doesThisDeclarationHaveABody() || PendingBodies.count(D);3255 3256 if (auto *ES = D->getASTContext().getExternalSource())3257 if (ES->hasExternalDefinitions(D) == ExternalASTSource::EK_Never)3258 return true;3259 3260 return false;3261}3262 3263/// Get the correct cursor and offset for loading a declaration.3264ASTReader::RecordLocation ASTReader::DeclCursorForID(GlobalDeclID ID,3265 SourceLocation &Loc) {3266 ModuleFile *M = getOwningModuleFile(ID);3267 assert(M);3268 unsigned LocalDeclIndex = ID.getLocalDeclIndex();3269 const DeclOffset &DOffs = M->DeclOffsets[LocalDeclIndex];3270 Loc = ReadSourceLocation(*M, DOffs.getRawLoc());3271 return RecordLocation(M, DOffs.getBitOffset(M->DeclsBlockStartOffset));3272}3273 3274ASTReader::RecordLocation ASTReader::getLocalBitOffset(uint64_t GlobalOffset) {3275 auto I = GlobalBitOffsetsMap.find(GlobalOffset);3276 3277 assert(I != GlobalBitOffsetsMap.end() && "Corrupted global bit offsets map");3278 return RecordLocation(I->second, GlobalOffset - I->second->GlobalBitOffset);3279}3280 3281uint64_t ASTReader::getGlobalBitOffset(ModuleFile &M, uint64_t LocalOffset) {3282 return LocalOffset + M.GlobalBitOffset;3283}3284 3285CXXRecordDecl *3286ASTDeclReader::getOrFakePrimaryClassDefinition(ASTReader &Reader,3287 CXXRecordDecl *RD) {3288 // Try to dig out the definition.3289 auto *DD = RD->DefinitionData;3290 if (!DD)3291 DD = RD->getCanonicalDecl()->DefinitionData;3292 3293 // If there's no definition yet, then DC's definition is added by an update3294 // record, but we've not yet loaded that update record. In this case, we3295 // commit to DC being the canonical definition now, and will fix this when3296 // we load the update record.3297 if (!DD) {3298 DD = new (Reader.getContext()) struct CXXRecordDecl::DefinitionData(RD);3299 RD->setCompleteDefinition(true);3300 RD->DefinitionData = DD;3301 RD->getCanonicalDecl()->DefinitionData = DD;3302 3303 // Track that we did this horrible thing so that we can fix it later.3304 Reader.PendingFakeDefinitionData.insert(3305 std::make_pair(DD, ASTReader::PendingFakeDefinitionKind::Fake));3306 }3307 3308 return DD->Definition;3309}3310 3311/// Find the context in which we should search for previous declarations when3312/// looking for declarations to merge.3313DeclContext *ASTDeclReader::getPrimaryContextForMerging(ASTReader &Reader,3314 DeclContext *DC) {3315 if (auto *ND = dyn_cast<NamespaceDecl>(DC))3316 return ND->getFirstDecl();3317 3318 if (auto *RD = dyn_cast<CXXRecordDecl>(DC))3319 return getOrFakePrimaryClassDefinition(Reader, RD);3320 3321 if (auto *RD = dyn_cast<RecordDecl>(DC))3322 return RD->getDefinition();3323 3324 if (auto *ED = dyn_cast<EnumDecl>(DC))3325 return ED->getDefinition();3326 3327 if (auto *OID = dyn_cast<ObjCInterfaceDecl>(DC))3328 return OID->getDefinition();3329 3330 // We can see the TU here only if we have no Sema object. It is possible3331 // we're in clang-repl so we still need to get the primary context.3332 if (auto *TU = dyn_cast<TranslationUnitDecl>(DC))3333 return TU->getPrimaryContext();3334 3335 return nullptr;3336}3337 3338ASTDeclReader::FindExistingResult::~FindExistingResult() {3339 // Record that we had a typedef name for linkage whether or not we merge3340 // with that declaration.3341 if (TypedefNameForLinkage) {3342 DeclContext *DC = New->getDeclContext()->getRedeclContext();3343 Reader.ImportedTypedefNamesForLinkage.insert(3344 std::make_pair(std::make_pair(DC, TypedefNameForLinkage), New));3345 return;3346 }3347 3348 if (!AddResult || Existing)3349 return;3350 3351 DeclarationName Name = New->getDeclName();3352 DeclContext *DC = New->getDeclContext()->getRedeclContext();3353 if (needsAnonymousDeclarationNumber(New)) {3354 setAnonymousDeclForMerging(Reader, New->getLexicalDeclContext(),3355 AnonymousDeclNumber, New);3356 } else if (DC->isTranslationUnit() &&3357 !Reader.getContext().getLangOpts().CPlusPlus) {3358 if (Reader.getIdResolver().tryAddTopLevelDecl(New, Name))3359 Reader.PendingFakeLookupResults[Name.getAsIdentifierInfo()]3360 .push_back(New);3361 } else if (DeclContext *MergeDC = getPrimaryContextForMerging(Reader, DC)) {3362 // Add the declaration to its redeclaration context so later merging3363 // lookups will find it.3364 MergeDC->makeDeclVisibleInContextImpl(New, /*Internal*/true);3365 }3366}3367 3368/// Find the declaration that should be merged into, given the declaration found3369/// by name lookup. If we're merging an anonymous declaration within a typedef,3370/// we need a matching typedef, and we merge with the type inside it.3371static NamedDecl *getDeclForMerging(NamedDecl *Found,3372 bool IsTypedefNameForLinkage) {3373 if (!IsTypedefNameForLinkage)3374 return Found;3375 3376 // If we found a typedef declaration that gives a name to some other3377 // declaration, then we want that inner declaration. Declarations from3378 // AST files are handled via ImportedTypedefNamesForLinkage.3379 if (Found->isFromASTFile())3380 return nullptr;3381 3382 if (auto *TND = dyn_cast<TypedefNameDecl>(Found))3383 return TND->getAnonDeclWithTypedefName(/*AnyRedecl*/true);3384 3385 return nullptr;3386}3387 3388/// Find the declaration to use to populate the anonymous declaration table3389/// for the given lexical DeclContext. We only care about finding local3390/// definitions of the context; we'll merge imported ones as we go.3391DeclContext *3392ASTDeclReader::getPrimaryDCForAnonymousDecl(DeclContext *LexicalDC) {3393 // For classes, we track the definition as we merge.3394 if (auto *RD = dyn_cast<CXXRecordDecl>(LexicalDC)) {3395 auto *DD = RD->getCanonicalDecl()->DefinitionData;3396 return DD ? DD->Definition : nullptr;3397 } else if (auto *OID = dyn_cast<ObjCInterfaceDecl>(LexicalDC)) {3398 return OID->getCanonicalDecl()->getDefinition();3399 }3400 3401 // For anything else, walk its merged redeclarations looking for a definition.3402 // Note that we can't just call getDefinition here because the redeclaration3403 // chain isn't wired up.3404 for (auto *D : merged_redecls(cast<Decl>(LexicalDC))) {3405 if (auto *FD = dyn_cast<FunctionDecl>(D))3406 if (FD->isThisDeclarationADefinition())3407 return FD;3408 if (auto *MD = dyn_cast<ObjCMethodDecl>(D))3409 if (MD->isThisDeclarationADefinition())3410 return MD;3411 if (auto *RD = dyn_cast<RecordDecl>(D))3412 if (RD->isThisDeclarationADefinition())3413 return RD;3414 }3415 3416 // No merged definition yet.3417 return nullptr;3418}3419 3420NamedDecl *ASTDeclReader::getAnonymousDeclForMerging(ASTReader &Reader,3421 DeclContext *DC,3422 unsigned Index) {3423 // If the lexical context has been merged, look into the now-canonical3424 // definition.3425 auto *CanonDC = cast<Decl>(DC)->getCanonicalDecl();3426 3427 // If we've seen this before, return the canonical declaration.3428 auto &Previous = Reader.AnonymousDeclarationsForMerging[CanonDC];3429 if (Index < Previous.size() && Previous[Index])3430 return Previous[Index];3431 3432 // If this is the first time, but we have parsed a declaration of the context,3433 // build the anonymous declaration list from the parsed declaration.3434 auto *PrimaryDC = getPrimaryDCForAnonymousDecl(DC);3435 auto needToNumberAnonymousDeclsWithin = [](Decl *D) {3436 if (!D->isFromASTFile())3437 return true;3438 // If this is a class template specialization from an AST file, has at least3439 // one field, but none of the fields have been loaded from external storage,3440 // this is a situation where the class template specialization decl3441 // was imported but the definition was instantiated within the source.3442 // In such a case, we still need to number the anonymous decls.3443 auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D);3444 return CTSD && !CTSD->noload_field_empty() &&3445 !CTSD->hasLoadedFieldsFromExternalStorage();3446 };3447 if (PrimaryDC && needToNumberAnonymousDeclsWithin(cast<Decl>(PrimaryDC))) {3448 numberAnonymousDeclsWithin(PrimaryDC, [&](NamedDecl *ND, unsigned Number) {3449 if (Previous.size() == Number)3450 Previous.push_back(cast<NamedDecl>(ND->getCanonicalDecl()));3451 else3452 Previous[Number] = cast<NamedDecl>(ND->getCanonicalDecl());3453 });3454 }3455 3456 return Index < Previous.size() ? Previous[Index] : nullptr;3457}3458 3459void ASTDeclReader::setAnonymousDeclForMerging(ASTReader &Reader,3460 DeclContext *DC, unsigned Index,3461 NamedDecl *D) {3462 auto *CanonDC = cast<Decl>(DC)->getCanonicalDecl();3463 3464 auto &Previous = Reader.AnonymousDeclarationsForMerging[CanonDC];3465 if (Index >= Previous.size())3466 Previous.resize(Index + 1);3467 if (!Previous[Index])3468 Previous[Index] = D;3469}3470 3471ASTDeclReader::FindExistingResult ASTDeclReader::findExisting(NamedDecl *D) {3472 DeclarationName Name = TypedefNameForLinkage ? TypedefNameForLinkage3473 : D->getDeclName();3474 3475 if (!Name && !needsAnonymousDeclarationNumber(D)) {3476 // Don't bother trying to find unnamed declarations that are in3477 // unmergeable contexts.3478 FindExistingResult Result(Reader, D, /*Existing=*/nullptr,3479 AnonymousDeclNumber, TypedefNameForLinkage);3480 Result.suppress();3481 return Result;3482 }3483 3484 ASTContext &C = Reader.getContext();3485 DeclContext *DC = D->getDeclContext()->getRedeclContext();3486 if (TypedefNameForLinkage) {3487 auto It = Reader.ImportedTypedefNamesForLinkage.find(3488 std::make_pair(DC, TypedefNameForLinkage));3489 if (It != Reader.ImportedTypedefNamesForLinkage.end())3490 if (C.isSameEntity(It->second, D))3491 return FindExistingResult(Reader, D, It->second, AnonymousDeclNumber,3492 TypedefNameForLinkage);3493 // Go on to check in other places in case an existing typedef name3494 // was not imported.3495 }3496 3497 if (needsAnonymousDeclarationNumber(D)) {3498 // This is an anonymous declaration that we may need to merge. Look it up3499 // in its context by number.3500 if (auto *Existing = getAnonymousDeclForMerging(3501 Reader, D->getLexicalDeclContext(), AnonymousDeclNumber))3502 if (C.isSameEntity(Existing, D))3503 return FindExistingResult(Reader, D, Existing, AnonymousDeclNumber,3504 TypedefNameForLinkage);3505 } else if (DC->isTranslationUnit() &&3506 !Reader.getContext().getLangOpts().CPlusPlus) {3507 IdentifierResolver &IdResolver = Reader.getIdResolver();3508 3509 // Temporarily consider the identifier to be up-to-date. We don't want to3510 // cause additional lookups here.3511 class UpToDateIdentifierRAII {3512 IdentifierInfo *II;3513 bool WasOutToDate = false;3514 3515 public:3516 explicit UpToDateIdentifierRAII(IdentifierInfo *II) : II(II) {3517 if (II) {3518 WasOutToDate = II->isOutOfDate();3519 if (WasOutToDate)3520 II->setOutOfDate(false);3521 }3522 }3523 3524 ~UpToDateIdentifierRAII() {3525 if (WasOutToDate)3526 II->setOutOfDate(true);3527 }3528 } UpToDate(Name.getAsIdentifierInfo());3529 3530 for (IdentifierResolver::iterator I = IdResolver.begin(Name),3531 IEnd = IdResolver.end();3532 I != IEnd; ++I) {3533 if (NamedDecl *Existing = getDeclForMerging(*I, TypedefNameForLinkage))3534 if (C.isSameEntity(Existing, D))3535 return FindExistingResult(Reader, D, Existing, AnonymousDeclNumber,3536 TypedefNameForLinkage);3537 }3538 } else if (DeclContext *MergeDC = getPrimaryContextForMerging(Reader, DC)) {3539 DeclContext::lookup_result R = MergeDC->noload_lookup(Name);3540 for (DeclContext::lookup_iterator I = R.begin(), E = R.end(); I != E; ++I) {3541 if (NamedDecl *Existing = getDeclForMerging(*I, TypedefNameForLinkage))3542 if (C.isSameEntity(Existing, D))3543 return FindExistingResult(Reader, D, Existing, AnonymousDeclNumber,3544 TypedefNameForLinkage);3545 }3546 } else {3547 // Not in a mergeable context.3548 return FindExistingResult(Reader);3549 }3550 3551 // If this declaration is from a merged context, make a note that we need to3552 // check that the canonical definition of that context contains the decl.3553 //3554 // Note that we don't perform ODR checks for decls from the global module3555 // fragment.3556 //3557 // FIXME: We should do something similar if we merge two definitions of the3558 // same template specialization into the same CXXRecordDecl.3559 auto MergedDCIt = Reader.MergedDeclContexts.find(D->getLexicalDeclContext());3560 if (MergedDCIt != Reader.MergedDeclContexts.end() &&3561 !shouldSkipCheckingODR(D) && MergedDCIt->second == D->getDeclContext() &&3562 !shouldSkipCheckingODR(cast<Decl>(D->getDeclContext())))3563 Reader.PendingOdrMergeChecks.push_back(D);3564 3565 return FindExistingResult(Reader, D, /*Existing=*/nullptr,3566 AnonymousDeclNumber, TypedefNameForLinkage);3567}3568 3569template<typename DeclT>3570Decl *ASTDeclReader::getMostRecentDeclImpl(Redeclarable<DeclT> *D) {3571 return D->RedeclLink.getLatestNotUpdated();3572}3573 3574Decl *ASTDeclReader::getMostRecentDeclImpl(...) {3575 llvm_unreachable("getMostRecentDecl on non-redeclarable declaration");3576}3577 3578Decl *ASTDeclReader::getMostRecentDecl(Decl *D) {3579 assert(D);3580 3581 switch (D->getKind()) {3582#define ABSTRACT_DECL(TYPE)3583#define DECL(TYPE, BASE) \3584 case Decl::TYPE: \3585 return getMostRecentDeclImpl(cast<TYPE##Decl>(D));3586#include "clang/AST/DeclNodes.inc"3587 }3588 llvm_unreachable("unknown decl kind");3589}3590 3591Decl *ASTReader::getMostRecentExistingDecl(Decl *D) {3592 return ASTDeclReader::getMostRecentDecl(D->getCanonicalDecl());3593}3594 3595namespace {3596void mergeInheritableAttributes(ASTReader &Reader, Decl *D, Decl *Previous) {3597 InheritableAttr *NewAttr = nullptr;3598 ASTContext &Context = Reader.getContext();3599 const auto *IA = Previous->getAttr<MSInheritanceAttr>();3600 3601 if (IA && !D->hasAttr<MSInheritanceAttr>()) {3602 NewAttr = cast<InheritableAttr>(IA->clone(Context));3603 NewAttr->setInherited(true);3604 D->addAttr(NewAttr);3605 }3606 3607 const auto *AA = Previous->getAttr<AvailabilityAttr>();3608 if (AA && !D->hasAttr<AvailabilityAttr>()) {3609 NewAttr = AA->clone(Context);3610 NewAttr->setInherited(true);3611 D->addAttr(NewAttr);3612 }3613}3614} // namespace3615 3616template<typename DeclT>3617void ASTDeclReader::attachPreviousDeclImpl(ASTReader &Reader,3618 Redeclarable<DeclT> *D,3619 Decl *Previous, Decl *Canon) {3620 D->RedeclLink.setPrevious(cast<DeclT>(Previous));3621 D->First = cast<DeclT>(Previous)->First;3622}3623 3624namespace clang {3625 3626template<>3627void ASTDeclReader::attachPreviousDeclImpl(ASTReader &Reader,3628 Redeclarable<VarDecl> *D,3629 Decl *Previous, Decl *Canon) {3630 auto *VD = static_cast<VarDecl *>(D);3631 auto *PrevVD = cast<VarDecl>(Previous);3632 D->RedeclLink.setPrevious(PrevVD);3633 D->First = PrevVD->First;3634 3635 // We should keep at most one definition on the chain.3636 // FIXME: Cache the definition once we've found it. Building a chain with3637 // N definitions currently takes O(N^2) time here.3638 if (VD->isThisDeclarationADefinition() == VarDecl::Definition) {3639 for (VarDecl *CurD = PrevVD; CurD; CurD = CurD->getPreviousDecl()) {3640 if (CurD->isThisDeclarationADefinition() == VarDecl::Definition) {3641 Reader.mergeDefinitionVisibility(CurD, VD);3642 VD->demoteThisDefinitionToDeclaration();3643 break;3644 }3645 }3646 }3647}3648 3649static bool isUndeducedReturnType(QualType T) {3650 auto *DT = T->getContainedDeducedType();3651 return DT && !DT->isDeduced();3652}3653 3654template<>3655void ASTDeclReader::attachPreviousDeclImpl(ASTReader &Reader,3656 Redeclarable<FunctionDecl> *D,3657 Decl *Previous, Decl *Canon) {3658 auto *FD = static_cast<FunctionDecl *>(D);3659 auto *PrevFD = cast<FunctionDecl>(Previous);3660 3661 FD->RedeclLink.setPrevious(PrevFD);3662 FD->First = PrevFD->First;3663 3664 // If the previous declaration is an inline function declaration, then this3665 // declaration is too.3666 if (PrevFD->isInlined() != FD->isInlined()) {3667 // FIXME: [dcl.fct.spec]p4:3668 // If a function with external linkage is declared inline in one3669 // translation unit, it shall be declared inline in all translation3670 // units in which it appears.3671 //3672 // Be careful of this case:3673 //3674 // module A:3675 // template<typename T> struct X { void f(); };3676 // template<typename T> inline void X<T>::f() {}3677 //3678 // module B instantiates the declaration of X<int>::f3679 // module C instantiates the definition of X<int>::f3680 //3681 // If module B and C are merged, we do not have a violation of this rule.3682 FD->setImplicitlyInline(true);3683 }3684 3685 auto *FPT = FD->getType()->getAs<FunctionProtoType>();3686 auto *PrevFPT = PrevFD->getType()->getAs<FunctionProtoType>();3687 if (FPT && PrevFPT) {3688 // If we need to propagate an exception specification along the redecl3689 // chain, make a note of that so that we can do so later.3690 bool IsUnresolved = isUnresolvedExceptionSpec(FPT->getExceptionSpecType());3691 bool WasUnresolved =3692 isUnresolvedExceptionSpec(PrevFPT->getExceptionSpecType());3693 if (IsUnresolved != WasUnresolved)3694 Reader.PendingExceptionSpecUpdates.insert(3695 {Canon, IsUnresolved ? PrevFD : FD});3696 3697 // If we need to propagate a deduced return type along the redecl chain,3698 // make a note of that so that we can do it later.3699 bool IsUndeduced = isUndeducedReturnType(FPT->getReturnType());3700 bool WasUndeduced = isUndeducedReturnType(PrevFPT->getReturnType());3701 if (IsUndeduced != WasUndeduced)3702 Reader.PendingDeducedTypeUpdates.insert(3703 {cast<FunctionDecl>(Canon),3704 (IsUndeduced ? PrevFPT : FPT)->getReturnType()});3705 }3706}3707 3708} // namespace clang3709 3710void ASTDeclReader::attachPreviousDeclImpl(ASTReader &Reader, ...) {3711 llvm_unreachable("attachPreviousDecl on non-redeclarable declaration");3712}3713 3714/// Inherit the default template argument from \p From to \p To. Returns3715/// \c false if there is no default template for \p From.3716template <typename ParmDecl>3717static bool inheritDefaultTemplateArgument(ASTContext &Context, ParmDecl *From,3718 Decl *ToD) {3719 auto *To = cast<ParmDecl>(ToD);3720 if (!From->hasDefaultArgument())3721 return false;3722 To->setInheritedDefaultArgument(Context, From);3723 return true;3724}3725 3726static void inheritDefaultTemplateArguments(ASTContext &Context,3727 TemplateDecl *From,3728 TemplateDecl *To) {3729 auto *FromTP = From->getTemplateParameters();3730 auto *ToTP = To->getTemplateParameters();3731 assert(FromTP->size() == ToTP->size() && "merged mismatched templates?");3732 3733 for (unsigned I = 0, N = FromTP->size(); I != N; ++I) {3734 NamedDecl *FromParam = FromTP->getParam(I);3735 NamedDecl *ToParam = ToTP->getParam(I);3736 3737 if (auto *FTTP = dyn_cast<TemplateTypeParmDecl>(FromParam))3738 inheritDefaultTemplateArgument(Context, FTTP, ToParam);3739 else if (auto *FNTTP = dyn_cast<NonTypeTemplateParmDecl>(FromParam))3740 inheritDefaultTemplateArgument(Context, FNTTP, ToParam);3741 else3742 inheritDefaultTemplateArgument(3743 Context, cast<TemplateTemplateParmDecl>(FromParam), ToParam);3744 }3745}3746 3747// [basic.link]/p10:3748// If two declarations of an entity are attached to different modules,3749// the program is ill-formed;3750void ASTDeclReader::checkMultipleDefinitionInNamedModules(ASTReader &Reader,3751 Decl *D,3752 Decl *Previous) {3753 // If it is previous implcitly introduced, it is not meaningful to3754 // diagnose it.3755 if (Previous->isImplicit())3756 return;3757 3758 // FIXME: Get rid of the enumeration of decl types once we have an appropriate3759 // abstract for decls of an entity. e.g., the namespace decl and using decl3760 // doesn't introduce an entity.3761 if (!isa<VarDecl, FunctionDecl, TagDecl, RedeclarableTemplateDecl>(Previous))3762 return;3763 3764 // Skip implicit instantiations since it may give false positive diagnostic3765 // messages.3766 // FIXME: Maybe this shows the implicit instantiations may have incorrect3767 // module owner ships. But given we've finished the compilation of a module,3768 // how can we add new entities to that module?3769 if (isa<VarTemplateSpecializationDecl>(Previous))3770 return;3771 if (isa<ClassTemplateSpecializationDecl>(Previous))3772 return;3773 if (auto *Func = dyn_cast<FunctionDecl>(Previous);3774 Func && Func->getTemplateSpecializationInfo())3775 return;3776 3777 // The module ownership of in-class friend declaration is not straightforward.3778 // Avoid diagnosing such cases.3779 if (D->getFriendObjectKind() || Previous->getFriendObjectKind())3780 return;3781 3782 // Skip diagnosing in-class declarations.3783 if (!Previous->getLexicalDeclContext()3784 ->getNonTransparentContext()3785 ->isFileContext() ||3786 !D->getLexicalDeclContext()->getNonTransparentContext()->isFileContext())3787 return;3788 3789 Module *M = Previous->getOwningModule();3790 if (!M)3791 return;3792 3793 // We only forbids merging decls within named modules.3794 if (!M->isNamedModule()) {3795 // Try to warn the case that we merged decls from global module.3796 if (!M->isGlobalModule())3797 return;3798 3799 if (D->getOwningModule() &&3800 M->getTopLevelModule() == D->getOwningModule()->getTopLevelModule())3801 return;3802 3803 Reader.PendingWarningForDuplicatedDefsInModuleUnits.push_back(3804 {D, Previous});3805 return;3806 }3807 3808 // It is fine if they are in the same module.3809 if (Reader.getContext().isInSameModule(M, D->getOwningModule()))3810 return;3811 3812 Reader.Diag(Previous->getLocation(),3813 diag::err_multiple_decl_in_different_modules)3814 << cast<NamedDecl>(Previous) << M->Name;3815 Reader.Diag(D->getLocation(), diag::note_also_found);3816}3817 3818void ASTDeclReader::attachPreviousDecl(ASTReader &Reader, Decl *D,3819 Decl *Previous, Decl *Canon) {3820 assert(D && Previous);3821 3822 switch (D->getKind()) {3823#define ABSTRACT_DECL(TYPE)3824#define DECL(TYPE, BASE) \3825 case Decl::TYPE: \3826 attachPreviousDeclImpl(Reader, cast<TYPE##Decl>(D), Previous, Canon); \3827 break;3828#include "clang/AST/DeclNodes.inc"3829 }3830 3831 checkMultipleDefinitionInNamedModules(Reader, D, Previous);3832 3833 // If the declaration was visible in one module, a redeclaration of it in3834 // another module remains visible even if it wouldn't be visible by itself.3835 //3836 // FIXME: In this case, the declaration should only be visible if a module3837 // that makes it visible has been imported.3838 D->IdentifierNamespace |=3839 Previous->IdentifierNamespace &3840 (Decl::IDNS_Ordinary | Decl::IDNS_Tag | Decl::IDNS_Type);3841 3842 // If the declaration declares a template, it may inherit default arguments3843 // from the previous declaration.3844 if (auto *TD = dyn_cast<TemplateDecl>(D))3845 inheritDefaultTemplateArguments(Reader.getContext(),3846 cast<TemplateDecl>(Previous), TD);3847 3848 // If any of the declaration in the chain contains an Inheritable attribute,3849 // it needs to be added to all the declarations in the redeclarable chain.3850 // FIXME: Only the logic of merging MSInheritableAttr is present, it should3851 // be extended for all inheritable attributes.3852 mergeInheritableAttributes(Reader, D, Previous);3853}3854 3855template<typename DeclT>3856void ASTDeclReader::attachLatestDeclImpl(Redeclarable<DeclT> *D, Decl *Latest) {3857 D->RedeclLink.setLatest(cast<DeclT>(Latest));3858}3859 3860void ASTDeclReader::attachLatestDeclImpl(...) {3861 llvm_unreachable("attachLatestDecl on non-redeclarable declaration");3862}3863 3864void ASTDeclReader::attachLatestDecl(Decl *D, Decl *Latest) {3865 assert(D && Latest);3866 3867 switch (D->getKind()) {3868#define ABSTRACT_DECL(TYPE)3869#define DECL(TYPE, BASE) \3870 case Decl::TYPE: \3871 attachLatestDeclImpl(cast<TYPE##Decl>(D), Latest); \3872 break;3873#include "clang/AST/DeclNodes.inc"3874 }3875}3876 3877template<typename DeclT>3878void ASTDeclReader::markIncompleteDeclChainImpl(Redeclarable<DeclT> *D) {3879 D->RedeclLink.markIncomplete();3880}3881 3882void ASTDeclReader::markIncompleteDeclChainImpl(...) {3883 llvm_unreachable("markIncompleteDeclChain on non-redeclarable declaration");3884}3885 3886void ASTReader::markIncompleteDeclChain(Decl *D) {3887 switch (D->getKind()) {3888#define ABSTRACT_DECL(TYPE)3889#define DECL(TYPE, BASE) \3890 case Decl::TYPE: \3891 ASTDeclReader::markIncompleteDeclChainImpl(cast<TYPE##Decl>(D)); \3892 break;3893#include "clang/AST/DeclNodes.inc"3894 }3895}3896 3897/// Read the declaration at the given offset from the AST file.3898Decl *ASTReader::ReadDeclRecord(GlobalDeclID ID) {3899 SourceLocation DeclLoc;3900 RecordLocation Loc = DeclCursorForID(ID, DeclLoc);3901 llvm::BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;3902 // Keep track of where we are in the stream, then jump back there3903 // after reading this declaration.3904 SavedStreamPosition SavedPosition(DeclsCursor);3905 3906 ReadingKindTracker ReadingKind(Read_Decl, *this);3907 3908 // Note that we are loading a declaration record.3909 Deserializing ADecl(this);3910 3911 auto Fail = [](const char *what, llvm::Error &&Err) {3912 llvm::report_fatal_error(Twine("ASTReader::readDeclRecord failed ") + what +3913 ": " + toString(std::move(Err)));3914 };3915 3916 if (llvm::Error JumpFailed = DeclsCursor.JumpToBit(Loc.Offset))3917 Fail("jumping", std::move(JumpFailed));3918 ASTRecordReader Record(*this, *Loc.F);3919 ASTDeclReader Reader(*this, Record, Loc, ID, DeclLoc);3920 Expected<unsigned> MaybeCode = DeclsCursor.ReadCode();3921 if (!MaybeCode)3922 Fail("reading code", MaybeCode.takeError());3923 unsigned Code = MaybeCode.get();3924 3925 ASTContext &Context = getContext();3926 Decl *D = nullptr;3927 Expected<unsigned> MaybeDeclCode = Record.readRecord(DeclsCursor, Code);3928 if (!MaybeDeclCode)3929 llvm::report_fatal_error(3930 Twine("ASTReader::readDeclRecord failed reading decl code: ") +3931 toString(MaybeDeclCode.takeError()));3932 3933 switch ((DeclCode)MaybeDeclCode.get()) {3934 case DECL_CONTEXT_LEXICAL:3935 case DECL_CONTEXT_VISIBLE:3936 case DECL_CONTEXT_MODULE_LOCAL_VISIBLE:3937 case DECL_CONTEXT_TU_LOCAL_VISIBLE:3938 case DECL_SPECIALIZATIONS:3939 case DECL_PARTIAL_SPECIALIZATIONS:3940 llvm_unreachable("Record cannot be de-serialized with readDeclRecord");3941 case DECL_TYPEDEF:3942 D = TypedefDecl::CreateDeserialized(Context, ID);3943 break;3944 case DECL_TYPEALIAS:3945 D = TypeAliasDecl::CreateDeserialized(Context, ID);3946 break;3947 case DECL_ENUM:3948 D = EnumDecl::CreateDeserialized(Context, ID);3949 break;3950 case DECL_RECORD:3951 D = RecordDecl::CreateDeserialized(Context, ID);3952 break;3953 case DECL_ENUM_CONSTANT:3954 D = EnumConstantDecl::CreateDeserialized(Context, ID);3955 break;3956 case DECL_FUNCTION:3957 D = FunctionDecl::CreateDeserialized(Context, ID);3958 break;3959 case DECL_LINKAGE_SPEC:3960 D = LinkageSpecDecl::CreateDeserialized(Context, ID);3961 break;3962 case DECL_EXPORT:3963 D = ExportDecl::CreateDeserialized(Context, ID);3964 break;3965 case DECL_LABEL:3966 D = LabelDecl::CreateDeserialized(Context, ID);3967 break;3968 case DECL_NAMESPACE:3969 D = NamespaceDecl::CreateDeserialized(Context, ID);3970 break;3971 case DECL_NAMESPACE_ALIAS:3972 D = NamespaceAliasDecl::CreateDeserialized(Context, ID);3973 break;3974 case DECL_USING:3975 D = UsingDecl::CreateDeserialized(Context, ID);3976 break;3977 case DECL_USING_PACK:3978 D = UsingPackDecl::CreateDeserialized(Context, ID, Record.readInt());3979 break;3980 case DECL_USING_SHADOW:3981 D = UsingShadowDecl::CreateDeserialized(Context, ID);3982 break;3983 case DECL_USING_ENUM:3984 D = UsingEnumDecl::CreateDeserialized(Context, ID);3985 break;3986 case DECL_CONSTRUCTOR_USING_SHADOW:3987 D = ConstructorUsingShadowDecl::CreateDeserialized(Context, ID);3988 break;3989 case DECL_USING_DIRECTIVE:3990 D = UsingDirectiveDecl::CreateDeserialized(Context, ID);3991 break;3992 case DECL_UNRESOLVED_USING_VALUE:3993 D = UnresolvedUsingValueDecl::CreateDeserialized(Context, ID);3994 break;3995 case DECL_UNRESOLVED_USING_TYPENAME:3996 D = UnresolvedUsingTypenameDecl::CreateDeserialized(Context, ID);3997 break;3998 case DECL_UNRESOLVED_USING_IF_EXISTS:3999 D = UnresolvedUsingIfExistsDecl::CreateDeserialized(Context, ID);4000 break;4001 case DECL_CXX_RECORD:4002 D = CXXRecordDecl::CreateDeserialized(Context, ID);4003 break;4004 case DECL_CXX_DEDUCTION_GUIDE:4005 D = CXXDeductionGuideDecl::CreateDeserialized(Context, ID);4006 break;4007 case DECL_CXX_METHOD:4008 D = CXXMethodDecl::CreateDeserialized(Context, ID);4009 break;4010 case DECL_CXX_CONSTRUCTOR:4011 D = CXXConstructorDecl::CreateDeserialized(Context, ID, Record.readInt());4012 break;4013 case DECL_CXX_DESTRUCTOR:4014 D = CXXDestructorDecl::CreateDeserialized(Context, ID);4015 break;4016 case DECL_CXX_CONVERSION:4017 D = CXXConversionDecl::CreateDeserialized(Context, ID);4018 break;4019 case DECL_ACCESS_SPEC:4020 D = AccessSpecDecl::CreateDeserialized(Context, ID);4021 break;4022 case DECL_FRIEND:4023 D = FriendDecl::CreateDeserialized(Context, ID, Record.readInt());4024 break;4025 case DECL_FRIEND_TEMPLATE:4026 D = FriendTemplateDecl::CreateDeserialized(Context, ID);4027 break;4028 case DECL_CLASS_TEMPLATE:4029 D = ClassTemplateDecl::CreateDeserialized(Context, ID);4030 break;4031 case DECL_CLASS_TEMPLATE_SPECIALIZATION:4032 D = ClassTemplateSpecializationDecl::CreateDeserialized(Context, ID);4033 break;4034 case DECL_CLASS_TEMPLATE_PARTIAL_SPECIALIZATION:4035 D = ClassTemplatePartialSpecializationDecl::CreateDeserialized(Context, ID);4036 break;4037 case DECL_VAR_TEMPLATE:4038 D = VarTemplateDecl::CreateDeserialized(Context, ID);4039 break;4040 case DECL_VAR_TEMPLATE_SPECIALIZATION:4041 D = VarTemplateSpecializationDecl::CreateDeserialized(Context, ID);4042 break;4043 case DECL_VAR_TEMPLATE_PARTIAL_SPECIALIZATION:4044 D = VarTemplatePartialSpecializationDecl::CreateDeserialized(Context, ID);4045 break;4046 case DECL_FUNCTION_TEMPLATE:4047 D = FunctionTemplateDecl::CreateDeserialized(Context, ID);4048 break;4049 case DECL_TEMPLATE_TYPE_PARM: {4050 bool HasTypeConstraint = Record.readInt();4051 D = TemplateTypeParmDecl::CreateDeserialized(Context, ID,4052 HasTypeConstraint);4053 break;4054 }4055 case DECL_NON_TYPE_TEMPLATE_PARM: {4056 bool HasTypeConstraint = Record.readInt();4057 D = NonTypeTemplateParmDecl::CreateDeserialized(Context, ID,4058 HasTypeConstraint);4059 break;4060 }4061 case DECL_EXPANDED_NON_TYPE_TEMPLATE_PARM_PACK: {4062 bool HasTypeConstraint = Record.readInt();4063 D = NonTypeTemplateParmDecl::CreateDeserialized(4064 Context, ID, Record.readInt(), HasTypeConstraint);4065 break;4066 }4067 case DECL_TEMPLATE_TEMPLATE_PARM:4068 D = TemplateTemplateParmDecl::CreateDeserialized(Context, ID);4069 break;4070 case DECL_EXPANDED_TEMPLATE_TEMPLATE_PARM_PACK:4071 D = TemplateTemplateParmDecl::CreateDeserialized(Context, ID,4072 Record.readInt());4073 break;4074 case DECL_TYPE_ALIAS_TEMPLATE:4075 D = TypeAliasTemplateDecl::CreateDeserialized(Context, ID);4076 break;4077 case DECL_CONCEPT:4078 D = ConceptDecl::CreateDeserialized(Context, ID);4079 break;4080 case DECL_REQUIRES_EXPR_BODY:4081 D = RequiresExprBodyDecl::CreateDeserialized(Context, ID);4082 break;4083 case DECL_STATIC_ASSERT:4084 D = StaticAssertDecl::CreateDeserialized(Context, ID);4085 break;4086 case DECL_OBJC_METHOD:4087 D = ObjCMethodDecl::CreateDeserialized(Context, ID);4088 break;4089 case DECL_OBJC_INTERFACE:4090 D = ObjCInterfaceDecl::CreateDeserialized(Context, ID);4091 break;4092 case DECL_OBJC_IVAR:4093 D = ObjCIvarDecl::CreateDeserialized(Context, ID);4094 break;4095 case DECL_OBJC_PROTOCOL:4096 D = ObjCProtocolDecl::CreateDeserialized(Context, ID);4097 break;4098 case DECL_OBJC_AT_DEFS_FIELD:4099 D = ObjCAtDefsFieldDecl::CreateDeserialized(Context, ID);4100 break;4101 case DECL_OBJC_CATEGORY:4102 D = ObjCCategoryDecl::CreateDeserialized(Context, ID);4103 break;4104 case DECL_OBJC_CATEGORY_IMPL:4105 D = ObjCCategoryImplDecl::CreateDeserialized(Context, ID);4106 break;4107 case DECL_OBJC_IMPLEMENTATION:4108 D = ObjCImplementationDecl::CreateDeserialized(Context, ID);4109 break;4110 case DECL_OBJC_COMPATIBLE_ALIAS:4111 D = ObjCCompatibleAliasDecl::CreateDeserialized(Context, ID);4112 break;4113 case DECL_OBJC_PROPERTY:4114 D = ObjCPropertyDecl::CreateDeserialized(Context, ID);4115 break;4116 case DECL_OBJC_PROPERTY_IMPL:4117 D = ObjCPropertyImplDecl::CreateDeserialized(Context, ID);4118 break;4119 case DECL_FIELD:4120 D = FieldDecl::CreateDeserialized(Context, ID);4121 break;4122 case DECL_INDIRECTFIELD:4123 D = IndirectFieldDecl::CreateDeserialized(Context, ID);4124 break;4125 case DECL_VAR:4126 D = VarDecl::CreateDeserialized(Context, ID);4127 break;4128 case DECL_IMPLICIT_PARAM:4129 D = ImplicitParamDecl::CreateDeserialized(Context, ID);4130 break;4131 case DECL_PARM_VAR:4132 D = ParmVarDecl::CreateDeserialized(Context, ID);4133 break;4134 case DECL_DECOMPOSITION:4135 D = DecompositionDecl::CreateDeserialized(Context, ID, Record.readInt());4136 break;4137 case DECL_BINDING:4138 D = BindingDecl::CreateDeserialized(Context, ID);4139 break;4140 case DECL_FILE_SCOPE_ASM:4141 D = FileScopeAsmDecl::CreateDeserialized(Context, ID);4142 break;4143 case DECL_TOP_LEVEL_STMT_DECL:4144 D = TopLevelStmtDecl::CreateDeserialized(Context, ID);4145 break;4146 case DECL_BLOCK:4147 D = BlockDecl::CreateDeserialized(Context, ID);4148 break;4149 case DECL_MS_PROPERTY:4150 D = MSPropertyDecl::CreateDeserialized(Context, ID);4151 break;4152 case DECL_MS_GUID:4153 D = MSGuidDecl::CreateDeserialized(Context, ID);4154 break;4155 case DECL_UNNAMED_GLOBAL_CONSTANT:4156 D = UnnamedGlobalConstantDecl::CreateDeserialized(Context, ID);4157 break;4158 case DECL_TEMPLATE_PARAM_OBJECT:4159 D = TemplateParamObjectDecl::CreateDeserialized(Context, ID);4160 break;4161 case DECL_OUTLINEDFUNCTION:4162 D = OutlinedFunctionDecl::CreateDeserialized(Context, ID, Record.readInt());4163 break;4164 case DECL_CAPTURED:4165 D = CapturedDecl::CreateDeserialized(Context, ID, Record.readInt());4166 break;4167 case DECL_CXX_BASE_SPECIFIERS:4168 Error("attempt to read a C++ base-specifier record as a declaration");4169 return nullptr;4170 case DECL_CXX_CTOR_INITIALIZERS:4171 Error("attempt to read a C++ ctor initializer record as a declaration");4172 return nullptr;4173 case DECL_IMPORT:4174 // Note: last entry of the ImportDecl record is the number of stored source4175 // locations.4176 D = ImportDecl::CreateDeserialized(Context, ID, Record.back());4177 break;4178 case DECL_OMP_THREADPRIVATE: {4179 Record.skipInts(1);4180 unsigned NumChildren = Record.readInt();4181 Record.skipInts(1);4182 D = OMPThreadPrivateDecl::CreateDeserialized(Context, ID, NumChildren);4183 break;4184 }4185 case DECL_OMP_ALLOCATE: {4186 unsigned NumClauses = Record.readInt();4187 unsigned NumVars = Record.readInt();4188 Record.skipInts(1);4189 D = OMPAllocateDecl::CreateDeserialized(Context, ID, NumVars, NumClauses);4190 break;4191 }4192 case DECL_OMP_REQUIRES: {4193 unsigned NumClauses = Record.readInt();4194 Record.skipInts(2);4195 D = OMPRequiresDecl::CreateDeserialized(Context, ID, NumClauses);4196 break;4197 }4198 case DECL_OMP_DECLARE_REDUCTION:4199 D = OMPDeclareReductionDecl::CreateDeserialized(Context, ID);4200 break;4201 case DECL_OMP_DECLARE_MAPPER: {4202 unsigned NumClauses = Record.readInt();4203 Record.skipInts(2);4204 D = OMPDeclareMapperDecl::CreateDeserialized(Context, ID, NumClauses);4205 break;4206 }4207 case DECL_OMP_CAPTUREDEXPR:4208 D = OMPCapturedExprDecl::CreateDeserialized(Context, ID);4209 break;4210 case DECL_PRAGMA_COMMENT:4211 D = PragmaCommentDecl::CreateDeserialized(Context, ID, Record.readInt());4212 break;4213 case DECL_PRAGMA_DETECT_MISMATCH:4214 D = PragmaDetectMismatchDecl::CreateDeserialized(Context, ID,4215 Record.readInt());4216 break;4217 case DECL_EMPTY:4218 D = EmptyDecl::CreateDeserialized(Context, ID);4219 break;4220 case DECL_LIFETIME_EXTENDED_TEMPORARY:4221 D = LifetimeExtendedTemporaryDecl::CreateDeserialized(Context, ID);4222 break;4223 case DECL_OBJC_TYPE_PARAM:4224 D = ObjCTypeParamDecl::CreateDeserialized(Context, ID);4225 break;4226 case DECL_HLSL_BUFFER:4227 D = HLSLBufferDecl::CreateDeserialized(Context, ID);4228 break;4229 case DECL_IMPLICIT_CONCEPT_SPECIALIZATION:4230 D = ImplicitConceptSpecializationDecl::CreateDeserialized(Context, ID,4231 Record.readInt());4232 break;4233 case DECL_OPENACC_DECLARE:4234 D = OpenACCDeclareDecl::CreateDeserialized(Context, ID, Record.readInt());4235 break;4236 case DECL_OPENACC_ROUTINE:4237 D = OpenACCRoutineDecl::CreateDeserialized(Context, ID, Record.readInt());4238 break;4239 }4240 4241 assert(D && "Unknown declaration reading AST file");4242 LoadedDecl(translateGlobalDeclIDToIndex(ID), D);4243 // Set the DeclContext before doing any deserialization, to make sure internal4244 // calls to Decl::getASTContext() by Decl's methods will find the4245 // TranslationUnitDecl without crashing.4246 D->setDeclContext(Context.getTranslationUnitDecl());4247 4248 // Reading some declarations can result in deep recursion.4249 runWithSufficientStackSpace(DeclLoc, [&] { Reader.Visit(D); });4250 4251 // If this declaration is also a declaration context, get the4252 // offsets for its tables of lexical and visible declarations.4253 if (auto *DC = dyn_cast<DeclContext>(D)) {4254 LookupBlockOffsets Offsets;4255 4256 Reader.VisitDeclContext(DC, Offsets);4257 4258 // Get the lexical and visible block for the delayed namespace.4259 // It is sufficient to judge if ID is in DelayedNamespaceOffsetMap.4260 // But it may be more efficient to filter the other cases.4261 if (!Offsets && isa<NamespaceDecl>(D))4262 if (auto Iter = DelayedNamespaceOffsetMap.find(ID);4263 Iter != DelayedNamespaceOffsetMap.end())4264 Offsets = Iter->second;4265 4266 if (Offsets.VisibleOffset &&4267 ReadVisibleDeclContextStorage(4268 *Loc.F, DeclsCursor, Offsets.VisibleOffset, ID,4269 VisibleDeclContextStorageKind::GenerallyVisible))4270 return nullptr;4271 if (Offsets.ModuleLocalOffset &&4272 ReadVisibleDeclContextStorage(4273 *Loc.F, DeclsCursor, Offsets.ModuleLocalOffset, ID,4274 VisibleDeclContextStorageKind::ModuleLocalVisible))4275 return nullptr;4276 if (Offsets.TULocalOffset &&4277 ReadVisibleDeclContextStorage(4278 *Loc.F, DeclsCursor, Offsets.TULocalOffset, ID,4279 VisibleDeclContextStorageKind::TULocalVisible))4280 return nullptr;4281 4282 if (Offsets.LexicalOffset &&4283 ReadLexicalDeclContextStorage(*Loc.F, DeclsCursor,4284 Offsets.LexicalOffset, DC))4285 return nullptr;4286 }4287 assert(Record.getIdx() == Record.size());4288 4289 // Load any relevant update records.4290 PendingUpdateRecords.push_back(4291 PendingUpdateRecord(ID, D, /*JustLoaded=*/true));4292 4293 // Load the categories after recursive loading is finished.4294 if (auto *Class = dyn_cast<ObjCInterfaceDecl>(D))4295 // If we already have a definition when deserializing the ObjCInterfaceDecl,4296 // we put the Decl in PendingDefinitions so we can pull the categories here.4297 if (Class->isThisDeclarationADefinition() ||4298 PendingDefinitions.count(Class))4299 loadObjCCategories(ID, Class);4300 4301 // If we have deserialized a declaration that has a definition the4302 // AST consumer might need to know about, queue it.4303 // We don't pass it to the consumer immediately because we may be in recursive4304 // loading, and some declarations may still be initializing.4305 PotentiallyInterestingDecls.push_back(D);4306 4307 return D;4308}4309 4310void ASTReader::PassInterestingDeclsToConsumer() {4311 assert(Consumer);4312 4313 if (!CanPassDeclsToConsumer)4314 return;4315 4316 // Guard variable to avoid recursively redoing the process of passing4317 // decls to consumer.4318 SaveAndRestore GuardPassingDeclsToConsumer(CanPassDeclsToConsumer,4319 /*NewValue=*/false);4320 4321 // Ensure that we've loaded all potentially-interesting declarations4322 // that need to be eagerly loaded.4323 for (auto ID : EagerlyDeserializedDecls)4324 GetDecl(ID);4325 EagerlyDeserializedDecls.clear();4326 4327 auto ConsumingPotentialInterestingDecls = [this]() {4328 while (!PotentiallyInterestingDecls.empty()) {4329 Decl *D = PotentiallyInterestingDecls.front();4330 PotentiallyInterestingDecls.pop_front();4331 if (isConsumerInterestedIn(D))4332 PassInterestingDeclToConsumer(D);4333 }4334 };4335 std::deque<Decl *> MaybeInterestingDecls =4336 std::move(PotentiallyInterestingDecls);4337 PotentiallyInterestingDecls.clear();4338 assert(PotentiallyInterestingDecls.empty());4339 while (!MaybeInterestingDecls.empty()) {4340 Decl *D = MaybeInterestingDecls.front();4341 MaybeInterestingDecls.pop_front();4342 // Since we load the variable's initializers lazily, it'd be problematic4343 // if the initializers dependent on each other. So here we try to load the4344 // initializers of static variables to make sure they are passed to code4345 // generator by order. If we read anything interesting, we would consume4346 // that before emitting the current declaration.4347 if (auto *VD = dyn_cast<VarDecl>(D);4348 VD && VD->isFileVarDecl() && !VD->isExternallyVisible())4349 VD->getInit();4350 ConsumingPotentialInterestingDecls();4351 if (isConsumerInterestedIn(D))4352 PassInterestingDeclToConsumer(D);4353 }4354 4355 // If we add any new potential interesting decl in the last call, consume it.4356 ConsumingPotentialInterestingDecls();4357 4358 for (GlobalDeclID ID : VTablesToEmit) {4359 auto *RD = cast<CXXRecordDecl>(GetDecl(ID));4360 assert(!RD->shouldEmitInExternalSource());4361 PassVTableToConsumer(RD);4362 }4363 VTablesToEmit.clear();4364}4365 4366void ASTReader::loadDeclUpdateRecords(PendingUpdateRecord &Record) {4367 // The declaration may have been modified by files later in the chain.4368 // If this is the case, read the record containing the updates from each file4369 // and pass it to ASTDeclReader to make the modifications.4370 GlobalDeclID ID = Record.ID;4371 Decl *D = Record.D;4372 ProcessingUpdatesRAIIObj ProcessingUpdates(*this);4373 DeclUpdateOffsetsMap::iterator UpdI = DeclUpdateOffsets.find(ID);4374 4375 if (UpdI != DeclUpdateOffsets.end()) {4376 auto UpdateOffsets = std::move(UpdI->second);4377 DeclUpdateOffsets.erase(UpdI);4378 4379 // Check if this decl was interesting to the consumer. If we just loaded4380 // the declaration, then we know it was interesting and we skip the call4381 // to isConsumerInterestedIn because it is unsafe to call in the4382 // current ASTReader state.4383 bool WasInteresting = Record.JustLoaded || isConsumerInterestedIn(D);4384 for (auto &FileAndOffset : UpdateOffsets) {4385 ModuleFile *F = FileAndOffset.first;4386 uint64_t Offset = FileAndOffset.second;4387 llvm::BitstreamCursor &Cursor = F->DeclsCursor;4388 SavedStreamPosition SavedPosition(Cursor);4389 if (llvm::Error JumpFailed = Cursor.JumpToBit(Offset))4390 // FIXME don't do a fatal error.4391 llvm::report_fatal_error(4392 Twine("ASTReader::loadDeclUpdateRecords failed jumping: ") +4393 toString(std::move(JumpFailed)));4394 Expected<unsigned> MaybeCode = Cursor.ReadCode();4395 if (!MaybeCode)4396 llvm::report_fatal_error(4397 Twine("ASTReader::loadDeclUpdateRecords failed reading code: ") +4398 toString(MaybeCode.takeError()));4399 unsigned Code = MaybeCode.get();4400 ASTRecordReader Record(*this, *F);4401 if (Expected<unsigned> MaybeRecCode = Record.readRecord(Cursor, Code))4402 assert(MaybeRecCode.get() == DECL_UPDATES &&4403 "Expected DECL_UPDATES record!");4404 else4405 llvm::report_fatal_error(4406 Twine("ASTReader::loadDeclUpdateRecords failed reading rec code: ") +4407 toString(MaybeCode.takeError()));4408 4409 ASTDeclReader Reader(*this, Record, RecordLocation(F, Offset), ID,4410 SourceLocation());4411 Reader.UpdateDecl(D);4412 4413 // We might have made this declaration interesting. If so, remember that4414 // we need to hand it off to the consumer.4415 if (!WasInteresting && isConsumerInterestedIn(D)) {4416 PotentiallyInterestingDecls.push_back(D);4417 WasInteresting = true;4418 }4419 }4420 }4421 4422 // Load the pending visible updates for this decl context, if it has any.4423 if (auto I = PendingVisibleUpdates.find(ID);4424 I != PendingVisibleUpdates.end()) {4425 auto VisibleUpdates = std::move(I->second);4426 PendingVisibleUpdates.erase(I);4427 4428 auto *DC = cast<DeclContext>(D)->getPrimaryContext();4429 for (const auto &Update : VisibleUpdates)4430 Lookups[DC].Table.add(4431 Update.Mod, Update.Data,4432 reader::ASTDeclContextNameLookupTrait(*this, *Update.Mod));4433 DC->setHasExternalVisibleStorage(true);4434 }4435 4436 if (auto I = PendingModuleLocalVisibleUpdates.find(ID);4437 I != PendingModuleLocalVisibleUpdates.end()) {4438 auto ModuleLocalVisibleUpdates = std::move(I->second);4439 PendingModuleLocalVisibleUpdates.erase(I);4440 4441 auto *DC = cast<DeclContext>(D)->getPrimaryContext();4442 for (const auto &Update : ModuleLocalVisibleUpdates)4443 ModuleLocalLookups[DC].Table.add(4444 Update.Mod, Update.Data,4445 reader::ModuleLocalNameLookupTrait(*this, *Update.Mod));4446 // NOTE: Can we optimize the case that the data being loaded4447 // is not related to current module?4448 DC->setHasExternalVisibleStorage(true);4449 }4450 4451 if (auto I = TULocalUpdates.find(ID); I != TULocalUpdates.end()) {4452 auto Updates = std::move(I->second);4453 TULocalUpdates.erase(I);4454 4455 auto *DC = cast<DeclContext>(D)->getPrimaryContext();4456 for (const auto &Update : Updates)4457 TULocalLookups[DC].Table.add(4458 Update.Mod, Update.Data,4459 reader::ASTDeclContextNameLookupTrait(*this, *Update.Mod));4460 DC->setHasExternalVisibleStorage(true);4461 }4462 4463 // Load any pending related decls.4464 if (D->isCanonicalDecl()) {4465 if (auto IT = RelatedDeclsMap.find(ID); IT != RelatedDeclsMap.end()) {4466 for (auto LID : IT->second)4467 GetDecl(LID);4468 RelatedDeclsMap.erase(IT);4469 }4470 }4471 4472 // Load the pending specializations update for this decl, if it has any.4473 if (auto I = PendingSpecializationsUpdates.find(ID);4474 I != PendingSpecializationsUpdates.end()) {4475 auto SpecializationUpdates = std::move(I->second);4476 PendingSpecializationsUpdates.erase(I);4477 4478 for (const auto &Update : SpecializationUpdates)4479 AddSpecializations(D, Update.Data, *Update.Mod, /*IsPartial=*/false);4480 }4481 4482 // Load the pending specializations update for this decl, if it has any.4483 if (auto I = PendingPartialSpecializationsUpdates.find(ID);4484 I != PendingPartialSpecializationsUpdates.end()) {4485 auto SpecializationUpdates = std::move(I->second);4486 PendingPartialSpecializationsUpdates.erase(I);4487 4488 for (const auto &Update : SpecializationUpdates)4489 AddSpecializations(D, Update.Data, *Update.Mod, /*IsPartial=*/true);4490 }4491}4492 4493void ASTReader::loadPendingDeclChain(Decl *FirstLocal, uint64_t LocalOffset) {4494 // Attach FirstLocal to the end of the decl chain.4495 Decl *CanonDecl = FirstLocal->getCanonicalDecl();4496 if (FirstLocal != CanonDecl) {4497 Decl *PrevMostRecent = ASTDeclReader::getMostRecentDecl(CanonDecl);4498 ASTDeclReader::attachPreviousDecl(4499 *this, FirstLocal, PrevMostRecent ? PrevMostRecent : CanonDecl,4500 CanonDecl);4501 }4502 4503 if (!LocalOffset) {4504 ASTDeclReader::attachLatestDecl(CanonDecl, FirstLocal);4505 return;4506 }4507 4508 // Load the list of other redeclarations from this module file.4509 ModuleFile *M = getOwningModuleFile(FirstLocal);4510 assert(M && "imported decl from no module file");4511 4512 llvm::BitstreamCursor &Cursor = M->DeclsCursor;4513 SavedStreamPosition SavedPosition(Cursor);4514 if (llvm::Error JumpFailed = Cursor.JumpToBit(LocalOffset))4515 llvm::report_fatal_error(4516 Twine("ASTReader::loadPendingDeclChain failed jumping: ") +4517 toString(std::move(JumpFailed)));4518 4519 RecordData Record;4520 Expected<unsigned> MaybeCode = Cursor.ReadCode();4521 if (!MaybeCode)4522 llvm::report_fatal_error(4523 Twine("ASTReader::loadPendingDeclChain failed reading code: ") +4524 toString(MaybeCode.takeError()));4525 unsigned Code = MaybeCode.get();4526 if (Expected<unsigned> MaybeRecCode = Cursor.readRecord(Code, Record))4527 assert(MaybeRecCode.get() == LOCAL_REDECLARATIONS &&4528 "expected LOCAL_REDECLARATIONS record!");4529 else4530 llvm::report_fatal_error(4531 Twine("ASTReader::loadPendingDeclChain failed reading rec code: ") +4532 toString(MaybeCode.takeError()));4533 4534 // FIXME: We have several different dispatches on decl kind here; maybe4535 // we should instead generate one loop per kind and dispatch up-front?4536 Decl *MostRecent = FirstLocal;4537 for (unsigned I = 0, N = Record.size(); I != N; ++I) {4538 unsigned Idx = N - I - 1;4539 auto *D = ReadDecl(*M, Record, Idx);4540 ASTDeclReader::attachPreviousDecl(*this, D, MostRecent, CanonDecl);4541 MostRecent = D;4542 }4543 ASTDeclReader::attachLatestDecl(CanonDecl, MostRecent);4544}4545 4546namespace {4547 4548 /// Given an ObjC interface, goes through the modules and links to the4549 /// interface all the categories for it.4550 class ObjCCategoriesVisitor {4551 ASTReader &Reader;4552 ObjCInterfaceDecl *Interface;4553 llvm::SmallPtrSetImpl<ObjCCategoryDecl *> &Deserialized;4554 ObjCCategoryDecl *Tail = nullptr;4555 llvm::DenseMap<DeclarationName, ObjCCategoryDecl *> NameCategoryMap;4556 GlobalDeclID InterfaceID;4557 unsigned PreviousGeneration;4558 4559 void add(ObjCCategoryDecl *Cat) {4560 // Only process each category once.4561 if (!Deserialized.erase(Cat))4562 return;4563 4564 // Check for duplicate categories.4565 if (Cat->getDeclName()) {4566 ObjCCategoryDecl *&Existing = NameCategoryMap[Cat->getDeclName()];4567 if (Existing && Reader.getOwningModuleFile(Existing) !=4568 Reader.getOwningModuleFile(Cat)) {4569 StructuralEquivalenceContext::NonEquivalentDeclSet NonEquivalentDecls;4570 StructuralEquivalenceContext Ctx(4571 Reader.getContext().getLangOpts(), Cat->getASTContext(),4572 Existing->getASTContext(), NonEquivalentDecls,4573 StructuralEquivalenceKind::Default,4574 /*StrictTypeSpelling=*/false,4575 /*Complain=*/false,4576 /*ErrorOnTagTypeMismatch=*/true);4577 if (!Ctx.IsEquivalent(Cat, Existing)) {4578 // Warn only if the categories with the same name are different.4579 Reader.Diag(Cat->getLocation(), diag::warn_dup_category_def)4580 << Interface->getDeclName() << Cat->getDeclName();4581 Reader.Diag(Existing->getLocation(),4582 diag::note_previous_definition);4583 }4584 } else if (!Existing) {4585 // Record this category.4586 Existing = Cat;4587 }4588 }4589 4590 // Add this category to the end of the chain.4591 if (Tail)4592 ASTDeclReader::setNextObjCCategory(Tail, Cat);4593 else4594 Interface->setCategoryListRaw(Cat);4595 Tail = Cat;4596 }4597 4598 public:4599 ObjCCategoriesVisitor(4600 ASTReader &Reader, ObjCInterfaceDecl *Interface,4601 llvm::SmallPtrSetImpl<ObjCCategoryDecl *> &Deserialized,4602 GlobalDeclID InterfaceID, unsigned PreviousGeneration)4603 : Reader(Reader), Interface(Interface), Deserialized(Deserialized),4604 InterfaceID(InterfaceID), PreviousGeneration(PreviousGeneration) {4605 // Populate the name -> category map with the set of known categories.4606 for (auto *Cat : Interface->known_categories()) {4607 if (Cat->getDeclName())4608 NameCategoryMap[Cat->getDeclName()] = Cat;4609 4610 // Keep track of the tail of the category list.4611 Tail = Cat;4612 }4613 }4614 4615 bool operator()(ModuleFile &M) {4616 // If we've loaded all of the category information we care about from4617 // this module file, we're done.4618 if (M.Generation <= PreviousGeneration)4619 return true;4620 4621 // Map global ID of the definition down to the local ID used in this4622 // module file. If there is no such mapping, we'll find nothing here4623 // (or in any module it imports).4624 LocalDeclID LocalID =4625 Reader.mapGlobalIDToModuleFileGlobalID(M, InterfaceID);4626 if (LocalID.isInvalid())4627 return true;4628 4629 // Perform a binary search to find the local redeclarations for this4630 // declaration (if any).4631 const ObjCCategoriesInfo Compare = {LocalID, 0};4632 const ObjCCategoriesInfo *Result = std::lower_bound(4633 M.ObjCCategoriesMap,4634 M.ObjCCategoriesMap + M.LocalNumObjCCategoriesInMap, Compare);4635 if (Result == M.ObjCCategoriesMap + M.LocalNumObjCCategoriesInMap ||4636 LocalID != Result->getDefinitionID()) {4637 // We didn't find anything. If the class definition is in this module4638 // file, then the module files it depends on cannot have any categories,4639 // so suppress further lookup.4640 return Reader.isDeclIDFromModule(InterfaceID, M);4641 }4642 4643 // We found something. Dig out all of the categories.4644 unsigned Offset = Result->Offset;4645 unsigned N = M.ObjCCategories[Offset];4646 M.ObjCCategories[Offset++] = 0; // Don't try to deserialize again4647 for (unsigned I = 0; I != N; ++I)4648 add(Reader.ReadDeclAs<ObjCCategoryDecl>(M, M.ObjCCategories, Offset));4649 return true;4650 }4651 };4652 4653} // namespace4654 4655void ASTReader::loadObjCCategories(GlobalDeclID ID, ObjCInterfaceDecl *D,4656 unsigned PreviousGeneration) {4657 ObjCCategoriesVisitor Visitor(*this, D, CategoriesDeserialized, ID,4658 PreviousGeneration);4659 ModuleMgr.visit(Visitor);4660}4661 4662template<typename DeclT, typename Fn>4663static void forAllLaterRedecls(DeclT *D, Fn F) {4664 F(D);4665 4666 // Check whether we've already merged D into its redeclaration chain.4667 // MostRecent may or may not be nullptr if D has not been merged. If4668 // not, walk the merged redecl chain and see if it's there.4669 auto *MostRecent = D->getMostRecentDecl();4670 bool Found = false;4671 for (auto *Redecl = MostRecent; Redecl && !Found;4672 Redecl = Redecl->getPreviousDecl())4673 Found = (Redecl == D);4674 4675 // If this declaration is merged, apply the functor to all later decls.4676 if (Found) {4677 for (auto *Redecl = MostRecent; Redecl != D;4678 Redecl = Redecl->getPreviousDecl())4679 F(Redecl);4680 }4681}4682 4683void ASTDeclReader::UpdateDecl(Decl *D) {4684 while (Record.getIdx() < Record.size()) {4685 switch ((DeclUpdateKind)Record.readInt()) {4686 case DeclUpdateKind::CXXAddedImplicitMember: {4687 auto *RD = cast<CXXRecordDecl>(D);4688 Decl *MD = Record.readDecl();4689 assert(MD && "couldn't read decl from update record");4690 Reader.PendingAddedClassMembers.push_back({RD, MD});4691 break;4692 }4693 4694 case DeclUpdateKind::CXXAddedAnonymousNamespace: {4695 auto *Anon = readDeclAs<NamespaceDecl>();4696 4697 // Each module has its own anonymous namespace, which is disjoint from4698 // any other module's anonymous namespaces, so don't attach the anonymous4699 // namespace at all.4700 if (!Record.isModule()) {4701 if (auto *TU = dyn_cast<TranslationUnitDecl>(D))4702 TU->setAnonymousNamespace(Anon);4703 else4704 cast<NamespaceDecl>(D)->setAnonymousNamespace(Anon);4705 }4706 break;4707 }4708 4709 case DeclUpdateKind::CXXAddedVarDefinition: {4710 auto *VD = cast<VarDecl>(D);4711 VD->NonParmVarDeclBits.IsInline = Record.readInt();4712 VD->NonParmVarDeclBits.IsInlineSpecified = Record.readInt();4713 ReadVarDeclInit(VD);4714 break;4715 }4716 4717 case DeclUpdateKind::CXXPointOfInstantiation: {4718 SourceLocation POI = Record.readSourceLocation();4719 if (auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D)) {4720 VTSD->setPointOfInstantiation(POI);4721 } else if (auto *VD = dyn_cast<VarDecl>(D)) {4722 MemberSpecializationInfo *MSInfo = VD->getMemberSpecializationInfo();4723 assert(MSInfo && "No member specialization information");4724 MSInfo->setPointOfInstantiation(POI);4725 } else {4726 auto *FD = cast<FunctionDecl>(D);4727 if (auto *FTSInfo = dyn_cast<FunctionTemplateSpecializationInfo *>(4728 FD->TemplateOrSpecialization))4729 FTSInfo->setPointOfInstantiation(POI);4730 else4731 cast<MemberSpecializationInfo *>(FD->TemplateOrSpecialization)4732 ->setPointOfInstantiation(POI);4733 }4734 break;4735 }4736 4737 case DeclUpdateKind::CXXInstantiatedDefaultArgument: {4738 auto *Param = cast<ParmVarDecl>(D);4739 4740 // We have to read the default argument regardless of whether we use it4741 // so that hypothetical further update records aren't messed up.4742 // TODO: Add a function to skip over the next expr record.4743 auto *DefaultArg = Record.readExpr();4744 4745 // Only apply the update if the parameter still has an uninstantiated4746 // default argument.4747 if (Param->hasUninstantiatedDefaultArg())4748 Param->setDefaultArg(DefaultArg);4749 break;4750 }4751 4752 case DeclUpdateKind::CXXInstantiatedDefaultMemberInitializer: {4753 auto *FD = cast<FieldDecl>(D);4754 auto *DefaultInit = Record.readExpr();4755 4756 // Only apply the update if the field still has an uninstantiated4757 // default member initializer.4758 if (FD->hasInClassInitializer() && !FD->hasNonNullInClassInitializer()) {4759 if (DefaultInit)4760 FD->setInClassInitializer(DefaultInit);4761 else4762 // Instantiation failed. We can get here if we serialized an AST for4763 // an invalid program.4764 FD->removeInClassInitializer();4765 }4766 break;4767 }4768 4769 case DeclUpdateKind::CXXAddedFunctionDefinition: {4770 auto *FD = cast<FunctionDecl>(D);4771 if (Reader.PendingBodies[FD]) {4772 // FIXME: Maybe check for ODR violations.4773 // It's safe to stop now because this update record is always last.4774 return;4775 }4776 4777 if (Record.readInt()) {4778 // Maintain AST consistency: any later redeclarations of this function4779 // are inline if this one is. (We might have merged another declaration4780 // into this one.)4781 forAllLaterRedecls(FD, [](FunctionDecl *FD) {4782 FD->setImplicitlyInline();4783 });4784 }4785 FD->setInnerLocStart(readSourceLocation());4786 ReadFunctionDefinition(FD);4787 assert(Record.getIdx() == Record.size() && "lazy body must be last");4788 break;4789 }4790 4791 case DeclUpdateKind::CXXInstantiatedClassDefinition: {4792 auto *RD = cast<CXXRecordDecl>(D);4793 auto *OldDD = RD->getCanonicalDecl()->DefinitionData;4794 bool HadRealDefinition =4795 OldDD && (OldDD->Definition != RD ||4796 !Reader.PendingFakeDefinitionData.count(OldDD));4797 RD->setParamDestroyedInCallee(Record.readInt());4798 RD->setArgPassingRestrictions(4799 static_cast<RecordArgPassingKind>(Record.readInt()));4800 ReadCXXRecordDefinition(RD, /*Update*/true);4801 4802 // Visible update is handled separately.4803 uint64_t LexicalOffset = ReadLocalOffset();4804 if (!HadRealDefinition && LexicalOffset) {4805 Record.readLexicalDeclContextStorage(LexicalOffset, RD);4806 Reader.PendingFakeDefinitionData.erase(OldDD);4807 }4808 4809 auto TSK = (TemplateSpecializationKind)Record.readInt();4810 SourceLocation POI = readSourceLocation();4811 if (MemberSpecializationInfo *MSInfo =4812 RD->getMemberSpecializationInfo()) {4813 MSInfo->setTemplateSpecializationKind(TSK);4814 MSInfo->setPointOfInstantiation(POI);4815 } else {4816 auto *Spec = cast<ClassTemplateSpecializationDecl>(RD);4817 Spec->setTemplateSpecializationKind(TSK);4818 Spec->setPointOfInstantiation(POI);4819 4820 if (Record.readInt()) {4821 auto *PartialSpec =4822 readDeclAs<ClassTemplatePartialSpecializationDecl>();4823 SmallVector<TemplateArgument, 8> TemplArgs;4824 Record.readTemplateArgumentList(TemplArgs);4825 auto *TemplArgList = TemplateArgumentList::CreateCopy(4826 Reader.getContext(), TemplArgs);4827 4828 // FIXME: If we already have a partial specialization set,4829 // check that it matches.4830 if (!isa<ClassTemplatePartialSpecializationDecl *>(4831 Spec->getSpecializedTemplateOrPartial()))4832 Spec->setInstantiationOf(PartialSpec, TemplArgList);4833 }4834 }4835 4836 RD->setTagKind(static_cast<TagTypeKind>(Record.readInt()));4837 RD->setLocation(readSourceLocation());4838 RD->setLocStart(readSourceLocation());4839 RD->setBraceRange(readSourceRange());4840 4841 if (Record.readInt()) {4842 AttrVec Attrs;4843 Record.readAttributes(Attrs);4844 // If the declaration already has attributes, we assume that some other4845 // AST file already loaded them.4846 if (!D->hasAttrs())4847 D->setAttrsImpl(Attrs, Reader.getContext());4848 }4849 break;4850 }4851 4852 case DeclUpdateKind::CXXResolvedDtorDelete: {4853 // Set the 'operator delete' directly to avoid emitting another update4854 // record.4855 auto *Del = readDeclAs<FunctionDecl>();4856 auto *First = cast<CXXDestructorDecl>(D->getCanonicalDecl());4857 auto *ThisArg = Record.readExpr();4858 // FIXME: Check consistency if we have an old and new operator delete.4859 if (!First->OperatorDelete) {4860 First->OperatorDelete = Del;4861 First->OperatorDeleteThisArg = ThisArg;4862 }4863 break;4864 }4865 4866 case DeclUpdateKind::CXXResolvedDtorGlobDelete: {4867 auto *Del = readDeclAs<FunctionDecl>();4868 auto *Canon = cast<CXXDestructorDecl>(D->getCanonicalDecl());4869 if (!Canon->OperatorGlobalDelete)4870 Canon->OperatorGlobalDelete = Del;4871 break;4872 }4873 4874 case DeclUpdateKind::CXXResolvedExceptionSpec: {4875 SmallVector<QualType, 8> ExceptionStorage;4876 auto ESI = Record.readExceptionSpecInfo(ExceptionStorage);4877 4878 // Update this declaration's exception specification, if needed.4879 auto *FD = cast<FunctionDecl>(D);4880 auto *FPT = FD->getType()->castAs<FunctionProtoType>();4881 // FIXME: If the exception specification is already present, check that it4882 // matches.4883 if (isUnresolvedExceptionSpec(FPT->getExceptionSpecType())) {4884 FD->setType(Reader.getContext().getFunctionType(4885 FPT->getReturnType(), FPT->getParamTypes(),4886 FPT->getExtProtoInfo().withExceptionSpec(ESI)));4887 4888 // When we get to the end of deserializing, see if there are other decls4889 // that we need to propagate this exception specification onto.4890 Reader.PendingExceptionSpecUpdates.insert(4891 std::make_pair(FD->getCanonicalDecl(), FD));4892 }4893 break;4894 }4895 4896 case DeclUpdateKind::CXXDeducedReturnType: {4897 auto *FD = cast<FunctionDecl>(D);4898 QualType DeducedResultType = Record.readType();4899 Reader.PendingDeducedTypeUpdates.insert(4900 {FD->getCanonicalDecl(), DeducedResultType});4901 break;4902 }4903 4904 case DeclUpdateKind::DeclMarkedUsed:4905 // Maintain AST consistency: any later redeclarations are used too.4906 D->markUsed(Reader.getContext());4907 break;4908 4909 case DeclUpdateKind::ManglingNumber:4910 Reader.getContext().setManglingNumber(cast<NamedDecl>(D),4911 Record.readInt());4912 break;4913 4914 case DeclUpdateKind::StaticLocalNumber:4915 Reader.getContext().setStaticLocalNumber(cast<VarDecl>(D),4916 Record.readInt());4917 break;4918 4919 case DeclUpdateKind::DeclMarkedOpenMPThreadPrivate:4920 D->addAttr(OMPThreadPrivateDeclAttr::CreateImplicit(Reader.getContext(),4921 readSourceRange()));4922 break;4923 4924 case DeclUpdateKind::DeclMarkedOpenMPAllocate: {4925 auto AllocatorKind =4926 static_cast<OMPAllocateDeclAttr::AllocatorTypeTy>(Record.readInt());4927 Expr *Allocator = Record.readExpr();4928 Expr *Alignment = Record.readExpr();4929 SourceRange SR = readSourceRange();4930 D->addAttr(OMPAllocateDeclAttr::CreateImplicit(4931 Reader.getContext(), AllocatorKind, Allocator, Alignment, SR));4932 break;4933 }4934 4935 case DeclUpdateKind::DeclExported: {4936 unsigned SubmoduleID = readSubmoduleID();4937 auto *Exported = cast<NamedDecl>(D);4938 Module *Owner = SubmoduleID ? Reader.getSubmodule(SubmoduleID) : nullptr;4939 Reader.getContext().mergeDefinitionIntoModule(Exported, Owner);4940 Reader.PendingMergedDefinitionsToDeduplicate.insert(Exported);4941 break;4942 }4943 4944 case DeclUpdateKind::DeclMarkedOpenMPDeclareTarget: {4945 auto MapType = Record.readEnum<OMPDeclareTargetDeclAttr::MapTypeTy>();4946 auto DevType = Record.readEnum<OMPDeclareTargetDeclAttr::DevTypeTy>();4947 Expr *IndirectE = Record.readExpr();4948 bool Indirect = Record.readBool();4949 unsigned Level = Record.readInt();4950 D->addAttr(OMPDeclareTargetDeclAttr::CreateImplicit(4951 Reader.getContext(), MapType, DevType, IndirectE, Indirect, Level,4952 readSourceRange()));4953 break;4954 }4955 4956 case DeclUpdateKind::AddedAttrToRecord:4957 AttrVec Attrs;4958 Record.readAttributes(Attrs);4959 assert(Attrs.size() == 1);4960 D->addAttr(Attrs[0]);4961 break;4962 }4963 }4964}4965