clang 24.0.0git
ASTReaderDecl.cpp
Go to the documentation of this file.
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-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements the ASTReader::readDeclRecord method, which is the
10// entrypoint for loading a decl.
11//
12//===----------------------------------------------------------------------===//
13
15#include "ASTCommon.h"
16#include "ASTReaderInternals.h"
20#include "clang/AST/Attr.h"
22#include "clang/AST/Decl.h"
23#include "clang/AST/DeclBase.h"
24#include "clang/AST/DeclCXX.h"
26#include "clang/AST/DeclObjC.h"
31#include "clang/AST/Expr.h"
37#include "clang/AST/Stmt.h"
39#include "clang/AST/Type.h"
45#include "clang/Basic/LLVM.h"
46#include "clang/Basic/Lambda.h"
48#include "clang/Basic/Linkage.h"
49#include "clang/Basic/Module.h"
58#include "llvm/ADT/DenseMap.h"
59#include "llvm/ADT/FoldingSet.h"
60#include "llvm/ADT/SmallPtrSet.h"
61#include "llvm/ADT/SmallVector.h"
62#include "llvm/ADT/iterator_range.h"
63#include "llvm/Bitstream/BitstreamReader.h"
64#include "llvm/Support/ErrorHandling.h"
65#include "llvm/Support/SaveAndRestore.h"
66#include <algorithm>
67#include <cassert>
68#include <cstdint>
69#include <cstring>
70#include <string>
71#include <utility>
72
73using namespace clang;
74using namespace serialization;
75
76//===----------------------------------------------------------------------===//
77// Declaration Merging
78//===----------------------------------------------------------------------===//
79
80namespace {
81/// Results from loading a RedeclarableDecl.
82class RedeclarableResult {
83 Decl *MergeWith;
84 GlobalDeclID FirstID;
85 bool IsKeyDecl;
86
87public:
88 RedeclarableResult(Decl *MergeWith, GlobalDeclID FirstID, bool IsKeyDecl)
89 : MergeWith(MergeWith), FirstID(FirstID), IsKeyDecl(IsKeyDecl) {}
90
91 /// Retrieve the first ID.
92 GlobalDeclID getFirstID() const { return FirstID; }
93
94 /// Is this declaration a key declaration?
95 bool isKeyDecl() const { return IsKeyDecl; }
96
97 /// Get a known declaration that this should be merged with, if
98 /// any.
99 Decl *getKnownMergeTarget() const { return MergeWith; }
100};
101} // namespace
102
103namespace clang {
105 ASTReader &Reader;
106
107public:
108 ASTDeclMerger(ASTReader &Reader) : Reader(Reader) {}
109
110 void mergeLambda(CXXRecordDecl *D, RedeclarableResult &Redecl, Decl &Context,
111 unsigned Number);
112
113 /// \param KeyDeclID the decl ID of the key declaration \param D.
114 /// GlobalDeclID() if \param is not a key declaration.
115 /// See the comments of ASTReader::KeyDecls for the explanation
116 /// of key declaration.
117 template <typename T>
118 void mergeRedeclarableImpl(Redeclarable<T> *D, T *Existing,
119 GlobalDeclID KeyDeclID);
120
121 template <typename T>
123 RedeclarableResult &Redecl) {
125 D, Existing, Redecl.isKeyDecl() ? Redecl.getFirstID() : GlobalDeclID());
126 }
127
129 RedeclarableTemplateDecl *Existing, bool IsKeyDecl);
130
132 struct CXXRecordDecl::DefinitionData &&NewDD);
134 struct ObjCInterfaceDecl::DefinitionData &&NewDD);
136 struct ObjCProtocolDecl::DefinitionData &&NewDD);
137};
138} // namespace clang
139
140//===----------------------------------------------------------------------===//
141// Declaration deserialization
142//===----------------------------------------------------------------------===//
143
144namespace clang {
145class ASTDeclReader : public DeclVisitor<ASTDeclReader, void> {
146 ASTReader &Reader;
147 ASTDeclMerger MergeImpl;
148 ASTRecordReader &Record;
149 ASTReader::RecordLocation Loc;
150 const GlobalDeclID ThisDeclID;
151 const SourceLocation ThisDeclLoc;
152
153 using RecordData = ASTReader::RecordData;
154
155 TypeID DeferredTypeID = 0;
156 unsigned AnonymousDeclNumber = 0;
157 GlobalDeclID NamedDeclForTagDecl = GlobalDeclID();
158 IdentifierInfo *TypedefNameForLinkage = nullptr;
159
160 /// A flag to carry the information for a decl from the entity is
161 /// used. We use it to delay the marking of the canonical decl as used until
162 /// the entire declaration is deserialized and merged.
163 bool IsDeclMarkedUsed = false;
164
165 uint64_t GetCurrentCursorOffset();
166
167 uint64_t ReadLocalOffset() {
168 uint64_t LocalOffset = Record.readInt();
169 assert(LocalOffset < Loc.Offset && "offset point after current record");
170 return LocalOffset ? Loc.Offset - LocalOffset : 0;
171 }
172
173 uint64_t ReadGlobalOffset() {
174 uint64_t Local = ReadLocalOffset();
175 return Local ? Record.getGlobalBitOffset(Local) : 0;
176 }
177
178 SourceLocation readSourceLocation() { return Record.readSourceLocation(); }
179
180 SourceRange readSourceRange() { return Record.readSourceRange(); }
181
182 TypeSourceInfo *readTypeSourceInfo() { return Record.readTypeSourceInfo(); }
183
184 GlobalDeclID readDeclID() { return Record.readDeclID(); }
185
186 std::string readString() { return Record.readString(); }
187
188 Decl *readDecl() { return Record.readDecl(); }
189
190 template <typename T> T *readDeclAs() { return Record.readDeclAs<T>(); }
191
192 serialization::SubmoduleID readSubmoduleID() {
193 if (Record.getIdx() == Record.size())
194 return 0;
195
196 return Record.getGlobalSubmoduleID(Record.readInt());
197 }
198
199 Module *readModule() { return Record.getSubmodule(readSubmoduleID()); }
200
201 void ReadCXXRecordDefinition(CXXRecordDecl *D, bool Update,
202 Decl *LambdaContext = nullptr,
203 unsigned IndexInLambdaContext = 0);
204 void ReadCXXDefinitionData(struct CXXRecordDecl::DefinitionData &Data,
205 const CXXRecordDecl *D, Decl *LambdaContext,
206 unsigned IndexInLambdaContext);
207 void ReadObjCDefinitionData(struct ObjCInterfaceDecl::DefinitionData &Data);
208 void ReadObjCDefinitionData(struct ObjCProtocolDecl::DefinitionData &Data);
209
210 static DeclContext *getPrimaryDCForAnonymousDecl(DeclContext *LexicalDC);
211
212 static NamedDecl *getAnonymousDeclForMerging(ASTReader &Reader,
213 DeclContext *DC, unsigned Index);
214 static void setAnonymousDeclForMerging(ASTReader &Reader, DeclContext *DC,
215 unsigned Index, NamedDecl *D);
216
217 /// Commit to a primary definition of the class RD, which is known to be
218 /// a definition of the class. We might not have read the definition data
219 /// for it yet. If we haven't then allocate placeholder definition data
220 /// now too.
221 static CXXRecordDecl *getOrFakePrimaryClassDefinition(ASTReader &Reader,
222 CXXRecordDecl *RD);
223
224 /// Class used to capture the result of searching for an existing
225 /// declaration of a specific kind and name, along with the ability
226 /// to update the place where this result was found (the declaration
227 /// chain hanging off an identifier or the DeclContext we searched in)
228 /// if requested.
229 class FindExistingResult {
230 ASTReader &Reader;
231 NamedDecl *New = nullptr;
232 NamedDecl *Existing = nullptr;
233 bool AddResult = false;
234 unsigned AnonymousDeclNumber = 0;
235 IdentifierInfo *TypedefNameForLinkage = nullptr;
236
237 public:
238 FindExistingResult(ASTReader &Reader) : Reader(Reader) {}
239
240 FindExistingResult(ASTReader &Reader, NamedDecl *New, NamedDecl *Existing,
241 unsigned AnonymousDeclNumber,
242 IdentifierInfo *TypedefNameForLinkage)
243 : Reader(Reader), New(New), Existing(Existing), AddResult(true),
244 AnonymousDeclNumber(AnonymousDeclNumber),
245 TypedefNameForLinkage(TypedefNameForLinkage) {}
246
247 FindExistingResult(FindExistingResult &&Other)
248 : Reader(Other.Reader), New(Other.New), Existing(Other.Existing),
249 AddResult(Other.AddResult),
250 AnonymousDeclNumber(Other.AnonymousDeclNumber),
251 TypedefNameForLinkage(Other.TypedefNameForLinkage) {
252 Other.AddResult = false;
253 }
254
255 FindExistingResult &operator=(FindExistingResult &&) = delete;
256 ~FindExistingResult();
257
258 /// Suppress the addition of this result into the known set of
259 /// names.
260 void suppress() { AddResult = false; }
261
262 operator NamedDecl *() const { return Existing; }
263
264 template <typename T> operator T *() const {
265 return dyn_cast_or_null<T>(Existing);
266 }
267 };
268
269 static DeclContext *getPrimaryContextForMerging(ASTReader &Reader,
270 DeclContext *DC);
271 FindExistingResult findExisting(NamedDecl *D);
272
273public:
275 ASTReader::RecordLocation Loc, GlobalDeclID thisDeclID,
276 SourceLocation ThisDeclLoc)
277 : Reader(Reader), MergeImpl(Reader), Record(Record), Loc(Loc),
278 ThisDeclID(thisDeclID), ThisDeclLoc(ThisDeclLoc) {}
279
280 template <typename DeclT>
282 static Decl *getMostRecentDeclImpl(...);
283 static Decl *getMostRecentDecl(Decl *D);
284
285 template <typename DeclT>
287 Decl *Previous, Decl *Canon);
288 static void attachPreviousDeclImpl(ASTReader &Reader, ...);
289 static void attachPreviousDecl(ASTReader &Reader, Decl *D, Decl *Previous,
290 Decl *Canon);
291
293 Decl *Previous);
294
295 template <typename DeclT>
296 static void attachLatestDeclImpl(Redeclarable<DeclT> *D, Decl *Latest);
297 static void attachLatestDeclImpl(...);
298 static void attachLatestDecl(Decl *D, Decl *latest);
299
300 template <typename DeclT>
302 static void markIncompleteDeclChainImpl(...);
303
305 llvm::BitstreamCursor &DeclsCursor, bool IsPartial);
306
308 void Visit(Decl *D);
309
310 void UpdateDecl(Decl *D);
311
314 Cat->NextClassCategory = Next;
315 }
316
317 void VisitDecl(Decl *D);
321 void VisitNamedDecl(NamedDecl *ND);
322 void VisitLabelDecl(LabelDecl *LD);
327 void VisitTypeDecl(TypeDecl *TD);
328 RedeclarableResult VisitTypedefNameDecl(TypedefNameDecl *TD);
333 RedeclarableResult VisitTagDecl(TagDecl *TD);
334 void VisitEnumDecl(EnumDecl *ED);
335 RedeclarableResult VisitRecordDeclImpl(RecordDecl *RD);
336 void VisitRecordDecl(RecordDecl *RD);
337 RedeclarableResult VisitCXXRecordDeclImpl(CXXRecordDecl *D);
339 RedeclarableResult
341
342 void
346
349 RedeclarableResult
351
355
359 void VisitValueDecl(ValueDecl *VD);
369 void VisitFieldDecl(FieldDecl *FD);
375 RedeclarableResult VisitVarDeclImpl(VarDecl *D);
376 void ReadVarDeclInit(VarDecl *VD);
385 void
395 void VisitUsingDecl(UsingDecl *D);
411 void VisitBlockDecl(BlockDecl *BD);
414 void VisitEmptyDecl(EmptyDecl *D);
416
419
421
422 template <typename T>
423 RedeclarableResult VisitRedeclarable(Redeclarable<T> *D);
424
425 template <typename T>
426 void mergeRedeclarable(Redeclarable<T> *D, RedeclarableResult &Redecl);
427
429 RedeclarableResult &Redecl);
430
431 template <typename T> void mergeMergeable(Mergeable<T> *D);
432
434
436
437 // FIXME: Reorder according to DeclNodes.td?
458};
459} // namespace clang
460
461namespace {
462
463/// Iterator over the redeclarations of a declaration that have already
464/// been merged into the same redeclaration chain.
465template <typename DeclT> class MergedRedeclIterator {
466 DeclT *Start = nullptr;
467 DeclT *Canonical = nullptr;
468 DeclT *Current = nullptr;
469
470public:
471 MergedRedeclIterator() = default;
472 MergedRedeclIterator(DeclT *Start) : Start(Start), Current(Start) {}
473
474 DeclT *operator*() { return Current; }
475
476 MergedRedeclIterator &operator++() {
477 if (Current->isFirstDecl()) {
478 Canonical = Current;
479 Current = Current->getMostRecentDecl();
480 } else
481 Current = Current->getPreviousDecl();
482
483 // If we started in the merged portion, we'll reach our start position
484 // eventually. Otherwise, we'll never reach it, but the second declaration
485 // we reached was the canonical declaration, so stop when we see that one
486 // again.
487 if (Current == Start || Current == Canonical)
488 Current = nullptr;
489 return *this;
490 }
491
492 friend bool operator!=(const MergedRedeclIterator &A,
493 const MergedRedeclIterator &B) {
494 return A.Current != B.Current;
495 }
496};
497
498} // namespace
499
500template <typename DeclT>
501static llvm::iterator_range<MergedRedeclIterator<DeclT>>
502merged_redecls(DeclT *D) {
503 return llvm::make_range(MergedRedeclIterator<DeclT>(D),
504 MergedRedeclIterator<DeclT>());
505}
506
507uint64_t ASTDeclReader::GetCurrentCursorOffset() {
508 return Loc.F->DeclsCursor.GetCurrentBitNo() + Loc.F->GlobalBitOffset;
509}
510
512 if (Record.readInt()) {
513 Reader.DefinitionSource[FD] =
514 Loc.F->Kind == ModuleKind::MK_MainFile ||
515 Reader.getContext().getLangOpts().BuildingPCHWithObjectFile;
516 }
517 if (auto *CD = dyn_cast<CXXConstructorDecl>(FD)) {
518 CD->setNumCtorInitializers(Record.readInt());
519 if (CD->getNumCtorInitializers())
520 CD->CtorInitializers = ReadGlobalOffset();
521 }
522 // Store the offset of the body so we can lazily load it later.
523 Reader.PendingBodies[FD] = GetCurrentCursorOffset();
524 // For now remember ThisDeclarationWasADefinition only for friend functions.
525 if (FD->getFriendObjectKind())
526 Reader.ThisDeclarationWasADefinitionSet.insert(FD);
527}
528
531
532 // At this point we have deserialized and merged the decl and it is safe to
533 // update its canonical decl to signal that the entire entity is used.
534 D->getCanonicalDecl()->Used |= IsDeclMarkedUsed;
535 IsDeclMarkedUsed = false;
536
537 if (auto *DD = dyn_cast<DeclaratorDecl>(D)) {
538 if (auto *TInfo = DD->getTypeSourceInfo())
539 Record.readTypeLoc(TInfo->getTypeLoc());
540 }
541
542 if (auto *TD = dyn_cast<TypeDecl>(D)) {
543 // We have a fully initialized TypeDecl. Read its type now.
545 assert(DeferredTypeID == 0 &&
546 "Deferred type not used for TagDecls and Typedefs");
547 else
548 TD->setTypeForDecl(Reader.GetType(DeferredTypeID).getTypePtrOrNull());
549
550 // If this is a tag declaration with a typedef name for linkage, it's safe
551 // to load that typedef now.
552 if (NamedDeclForTagDecl.isValid())
553 cast<TagDecl>(D)->TypedefNameDeclOrQualifier =
554 cast<TypedefNameDecl>(Reader.GetDecl(NamedDeclForTagDecl));
555 } else if (auto *ID = dyn_cast<ObjCInterfaceDecl>(D)) {
556 // if we have a fully initialized TypeDecl, we can safely read its type now.
557 ID->TypeForDecl = Reader.GetType(DeferredTypeID).getTypePtrOrNull();
558 } else if (auto *FD = dyn_cast<FunctionDecl>(D)) {
559 // FunctionDecl's body was written last after all other Stmts/Exprs.
560 if (Record.readInt())
562 } else if (auto *VD = dyn_cast<VarDecl>(D)) {
563 ReadVarDeclInit(VD);
564 } else if (auto *FD = dyn_cast<FieldDecl>(D)) {
565 if (FD->hasInClassInitializer() && Record.readInt()) {
566 FD->setLazyInClassInitializer(LazyDeclStmtPtr(GetCurrentCursorOffset()));
567 }
568 }
569}
570
572 BitsUnpacker DeclBits(Record.readInt());
573 auto ModuleOwnership =
574 (Decl::ModuleOwnershipKind)DeclBits.getNextBits(/*Width=*/3);
575 D->setReferenced(DeclBits.getNextBit());
576 D->Used = DeclBits.getNextBit();
577 IsDeclMarkedUsed |= D->Used;
578 D->setAccess((AccessSpecifier)DeclBits.getNextBits(/*Width=*/2));
579 D->setImplicit(DeclBits.getNextBit());
580 bool HasStandaloneLexicalDC = DeclBits.getNextBit();
581 bool HasAttrs = DeclBits.getNextBit();
583 D->InvalidDecl = DeclBits.getNextBit();
584 D->FromASTFile = true;
585
588 // We don't want to deserialize the DeclContext of a template
589 // parameter or of a parameter of a function template immediately. These
590 // entities might be used in the formulation of its DeclContext (for
591 // example, a function parameter can be used in decltype() in trailing
592 // return type of the function). Use the translation unit DeclContext as a
593 // placeholder.
594 GlobalDeclID SemaDCIDForTemplateParmDecl = readDeclID();
595 GlobalDeclID LexicalDCIDForTemplateParmDecl =
596 HasStandaloneLexicalDC ? readDeclID() : GlobalDeclID();
597 if (LexicalDCIDForTemplateParmDecl.isInvalid())
598 LexicalDCIDForTemplateParmDecl = SemaDCIDForTemplateParmDecl;
599 Reader.addPendingDeclContextInfo(D,
600 SemaDCIDForTemplateParmDecl,
601 LexicalDCIDForTemplateParmDecl);
602 D->setDeclContext(Reader.getContext().getTranslationUnitDecl());
603 } else {
604 auto *SemaDC = readDeclAs<DeclContext>();
605 auto *LexicalDC =
606 HasStandaloneLexicalDC ? readDeclAs<DeclContext>() : nullptr;
607 if (!LexicalDC)
608 LexicalDC = SemaDC;
609 // If the context is a class, we might not have actually merged it yet, in
610 // the case where the definition comes from an update record.
611 DeclContext *MergedSemaDC;
612 if (auto *RD = dyn_cast<CXXRecordDecl>(SemaDC))
613 MergedSemaDC = getOrFakePrimaryClassDefinition(Reader, RD);
614 else
615 MergedSemaDC = Reader.MergedDeclContexts.lookup(SemaDC);
616 // Avoid calling setLexicalDeclContext() directly because it uses
617 // Decl::getASTContext() internally which is unsafe during derialization.
618 D->setDeclContextsImpl(MergedSemaDC ? MergedSemaDC : SemaDC, LexicalDC,
619 Reader.getContext());
620 }
621 D->setLocation(ThisDeclLoc);
622
623 if (HasAttrs) {
624 AttrVec Attrs;
625 Record.readAttributes(Attrs);
626 // Avoid calling setAttrs() directly because it uses Decl::getASTContext()
627 // internally which is unsafe during derialization.
628 D->setAttrsImpl(Attrs, Reader.getContext());
629 }
630
631 // Determine whether this declaration is part of a (sub)module. If so, it
632 // may not yet be visible.
633 bool ModulePrivate =
634 (ModuleOwnership == Decl::ModuleOwnershipKind::ModulePrivate);
635 if (unsigned SubmoduleID = readSubmoduleID()) {
636 switch (ModuleOwnership) {
639 break;
645 break;
646 }
647
648 D->setModuleOwnershipKind(ModuleOwnership);
649 // Store the owning submodule ID in the declaration.
651
652 if (ModulePrivate) {
653 // Module-private declarations are never visible, so there is no work to
654 // do.
655 } else if (Reader.getContext().getLangOpts().ModulesLocalVisibility) {
656 // If local visibility is being tracked, this declaration will become
657 // hidden and visible as the owning module does.
658 } else if (Module *Owner = Reader.getSubmodule(SubmoduleID)) {
659 // Mark the declaration as visible when its owning module becomes visible.
660 if (Owner->NameVisibility == Module::AllVisible)
662 else
663 Reader.HiddenNamesMap[Owner].push_back(D);
664 }
665 } else if (ModulePrivate) {
667 }
668}
669
671 VisitDecl(D);
672 D->setLocation(readSourceLocation());
673 D->CommentKind = (PragmaMSCommentKind)Record.readInt();
674 std::string Arg = readString();
675 memcpy(D->getTrailingObjects(), Arg.data(), Arg.size());
676 D->getTrailingObjects()[Arg.size()] = '\0';
677}
678
680 VisitDecl(D);
681 D->setLocation(readSourceLocation());
682 std::string Name = readString();
683 memcpy(D->getTrailingObjects(), Name.data(), Name.size());
684 D->getTrailingObjects()[Name.size()] = '\0';
685
686 D->ValueStart = Name.size() + 1;
687 std::string Value = readString();
688 memcpy(D->getTrailingObjects() + D->ValueStart, Value.data(), Value.size());
689 D->getTrailingObjects()[D->ValueStart + Value.size()] = '\0';
690}
691
693 llvm_unreachable("Translation units are not serialized");
694}
695
697 VisitDecl(ND);
698 ND->setDeclName(Record.readDeclarationName());
699 AnonymousDeclNumber = Record.readInt();
700}
701
703 VisitNamedDecl(TD);
704 TD->setLocStart(readSourceLocation());
705 // Delay type reading until after we have fully initialized the decl.
707 DeferredTypeID = Record.getGlobalTypeID(Record.readInt());
708}
709
711 RedeclarableResult Redecl = VisitRedeclarable(TD);
712 VisitTypeDecl(TD);
713 TypeSourceInfo *TInfo = readTypeSourceInfo();
714 if (Record.readInt()) { // isModed
715 QualType modedT = Record.readType();
716 TD->setModedTypeSourceInfo(TInfo, modedT);
717 } else
718 TD->setTypeSourceInfo(TInfo);
719 // Read and discard the declaration for which this is a typedef name for
720 // linkage, if it exists. We cannot rely on our type to pull in this decl,
721 // because it might have been merged with a type from another module and
722 // thus might not refer to our version of the declaration.
723 readDecl();
724 return Redecl;
725}
726
728 RedeclarableResult Redecl = VisitTypedefNameDecl(TD);
729 mergeRedeclarable(TD, Redecl);
730}
731
733 RedeclarableResult Redecl = VisitTypedefNameDecl(TD);
734 if (auto *Template = readDeclAs<TypeAliasTemplateDecl>())
735 // Merged when we merge the template.
737 else
738 mergeRedeclarable(TD, Redecl);
739}
740
741RedeclarableResult ASTDeclReader::VisitTagDecl(TagDecl *TD) {
742 RedeclarableResult Redecl = VisitRedeclarable(TD);
743 VisitTypeDecl(TD);
744
745 TD->IdentifierNamespace = Record.readInt();
746
747 BitsUnpacker TagDeclBits(Record.readInt());
748 TD->setTagKind(
749 static_cast<TagTypeKind>(TagDeclBits.getNextBits(/*Width=*/3)));
750 TD->setCompleteDefinition(TagDeclBits.getNextBit());
751 TD->setEmbeddedInDeclarator(TagDeclBits.getNextBit());
752 TD->setFreeStanding(TagDeclBits.getNextBit());
753 TD->setCompleteDefinitionRequired(TagDeclBits.getNextBit());
754 TD->setBraceRange(readSourceRange());
755
756 switch (TagDeclBits.getNextBits(/*Width=*/2)) {
757 case 0:
758 break;
759 case 1: { // ExtInfo
760 auto *Info = new (Reader.getContext()) TagDecl::ExtInfo();
761 Record.readQualifierInfo(*Info);
762 TD->TypedefNameDeclOrQualifier = Info;
763 break;
764 }
765 case 2: // TypedefNameForAnonDecl
766 NamedDeclForTagDecl = readDeclID();
767 TypedefNameForLinkage = Record.readIdentifier();
768 break;
769 default:
770 llvm_unreachable("unexpected tag info kind");
771 }
772
773 if (!isa<CXXRecordDecl>(TD))
774 mergeRedeclarable(TD, Redecl);
775 return Redecl;
776}
777
779 VisitTagDecl(ED);
780 if (TypeSourceInfo *TI = readTypeSourceInfo())
782 else
783 ED->setIntegerType(Record.readType());
784 ED->setPromotionType(Record.readType());
785
786 BitsUnpacker EnumDeclBits(Record.readInt());
787 ED->setNumPositiveBits(EnumDeclBits.getNextBits(/*Width=*/8));
788 ED->setNumNegativeBits(EnumDeclBits.getNextBits(/*Width=*/8));
789 ED->setScoped(EnumDeclBits.getNextBit());
790 ED->setScopedUsingClassTag(EnumDeclBits.getNextBit());
791 ED->setFixed(EnumDeclBits.getNextBit());
792
793 ED->setHasODRHash(true);
794 ED->ODRHash = Record.readInt();
795
796 // If this is a definition subject to the ODR, and we already have a
797 // definition, merge this one into it.
798 if (ED->isCompleteDefinition() && Reader.getContext().getLangOpts().Modules) {
799 EnumDecl *&OldDef = Reader.EnumDefinitions[ED->getCanonicalDecl()];
800 if (!OldDef) {
801 // This is the first time we've seen an imported definition. Look for a
802 // local definition before deciding that we are the first definition.
803 for (auto *D : merged_redecls(ED->getCanonicalDecl())) {
804 if (!D->isFromASTFile() && D->isCompleteDefinition()) {
805 OldDef = D;
806 break;
807 }
808 }
809 }
810 if (OldDef) {
811 Reader.MergedDeclContexts.insert(std::make_pair(ED, OldDef));
813 Reader.mergeDefinitionVisibility(OldDef, ED);
814 // We don't want to check the ODR hash value for declarations from global
815 // module fragment.
816 if (!shouldSkipCheckingODR(ED) && !shouldSkipCheckingODR(OldDef) &&
817 OldDef->getODRHash() != ED->getODRHash())
818 Reader.PendingEnumOdrMergeFailures[OldDef].push_back(ED);
819 } else {
820 OldDef = ED;
821 }
822 }
823
824 if (auto *InstED = readDeclAs<EnumDecl>()) {
825 auto TSK = (TemplateSpecializationKind)Record.readInt();
826 SourceLocation POI = readSourceLocation();
827 ED->setInstantiationOfMemberEnum(Reader.getContext(), InstED, TSK);
829 }
830}
831
833 RedeclarableResult Redecl = VisitTagDecl(RD);
834
835 BitsUnpacker RecordDeclBits(Record.readInt());
836 RD->setHasFlexibleArrayMember(RecordDeclBits.getNextBit());
837 RD->setAnonymousStructOrUnion(RecordDeclBits.getNextBit());
838 RD->setHasObjectMember(RecordDeclBits.getNextBit());
839 RD->setHasVolatileMember(RecordDeclBits.getNextBit());
841 RD->setNonTrivialToPrimitiveCopy(RecordDeclBits.getNextBit());
842 RD->setNonTrivialToPrimitiveDestroy(RecordDeclBits.getNextBit());
844 RecordDeclBits.getNextBit());
848 RD->setParamDestroyedInCallee(RecordDeclBits.getNextBit());
850 (RecordArgPassingKind)RecordDeclBits.getNextBits(/*Width=*/2));
851 return Redecl;
852}
853
856 RD->setODRHash(Record.readInt());
857
858 // Maintain the invariant of a redeclaration chain containing only
859 // a single definition.
860 if (RD->isCompleteDefinition()) {
861 RecordDecl *Canon = static_cast<RecordDecl *>(RD->getCanonicalDecl());
862 RecordDecl *&OldDef = Reader.RecordDefinitions[Canon];
863 if (!OldDef) {
864 // This is the first time we've seen an imported definition. Look for a
865 // local definition before deciding that we are the first definition.
866 for (auto *D : merged_redecls(Canon)) {
867 if (!D->isFromASTFile() && D->isCompleteDefinition()) {
868 OldDef = D;
869 break;
870 }
871 }
872 }
873 if (OldDef) {
874 Reader.MergedDeclContexts.insert(std::make_pair(RD, OldDef));
876 Reader.mergeDefinitionVisibility(OldDef, RD);
877 if (OldDef->getODRHash() != RD->getODRHash())
878 Reader.PendingRecordOdrMergeFailures[OldDef].push_back(RD);
879 } else {
880 OldDef = RD;
881 }
882 }
883}
884
886 VisitNamedDecl(VD);
887 // For function or variable declarations, defer reading the type in case the
888 // declaration has a deduced type that references an entity declared within
889 // the function definition or variable initializer.
891 DeferredTypeID = Record.getGlobalTypeID(Record.readInt());
892 else
893 VD->setType(Record.readType());
894}
895
897 VisitValueDecl(ECD);
898 if (Record.readInt())
899 ECD->setInitExpr(Record.readExpr());
900 ECD->setInitVal(Reader.getContext(), Record.readAPSInt());
901 mergeMergeable(ECD);
902}
903
905 VisitValueDecl(DD);
906 DD->setInnerLocStart(readSourceLocation());
907 if (Record.readInt()) { // hasExtInfo
908 auto *Info = new (Reader.getContext()) DeclaratorDecl::ExtInfo();
909 Record.readQualifierInfo(*Info);
910 Info->TrailingRequiresClause = AssociatedConstraint(
911 Record.readExpr(),
912 UnsignedOrNone::fromInternalRepresentation(Record.readUInt32()));
913 DD->DeclInfo = Info;
914 }
915 QualType TSIType = Record.readType();
917 TSIType.isNull() ? nullptr
918 : Reader.getContext().CreateTypeSourceInfo(TSIType));
919}
920
922 RedeclarableResult Redecl = VisitRedeclarable(FD);
923
924 FunctionDecl *Existing = nullptr;
925
926 switch ((FunctionDecl::TemplatedKind)Record.readInt()) {
928 break;
930 FD->setInstantiatedFromDecl(readDeclAs<FunctionDecl>());
931 break;
933 auto *Template = readDeclAs<FunctionTemplateDecl>();
934 Template->init(FD);
936 break;
937 }
939 auto *InstFD = readDeclAs<FunctionDecl>();
940 auto TSK = (TemplateSpecializationKind)Record.readInt();
941 SourceLocation POI = readSourceLocation();
942 FD->setInstantiationOfMemberFunction(Reader.getContext(), InstFD, TSK);
944 break;
945 }
947 auto *Template = readDeclAs<FunctionTemplateDecl>();
948 auto TSK = (TemplateSpecializationKind)Record.readInt();
949
950 // Template arguments.
952 Record.readTemplateArgumentList(TemplArgs, /*Canonicalize*/ true);
953
954 // Template args as written.
955 TemplateArgumentListInfo TemplArgsWritten;
956 bool HasTemplateArgumentsAsWritten = Record.readBool();
957 if (HasTemplateArgumentsAsWritten)
958 Record.readTemplateArgumentListInfo(TemplArgsWritten);
959
960 SourceLocation POI = readSourceLocation();
961
962 ASTContext &C = Reader.getContext();
963 TemplateArgumentList *TemplArgList =
965
966 MemberSpecializationInfo *MSInfo = nullptr;
967 if (Record.readInt()) {
968 auto *FD = readDeclAs<FunctionDecl>();
969 auto TSK = (TemplateSpecializationKind)Record.readInt();
970 SourceLocation POI = readSourceLocation();
971
972 MSInfo = new (C) MemberSpecializationInfo(FD, TSK);
973 MSInfo->setPointOfInstantiation(POI);
974 }
975
978 C, FD, Template, TSK, TemplArgList,
979 HasTemplateArgumentsAsWritten ? &TemplArgsWritten : nullptr, POI,
980 MSInfo);
981 FD->TemplateOrSpecialization = FTInfo;
982
983 if (FD->isCanonicalDecl()) { // if canonical add to template's set.
984 // The template that contains the specializations set. It's not safe to
985 // use getCanonicalDecl on Template since it may still be initializing.
986 auto *CanonTemplate = readDeclAs<FunctionTemplateDecl>();
987 // Get the insert token by lookup() instead of calling insert(FTInfo)
988 // directly to avoid the getASTContext() call in
989 // FunctionTemplateSpecializationInfo's Profile().
990 // We avoid getASTContext because a decl in the parent hierarchy may
991 // be initializing.
992 llvm::FoldingSetNodeID ID;
994 llvm::FoldingSetInsertToken InsertToken;
995 FunctionTemplateDecl::Common *CommonPtr = CanonTemplate->getCommonPtr();
997 CommonPtr->Specializations.lookup(ID, InsertToken);
998 if (InsertToken)
999 CommonPtr->Specializations.insert(FTInfo, InsertToken);
1000 else {
1001 Existing = ExistingInfo->getFunction();
1002 }
1003 }
1004 break;
1005 }
1007 // Templates.
1008 UnresolvedSet<8> Candidates;
1009 unsigned NumCandidates = Record.readInt();
1010 while (NumCandidates--)
1011 Candidates.addDecl(readDeclAs<NamedDecl>());
1012
1013 // Templates args.
1014 TemplateArgumentListInfo TemplArgsWritten;
1015 bool HasTemplateArgumentsAsWritten = Record.readBool();
1016 if (HasTemplateArgumentsAsWritten)
1017 Record.readTemplateArgumentListInfo(TemplArgsWritten);
1018
1020 Reader.getContext(), Candidates,
1021 HasTemplateArgumentsAsWritten ? &TemplArgsWritten : nullptr);
1022 // These are not merged; we don't need to merge redeclarations of dependent
1023 // template friends.
1024 break;
1025 }
1026 }
1027
1029
1030 // Attach a type to this function. Use the real type if possible, but fall
1031 // back to the type as written if it involves a deduced return type.
1032 if (FD->getTypeSourceInfo() && FD->getTypeSourceInfo()
1033 ->getType()
1034 ->castAs<FunctionType>()
1035 ->getReturnType()
1037 // We'll set up the real type in Visit, once we've finished loading the
1038 // function.
1039 FD->setType(FD->getTypeSourceInfo()->getType());
1040 Reader.PendingDeducedFunctionTypes.push_back({FD, DeferredTypeID});
1041 } else {
1042 FD->setType(Reader.GetType(DeferredTypeID));
1043 }
1044 DeferredTypeID = 0;
1045
1046 FD->DNLoc = Record.readDeclarationNameLoc(FD->getDeclName());
1047 FD->IdentifierNamespace = Record.readInt();
1048
1049 // FunctionDecl's body is handled last at ASTDeclReader::Visit,
1050 // after everything else is read.
1051 BitsUnpacker FunctionDeclBits(Record.readInt());
1052
1053 FD->setCachedLinkage((Linkage)FunctionDeclBits.getNextBits(/*Width=*/3));
1054 FD->setStorageClass((StorageClass)FunctionDeclBits.getNextBits(/*Width=*/3));
1055 FD->setInlineSpecified(FunctionDeclBits.getNextBit());
1056 FD->setImplicitlyInline(FunctionDeclBits.getNextBit());
1057 FD->setHasSkippedBody(FunctionDeclBits.getNextBit());
1058 FD->setVirtualAsWritten(FunctionDeclBits.getNextBit());
1059 // We defer calling `FunctionDecl::setPure()` here as for methods of
1060 // `CXXTemplateSpecializationDecl`s, we may not have connected up the
1061 // definition (which is required for `setPure`).
1062 const bool Pure = FunctionDeclBits.getNextBit();
1063 FD->setHasInheritedPrototype(FunctionDeclBits.getNextBit());
1064 FD->setHasWrittenPrototype(FunctionDeclBits.getNextBit());
1065 FD->setDeletedAsWritten(FunctionDeclBits.getNextBit());
1066 FD->setTrivial(FunctionDeclBits.getNextBit());
1067 FD->setTrivialForCall(FunctionDeclBits.getNextBit());
1068 FD->setDefaulted(FunctionDeclBits.getNextBit());
1069 FD->setExplicitlyDefaulted(FunctionDeclBits.getNextBit());
1070 FD->setIneligibleOrNotSelected(FunctionDeclBits.getNextBit());
1071 FD->setConstexprKind(
1072 (ConstexprSpecKind)FunctionDeclBits.getNextBits(/*Width=*/2));
1073 FD->setHasImplicitReturnZero(FunctionDeclBits.getNextBit());
1074 FD->setIsMultiVersion(FunctionDeclBits.getNextBit());
1075 FD->setLateTemplateParsed(FunctionDeclBits.getNextBit());
1076 FD->setInstantiatedFromMemberTemplate(FunctionDeclBits.getNextBit());
1078 FunctionDeclBits.getNextBit());
1079 FD->setUsesSEHTry(FunctionDeclBits.getNextBit());
1080 FD->setIsDestroyingOperatorDelete(FunctionDeclBits.getNextBit());
1081 FD->setIsTypeAwareOperatorNewOrDelete(FunctionDeclBits.getNextBit());
1082
1083 FD->EndRangeLoc = readSourceLocation();
1084 if (FD->isExplicitlyDefaulted())
1085 FD->setDefaultLoc(readSourceLocation());
1086
1087 FD->ODRHash = Record.readInt();
1088 FD->setHasODRHash(true);
1089
1090 if (FD->isDefaulted() || FD->isDeletedAsWritten()) {
1091 // If 'Info' is nonzero, we need to read an DefaultedOrDeletedInfo; if,
1092 // additionally, the second bit is also set, we also need to read
1093 // a DeletedMessage for the DefaultedOrDeletedInfo.
1094 if (auto Info = Record.readInt()) {
1095 bool HasMessage = Info & 2;
1096 StringLiteral *DeletedMessage =
1097 HasMessage ? cast<StringLiteral>(Record.readExpr()) : nullptr;
1098
1099 FPOptionsOverride FPFeatures =
1100 FPOptionsOverride::getFromOpaqueInt(Record.readInt());
1101
1102 unsigned NumLookups = Record.readInt();
1104 for (unsigned I = 0; I != NumLookups; ++I) {
1105 NamedDecl *ND = Record.readDeclAs<NamedDecl>();
1106 AccessSpecifier AS = (AccessSpecifier)Record.readInt();
1107 Lookups.push_back(DeclAccessPair::make(ND, AS));
1108 }
1109
1112 Reader.getContext(), Lookups, FPFeatures, DeletedMessage));
1113 }
1114 }
1115
1116 if (Existing)
1117 MergeImpl.mergeRedeclarable(FD, Existing, Redecl);
1118 else if (auto Kind = FD->getTemplatedKind();
1121 // Function Templates have their FunctionTemplateDecls merged instead of
1122 // their FunctionDecls.
1123 auto merge = [this, &Redecl, FD](auto &&F) {
1124 auto *Existing = cast_or_null<FunctionDecl>(Redecl.getKnownMergeTarget());
1125 RedeclarableResult NewRedecl(Existing ? F(Existing) : nullptr,
1126 Redecl.getFirstID(), Redecl.isKeyDecl());
1127 mergeRedeclarableTemplate(F(FD), NewRedecl);
1128 };
1130 merge(
1131 [](FunctionDecl *FD) { return FD->getDescribedFunctionTemplate(); });
1132 else
1133 merge([](FunctionDecl *FD) {
1135 });
1136 } else
1137 mergeRedeclarable(FD, Redecl);
1138
1139 // Defer calling `setPure` until merging above has guaranteed we've set
1140 // `DefinitionData` (as this will need to access it).
1141 FD->setIsPureVirtual(Pure);
1142
1143 // Read in the parameters.
1144 unsigned NumParams = Record.readInt();
1146 Params.reserve(NumParams);
1147 for (unsigned I = 0; I != NumParams; ++I)
1148 Params.push_back(readDeclAs<ParmVarDecl>());
1149 FD->setParams(Reader.getContext(), Params);
1150
1151 // If the declaration is a SYCL kernel entry point function as indicated by
1152 // the presence of a sycl_kernel_entry_point attribute, register it so that
1153 // associated metadata is recreated.
1154 if (FD->hasAttr<SYCLKernelEntryPointAttr>()) {
1155 auto *SKEPAttr = FD->getAttr<SYCLKernelEntryPointAttr>();
1156 ASTContext &C = Reader.getContext();
1157 const SYCLKernelInfo *SKI = C.findSYCLKernelInfo(SKEPAttr->getKernelName());
1158 if (SKI) {
1160 Reader.Diag(FD->getLocation(), diag::err_sycl_kernel_name_conflict)
1161 << SKEPAttr;
1162 Reader.Diag(SKI->getKernelEntryPointDecl()->getLocation(),
1163 diag::note_previous_declaration);
1164 SKEPAttr->setInvalidAttr();
1165 }
1166 } else {
1167 C.registerSYCLEntryPointFunction(FD);
1168 }
1169 }
1170}
1171
1173 VisitNamedDecl(MD);
1174 if (Record.readInt()) {
1175 // Load the body on-demand. Most clients won't care, because method
1176 // definitions rarely show up in headers.
1177 Reader.PendingBodies[MD] = GetCurrentCursorOffset();
1178 }
1179 MD->setSelfDecl(readDeclAs<ImplicitParamDecl>());
1180 MD->setCmdDecl(readDeclAs<ImplicitParamDecl>());
1181 MD->setInstanceMethod(Record.readInt());
1182 MD->setVariadic(Record.readInt());
1183 MD->setPropertyAccessor(Record.readInt());
1184 MD->setSynthesizedAccessorStub(Record.readInt());
1185 MD->setDefined(Record.readInt());
1186 MD->setOverriding(Record.readInt());
1187 MD->setHasSkippedBody(Record.readInt());
1188
1189 MD->setIsRedeclaration(Record.readInt());
1190 MD->setHasRedeclaration(Record.readInt());
1191 if (MD->hasRedeclaration())
1192 Reader.getContext().setObjCMethodRedeclaration(MD,
1193 readDeclAs<ObjCMethodDecl>());
1194
1196 static_cast<ObjCImplementationControl>(Record.readInt()));
1197 MD->setObjCDeclQualifier((Decl::ObjCDeclQualifier)Record.readInt());
1198 MD->setRelatedResultType(Record.readInt());
1199 MD->setReturnType(Record.readType());
1200 MD->setReturnTypeSourceInfo(readTypeSourceInfo());
1201 MD->DeclEndLoc = readSourceLocation();
1202 unsigned NumParams = Record.readInt();
1204 Params.reserve(NumParams);
1205 for (unsigned I = 0; I != NumParams; ++I)
1206 Params.push_back(readDeclAs<ParmVarDecl>());
1207
1208 MD->setSelLocsKind((SelectorLocationsKind)Record.readInt());
1209 unsigned NumStoredSelLocs = Record.readInt();
1211 SelLocs.reserve(NumStoredSelLocs);
1212 for (unsigned i = 0; i != NumStoredSelLocs; ++i)
1213 SelLocs.push_back(readSourceLocation());
1214
1215 MD->setParamsAndSelLocs(Reader.getContext(), Params, SelLocs);
1216}
1217
1220
1221 D->Variance = Record.readInt();
1222 D->Index = Record.readInt();
1223 D->VarianceLoc = readSourceLocation();
1224 D->ColonLoc = readSourceLocation();
1225}
1226
1228 VisitNamedDecl(CD);
1229 CD->setAtStartLoc(readSourceLocation());
1230 CD->setAtEndRange(readSourceRange());
1231}
1232
1234 unsigned numParams = Record.readInt();
1235 if (numParams == 0)
1236 return nullptr;
1237
1239 typeParams.reserve(numParams);
1240 for (unsigned i = 0; i != numParams; ++i) {
1241 auto *typeParam = readDeclAs<ObjCTypeParamDecl>();
1242 if (!typeParam)
1243 return nullptr;
1244
1245 typeParams.push_back(typeParam);
1246 }
1247
1248 SourceLocation lAngleLoc = readSourceLocation();
1249 SourceLocation rAngleLoc = readSourceLocation();
1250
1251 return ObjCTypeParamList::create(Reader.getContext(), lAngleLoc,
1252 typeParams, rAngleLoc);
1253}
1254
1255void ASTDeclReader::ReadObjCDefinitionData(
1256 struct ObjCInterfaceDecl::DefinitionData &Data) {
1257 // Read the superclass.
1258 Data.SuperClassTInfo = readTypeSourceInfo();
1259
1260 Data.EndLoc = readSourceLocation();
1261 Data.HasDesignatedInitializers = Record.readInt();
1262 Data.ODRHash = Record.readInt();
1263 Data.HasODRHash = true;
1264
1265 // Read the directly referenced protocols and their SourceLocations.
1266 unsigned NumProtocols = Record.readInt();
1268 Protocols.reserve(NumProtocols);
1269 for (unsigned I = 0; I != NumProtocols; ++I)
1270 Protocols.push_back(readDeclAs<ObjCProtocolDecl>());
1272 ProtoLocs.reserve(NumProtocols);
1273 for (unsigned I = 0; I != NumProtocols; ++I)
1274 ProtoLocs.push_back(readSourceLocation());
1275 Data.ReferencedProtocols.set(Protocols.data(), NumProtocols, ProtoLocs.data(),
1276 Reader.getContext());
1277
1278 // Read the transitive closure of protocols referenced by this class.
1279 NumProtocols = Record.readInt();
1280 Protocols.clear();
1281 Protocols.reserve(NumProtocols);
1282 for (unsigned I = 0; I != NumProtocols; ++I)
1283 Protocols.push_back(readDeclAs<ObjCProtocolDecl>());
1284 Data.AllReferencedProtocols.set(Protocols.data(), NumProtocols,
1285 Reader.getContext());
1286}
1287
1289 ObjCInterfaceDecl *D, struct ObjCInterfaceDecl::DefinitionData &&NewDD) {
1290 struct ObjCInterfaceDecl::DefinitionData &DD = D->data();
1291 if (DD.Definition == NewDD.Definition)
1292 return;
1293
1294 Reader.MergedDeclContexts.insert(
1295 std::make_pair(NewDD.Definition, DD.Definition));
1296 Reader.mergeDefinitionVisibility(DD.Definition, NewDD.Definition);
1297
1298 if (D->getODRHash() != NewDD.ODRHash)
1299 Reader.PendingObjCInterfaceOdrMergeFailures[DD.Definition].push_back(
1300 {NewDD.Definition, &NewDD});
1301}
1302
1304 RedeclarableResult Redecl = VisitRedeclarable(ID);
1306 DeferredTypeID = Record.getGlobalTypeID(Record.readInt());
1307 mergeRedeclarable(ID, Redecl);
1308
1309 ID->TypeParamList = ReadObjCTypeParamList();
1310 if (Record.readInt()) {
1311 // Read the definition.
1312 ID->allocateDefinitionData();
1313
1314 ReadObjCDefinitionData(ID->data());
1315 ObjCInterfaceDecl *Canon = ID->getCanonicalDecl();
1316 if (Canon->Data.getPointer()) {
1317 // If we already have a definition, keep the definition invariant and
1318 // merge the data.
1319 MergeImpl.MergeDefinitionData(Canon, std::move(ID->data()));
1320 ID->Data = Canon->Data;
1321 } else {
1322 // Set the definition data of the canonical declaration, so other
1323 // redeclarations will see it.
1324 ID->getCanonicalDecl()->Data = ID->Data;
1325
1326 // We will rebuild this list lazily.
1327 ID->setIvarList(nullptr);
1328 }
1329
1330 // Note that we have deserialized a definition.
1331 Reader.PendingDefinitions.insert(ID);
1332
1333 // Note that we've loaded this Objective-C class.
1334 Reader.ObjCClassesLoaded.push_back(ID);
1335 } else {
1336 ID->Data = ID->getCanonicalDecl()->Data;
1337 }
1338}
1339
1341 VisitFieldDecl(IVD);
1342 IVD->setAccessControl((ObjCIvarDecl::AccessControl)Record.readInt());
1343 // This field will be built lazily.
1344 IVD->setNextIvar(nullptr);
1345 bool synth = Record.readInt();
1346 IVD->setSynthesize(synth);
1347
1348 // Check ivar redeclaration.
1349 if (IVD->isInvalidDecl())
1350 return;
1351 // Don't check ObjCInterfaceDecl as interfaces are named and mismatches can be
1352 // detected in VisitObjCInterfaceDecl. Here we are looking for redeclarations
1353 // in extensions.
1355 return;
1356 ObjCInterfaceDecl *CanonIntf =
1358 IdentifierInfo *II = IVD->getIdentifier();
1359 ObjCIvarDecl *PrevIvar = CanonIntf->lookupInstanceVariable(II);
1360 if (PrevIvar && PrevIvar != IVD) {
1361 auto *ParentExt = dyn_cast<ObjCCategoryDecl>(IVD->getDeclContext());
1362 auto *PrevParentExt =
1363 dyn_cast<ObjCCategoryDecl>(PrevIvar->getDeclContext());
1364 if (ParentExt && PrevParentExt) {
1365 // Postpone diagnostic as we should merge identical extensions from
1366 // different modules.
1367 Reader
1368 .PendingObjCExtensionIvarRedeclarations[std::make_pair(ParentExt,
1369 PrevParentExt)]
1370 .push_back(std::make_pair(IVD, PrevIvar));
1371 } else if (ParentExt || PrevParentExt) {
1372 // Duplicate ivars in extension + implementation are never compatible.
1373 // Compatibility of implementation + implementation should be handled in
1374 // VisitObjCImplementationDecl.
1375 Reader.Diag(IVD->getLocation(), diag::err_duplicate_ivar_declaration)
1376 << II;
1377 Reader.Diag(PrevIvar->getLocation(), diag::note_previous_definition);
1378 }
1379 }
1380}
1381
1382void ASTDeclReader::ReadObjCDefinitionData(
1383 struct ObjCProtocolDecl::DefinitionData &Data) {
1384 unsigned NumProtoRefs = Record.readInt();
1386 ProtoRefs.reserve(NumProtoRefs);
1387 for (unsigned I = 0; I != NumProtoRefs; ++I)
1388 ProtoRefs.push_back(readDeclAs<ObjCProtocolDecl>());
1390 ProtoLocs.reserve(NumProtoRefs);
1391 for (unsigned I = 0; I != NumProtoRefs; ++I)
1392 ProtoLocs.push_back(readSourceLocation());
1393 Data.ReferencedProtocols.set(ProtoRefs.data(), NumProtoRefs,
1394 ProtoLocs.data(), Reader.getContext());
1395 Data.ODRHash = Record.readInt();
1396 Data.HasODRHash = true;
1397}
1398
1400 ObjCProtocolDecl *D, struct ObjCProtocolDecl::DefinitionData &&NewDD) {
1401 struct ObjCProtocolDecl::DefinitionData &DD = D->data();
1402 if (DD.Definition == NewDD.Definition)
1403 return;
1404
1405 Reader.MergedDeclContexts.insert(
1406 std::make_pair(NewDD.Definition, DD.Definition));
1407 Reader.mergeDefinitionVisibility(DD.Definition, NewDD.Definition);
1408
1409 if (D->getODRHash() != NewDD.ODRHash)
1410 Reader.PendingObjCProtocolOdrMergeFailures[DD.Definition].push_back(
1411 {NewDD.Definition, &NewDD});
1412}
1413
1415 RedeclarableResult Redecl = VisitRedeclarable(PD);
1417 mergeRedeclarable(PD, Redecl);
1418
1419 if (Record.readInt()) {
1420 // Read the definition.
1421 PD->allocateDefinitionData();
1422
1423 ReadObjCDefinitionData(PD->data());
1424
1425 ObjCProtocolDecl *Canon = PD->getCanonicalDecl();
1426 if (Canon->Data.getPointer()) {
1427 // If we already have a definition, keep the definition invariant and
1428 // merge the data.
1429 MergeImpl.MergeDefinitionData(Canon, std::move(PD->data()));
1430 PD->Data = Canon->Data;
1431 } else {
1432 // Set the definition data of the canonical declaration, so other
1433 // redeclarations will see it.
1434 PD->getCanonicalDecl()->Data = PD->Data;
1435 }
1436 // Note that we have deserialized a definition.
1437 Reader.PendingDefinitions.insert(PD);
1438 } else {
1439 PD->Data = PD->getCanonicalDecl()->Data;
1440 }
1441}
1442
1446
1449 CD->setCategoryNameLoc(readSourceLocation());
1450 CD->setIvarLBraceLoc(readSourceLocation());
1451 CD->setIvarRBraceLoc(readSourceLocation());
1452
1453 // Note that this category has been deserialized. We do this before
1454 // deserializing the interface declaration, so that it will consider this
1455 /// category.
1456 Reader.CategoriesDeserialized.insert(CD);
1457
1458 CD->ClassInterface = readDeclAs<ObjCInterfaceDecl>();
1459 CD->TypeParamList = ReadObjCTypeParamList();
1460 unsigned NumProtoRefs = Record.readInt();
1462 ProtoRefs.reserve(NumProtoRefs);
1463 for (unsigned I = 0; I != NumProtoRefs; ++I)
1464 ProtoRefs.push_back(readDeclAs<ObjCProtocolDecl>());
1466 ProtoLocs.reserve(NumProtoRefs);
1467 for (unsigned I = 0; I != NumProtoRefs; ++I)
1468 ProtoLocs.push_back(readSourceLocation());
1469 CD->setProtocolList(ProtoRefs.data(), NumProtoRefs, ProtoLocs.data(),
1470 Reader.getContext());
1471
1472 // Protocols in the class extension belong to the class.
1473 if (NumProtoRefs > 0 && CD->ClassInterface && CD->IsClassExtension())
1474 CD->ClassInterface->mergeClassExtensionProtocolList(
1475 (ObjCProtocolDecl *const *)ProtoRefs.data(), NumProtoRefs,
1476 Reader.getContext());
1477}
1478
1480 VisitNamedDecl(CAD);
1481 CAD->setClassInterface(readDeclAs<ObjCInterfaceDecl>());
1482}
1483
1485 VisitNamedDecl(D);
1486 D->setAtLoc(readSourceLocation());
1487 D->setLParenLoc(readSourceLocation());
1488 QualType T = Record.readType();
1489 TypeSourceInfo *TSI = readTypeSourceInfo();
1490 D->setType(T, TSI);
1493 (ObjCPropertyAttribute::Kind)Record.readInt());
1495 (ObjCPropertyDecl::PropertyControl)Record.readInt());
1496 DeclarationName GetterName = Record.readDeclarationName();
1497 SourceLocation GetterLoc = readSourceLocation();
1498 D->setGetterName(GetterName.getObjCSelector(), GetterLoc);
1499 DeclarationName SetterName = Record.readDeclarationName();
1500 SourceLocation SetterLoc = readSourceLocation();
1501 D->setSetterName(SetterName.getObjCSelector(), SetterLoc);
1502 D->setGetterMethodDecl(readDeclAs<ObjCMethodDecl>());
1503 D->setSetterMethodDecl(readDeclAs<ObjCMethodDecl>());
1504 D->setPropertyIvarDecl(readDeclAs<ObjCIvarDecl>());
1505}
1506
1509 D->setClassInterface(readDeclAs<ObjCInterfaceDecl>());
1510}
1511
1514 D->CategoryNameLoc = readSourceLocation();
1515}
1516
1519 D->setSuperClass(readDeclAs<ObjCInterfaceDecl>());
1520 D->SuperLoc = readSourceLocation();
1521 D->setIvarLBraceLoc(readSourceLocation());
1522 D->setIvarRBraceLoc(readSourceLocation());
1523 D->setHasNonZeroConstructors(Record.readInt());
1524 D->setHasDestructors(Record.readInt());
1525 D->NumIvarInitializers = Record.readInt();
1526 if (D->NumIvarInitializers)
1527 D->IvarInitializers = ReadGlobalOffset();
1528}
1529
1531 VisitDecl(D);
1532 D->setAtLoc(readSourceLocation());
1533 D->setPropertyDecl(readDeclAs<ObjCPropertyDecl>());
1534 D->PropertyIvarDecl = readDeclAs<ObjCIvarDecl>();
1535 D->IvarLoc = readSourceLocation();
1536 D->setGetterMethodDecl(readDeclAs<ObjCMethodDecl>());
1537 D->setSetterMethodDecl(readDeclAs<ObjCMethodDecl>());
1538 D->setGetterCXXConstructor(Record.readExpr());
1539 D->setSetterCXXAssignment(Record.readExpr());
1540}
1541
1544 FD->Mutable = Record.readInt();
1545
1546 unsigned Bits = Record.readInt();
1547 FD->StorageKind = Bits >> 1;
1548 if (FD->StorageKind == FieldDecl::ISK_CapturedVLAType)
1549 FD->CapturedVLAType =
1550 cast<VariableArrayType>(Record.readType().getTypePtr());
1551 else if (Bits & 1)
1552 FD->setBitWidth(Record.readExpr());
1553
1554 if (!FD->getDeclName() ||
1555 FD->isPlaceholderVar(Reader.getContext().getLangOpts())) {
1556 if (auto *Tmpl = readDeclAs<FieldDecl>())
1557 Reader.getContext().setInstantiatedFromUnnamedFieldDecl(FD, Tmpl);
1558 }
1559 mergeMergeable(FD);
1560}
1561
1564 PD->GetterId = Record.readIdentifier();
1565 PD->SetterId = Record.readIdentifier();
1566}
1567
1569 VisitValueDecl(D);
1570 D->PartVal.Part1 = Record.readInt();
1571 D->PartVal.Part2 = Record.readInt();
1572 D->PartVal.Part3 = Record.readInt();
1573 for (auto &C : D->PartVal.Part4And5)
1574 C = Record.readInt();
1575
1576 // Add this GUID to the AST context's lookup structure, and merge if needed.
1577 if (MSGuidDecl *Existing = Reader.getContext().MSGuidDecls.getOrInsert(D))
1578 Reader.getContext().setPrimaryMergedDecl(D, Existing->getCanonicalDecl());
1579}
1580
1583 VisitValueDecl(D);
1584 D->Value = Record.readAPValue();
1585
1586 // Add this to the AST context's lookup structure, and merge if needed.
1587 if (UnnamedGlobalConstantDecl *Existing =
1588 Reader.getContext().UnnamedGlobalConstantDecls.getOrInsert(D))
1589 Reader.getContext().setPrimaryMergedDecl(D, Existing->getCanonicalDecl());
1590}
1591
1593 VisitValueDecl(D);
1594 D->Value = Record.readAPValue();
1595
1596 // Add this template parameter object to the AST context's lookup structure,
1597 // and merge if needed.
1598 if (TemplateParamObjectDecl *Existing =
1599 Reader.getContext().TemplateParamObjectDecls.getOrInsert(D))
1600 Reader.getContext().setPrimaryMergedDecl(D, Existing->getCanonicalDecl());
1601}
1602
1604 VisitValueDecl(FD);
1605
1606 FD->ChainingSize = Record.readInt();
1607 assert(FD->ChainingSize >= 2 && "Anonymous chaining must be >= 2");
1608 FD->Chaining = new (Reader.getContext())NamedDecl*[FD->ChainingSize];
1609
1610 for (unsigned I = 0; I != FD->ChainingSize; ++I)
1611 FD->Chaining[I] = readDeclAs<NamedDecl>();
1612
1613 mergeMergeable(FD);
1614}
1615
1617 RedeclarableResult Redecl = VisitRedeclarable(VD);
1619
1620 BitsUnpacker VarDeclBits(Record.readInt());
1621 auto VarLinkage = Linkage(VarDeclBits.getNextBits(/*Width=*/3));
1622 bool DefGeneratedInModule = VarDeclBits.getNextBit();
1623 VD->VarDeclBits.SClass = (StorageClass)VarDeclBits.getNextBits(/*Width=*/3);
1624 VD->VarDeclBits.TSCSpec = VarDeclBits.getNextBits(/*Width=*/2);
1625 VD->VarDeclBits.InitStyle = VarDeclBits.getNextBits(/*Width=*/2);
1626 VD->VarDeclBits.ARCPseudoStrong = VarDeclBits.getNextBit();
1627 bool HasDeducedType = false;
1628 if (!isa<ParmVarDecl>(VD)) {
1629 VD->NonParmVarDeclBits.IsThisDeclarationADemotedDefinition =
1630 VarDeclBits.getNextBit();
1631 VD->NonParmVarDeclBits.ExceptionVar = VarDeclBits.getNextBit();
1632 VD->NonParmVarDeclBits.NRVOVariable = VarDeclBits.getNextBit();
1633 VD->NonParmVarDeclBits.CXXForRangeDecl = VarDeclBits.getNextBit();
1634
1635 VD->NonParmVarDeclBits.IsInline = VarDeclBits.getNextBit();
1636 VD->NonParmVarDeclBits.IsInlineSpecified = VarDeclBits.getNextBit();
1637 VD->NonParmVarDeclBits.IsConstexpr = VarDeclBits.getNextBit();
1638 VD->NonParmVarDeclBits.IsInitCapture = VarDeclBits.getNextBit();
1639 VD->NonParmVarDeclBits.PreviousDeclInSameBlockScope =
1640 VarDeclBits.getNextBit();
1641
1642 VD->NonParmVarDeclBits.EscapingByref = VarDeclBits.getNextBit();
1643 HasDeducedType = VarDeclBits.getNextBit();
1644 VD->NonParmVarDeclBits.ImplicitParamKind =
1645 VarDeclBits.getNextBits(/*Width*/ 3);
1646
1647 VD->NonParmVarDeclBits.ObjCForDecl = VarDeclBits.getNextBit();
1648 VD->NonParmVarDeclBits.IsCXXForRangeImplicitVar = VarDeclBits.getNextBit();
1649 }
1650
1651 // If this variable has a deduced type, defer reading that type until we are
1652 // done deserializing this variable, because the type might refer back to the
1653 // variable.
1654 if (HasDeducedType)
1655 Reader.PendingDeducedVarTypes.push_back({VD, DeferredTypeID});
1656 else
1657 VD->setType(Reader.GetType(DeferredTypeID));
1658 DeferredTypeID = 0;
1659
1660 VD->setCachedLinkage(VarLinkage);
1661
1662 // Reconstruct the one piece of the IdentifierNamespace that we need.
1663 if (VD->getStorageClass() == SC_Extern && VarLinkage != Linkage::None &&
1665 VD->setLocalExternDecl();
1666
1667 if (DefGeneratedInModule) {
1668 Reader.DefinitionSource[VD] =
1669 Loc.F->Kind == ModuleKind::MK_MainFile ||
1670 Reader.getContext().getLangOpts().BuildingPCHWithObjectFile;
1671 }
1672
1673 if (VD->hasAttr<BlocksAttr>()) {
1674 Expr *CopyExpr = Record.readExpr();
1675 if (CopyExpr)
1676 Reader.getContext().setBlockVarCopyInit(VD, CopyExpr, Record.readInt());
1677 }
1678
1679 enum VarKind {
1680 VarNotTemplate = 0, VarTemplate, StaticDataMemberSpecialization
1681 };
1682 switch ((VarKind)Record.readInt()) {
1683 case VarNotTemplate:
1684 // Only true variables (not parameters or implicit parameters) can be
1685 // merged; the other kinds are not really redeclarable at all.
1686 if (!isa<ParmVarDecl>(VD) && !isa<ImplicitParamDecl>(VD) &&
1688 mergeRedeclarable(VD, Redecl);
1689 break;
1690 case VarTemplate:
1691 // Merged when we merge the template.
1692 VD->setDescribedVarTemplate(readDeclAs<VarTemplateDecl>());
1693 break;
1694 case StaticDataMemberSpecialization: { // HasMemberSpecializationInfo.
1695 auto *Tmpl = readDeclAs<VarDecl>();
1696 auto TSK = (TemplateSpecializationKind)Record.readInt();
1697 SourceLocation POI = readSourceLocation();
1698 Reader.getContext().setInstantiatedFromStaticDataMember(VD, Tmpl, TSK,POI);
1699 mergeRedeclarable(VD, Redecl);
1700 break;
1701 }
1702 }
1703
1704 return Redecl;
1705}
1706
1708 if (uint64_t Val = Record.readInt()) {
1709 ASTContext &Context = Reader.getContext();
1710 EvaluatedStmt *Eval = VD->ensureEvaluatedStmt();
1711 Eval->HasConstantInitialization = (Val & 2) != 0;
1712 Eval->HasConstantDestruction = (Val & 4) != 0;
1713 Eval->WasEvaluated = (Val & 8) != 0;
1714 Eval->HasSideEffects = (Val & 16) != 0;
1715 Eval->CheckedForSideEffects = true;
1716 if (Eval->WasEvaluated) {
1717 Eval->Evaluated = Record.readAPValue();
1718 if (Eval->Evaluated.needsCleanup())
1719 Context.addDestruction(&Eval->Evaluated);
1720
1721 // The bytecode interpreter has its own internal representation of global
1722 // variables. Notify it that we just deserialized one and what its value
1723 // is. This is important because this declaration might initialize a
1724 // previously declared global (e.g. because that one is extern).
1725 if (Context.getLangOpts().EnableNewConstInterp &&
1726 !VD->getType().isNull() && VD->getPreviousDecl() != nullptr)
1727 Context.getInterpContext().registerRedecl(VD, Eval->Evaluated);
1728 }
1729
1730 // Store the offset of the initializer. Don't deserialize it yet: it might
1731 // not be needed, and might refer back to the variable, for example if it
1732 // contains a lambda.
1733 Eval->Value = GetCurrentCursorOffset();
1734 }
1735}
1736
1740
1742 VisitVarDecl(PD);
1743
1744 unsigned scopeIndex = Record.readInt();
1745 BitsUnpacker ParmVarDeclBits(Record.readInt());
1746 unsigned isObjCMethodParam = ParmVarDeclBits.getNextBit();
1747 unsigned scopeDepth = ParmVarDeclBits.getNextBits(/*Width=*/7);
1748 unsigned declQualifier = ParmVarDeclBits.getNextBits(/*Width=*/7);
1749 if (isObjCMethodParam) {
1750 assert(scopeDepth == 0);
1751 PD->setObjCMethodScopeInfo(scopeIndex);
1752 PD->ParmVarDeclBits.ScopeDepthOrObjCQuals = declQualifier;
1753 } else {
1754 PD->setScopeInfo(scopeDepth, scopeIndex);
1755 }
1756 PD->ParmVarDeclBits.IsKNRPromoted = ParmVarDeclBits.getNextBit();
1757
1758 PD->ParmVarDeclBits.HasInheritedDefaultArg = ParmVarDeclBits.getNextBit();
1759 if (ParmVarDeclBits.getNextBit()) // hasUninstantiatedDefaultArg.
1760 PD->setUninstantiatedDefaultArg(Record.readExpr());
1761
1762 if (ParmVarDeclBits.getNextBit()) // Valid explicit object parameter
1763 PD->ExplicitObjectParameterIntroducerLoc = Record.readSourceLocation();
1764
1765 // FIXME: If this is a redeclaration of a function from another module, handle
1766 // inheritance of default arguments.
1767}
1768
1770 VisitVarDecl(DD);
1771 auto **BDs = DD->getTrailingObjects();
1772 for (unsigned I = 0; I != DD->NumBindings; ++I) {
1773 BDs[I] = readDeclAs<BindingDecl>();
1774 BDs[I]->setDecomposedDecl(DD);
1775 }
1776}
1777
1779 VisitValueDecl(BD);
1780 BD->Binding = Record.readExpr();
1781}
1782
1784 VisitDecl(AD);
1785 AD->setAsmString(cast<StringLiteral>(Record.readExpr()));
1786 AD->setRParenLoc(readSourceLocation());
1787}
1788
1790 VisitDecl(D);
1791 D->Ordinal = Record.readInt();
1792 // Keep new statements numbered after the ones loaded from an AST file.
1793 ASTContext &Ctx = Reader.getContext();
1794 Ctx.NumTopLevelStmtDecls = std::max(Ctx.NumTopLevelStmtDecls, D->Ordinal + 1);
1795 D->Statement = Record.readStmt();
1796}
1797
1799 VisitDecl(BD);
1800 BD->setBody(cast_or_null<CompoundStmt>(Record.readStmt()));
1801 BD->setSignatureAsWritten(readTypeSourceInfo());
1802 unsigned NumParams = Record.readInt();
1804 Params.reserve(NumParams);
1805 for (unsigned I = 0; I != NumParams; ++I)
1806 Params.push_back(readDeclAs<ParmVarDecl>());
1807 BD->setParams(Params);
1808
1809 BD->setIsVariadic(Record.readInt());
1810 BD->setBlockMissingReturnType(Record.readInt());
1811 BD->setIsConversionFromLambda(Record.readInt());
1812 BD->setDoesNotEscape(Record.readInt());
1813 BD->setCanAvoidCopyToHeap(Record.readInt());
1814
1815 bool capturesCXXThis = Record.readInt();
1816 unsigned numCaptures = Record.readInt();
1818 captures.reserve(numCaptures);
1819 for (unsigned i = 0; i != numCaptures; ++i) {
1820 auto *decl = readDeclAs<VarDecl>();
1821 unsigned flags = Record.readInt();
1822 bool byRef = (flags & 1);
1823 bool nested = (flags & 2);
1824 Expr *copyExpr = ((flags & 4) ? Record.readExpr() : nullptr);
1825
1826 captures.push_back(BlockDecl::Capture(decl, byRef, nested, copyExpr));
1827 }
1828 BD->setCaptures(Reader.getContext(), captures, capturesCXXThis);
1829}
1830
1832 // NumParams is deserialized by OutlinedFunctionDecl::CreateDeserialized().
1833 VisitDecl(D);
1834 for (unsigned I = 0; I < D->NumParams; ++I)
1835 D->setParam(I, readDeclAs<ImplicitParamDecl>());
1836 D->setNothrow(Record.readInt() != 0);
1837 D->setBody(cast_or_null<Stmt>(Record.readStmt()));
1838}
1839
1841 VisitDecl(CD);
1842 unsigned ContextParamPos = Record.readInt();
1843 CD->setNothrow(Record.readInt() != 0);
1844 // Body is set by VisitCapturedStmt.
1845 for (unsigned I = 0; I < CD->NumParams; ++I) {
1846 if (I != ContextParamPos)
1847 CD->setParam(I, readDeclAs<ImplicitParamDecl>());
1848 else
1849 CD->setContextParam(I, readDeclAs<ImplicitParamDecl>());
1850 }
1851}
1852
1854 VisitDecl(D);
1855 D->setLanguage(static_cast<LinkageSpecLanguageIDs>(Record.readInt()));
1856 D->setExternLoc(readSourceLocation());
1857 D->setRBraceLoc(readSourceLocation());
1858}
1859
1861 VisitDecl(D);
1862 D->RBraceLoc = readSourceLocation();
1863}
1864
1866 VisitNamedDecl(D);
1867 D->setLocStart(readSourceLocation());
1868}
1869
1871 RedeclarableResult Redecl = VisitRedeclarable(D);
1872 VisitNamedDecl(D);
1873
1874 BitsUnpacker NamespaceDeclBits(Record.readInt());
1875 D->setInline(NamespaceDeclBits.getNextBit());
1876 D->setNested(NamespaceDeclBits.getNextBit());
1877 D->LocStart = readSourceLocation();
1878 D->RBraceLoc = readSourceLocation();
1879
1880 // Defer loading the anonymous namespace until we've finished merging
1881 // this namespace; loading it might load a later declaration of the
1882 // same namespace, and we have an invariant that older declarations
1883 // get merged before newer ones try to merge.
1884 GlobalDeclID AnonNamespace;
1885 if (Redecl.getFirstID() == ThisDeclID)
1886 AnonNamespace = readDeclID();
1887
1888 mergeRedeclarable(D, Redecl);
1889
1890 if (AnonNamespace.isValid()) {
1891 // Each module has its own anonymous namespace, which is disjoint from
1892 // any other module's anonymous namespaces, so don't attach the anonymous
1893 // namespace at all.
1894 auto *Anon = cast<NamespaceDecl>(Reader.GetDecl(AnonNamespace));
1895 if (!Record.isModule())
1896 D->setAnonymousNamespace(Anon);
1897 }
1898}
1899
1901 VisitNamedDecl(D);
1902 LookupBlockOffsets Offsets;
1903 VisitDeclContext(D, Offsets);
1904 D->IsCBuffer = Record.readBool();
1905 D->KwLoc = readSourceLocation();
1906 D->LBraceLoc = readSourceLocation();
1907 D->RBraceLoc = readSourceLocation();
1908}
1909
1911 RedeclarableResult Redecl = VisitRedeclarable(D);
1912 VisitNamedDecl(D);
1913 D->NamespaceLoc = readSourceLocation();
1914 D->IdentLoc = readSourceLocation();
1915 D->QualifierLoc = Record.readNestedNameSpecifierLoc();
1916 D->Namespace = readDeclAs<NamespaceBaseDecl>();
1917 mergeRedeclarable(D, Redecl);
1918}
1919
1921 VisitNamedDecl(D);
1922 D->setUsingLoc(readSourceLocation());
1923 D->QualifierLoc = Record.readNestedNameSpecifierLoc();
1924 D->DNLoc = Record.readDeclarationNameLoc(D->getDeclName());
1925 D->FirstUsingShadow.setPointer(readDeclAs<UsingShadowDecl>());
1926 D->setTypename(Record.readInt());
1927 if (auto *Pattern = readDeclAs<NamedDecl>())
1928 Reader.getContext().setInstantiatedFromUsingDecl(D, Pattern);
1929 mergeMergeable(D);
1930}
1931
1933 VisitNamedDecl(D);
1934 D->setUsingLoc(readSourceLocation());
1935 D->setEnumLoc(readSourceLocation());
1936 D->setEnumType(Record.readTypeSourceInfo());
1937 D->FirstUsingShadow.setPointer(readDeclAs<UsingShadowDecl>());
1938 if (auto *Pattern = readDeclAs<UsingEnumDecl>())
1939 Reader.getContext().setInstantiatedFromUsingEnumDecl(D, Pattern);
1940 mergeMergeable(D);
1941}
1942
1944 VisitNamedDecl(D);
1945 D->InstantiatedFrom = readDeclAs<NamedDecl>();
1946 auto **Expansions = D->getTrailingObjects();
1947 for (unsigned I = 0; I != D->NumExpansions; ++I)
1948 Expansions[I] = readDeclAs<NamedDecl>();
1949 mergeMergeable(D);
1950}
1951
1953 RedeclarableResult Redecl = VisitRedeclarable(D);
1954 VisitNamedDecl(D);
1955 D->Underlying = readDeclAs<NamedDecl>();
1956 D->IdentifierNamespace = Record.readInt();
1957 D->UsingOrNextShadow = readDeclAs<NamedDecl>();
1958 auto *Pattern = readDeclAs<UsingShadowDecl>();
1959 if (Pattern)
1960 Reader.getContext().setInstantiatedFromUsingShadowDecl(D, Pattern);
1961 mergeRedeclarable(D, Redecl);
1962}
1963
1967 D->NominatedBaseClassShadowDecl = readDeclAs<ConstructorUsingShadowDecl>();
1968 D->ConstructedBaseClassShadowDecl = readDeclAs<ConstructorUsingShadowDecl>();
1969 D->IsVirtual = Record.readInt();
1970}
1971
1973 VisitNamedDecl(D);
1974 D->UsingLoc = readSourceLocation();
1975 D->NamespaceLoc = readSourceLocation();
1976 D->QualifierLoc = Record.readNestedNameSpecifierLoc();
1977 D->NominatedNamespace = readDeclAs<NamedDecl>();
1978 D->CommonAncestor = readDeclAs<DeclContext>();
1979}
1980
1982 VisitValueDecl(D);
1983 D->setUsingLoc(readSourceLocation());
1984 D->QualifierLoc = Record.readNestedNameSpecifierLoc();
1985 D->DNLoc = Record.readDeclarationNameLoc(D->getDeclName());
1986 D->EllipsisLoc = readSourceLocation();
1987 mergeMergeable(D);
1988}
1989
1992 VisitTypeDecl(D);
1993 D->TypenameLocation = readSourceLocation();
1994 D->QualifierLoc = Record.readNestedNameSpecifierLoc();
1995 D->EllipsisLoc = readSourceLocation();
1996 mergeMergeable(D);
1997}
1998
2003
2004void ASTDeclReader::ReadCXXDefinitionData(
2005 struct CXXRecordDecl::DefinitionData &Data, const CXXRecordDecl *D,
2006 Decl *LambdaContext, unsigned IndexInLambdaContext) {
2007
2008 BitsUnpacker CXXRecordDeclBits = Record.readInt();
2009
2010#define FIELD(Name, Width, Merge) \
2011 if (!CXXRecordDeclBits.canGetNextNBits(Width)) \
2012 CXXRecordDeclBits.updateValue(Record.readInt()); \
2013 Data.Name = CXXRecordDeclBits.getNextBits(Width);
2014
2015#include "clang/AST/CXXRecordDeclDefinitionBits.def"
2016#undef FIELD
2017
2018 // Note: the caller has deserialized the IsLambda bit already.
2019 Data.ODRHash = Record.readInt();
2020 Data.HasODRHash = true;
2021
2022 if (Record.readInt()) {
2023 Reader.DefinitionSource[D] =
2024 Loc.F->Kind == ModuleKind::MK_MainFile ||
2025 Reader.getContext().getLangOpts().BuildingPCHWithObjectFile;
2026 }
2027
2028 Record.readUnresolvedSet(Data.Conversions);
2029 Data.ComputedVisibleConversions = Record.readInt();
2030 if (Data.ComputedVisibleConversions)
2031 Record.readUnresolvedSet(Data.VisibleConversions);
2032 assert(Data.Definition && "Data.Definition should be already set!");
2033
2034 if (!Data.IsLambda) {
2035 assert(!LambdaContext && !IndexInLambdaContext &&
2036 "given lambda context for non-lambda");
2037
2038 Data.NumBases = Record.readInt();
2039 if (Data.NumBases)
2040 Data.Bases = ReadGlobalOffset();
2041
2042 Data.NumVBases = Record.readInt();
2043 if (Data.NumVBases)
2044 Data.VBases = ReadGlobalOffset();
2045
2046 Data.FirstFriend = readDeclID().getRawValue();
2047 } else {
2048 using Capture = LambdaCapture;
2049
2050 auto &Lambda = static_cast<CXXRecordDecl::LambdaDefinitionData &>(Data);
2051
2052 BitsUnpacker LambdaBits(Record.readInt());
2053 Lambda.DependencyKind = LambdaBits.getNextBits(/*Width=*/2);
2054 Lambda.IsGenericLambda = LambdaBits.getNextBit();
2055 Lambda.CaptureDefault = LambdaBits.getNextBits(/*Width=*/2);
2056 Lambda.NumCaptures = LambdaBits.getNextBits(/*Width=*/15);
2057 Lambda.HasKnownInternalLinkage = LambdaBits.getNextBit();
2058
2059 Lambda.NumExplicitCaptures = Record.readInt();
2060 Lambda.ManglingNumber = Record.readInt();
2061 if (unsigned DeviceManglingNumber = Record.readInt())
2062 Reader.getContext().DeviceLambdaManglingNumbers[D] = DeviceManglingNumber;
2063 Lambda.IndexInContext = IndexInLambdaContext;
2064 Lambda.ContextDecl = LambdaContext;
2065 Capture *ToCapture = nullptr;
2066 if (Lambda.NumCaptures) {
2067 ToCapture = (Capture *)Reader.getContext().Allocate(sizeof(Capture) *
2068 Lambda.NumCaptures);
2069 Lambda.AddCaptureList(Reader.getContext(), ToCapture);
2070 }
2071 Lambda.MethodTyInfo = readTypeSourceInfo();
2072 for (unsigned I = 0, N = Lambda.NumCaptures; I != N; ++I) {
2073 SourceLocation Loc = readSourceLocation();
2074 BitsUnpacker CaptureBits(Record.readInt());
2075 bool IsImplicit = CaptureBits.getNextBit();
2076 auto Kind =
2077 static_cast<LambdaCaptureKind>(CaptureBits.getNextBits(/*Width=*/3));
2078 switch (Kind) {
2079 case LCK_StarThis:
2080 case LCK_This:
2081 case LCK_VLAType:
2082 new (ToCapture)
2083 Capture(Loc, IsImplicit, Kind, nullptr, SourceLocation());
2084 ToCapture++;
2085 break;
2086 case LCK_ByCopy:
2087 case LCK_ByRef:
2088 auto *Var = readDeclAs<ValueDecl>();
2089 SourceLocation EllipsisLoc = readSourceLocation();
2090 new (ToCapture) Capture(Loc, IsImplicit, Kind, Var, EllipsisLoc);
2091 ToCapture++;
2092 break;
2093 }
2094 }
2095 }
2096}
2097
2099 CXXRecordDecl *D, struct CXXRecordDecl::DefinitionData &&MergeDD) {
2100 assert(D->DefinitionData &&
2101 "merging class definition into non-definition");
2102 auto &DD = *D->DefinitionData;
2103
2104 if (DD.Definition != MergeDD.Definition) {
2105 // Track that we merged the definitions.
2106 Reader.MergedDeclContexts.insert(std::make_pair(MergeDD.Definition,
2107 DD.Definition));
2108 Reader.PendingDefinitions.erase(MergeDD.Definition);
2109 MergeDD.Definition->demoteThisDefinitionToDeclaration();
2110 Reader.mergeDefinitionVisibility(DD.Definition, MergeDD.Definition);
2111 assert(!Reader.Lookups.contains(MergeDD.Definition) &&
2112 "already loaded pending lookups for merged definition");
2113 }
2114
2115 auto PFDI = Reader.PendingFakeDefinitionData.find(&DD);
2116 if (PFDI != Reader.PendingFakeDefinitionData.end() &&
2117 PFDI->second == ASTReader::PendingFakeDefinitionKind::Fake) {
2118 // We faked up this definition data because we found a class for which we'd
2119 // not yet loaded the definition. Replace it with the real thing now.
2120 assert(!DD.IsLambda && "faked up lambda definition?");
2121
2122 // This is possible for some special loading ordering. See
2123 // clang/test/Modules/pr217858.cppm for an example.
2124 //
2125 // LambdaDefinitionData is larger than DefinitionData, so it cannot replace
2126 // the fake DefinitionData object in place.
2127 if (MergeDD.IsLambda) {
2128 auto *Def = DD.Definition;
2129 MergeDD.Definition = Def;
2130 // Unlike an instantiated class definition,
2131 // whose update-record reader removes the fake entry after loading its
2132 // lexical declarations, a lambda's definition is part of its declaration
2133 // record and is fully loaded here.
2134 Reader.PendingFakeDefinitionData.erase(PFDI);
2135 for (auto *R = Reader.getMostRecentExistingDecl(Def); R;
2136 R = R->getPreviousDecl())
2137 cast<CXXRecordDecl>(R)->DefinitionData = &MergeDD;
2138 return;
2139 }
2140
2141 PFDI->second = ASTReader::PendingFakeDefinitionKind::FakeLoaded;
2142
2143 // Don't change which declaration is the definition; that is required
2144 // to be invariant once we select it.
2145 auto *Def = DD.Definition;
2146 DD = std::move(MergeDD);
2147 DD.Definition = Def;
2148 for (auto *R = Reader.getMostRecentExistingDecl(Def); R;
2149 R = R->getPreviousDecl())
2150 cast<CXXRecordDecl>(R)->DefinitionData = &DD;
2151 return;
2152 }
2153
2154 bool DetectedOdrViolation = false;
2155
2156 #define FIELD(Name, Width, Merge) Merge(Name)
2157 #define MERGE_OR(Field) DD.Field |= MergeDD.Field;
2158 #define NO_MERGE(Field) \
2159 DetectedOdrViolation |= DD.Field != MergeDD.Field; \
2160 MERGE_OR(Field)
2161 #include "clang/AST/CXXRecordDeclDefinitionBits.def"
2162 NO_MERGE(IsLambda)
2163 #undef NO_MERGE
2164 #undef MERGE_OR
2165
2166 if (DD.NumBases != MergeDD.NumBases || DD.NumVBases != MergeDD.NumVBases)
2167 DetectedOdrViolation = true;
2168 // FIXME: Issue a diagnostic if the base classes don't match when we come
2169 // to lazily load them.
2170
2171 // FIXME: Issue a diagnostic if the list of conversion functions doesn't
2172 // match when we come to lazily load them.
2173 if (MergeDD.ComputedVisibleConversions && !DD.ComputedVisibleConversions) {
2174 DD.VisibleConversions = std::move(MergeDD.VisibleConversions);
2175 DD.ComputedVisibleConversions = true;
2176 }
2177
2178 // FIXME: Issue a diagnostic if FirstFriend doesn't match when we come to
2179 // lazily load it.
2180
2181 if (DD.IsLambda) {
2182 auto &Lambda1 = static_cast<CXXRecordDecl::LambdaDefinitionData &>(DD);
2183 auto &Lambda2 = static_cast<CXXRecordDecl::LambdaDefinitionData &>(MergeDD);
2184 DetectedOdrViolation |= Lambda1.DependencyKind != Lambda2.DependencyKind;
2185 DetectedOdrViolation |= Lambda1.IsGenericLambda != Lambda2.IsGenericLambda;
2186 DetectedOdrViolation |= Lambda1.CaptureDefault != Lambda2.CaptureDefault;
2187 DetectedOdrViolation |= Lambda1.NumCaptures != Lambda2.NumCaptures;
2188 DetectedOdrViolation |=
2189 Lambda1.NumExplicitCaptures != Lambda2.NumExplicitCaptures;
2190 DetectedOdrViolation |=
2191 Lambda1.HasKnownInternalLinkage != Lambda2.HasKnownInternalLinkage;
2192 DetectedOdrViolation |= Lambda1.ManglingNumber != Lambda2.ManglingNumber;
2193
2194 if (Lambda1.NumCaptures && Lambda1.NumCaptures == Lambda2.NumCaptures) {
2195 for (unsigned I = 0, N = Lambda1.NumCaptures; I != N; ++I) {
2196 LambdaCapture &Cap1 = Lambda1.Captures.front()[I];
2197 LambdaCapture &Cap2 = Lambda2.Captures.front()[I];
2198 DetectedOdrViolation |= Cap1.getCaptureKind() != Cap2.getCaptureKind();
2199 }
2200 Lambda1.AddCaptureList(Reader.getContext(), Lambda2.Captures.front());
2201 }
2202 }
2203
2204 // We don't want to check ODR for decls in the global module fragment.
2205 if (shouldSkipCheckingODR(MergeDD.Definition) || shouldSkipCheckingODR(D))
2206 return;
2207
2208 if (D->getODRHash() != MergeDD.ODRHash) {
2209 DetectedOdrViolation = true;
2210 }
2211
2212 if (DetectedOdrViolation)
2213 Reader.PendingOdrMergeFailures[DD.Definition].push_back(
2214 {MergeDD.Definition, &MergeDD});
2215}
2216
2217void ASTDeclReader::ReadCXXRecordDefinition(CXXRecordDecl *D, bool Update,
2218 Decl *LambdaContext,
2219 unsigned IndexInLambdaContext) {
2220 struct CXXRecordDecl::DefinitionData *DD;
2221 ASTContext &C = Reader.getContext();
2222
2223 // Determine whether this is a lambda closure type, so that we can
2224 // allocate the appropriate DefinitionData structure.
2225 bool IsLambda = Record.readInt();
2226 assert(!(IsLambda && Update) &&
2227 "lambda definition should not be added by update record");
2228 if (IsLambda)
2229 DD = new (C) CXXRecordDecl::LambdaDefinitionData(
2230 D, nullptr, CXXRecordDecl::LDK_Unknown, false, LCD_None);
2231 else
2232 DD = new (C) struct CXXRecordDecl::DefinitionData(D);
2233
2234 CXXRecordDecl *Canon = D->getCanonicalDecl();
2235 // Set decl definition data before reading it, so that during deserialization
2236 // when we read CXXRecordDecl, it already has definition data and we don't
2237 // set fake one.
2238 if (!Canon->DefinitionData)
2239 Canon->DefinitionData = DD;
2240 D->DefinitionData = Canon->DefinitionData;
2241 ReadCXXDefinitionData(*DD, D, LambdaContext, IndexInLambdaContext);
2242
2243 // Mark this declaration as being a definition.
2244 D->setCompleteDefinition(true);
2245
2246 // We might already have a different definition for this record. This can
2247 // happen either because we're reading an update record, or because we've
2248 // already done some merging. Either way, just merge into it.
2249 if (Canon->DefinitionData != DD) {
2250 MergeImpl.MergeDefinitionData(Canon, std::move(*DD));
2251 return;
2252 }
2253
2254 // If this is not the first declaration or is an update record, we can have
2255 // other redeclarations already. Make a note that we need to propagate the
2256 // DefinitionData pointer onto them.
2257 if (Update || Canon != D)
2258 Reader.PendingDefinitions.insert(D);
2259}
2260
2262 RedeclarableResult Redecl = VisitRecordDeclImpl(D);
2263
2264 ASTContext &C = Reader.getContext();
2265
2266 enum CXXRecKind {
2267 CXXRecNotTemplate = 0,
2268 CXXRecTemplate,
2269 CXXRecMemberSpecialization,
2270 CXXLambda
2271 };
2272
2273 Decl *LambdaContext = nullptr;
2274 unsigned IndexInLambdaContext = 0;
2275
2276 switch ((CXXRecKind)Record.readInt()) {
2277 case CXXRecNotTemplate:
2278 // Merged when we merge the folding set entry in the primary template.
2280 mergeRedeclarable(D, Redecl);
2281 break;
2282 case CXXRecTemplate: {
2283 // Merged when we merge the template.
2284 auto *Template = readDeclAs<ClassTemplateDecl>();
2285 D->TemplateOrInstantiation = Template;
2286 break;
2287 }
2288 case CXXRecMemberSpecialization: {
2289 auto *RD = readDeclAs<CXXRecordDecl>();
2290 auto TSK = (TemplateSpecializationKind)Record.readInt();
2291 SourceLocation POI = readSourceLocation();
2293 MSI->setPointOfInstantiation(POI);
2294 D->TemplateOrInstantiation = MSI;
2295 mergeRedeclarable(D, Redecl);
2296 break;
2297 }
2298 case CXXLambda: {
2299 LambdaContext = readDecl();
2300 if (LambdaContext)
2301 IndexInLambdaContext = Record.readInt();
2302 if (LambdaContext)
2303 MergeImpl.mergeLambda(D, Redecl, *LambdaContext, IndexInLambdaContext);
2304 else
2305 // If we don't have a mangling context, treat this like any other
2306 // declaration.
2307 mergeRedeclarable(D, Redecl);
2308 break;
2309 }
2310 }
2311
2312 bool WasDefinition = Record.readInt();
2313 if (WasDefinition)
2314 ReadCXXRecordDefinition(D, /*Update=*/false, LambdaContext,
2315 IndexInLambdaContext);
2316 else
2317 // Propagate DefinitionData pointer from the canonical declaration.
2318 D->DefinitionData = D->getCanonicalDecl()->DefinitionData;
2319
2320 // Lazily load the key function to avoid deserializing every method so we can
2321 // compute it.
2322 if (WasDefinition) {
2323 GlobalDeclID KeyFn = readDeclID();
2324 if (KeyFn.isValid() && D->isCompleteDefinition())
2325 // FIXME: This is wrong for the ARM ABI, where some other module may have
2326 // made this function no longer be a key function. We need an update
2327 // record or similar for that case.
2328 C.KeyFunctions[D] = KeyFn.getRawValue();
2329 }
2330
2331 return Redecl;
2332}
2333
2335 D->setExplicitSpecifier(Record.readExplicitSpec());
2336 D->Ctor = readDeclAs<CXXConstructorDecl>();
2339 static_cast<DeductionCandidate>(Record.readInt()));
2340 D->setSourceDeductionGuide(readDeclAs<CXXDeductionGuideDecl>());
2343 Record.readInt()));
2344}
2345
2348
2349 unsigned NumOverridenMethods = Record.readInt();
2350 if (D->isCanonicalDecl()) {
2351 while (NumOverridenMethods--) {
2352 // Avoid invariant checking of CXXMethodDecl::addOverriddenMethod,
2353 // MD may be initializing.
2354 if (auto *MD = readDeclAs<CXXMethodDecl>())
2355 Reader.getContext().addOverriddenMethod(D, MD->getCanonicalDecl());
2356 }
2357 } else {
2358 // We don't care about which declarations this used to override; we get
2359 // the relevant information from the canonical declaration.
2360 Record.skipInts(NumOverridenMethods);
2361 }
2362}
2363
2365 // We need the inherited constructor information to merge the declaration,
2366 // so we have to read it before we call VisitCXXMethodDecl.
2367 D->setExplicitSpecifier(Record.readExplicitSpec());
2368 if (D->isInheritingConstructor()) {
2369 auto *Shadow = readDeclAs<ConstructorUsingShadowDecl>();
2370 auto *Ctor = readDeclAs<CXXConstructorDecl>();
2371 *D->getTrailingObjects<InheritedConstructor>() =
2372 InheritedConstructor(Shadow, Ctor);
2373 }
2374
2375 if (unsigned NumArgs = Record.readUInt32()) {
2376 CXXDefaultArgExpr **Args =
2377 new (Reader.getContext()) CXXDefaultArgExpr *[NumArgs];
2378 for (unsigned I = 0; I != NumArgs; I++)
2379 Args[I] = cast_or_null<CXXDefaultArgExpr>(Record.readStmt());
2380 D->setCtorClosureDefaultArgs(ArrayRef(Args, NumArgs));
2381 }
2382
2384}
2385
2388
2389 ASTContext &C = Reader.getContext();
2391 if (auto *OperatorDelete = readDeclAs<FunctionDecl>()) {
2392 auto *ThisArg = Record.readExpr();
2393 // FIXME: Check consistency if we have an old and new operator delete.
2394 if (!C.dtorHasOperatorDelete(D, ASTContext::OperatorDeleteKind::Regular)) {
2395 C.addOperatorDeleteForVDtor(D, OperatorDelete,
2397 Canon->OperatorDeleteThisArg = ThisArg;
2398 }
2399 }
2400 if (auto *OperatorGlobDelete = readDeclAs<FunctionDecl>()) {
2401 if (!C.dtorHasOperatorDelete(D,
2403 C.addOperatorDeleteForVDtor(
2404 D, OperatorGlobDelete, ASTContext::OperatorDeleteKind::GlobalRegular);
2405 }
2406 if (auto *OperatorArrayDelete = readDeclAs<FunctionDecl>()) {
2407 if (!C.dtorHasOperatorDelete(D, ASTContext::OperatorDeleteKind::Array))
2408 C.addOperatorDeleteForVDtor(D, OperatorArrayDelete,
2410 }
2411 if (auto *OperatorGlobArrayDelete = readDeclAs<FunctionDecl>()) {
2412 if (!C.dtorHasOperatorDelete(D,
2414 C.addOperatorDeleteForVDtor(D, OperatorGlobArrayDelete,
2416 }
2417}
2418
2420 D->setExplicitSpecifier(Record.readExplicitSpec());
2422}
2423
2425 VisitDecl(D);
2426 D->ImportedModule = readModule();
2427 D->setImportComplete(Record.readInt());
2428 auto *StoredLocs = D->getTrailingObjects();
2429 for (unsigned I = 0, N = Record.back(); I != N; ++I)
2430 StoredLocs[I] = readSourceLocation();
2431 Record.skipInts(1); // The number of stored source locations.
2432}
2433
2435 VisitDecl(D);
2436 D->setColonLoc(readSourceLocation());
2437}
2438
2440 VisitDecl(D);
2441 if (Record.readInt()) // hasFriendDecl
2442 D->Friend = readDeclAs<NamedDecl>();
2443 else
2444 D->Friend = readTypeSourceInfo();
2445 D->NextFriend = readDeclID().getRawValue();
2446 D->FriendLoc = readSourceLocation();
2447 D->EllipsisLoc = readSourceLocation();
2448}
2449
2451 VisitDecl(D);
2452 for (unsigned I = 0; I != D->NumTPLists; ++I)
2453 D->getTrailingObjects()[I] = Record.readTemplateParameterList();
2454 auto Kind = static_cast<FriendTemplateDeclKind>(Record.readInt());
2455 switch (Kind) {
2456 case FTDK_Type:
2457 D->Friend = readTypeSourceInfo();
2458 break;
2459 case FTDK_Decl:
2460 D->Friend = readDeclAs<NamedDecl>();
2461 break;
2462 case FTDK_Template:
2463 D->Template = Record.readTemplateName();
2464 assert(D->Template.getAsTemplateDecl() &&
2465 "friend template name must resolve to a template declaration");
2466 D->Friend = D->Template.getAsTemplateDecl();
2467 break;
2468 case FTDK_Dependent:
2469 D->Friend = readTypeSourceInfo();
2470 D->Template = Record.readTemplateName();
2471 break;
2472 }
2473 D->NextFriend = readDeclID().getRawValue();
2474 D->FriendLoc = readSourceLocation();
2475 D->EllipsisLoc = readSourceLocation();
2476}
2477
2479 VisitNamedDecl(D);
2480
2481 assert(!D->TemplateParams && "TemplateParams already set!");
2482 D->TemplateParams = Record.readTemplateParameterList();
2483 D->init(readDeclAs<NamedDecl>());
2484}
2485
2488 D->ConstraintExpr = Record.readExpr();
2489 mergeMergeable(D);
2490}
2491
2494 // The size of the template list was read during creation of the Decl, so we
2495 // don't have to re-read it here.
2496 VisitDecl(D);
2498 for (unsigned I = 0; I < D->NumTemplateArgs; ++I)
2499 Args.push_back(Record.readTemplateArgument(/*Canonicalize=*/false));
2500 D->setTemplateArguments(Args);
2501}
2502
2505
2507 llvm::BitstreamCursor &DeclsCursor,
2508 bool IsPartial) {
2509 uint64_t Offset = ReadLocalOffset();
2510 bool Failed =
2511 Reader.ReadSpecializations(M, DeclsCursor, Offset, D, IsPartial);
2512 (void)Failed;
2513 assert(!Failed);
2514}
2515
2516RedeclarableResult
2518 RedeclarableResult Redecl = VisitRedeclarable(D);
2519
2520 // Make sure we've allocated the Common pointer first. We do this before
2521 // VisitTemplateDecl so that getCommonPtr() can be used during initialization.
2523 if (!CanonD->Common) {
2524 CanonD->Common = CanonD->newCommon(Reader.getContext());
2525 Reader.PendingDefinitions.insert(CanonD);
2526 }
2527 D->Common = CanonD->Common;
2528
2529 // If this is the first declaration of the template, fill in the information
2530 // for the 'common' pointer.
2531 if (ThisDeclID == Redecl.getFirstID()) {
2532 if (auto *RTD = readDeclAs<RedeclarableTemplateDecl>()) {
2533 assert(RTD->getKind() == D->getKind() &&
2534 "InstantiatedFromMemberTemplate kind mismatch");
2536 if (Record.readInt())
2538 }
2539 }
2540
2542 D->IdentifierNamespace = Record.readInt();
2543
2544 return Redecl;
2545}
2546
2548 RedeclarableResult Redecl = VisitRedeclarableTemplateDecl(D);
2549 mergeRedeclarableTemplate(D, Redecl);
2550
2551 if (ThisDeclID == Redecl.getFirstID()) {
2552 // This ClassTemplateDecl owns a CommonPtr; read it to keep track of all of
2553 // the specializations.
2554 ReadSpecializations(*Loc.F, D, Loc.F->DeclsCursor, /*IsPartial=*/false);
2555 ReadSpecializations(*Loc.F, D, Loc.F->DeclsCursor, /*IsPartial=*/true);
2556 }
2557}
2558
2560 llvm_unreachable("BuiltinTemplates are not serialized");
2561}
2562
2563/// TODO: Unify with ClassTemplateDecl version?
2564/// May require unifying ClassTemplateDecl and
2565/// VarTemplateDecl beyond TemplateDecl...
2567 RedeclarableResult Redecl = VisitRedeclarableTemplateDecl(D);
2568 mergeRedeclarableTemplate(D, Redecl);
2569
2570 if (ThisDeclID == Redecl.getFirstID()) {
2571 // This VarTemplateDecl owns a CommonPtr; read it to keep track of all of
2572 // the specializations.
2573 ReadSpecializations(*Loc.F, D, Loc.F->DeclsCursor, /*IsPartial=*/false);
2574 ReadSpecializations(*Loc.F, D, Loc.F->DeclsCursor, /*IsPartial=*/true);
2575 }
2576}
2577
2580 RedeclarableResult Redecl = VisitCXXRecordDeclImpl(D);
2581
2582 ASTContext &C = Reader.getContext();
2583 if (Decl *InstD = readDecl()) {
2584 if (auto *CTD = dyn_cast<ClassTemplateDecl>(InstD)) {
2585 D->SpecializedTemplate = CTD;
2586 } else {
2588 Record.readTemplateArgumentList(TemplArgs);
2589 TemplateArgumentList *ArgList
2590 = TemplateArgumentList::CreateCopy(C, TemplArgs);
2591 auto *PS =
2593 SpecializedPartialSpecialization();
2594 PS->PartialSpecialization
2596 PS->TemplateArgs = ArgList;
2597 D->SpecializedTemplate = PS;
2598 }
2599 }
2600
2602 Record.readTemplateArgumentList(TemplArgs, /*Canonicalize*/ true);
2603 D->TemplateArgs = TemplateArgumentList::CreateCopy(C, TemplArgs);
2604 D->PointOfInstantiation = readSourceLocation();
2605 D->SpecializationKind = (TemplateSpecializationKind)Record.readInt();
2606 D->StrictPackMatch = Record.readBool();
2607
2608 bool writtenAsCanonicalDecl = Record.readInt();
2609 if (writtenAsCanonicalDecl) {
2610 auto *CanonPattern = readDeclAs<ClassTemplateDecl>();
2611 if (D->isCanonicalDecl()) { // It's kept in the folding set.
2612 // Set this as, or find, the canonical declaration for this specialization
2614 if (auto *Partial = dyn_cast<ClassTemplatePartialSpecializationDecl>(D)) {
2615 CanonSpec =
2616 CanonPattern->getCommonPtr()->PartialSpecializations.getOrInsert(
2617 Partial);
2618 } else {
2619 CanonSpec =
2620 CanonPattern->getCommonPtr()->Specializations.getOrInsert(D);
2621 }
2622 // If there was already a canonical specialization, merge into it.
2623 if (CanonSpec != D) {
2624 MergeImpl.mergeRedeclarable<TagDecl>(D, CanonSpec, Redecl);
2625
2626 // This declaration might be a definition. Merge with any existing
2627 // definition.
2628 if (auto *DDD = D->DefinitionData) {
2629 if (CanonSpec->DefinitionData)
2630 MergeImpl.MergeDefinitionData(CanonSpec, std::move(*DDD));
2631 else
2632 CanonSpec->DefinitionData = D->DefinitionData;
2633 }
2634 D->DefinitionData = CanonSpec->DefinitionData;
2635 }
2636 }
2637 }
2638
2639 // extern/template keyword locations for explicit instantiations
2640 if (Record.readBool()) {
2641 auto *ExplicitInfo = new (C) ExplicitInstantiationInfo;
2642 ExplicitInfo->ExternKeywordLoc = readSourceLocation();
2643 ExplicitInfo->TemplateKeywordLoc = readSourceLocation();
2644 D->ExplicitInfo = ExplicitInfo;
2645 }
2646
2647 if (Record.readBool())
2648 D->setTemplateArgsAsWritten(Record.readASTTemplateArgumentListInfo());
2649
2650 return Redecl;
2651}
2652
2655 // We need to read the template params first because redeclarable is going to
2656 // need them for profiling
2657 TemplateParameterList *Params = Record.readTemplateParameterList();
2658 D->TemplateParams = Params;
2659
2660 RedeclarableResult Redecl = VisitClassTemplateSpecializationDeclImpl(D);
2661
2662 // These are read/set from/to the first declaration.
2663 if (ThisDeclID == Redecl.getFirstID()) {
2664 D->InstantiatedFromMember.setPointer(
2665 readDeclAs<ClassTemplatePartialSpecializationDecl>());
2666 D->InstantiatedFromMember.setInt(Record.readInt());
2667 }
2668}
2669
2671 RedeclarableResult Redecl = VisitRedeclarableTemplateDecl(D);
2672
2673 if (ThisDeclID == Redecl.getFirstID()) {
2674 // This FunctionTemplateDecl owns a CommonPtr; read it.
2675 ReadSpecializations(*Loc.F, D, Loc.F->DeclsCursor, /*IsPartial=*/false);
2676 }
2677}
2678
2679/// TODO: Unify with ClassTemplateSpecializationDecl version?
2680/// May require unifying ClassTemplate(Partial)SpecializationDecl and
2681/// VarTemplate(Partial)SpecializationDecl with a new data
2682/// structure Template(Partial)SpecializationDecl, and
2683/// using Template(Partial)SpecializationDecl as input type.
2686 ASTContext &C = Reader.getContext();
2687 if (Decl *InstD = readDecl()) {
2688 if (auto *VTD = dyn_cast<VarTemplateDecl>(InstD)) {
2689 D->SpecializedTemplate = VTD;
2690 } else {
2692 Record.readTemplateArgumentList(TemplArgs);
2694 C, TemplArgs);
2695 auto *PS =
2696 new (C)
2697 VarTemplateSpecializationDecl::SpecializedPartialSpecialization();
2698 PS->PartialSpecialization =
2700 PS->TemplateArgs = ArgList;
2701 D->SpecializedTemplate = PS;
2702 }
2703 }
2704
2705 // extern/template keyword locations for explicit instantiations
2706 if (Record.readBool()) {
2707 auto *ExplicitInfo = new (C) ExplicitInstantiationInfo;
2708 ExplicitInfo->ExternKeywordLoc = readSourceLocation();
2709 ExplicitInfo->TemplateKeywordLoc = readSourceLocation();
2710 D->ExplicitInfo = ExplicitInfo;
2711 }
2712
2713 if (Record.readBool())
2714 D->setTemplateArgsAsWritten(Record.readASTTemplateArgumentListInfo());
2715
2717 Record.readTemplateArgumentList(TemplArgs, /*Canonicalize*/ true);
2718 D->TemplateArgs = TemplateArgumentList::CreateCopy(C, TemplArgs);
2719 D->PointOfInstantiation = readSourceLocation();
2720 D->SpecializationKind = (TemplateSpecializationKind)Record.readInt();
2721 D->IsCompleteDefinition = Record.readInt();
2722
2723 RedeclarableResult Redecl = VisitVarDeclImpl(D);
2724
2725 bool writtenAsCanonicalDecl = Record.readInt();
2726 if (writtenAsCanonicalDecl) {
2727 auto *CanonPattern = readDeclAs<VarTemplateDecl>();
2728 if (D->isCanonicalDecl()) { // It's kept in the folding set.
2730 if (auto *Partial = dyn_cast<VarTemplatePartialSpecializationDecl>(D)) {
2731 CanonSpec =
2732 CanonPattern->getCommonPtr()->PartialSpecializations.getOrInsert(
2733 Partial);
2734 } else {
2735 CanonSpec =
2736 CanonPattern->getCommonPtr()->Specializations.getOrInsert(D);
2737 }
2738 // If we already have a matching specialization, merge it.
2739 if (CanonSpec != D)
2740 MergeImpl.mergeRedeclarable<VarDecl>(D, CanonSpec, Redecl);
2741 }
2742 }
2743
2744 return Redecl;
2745}
2746
2747/// TODO: Unify with ClassTemplatePartialSpecializationDecl version?
2748/// May require unifying ClassTemplate(Partial)SpecializationDecl and
2749/// VarTemplate(Partial)SpecializationDecl with a new data
2750/// structure Template(Partial)SpecializationDecl, and
2751/// using Template(Partial)SpecializationDecl as input type.
2754 TemplateParameterList *Params = Record.readTemplateParameterList();
2755 D->TemplateParams = Params;
2756
2757 RedeclarableResult Redecl = VisitVarTemplateSpecializationDeclImpl(D);
2758
2759 // These are read/set from/to the first declaration.
2760 if (ThisDeclID == Redecl.getFirstID()) {
2761 D->InstantiatedFromMember.setPointer(
2762 readDeclAs<VarTemplatePartialSpecializationDecl>());
2763 D->InstantiatedFromMember.setInt(Record.readInt());
2764 }
2765}
2766
2768 VisitTypeDecl(D);
2769
2770 D->setDeclaredWithTypename(Record.readInt());
2771
2772 bool TypeConstraintInitialized = D->hasTypeConstraint() && Record.readBool();
2773 if (TypeConstraintInitialized) {
2774 ConceptReference *CR = nullptr;
2775 if (Record.readBool())
2776 CR = Record.readConceptReference();
2777 Expr *ImmediatelyDeclaredConstraint = Record.readExpr();
2778 UnsignedOrNone ArgPackSubstIndex = Record.readUnsignedOrNone();
2779
2780 D->setTypeConstraint(CR, ImmediatelyDeclaredConstraint, ArgPackSubstIndex);
2781 D->NumExpanded = Record.readUnsignedOrNone();
2782 }
2783
2784 if (Record.readInt())
2785 D->setDefaultArgument(Reader.getContext(),
2786 Record.readTemplateArgumentLoc());
2787}
2788
2791 // TemplateParmPosition.
2792 D->setDepth(Record.readInt());
2793 D->setPosition(Record.readInt());
2795 D->setPlaceholderTypeConstraint(Record.readExpr());
2796 if (D->isExpandedParameterPack()) {
2797 auto TypesAndInfos =
2798 D->getTrailingObjects<std::pair<QualType, TypeSourceInfo *>>();
2799 for (unsigned I = 0, N = D->getNumExpansionTypes(); I != N; ++I) {
2800 new (&TypesAndInfos[I].first) QualType(Record.readType());
2801 TypesAndInfos[I].second = readTypeSourceInfo();
2802 }
2803 } else {
2804 // Rest of NonTypeTemplateParmDecl.
2805 D->ParameterPack = Record.readInt();
2806 if (Record.readInt())
2807 D->setDefaultArgument(Reader.getContext(),
2808 Record.readTemplateArgumentLoc());
2809 }
2810}
2811
2814 D->ParameterKind = static_cast<TemplateNameKind>(Record.readInt());
2815 D->setDeclaredWithTypename(Record.readBool());
2816 // TemplateParmPosition.
2817 D->setDepth(Record.readInt());
2818 D->setPosition(Record.readInt());
2819 if (D->isExpandedParameterPack()) {
2820 auto **Data = D->getTrailingObjects();
2821 for (unsigned I = 0, N = D->getNumExpansionTemplateParameters();
2822 I != N; ++I)
2823 Data[I] = Record.readTemplateParameterList();
2824 } else {
2825 // Rest of TemplateTemplateParmDecl.
2826 D->ParameterPack = Record.readInt();
2827 if (Record.readInt())
2828 D->setDefaultArgument(Reader.getContext(),
2829 Record.readTemplateArgumentLoc());
2830 }
2831}
2832
2837
2839 VisitDecl(D);
2840 D->AssertExprAndFailed.setPointer(Record.readExpr());
2841 D->AssertExprAndFailed.setInt(Record.readInt());
2842 D->Message = cast_or_null<StringLiteral>(Record.readExpr());
2843 D->RParenLoc = readSourceLocation();
2844}
2845
2848 // Note: trailing flags were already read by ReadDeclRecord and passed to
2849 // CreateDeserialized, so TypeAndFlags.getInt() is already set.
2850 VisitDecl(D);
2851 auto *Spec = readDeclAs<NamedDecl>();
2852 D->SpecAndTSK.setPointer(Spec);
2853 D->ExternLoc = readSourceLocation();
2854 D->NameLoc = readSourceLocation();
2855 TypeSourceInfo *TSI = readTypeSourceInfo();
2856 unsigned TSK = Record.readInt();
2857 D->SpecAndTSK.setInt(TSK);
2858 D->TypeAndFlags.setPointer(TSI); // preserves trailing flags in int bits
2859 // Read trailing objects.
2860 if (D->hasTrailingQualifier())
2861 *D->getTrailingObjects<NestedNameSpecifierLoc>() =
2862 Record.readNestedNameSpecifierLoc();
2863 if (D->hasTrailingArgsAsWritten())
2864 *D->getTrailingObjects<const ASTTemplateArgumentListInfo *>() =
2865 Record.readASTTemplateArgumentListInfo();
2866
2867 // Rebuild the ASTContext map from specialization to EID.
2868 if (Spec)
2869 Reader.getContext().addExplicitInstantiationDecl(Spec, D);
2870}
2871
2873 VisitDecl(D);
2874 D->Pattern = cast<CXXExpansionStmtPattern>(Record.readStmt());
2875 D->Instantiations =
2876 cast_or_null<CXXExpansionStmtInstantiation>(Record.readStmt());
2877 D->IndexNTTP = cast<NonTypeTemplateParmDecl>(Record.readDeclRef());
2878}
2879
2883
2886 VisitDecl(D);
2887 D->ExtendingDecl = readDeclAs<ValueDecl>();
2888 D->ExprWithTemporary = Record.readStmt();
2889 if (Record.readInt()) {
2890 D->Value = new (D->getASTContext()) APValue(Record.readAPValue());
2891 D->getASTContext().addDestruction(D->Value);
2892 }
2893 D->ManglingNumber = Record.readInt();
2894 mergeMergeable(D);
2895}
2896
2898 LookupBlockOffsets &Offsets) {
2899 Offsets.LexicalOffset = ReadLocalOffset();
2900 Offsets.VisibleOffset = ReadLocalOffset();
2901 Offsets.ModuleLocalOffset = ReadLocalOffset();
2902 Offsets.TULocalOffset = ReadLocalOffset();
2903}
2904
2905template <typename T>
2907 GlobalDeclID FirstDeclID = readDeclID();
2908 Decl *MergeWith = nullptr;
2909
2910 bool IsKeyDecl = ThisDeclID == FirstDeclID;
2911 bool IsFirstLocalDecl = false;
2912
2913 uint64_t RedeclOffset = 0;
2914
2915 // invalid FirstDeclID indicates that this declaration was the only
2916 // declaration of its entity, and is used for space optimization.
2917 if (FirstDeclID.isInvalid()) {
2918 FirstDeclID = ThisDeclID;
2919 IsKeyDecl = true;
2920 IsFirstLocalDecl = true;
2921 } else if (unsigned N = Record.readInt()) {
2922 // This declaration was the first local declaration, but may have imported
2923 // other declarations.
2924 IsKeyDecl = N == 1;
2925 IsFirstLocalDecl = true;
2926
2927 // We have some declarations that must be before us in our redeclaration
2928 // chain. Read them now, and remember that we ought to merge with one of
2929 // them.
2930 // FIXME: Provide a known merge target to the second and subsequent such
2931 // declaration.
2932 for (unsigned I = 0; I != N - 1; ++I)
2933 MergeWith = readDecl();
2934
2935 RedeclOffset = ReadLocalOffset();
2936 } else {
2937 // This declaration was not the first local declaration. Read the first
2938 // local declaration now, to trigger the import of other redeclarations.
2939 (void)readDecl();
2940 }
2941
2942 auto *FirstDecl = cast_or_null<T>(Reader.GetDecl(FirstDeclID));
2943 if (FirstDecl != D) {
2944 // We delay loading of the redeclaration chain to avoid deeply nested calls.
2945 // We temporarily set the first (canonical) declaration as the previous one
2946 // which is the one that matters and mark the real previous DeclID to be
2947 // loaded & attached later on.
2949 D->First = FirstDecl->getCanonicalDecl();
2950 }
2951
2952 auto *DAsT = static_cast<T *>(D);
2953
2954 // Note that we need to load local redeclarations of this decl and build a
2955 // decl chain for them. This must happen *after* we perform the preloading
2956 // above; this ensures that the redeclaration chain is built in the correct
2957 // order.
2958 if (IsFirstLocalDecl)
2959 Reader.PendingDeclChains.push_back(std::make_pair(DAsT, RedeclOffset));
2960
2961 return RedeclarableResult(MergeWith, FirstDeclID, IsKeyDecl);
2962}
2963
2964/// Attempts to merge the given declaration (D) with another declaration
2965/// of the same entity.
2966template <typename T>
2968 RedeclarableResult &Redecl) {
2969 // If modules are not available, there is no reason to perform this merge.
2970 if (!Reader.getContext().getLangOpts().Modules)
2971 return;
2972
2973 // If we're not the canonical declaration, we don't need to merge.
2974 if (!DBase->isFirstDecl())
2975 return;
2976
2977 auto *D = static_cast<T *>(DBase);
2978
2979 if (auto *Existing = Redecl.getKnownMergeTarget())
2980 // We already know of an existing declaration we should merge with.
2981 MergeImpl.mergeRedeclarable(D, cast<T>(Existing), Redecl);
2982 else if (FindExistingResult ExistingRes = findExisting(D))
2983 if (T *Existing = ExistingRes)
2984 MergeImpl.mergeRedeclarable(D, Existing, Redecl);
2985}
2986
2987/// Attempt to merge D with a previous declaration of the same lambda, which is
2988/// found by its index within its context declaration, if it has one.
2989///
2990/// We can't look up lambdas in their enclosing lexical or semantic context in
2991/// general, because for lambdas in variables, both of those might be a
2992/// namespace or the translation unit.
2993void ASTDeclMerger::mergeLambda(CXXRecordDecl *D, RedeclarableResult &Redecl,
2994 Decl &Context, unsigned IndexInContext) {
2995 // If modules are not available, there is no reason to perform this merge.
2996 if (!Reader.getContext().getLangOpts().Modules)
2997 return;
2998
2999 // If we're not the canonical declaration, we don't need to merge.
3000 if (!D->isFirstDecl())
3001 return;
3002
3003 if (auto *Existing = Redecl.getKnownMergeTarget())
3004 // We already know of an existing declaration we should merge with.
3005 mergeRedeclarable(D, cast<TagDecl>(Existing), Redecl);
3006
3007 // Look up this lambda to see if we've seen it before. If so, merge with the
3008 // one we already loaded.
3009 auto *&Slot = Reader.getContext().getLambdaDeclarationSlotForMerging(
3010 &Context, IndexInContext);
3011 if (TagDecl *PrevDecl = Slot)
3012 mergeRedeclarable(D, PrevDecl, Redecl);
3013 else
3014 Slot = D;
3015}
3016
3018 RedeclarableResult &Redecl) {
3019 mergeRedeclarable(D, Redecl);
3020 // If we merged the template with a prior declaration chain, merge the
3021 // common pointer.
3022 // FIXME: Actually merge here, don't just overwrite.
3023 D->Common = D->getCanonicalDecl()->Common;
3024}
3025
3026/// "Cast" to type T, asserting if we don't have an implicit conversion.
3027/// We use this to put code in a template that will only be valid for certain
3028/// instantiations.
3029template<typename T> static T assert_cast(T t) { return t; }
3030template<typename T> static T assert_cast(...) {
3031 llvm_unreachable("bad assert_cast");
3032}
3033
3034/// Merge together the pattern declarations from two template
3035/// declarations.
3037 RedeclarableTemplateDecl *Existing,
3038 bool IsKeyDecl) {
3039 auto *DPattern = D->getTemplatedDecl();
3040 auto *ExistingPattern = Existing->getTemplatedDecl();
3041 RedeclarableResult Result(
3042 /*MergeWith*/ ExistingPattern,
3043 DPattern->getCanonicalDecl()->getGlobalID(), IsKeyDecl);
3044
3045 if (auto *DClass = dyn_cast<CXXRecordDecl>(DPattern)) {
3046 // Merge with any existing definition.
3047 // FIXME: This is duplicated in several places. Refactor.
3048 auto *ExistingClass =
3049 cast<CXXRecordDecl>(ExistingPattern)->getCanonicalDecl();
3050 if (auto *DDD = DClass->DefinitionData) {
3051 if (ExistingClass->DefinitionData) {
3052 MergeDefinitionData(ExistingClass, std::move(*DDD));
3053 } else {
3054 ExistingClass->DefinitionData = DClass->DefinitionData;
3055 // We may have skipped this before because we thought that DClass
3056 // was the canonical declaration.
3057 Reader.PendingDefinitions.insert(DClass);
3058 }
3059 }
3060 DClass->DefinitionData = ExistingClass->DefinitionData;
3061
3062 return mergeRedeclarable(DClass, cast<TagDecl>(ExistingPattern),
3063 Result);
3064 }
3065 if (auto *DFunction = dyn_cast<FunctionDecl>(DPattern))
3066 return mergeRedeclarable(DFunction, cast<FunctionDecl>(ExistingPattern),
3067 Result);
3068 if (auto *DVar = dyn_cast<VarDecl>(DPattern))
3069 return mergeRedeclarable(DVar, cast<VarDecl>(ExistingPattern), Result);
3070 if (auto *DAlias = dyn_cast<TypeAliasDecl>(DPattern))
3071 return mergeRedeclarable(DAlias, cast<TypedefNameDecl>(ExistingPattern),
3072 Result);
3073 llvm_unreachable("merged an unknown kind of redeclarable template");
3074}
3075
3076/// Attempts to merge the given declaration (D) with another declaration
3077/// of the same entity.
3078template <typename T>
3080 GlobalDeclID KeyDeclID) {
3081 auto *D = static_cast<T *>(DBase);
3082 T *ExistingCanon = Existing->getCanonicalDecl();
3083 T *DCanon = D->getCanonicalDecl();
3084 if (ExistingCanon != DCanon) {
3085 // Have our redeclaration link point back at the canonical declaration
3086 // of the existing declaration, so that this declaration has the
3087 // appropriate canonical declaration.
3089 D->First = ExistingCanon;
3090 ExistingCanon->Used |= D->Used;
3091 D->Used = false;
3092
3093 bool IsKeyDecl = KeyDeclID.isValid();
3094
3095 // When we merge a template, merge its pattern.
3096 if (auto *DTemplate = dyn_cast<RedeclarableTemplateDecl>(D))
3098 DTemplate, assert_cast<RedeclarableTemplateDecl *>(ExistingCanon),
3099 IsKeyDecl);
3100
3101 // If this declaration is a key declaration, make a note of that.
3102 if (IsKeyDecl)
3103 Reader.KeyDecls[ExistingCanon].push_back(KeyDeclID);
3104 }
3105}
3106
3107/// ODR-like semantics for C/ObjC allow us to merge tag types and a structural
3108/// check in Sema guarantees the types can be merged (see C11 6.2.7/1 or C89
3109/// 6.1.2.6/1). Although most merging is done in Sema, we need to guarantee
3110/// that some types are mergeable during deserialization, otherwise name
3111/// lookup fails. This is the case for EnumConstantDecl.
3113 if (!ND)
3114 return false;
3115 // TODO: implement merge for other necessary decls.
3117 return true;
3118 return false;
3119}
3120
3121/// Attempts to merge LifetimeExtendedTemporaryDecl with
3122/// identical class definitions from two different modules.
3124 // If modules are not available, there is no reason to perform this merge.
3125 if (!Reader.getContext().getLangOpts().Modules)
3126 return;
3127
3128 LifetimeExtendedTemporaryDecl *LETDecl = D;
3129
3131 Reader.LETemporaryForMerging[std::make_pair(
3132 LETDecl->getExtendingDecl(), LETDecl->getManglingNumber())];
3133 if (LookupResult)
3134 Reader.getContext().setPrimaryMergedDecl(LETDecl,
3135 LookupResult->getCanonicalDecl());
3136 else
3137 LookupResult = LETDecl;
3138}
3139
3140/// Attempts to merge the given declaration (D) with another declaration
3141/// of the same entity, for the case where the entity is not actually
3142/// redeclarable. This happens, for instance, when merging the fields of
3143/// identical class definitions from two different modules.
3144template<typename T>
3146 // If modules are not available, there is no reason to perform this merge.
3147 if (!Reader.getContext().getLangOpts().Modules)
3148 return;
3149
3150 // ODR-based merging is performed in C++ and in some cases (tag types) in C.
3151 // Note that C identically-named things in different translation units are
3152 // not redeclarations, but may still have compatible types, where ODR-like
3153 // semantics may apply.
3154 if (!Reader.getContext().getLangOpts().CPlusPlus &&
3155 !allowODRLikeMergeInC(dyn_cast<NamedDecl>(static_cast<T*>(D))))
3156 return;
3157
3158 if (FindExistingResult ExistingRes = findExisting(static_cast<T*>(D)))
3159 if (T *Existing = ExistingRes)
3160 Reader.getContext().setPrimaryMergedDecl(static_cast<T *>(D),
3161 Existing->getCanonicalDecl());
3162}
3163
3165 Record.readOMPChildren(D->Data);
3166 VisitDecl(D);
3167}
3168
3170 Record.readOMPChildren(D->Data);
3171 VisitDecl(D);
3172}
3173
3175 Record.readOMPChildren(D->Data);
3176 VisitDecl(D);
3177}
3178
3180 VisitValueDecl(D);
3181 D->setLocation(readSourceLocation());
3182 Expr *In = Record.readExpr();
3183 Expr *Out = Record.readExpr();
3184 D->setCombinerData(In, Out);
3185 Expr *Combiner = Record.readExpr();
3186 D->setCombiner(Combiner);
3187 Expr *Orig = Record.readExpr();
3188 Expr *Priv = Record.readExpr();
3189 D->setInitializerData(Orig, Priv);
3190 Expr *Init = Record.readExpr();
3191 auto IK = static_cast<OMPDeclareReductionInitKind>(Record.readInt());
3192 D->setInitializer(Init, IK);
3193 D->PrevDeclInScope = readDeclID().getRawValue();
3194}
3195
3197 Record.readOMPChildren(D->Data);
3198 VisitValueDecl(D);
3199 D->VarName = Record.readDeclarationName();
3200 D->PrevDeclInScope = readDeclID().getRawValue();
3201}
3202
3206
3208 VisitDecl(D);
3209 D->DirKind = Record.readEnum<OpenACCDirectiveKind>();
3210 D->DirectiveLoc = Record.readSourceLocation();
3211 D->EndLoc = Record.readSourceLocation();
3212 Record.readOpenACCClauseList(D->Clauses);
3213}
3215 VisitDecl(D);
3216 D->DirKind = Record.readEnum<OpenACCDirectiveKind>();
3217 D->DirectiveLoc = Record.readSourceLocation();
3218 D->EndLoc = Record.readSourceLocation();
3219 D->ParensLoc = Record.readSourceRange();
3220 D->FuncRef = Record.readExpr();
3221 Record.readOpenACCClauseList(D->Clauses);
3222}
3223
3224//===----------------------------------------------------------------------===//
3225// Attribute Reading
3226//===----------------------------------------------------------------------===//
3227
3228namespace {
3229class AttrReader {
3230 ASTRecordReader &Reader;
3231
3232public:
3233 AttrReader(ASTRecordReader &Reader) : Reader(Reader) {}
3234
3235 uint64_t readInt() {
3236 return Reader.readInt();
3237 }
3238
3239 bool readBool() { return Reader.readBool(); }
3240
3241 SourceRange readSourceRange() {
3242 return Reader.readSourceRange();
3243 }
3244
3245 SourceLocation readSourceLocation() {
3246 return Reader.readSourceLocation();
3247 }
3248
3249 Expr *readExpr() { return Reader.readExpr(); }
3250
3251 Attr *readAttr() { return Reader.readAttr(); }
3252
3253 std::string readString() {
3254 return Reader.readString();
3255 }
3256
3257 TypeSourceInfo *readTypeSourceInfo() {
3258 return Reader.readTypeSourceInfo();
3259 }
3260
3261 IdentifierInfo *readIdentifier() {
3262 return Reader.readIdentifier();
3263 }
3264
3265 VersionTuple readVersionTuple() {
3266 return Reader.readVersionTuple();
3267 }
3268
3269 OMPTraitInfo *readOMPTraitInfo() { return Reader.readOMPTraitInfo(); }
3270
3271 template <typename T> T *readDeclAs() { return Reader.readDeclAs<T>(); }
3272};
3273}
3274
3276 AttrReader Record(*this);
3277 auto V = Record.readInt();
3278 if (!V)
3279 return nullptr;
3280
3281 Attr *New = nullptr;
3282 // Kind is stored as a 1-based integer because 0 is used to indicate a null
3283 // Attr pointer.
3284 auto Kind = static_cast<attr::Kind>(V - 1);
3285 ASTContext &Context = getContext();
3286
3287 IdentifierInfo *AttrName = Record.readIdentifier();
3288 IdentifierInfo *ScopeName = Record.readIdentifier();
3289 SourceRange AttrRange = Record.readSourceRange();
3290 SourceLocation ScopeLoc = Record.readSourceLocation();
3291 unsigned ParsedKind = Record.readInt();
3292 unsigned Syntax = Record.readInt();
3293 unsigned SpellingIndex = Record.readInt();
3294 bool IsAlignas = (ParsedKind == AttributeCommonInfo::AT_Aligned &&
3296 SpellingIndex == AlignedAttr::Keyword_alignas);
3297 bool IsRegularKeywordAttribute = Record.readBool();
3298
3299 AttributeCommonInfo Info(AttrName, AttributeScopeInfo(ScopeName, ScopeLoc),
3300 AttrRange, AttributeCommonInfo::Kind(ParsedKind),
3301 {AttributeCommonInfo::Syntax(Syntax), SpellingIndex,
3302 IsAlignas, IsRegularKeywordAttribute});
3303
3304#include "clang/Serialization/AttrPCHRead.inc"
3305
3306 assert(New && "Unable to decode attribute?");
3307 return New;
3308}
3309
3310/// Reads attributes from the current stream position.
3312 for (unsigned I = 0, E = readInt(); I != E; ++I)
3313 if (auto *A = readAttr())
3314 Attrs.push_back(A);
3315}
3316
3317//===----------------------------------------------------------------------===//
3318// ASTReader Implementation
3319//===----------------------------------------------------------------------===//
3320
3321/// Note that we have loaded the declaration with the given
3322/// Index.
3323///
3324/// This routine notes that this declaration has already been loaded,
3325/// so that future GetDecl calls will return this declaration rather
3326/// than trying to load a new declaration.
3327inline void ASTReader::LoadedDecl(unsigned Index, Decl *D) {
3328 assert(!DeclsLoaded[Index] && "Decl loaded twice?");
3329 DeclsLoaded[Index] = D;
3330}
3331
3332/// Determine whether the consumer will be interested in seeing
3333/// this declaration (via HandleTopLevelDecl).
3334///
3335/// This routine should return true for anything that might affect
3336/// code generation, e.g., inline function definitions, Objective-C
3337/// declarations with metadata, etc.
3338bool ASTReader::isConsumerInterestedIn(Decl *D) {
3339 // An ObjCMethodDecl is never considered as "interesting" because its
3340 // implementation container always is.
3341
3342 // An ImportDecl or VarDecl imported from a module map module will get
3343 // emitted when we import the relevant module.
3345 auto *M = D->getImportedOwningModule();
3346 if (M && M->Kind == Module::ModuleMapModule &&
3347 getContext().DeclMustBeEmitted(D))
3348 return false;
3349 }
3350
3351 if (isa<FileScopeAsmDecl, TopLevelStmtDecl, ObjCProtocolDecl, ObjCImplDecl,
3352 ImportDecl, PragmaCommentDecl, PragmaDetectMismatchDecl>(D))
3353 return true;
3354 if (isa<OMPThreadPrivateDecl, OMPDeclareReductionDecl, OMPDeclareMapperDecl,
3355 OMPAllocateDecl, OMPRequiresDecl>(D))
3356 return !D->getDeclContext()->isFunctionOrMethod();
3357 if (const auto *Var = dyn_cast<VarDecl>(D))
3358 return Var->isFileVarDecl() &&
3359 (Var->isThisDeclarationADefinition() == VarDecl::Definition ||
3360 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(Var));
3361 if (const auto *Func = dyn_cast<FunctionDecl>(D))
3362 return Func->doesThisDeclarationHaveABody() || PendingBodies.count(D);
3363
3364 if (auto *ES = D->getASTContext().getExternalSource())
3365 if (ES->hasExternalDefinitions(D) == ExternalASTSource::EK_Never)
3366 return true;
3367
3368 return false;
3369}
3370
3371/// Get the correct cursor and offset for loading a declaration.
3372ASTReader::RecordLocation ASTReader::DeclCursorForID(GlobalDeclID ID,
3373 SourceLocation &Loc) {
3375 assert(M);
3376 unsigned LocalDeclIndex = ID.getLocalDeclIndex();
3377 const DeclOffset &DOffs = M->DeclOffsets[LocalDeclIndex];
3378 Loc = ReadSourceLocation(*M, DOffs.getRawLoc());
3379 return RecordLocation(M, DOffs.getBitOffset(M->DeclsBlockStartOffset));
3380}
3381
3382ASTReader::RecordLocation ASTReader::getLocalBitOffset(uint64_t GlobalOffset) {
3383 auto I = GlobalBitOffsetsMap.find(GlobalOffset);
3384
3385 assert(I != GlobalBitOffsetsMap.end() && "Corrupted global bit offsets map");
3386 return RecordLocation(I->second, GlobalOffset - I->second->GlobalBitOffset);
3387}
3388
3389uint64_t ASTReader::getGlobalBitOffset(ModuleFile &M, uint64_t LocalOffset) {
3390 return LocalOffset + M.GlobalBitOffset;
3391}
3392
3394ASTDeclReader::getOrFakePrimaryClassDefinition(ASTReader &Reader,
3395 CXXRecordDecl *RD) {
3396 // Try to dig out the definition.
3397 auto *DD = RD->DefinitionData;
3398 if (!DD)
3399 DD = RD->getCanonicalDecl()->DefinitionData;
3400
3401 // If there's no definition yet, then DC's definition is added by an update
3402 // record, but we've not yet loaded that update record. In this case, we
3403 // commit to DC being the canonical definition now, and will fix this when
3404 // we load the update record.
3405 if (!DD) {
3406 DD = new (Reader.getContext()) struct CXXRecordDecl::DefinitionData(RD);
3407 RD->setCompleteDefinition(true);
3408 RD->DefinitionData = DD;
3409 RD->getCanonicalDecl()->DefinitionData = DD;
3410
3411 // Track that we did this horrible thing so that we can fix it later.
3412 Reader.PendingFakeDefinitionData.insert(
3413 std::make_pair(DD, ASTReader::PendingFakeDefinitionKind::Fake));
3414 }
3415
3416 return DD->Definition;
3417}
3418
3419/// Find the context in which we should search for previous declarations when
3420/// looking for declarations to merge.
3421DeclContext *ASTDeclReader::getPrimaryContextForMerging(ASTReader &Reader,
3422 DeclContext *DC) {
3423 if (auto *ND = dyn_cast<NamespaceDecl>(DC))
3424 return ND->getFirstDecl();
3425
3426 if (auto *RD = dyn_cast<CXXRecordDecl>(DC))
3427 return getOrFakePrimaryClassDefinition(Reader, RD);
3428
3429 if (auto *RD = dyn_cast<RecordDecl>(DC))
3430 return RD->getDefinition();
3431
3432 if (auto *ED = dyn_cast<EnumDecl>(DC))
3433 return ED->getDefinition();
3434
3435 if (auto *OID = dyn_cast<ObjCInterfaceDecl>(DC))
3436 return OID->getDefinition();
3437
3438 // We can see the TU here only if we have no Sema object. It is possible
3439 // we're in clang-repl so we still need to get the primary context.
3440 if (auto *TU = dyn_cast<TranslationUnitDecl>(DC))
3441 return TU->getPrimaryContext();
3442
3443 return nullptr;
3444}
3445
3446ASTDeclReader::FindExistingResult::~FindExistingResult() {
3447 // Record that we had a typedef name for linkage whether or not we merge
3448 // with that declaration.
3449 if (TypedefNameForLinkage) {
3450 DeclContext *DC = New->getDeclContext()->getRedeclContext();
3451 Reader.ImportedTypedefNamesForLinkage.insert(
3452 std::make_pair(std::make_pair(DC, TypedefNameForLinkage), New));
3453 return;
3454 }
3455
3456 if (!AddResult || Existing)
3457 return;
3458
3459 DeclarationName Name = New->getDeclName();
3460 DeclContext *DC = New->getDeclContext()->getRedeclContext();
3462 setAnonymousDeclForMerging(Reader, New->getLexicalDeclContext(),
3463 AnonymousDeclNumber, New);
3464 } else if (DC->isTranslationUnit() &&
3465 !Reader.getContext().getLangOpts().CPlusPlus) {
3466 if (Reader.getIdResolver().tryAddTopLevelDecl(New, Name))
3467 Reader.PendingFakeLookupResults[Name.getAsIdentifierInfo()]
3468 .push_back(New);
3469 } else if (DeclContext *MergeDC = getPrimaryContextForMerging(Reader, DC)) {
3470 // Add the declaration to its redeclaration context so later merging
3471 // lookups will find it.
3472 MergeDC->makeDeclVisibleInContextImpl(New, /*Internal*/true);
3473 }
3474}
3475
3476/// Find the declaration that should be merged into, given the declaration found
3477/// by name lookup. If we're not merging with a UsingShadowDecl but Found is a
3478/// UsingShadowDecl, we need to skip the UsingShadowDecl. If we're merging an
3479/// anonymous declaration within a typedef, we need a matching typedef, and we
3480/// merge with the type inside it.
3482 bool IsTypedefNameForLinkage,
3483 bool FilteringUsingShadowDecl) {
3484 // If the taregt declaration we want is not a UsingShadowDecl, we don't need
3485 // to return the UsingShadowDecl at all.
3486 if (auto *USD = dyn_cast<UsingShadowDecl>(Found);
3487 USD && FilteringUsingShadowDecl)
3488 return getDeclForMerging(USD->getTargetDecl(), IsTypedefNameForLinkage,
3489 FilteringUsingShadowDecl);
3490
3491 if (!IsTypedefNameForLinkage)
3492 return Found;
3493
3494 // If we found a typedef declaration that gives a name to some other
3495 // declaration, then we want that inner declaration. Declarations from
3496 // AST files are handled via ImportedTypedefNamesForLinkage.
3497 if (Found->isFromASTFile())
3498 return nullptr;
3499
3500 if (auto *TND = dyn_cast<TypedefNameDecl>(Found))
3501 return TND->getAnonDeclWithTypedefName(/*AnyRedecl*/true);
3502
3503 return nullptr;
3504}
3505
3506/// Find the declaration to use to populate the anonymous declaration table
3507/// for the given lexical DeclContext. We only care about finding local
3508/// definitions of the context; we'll merge imported ones as we go.
3509DeclContext *
3510ASTDeclReader::getPrimaryDCForAnonymousDecl(DeclContext *LexicalDC) {
3511 // For classes, we track the definition as we merge.
3512 if (auto *RD = dyn_cast<CXXRecordDecl>(LexicalDC)) {
3513 auto *DD = RD->getCanonicalDecl()->DefinitionData;
3514 return DD ? DD->Definition : nullptr;
3515 } else if (auto *OID = dyn_cast<ObjCInterfaceDecl>(LexicalDC)) {
3516 return OID->getCanonicalDecl()->getDefinition();
3517 }
3518
3519 // For anything else, walk its merged redeclarations looking for a definition.
3520 // Note that we can't just call getDefinition here because the redeclaration
3521 // chain isn't wired up.
3522 for (auto *D : merged_redecls(cast<Decl>(LexicalDC))) {
3523 if (auto *FD = dyn_cast<FunctionDecl>(D))
3524 if (FD->isThisDeclarationADefinition())
3525 return FD;
3526 if (auto *MD = dyn_cast<ObjCMethodDecl>(D))
3527 if (MD->isThisDeclarationADefinition())
3528 return MD;
3529 if (auto *RD = dyn_cast<RecordDecl>(D))
3531 return RD;
3532 }
3533
3534 // No merged definition yet.
3535 return nullptr;
3536}
3537
3538NamedDecl *ASTDeclReader::getAnonymousDeclForMerging(ASTReader &Reader,
3539 DeclContext *DC,
3540 unsigned Index) {
3541 // If the lexical context has been merged, look into the now-canonical
3542 // definition.
3543 auto *CanonDC = cast<Decl>(DC)->getCanonicalDecl();
3544
3545 // If we've seen this before, return the canonical declaration.
3546 auto &Previous = Reader.AnonymousDeclarationsForMerging[CanonDC];
3547 if (Index < Previous.size() && Previous[Index])
3548 return Previous[Index];
3549
3550 // If this is the first time, but we have parsed a declaration of the context,
3551 // build the anonymous declaration list from the parsed declaration.
3552 auto *PrimaryDC = getPrimaryDCForAnonymousDecl(DC);
3553 auto needToNumberAnonymousDeclsWithin = [](Decl *D) {
3554 if (!D->isFromASTFile())
3555 return true;
3556 // If this is a class template specialization from an AST file, has at least
3557 // one field, but none of the fields have been loaded from external storage,
3558 // this is a situation where the class template specialization decl
3559 // was imported but the definition was instantiated within the source.
3560 // In such a case, we still need to number the anonymous decls.
3561 auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D);
3562 return CTSD && !CTSD->noload_field_empty() &&
3563 !CTSD->hasLoadedFieldsFromExternalStorage();
3564 };
3565 if (PrimaryDC && needToNumberAnonymousDeclsWithin(cast<Decl>(PrimaryDC))) {
3566 numberAnonymousDeclsWithin(PrimaryDC, [&](NamedDecl *ND, unsigned Number) {
3567 if (Previous.size() == Number)
3568 Previous.push_back(cast<NamedDecl>(ND->getCanonicalDecl()));
3569 else
3571 });
3572 }
3573
3574 return Index < Previous.size() ? Previous[Index] : nullptr;
3575}
3576
3577void ASTDeclReader::setAnonymousDeclForMerging(ASTReader &Reader,
3578 DeclContext *DC, unsigned Index,
3579 NamedDecl *D) {
3580 auto *CanonDC = cast<Decl>(DC)->getCanonicalDecl();
3581
3582 auto &Previous = Reader.AnonymousDeclarationsForMerging[CanonDC];
3583 if (Index >= Previous.size())
3584 Previous.resize(Index + 1);
3585 if (!Previous[Index])
3586 Previous[Index] = D;
3587}
3588
3589ASTDeclReader::FindExistingResult ASTDeclReader::findExisting(NamedDecl *D) {
3590 DeclarationName Name = TypedefNameForLinkage ? TypedefNameForLinkage
3591 : D->getDeclName();
3592
3593 if (!Name && !needsAnonymousDeclarationNumber(D)) {
3594 // Don't bother trying to find unnamed declarations that are in
3595 // unmergeable contexts.
3596 FindExistingResult Result(Reader, D, /*Existing=*/nullptr,
3597 AnonymousDeclNumber, TypedefNameForLinkage);
3598 Result.suppress();
3599 return Result;
3600 }
3601
3602 ASTContext &C = Reader.getContext();
3603 DeclContext *DC = D->getDeclContext()->getRedeclContext();
3604 if (TypedefNameForLinkage) {
3605 auto It = Reader.ImportedTypedefNamesForLinkage.find(
3606 std::make_pair(DC, TypedefNameForLinkage));
3607 if (It != Reader.ImportedTypedefNamesForLinkage.end())
3608 if (C.isSameEntity(It->second, D))
3609 return FindExistingResult(Reader, D, It->second, AnonymousDeclNumber,
3610 TypedefNameForLinkage);
3611 // Go on to check in other places in case an existing typedef name
3612 // was not imported.
3613 }
3614
3616 // This is an anonymous declaration that we may need to merge. Look it up
3617 // in its context by number.
3618 if (auto *Existing = getAnonymousDeclForMerging(
3619 Reader, D->getLexicalDeclContext(), AnonymousDeclNumber))
3620 if (C.isSameEntity(Existing, D))
3621 return FindExistingResult(Reader, D, Existing, AnonymousDeclNumber,
3622 TypedefNameForLinkage);
3623 } else if (DC->isTranslationUnit() &&
3624 !Reader.getContext().getLangOpts().CPlusPlus) {
3625 IdentifierResolver &IdResolver = Reader.getIdResolver();
3626
3627 // Temporarily consider the identifier to be up-to-date. We don't want to
3628 // cause additional lookups here.
3629 class UpToDateIdentifierRAII {
3630 IdentifierInfo *II;
3631 bool WasOutToDate = false;
3632
3633 public:
3634 explicit UpToDateIdentifierRAII(IdentifierInfo *II) : II(II) {
3635 if (II) {
3636 WasOutToDate = II->isOutOfDate();
3637 if (WasOutToDate)
3638 II->setOutOfDate(false);
3639 }
3640 }
3641
3642 ~UpToDateIdentifierRAII() {
3643 if (WasOutToDate)
3644 II->setOutOfDate(true);
3645 }
3646 } UpToDate(Name.getAsIdentifierInfo());
3647
3648 for (IdentifierResolver::iterator I = IdResolver.begin(Name),
3649 IEnd = IdResolver.end();
3650 I != IEnd; ++I) {
3651 if (NamedDecl *Existing =
3652 getDeclForMerging(*I, TypedefNameForLinkage,
3653 /*FilteringUsingShadowDecl=*/false))
3654 if (C.isSameEntity(Existing, D))
3655 return FindExistingResult(Reader, D, Existing, AnonymousDeclNumber,
3656 TypedefNameForLinkage);
3657 }
3658 } else if (DeclContext *MergeDC = getPrimaryContextForMerging(Reader, DC)) {
3659 DeclContext::lookup_result R = MergeDC->noload_lookup(Name);
3660 for (DeclContext::lookup_iterator I = R.begin(), E = R.end(); I != E; ++I) {
3661 if (NamedDecl *Existing = getDeclForMerging(*I, TypedefNameForLinkage,
3663 if (C.isSameEntity(Existing, D)) {
3664 return FindExistingResult(Reader, D, Existing, AnonymousDeclNumber,
3665 TypedefNameForLinkage);
3666 }
3667 }
3668 } else {
3669 // Not in a mergeable context.
3670 return FindExistingResult(Reader);
3671 }
3672
3673 // If this declaration is from a merged context, make a note that we need to
3674 // check that the canonical definition of that context contains the decl.
3675 //
3676 // Note that we don't perform ODR checks for decls from the global module
3677 // fragment.
3678 //
3679 // FIXME: We should do something similar if we merge two definitions of the
3680 // same template specialization into the same CXXRecordDecl.
3681 auto MergedDCIt = Reader.MergedDeclContexts.find(D->getLexicalDeclContext());
3682 if (MergedDCIt != Reader.MergedDeclContexts.end() &&
3683 !shouldSkipCheckingODR(D) && MergedDCIt->second == D->getDeclContext() &&
3685 Reader.PendingOdrMergeChecks.push_back(D);
3686
3687 return FindExistingResult(Reader, D, /*Existing=*/nullptr,
3688 AnonymousDeclNumber, TypedefNameForLinkage);
3689}
3690
3691template<typename DeclT>
3695
3697 llvm_unreachable("getMostRecentDecl on non-redeclarable declaration");
3698}
3699
3701 assert(D);
3702
3703 switch (D->getKind()) {
3704#define ABSTRACT_DECL(TYPE)
3705#define DECL(TYPE, BASE) \
3706 case Decl::TYPE: \
3707 return getMostRecentDeclImpl(cast<TYPE##Decl>(D));
3708#include "clang/AST/DeclNodes.inc"
3709 }
3710 llvm_unreachable("unknown decl kind");
3711}
3712
3713Decl *ASTReader::getMostRecentExistingDecl(Decl *D) {
3715}
3716
3717namespace {
3718void mergeInheritableAttributes(ASTReader &Reader, Decl *D, Decl *Previous) {
3719 InheritableAttr *NewAttr = nullptr;
3720 ASTContext &Context = Reader.getContext();
3721 const auto *IA = Previous->getAttr<MSInheritanceAttr>();
3722
3723 if (IA && !D->hasAttr<MSInheritanceAttr>()) {
3724 NewAttr = cast<InheritableAttr>(IA->clone(Context));
3725 NewAttr->setInherited(true);
3726 D->addAttr(NewAttr);
3727 }
3728
3729 if (!D->hasAttr<AvailabilityAttr>()) {
3730 for (const auto *AA : Previous->specific_attrs<AvailabilityAttr>()) {
3731 NewAttr = AA->clone(Context);
3732 NewAttr->setInherited(true);
3733 D->addAttr(NewAttr);
3734 }
3735 }
3736}
3737} // namespace
3738
3739template<typename DeclT>
3746
3747namespace clang {
3748
3749template<>
3752 Decl *Previous, Decl *Canon) {
3753 auto *PrevVD = cast<VarDecl>(Previous);
3754 D->RedeclLink.setPrevious(PrevVD);
3755 D->First = PrevVD->First;
3756
3757 // We should keep at most one definition on the chain.
3758 // FIXME: Cache the definition once we've found it. Building a chain with
3759 // N definitions currently takes O(N^2) time here.
3760 auto *VD = static_cast<VarDecl *>(D);
3761 if (VD->isThisDeclarationADefinition() == VarDecl::Definition) {
3762 for (VarDecl *CurD = PrevVD; CurD; CurD = CurD->getPreviousDecl()) {
3763 if (CurD->isThisDeclarationADefinition() == VarDecl::Definition) {
3764 // FIXME: For header modules, there are some problems if we don't
3765 // demote definition to declaration.
3766 // See clang/test/Modules/module-init-forcelly-loaded-module.cpp
3767 // for example. Maybe we are able to handle the CodeGen part
3768 // to avoid it emitting duplicated definitions. But just workaround
3769 // now temporarily.
3770 if (VD->getOwningModule() &&
3771 VD->getOwningModule()->isHeaderLikeModule())
3772 VD->demoteThisDefinitionToDeclaration();
3773 Reader.mergeDefinitionVisibility(CurD, VD);
3774 break;
3775 }
3776 }
3777 }
3778}
3779
3781 auto *DT = T->getContainedDeducedType();
3782 return DT && !DT->isDeduced();
3783}
3784
3785template<>
3788 Decl *Previous, Decl *Canon) {
3789 auto *FD = static_cast<FunctionDecl *>(D);
3790 auto *PrevFD = cast<FunctionDecl>(Previous);
3791
3792 FD->RedeclLink.setPrevious(PrevFD);
3793 FD->First = PrevFD->First;
3794
3795 // If the previous declaration is an inline function declaration, then this
3796 // declaration is too.
3797 if (PrevFD->isInlined() != FD->isInlined()) {
3798 // FIXME: [dcl.fct.spec]p4:
3799 // If a function with external linkage is declared inline in one
3800 // translation unit, it shall be declared inline in all translation
3801 // units in which it appears.
3802 //
3803 // Be careful of this case:
3804 //
3805 // module A:
3806 // template<typename T> struct X { void f(); };
3807 // template<typename T> inline void X<T>::f() {}
3808 //
3809 // module B instantiates the declaration of X<int>::f
3810 // module C instantiates the definition of X<int>::f
3811 //
3812 // If module B and C are merged, we do not have a violation of this rule.
3813 FD->setImplicitlyInline(true);
3814 }
3815
3816 auto *FPT = FD->getType()->getAs<FunctionProtoType>();
3817 auto *PrevFPT = PrevFD->getType()->getAs<FunctionProtoType>();
3818 if (FPT && PrevFPT) {
3819 // If we need to propagate an exception specification along the redecl
3820 // chain, make a note of that so that we can do so later.
3821 bool IsUnresolved = isUnresolvedExceptionSpec(FPT->getExceptionSpecType());
3822 bool WasUnresolved =
3824 if (IsUnresolved != WasUnresolved)
3825 Reader.PendingExceptionSpecUpdates.insert(
3826 {Canon, IsUnresolved ? PrevFD : FD});
3827
3828 // If we need to propagate a deduced return type along the redecl chain,
3829 // make a note of that so that we can do it later.
3830 bool IsUndeduced = isUndeducedReturnType(FPT->getReturnType());
3831 bool WasUndeduced = isUndeducedReturnType(PrevFPT->getReturnType());
3832 if (IsUndeduced != WasUndeduced)
3833 Reader.PendingDeducedTypeUpdates.insert(
3834 {cast<FunctionDecl>(Canon),
3835 (IsUndeduced ? PrevFPT : FPT)->getReturnType()});
3836 }
3837}
3838
3839} // namespace clang
3840
3842 llvm_unreachable("attachPreviousDecl on non-redeclarable declaration");
3843}
3844
3845/// Inherit the default template argument from \p From to \p To. Returns
3846/// \c false if there is no default template for \p From.
3847template <typename ParmDecl>
3848static bool inheritDefaultTemplateArgument(ASTContext &Context, ParmDecl *From,
3849 Decl *ToD) {
3850 auto *To = cast<ParmDecl>(ToD);
3851 if (!From->hasDefaultArgument())
3852 return false;
3853 To->setInheritedDefaultArgument(Context, From);
3854 return true;
3855}
3856
3858 TemplateDecl *From,
3859 TemplateDecl *To) {
3860 auto *FromTP = From->getTemplateParameters();
3861 auto *ToTP = To->getTemplateParameters();
3862 assert(FromTP->size() == ToTP->size() && "merged mismatched templates?");
3863
3864 for (unsigned I = 0, N = FromTP->size(); I != N; ++I) {
3865 NamedDecl *FromParam = FromTP->getParam(I);
3866 NamedDecl *ToParam = ToTP->getParam(I);
3867
3868 if (auto *FTTP = dyn_cast<TemplateTypeParmDecl>(FromParam))
3869 inheritDefaultTemplateArgument(Context, FTTP, ToParam);
3870 else if (auto *FNTTP = dyn_cast<NonTypeTemplateParmDecl>(FromParam))
3871 inheritDefaultTemplateArgument(Context, FNTTP, ToParam);
3872 else
3874 Context, cast<TemplateTemplateParmDecl>(FromParam), ToParam);
3875 }
3876}
3877
3878// [basic.link]/p10:
3879// If two declarations of an entity are attached to different modules,
3880// the program is ill-formed;
3882 Decl *D,
3883 Decl *Previous) {
3884 // If it is previous implcitly introduced, it is not meaningful to
3885 // diagnose it.
3886 if (Previous->isImplicit())
3887 return;
3888
3889 // FIXME: Get rid of the enumeration of decl types once we have an appropriate
3890 // abstract for decls of an entity. e.g., the namespace decl and using decl
3891 // doesn't introduce an entity.
3893 return;
3894
3895 // Skip implicit instantiations since it may give false positive diagnostic
3896 // messages.
3897 // FIXME: Maybe this shows the implicit instantiations may have incorrect
3898 // module owner ships. But given we've finished the compilation of a module,
3899 // how can we add new entities to that module?
3901 return;
3903 return;
3904 if (auto *Func = dyn_cast<FunctionDecl>(Previous);
3905 Func && Func->getTemplateSpecializationInfo())
3906 return;
3907
3908 // The module ownership of in-class friend declaration is not straightforward.
3909 // Avoid diagnosing such cases.
3910 if (D->getFriendObjectKind() || Previous->getFriendObjectKind())
3911 return;
3912
3913 // Skip diagnosing in-class declarations.
3914 if (!Previous->getLexicalDeclContext()
3915 ->getNonTransparentContext()
3916 ->isFileContext() ||
3918 return;
3919
3920 Module *M = Previous->getOwningModule();
3921 if (!M)
3922 return;
3923
3924 // We only forbids merging decls within named modules.
3925 if (!M->isNamedModule()) {
3926 // Try to warn the case that we merged decls from global module.
3927 if (!M->isGlobalModule())
3928 return;
3929
3930 if (D->getOwningModule() &&
3932 return;
3933
3934 Reader.PendingWarningForDuplicatedDefsInModuleUnits.push_back(
3935 {D, Previous});
3936 return;
3937 }
3938
3939 // It is fine if they are in the same module.
3940 if (Reader.getContext().isInSameModule(M, D->getOwningModule()))
3941 return;
3942
3943 Reader.Diag(Previous->getLocation(),
3944 diag::err_multiple_decl_in_different_modules)
3945 << cast<NamedDecl>(Previous) << M->Name;
3946 Reader.Diag(D->getLocation(), diag::note_also_found);
3947}
3948
3950 Decl *Previous, Decl *Canon) {
3951 assert(D && Previous);
3952
3953 switch (D->getKind()) {
3954#define ABSTRACT_DECL(TYPE)
3955#define DECL(TYPE, BASE) \
3956 case Decl::TYPE: \
3957 attachPreviousDeclImpl(Reader, cast<TYPE##Decl>(D), Previous, Canon); \
3958 break;
3959#include "clang/AST/DeclNodes.inc"
3960 }
3961
3963
3964 // If the declaration was visible in one module, a redeclaration of it in
3965 // another module remains visible even if it wouldn't be visible by itself.
3966 //
3967 // FIXME: In this case, the declaration should only be visible if a module
3968 // that makes it visible has been imported.
3970 Previous->IdentifierNamespace &
3972
3973 // If the declaration declares a template, it may inherit default arguments
3974 // from the previous declaration.
3975 if (auto *TD = dyn_cast<TemplateDecl>(D))
3976 inheritDefaultTemplateArguments(Reader.getContext(),
3978
3979 // If any of the declaration in the chain contains an Inheritable attribute,
3980 // it needs to be added to all the declarations in the redeclarable chain.
3981 // FIXME: Only the logic of merging MSInheritableAttr is present, it should
3982 // be extended for all inheritable attributes.
3983 mergeInheritableAttributes(Reader, D, Previous);
3984}
3985
3986template<typename DeclT>
3990
3992 llvm_unreachable("attachLatestDecl on non-redeclarable declaration");
3993}
3994
3996 assert(D && Latest);
3997
3998 switch (D->getKind()) {
3999#define ABSTRACT_DECL(TYPE)
4000#define DECL(TYPE, BASE) \
4001 case Decl::TYPE: \
4002 attachLatestDeclImpl(cast<TYPE##Decl>(D), Latest); \
4003 break;
4004#include "clang/AST/DeclNodes.inc"
4005 }
4006}
4007
4008template<typename DeclT>
4012
4014 llvm_unreachable("markIncompleteDeclChain on non-redeclarable declaration");
4015}
4016
4017void ASTReader::markIncompleteDeclChain(Decl *D) {
4018 switch (D->getKind()) {
4019#define ABSTRACT_DECL(TYPE)
4020#define DECL(TYPE, BASE) \
4021 case Decl::TYPE: \
4022 ASTDeclReader::markIncompleteDeclChainImpl(cast<TYPE##Decl>(D)); \
4023 break;
4024#include "clang/AST/DeclNodes.inc"
4025 }
4026}
4027
4028/// Read the declaration at the given offset from the AST file.
4029Decl *ASTReader::ReadDeclRecord(GlobalDeclID ID) {
4030 SourceLocation DeclLoc;
4031 RecordLocation Loc = DeclCursorForID(ID, DeclLoc);
4032 llvm::BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
4033 // Keep track of where we are in the stream, then jump back there
4034 // after reading this declaration.
4035 SavedStreamPosition SavedPosition(DeclsCursor);
4036
4037 ReadingKindTracker ReadingKind(Read_Decl, *this);
4038
4039 // Note that we are loading a declaration record.
4040 Deserializing ADecl(this);
4041
4042 auto Fail = [](const char *what, llvm::Error &&Err) {
4043 llvm::report_fatal_error(Twine("ASTReader::readDeclRecord failed ") + what +
4044 ": " + toString(std::move(Err)));
4045 };
4046
4047 if (llvm::Error JumpFailed = DeclsCursor.JumpToBit(Loc.Offset))
4048 Fail("jumping", std::move(JumpFailed));
4049 ASTRecordReader Record(*this, *Loc.F);
4050 ASTDeclReader Reader(*this, Record, Loc, ID, DeclLoc);
4051 Expected<unsigned> MaybeCode = DeclsCursor.ReadCode();
4052 if (!MaybeCode)
4053 Fail("reading code", MaybeCode.takeError());
4054 unsigned Code = MaybeCode.get();
4055
4056 ASTContext &Context = getContext();
4057 Decl *D = nullptr;
4058 Expected<unsigned> MaybeDeclCode = Record.readRecord(DeclsCursor, Code);
4059 if (!MaybeDeclCode)
4060 llvm::report_fatal_error(
4061 Twine("ASTReader::readDeclRecord failed reading decl code: ") +
4062 toString(MaybeDeclCode.takeError()));
4063
4064 switch ((DeclCode)MaybeDeclCode.get()) {
4071 llvm_unreachable("Record cannot be de-serialized with readDeclRecord");
4072 case DECL_TYPEDEF:
4073 D = TypedefDecl::CreateDeserialized(Context, ID);
4074 break;
4075 case DECL_TYPEALIAS:
4076 D = TypeAliasDecl::CreateDeserialized(Context, ID);
4077 break;
4078 case DECL_ENUM:
4079 D = EnumDecl::CreateDeserialized(Context, ID);
4080 break;
4081 case DECL_RECORD:
4082 D = RecordDecl::CreateDeserialized(Context, ID);
4083 break;
4084 case DECL_ENUM_CONSTANT:
4085 D = EnumConstantDecl::CreateDeserialized(Context, ID);
4086 break;
4087 case DECL_FUNCTION:
4088 D = FunctionDecl::CreateDeserialized(Context, ID);
4089 break;
4090 case DECL_LINKAGE_SPEC:
4091 D = LinkageSpecDecl::CreateDeserialized(Context, ID);
4092 break;
4093 case DECL_EXPORT:
4094 D = ExportDecl::CreateDeserialized(Context, ID);
4095 break;
4096 case DECL_LABEL:
4097 D = LabelDecl::CreateDeserialized(Context, ID);
4098 break;
4099 case DECL_NAMESPACE:
4100 D = NamespaceDecl::CreateDeserialized(Context, ID);
4101 break;
4104 break;
4105 case DECL_USING:
4106 D = UsingDecl::CreateDeserialized(Context, ID);
4107 break;
4108 case DECL_USING_PACK:
4109 D = UsingPackDecl::CreateDeserialized(Context, ID, Record.readInt());
4110 break;
4111 case DECL_USING_SHADOW:
4112 D = UsingShadowDecl::CreateDeserialized(Context, ID);
4113 break;
4114 case DECL_USING_ENUM:
4115 D = UsingEnumDecl::CreateDeserialized(Context, ID);
4116 break;
4119 break;
4122 break;
4125 break;
4128 break;
4131 break;
4132 case DECL_CXX_RECORD:
4133 D = CXXRecordDecl::CreateDeserialized(Context, ID);
4134 break;
4137 break;
4138 case DECL_CXX_METHOD:
4139 D = CXXMethodDecl::CreateDeserialized(Context, ID);
4140 break;
4142 D = CXXConstructorDecl::CreateDeserialized(Context, ID, Record.readInt());
4143 break;
4146 break;
4149 break;
4150 case DECL_ACCESS_SPEC:
4151 D = AccessSpecDecl::CreateDeserialized(Context, ID);
4152 break;
4153 case DECL_FRIEND:
4154 D = FriendDecl::CreateDeserialized(Context, ID);
4155 break;
4158 /*NumTPLists=*/Record.readInt());
4159 break;
4162 break;
4165 break;
4168 break;
4169 case DECL_VAR_TEMPLATE:
4170 D = VarTemplateDecl::CreateDeserialized(Context, ID);
4171 break;
4174 break;
4177 break;
4180 break;
4182 bool HasTypeConstraint = Record.readInt();
4184 HasTypeConstraint);
4185 break;
4186 }
4188 bool HasTypeConstraint = Record.readInt();
4190 HasTypeConstraint);
4191 break;
4192 }
4194 bool HasTypeConstraint = Record.readInt();
4196 Context, ID, Record.readInt(), HasTypeConstraint);
4197 break;
4198 }
4201 break;
4204 Record.readInt());
4205 break;
4208 break;
4209 case DECL_CONCEPT:
4210 D = ConceptDecl::CreateDeserialized(Context, ID);
4211 break;
4214 break;
4215 case DECL_STATIC_ASSERT:
4216 D = StaticAssertDecl::CreateDeserialized(Context, ID);
4217 break;
4220 Record.readInt());
4221 break;
4224 break;
4225 case DECL_OBJC_METHOD:
4226 D = ObjCMethodDecl::CreateDeserialized(Context, ID);
4227 break;
4230 break;
4231 case DECL_OBJC_IVAR:
4232 D = ObjCIvarDecl::CreateDeserialized(Context, ID);
4233 break;
4234 case DECL_OBJC_PROTOCOL:
4235 D = ObjCProtocolDecl::CreateDeserialized(Context, ID);
4236 break;
4239 break;
4240 case DECL_OBJC_CATEGORY:
4241 D = ObjCCategoryDecl::CreateDeserialized(Context, ID);
4242 break;
4245 break;
4248 break;
4251 break;
4252 case DECL_OBJC_PROPERTY:
4253 D = ObjCPropertyDecl::CreateDeserialized(Context, ID);
4254 break;
4257 break;
4258 case DECL_FIELD:
4259 D = FieldDecl::CreateDeserialized(Context, ID);
4260 break;
4261 case DECL_INDIRECTFIELD:
4263 break;
4264 case DECL_VAR:
4265 D = VarDecl::CreateDeserialized(Context, ID);
4266 break;
4269 break;
4270 case DECL_PARM_VAR:
4271 D = ParmVarDecl::CreateDeserialized(Context, ID);
4272 break;
4273 case DECL_DECOMPOSITION:
4274 D = DecompositionDecl::CreateDeserialized(Context, ID, Record.readInt());
4275 break;
4276 case DECL_BINDING:
4277 D = BindingDecl::CreateDeserialized(Context, ID);
4278 break;
4280 D = FileScopeAsmDecl::CreateDeserialized(Context, ID);
4281 break;
4283 D = TopLevelStmtDecl::CreateDeserialized(Context, ID);
4284 break;
4285 case DECL_BLOCK:
4286 D = BlockDecl::CreateDeserialized(Context, ID);
4287 break;
4288 case DECL_MS_PROPERTY:
4289 D = MSPropertyDecl::CreateDeserialized(Context, ID);
4290 break;
4291 case DECL_MS_GUID:
4292 D = MSGuidDecl::CreateDeserialized(Context, ID);
4293 break;
4295 D = UnnamedGlobalConstantDecl::CreateDeserialized(Context, ID);
4296 break;
4298 D = TemplateParamObjectDecl::CreateDeserialized(Context, ID);
4299 break;
4301 D = OutlinedFunctionDecl::CreateDeserialized(Context, ID, Record.readInt());
4302 break;
4303 case DECL_CAPTURED:
4304 D = CapturedDecl::CreateDeserialized(Context, ID, Record.readInt());
4305 break;
4307 Error("attempt to read a C++ base-specifier record as a declaration");
4308 return nullptr;
4310 Error("attempt to read a C++ ctor initializer record as a declaration");
4311 return nullptr;
4312 case DECL_IMPORT:
4313 // Note: last entry of the ImportDecl record is the number of stored source
4314 // locations.
4315 D = ImportDecl::CreateDeserialized(Context, ID, Record.back());
4316 break;
4318 Record.skipInts(1);
4319 unsigned NumChildren = Record.readInt();
4320 Record.skipInts(1);
4321 D = OMPThreadPrivateDecl::CreateDeserialized(Context, ID, NumChildren);
4322 break;
4323 }
4324 case DECL_OMP_ALLOCATE: {
4325 unsigned NumClauses = Record.readInt();
4326 unsigned NumVars = Record.readInt();
4327 Record.skipInts(1);
4328 D = OMPAllocateDecl::CreateDeserialized(Context, ID, NumVars, NumClauses);
4329 break;
4330 }
4331 case DECL_OMP_REQUIRES: {
4332 unsigned NumClauses = Record.readInt();
4333 Record.skipInts(2);
4334 D = OMPRequiresDecl::CreateDeserialized(Context, ID, NumClauses);
4335 break;
4336 }
4339 break;
4341 unsigned NumClauses = Record.readInt();
4342 Record.skipInts(2);
4343 D = OMPDeclareMapperDecl::CreateDeserialized(Context, ID, NumClauses);
4344 break;
4345 }
4348 break;
4350 D = PragmaCommentDecl::CreateDeserialized(Context, ID, Record.readInt());
4351 break;
4354 Record.readInt());
4355 break;
4356 case DECL_EMPTY:
4357 D = EmptyDecl::CreateDeserialized(Context, ID);
4358 break;
4361 break;
4364 break;
4365 case DECL_HLSL_BUFFER:
4366 D = HLSLBufferDecl::CreateDeserialized(Context, ID);
4367 break;
4370 Record.readInt());
4371 break;
4373 D = OpenACCDeclareDecl::CreateDeserialized(Context, ID, Record.readInt());
4374 break;
4376 D = OpenACCRoutineDecl::CreateDeserialized(Context, ID, Record.readInt());
4377 break;
4378 }
4379
4380 assert(D && "Unknown declaration reading AST file");
4381 LoadedDecl(translateGlobalDeclIDToIndex(ID), D);
4382 // Set the DeclContext before doing any deserialization, to make sure internal
4383 // calls to Decl::getASTContext() by Decl's methods will find the
4384 // TranslationUnitDecl without crashing.
4386
4387 // Reading some declarations can result in deep recursion.
4388 runWithSufficientStackSpace(DeclLoc, [&] { Reader.Visit(D); });
4389
4390 // If this declaration is also a declaration context, get the
4391 // offsets for its tables of lexical and visible declarations.
4392 if (auto *DC = dyn_cast<DeclContext>(D)) {
4393 LookupBlockOffsets Offsets;
4394
4395 Reader.VisitDeclContext(DC, Offsets);
4396
4397 // Get the lexical and visible block for the delayed namespace.
4398 // It is sufficient to judge if ID is in DelayedNamespaceOffsetMap.
4399 // But it may be more efficient to filter the other cases.
4400 if (!Offsets && isa<NamespaceDecl>(D))
4401 if (auto Iter = DelayedNamespaceOffsetMap.find(ID);
4402 Iter != DelayedNamespaceOffsetMap.end())
4403 Offsets = Iter->second;
4404
4405 if (Offsets.VisibleOffset &&
4406 ReadVisibleDeclContextStorage(
4407 *Loc.F, DeclsCursor, Offsets.VisibleOffset, ID,
4408 VisibleDeclContextStorageKind::GenerallyVisible))
4409 return nullptr;
4410 if (Offsets.ModuleLocalOffset &&
4411 ReadVisibleDeclContextStorage(
4412 *Loc.F, DeclsCursor, Offsets.ModuleLocalOffset, ID,
4413 VisibleDeclContextStorageKind::ModuleLocalVisible))
4414 return nullptr;
4415 if (Offsets.TULocalOffset &&
4416 ReadVisibleDeclContextStorage(
4417 *Loc.F, DeclsCursor, Offsets.TULocalOffset, ID,
4418 VisibleDeclContextStorageKind::TULocalVisible))
4419 return nullptr;
4420
4421 if (Offsets.LexicalOffset &&
4422 ReadLexicalDeclContextStorage(*Loc.F, DeclsCursor,
4423 Offsets.LexicalOffset, DC))
4424 return nullptr;
4425 }
4426 assert(Record.getIdx() == Record.size());
4427
4428 // Load any relevant update records.
4429 PendingUpdateRecords.push_back(
4430 PendingUpdateRecord(ID, D, /*JustLoaded=*/true));
4431
4432 // Load the categories after recursive loading is finished.
4433 if (auto *Class = dyn_cast<ObjCInterfaceDecl>(D))
4434 // If we already have a definition when deserializing the ObjCInterfaceDecl,
4435 // we put the Decl in PendingDefinitions so we can pull the categories here.
4436 if (Class->isThisDeclarationADefinition() ||
4437 PendingDefinitions.count(Class))
4438 loadObjCCategories(ID, Class);
4439
4440 // If we have deserialized a declaration that has a definition the
4441 // AST consumer might need to know about, queue it.
4442 // We don't pass it to the consumer immediately because we may be in recursive
4443 // loading, and some declarations may still be initializing.
4444 PotentiallyInterestingDecls.push_back(D);
4445
4446 return D;
4447}
4448
4449void ASTReader::PassInterestingDeclsToConsumer() {
4450 assert(Consumer);
4451
4452 if (!CanPassDeclsToConsumer)
4453 return;
4454
4455 // Guard variable to avoid recursively redoing the process of passing
4456 // decls to consumer.
4457 SaveAndRestore GuardPassingDeclsToConsumer(CanPassDeclsToConsumer,
4458 /*NewValue=*/false);
4459
4460 // Ensure that we've loaded all potentially-interesting declarations
4461 // that need to be eagerly loaded.
4462 for (auto ID : EagerlyDeserializedDecls)
4463 GetDecl(ID);
4464 EagerlyDeserializedDecls.clear();
4465
4466 auto ConsumingPotentialInterestingDecls = [this]() {
4467 while (!PotentiallyInterestingDecls.empty()) {
4468 Decl *D = PotentiallyInterestingDecls.front();
4469 PotentiallyInterestingDecls.pop_front();
4470 if (isConsumerInterestedIn(D))
4471 PassInterestingDeclToConsumer(D);
4472 }
4473 };
4474 std::deque<Decl *> MaybeInterestingDecls =
4475 std::move(PotentiallyInterestingDecls);
4476 PotentiallyInterestingDecls.clear();
4477 assert(PotentiallyInterestingDecls.empty());
4478 while (!MaybeInterestingDecls.empty()) {
4479 Decl *D = MaybeInterestingDecls.front();
4480 MaybeInterestingDecls.pop_front();
4481 // Since we load the variable's initializers lazily, it'd be problematic
4482 // if the initializers dependent on each other. So here we try to load the
4483 // initializers of static variables to make sure they are passed to code
4484 // generator by order. If we read anything interesting, we would consume
4485 // that before emitting the current declaration.
4486 if (auto *VD = dyn_cast<VarDecl>(D);
4487 VD && VD->isFileVarDecl() && !VD->isExternallyVisible())
4488 VD->getInit();
4489 ConsumingPotentialInterestingDecls();
4490 if (isConsumerInterestedIn(D))
4491 PassInterestingDeclToConsumer(D);
4492 }
4493
4494 // If we add any new potential interesting decl in the last call, consume it.
4495 ConsumingPotentialInterestingDecls();
4496
4497 for (GlobalDeclID ID : VTablesToEmit) {
4498 auto *RD = cast<CXXRecordDecl>(GetDecl(ID));
4499 assert(!RD->shouldEmitInExternalSource());
4500 PassVTableToConsumer(RD);
4501 }
4502 VTablesToEmit.clear();
4503}
4504
4505void ASTReader::loadDeclUpdateRecords(PendingUpdateRecord &Record) {
4506 // The declaration may have been modified by files later in the chain.
4507 // If this is the case, read the record containing the updates from each file
4508 // and pass it to ASTDeclReader to make the modifications.
4509 GlobalDeclID ID = Record.ID;
4510 Decl *D = Record.D;
4511 ProcessingUpdatesRAIIObj ProcessingUpdates(*this);
4512 DeclUpdateOffsetsMap::iterator UpdI = DeclUpdateOffsets.find(ID);
4513
4514 if (UpdI != DeclUpdateOffsets.end()) {
4515 auto UpdateOffsets = std::move(UpdI->second);
4516 DeclUpdateOffsets.erase(UpdI);
4517
4518 // Check if this decl was interesting to the consumer. If we just loaded
4519 // the declaration, then we know it was interesting and we skip the call
4520 // to isConsumerInterestedIn because it is unsafe to call in the
4521 // current ASTReader state.
4522 bool WasInteresting = Record.JustLoaded || isConsumerInterestedIn(D);
4523 for (auto &FileAndOffset : UpdateOffsets) {
4524 ModuleFile *F = FileAndOffset.first;
4525 uint64_t Offset = FileAndOffset.second;
4526 llvm::BitstreamCursor &Cursor = F->DeclsCursor;
4527 SavedStreamPosition SavedPosition(Cursor);
4528 if (llvm::Error JumpFailed = Cursor.JumpToBit(Offset))
4529 // FIXME don't do a fatal error.
4530 llvm::report_fatal_error(
4531 Twine("ASTReader::loadDeclUpdateRecords failed jumping: ") +
4532 toString(std::move(JumpFailed)));
4533 Expected<unsigned> MaybeCode = Cursor.ReadCode();
4534 if (!MaybeCode)
4535 llvm::report_fatal_error(
4536 Twine("ASTReader::loadDeclUpdateRecords failed reading code: ") +
4537 toString(MaybeCode.takeError()));
4538 unsigned Code = MaybeCode.get();
4539 ASTRecordReader Record(*this, *F);
4540 if (Expected<unsigned> MaybeRecCode = Record.readRecord(Cursor, Code))
4541 assert(MaybeRecCode.get() == DECL_UPDATES &&
4542 "Expected DECL_UPDATES record!");
4543 else
4544 llvm::report_fatal_error(
4545 Twine("ASTReader::loadDeclUpdateRecords failed reading rec code: ") +
4546 toString(MaybeCode.takeError()));
4547
4548 ASTDeclReader Reader(*this, Record, RecordLocation(F, Offset), ID,
4549 SourceLocation());
4550 Reader.UpdateDecl(D);
4551
4552 // We might have made this declaration interesting. If so, remember that
4553 // we need to hand it off to the consumer.
4554 if (!WasInteresting && isConsumerInterestedIn(D)) {
4555 PotentiallyInterestingDecls.push_back(D);
4556 WasInteresting = true;
4557 }
4558 }
4559 }
4560
4561 // Load the pending visible updates for this decl context, if it has any.
4562 if (auto I = PendingVisibleUpdates.find(ID);
4563 I != PendingVisibleUpdates.end()) {
4564 auto VisibleUpdates = std::move(I->second);
4565 PendingVisibleUpdates.erase(I);
4566
4567 auto *DC = cast<DeclContext>(D)->getPrimaryContext();
4568 for (const auto &Update : VisibleUpdates)
4569 Lookups[DC].Table.add(
4570 Update.Mod, Update.Data,
4571 reader::ASTDeclContextNameLookupTrait(*this, *Update.Mod));
4573 }
4574
4575 if (auto I = PendingModuleLocalVisibleUpdates.find(ID);
4576 I != PendingModuleLocalVisibleUpdates.end()) {
4577 auto ModuleLocalVisibleUpdates = std::move(I->second);
4578 PendingModuleLocalVisibleUpdates.erase(I);
4579
4580 auto *DC = cast<DeclContext>(D)->getPrimaryContext();
4581 for (const auto &Update : ModuleLocalVisibleUpdates)
4582 ModuleLocalLookups[DC].Table.add(
4583 Update.Mod, Update.Data,
4584 reader::ModuleLocalNameLookupTrait(*this, *Update.Mod));
4585 // NOTE: Can we optimize the case that the data being loaded
4586 // is not related to current module?
4588 }
4589
4590 if (auto I = TULocalUpdates.find(ID); I != TULocalUpdates.end()) {
4591 auto Updates = std::move(I->second);
4592 TULocalUpdates.erase(I);
4593
4594 auto *DC = cast<DeclContext>(D)->getPrimaryContext();
4595 for (const auto &Update : Updates)
4596 TULocalLookups[DC].Table.add(
4597 Update.Mod, Update.Data,
4598 reader::ASTDeclContextNameLookupTrait(*this, *Update.Mod));
4600 }
4601
4602 // Load any pending related decls.
4603 if (D->isCanonicalDecl()) {
4604 if (auto IT = RelatedDeclsMap.find(ID); IT != RelatedDeclsMap.end()) {
4605 for (auto LID : IT->second)
4606 GetDecl(LID);
4607 RelatedDeclsMap.erase(IT);
4608 }
4609 }
4610
4611 // Load the pending specializations update for this decl, if it has any.
4612 if (auto I = PendingSpecializationsUpdates.find(ID);
4613 I != PendingSpecializationsUpdates.end()) {
4614 auto SpecializationUpdates = std::move(I->second);
4615 PendingSpecializationsUpdates.erase(I);
4616
4617 for (const auto &Update : SpecializationUpdates)
4618 AddSpecializations(D, Update.Data, *Update.Mod, /*IsPartial=*/false);
4619 }
4620
4621 // Load the pending specializations update for this decl, if it has any.
4622 if (auto I = PendingPartialSpecializationsUpdates.find(ID);
4623 I != PendingPartialSpecializationsUpdates.end()) {
4624 auto SpecializationUpdates = std::move(I->second);
4625 PendingPartialSpecializationsUpdates.erase(I);
4626
4627 for (const auto &Update : SpecializationUpdates)
4628 AddSpecializations(D, Update.Data, *Update.Mod, /*IsPartial=*/true);
4629 }
4630}
4631
4632void ASTReader::loadPendingDeclChain(Decl *FirstLocal, uint64_t LocalOffset) {
4633 Decl *CanonDecl = FirstLocal->getCanonicalDecl();
4634
4635 Decl *MostRecent = ASTDeclReader::getMostRecentDecl(CanonDecl);
4636 if (!MostRecent)
4637 MostRecent = CanonDecl;
4638 if (FirstLocal != CanonDecl) {
4639 // Attach FirstLocal to the end of the decl chain.
4640 ASTDeclReader::attachPreviousDecl(*this, FirstLocal, MostRecent, CanonDecl);
4641 MostRecent = FirstLocal;
4642 }
4643
4644 if (!LocalOffset) {
4645 ASTDeclReader::attachLatestDecl(CanonDecl, MostRecent);
4646 return;
4647 }
4648
4649 // Load the list of other redeclarations from this module file.
4650 ModuleFile *M = getOwningModuleFile(FirstLocal);
4651 assert(M && "imported decl from no module file");
4652
4653 llvm::BitstreamCursor &Cursor = M->DeclsCursor;
4654 SavedStreamPosition SavedPosition(Cursor);
4655 if (llvm::Error JumpFailed = Cursor.JumpToBit(LocalOffset))
4656 llvm::report_fatal_error(
4657 Twine("ASTReader::loadPendingDeclChain failed jumping: ") +
4658 toString(std::move(JumpFailed)));
4659
4661 Expected<unsigned> MaybeCode = Cursor.ReadCode();
4662 if (!MaybeCode)
4663 llvm::report_fatal_error(
4664 Twine("ASTReader::loadPendingDeclChain failed reading code: ") +
4665 toString(MaybeCode.takeError()));
4666 unsigned Code = MaybeCode.get();
4667 if (Expected<unsigned> MaybeRecCode = Cursor.readRecord(Code, Record))
4668 assert(MaybeRecCode.get() == LOCAL_REDECLARATIONS &&
4669 "expected LOCAL_REDECLARATIONS record!");
4670 else
4671 llvm::report_fatal_error(
4672 Twine("ASTReader::loadPendingDeclChain failed reading rec code: ") +
4673 toString(MaybeCode.takeError()));
4674
4675 // FIXME: We have several different dispatches on decl kind here; maybe
4676 // we should instead generate one loop per kind and dispatch up-front?
4677 for (unsigned I = 0, N = Record.size(); I != N; ++I) {
4678 unsigned Idx = N - I - 1;
4679 auto *D = ReadDecl(*M, Record, Idx);
4680 ASTDeclReader::attachPreviousDecl(*this, D, MostRecent, CanonDecl);
4681 MostRecent = D;
4682 }
4683 ASTDeclReader::attachLatestDecl(CanonDecl, MostRecent);
4684}
4685
4686namespace {
4687
4688 /// Given an ObjC interface, goes through the modules and links to the
4689 /// interface all the categories for it.
4690 class ObjCCategoriesVisitor {
4691 ASTReader &Reader;
4692 ObjCInterfaceDecl *Interface;
4693 llvm::SmallPtrSetImpl<ObjCCategoryDecl *> &Deserialized;
4694 ObjCCategoryDecl *Tail = nullptr;
4695 llvm::DenseMap<DeclarationName, ObjCCategoryDecl *> NameCategoryMap;
4696 GlobalDeclID InterfaceID;
4697 unsigned PreviousGeneration;
4698
4699 void add(ObjCCategoryDecl *Cat) {
4700 // Only process each category once.
4701 if (!Deserialized.erase(Cat))
4702 return;
4703
4704 // Check for duplicate categories.
4705 if (Cat->getDeclName()) {
4706 ObjCCategoryDecl *&Existing = NameCategoryMap[Cat->getDeclName()];
4707 if (Existing && Reader.getOwningModuleFile(Existing) !=
4708 Reader.getOwningModuleFile(Cat)) {
4710 StructuralEquivalenceContext Ctx(
4711 Reader.getContext().getLangOpts(), Cat->getASTContext(),
4712 Existing->getASTContext(), NonEquivalentDecls,
4713 StructuralEquivalenceKind::Default,
4714 /*StrictTypeSpelling=*/false,
4715 /*Complain=*/false,
4716 /*ErrorOnTagTypeMismatch=*/true);
4717 if (!Ctx.IsEquivalent(Cat, Existing)) {
4718 // Warn only if the categories with the same name are different.
4719 Reader.Diag(Cat->getLocation(), diag::warn_dup_category_def)
4720 << Interface->getDeclName() << Cat->getDeclName();
4721 Reader.Diag(Existing->getLocation(),
4722 diag::note_previous_definition);
4723 }
4724 } else if (!Existing) {
4725 // Record this category.
4726 Existing = Cat;
4727 }
4728 }
4729
4730 // Add this category to the end of the chain.
4731 if (Tail)
4733 else
4734 Interface->setCategoryListRaw(Cat);
4735 Tail = Cat;
4736 }
4737
4738 public:
4739 ObjCCategoriesVisitor(
4740 ASTReader &Reader, ObjCInterfaceDecl *Interface,
4741 llvm::SmallPtrSetImpl<ObjCCategoryDecl *> &Deserialized,
4742 GlobalDeclID InterfaceID, unsigned PreviousGeneration)
4743 : Reader(Reader), Interface(Interface), Deserialized(Deserialized),
4744 InterfaceID(InterfaceID), PreviousGeneration(PreviousGeneration) {
4745 // Populate the name -> category map with the set of known categories.
4746 for (auto *Cat : Interface->known_categories()) {
4747 if (Cat->getDeclName())
4748 NameCategoryMap[Cat->getDeclName()] = Cat;
4749
4750 // Keep track of the tail of the category list.
4751 Tail = Cat;
4752 }
4753 }
4754
4755 bool operator()(ModuleFile &M) {
4756 // If we've loaded all of the category information we care about from
4757 // this module file, we're done.
4758 if (M.Generation <= PreviousGeneration)
4759 return true;
4760
4761 // Map global ID of the definition down to the local ID used in this
4762 // module file. If there is no such mapping, we'll find nothing here
4763 // (or in any module it imports).
4764 LocalDeclID LocalID =
4765 Reader.mapGlobalIDToModuleFileGlobalID(M, InterfaceID);
4766 if (LocalID.isInvalid())
4767 return true;
4768
4769 // Perform a binary search to find the local redeclarations for this
4770 // declaration (if any).
4771 const ObjCCategoriesInfo Compare = {LocalID, 0};
4772 const ObjCCategoriesInfo *Result = std::lower_bound(
4776 LocalID != Result->getDefinitionID()) {
4777 // We didn't find anything. If the class definition is in this module
4778 // file, then the module files it depends on cannot have any categories,
4779 // so suppress further lookup.
4780 return Reader.isDeclIDFromModule(InterfaceID, M);
4781 }
4782
4783 // We found something. Dig out all of the categories.
4784 unsigned Offset = Result->Offset;
4785 unsigned N = M.ObjCCategories[Offset];
4786 M.ObjCCategories[Offset++] = 0; // Don't try to deserialize again
4787 for (unsigned I = 0; I != N; ++I)
4788 add(Reader.ReadDeclAs<ObjCCategoryDecl>(M, M.ObjCCategories, Offset));
4789 return true;
4790 }
4791 };
4792
4793} // namespace
4794
4795void ASTReader::loadObjCCategories(GlobalDeclID ID, ObjCInterfaceDecl *D,
4796 unsigned PreviousGeneration) {
4797 ObjCCategoriesVisitor Visitor(*this, D, CategoriesDeserialized, ID,
4798 PreviousGeneration);
4799 ModuleMgr.visit(Visitor);
4800}
4801
4802template<typename DeclT, typename Fn>
4803static void forAllLaterRedecls(DeclT *D, Fn F) {
4804 F(D);
4805
4806 // Check whether we've already merged D into its redeclaration chain.
4807 // MostRecent may or may not be nullptr if D has not been merged. If
4808 // not, walk the merged redecl chain and see if it's there.
4809 auto *MostRecent = D->getMostRecentDecl();
4810 bool Found = false;
4811 for (auto *Redecl = MostRecent; Redecl && !Found;
4812 Redecl = Redecl->getPreviousDecl())
4813 Found = (Redecl == D);
4814
4815 // If this declaration is merged, apply the functor to all later decls.
4816 if (Found) {
4817 for (auto *Redecl = MostRecent; Redecl != D;
4818 Redecl = Redecl->getPreviousDecl())
4819 F(Redecl);
4820 }
4821}
4822
4824 while (Record.getIdx() < Record.size()) {
4825 switch ((DeclUpdateKind)Record.readInt()) {
4827 auto *RD = cast<CXXRecordDecl>(D);
4828 Decl *MD = Record.readDecl();
4829 assert(MD && "couldn't read decl from update record");
4830 Reader.PendingAddedClassMembers.push_back({RD, MD});
4831 break;
4832 }
4833
4835 auto *Anon = readDeclAs<NamespaceDecl>();
4836
4837 // Each module has its own anonymous namespace, which is disjoint from
4838 // any other module's anonymous namespaces, so don't attach the anonymous
4839 // namespace at all.
4840 if (!Record.isModule()) {
4841 if (auto *TU = dyn_cast<TranslationUnitDecl>(D))
4842 TU->setAnonymousNamespace(Anon);
4843 else
4844 cast<NamespaceDecl>(D)->setAnonymousNamespace(Anon);
4845 }
4846 break;
4847 }
4848
4850 auto *VD = cast<VarDecl>(D);
4851 VD->NonParmVarDeclBits.IsInline = Record.readInt();
4852 VD->NonParmVarDeclBits.IsInlineSpecified = Record.readInt();
4853 ReadVarDeclInit(VD);
4854 break;
4855 }
4856
4858 SourceLocation POI = Record.readSourceLocation();
4859 if (auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D)) {
4860 VTSD->setPointOfInstantiation(POI);
4861 } else if (auto *VD = dyn_cast<VarDecl>(D)) {
4862 MemberSpecializationInfo *MSInfo = VD->getMemberSpecializationInfo();
4863 assert(MSInfo && "No member specialization information");
4864 MSInfo->setPointOfInstantiation(POI);
4865 } else {
4866 auto *FD = cast<FunctionDecl>(D);
4867 if (auto *FTSInfo = dyn_cast<FunctionTemplateSpecializationInfo *>(
4868 FD->TemplateOrSpecialization))
4869 FTSInfo->setPointOfInstantiation(POI);
4870 else
4871 cast<MemberSpecializationInfo *>(FD->TemplateOrSpecialization)
4872 ->setPointOfInstantiation(POI);
4873 }
4874 break;
4875 }
4876
4878 auto *Param = cast<ParmVarDecl>(D);
4879
4880 // We have to read the default argument regardless of whether we use it
4881 // so that hypothetical further update records aren't messed up.
4882 // TODO: Add a function to skip over the next expr record.
4883 auto *DefaultArg = Record.readExpr();
4884
4885 // Only apply the update if the parameter still has an uninstantiated
4886 // default argument.
4887 if (Param->hasUninstantiatedDefaultArg())
4888 Param->setDefaultArg(DefaultArg);
4889 break;
4890 }
4891
4893 auto *FD = cast<FieldDecl>(D);
4894 auto *DefaultInit = Record.readExpr();
4895
4896 // Only apply the update if the field still has an uninstantiated
4897 // default member initializer.
4898 if (FD->hasInClassInitializer() && !FD->hasNonNullInClassInitializer()) {
4899 if (DefaultInit)
4900 FD->setInClassInitializer(DefaultInit);
4901 else
4902 // Instantiation failed. We can get here if we serialized an AST for
4903 // an invalid program.
4904 FD->removeInClassInitializer();
4905 }
4906 break;
4907 }
4908
4910 auto *FD = cast<FunctionDecl>(D);
4911 if (Reader.PendingBodies[FD]) {
4912 // FIXME: Maybe check for ODR violations.
4913 // It's safe to stop now because this update record is always last.
4914 return;
4915 }
4916
4917 if (Record.readInt()) {
4918 // Maintain AST consistency: any later redeclarations of this function
4919 // are inline if this one is. (We might have merged another declaration
4920 // into this one.)
4921 forAllLaterRedecls(FD, [](FunctionDecl *FD) {
4922 FD->setImplicitlyInline();
4923 });
4924 }
4925 FD->setInnerLocStart(readSourceLocation());
4927 assert(Record.getIdx() == Record.size() && "lazy body must be last");
4928 break;
4929 }
4930
4932 auto *RD = cast<CXXRecordDecl>(D);
4933 auto *OldDD = RD->getCanonicalDecl()->DefinitionData;
4934 bool HadRealDefinition =
4935 OldDD && (OldDD->Definition != RD ||
4936 !Reader.PendingFakeDefinitionData.count(OldDD));
4937 RD->setParamDestroyedInCallee(Record.readInt());
4939 static_cast<RecordArgPassingKind>(Record.readInt()));
4940 ReadCXXRecordDefinition(RD, /*Update*/true);
4941
4942 // Visible update is handled separately.
4943 uint64_t LexicalOffset = ReadLocalOffset();
4944 if (!HadRealDefinition && LexicalOffset) {
4945 Record.readLexicalDeclContextStorage(LexicalOffset, RD);
4946 Reader.PendingFakeDefinitionData.erase(OldDD);
4947 }
4948
4949 auto TSK = (TemplateSpecializationKind)Record.readInt();
4950 SourceLocation POI = readSourceLocation();
4951 if (MemberSpecializationInfo *MSInfo =
4953 MSInfo->setTemplateSpecializationKind(TSK);
4954 MSInfo->setPointOfInstantiation(POI);
4955 } else {
4957 Spec->setTemplateSpecializationKind(TSK);
4958 Spec->setPointOfInstantiation(POI);
4959
4960 if (Record.readInt()) {
4961 auto *PartialSpec =
4962 readDeclAs<ClassTemplatePartialSpecializationDecl>();
4964 Record.readTemplateArgumentList(TemplArgs);
4965 auto *TemplArgList = TemplateArgumentList::CreateCopy(
4966 Reader.getContext(), TemplArgs);
4967
4968 // FIXME: If we already have a partial specialization set,
4969 // check that it matches.
4971 Spec->getSpecializedTemplateOrPartial()))
4972 Spec->setInstantiationOf(PartialSpec, TemplArgList);
4973 }
4974 }
4975
4976 RD->setTagKind(static_cast<TagTypeKind>(Record.readInt()));
4977 RD->setLocation(readSourceLocation());
4978 RD->setLocStart(readSourceLocation());
4979 RD->setBraceRange(readSourceRange());
4980
4981 if (Record.readInt()) {
4982 AttrVec Attrs;
4983 Record.readAttributes(Attrs);
4984 // If the declaration already has attributes, we assume that some other
4985 // AST file already loaded them.
4986 if (!D->hasAttrs())
4987 D->setAttrsImpl(Attrs, Reader.getContext());
4988 }
4989 break;
4990 }
4991
4993 // Set the 'operator delete' directly to avoid emitting another update
4994 // record.
4996 ASTContext &C = Reader.getContext();
4997 auto *Del = readDeclAs<FunctionDecl>();
4998 auto *ThisArg = Record.readExpr();
4999 auto *Dtor = cast<CXXDestructorDecl>(D);
5000 // FIXME: Check consistency if we have an old and new operator delete.
5001 if (!C.dtorHasOperatorDelete(Dtor,
5003 C.addOperatorDeleteForVDtor(Dtor, Del,
5005 Canon->OperatorDeleteThisArg = ThisArg;
5006 }
5007 break;
5008 }
5009
5011 auto *Del = readDeclAs<FunctionDecl>();
5012 auto *Dtor = cast<CXXDestructorDecl>(D);
5013 ASTContext &C = Reader.getContext();
5014 if (!C.dtorHasOperatorDelete(
5016 C.addOperatorDeleteForVDtor(
5018 break;
5019 }
5021 auto *Del = readDeclAs<FunctionDecl>();
5022 auto *Dtor = cast<CXXDestructorDecl>(D);
5023 ASTContext &C = Reader.getContext();
5024 if (!C.dtorHasOperatorDelete(Dtor, ASTContext::OperatorDeleteKind::Array))
5025 C.addOperatorDeleteForVDtor(Dtor, Del,
5027 break;
5028 }
5030 auto *Del = readDeclAs<FunctionDecl>();
5031 auto *Dtor = cast<CXXDestructorDecl>(D);
5032 ASTContext &C = Reader.getContext();
5033 if (!C.dtorHasOperatorDelete(Dtor,
5035 C.addOperatorDeleteForVDtor(
5037 break;
5038 }
5039
5041 SmallVector<QualType, 8> ExceptionStorage;
5042 auto ESI = Record.readExceptionSpecInfo(ExceptionStorage);
5043
5044 // Update this declaration's exception specification, if needed.
5045 auto *FD = cast<FunctionDecl>(D);
5046 auto *FPT = FD->getType()->castAs<FunctionProtoType>();
5047 // FIXME: If the exception specification is already present, check that it
5048 // matches.
5049 if (isUnresolvedExceptionSpec(FPT->getExceptionSpecType())) {
5050 FD->setType(Reader.getContext().getFunctionType(
5051 FPT->getReturnType(), FPT->getParamTypes(),
5052 FPT->getExtProtoInfo().withExceptionSpec(ESI)));
5053
5054 // When we get to the end of deserializing, see if there are other decls
5055 // that we need to propagate this exception specification onto.
5056 Reader.PendingExceptionSpecUpdates.insert(
5057 std::make_pair(FD->getCanonicalDecl(), FD));
5058 }
5059 break;
5060 }
5061
5063 auto *FD = cast<FunctionDecl>(D);
5064 QualType DeducedResultType = Record.readType();
5065 Reader.PendingDeducedTypeUpdates.insert(
5066 {FD->getCanonicalDecl(), DeducedResultType});
5067 break;
5068 }
5069
5071 // Maintain AST consistency: any later redeclarations are used too.
5072 D->markUsed(Reader.getContext());
5073 break;
5074
5076 Reader.getContext().setManglingNumber(cast<NamedDecl>(D),
5077 Record.readInt());
5078 break;
5079
5081 Reader.getContext().setStaticLocalNumber(cast<VarDecl>(D),
5082 Record.readInt());
5083 break;
5084
5086 D->addAttr(OMPThreadPrivateDeclAttr::CreateImplicit(Reader.getContext(),
5087 readSourceRange()));
5088 break;
5089
5091 auto AllocatorKind =
5092 static_cast<OMPAllocateDeclAttr::AllocatorTypeTy>(Record.readInt());
5093 Expr *Allocator = Record.readExpr();
5094 Expr *Alignment = Record.readExpr();
5095 SourceRange SR = readSourceRange();
5096 D->addAttr(OMPAllocateDeclAttr::CreateImplicit(
5097 Reader.getContext(), AllocatorKind, Allocator, Alignment, SR));
5098 break;
5099 }
5100
5102 D->addAttr(OMPTargetIndirectCallAttr::CreateImplicit(Reader.getContext(),
5103 readSourceRange()));
5104 break;
5105
5107 unsigned SubmoduleID = readSubmoduleID();
5108 auto *Exported = cast<NamedDecl>(D);
5109 Module *Owner = SubmoduleID ? Reader.getSubmodule(SubmoduleID) : nullptr;
5110 Reader.getContext().mergeDefinitionIntoModule(Exported, Owner);
5111 Reader.PendingMergedDefinitionsToDeduplicate.insert(Exported);
5112 break;
5113 }
5114
5116 auto MapType = Record.readEnum<OMPDeclareTargetDeclAttr::MapTypeTy>();
5117 auto DevType = Record.readEnum<OMPDeclareTargetDeclAttr::DevTypeTy>();
5118 Expr *IndirectE = Record.readExpr();
5119 bool Indirect = Record.readBool();
5120 unsigned Level = Record.readInt();
5121 D->addAttr(OMPDeclareTargetDeclAttr::CreateImplicit(
5122 Reader.getContext(), MapType, DevType, IndirectE, Indirect, Level,
5123 readSourceRange()));
5124 break;
5125 }
5126
5128 AttrVec Attrs;
5129 Record.readAttributes(Attrs);
5130 assert(Attrs.size() == 1);
5131 D->addAttr(Attrs[0]);
5132 break;
5133 }
5134 }
5135}
This file provides AST data structures related to concepts.
Defines the clang::ASTContext interface.
#define V(N, I)
static T assert_cast(T t)
"Cast" to type T, asserting if we don't have an implicit conversion.
static bool allowODRLikeMergeInC(NamedDecl *ND)
ODR-like semantics for C/ObjC allow us to merge tag types and a structural check in Sema guarantees t...
static bool inheritDefaultTemplateArgument(ASTContext &Context, ParmDecl *From, Decl *ToD)
Inherit the default template argument from From to To.
static void inheritDefaultTemplateArguments(ASTContext &Context, TemplateDecl *From, TemplateDecl *To)
static void forAllLaterRedecls(DeclT *D, Fn F)
static llvm::iterator_range< MergedRedeclIterator< DeclT > > merged_redecls(DeclT *D)
#define NO_MERGE(Field)
static NamedDecl * getDeclForMerging(NamedDecl *Found, bool IsTypedefNameForLinkage, bool FilteringUsingShadowDecl)
Find the declaration that should be merged into, given the declaration found by name lookup.
Defines the clang::attr::Kind enum.
clang::CharUnits operator*(clang::CharUnits::QuantityType Scale, const clang::CharUnits &CU)
Definition CharUnits.h:225
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
This file defines OpenMP nodes for declarative directives.
Defines the C++ template declaration subclasses.
Defines the ExceptionSpecificationType enumeration and various utility functions.
FormatToken * Previous
The previous token in the unwrapped line.
FormatToken * Next
The next token in the unwrapped line.
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
Result
Implement __builtin_bit_cast and related operations.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines the LambdaCapture class.
Defines several types used to describe C++ lambda expressions that are shared between the parser and ...
Defines the clang::LangOptions interface.
llvm::MachO::Record Record
Definition MachO.h:31
Defines the clang::Module class, which describes a module in the source code.
This file defines OpenMP AST classes for clauses.
static std::string toString(const clang::SanitizerSet &Sanitizers)
Produce a string containing comma-separated names of sanitizers in Sanitizers set.
Defines the clang::SourceLocation class and associated facilities.
Defines various enumerations that describe declaration and type specifiers.
C Language Family Type Representation.
__DEVICE__ void * memcpy(void *__a, const void *__b, size_t __c)
bool needsCleanup() const
Returns whether the object performed allocations.
Definition APValue.cpp:434
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition ASTContext.h:239
TranslationUnitDecl * getTranslationUnitDecl() const
unsigned NumTopLevelStmtDecls
Ordinal for the next TopLevelStmtDecl; counts created and loaded ones.
const LangOptions & getLangOpts() const
void addDestruction(T *Ptr) const
If T isn't trivially destructible, calls AddDeallocation to register it for destruction.
ExternalASTSource * getExternalSource() const
Retrieve a pointer to the external AST source associated with this AST context, if any.
void mergeTemplatePattern(RedeclarableTemplateDecl *D, RedeclarableTemplateDecl *Existing, bool IsKeyDecl)
Merge together the pattern declarations from two template declarations.
ASTDeclMerger(ASTReader &Reader)
void mergeRedeclarable(Redeclarable< T > *D, T *Existing, RedeclarableResult &Redecl)
void mergeLambda(CXXRecordDecl *D, RedeclarableResult &Redecl, Decl &Context, unsigned Number)
Attempt to merge D with a previous declaration of the same lambda, which is found by its index within...
void MergeDefinitionData(CXXRecordDecl *D, struct CXXRecordDecl::DefinitionData &&NewDD)
void mergeRedeclarableImpl(Redeclarable< T > *D, T *Existing, GlobalDeclID KeyDeclID)
Attempts to merge the given declaration (D) with another declaration of the same entity.
void VisitTemplateParamObjectDecl(TemplateParamObjectDecl *D)
void VisitObjCImplementationDecl(ObjCImplementationDecl *D)
void mergeRedeclarableTemplate(RedeclarableTemplateDecl *D, RedeclarableResult &Redecl)
void VisitImportDecl(ImportDecl *D)
void VisitBindingDecl(BindingDecl *BD)
void VisitNamespaceDecl(NamespaceDecl *D)
void VisitTopLevelStmtDecl(TopLevelStmtDecl *D)
RedeclarableResult VisitRedeclarableTemplateDecl(RedeclarableTemplateDecl *D)
void VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D)
void VisitUnresolvedUsingIfExistsDecl(UnresolvedUsingIfExistsDecl *D)
void ReadFunctionDefinition(FunctionDecl *FD)
void VisitLabelDecl(LabelDecl *LD)
void VisitObjCCategoryDecl(ObjCCategoryDecl *D)
void VisitUsingDirectiveDecl(UsingDirectiveDecl *D)
RedeclarableResult VisitClassTemplateSpecializationDeclImpl(ClassTemplateSpecializationDecl *D)
void VisitFunctionDecl(FunctionDecl *FD)
void VisitObjCMethodDecl(ObjCMethodDecl *D)
void VisitUsingShadowDecl(UsingShadowDecl *D)
void VisitVarTemplateSpecializationDecl(VarTemplateSpecializationDecl *D)
void VisitVarDecl(VarDecl *VD)
RedeclarableResult VisitRedeclarable(Redeclarable< T > *D)
void VisitDeclContext(DeclContext *DC, LookupBlockOffsets &Offsets)
void VisitMSGuidDecl(MSGuidDecl *D)
void VisitPragmaCommentDecl(PragmaCommentDecl *D)
void VisitRecordDecl(RecordDecl *RD)
void VisitLifetimeExtendedTemporaryDecl(LifetimeExtendedTemporaryDecl *D)
void VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D)
void VisitRequiresExprBodyDecl(RequiresExprBodyDecl *D)
void ReadVarDeclInit(VarDecl *VD)
static Decl * getMostRecentDeclImpl(Redeclarable< DeclT > *D)
void VisitNamespaceAliasDecl(NamespaceAliasDecl *D)
void VisitIndirectFieldDecl(IndirectFieldDecl *FD)
void VisitObjCContainerDecl(ObjCContainerDecl *D)
void VisitBlockDecl(BlockDecl *BD)
void VisitOpenACCRoutineDecl(OpenACCRoutineDecl *D)
void VisitExportDecl(ExportDecl *D)
static void attachLatestDecl(Decl *D, Decl *latest)
void VisitStaticAssertDecl(StaticAssertDecl *D)
void VisitEmptyDecl(EmptyDecl *D)
void VisitOMPCapturedExprDecl(OMPCapturedExprDecl *D)
void VisitValueDecl(ValueDecl *VD)
void VisitEnumDecl(EnumDecl *ED)
void mergeRedeclarable(Redeclarable< T > *D, RedeclarableResult &Redecl)
Attempts to merge the given declaration (D) with another declaration of the same entity.
void VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D)
void VisitFriendTemplateDecl(FriendTemplateDecl *D)
void VisitObjCProtocolDecl(ObjCProtocolDecl *D)
void VisitClassTemplatePartialSpecializationDecl(ClassTemplatePartialSpecializationDecl *D)
void VisitObjCTypeParamDecl(ObjCTypeParamDecl *D)
void VisitDeclaratorDecl(DeclaratorDecl *DD)
RedeclarableResult VisitTypedefNameDecl(TypedefNameDecl *TD)
void VisitExplicitInstantiationDecl(ExplicitInstantiationDecl *D)
void VisitFriendDecl(FriendDecl *D)
void VisitLinkageSpecDecl(LinkageSpecDecl *D)
void VisitCXXRecordDecl(CXXRecordDecl *D)
ASTDeclReader(ASTReader &Reader, ASTRecordReader &Record, ASTReader::RecordLocation Loc, GlobalDeclID thisDeclID, SourceLocation ThisDeclLoc)
void VisitFileScopeAsmDecl(FileScopeAsmDecl *AD)
void VisitImplicitConceptSpecializationDecl(ImplicitConceptSpecializationDecl *D)
void VisitNamedDecl(NamedDecl *ND)
void mergeMergeable(Mergeable< T > *D)
Attempts to merge the given declaration (D) with another declaration of the same entity,...
void VisitBuiltinTemplateDecl(BuiltinTemplateDecl *D)
static Decl * getMostRecentDecl(Decl *D)
void VisitObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *D)
void VisitCXXConstructorDecl(CXXConstructorDecl *D)
void VisitPragmaDetectMismatchDecl(PragmaDetectMismatchDecl *D)
void VisitImplicitParamDecl(ImplicitParamDecl *PD)
void VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D)
static void setNextObjCCategory(ObjCCategoryDecl *Cat, ObjCCategoryDecl *Next)
void VisitCXXExpansionStmtDecl(CXXExpansionStmtDecl *D)
void VisitMSPropertyDecl(MSPropertyDecl *FD)
void VisitClassTemplateSpecializationDecl(ClassTemplateSpecializationDecl *D)
void VisitFieldDecl(FieldDecl *FD)
RedeclarableResult VisitVarDeclImpl(VarDecl *D)
void VisitOMPDeclareMapperDecl(OMPDeclareMapperDecl *D)
void VisitCapturedDecl(CapturedDecl *CD)
void VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D)
void VisitObjCInterfaceDecl(ObjCInterfaceDecl *D)
RedeclarableResult VisitCXXRecordDeclImpl(CXXRecordDecl *D)
void VisitAccessSpecDecl(AccessSpecDecl *D)
void VisitCXXMethodDecl(CXXMethodDecl *D)
void VisitOpenACCDeclareDecl(OpenACCDeclareDecl *D)
void VisitOMPAllocateDecl(OMPAllocateDecl *D)
void VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D)
static void attachLatestDeclImpl(Redeclarable< DeclT > *D, Decl *Latest)
static void markIncompleteDeclChainImpl(Redeclarable< DeclT > *D)
RedeclarableResult VisitTagDecl(TagDecl *TD)
ObjCTypeParamList * ReadObjCTypeParamList()
void VisitHLSLBufferDecl(HLSLBufferDecl *D)
void VisitOMPThreadPrivateDecl(OMPThreadPrivateDecl *D)
void VisitCXXDeductionGuideDecl(CXXDeductionGuideDecl *GD)
void VisitConstructorUsingShadowDecl(ConstructorUsingShadowDecl *D)
void VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D)
static void checkMultipleDefinitionInNamedModules(ASTReader &Reader, Decl *D, Decl *Previous)
void VisitUsingEnumDecl(UsingEnumDecl *D)
void VisitObjCImplDecl(ObjCImplDecl *D)
void VisitTranslationUnitDecl(TranslationUnitDecl *TU)
void VisitUnnamedGlobalConstantDecl(UnnamedGlobalConstantDecl *D)
void VisitTypeDecl(TypeDecl *TD)
void VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D)
void VisitEnumConstantDecl(EnumConstantDecl *ECD)
void VisitTypeAliasDecl(TypeAliasDecl *TD)
static void attachPreviousDeclImpl(ASTReader &Reader, Redeclarable< DeclT > *D, Decl *Previous, Decl *Canon)
void VisitConceptDecl(ConceptDecl *D)
void VisitObjCPropertyDecl(ObjCPropertyDecl *D)
void VisitOutlinedFunctionDecl(OutlinedFunctionDecl *D)
void VisitObjCIvarDecl(ObjCIvarDecl *D)
void VisitUsingPackDecl(UsingPackDecl *D)
void VisitFunctionTemplateDecl(FunctionTemplateDecl *D)
void VisitOMPDeclareReductionDecl(OMPDeclareReductionDecl *D)
RedeclarableResult VisitVarTemplateSpecializationDeclImpl(VarTemplateSpecializationDecl *D)
TODO: Unify with ClassTemplateSpecializationDecl version?
void VisitUsingDecl(UsingDecl *D)
void VisitObjCAtDefsFieldDecl(ObjCAtDefsFieldDecl *D)
void VisitVarTemplatePartialSpecializationDecl(VarTemplatePartialSpecializationDecl *D)
TODO: Unify with ClassTemplatePartialSpecializationDecl version?
void VisitParmVarDecl(ParmVarDecl *PD)
void VisitVarTemplateDecl(VarTemplateDecl *D)
TODO: Unify with ClassTemplateDecl version?
static void attachPreviousDecl(ASTReader &Reader, Decl *D, Decl *Previous, Decl *Canon)
void VisitClassTemplateDecl(ClassTemplateDecl *D)
void VisitCXXDestructorDecl(CXXDestructorDecl *D)
void VisitTemplateDecl(TemplateDecl *D)
void VisitCXXConversionDecl(CXXConversionDecl *D)
void VisitTypedefDecl(TypedefDecl *TD)
void VisitOMPRequiresDecl(OMPRequiresDecl *D)
RedeclarableResult VisitRecordDeclImpl(RecordDecl *RD)
void VisitDecompositionDecl(DecompositionDecl *DD)
void ReadSpecializations(ModuleFile &M, Decl *D, llvm::BitstreamCursor &DeclsCursor, bool IsPartial)
Reads an AST files chain containing the contents of a translation unit.
Definition ASTReader.h:427
bool isDeclIDFromModule(GlobalDeclID ID, ModuleFile &M) const
Returns true if global DeclID ID originated from module M.
DiagnosticBuilder Diag(unsigned DiagID) const
Report a diagnostic.
ASTContext & getContext()
Retrieve the AST context that this AST reader supplements.
Definition ASTReader.h:2593
Decl * ReadDecl(ModuleFile &F, const RecordDataImpl &R, unsigned &I)
Reads a declaration from the given position in a record in the given module.
Definition ASTReader.h:2166
ModuleFile * getOwningModuleFile(const Decl *D) const
Retrieve the module file that owns the given declaration, or NULL if the declaration is not from a mo...
T * ReadDeclAs(ModuleFile &F, const RecordDataImpl &R, unsigned &I)
Reads a declaration from the given position in a record in the given module.
Definition ASTReader.h:2176
LocalDeclID mapGlobalIDToModuleFileGlobalID(ModuleFile &M, GlobalDeclID GlobalID)
Map a global declaration ID into the declaration ID used to refer to this declaration within the give...
friend class ASTDeclReader
Definition ASTReader.h:431
Decl * GetDecl(GlobalDeclID ID)
Resolve a declaration ID into a declaration, potentially building a new declaration.
SourceLocation ReadSourceLocation(ModuleFile &MF, RawLocEncoding Raw) const
Read a source location from raw form.
Definition ASTReader.h:2463
void runWithSufficientStackSpace(SourceLocation Loc, llvm::function_ref< void()> Fn)
friend class ASTRecordReader
Definition ASTReader.h:433
SmallVector< uint64_t, 64 > RecordData
Definition ASTReader.h:442
serialization::ModuleFile ModuleFile
Definition ASTReader.h:473
An object for streaming information from a record.
bool readBool()
Read a boolean value, advancing Idx.
std::string readString()
Read a string, advancing Idx.
SourceRange readSourceRange()
Read a source range, advancing Idx.
SourceLocation readSourceLocation()
Read a source location, advancing Idx.
void readAttributes(AttrVec &Attrs)
Reads attributes from the current stream position, advancing Idx.
T * readDeclAs()
Reads a declaration from the given position in the record, advancing Idx.
IdentifierInfo * readIdentifier()
ASTContext & getContext()
Retrieve the AST context that this AST reader supplements.
TypeSourceInfo * readTypeSourceInfo()
Reads a declarator info from the given record, advancing Idx.
OMPTraitInfo * readOMPTraitInfo()
Read an OMPTraitInfo object, advancing Idx.
VersionTuple readVersionTuple()
Read a version tuple, advancing Idx.
uint64_t readInt()
Returns the current value in this record, and advances to the next value.
Attr * readAttr()
Reads one attribute from the current stream position, advancing Idx.
Expr * readExpr()
Reads an expression.
Represents an access specifier followed by colon ':'.
Definition DeclCXX.h:86
static AccessSpecDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:60
void setColonLoc(SourceLocation CLoc)
Sets the location of the colon.
Definition DeclCXX.h:111
Attr - This represents one attribute.
Definition Attr.h:46
Attr * clone(ASTContext &C) const
Syntax
The style used to specify an attribute.
@ AS_Keyword
__ptr16, alignas(...), etc.
A binding in a decomposition declaration.
Definition DeclCXX.h:4215
static BindingDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:3713
A simple helper class to unpack an integer to bits and consuming the bits in order.
Definition ASTReader.h:2655
uint32_t getNextBits(uint32_t Width)
Definition ASTReader.h:2678
A class which contains all the information about a particular captured value.
Definition Decl.h:4816
Represents a block literal declaration, which is like an unnamed FunctionDecl.
Definition Decl.h:4810
void setParams(ArrayRef< ParmVarDecl * > NewParamInfo)
Definition Decl.cpp:5511
void setDoesNotEscape(bool B=true)
Definition Decl.h:4962
void setSignatureAsWritten(TypeSourceInfo *Sig)
Definition Decl.h:4892
void setCanAvoidCopyToHeap(bool B=true)
Definition Decl.h:4967
void setIsConversionFromLambda(bool val=true)
Definition Decl.h:4957
void setBlockMissingReturnType(bool val=true)
Definition Decl.h:4949
static BlockDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5719
void setIsVariadic(bool value)
Definition Decl.h:4886
void setBody(CompoundStmt *B)
Definition Decl.h:4890
void setCaptures(ASTContext &Context, ArrayRef< Capture > Captures, bool CapturesCXXThis)
Definition Decl.cpp:5522
Represents the builtin template declaration which is used to implement __make_integer_seq and other b...
Represents a C++ constructor within a class.
Definition DeclCXX.h:2642
static CXXConstructorDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, uint64_t AllocKind)
Definition DeclCXX.cpp:2998
void setCtorClosureDefaultArgs(ArrayRef< CXXDefaultArgExpr * > Args)
Definition DeclCXX.cpp:3143
void setExplicitSpecifier(ExplicitSpecifier ES)
Definition DeclCXX.h:2703
bool isInheritingConstructor() const
Determine whether this is an implicit constructor synthesized to model a call to a constructor inheri...
Definition DeclCXX.h:2866
Represents a C++ conversion function within a class.
Definition DeclCXX.h:2977
void setExplicitSpecifier(ExplicitSpecifier ES)
Definition DeclCXX.h:3010
static CXXConversionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:3275
Represents a C++ deduction guide declaration.
Definition DeclCXX.h:2001
void setDeductionCandidateKind(DeductionCandidate K)
Definition DeclCXX.h:2092
void setSourceDeductionGuide(CXXDeductionGuideDecl *DG)
Definition DeclCXX.h:2080
static CXXDeductionGuideDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:2396
void setSourceDeductionGuideKind(SourceDeductionGuideKind SK)
Definition DeclCXX.h:2088
A default argument (C++ [dcl.fct.default]).
Definition ExprCXX.h:1274
Represents a C++ destructor within a class.
Definition DeclCXX.h:2907
static CXXDestructorDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:3150
CXXDestructorDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Definition DeclCXX.h:2955
Represents a C++26 expansion statement declaration.
static CXXExpansionStmtDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a static or instance method of a struct/union/class.
Definition DeclCXX.h:2150
static CXXMethodDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:2515
CXXMethodDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Definition DeclCXX.h:2263
Represents a C++ struct/union/class.
Definition DeclCXX.h:258
CXXRecordDecl * getDefinition() const
Definition DeclCXX.h:549
static CXXRecordDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:155
unsigned getODRHash() const
Definition DeclCXX.cpp:496
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this class is an instantiation of a member class of a class template specialization,...
Definition DeclCXX.cpp:2039
CXXRecordDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Definition DeclCXX.h:523
Represents the body of a CapturedStmt, and serves as its DeclContext.
Definition Decl.h:5082
static CapturedDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumParams)
Definition Decl.cpp:5762
void setContextParam(unsigned i, ImplicitParamDecl *P)
Definition Decl.h:5144
void setNothrow(bool Nothrow=true)
Definition Decl.cpp:5772
void setParam(unsigned i, ImplicitParamDecl *P)
Definition Decl.h:5126
Declaration of a class template.
static ClassTemplateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Create an empty class template node.
static ClassTemplatePartialSpecializationDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a class template specialization, which refers to a class template with a given set of temp...
static ClassTemplateSpecializationDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setTemplateArgsAsWritten(const ASTTemplateArgumentListInfo *ArgsWritten)
Set the template argument list as written in the sources.
Declaration of a C++20 concept.
static ConceptDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
A reference to a concept and its template args, as it appears in the code.
Definition ASTConcept.h:130
Represents a shadow constructor declaration introduced into a class by a C++11 using-declaration that...
Definition DeclCXX.h:3707
static ConstructorUsingShadowDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:3506
static DeclAccessPair make(NamedDecl *D, AccessSpecifier AS)
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Definition DeclBase.h:1466
lookup_result::iterator lookup_iterator
Definition DeclBase.h:2628
bool isFileContext() const
Definition DeclBase.h:2217
void setHasExternalVisibleStorage(bool ES=true) const
State whether this DeclContext has external storage for declarations visible in this context.
Definition DeclBase.h:2756
DeclContextLookupResult lookup_result
Definition DeclBase.h:2627
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
bool isTranslationUnit() const
Definition DeclBase.h:2222
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
DeclContext * getPrimaryContext()
getPrimaryContext - There may be many different declarations of the same entity (including forward de...
bool isFunctionOrMethod() const
Returns true if this DeclContext is a function, Objective-C method, or block, or a DeclContext that c...
Definition DeclBase.h:2181
DeclContext * getNonTransparentContext()
bool isValid() const
Definition DeclID.h:124
DeclID getRawValue() const
Definition DeclID.h:118
bool isInvalid() const
Definition DeclID.h:126
A simple visitor class that helps create declaration visitors.
Definition DeclVisitor.h:68
Decl - This represents one declaration (or definition), e.g.
Definition DeclBase.h:86
Decl * getPreviousDecl()
Retrieve the previous declaration that declares the same entity as this declaration,...
Definition DeclBase.h:1078
Decl * getMostRecentDecl()
Retrieve the most recent declaration that declares the same entity as this declaration (which may be ...
Definition DeclBase.h:1093
FriendObjectKind getFriendObjectKind() const
Determines whether this declaration is the object of a friend declaration and, if so,...
Definition DeclBase.h:1243
T * getAttr() const
Definition DeclBase.h:581
bool hasAttrs() const
Definition DeclBase.h:526
ASTContext & getASTContext() const LLVM_READONLY
Definition DeclBase.cpp:550
void setOwningModuleID(unsigned ID)
Set the owning module ID.
Definition DeclBase.cpp:126
void addAttr(Attr *A)
void setLocalExternDecl()
Changes the namespace of this declaration to reflect that it's a function-local extern declaration.
Definition DeclBase.h:1168
void setTopLevelDeclInObjCContainer(bool V=true)
Definition DeclBase.h:646
void markUsed(ASTContext &C)
Mark the declaration used, in the sense of odr-use.
Definition DeclBase.cpp:594
bool isCanonicalDecl() const
Whether this particular Decl is a canonical one.
Definition DeclBase.h:1001
Module * getOwningModule() const
Get the module that owns this declaration (for visibility purposes).
Definition DeclBase.h:854
Module * getImportedOwningModule() const
Get the imported owning module, if this decl is from an imported (non-local) module.
Definition DeclBase.h:824
ObjCDeclQualifier
ObjCDeclQualifier - 'Qualifiers' written next to the return and parameter types in method declaration...
Definition DeclBase.h:198
bool isFromASTFile() const
Determine whether this declaration came from an AST file (such as a precompiled header or module) rat...
Definition DeclBase.h:805
bool isTemplateParameter() const
isTemplateParameter - Determines whether this declaration is a template parameter.
Definition DeclBase.h:2843
bool isInvalidDecl() const
Definition DeclBase.h:596
unsigned FromASTFile
Whether this declaration was loaded from an AST file.
Definition DeclBase.h:348
void setAccess(AccessSpecifier AS)
Definition DeclBase.h:510
SourceLocation getLocation() const
Definition DeclBase.h:447
IdentifierNamespace
IdentifierNamespace - The different namespaces in which declarations may appear.
Definition DeclBase.h:115
@ IDNS_Ordinary
Ordinary names.
Definition DeclBase.h:144
@ IDNS_Type
Types, declared with 'struct foo', typedefs, etc.
Definition DeclBase.h:130
@ IDNS_Tag
Tags, declared with 'struct foo;' and referenced with 'struct foo'.
Definition DeclBase.h:125
bool isTemplateParameterPack() const
isTemplateParameter - Determines whether this declaration is a template parameter pack.
Definition DeclBase.cpp:256
void setImplicit(bool I=true)
Definition DeclBase.h:602
void setReferenced(bool R=true)
Definition DeclBase.h:631
void setLocation(SourceLocation L)
Definition DeclBase.h:448
DeclContext * getDeclContext()
Definition DeclBase.h:456
void setCachedLinkage(Linkage L) const
Definition DeclBase.h:425
void setDeclContext(DeclContext *DC)
setDeclContext - Set both the semantic and lexical DeclContext to DC.
Definition DeclBase.cpp:385
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
Definition DeclBase.h:935
bool hasAttr() const
Definition DeclBase.h:585
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
Definition DeclBase.h:995
ModuleOwnershipKind
The kind of ownership a declaration has, for visibility purposes.
Definition DeclBase.h:216
@ VisiblePromoted
This declaration has an owning module, and is not visible to the current TU but we promoted it to be ...
Definition DeclBase.h:237
@ VisibleWhenImported
This declaration has an owning module, and is visible when that module is imported.
Definition DeclBase.h:229
@ Unowned
This declaration is not owned by a module.
Definition DeclBase.h:218
@ ReachableWhenImported
This declaration has an owning module, and is visible to lookups that occurs within that module.
Definition DeclBase.h:242
@ ModulePrivate
This declaration has an owning module, but is only visible to lookups that occur within that module.
Definition DeclBase.h:248
@ Visible
This declaration has an owning module, but is globally visible (typically because its owning module i...
Definition DeclBase.h:225
Kind getKind() const
Definition DeclBase.h:450
void setModuleOwnershipKind(ModuleOwnershipKind MOK)
Set whether this declaration is hidden from name lookup.
Definition DeclBase.h:898
bool shouldEmitInExternalSource() const
Whether the definition of the declaration should be emitted in external sources.
void setVisibleDespiteOwningModule()
Set that this declaration is globally visible, even if it came from a module that is not visible.
Definition DeclBase.h:882
The name of a declaration.
IdentifierInfo * getAsIdentifierInfo() const
Retrieve the IdentifierInfo * stored in this declaration name, or null if this declaration name isn't...
Selector getObjCSelector() const
Get the Objective-C selector stored in this declaration name.
Represents a ValueDecl that came out of a declarator.
Definition Decl.h:781
void setInnerLocStart(SourceLocation L)
Definition Decl.h:824
void setTypeSourceInfo(TypeSourceInfo *TI)
Definition Decl.h:815
TypeSourceInfo * getTypeSourceInfo() const
Definition Decl.h:810
A decomposition declaration.
Definition DeclCXX.h:4279
static DecompositionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumBindings)
Definition DeclCXX.cpp:3751
Represents an empty-declaration.
Definition Decl.h:5317
static EmptyDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5966
An instance of this object exists for each enum constant that is defined.
Definition Decl.h:3558
static EnumConstantDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5788
void setInitExpr(Expr *E)
Definition Decl.h:3582
void setInitVal(const ASTContext &C, const llvm::APSInt &V)
Definition Decl.h:3583
Represents an enum.
Definition Decl.h:4146
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this enumeration is an instantiation of a member enumeration of a class template specialization,...
Definition Decl.h:4418
void setFixed(bool Fixed=true)
True if this is an Objective-C, C++11, or Microsoft-style enumeration with a fixed underlying type.
Definition Decl.h:4222
void setIntegerType(QualType T)
Set the underlying integer type.
Definition Decl.h:4328
void setIntegerTypeSourceInfo(TypeSourceInfo *TInfo)
Set the underlying integer type source info.
Definition Decl.h:4331
unsigned getODRHash()
Definition Decl.cpp:5232
static EnumDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5148
void setScoped(bool Scoped=true)
True if this tag declaration is a scoped enumeration.
Definition Decl.h:4210
void setPromotionType(QualType T)
Set the promotion type.
Definition Decl.h:4314
EnumDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Definition Decl.h:4236
void setScopedUsingClassTag(bool ScopedUCT=true)
If this tag declaration is a scoped enum, then this is true if the scoped enum was declared using the...
Definition Decl.h:4216
Represents an explicit instantiation of a template entity in source code.
static ExplicitInstantiationDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned TrailingFlags)
Represents a standard C++ module export declaration.
Definition Decl.h:5270
static ExportDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:6167
This represents one expression.
Definition Expr.h:113
RAII class for safely pairing a StartedDeserializing call with FinishedDeserializing.
Represents difference between two FPOptions values.
static FPOptionsOverride getFromOpaqueInt(storage_type I)
Represents a member of a struct/union/class.
Definition Decl.h:3295
void setBitWidth(Expr *Width)
Set the bit-field width for this member.
Definition Decl.h:3430
static FieldDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:4774
const VariableArrayType * CapturedVLAType
Definition Decl.h:3351
void setRParenLoc(SourceLocation L)
Definition Decl.h:4750
void setAsmString(Expr *Asm)
Definition Decl.h:4757
static FileScopeAsmDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5920
FriendDecl - Represents the declaration of a friend entity, which can be a function,...
Definition DeclFriend.h:46
LazyDeclPtr NextFriend
Definition DeclFriend.h:65
FriendUnion Friend
Definition DeclFriend.h:63
static FriendDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Declaration of a friend template.
static FriendTemplateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumFriendTPLists)
static DefaultedOrDeletedFunctionInfo * Create(ASTContext &Context, ArrayRef< DeclAccessPair > Lookups, FPOptionsOverride FPFeatures, StringLiteral *DeletedMessage=nullptr)
Definition Decl.cpp:3126
Represents a function declaration or definition.
Definition Decl.h:2059
void setDescribedFunctionTemplate(FunctionTemplateDecl *Template)
Definition Decl.cpp:4237
FunctionTemplateDecl * getDescribedFunctionTemplate() const
Retrieves the function template that is described by this function declaration.
Definition Decl.cpp:4232
void setIsPureVirtual(bool P=true)
Definition Decl.cpp:3340
void setDefaultedOrDeletedInfo(DefaultedOrDeletedFunctionInfo *Info)
Definition Decl.cpp:3147
void setFriendConstraintRefersToEnclosingTemplate(bool V=true)
Definition Decl.h:2832
void setHasSkippedBody(bool Skipped=true)
Definition Decl.h:2811
static FunctionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5703
void setUsesSEHTry(bool UST)
Definition Decl.h:2646
void setIsMultiVersion(bool V=true)
Sets the multiversion state for this declaration and all of its redeclarations.
Definition Decl.h:2826
void setHasWrittenPrototype(bool P=true)
State that this function has a written prototype.
Definition Decl.h:2580
bool isExplicitlyDefaulted() const
Whether this function is explicitly defaulted.
Definition Decl.h:2516
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this function is an instantiation of a member function of a class template specialization,...
Definition Decl.cpp:4211
FunctionTemplateSpecializationInfo * getTemplateSpecializationInfo() const
If this function is actually a function template specialization, retrieve information about this func...
Definition Decl.cpp:4362
void setDefaultLoc(SourceLocation NewLoc)
Definition Decl.h:2529
void setInstantiatedFromMemberTemplate(bool Val=true)
Definition Decl.h:2496
void setInlineSpecified(bool I)
Set whether the "inline" keyword was specified for this function.
Definition Decl.h:3033
TemplatedKind
The kind of templated function a FunctionDecl can be.
Definition Decl.h:2064
@ TK_FunctionTemplateSpecialization
Definition Decl.h:2075
@ TK_DependentFunctionTemplateSpecialization
Definition Decl.h:2078
void setTrivial(bool IT)
Definition Decl.h:2505
TemplatedKind getTemplatedKind() const
What kind of templated function this is.
Definition Decl.cpp:4183
void setInstantiatedFromDecl(FunctionDecl *FD)
Specify that this function declaration was instantiated from a FunctionDecl FD.
Definition Decl.cpp:4250
bool isDeletedAsWritten() const
Definition Decl.h:2671
void setHasInheritedPrototype(bool P=true)
State that this function inherited its prototype from a previous declaration.
Definition Decl.h:2592
void setDependentTemplateSpecialization(ASTContext &Context, const UnresolvedSetImpl &Templates, const TemplateArgumentListInfo *TemplateArgs)
Specifies that this function declaration is actually a dependent function template specialization.
Definition Decl.cpp:4417
void setVirtualAsWritten(bool V)
State that this function is marked as virtual explicitly.
Definition Decl.h:2476
void setIsDestroyingOperatorDelete(bool IsDestroyingDelete)
Definition Decl.cpp:3597
void setLateTemplateParsed(bool ILT=true)
State that this templated function will be late parsed.
Definition Decl.h:2489
void setImplicitlyInline(bool I=true)
Flag that this function is implicitly inline.
Definition Decl.h:3047
void setTrivialForCall(bool IT)
Definition Decl.h:2508
void setIsTypeAwareOperatorNewOrDelete(bool IsTypeAwareOperator=true)
Definition Decl.cpp:3605
bool isDefaulted() const
Whether this function is defaulted.
Definition Decl.h:2512
void setIneligibleOrNotSelected(bool II)
Definition Decl.h:2548
void setConstexprKind(ConstexprSpecKind CSK)
Definition Decl.h:2600
void setDefaulted(bool D=true)
Definition Decl.h:2513
void setStorageClass(StorageClass SClass)
Sets the storage class as written in the source.
Definition Decl.h:3024
void setDeletedAsWritten(bool D=true, StringLiteral *Message=nullptr)
Definition Decl.cpp:3156
void setExplicitlyDefaulted(bool ED=true)
State that this function is explicitly defaulted.
Definition Decl.h:2521
void setHasImplicitReturnZero(bool IRZ)
State that falling off this function implicitly returns null/zero.
Definition Decl.h:2562
Represents a prototype with parameter type info, e.g.
Definition TypeBase.h:5398
ExceptionSpecificationType getExceptionSpecType() const
Get the kind of exception specification on this function.
Definition TypeBase.h:5705
Declaration of a template function.
static FunctionTemplateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Create an empty function template node.
Provides information about a function template specialization, which is a FunctionDecl that has been ...
FunctionTemplateDecl * getTemplate() const
Retrieve the template from which this function was specialized.
static FunctionTemplateSpecializationInfo * Create(ASTContext &C, FunctionDecl *FD, FunctionTemplateDecl *Template, TemplateSpecializationKind TSK, TemplateArgumentList *TemplateArgs, const TemplateArgumentListInfo *TemplateArgsAsWritten, SourceLocation POI, MemberSpecializationInfo *MSInfo)
void Profile(llvm::FoldingSetNodeID &ID)
FunctionDecl * getFunction() const
Retrieve the declaration of the function template specialization.
FunctionType - C99 6.7.5.3 - Function Declarators.
Definition TypeBase.h:4594
QualType getReturnType() const
Definition TypeBase.h:4934
HLSLBufferDecl - Represent a cbuffer or tbuffer declaration.
Definition Decl.h:5332
static HLSLBufferDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:6011
One of these records is kept for each identifier that is lexed.
void setOutOfDate(bool OOD)
Set whether the information for this identifier is out of date with respect to the external source.
bool isOutOfDate() const
Determine whether the information for this identifier is out of date with respect to the external sou...
iterator begin(DeclarationName Name)
Returns an iterator over decls with the name 'Name'.
iterator end()
Returns the end iterator.
void setTemplateArguments(ArrayRef< TemplateArgument > Converted)
static ImplicitConceptSpecializationDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID, unsigned NumTemplateArgs)
static ImplicitParamDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5684
Describes a module import declaration, which makes the contents of the named module visible in the cu...
Definition Decl.h:5191
static ImportDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumLocations)
Create a new, deserialized module import declaration.
Definition Decl.cpp:6136
Represents a field injected from an anonymous union/struct into the parent scope.
Definition Decl.h:3602
static IndirectFieldDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5816
void setInherited(bool I)
Definition Attr.h:163
Description of a constructor that was inherited from a base class.
Definition DeclCXX.h:2613
Represents the declaration of a label.
Definition Decl.h:525
void setLocStart(SourceLocation L)
Definition Decl.h:553
static LabelDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5632
Describes the capture of a variable or of this, or of a C++1y init-capture.
LambdaCaptureKind getCaptureKind() const
Determine the kind of capture.
Definition ExprCXX.cpp:1297
Implicit declaration of a temporary that was materialized by a MaterializeTemporaryExpr and lifetime-...
Definition DeclCXX.h:3338
static LifetimeExtendedTemporaryDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.h:3368
Represents a linkage specification.
Definition DeclCXX.h:3045
void setExternLoc(SourceLocation L)
Definition DeclCXX.h:3086
void setLanguage(LinkageSpecLanguageIDs L)
Set the language specified by this linkage specification.
Definition DeclCXX.h:3073
void setRBraceLoc(SourceLocation L)
Definition DeclCXX.h:3087
static LinkageSpecDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:3321
Represents the results of name lookup.
Definition Lookup.h:147
A global _GUID constant.
Definition DeclCXX.h:4451
An instance of this class represents the declaration of a property member.
Definition DeclCXX.h:4397
static MSPropertyDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:3848
Provides information a specialization of a member of a class template, which may be a member function...
void setPointOfInstantiation(SourceLocation POI)
Set the first point of instantiation.
Provides common interface for the Decls that cannot be redeclared, but can be merged if the same decl...
Describes a module or submodule.
Definition Module.h:340
@ AllVisible
All of the names in this module are visible.
Definition Module.h:647
std::string Name
The name of this module.
Definition Module.h:343
bool isGlobalModule() const
Does this Module scope describe a fragment of the global module within some C++ module.
Definition Module.h:438
@ ModuleMapModule
This is a module that was defined by a module map and built out of header files.
Definition Module.h:354
bool isNamedModule() const
Does this Module is a named module of a standard named module?
Definition Module.h:423
Module * getTopLevelModule()
Retrieve the top-level module for this (sub)module, which may be this module.
Definition Module.h:940
This represents a decl that may have a name.
Definition Decl.h:275
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
Definition Decl.h:296
bool isPlaceholderVar(const LangOptions &LangOpts) const
Definition Decl.cpp:1096
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
Definition Decl.h:341
void setDeclName(DeclarationName N)
Set the name of this declaration.
Definition Decl.h:344
Represents a C++ namespace alias.
Definition DeclCXX.h:3231
static NamespaceAliasDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:3426
Represent a C++ namespace.
Definition Decl.h:593
void setAnonymousNamespace(NamespaceDecl *D)
Definition Decl.h:680
void setNested(bool Nested)
Set whether this is a nested namespace declaration.
Definition Decl.h:661
void setInline(bool Inline)
Set whether this is an inline namespace declaration.
Definition Decl.h:652
static NamespaceDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:3382
A C++ nested-name-specifier augmented with source location information.
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
static NonTypeTemplateParmDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, bool HasTypeConstraint)
unsigned getNumExpansionTypes() const
Retrieves the number of expansion types in an expanded parameter pack.
bool isExpandedParameterPack() const
Whether this parameter is a non-type template parameter pack that has a known list of different types...
bool hasPlaceholderTypeConstraint() const
Determine whether this non-type template parameter's type has a placeholder with a type-constraint.
void setPlaceholderTypeConstraint(Expr *E)
void setDefaultArgument(const ASTContext &C, const TemplateArgumentLoc &DefArg)
Set the default argument for this template parameter, and whether that default argument was inherited...
This represents 'pragma omp allocate ...' directive.
Definition DeclOpenMP.h:536
static OMPAllocateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NVars, unsigned NClauses)
Pseudo declaration for capturing expressions.
Definition DeclOpenMP.h:445
static OMPCapturedExprDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
OMPChildren * Data
Data, associated with the directive.
Definition DeclOpenMP.h:43
This represents 'pragma omp declare mapper ...' directive.
Definition DeclOpenMP.h:349
static OMPDeclareMapperDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned N)
Creates deserialized declare mapper node.
This represents 'pragma omp declare reduction ...' directive.
Definition DeclOpenMP.h:239
void setInitializerData(Expr *OrigE, Expr *PrivE)
Set initializer Orig and Priv vars.
Definition DeclOpenMP.h:319
void setInitializer(Expr *E, OMPDeclareReductionInitKind IK)
Set initializer expression for the declare reduction construct.
Definition DeclOpenMP.h:314
void setCombiner(Expr *E)
Set combiner expression for the declare reduction construct.
Definition DeclOpenMP.h:291
void setCombinerData(Expr *InE, Expr *OutE)
Set combiner In and Out vars.
Definition DeclOpenMP.h:293
static OMPDeclareReductionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Create deserialized declare reduction node.
This represents 'pragma omp requires...' directive.
Definition DeclOpenMP.h:479
static OMPRequiresDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned N)
Create deserialized requires node.
This represents 'pragma omp threadprivate ...' directive.
Definition DeclOpenMP.h:110
static OMPThreadPrivateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned N)
Represents a field declaration created by an @defs(...).
Definition DeclObjC.h:2036
static ObjCAtDefsFieldDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
ObjCCategoryDecl - Represents a category declaration.
Definition DeclObjC.h:2335
void setProtocolList(ObjCProtocolDecl *const *List, unsigned Num, const SourceLocation *Locs, ASTContext &C)
setProtocolList - Set the list of protocols that this interface implements.
Definition DeclObjC.h:2397
static ObjCCategoryDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setIvarLBraceLoc(SourceLocation Loc)
Definition DeclObjC.h:2469
void setCategoryNameLoc(SourceLocation Loc)
Definition DeclObjC.h:2467
void setIvarRBraceLoc(SourceLocation Loc)
Definition DeclObjC.h:2471
bool IsClassExtension() const
Definition DeclObjC.h:2443
ObjCCategoryImplDecl - An object of this class encapsulates a category @implementation declaration.
Definition DeclObjC.h:2551
static ObjCCategoryImplDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
ObjCCompatibleAliasDecl - Represents alias of a class.
Definition DeclObjC.h:2781
static ObjCCompatibleAliasDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setClassInterface(ObjCInterfaceDecl *D)
Definition DeclObjC.h:2801
ObjCContainerDecl - Represents a container for method declarations.
Definition DeclObjC.h:954
void setAtStartLoc(SourceLocation Loc)
Definition DeclObjC.h:1104
void setAtEndRange(SourceRange atEnd)
Definition DeclObjC.h:1111
void setClassInterface(ObjCInterfaceDecl *IFace)
ObjCImplementationDecl - Represents a class definition - this is where method definitions are specifi...
Definition DeclObjC.h:2603
static ObjCImplementationDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setIvarLBraceLoc(SourceLocation Loc)
Definition DeclObjC.h:2747
void setSuperClass(ObjCInterfaceDecl *superCls)
Definition DeclObjC.h:2745
void setIvarRBraceLoc(SourceLocation Loc)
Definition DeclObjC.h:2749
void setHasDestructors(bool val)
Definition DeclObjC.h:2714
void setHasNonZeroConstructors(bool val)
Definition DeclObjC.h:2709
Represents an ObjC class declaration.
Definition DeclObjC.h:1160
void mergeClassExtensionProtocolList(ObjCProtocolDecl *const *List, unsigned Num, ASTContext &C)
mergeClassExtensionProtocolList - Merge class extension's protocol list into the protocol list for th...
Definition DeclObjC.cpp:439
ObjCIvarDecl * lookupInstanceVariable(IdentifierInfo *IVarName, ObjCInterfaceDecl *&ClassDeclared)
Definition DeclObjC.cpp:634
unsigned getODRHash()
Get precomputed ODRHash or add a new one.
Definition DeclObjC.cpp:788
static ObjCInterfaceDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID)
ObjCInterfaceDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this Objective-C class.
Definition DeclObjC.h:1921
ObjCIvarDecl - Represents an ObjC instance variable.
Definition DeclObjC.h:1958
void setAccessControl(AccessControl ac)
Definition DeclObjC.h:2004
void setNextIvar(ObjCIvarDecl *ivar)
Definition DeclObjC.h:1995
ObjCInterfaceDecl * getContainingInterface()
Return the class interface that this ivar is logically contained in; this is either the interface whe...
void setSynthesize(bool synth)
Definition DeclObjC.h:2012
static ObjCIvarDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
ObjCMethodDecl - Represents an instance or class method declaration.
Definition DeclObjC.h:140
void setSynthesizedAccessorStub(bool isSynthesizedAccessorStub)
Definition DeclObjC.h:451
void setObjCDeclQualifier(ObjCDeclQualifier QV)
Definition DeclObjC.h:253
void setDefined(bool isDefined)
Definition DeclObjC.h:456
void setSelfDecl(ImplicitParamDecl *SD)
Definition DeclObjC.h:422
void setReturnTypeSourceInfo(TypeSourceInfo *TInfo)
Definition DeclObjC.h:347
void setHasRedeclaration(bool HRD) const
Definition DeclObjC.h:275
void setIsRedeclaration(bool RD)
Definition DeclObjC.h:270
void setCmdDecl(ImplicitParamDecl *CD)
Definition DeclObjC.h:424
bool hasRedeclaration() const
True if redeclared in the same interface.
Definition DeclObjC.h:274
void setRelatedResultType(bool RRT=true)
Note whether this method has a related result type.
Definition DeclObjC.h:264
void setOverriding(bool IsOver)
Definition DeclObjC.h:466
void setPropertyAccessor(bool isAccessor)
Definition DeclObjC.h:443
void setDeclImplementation(ObjCImplementationControl ic)
Definition DeclObjC.h:499
void setReturnType(QualType T)
Definition DeclObjC.h:333
static ObjCMethodDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclObjC.cpp:862
void setHasSkippedBody(bool Skipped=true)
Definition DeclObjC.h:481
void setInstanceMethod(bool isInst)
Definition DeclObjC.h:430
void setVariadic(bool isVar)
Definition DeclObjC.h:435
Represents one property declaration in an Objective-C interface.
Definition DeclObjC.h:734
void setAtLoc(SourceLocation L)
Definition DeclObjC.h:803
void setPropertyImplementation(PropertyControl pc)
Definition DeclObjC.h:914
void setSetterName(Selector Sel, SourceLocation Loc=SourceLocation())
Definition DeclObjC.h:902
void setPropertyAttributes(ObjCPropertyAttribute::Kind PRVal)
Definition DeclObjC.h:825
static ObjCPropertyDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setPropertyAttributesAsWritten(ObjCPropertyAttribute::Kind PRVal)
Definition DeclObjC.h:837
void setLParenLoc(SourceLocation L)
Definition DeclObjC.h:806
void setPropertyIvarDecl(ObjCIvarDecl *Ivar)
Definition DeclObjC.h:926
void setSetterMethodDecl(ObjCMethodDecl *gDecl)
Definition DeclObjC.h:911
void setType(QualType T, TypeSourceInfo *TSI)
Definition DeclObjC.h:812
void setGetterName(Selector Sel, SourceLocation Loc=SourceLocation())
Definition DeclObjC.h:894
void setGetterMethodDecl(ObjCMethodDecl *gDecl)
Definition DeclObjC.h:908
ObjCPropertyImplDecl - Represents implementation declaration of a property in a class or category imp...
Definition DeclObjC.h:2811
void setSetterMethodDecl(ObjCMethodDecl *MD)
Definition DeclObjC.h:2911
void setSetterCXXAssignment(Expr *setterCXXAssignment)
Definition DeclObjC.h:2925
static ObjCPropertyImplDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setGetterMethodDecl(ObjCMethodDecl *MD)
Definition DeclObjC.h:2908
void setAtLoc(SourceLocation Loc)
Definition DeclObjC.h:2874
void setPropertyDecl(ObjCPropertyDecl *Prop)
Definition DeclObjC.h:2879
void setGetterCXXConstructor(Expr *getterCXXConstructor)
Definition DeclObjC.h:2917
Represents an Objective-C protocol declaration.
Definition DeclObjC.h:2090
static ObjCProtocolDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
ObjCProtocolDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this Objective-C protocol.
Definition DeclObjC.h:2303
unsigned getODRHash()
Get precomputed ODRHash or add a new one.
Represents the declaration of an Objective-C type parameter.
Definition DeclObjC.h:581
static ObjCTypeParamDecl * CreateDeserialized(ASTContext &ctx, GlobalDeclID ID)
Stores a list of Objective-C type parameters for a parameterized class or a category/extension thereo...
Definition DeclObjC.h:665
static ObjCTypeParamList * create(ASTContext &ctx, SourceLocation lAngleLoc, ArrayRef< ObjCTypeParamDecl * > typeParams, SourceLocation rAngleLoc)
Create a new Objective-C type parameter list.
static OpenACCDeclareDecl * CreateDeserialized(ASTContext &Ctx, GlobalDeclID ID, unsigned NumClauses)
static OpenACCRoutineDecl * CreateDeserialized(ASTContext &Ctx, GlobalDeclID ID, unsigned NumClauses)
Represents a partial function definition.
Definition Decl.h:5017
void setNothrow(bool Nothrow=true)
Definition Decl.cpp:5748
static OutlinedFunctionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumParams)
Definition Decl.cpp:5736
void setParam(unsigned i, ImplicitParamDecl *P)
Definition Decl.h:5053
Represents a parameter to a function.
Definition Decl.h:1820
static ParmVarDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:2960
void setUninstantiatedDefaultArg(Expr *arg)
Definition Decl.cpp:3033
void setScopeInfo(unsigned scopeDepth, unsigned parameterIndex)
Definition Decl.h:1853
void setObjCMethodScopeInfo(unsigned parameterIndex)
Definition Decl.h:1848
Represents a #pragma comment line.
Definition Decl.h:168
static PragmaCommentDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned ArgSize)
Definition Decl.cpp:5580
Represents a #pragma detect_mismatch line.
Definition Decl.h:202
static PragmaDetectMismatchDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NameValueSize)
Definition Decl.cpp:5605
A (possibly-)qualified type.
Definition TypeBase.h:938
bool isNull() const
Return true if this QualType doesn't point to a type yet.
Definition TypeBase.h:1005
Represents a struct/union/class.
Definition Decl.h:4460
unsigned getODRHash()
Get precomputed ODRHash or add a new one.
Definition Decl.cpp:5483
void setAnonymousStructOrUnion(bool Anon)
Definition Decl.h:4516
void setArgPassingRestrictions(RecordArgPassingKind Kind)
Definition Decl.h:4606
void setNonTrivialToPrimitiveCopy(bool V)
Definition Decl.h:4550
void setHasNonTrivialToPrimitiveCopyCUnion(bool V)
Definition Decl.h:4582
void setHasNonTrivialToPrimitiveDestructCUnion(bool V)
Definition Decl.h:4574
void setHasFlexibleArrayMember(bool V)
Definition Decl.h:4497
void setParamDestroyedInCallee(bool V)
Definition Decl.h:4614
void setNonTrivialToPrimitiveDestroy(bool V)
Definition Decl.h:4558
void setHasObjectMember(bool val)
Definition Decl.h:4521
void setHasVolatileMember(bool val)
Definition Decl.h:4525
void setHasNonTrivialToPrimitiveDefaultInitializeCUnion(bool V)
Definition Decl.h:4566
static RecordDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5304
void setHasUninitializedExplicitInitFields(bool V)
Definition Decl.h:4590
void setNonTrivialToPrimitiveDefaultInitialize(bool V)
Definition Decl.h:4542
Declaration of a redeclarable template.
CommonBase * Common
Pointer to the common data shared by all declarations of this template.
virtual CommonBase * newCommon(ASTContext &C) const =0
RedeclarableTemplateDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this template.
void setMemberSpecialization()
Note that this member template is a specialization.
void setInstantiatedFromMemberTemplate(RedeclarableTemplateDecl *TD)
Provides common interface for the Decls that can be redeclared.
DeclLink RedeclLink
Points to the next redeclaration in the chain.
bool isFirstDecl() const
True if this is the first declaration in its redeclaration chain.
static DeclLink PreviousDeclLink(decl_type *D)
Represents the body of a requires-expression.
Definition DeclCXX.h:2119
static RequiresExprBodyDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:2411
const FunctionDecl * getKernelEntryPointDecl() const
Encodes a location in the source.
A trivial tuple used to represent a source range.
Represents a C++11 static_assert declaration.
Definition DeclCXX.h:4166
static StaticAssertDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:3689
StringLiteral - This represents a string literal expression, e.g.
Definition Expr.h:1819
Represents the declaration of a struct/union/class/enum.
Definition Decl.h:3852
void setTagKind(TagKind TK)
Definition Decl.h:4056
void setCompleteDefinitionRequired(bool V=true)
True if this complete decl is required to be complete for some existing use.
Definition Decl.h:3968
void demoteThisDefinitionToDeclaration()
Mark a definition as a declaration and maintain information it was a definition.
Definition Decl.h:4011
bool isThisDeclarationADefinition() const
Return true if this declaration is a completion definition of the type.
Definition Decl.h:3948
void setEmbeddedInDeclarator(bool isInDeclarator)
True if this tag declaration is "embedded" (i.e., defined or declared for the very first time) in the...
Definition Decl.h:3983
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
Definition Decl.h:3953
bool isFirstDecl() const
True if this is the first declaration in its redeclaration chain.
TagDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Definition Decl.cpp:4964
void setFreeStanding(bool isFreeStanding=true)
True if this tag is free standing, e.g. "struct foo;".
Definition Decl.h:3991
void setBraceRange(SourceRange R)
Definition Decl.h:3930
void setCompleteDefinition(bool V=true)
True if this decl has its body fully specified.
Definition Decl.h:3956
A convenient class for passing around template argument information.
A template argument list.
static TemplateArgumentList * CreateCopy(ASTContext &Context, ArrayRef< TemplateArgument > Args)
Create a new template argument list that copies the given set of template arguments.
The base class of all kinds of template declarations (e.g., class, function, etc.).
TemplateParameterList * TemplateParams
void init(NamedDecl *NewTemplatedDecl)
Initialize the underlying templated declaration.
NamedDecl * getTemplatedDecl() const
Get the underlying, templated declaration.
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
TemplateDecl * getAsTemplateDecl(bool IgnoreDeduced=false) const
Retrieve the underlying template declaration that this template name refers to, if known.
A template parameter object.
TemplateParamObjectDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Stores a list of template parameters for a TemplateDecl and its derived classes.
TemplateTemplateParmDecl - Declares a template template parameter, e.g., "T" in.
unsigned getNumExpansionTemplateParameters() const
Retrieves the number of expansion template parameters in an expanded parameter pack.
static TemplateTemplateParmDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setDeclaredWithTypename(bool withTypename)
Set whether this template template parameter was declared with the 'typename' or 'class' keyword.
void setDefaultArgument(const ASTContext &C, const TemplateArgumentLoc &DefArg)
Set the default argument for this template parameter, and whether that default argument was inherited...
bool isExpandedParameterPack() const
Whether this parameter is a template template parameter pack that has a known list of different templ...
Declaration of a template type parameter.
void setTypeConstraint(ConceptReference *CR, Expr *ImmediatelyDeclaredConstraint, UnsignedOrNone ArgPackSubstIndex)
static TemplateTypeParmDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID)
bool hasTypeConstraint() const
Determine whether this template parameter has a type-constraint.
void setDefaultArgument(const ASTContext &C, const TemplateArgumentLoc &DefArg)
Set the default argument for this template parameter.
void setDeclaredWithTypename(bool withTypename)
Set whether this template type parameter was declared with the 'typename' or 'class' keyword.
A declaration that models statements at global scope.
Definition Decl.h:4770
static TopLevelStmtDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5944
The top declaration context.
Definition Decl.h:106
Represents the declaration of a typedef-name via a C++11 alias-declaration.
Definition Decl.h:3823
static TypeAliasDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5890
void setDescribedAliasTemplate(TypeAliasTemplateDecl *TAT)
Definition Decl.h:3842
Declaration of an alias template.
static TypeAliasTemplateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Create an empty alias template node.
Represents a declaration of a type.
Definition Decl.h:3648
void setLocStart(SourceLocation L)
Definition Decl.h:3683
A container of type source information.
Definition TypeBase.h:8399
QualType getType() const
Return the type wrapped by this type source info.
Definition TypeBase.h:8410
const T * castAs() const
Member-template castAs<specific type>.
Definition TypeBase.h:9331
AutoType * getContainedAutoType() const
Get the AutoType whose type will be deduced for a variable with an initializer of this type.
Definition TypeBase.h:2976
const T * getAs() const
Member-template getAs<specific type>'.
Definition TypeBase.h:9264
Represents the declaration of a typedef-name via the 'typedef' type specifier.
Definition Decl.h:3802
static TypedefDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5877
Base class for declarations which introduce a typedef-name.
Definition Decl.h:3697
void setModedTypeSourceInfo(TypeSourceInfo *unmodedTSI, QualType modedTy)
Definition Decl.h:3762
void setTypeSourceInfo(TypeSourceInfo *newType)
Definition Decl.h:3758
An artificial decl, representing a global anonymous constant value which is uniquified by value withi...
Definition DeclCXX.h:4508
void addDecl(NamedDecl *D)
A set of unresolved declarations.
This node is generated when a using-declaration that was annotated with attribute((using_if_exists)) ...
Definition DeclCXX.h:4148
static UnresolvedUsingIfExistsDecl * CreateDeserialized(ASTContext &Ctx, GlobalDeclID ID)
Definition DeclCXX.cpp:3665
Represents a dependent using declaration which was marked with typename.
Definition DeclCXX.h:4067
static UnresolvedUsingTypenameDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:3651
Represents a dependent using declaration which was not marked with typename.
Definition DeclCXX.h:3970
void setUsingLoc(SourceLocation L)
Set the source location of the 'using' keyword.
Definition DeclCXX.h:4004
static UnresolvedUsingValueDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:3621
Represents a C++ using-declaration.
Definition DeclCXX.h:3621
void setTypename(bool TN)
Sets whether the using declaration has 'typename'.
Definition DeclCXX.h:3673
void setUsingLoc(SourceLocation L)
Set the source location of the 'using' keyword.
Definition DeclCXX.h:3651
static UsingDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:3554
Represents C++ using-directive.
Definition DeclCXX.h:3126
static UsingDirectiveDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:3343
Represents a C++ using-enum-declaration.
Definition DeclCXX.h:3822
void setEnumType(TypeSourceInfo *TSI)
Definition DeclCXX.h:3861
void setEnumLoc(SourceLocation L)
Definition DeclCXX.h:3847
void setUsingLoc(SourceLocation L)
Definition DeclCXX.h:3843
static UsingEnumDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:3577
Represents a pack of using declarations that a single using-declarator pack-expanded into.
Definition DeclCXX.h:3903
static UsingPackDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumExpansions)
Definition DeclCXX.cpp:3597
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
Definition DeclCXX.h:3429
static UsingShadowDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:3482
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Definition Decl.h:713
void setType(QualType newType)
Definition Decl.h:725
QualType getType() const
Definition Decl.h:724
Represents a variable declaration or definition.
Definition Decl.h:933
ParmVarDeclBitfields ParmVarDeclBits
Definition Decl.h:1131
static VarDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:2137
VarDeclBitfields VarDeclBits
Definition Decl.h:1130
EvaluatedStmt * ensureEvaluatedStmt() const
Convert the initializer for this declaration to the elaborated EvaluatedStmt form,...
Definition Decl.cpp:2537
NonParmVarDeclBitfields NonParmVarDeclBits
Definition Decl.h:1132
@ Definition
This declaration is definitely a definition.
Definition Decl.h:1325
void setDescribedVarTemplate(VarTemplateDecl *Template)
Definition Decl.cpp:2785
StorageClass getStorageClass() const
Returns the storage class as written in the source.
Definition Decl.h:1175
VarDecl * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
Declaration of a variable template.
static VarTemplateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Create an empty variable template node.
static VarTemplatePartialSpecializationDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a variable template specialization, which refers to a variable template with a given set o...
void setTemplateArgsAsWritten(const ASTTemplateArgumentListInfo *ArgsWritten)
Set the template argument list as written in the sources.
static VarTemplateSpecializationDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
RawLocEncoding getRawLoc() const
uint64_t getBitOffset(const uint64_t DeclTypesBlockStartOffset) const
Information about a module that has been loaded by the ASTReader.
Definition ModuleFile.h:158
const serialization::ObjCCategoriesInfo * ObjCCategoriesMap
Array of category list location information within this module file, sorted by the definition ID.
Definition ModuleFile.h:524
unsigned LocalNumObjCCategoriesInMap
The number of redeclaration info entries in ObjCCategoriesMap.
Definition ModuleFile.h:527
llvm::BitstreamCursor DeclsCursor
DeclsCursor - This is a cursor to the start of the DECLTYPES_BLOCK block.
Definition ModuleFile.h:503
uint64_t GlobalBitOffset
The global bit offset (or base) of this module.
Definition ModuleFile.h:254
const DeclOffset * DeclOffsets
Offset of each declaration within the bitstream, indexed by the declaration ID (-1).
Definition ModuleFile.h:513
unsigned Generation
The generation of which this module file is a part.
Definition ModuleFile.h:244
uint64_t DeclsBlockStartOffset
The offset to the start of the DECLTYPES_BLOCK block.
Definition ModuleFile.h:506
ModuleKind Kind
The type of this module.
Definition ModuleFile.h:174
SmallVector< uint64_t, 1 > ObjCCategories
The Objective-C category lists for categories known to this module.
Definition ModuleFile.h:531
const unsigned int LOCAL_REDECLARATIONS
Record code for a list of local redeclarations of a declaration.
FriendTemplateDeclKind
Kinds of friend payloads owned by FriendTemplateDecl.
DeclCode
Record codes for each kind of declaration.
const unsigned int DECL_UPDATES
Record of updates for a declaration that was modified after being deserialized.
@ DECL_EMPTY
An EmptyDecl record.
@ DECL_CAPTURED
A CapturedDecl record.
@ DECL_CXX_BASE_SPECIFIERS
A record containing CXXBaseSpecifiers.
@ DECL_CXX_RECORD
A CXXRecordDecl record.
@ DECL_VAR_TEMPLATE_PARTIAL_SPECIALIZATION
A VarTemplatePartialSpecializationDecl record.
@ DECL_OMP_ALLOCATE
An OMPAllocateDcl record.
@ DECL_MS_PROPERTY
A MSPropertyDecl record.
@ DECL_OMP_DECLARE_MAPPER
An OMPDeclareMapperDecl record.
@ DECL_TOP_LEVEL_STMT_DECL
A TopLevelStmtDecl record.
@ DECL_REQUIRES_EXPR_BODY
A RequiresExprBodyDecl record.
@ DECL_STATIC_ASSERT
A StaticAssertDecl record.
@ DECL_INDIRECTFIELD
A IndirectFieldDecl record.
@ DECL_TEMPLATE_TEMPLATE_PARM
A TemplateTemplateParmDecl record.
@ DECL_IMPORT
An ImportDecl recording a module import.
@ DECL_UNNAMED_GLOBAL_CONSTANT
A UnnamedGlobalConstantDecl record.
@ DECL_ACCESS_SPEC
An AccessSpecDecl record.
@ DECL_OBJC_TYPE_PARAM
An ObjCTypeParamDecl record.
@ DECL_OBJC_CATEGORY_IMPL
A ObjCCategoryImplDecl record.
@ DECL_ENUM_CONSTANT
An EnumConstantDecl record.
@ DECL_PARM_VAR
A ParmVarDecl record.
@ DECL_TYPEDEF
A TypedefDecl record.
@ DECL_EXPANDED_TEMPLATE_TEMPLATE_PARM_PACK
A TemplateTemplateParmDecl record that stores an expanded template template parameter pack.
@ DECL_HLSL_BUFFER
A HLSLBufferDecl record.
@ DECL_NAMESPACE_ALIAS
A NamespaceAliasDecl record.
@ DECL_TYPEALIAS
A TypeAliasDecl record.
@ DECL_FUNCTION_TEMPLATE
A FunctionTemplateDecl record.
@ DECL_MS_GUID
A MSGuidDecl record.
@ DECL_UNRESOLVED_USING_TYPENAME
An UnresolvedUsingTypenameDecl record.
@ DECL_CLASS_TEMPLATE_SPECIALIZATION
A ClassTemplateSpecializationDecl record.
@ DECL_EXPANSION_STMT
A C++ expansion statement.
@ DECL_FILE_SCOPE_ASM
A FileScopeAsmDecl record.
@ DECL_CXX_CONSTRUCTOR
A CXXConstructorDecl record.
@ DECL_CXX_CONVERSION
A CXXConversionDecl record.
@ DECL_FIELD
A FieldDecl record.
@ DECL_LINKAGE_SPEC
A LinkageSpecDecl record.
@ DECL_CONTEXT_TU_LOCAL_VISIBLE
A record that stores the set of declarations that are only visible to the TU.
@ DECL_NAMESPACE
A NamespaceDecl record.
@ DECL_NON_TYPE_TEMPLATE_PARM
A NonTypeTemplateParmDecl record.
@ DECL_USING_PACK
A UsingPackDecl record.
@ DECL_FUNCTION
A FunctionDecl record.
@ DECL_USING_DIRECTIVE
A UsingDirecitveDecl record.
@ DECL_RECORD
A RecordDecl record.
@ DECL_CONTEXT_LEXICAL
A record that stores the set of declarations that are lexically stored within a given DeclContext.
@ DECL_OUTLINEDFUNCTION
A OutlinedFunctionDecl record.
@ DECL_BLOCK
A BlockDecl record.
@ DECL_UNRESOLVED_USING_VALUE
An UnresolvedUsingValueDecl record.
@ DECL_TYPE_ALIAS_TEMPLATE
A TypeAliasTemplateDecl record.
@ DECL_CXX_CTOR_INITIALIZERS
A record containing CXXCtorInitializers.
@ DECL_OBJC_CATEGORY
A ObjCCategoryDecl record.
@ DECL_VAR
A VarDecl record.
@ DECL_UNRESOLVED_USING_IF_EXISTS
An UnresolvedUsingIfExistsDecl record.
@ DECL_USING
A UsingDecl record.
@ DECL_OBJC_PROTOCOL
A ObjCProtocolDecl record.
@ DECL_TEMPLATE_TYPE_PARM
A TemplateTypeParmDecl record.
@ DECL_VAR_TEMPLATE_SPECIALIZATION
A VarTemplateSpecializationDecl record.
@ DECL_OBJC_IMPLEMENTATION
A ObjCImplementationDecl record.
@ DECL_LABEL
A LabelDecl record.
@ DECL_OBJC_COMPATIBLE_ALIAS
A ObjCCompatibleAliasDecl record.
@ DECL_CONSTRUCTOR_USING_SHADOW
A ConstructorUsingShadowDecl record.
@ DECL_USING_ENUM
A UsingEnumDecl record.
@ DECL_FRIEND_TEMPLATE
A FriendTemplateDecl record.
@ DECL_PRAGMA_DETECT_MISMATCH
A PragmaDetectMismatchDecl record.
@ DECL_EXPANDED_NON_TYPE_TEMPLATE_PARM_PACK
A NonTypeTemplateParmDecl record that stores an expanded non-type template parameter pack.
@ DECL_OBJC_AT_DEFS_FIELD
A ObjCAtDefsFieldDecl record.
@ DECL_IMPLICIT_PARAM
An ImplicitParamDecl record.
@ DECL_FRIEND
A FriendDecl record.
@ DECL_CXX_METHOD
A CXXMethodDecl record.
@ DECL_EXPORT
An ExportDecl record.
@ DECL_BINDING
A BindingDecl record.
@ DECL_PRAGMA_COMMENT
A PragmaCommentDecl record.
@ DECL_ENUM
An EnumDecl record.
@ DECL_CONTEXT_MODULE_LOCAL_VISIBLE
A record containing the set of declarations that are only visible from DeclContext in the same module...
@ DECL_DECOMPOSITION
A DecompositionDecl record.
@ DECL_OMP_DECLARE_REDUCTION
An OMPDeclareReductionDecl record.
@ DECL_OMP_THREADPRIVATE
An OMPThreadPrivateDecl record.
@ DECL_OBJC_METHOD
A ObjCMethodDecl record.
@ DECL_CXX_DESTRUCTOR
A CXXDestructorDecl record.
@ DECL_EXPLICIT_INSTANTIATION
An ExplicitInstantiationDecl record.
@ DECL_OMP_CAPTUREDEXPR
An OMPCapturedExprDecl record.
@ DECL_CLASS_TEMPLATE
A ClassTemplateDecl record.
@ DECL_USING_SHADOW
A UsingShadowDecl record.
@ DECL_CONCEPT
A ConceptDecl record.
@ DECL_CXX_DEDUCTION_GUIDE
A CXXDeductionGuideDecl record.
@ DECL_OMP_REQUIRES
An OMPRequiresDecl record.
@ DECL_OBJC_IVAR
A ObjCIvarDecl record.
@ DECL_OBJC_PROPERTY
A ObjCPropertyDecl record.
@ DECL_TEMPLATE_PARAM_OBJECT
A TemplateParamObjectDecl record.
@ DECL_OBJC_INTERFACE
A ObjCInterfaceDecl record.
@ DECL_VAR_TEMPLATE
A VarTemplateDecl record.
@ DECL_LIFETIME_EXTENDED_TEMPORARY
An LifetimeExtendedTemporaryDecl record.
@ DECL_CLASS_TEMPLATE_PARTIAL_SPECIALIZATION
A ClassTemplatePartialSpecializationDecl record.
@ DECL_IMPLICIT_CONCEPT_SPECIALIZATION
An ImplicitConceptSpecializationDecl record.
@ DECL_CONTEXT_VISIBLE
A record that stores the set of declarations that are visible from a given DeclContext.
@ DECL_OBJC_PROPERTY_IMPL
A ObjCPropertyImplDecl record.
Defines the Linkage enumeration and various utility functions.
const internal::VariadicAllOfMatcher< Decl > decl
Matches declarations.
@ Number
Just a number, nothing else.
Definition Primitives.h:26
ComparisonCategoryResult Compare(const T &X, const T &Y)
Helper to compare two comparable types.
Definition Primitives.h:42
std::variant< struct RequiresDecl, struct HeaderDecl, struct UmbrellaDirDecl, struct ModuleDecl, struct ExcludeDecl, struct ExportDecl, struct ExportAsDecl, struct ExternModuleDecl, struct UseDecl, struct LinkDecl, struct ConfigMacrosDecl, struct ConflictDecl > Decl
All declarations that can appear in a module declaration.
bool needsAnonymousDeclarationNumber(const NamedDecl *D)
Determine whether the given declaration needs an anonymous declaration number.
void numberAnonymousDeclsWithin(const DeclContext *DC, Fn Visit)
Visit each declaration within DC that needs an anonymous declaration number and call Visit with the d...
Definition ASTCommon.h:76
uint64_t TypeID
An ID number that refers to a type in an AST file.
Definition ASTBitCodes.h:88
@ MK_MainFile
File is a PCH file treated as the actual main file.
Definition ModuleFile.h:58
uint32_t SubmoduleID
An ID number that refers to a submodule in a module file.
bool isPartOfPerModuleInitializer(const Decl *D)
Determine whether the given declaration will be included in the per-module initializer if it needs to...
Definition ASTCommon.h:96
Top level wrappers for InstallAPI frontend operations.
OpenACCDirectiveKind
bool isa(CodeGen::Address addr)
Definition Address.h:330
SelectorLocationsKind
Whether all locations of the selector identifiers are in a "standard" position.
LazyOffsetPtr< Stmt, uint64_t, &ExternalASTSource::GetExternalDeclStmt > LazyDeclStmtPtr
A lazy pointer to a statement.
PragmaMSCommentKind
Definition PragmaKinds.h:14
bool isUnresolvedExceptionSpec(ExceptionSpecificationType ESpecType)
ConstexprSpecKind
Define the kind of constexpr specifier.
Definition Specifiers.h:36
LinkageSpecLanguageIDs
Represents the language in a linkage specification.
Definition DeclCXX.h:3037
LambdaCaptureKind
The different capture forms in a lambda introducer.
Definition Lambda.h:33
@ LCK_ByCopy
Capturing by copy (a.k.a., by value)
Definition Lambda.h:36
@ LCK_ByRef
Capturing by reference.
Definition Lambda.h:37
@ LCK_VLAType
Capturing variable-length array type.
Definition Lambda.h:38
@ LCK_StarThis
Capturing the *this object by copy.
Definition Lambda.h:35
@ LCK_This
Capturing the *this object by reference.
Definition Lambda.h:34
AccessSpecifier
A C++ access specifier (public, private, protected), plus the special value "none" which means differ...
Definition Specifiers.h:124
SmallVector< Attr *, 4 > AttrVec
AttrVec - A vector of Attr, which is how they are stored on the AST.
OMPDeclareReductionInitKind
Definition DeclOpenMP.h:223
StorageClass
Storage classes.
Definition Specifiers.h:249
@ SC_Extern
Definition Specifiers.h:252
Linkage
Describes the different kinds of linkage (C++ [basic.link], C99 6.2.2) that an entity may have.
Definition Linkage.h:24
@ None
No linkage, which means that the entity is unique and can only be referred to from within its scope.
Definition Linkage.h:30
@ Result
The result type of a method or function.
Definition TypeBase.h:906
OptionalUnsigned< unsigned > UnsignedOrNone
const FunctionProtoType * T
@ Template
We are parsing a template declaration.
Definition Parser.h:81
TagTypeKind
The kind of a tag type.
Definition TypeBase.h:6021
@ VarTemplate
The name was classified as a variable template name.
Definition Sema.h:579
ObjCImplementationControl
Definition DeclObjC.h:118
RecordArgPassingKind
Enum that represents the different ways arguments are passed to and returned from function calls.
Definition Decl.h:4437
static bool isUndeducedReturnType(QualType T)
bool operator!=(CanQual< T > x, CanQual< U > y)
TemplateNameKind
Specifies the kind of template name that an identifier refers to.
@ LCD_None
Definition Lambda.h:23
DeductionCandidate
Only used by CXXDeductionGuideDecl.
Definition DeclBase.h:1438
bool shouldSkipCheckingODR(const Decl *D)
Definition ASTReader.h:2697
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
Definition DeclBase.h:1305
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
Definition Specifiers.h:189
U cast(CodeGen::Address addr)
Definition Address.h:327
@ Interface
The "__interface" keyword introduces the elaborated-type-specifier.
Definition TypeBase.h:6001
@ Class
The "class" keyword introduces the elaborated-type-specifier.
Definition TypeBase.h:6007
@ Other
Other implicit parameter.
Definition Decl.h:1775
unsigned long uint64_t
Represents an explicit template argument list in C++, e.g., the "<int>" in "sort<int>".
Structure used to store a statement, the constant value to which it was evaluated (if any),...
Definition Decl.h:886
unsigned WasEvaluated
Whether this statement was already evaluated.
Definition Decl.h:889
unsigned HasConstantInitialization
Whether this variable is known to have constant initialization.
Definition Decl.h:900
LazyDeclStmtPtr Value
Definition Decl.h:922
unsigned HasSideEffects
Definition Decl.h:918
APValue Evaluated
Definition Decl.h:923
unsigned CheckedForSideEffects
Definition Decl.h:920
unsigned HasConstantDestruction
Whether this variable is known to have constant destruction.
Definition Decl.h:908
Provides information about an explicit instantiation of a variable or class template.
SourceLocation ExternKeywordLoc
The location of the extern keyword.
Data that is common to all of the declarations of a given function template.
llvm::FoldingSetVector< FunctionTemplateSpecializationInfo > Specializations
The function template specializations for this function template, including explicit specializations ...
uint16_t Part2
...-89ab-...
Definition DeclCXX.h:4430
uint32_t Part1
{01234567-...
Definition DeclCXX.h:4428
uint16_t Part3
...-cdef-...
Definition DeclCXX.h:4432
uint8_t Part4And5[8]
...-0123-456789abcdef}
Definition DeclCXX.h:4434
static constexpr OptionalUnsigned fromInternalRepresentation(underlying_type Rep)
llvm::DenseSet< std::tuple< Decl *, Decl *, int > > NonEquivalentDeclSet
Store declaration pairs already found to be non-equivalent.