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