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