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 Existing = ExistingInfo->getFunction();
1000 }
1001 }
1002 break;
1003 }
1005 // Templates.
1006 UnresolvedSet<8> Candidates;
1007 unsigned NumCandidates = Record.readInt();
1008 while (NumCandidates--)
1009 Candidates.addDecl(readDeclAs<NamedDecl>());
1010
1011 // Templates args.
1012 TemplateArgumentListInfo TemplArgsWritten;
1013 bool HasTemplateArgumentsAsWritten = Record.readBool();
1014 if (HasTemplateArgumentsAsWritten)
1015 Record.readTemplateArgumentListInfo(TemplArgsWritten);
1016
1018 Reader.getContext(), Candidates,
1019 HasTemplateArgumentsAsWritten ? &TemplArgsWritten : nullptr);
1020 // These are not merged; we don't need to merge redeclarations of dependent
1021 // template friends.
1022 break;
1023 }
1024 }
1025
1027
1028 // Attach a type to this function. Use the real type if possible, but fall
1029 // back to the type as written if it involves a deduced return type.
1030 if (FD->getTypeSourceInfo() && FD->getTypeSourceInfo()
1031 ->getType()
1032 ->castAs<FunctionType>()
1033 ->getReturnType()
1035 // We'll set up the real type in Visit, once we've finished loading the
1036 // function.
1037 FD->setType(FD->getTypeSourceInfo()->getType());
1038 Reader.PendingDeducedFunctionTypes.push_back({FD, DeferredTypeID});
1039 } else {
1040 FD->setType(Reader.GetType(DeferredTypeID));
1041 }
1042 DeferredTypeID = 0;
1043
1044 FD->DNLoc = Record.readDeclarationNameLoc(FD->getDeclName());
1045 FD->IdentifierNamespace = Record.readInt();
1046
1047 // FunctionDecl's body is handled last at ASTDeclReader::Visit,
1048 // after everything else is read.
1049 BitsUnpacker FunctionDeclBits(Record.readInt());
1050
1051 FD->setCachedLinkage((Linkage)FunctionDeclBits.getNextBits(/*Width=*/3));
1052 FD->setStorageClass((StorageClass)FunctionDeclBits.getNextBits(/*Width=*/3));
1053 FD->setInlineSpecified(FunctionDeclBits.getNextBit());
1054 FD->setImplicitlyInline(FunctionDeclBits.getNextBit());
1055 FD->setHasSkippedBody(FunctionDeclBits.getNextBit());
1056 FD->setVirtualAsWritten(FunctionDeclBits.getNextBit());
1057 // We defer calling `FunctionDecl::setPure()` here as for methods of
1058 // `CXXTemplateSpecializationDecl`s, we may not have connected up the
1059 // definition (which is required for `setPure`).
1060 const bool Pure = FunctionDeclBits.getNextBit();
1061 FD->setHasInheritedPrototype(FunctionDeclBits.getNextBit());
1062 FD->setHasWrittenPrototype(FunctionDeclBits.getNextBit());
1063 FD->setDeletedAsWritten(FunctionDeclBits.getNextBit());
1064 FD->setTrivial(FunctionDeclBits.getNextBit());
1065 FD->setTrivialForCall(FunctionDeclBits.getNextBit());
1066 FD->setDefaulted(FunctionDeclBits.getNextBit());
1067 FD->setExplicitlyDefaulted(FunctionDeclBits.getNextBit());
1068 FD->setIneligibleOrNotSelected(FunctionDeclBits.getNextBit());
1069 FD->setConstexprKind(
1070 (ConstexprSpecKind)FunctionDeclBits.getNextBits(/*Width=*/2));
1071 FD->setHasImplicitReturnZero(FunctionDeclBits.getNextBit());
1072 FD->setIsMultiVersion(FunctionDeclBits.getNextBit());
1073 FD->setLateTemplateParsed(FunctionDeclBits.getNextBit());
1074 FD->setInstantiatedFromMemberTemplate(FunctionDeclBits.getNextBit());
1076 FunctionDeclBits.getNextBit());
1077 FD->setUsesSEHTry(FunctionDeclBits.getNextBit());
1078 FD->setIsDestroyingOperatorDelete(FunctionDeclBits.getNextBit());
1079 FD->setIsTypeAwareOperatorNewOrDelete(FunctionDeclBits.getNextBit());
1080
1081 FD->EndRangeLoc = readSourceLocation();
1082 if (FD->isExplicitlyDefaulted())
1083 FD->setDefaultLoc(readSourceLocation());
1084
1085 FD->ODRHash = Record.readInt();
1086 FD->setHasODRHash(true);
1087
1088 if (FD->isDefaulted() || FD->isDeletedAsWritten()) {
1089 // If 'Info' is nonzero, we need to read an DefaultedOrDeletedInfo; if,
1090 // additionally, the second bit is also set, we also need to read
1091 // a DeletedMessage for the DefaultedOrDeletedInfo.
1092 if (auto Info = Record.readInt()) {
1093 bool HasMessage = Info & 2;
1094 StringLiteral *DeletedMessage =
1095 HasMessage ? cast<StringLiteral>(Record.readExpr()) : nullptr;
1096
1097 unsigned NumLookups = Record.readInt();
1099 for (unsigned I = 0; I != NumLookups; ++I) {
1100 NamedDecl *ND = Record.readDeclAs<NamedDecl>();
1101 AccessSpecifier AS = (AccessSpecifier)Record.readInt();
1102 Lookups.push_back(DeclAccessPair::make(ND, AS));
1103 }
1104
1107 Reader.getContext(), Lookups, DeletedMessage));
1108 }
1109 }
1110
1111 if (Existing)
1112 MergeImpl.mergeRedeclarable(FD, Existing, Redecl);
1113 else if (auto Kind = FD->getTemplatedKind();
1116 // Function Templates have their FunctionTemplateDecls merged instead of
1117 // their FunctionDecls.
1118 auto merge = [this, &Redecl, FD](auto &&F) {
1119 auto *Existing = cast_or_null<FunctionDecl>(Redecl.getKnownMergeTarget());
1120 RedeclarableResult NewRedecl(Existing ? F(Existing) : nullptr,
1121 Redecl.getFirstID(), Redecl.isKeyDecl());
1122 mergeRedeclarableTemplate(F(FD), NewRedecl);
1123 };
1125 merge(
1126 [](FunctionDecl *FD) { return FD->getDescribedFunctionTemplate(); });
1127 else
1128 merge([](FunctionDecl *FD) {
1130 });
1131 } else
1132 mergeRedeclarable(FD, Redecl);
1133
1134 // Defer calling `setPure` until merging above has guaranteed we've set
1135 // `DefinitionData` (as this will need to access it).
1136 FD->setIsPureVirtual(Pure);
1137
1138 // Read in the parameters.
1139 unsigned NumParams = Record.readInt();
1141 Params.reserve(NumParams);
1142 for (unsigned I = 0; I != NumParams; ++I)
1143 Params.push_back(readDeclAs<ParmVarDecl>());
1144 FD->setParams(Reader.getContext(), Params);
1145
1146 // If the declaration is a SYCL kernel entry point function as indicated by
1147 // the presence of a sycl_kernel_entry_point attribute, register it so that
1148 // associated metadata is recreated.
1149 if (FD->hasAttr<SYCLKernelEntryPointAttr>()) {
1150 auto *SKEPAttr = FD->getAttr<SYCLKernelEntryPointAttr>();
1151 ASTContext &C = Reader.getContext();
1152 const SYCLKernelInfo *SKI = C.findSYCLKernelInfo(SKEPAttr->getKernelName());
1153 if (SKI) {
1155 Reader.Diag(FD->getLocation(), diag::err_sycl_kernel_name_conflict)
1156 << SKEPAttr;
1157 Reader.Diag(SKI->getKernelEntryPointDecl()->getLocation(),
1158 diag::note_previous_declaration);
1159 SKEPAttr->setInvalidAttr();
1160 }
1161 } else {
1162 C.registerSYCLEntryPointFunction(FD);
1163 }
1164 }
1165}
1166
1168 VisitNamedDecl(MD);
1169 if (Record.readInt()) {
1170 // Load the body on-demand. Most clients won't care, because method
1171 // definitions rarely show up in headers.
1172 Reader.PendingBodies[MD] = GetCurrentCursorOffset();
1173 }
1174 MD->setSelfDecl(readDeclAs<ImplicitParamDecl>());
1175 MD->setCmdDecl(readDeclAs<ImplicitParamDecl>());
1176 MD->setInstanceMethod(Record.readInt());
1177 MD->setVariadic(Record.readInt());
1178 MD->setPropertyAccessor(Record.readInt());
1179 MD->setSynthesizedAccessorStub(Record.readInt());
1180 MD->setDefined(Record.readInt());
1181 MD->setOverriding(Record.readInt());
1182 MD->setHasSkippedBody(Record.readInt());
1183
1184 MD->setIsRedeclaration(Record.readInt());
1185 MD->setHasRedeclaration(Record.readInt());
1186 if (MD->hasRedeclaration())
1187 Reader.getContext().setObjCMethodRedeclaration(MD,
1188 readDeclAs<ObjCMethodDecl>());
1189
1191 static_cast<ObjCImplementationControl>(Record.readInt()));
1192 MD->setObjCDeclQualifier((Decl::ObjCDeclQualifier)Record.readInt());
1193 MD->setRelatedResultType(Record.readInt());
1194 MD->setReturnType(Record.readType());
1195 MD->setReturnTypeSourceInfo(readTypeSourceInfo());
1196 MD->DeclEndLoc = readSourceLocation();
1197 unsigned NumParams = Record.readInt();
1199 Params.reserve(NumParams);
1200 for (unsigned I = 0; I != NumParams; ++I)
1201 Params.push_back(readDeclAs<ParmVarDecl>());
1202
1203 MD->setSelLocsKind((SelectorLocationsKind)Record.readInt());
1204 unsigned NumStoredSelLocs = Record.readInt();
1206 SelLocs.reserve(NumStoredSelLocs);
1207 for (unsigned i = 0; i != NumStoredSelLocs; ++i)
1208 SelLocs.push_back(readSourceLocation());
1209
1210 MD->setParamsAndSelLocs(Reader.getContext(), Params, SelLocs);
1211}
1212
1215
1216 D->Variance = Record.readInt();
1217 D->Index = Record.readInt();
1218 D->VarianceLoc = readSourceLocation();
1219 D->ColonLoc = readSourceLocation();
1220}
1221
1223 VisitNamedDecl(CD);
1224 CD->setAtStartLoc(readSourceLocation());
1225 CD->setAtEndRange(readSourceRange());
1226}
1227
1229 unsigned numParams = Record.readInt();
1230 if (numParams == 0)
1231 return nullptr;
1232
1234 typeParams.reserve(numParams);
1235 for (unsigned i = 0; i != numParams; ++i) {
1236 auto *typeParam = readDeclAs<ObjCTypeParamDecl>();
1237 if (!typeParam)
1238 return nullptr;
1239
1240 typeParams.push_back(typeParam);
1241 }
1242
1243 SourceLocation lAngleLoc = readSourceLocation();
1244 SourceLocation rAngleLoc = readSourceLocation();
1245
1246 return ObjCTypeParamList::create(Reader.getContext(), lAngleLoc,
1247 typeParams, rAngleLoc);
1248}
1249
1250void ASTDeclReader::ReadObjCDefinitionData(
1251 struct ObjCInterfaceDecl::DefinitionData &Data) {
1252 // Read the superclass.
1253 Data.SuperClassTInfo = readTypeSourceInfo();
1254
1255 Data.EndLoc = readSourceLocation();
1256 Data.HasDesignatedInitializers = Record.readInt();
1257 Data.ODRHash = Record.readInt();
1258 Data.HasODRHash = true;
1259
1260 // Read the directly referenced protocols and their SourceLocations.
1261 unsigned NumProtocols = Record.readInt();
1263 Protocols.reserve(NumProtocols);
1264 for (unsigned I = 0; I != NumProtocols; ++I)
1265 Protocols.push_back(readDeclAs<ObjCProtocolDecl>());
1267 ProtoLocs.reserve(NumProtocols);
1268 for (unsigned I = 0; I != NumProtocols; ++I)
1269 ProtoLocs.push_back(readSourceLocation());
1270 Data.ReferencedProtocols.set(Protocols.data(), NumProtocols, ProtoLocs.data(),
1271 Reader.getContext());
1272
1273 // Read the transitive closure of protocols referenced by this class.
1274 NumProtocols = Record.readInt();
1275 Protocols.clear();
1276 Protocols.reserve(NumProtocols);
1277 for (unsigned I = 0; I != NumProtocols; ++I)
1278 Protocols.push_back(readDeclAs<ObjCProtocolDecl>());
1279 Data.AllReferencedProtocols.set(Protocols.data(), NumProtocols,
1280 Reader.getContext());
1281}
1282
1284 ObjCInterfaceDecl *D, struct ObjCInterfaceDecl::DefinitionData &&NewDD) {
1285 struct ObjCInterfaceDecl::DefinitionData &DD = D->data();
1286 if (DD.Definition == NewDD.Definition)
1287 return;
1288
1289 Reader.MergedDeclContexts.insert(
1290 std::make_pair(NewDD.Definition, DD.Definition));
1291 Reader.mergeDefinitionVisibility(DD.Definition, NewDD.Definition);
1292
1293 if (D->getODRHash() != NewDD.ODRHash)
1294 Reader.PendingObjCInterfaceOdrMergeFailures[DD.Definition].push_back(
1295 {NewDD.Definition, &NewDD});
1296}
1297
1299 RedeclarableResult Redecl = VisitRedeclarable(ID);
1301 DeferredTypeID = Record.getGlobalTypeID(Record.readInt());
1302 mergeRedeclarable(ID, Redecl);
1303
1304 ID->TypeParamList = ReadObjCTypeParamList();
1305 if (Record.readInt()) {
1306 // Read the definition.
1307 ID->allocateDefinitionData();
1308
1309 ReadObjCDefinitionData(ID->data());
1310 ObjCInterfaceDecl *Canon = ID->getCanonicalDecl();
1311 if (Canon->Data.getPointer()) {
1312 // If we already have a definition, keep the definition invariant and
1313 // merge the data.
1314 MergeImpl.MergeDefinitionData(Canon, std::move(ID->data()));
1315 ID->Data = Canon->Data;
1316 } else {
1317 // Set the definition data of the canonical declaration, so other
1318 // redeclarations will see it.
1319 ID->getCanonicalDecl()->Data = ID->Data;
1320
1321 // We will rebuild this list lazily.
1322 ID->setIvarList(nullptr);
1323 }
1324
1325 // Note that we have deserialized a definition.
1326 Reader.PendingDefinitions.insert(ID);
1327
1328 // Note that we've loaded this Objective-C class.
1329 Reader.ObjCClassesLoaded.push_back(ID);
1330 } else {
1331 ID->Data = ID->getCanonicalDecl()->Data;
1332 }
1333}
1334
1336 VisitFieldDecl(IVD);
1337 IVD->setAccessControl((ObjCIvarDecl::AccessControl)Record.readInt());
1338 // This field will be built lazily.
1339 IVD->setNextIvar(nullptr);
1340 bool synth = Record.readInt();
1341 IVD->setSynthesize(synth);
1342
1343 // Check ivar redeclaration.
1344 if (IVD->isInvalidDecl())
1345 return;
1346 // Don't check ObjCInterfaceDecl as interfaces are named and mismatches can be
1347 // detected in VisitObjCInterfaceDecl. Here we are looking for redeclarations
1348 // in extensions.
1350 return;
1351 ObjCInterfaceDecl *CanonIntf =
1353 IdentifierInfo *II = IVD->getIdentifier();
1354 ObjCIvarDecl *PrevIvar = CanonIntf->lookupInstanceVariable(II);
1355 if (PrevIvar && PrevIvar != IVD) {
1356 auto *ParentExt = dyn_cast<ObjCCategoryDecl>(IVD->getDeclContext());
1357 auto *PrevParentExt =
1358 dyn_cast<ObjCCategoryDecl>(PrevIvar->getDeclContext());
1359 if (ParentExt && PrevParentExt) {
1360 // Postpone diagnostic as we should merge identical extensions from
1361 // different modules.
1362 Reader
1363 .PendingObjCExtensionIvarRedeclarations[std::make_pair(ParentExt,
1364 PrevParentExt)]
1365 .push_back(std::make_pair(IVD, PrevIvar));
1366 } else if (ParentExt || PrevParentExt) {
1367 // Duplicate ivars in extension + implementation are never compatible.
1368 // Compatibility of implementation + implementation should be handled in
1369 // VisitObjCImplementationDecl.
1370 Reader.Diag(IVD->getLocation(), diag::err_duplicate_ivar_declaration)
1371 << II;
1372 Reader.Diag(PrevIvar->getLocation(), diag::note_previous_definition);
1373 }
1374 }
1375}
1376
1377void ASTDeclReader::ReadObjCDefinitionData(
1378 struct ObjCProtocolDecl::DefinitionData &Data) {
1379 unsigned NumProtoRefs = Record.readInt();
1381 ProtoRefs.reserve(NumProtoRefs);
1382 for (unsigned I = 0; I != NumProtoRefs; ++I)
1383 ProtoRefs.push_back(readDeclAs<ObjCProtocolDecl>());
1385 ProtoLocs.reserve(NumProtoRefs);
1386 for (unsigned I = 0; I != NumProtoRefs; ++I)
1387 ProtoLocs.push_back(readSourceLocation());
1388 Data.ReferencedProtocols.set(ProtoRefs.data(), NumProtoRefs,
1389 ProtoLocs.data(), Reader.getContext());
1390 Data.ODRHash = Record.readInt();
1391 Data.HasODRHash = true;
1392}
1393
1395 ObjCProtocolDecl *D, struct ObjCProtocolDecl::DefinitionData &&NewDD) {
1396 struct ObjCProtocolDecl::DefinitionData &DD = D->data();
1397 if (DD.Definition == NewDD.Definition)
1398 return;
1399
1400 Reader.MergedDeclContexts.insert(
1401 std::make_pair(NewDD.Definition, DD.Definition));
1402 Reader.mergeDefinitionVisibility(DD.Definition, NewDD.Definition);
1403
1404 if (D->getODRHash() != NewDD.ODRHash)
1405 Reader.PendingObjCProtocolOdrMergeFailures[DD.Definition].push_back(
1406 {NewDD.Definition, &NewDD});
1407}
1408
1410 RedeclarableResult Redecl = VisitRedeclarable(PD);
1412 mergeRedeclarable(PD, Redecl);
1413
1414 if (Record.readInt()) {
1415 // Read the definition.
1416 PD->allocateDefinitionData();
1417
1418 ReadObjCDefinitionData(PD->data());
1419
1420 ObjCProtocolDecl *Canon = PD->getCanonicalDecl();
1421 if (Canon->Data.getPointer()) {
1422 // If we already have a definition, keep the definition invariant and
1423 // merge the data.
1424 MergeImpl.MergeDefinitionData(Canon, std::move(PD->data()));
1425 PD->Data = Canon->Data;
1426 } else {
1427 // Set the definition data of the canonical declaration, so other
1428 // redeclarations will see it.
1429 PD->getCanonicalDecl()->Data = PD->Data;
1430 }
1431 // Note that we have deserialized a definition.
1432 Reader.PendingDefinitions.insert(PD);
1433 } else {
1434 PD->Data = PD->getCanonicalDecl()->Data;
1435 }
1436}
1437
1441
1444 CD->setCategoryNameLoc(readSourceLocation());
1445 CD->setIvarLBraceLoc(readSourceLocation());
1446 CD->setIvarRBraceLoc(readSourceLocation());
1447
1448 // Note that this category has been deserialized. We do this before
1449 // deserializing the interface declaration, so that it will consider this
1450 /// category.
1451 Reader.CategoriesDeserialized.insert(CD);
1452
1453 CD->ClassInterface = readDeclAs<ObjCInterfaceDecl>();
1454 CD->TypeParamList = ReadObjCTypeParamList();
1455 unsigned NumProtoRefs = Record.readInt();
1457 ProtoRefs.reserve(NumProtoRefs);
1458 for (unsigned I = 0; I != NumProtoRefs; ++I)
1459 ProtoRefs.push_back(readDeclAs<ObjCProtocolDecl>());
1461 ProtoLocs.reserve(NumProtoRefs);
1462 for (unsigned I = 0; I != NumProtoRefs; ++I)
1463 ProtoLocs.push_back(readSourceLocation());
1464 CD->setProtocolList(ProtoRefs.data(), NumProtoRefs, ProtoLocs.data(),
1465 Reader.getContext());
1466
1467 // Protocols in the class extension belong to the class.
1468 if (NumProtoRefs > 0 && CD->ClassInterface && CD->IsClassExtension())
1469 CD->ClassInterface->mergeClassExtensionProtocolList(
1470 (ObjCProtocolDecl *const *)ProtoRefs.data(), NumProtoRefs,
1471 Reader.getContext());
1472}
1473
1475 VisitNamedDecl(CAD);
1476 CAD->setClassInterface(readDeclAs<ObjCInterfaceDecl>());
1477}
1478
1480 VisitNamedDecl(D);
1481 D->setAtLoc(readSourceLocation());
1482 D->setLParenLoc(readSourceLocation());
1483 QualType T = Record.readType();
1484 TypeSourceInfo *TSI = readTypeSourceInfo();
1485 D->setType(T, TSI);
1488 (ObjCPropertyAttribute::Kind)Record.readInt());
1490 (ObjCPropertyDecl::PropertyControl)Record.readInt());
1491 DeclarationName GetterName = Record.readDeclarationName();
1492 SourceLocation GetterLoc = readSourceLocation();
1493 D->setGetterName(GetterName.getObjCSelector(), GetterLoc);
1494 DeclarationName SetterName = Record.readDeclarationName();
1495 SourceLocation SetterLoc = readSourceLocation();
1496 D->setSetterName(SetterName.getObjCSelector(), SetterLoc);
1497 D->setGetterMethodDecl(readDeclAs<ObjCMethodDecl>());
1498 D->setSetterMethodDecl(readDeclAs<ObjCMethodDecl>());
1499 D->setPropertyIvarDecl(readDeclAs<ObjCIvarDecl>());
1500}
1501
1504 D->setClassInterface(readDeclAs<ObjCInterfaceDecl>());
1505}
1506
1509 D->CategoryNameLoc = readSourceLocation();
1510}
1511
1514 D->setSuperClass(readDeclAs<ObjCInterfaceDecl>());
1515 D->SuperLoc = readSourceLocation();
1516 D->setIvarLBraceLoc(readSourceLocation());
1517 D->setIvarRBraceLoc(readSourceLocation());
1518 D->setHasNonZeroConstructors(Record.readInt());
1519 D->setHasDestructors(Record.readInt());
1520 D->NumIvarInitializers = Record.readInt();
1521 if (D->NumIvarInitializers)
1522 D->IvarInitializers = ReadGlobalOffset();
1523}
1524
1526 VisitDecl(D);
1527 D->setAtLoc(readSourceLocation());
1528 D->setPropertyDecl(readDeclAs<ObjCPropertyDecl>());
1529 D->PropertyIvarDecl = readDeclAs<ObjCIvarDecl>();
1530 D->IvarLoc = readSourceLocation();
1531 D->setGetterMethodDecl(readDeclAs<ObjCMethodDecl>());
1532 D->setSetterMethodDecl(readDeclAs<ObjCMethodDecl>());
1533 D->setGetterCXXConstructor(Record.readExpr());
1534 D->setSetterCXXAssignment(Record.readExpr());
1535}
1536
1539 FD->Mutable = Record.readInt();
1540
1541 unsigned Bits = Record.readInt();
1542 FD->StorageKind = Bits >> 1;
1543 if (FD->StorageKind == FieldDecl::ISK_CapturedVLAType)
1544 FD->CapturedVLAType =
1545 cast<VariableArrayType>(Record.readType().getTypePtr());
1546 else if (Bits & 1)
1547 FD->setBitWidth(Record.readExpr());
1548
1549 if (!FD->getDeclName() ||
1550 FD->isPlaceholderVar(Reader.getContext().getLangOpts())) {
1551 if (auto *Tmpl = readDeclAs<FieldDecl>())
1552 Reader.getContext().setInstantiatedFromUnnamedFieldDecl(FD, Tmpl);
1553 }
1554 mergeMergeable(FD);
1555}
1556
1559 PD->GetterId = Record.readIdentifier();
1560 PD->SetterId = Record.readIdentifier();
1561}
1562
1564 VisitValueDecl(D);
1565 D->PartVal.Part1 = Record.readInt();
1566 D->PartVal.Part2 = Record.readInt();
1567 D->PartVal.Part3 = Record.readInt();
1568 for (auto &C : D->PartVal.Part4And5)
1569 C = Record.readInt();
1570
1571 // Add this GUID to the AST context's lookup structure, and merge if needed.
1572 if (MSGuidDecl *Existing = Reader.getContext().MSGuidDecls.GetOrInsertNode(D))
1573 Reader.getContext().setPrimaryMergedDecl(D, Existing->getCanonicalDecl());
1574}
1575
1578 VisitValueDecl(D);
1579 D->Value = Record.readAPValue();
1580
1581 // Add this to the AST context's lookup structure, and merge if needed.
1582 if (UnnamedGlobalConstantDecl *Existing =
1583 Reader.getContext().UnnamedGlobalConstantDecls.GetOrInsertNode(D))
1584 Reader.getContext().setPrimaryMergedDecl(D, Existing->getCanonicalDecl());
1585}
1586
1588 VisitValueDecl(D);
1589 D->Value = Record.readAPValue();
1590
1591 // Add this template parameter object to the AST context's lookup structure,
1592 // and merge if needed.
1593 if (TemplateParamObjectDecl *Existing =
1594 Reader.getContext().TemplateParamObjectDecls.GetOrInsertNode(D))
1595 Reader.getContext().setPrimaryMergedDecl(D, Existing->getCanonicalDecl());
1596}
1597
1599 VisitValueDecl(FD);
1600
1601 FD->ChainingSize = Record.readInt();
1602 assert(FD->ChainingSize >= 2 && "Anonymous chaining must be >= 2");
1603 FD->Chaining = new (Reader.getContext())NamedDecl*[FD->ChainingSize];
1604
1605 for (unsigned I = 0; I != FD->ChainingSize; ++I)
1606 FD->Chaining[I] = readDeclAs<NamedDecl>();
1607
1608 mergeMergeable(FD);
1609}
1610
1612 RedeclarableResult Redecl = VisitRedeclarable(VD);
1614
1615 BitsUnpacker VarDeclBits(Record.readInt());
1616 auto VarLinkage = Linkage(VarDeclBits.getNextBits(/*Width=*/3));
1617 bool DefGeneratedInModule = VarDeclBits.getNextBit();
1618 VD->VarDeclBits.SClass = (StorageClass)VarDeclBits.getNextBits(/*Width=*/3);
1619 VD->VarDeclBits.TSCSpec = VarDeclBits.getNextBits(/*Width=*/2);
1620 VD->VarDeclBits.InitStyle = VarDeclBits.getNextBits(/*Width=*/2);
1621 VD->VarDeclBits.ARCPseudoStrong = VarDeclBits.getNextBit();
1622 bool HasDeducedType = false;
1623 if (!isa<ParmVarDecl>(VD)) {
1624 VD->NonParmVarDeclBits.IsThisDeclarationADemotedDefinition =
1625 VarDeclBits.getNextBit();
1626 VD->NonParmVarDeclBits.ExceptionVar = VarDeclBits.getNextBit();
1627 VD->NonParmVarDeclBits.NRVOVariable = VarDeclBits.getNextBit();
1628 VD->NonParmVarDeclBits.CXXForRangeDecl = VarDeclBits.getNextBit();
1629
1630 VD->NonParmVarDeclBits.IsInline = VarDeclBits.getNextBit();
1631 VD->NonParmVarDeclBits.IsInlineSpecified = VarDeclBits.getNextBit();
1632 VD->NonParmVarDeclBits.IsConstexpr = VarDeclBits.getNextBit();
1633 VD->NonParmVarDeclBits.IsInitCapture = VarDeclBits.getNextBit();
1634 VD->NonParmVarDeclBits.PreviousDeclInSameBlockScope =
1635 VarDeclBits.getNextBit();
1636
1637 VD->NonParmVarDeclBits.EscapingByref = VarDeclBits.getNextBit();
1638 HasDeducedType = VarDeclBits.getNextBit();
1639 VD->NonParmVarDeclBits.ImplicitParamKind =
1640 VarDeclBits.getNextBits(/*Width*/ 3);
1641
1642 VD->NonParmVarDeclBits.ObjCForDecl = VarDeclBits.getNextBit();
1643 VD->NonParmVarDeclBits.IsCXXForRangeImplicitVar = VarDeclBits.getNextBit();
1644 }
1645
1646 // If this variable has a deduced type, defer reading that type until we are
1647 // done deserializing this variable, because the type might refer back to the
1648 // variable.
1649 if (HasDeducedType)
1650 Reader.PendingDeducedVarTypes.push_back({VD, DeferredTypeID});
1651 else
1652 VD->setType(Reader.GetType(DeferredTypeID));
1653 DeferredTypeID = 0;
1654
1655 VD->setCachedLinkage(VarLinkage);
1656
1657 // Reconstruct the one piece of the IdentifierNamespace that we need.
1658 if (VD->getStorageClass() == SC_Extern && VarLinkage != Linkage::None &&
1660 VD->setLocalExternDecl();
1661
1662 if (DefGeneratedInModule) {
1663 Reader.DefinitionSource[VD] =
1664 Loc.F->Kind == ModuleKind::MK_MainFile ||
1665 Reader.getContext().getLangOpts().BuildingPCHWithObjectFile;
1666 }
1667
1668 if (VD->hasAttr<BlocksAttr>()) {
1669 Expr *CopyExpr = Record.readExpr();
1670 if (CopyExpr)
1671 Reader.getContext().setBlockVarCopyInit(VD, CopyExpr, Record.readInt());
1672 }
1673
1674 enum VarKind {
1675 VarNotTemplate = 0, VarTemplate, StaticDataMemberSpecialization
1676 };
1677 switch ((VarKind)Record.readInt()) {
1678 case VarNotTemplate:
1679 // Only true variables (not parameters or implicit parameters) can be
1680 // merged; the other kinds are not really redeclarable at all.
1681 if (!isa<ParmVarDecl>(VD) && !isa<ImplicitParamDecl>(VD) &&
1683 mergeRedeclarable(VD, Redecl);
1684 break;
1685 case VarTemplate:
1686 // Merged when we merge the template.
1687 VD->setDescribedVarTemplate(readDeclAs<VarTemplateDecl>());
1688 break;
1689 case StaticDataMemberSpecialization: { // HasMemberSpecializationInfo.
1690 auto *Tmpl = readDeclAs<VarDecl>();
1691 auto TSK = (TemplateSpecializationKind)Record.readInt();
1692 SourceLocation POI = readSourceLocation();
1693 Reader.getContext().setInstantiatedFromStaticDataMember(VD, Tmpl, TSK,POI);
1694 mergeRedeclarable(VD, Redecl);
1695 break;
1696 }
1697 }
1698
1699 return Redecl;
1700}
1701
1703 if (uint64_t Val = Record.readInt()) {
1704 EvaluatedStmt *Eval = VD->ensureEvaluatedStmt();
1705 Eval->HasConstantInitialization = (Val & 2) != 0;
1706 Eval->HasConstantDestruction = (Val & 4) != 0;
1707 Eval->WasEvaluated = (Val & 8) != 0;
1708 Eval->HasSideEffects = (Val & 16) != 0;
1709 Eval->CheckedForSideEffects = true;
1710 if (Eval->WasEvaluated) {
1711 Eval->Evaluated = Record.readAPValue();
1712 if (Eval->Evaluated.needsCleanup())
1713 Reader.getContext().addDestruction(&Eval->Evaluated);
1714 }
1715
1716 // Store the offset of the initializer. Don't deserialize it yet: it might
1717 // not be needed, and might refer back to the variable, for example if it
1718 // contains a lambda.
1719 Eval->Value = GetCurrentCursorOffset();
1720 }
1721}
1722
1726
1728 VisitVarDecl(PD);
1729
1730 unsigned scopeIndex = Record.readInt();
1731 BitsUnpacker ParmVarDeclBits(Record.readInt());
1732 unsigned isObjCMethodParam = ParmVarDeclBits.getNextBit();
1733 unsigned scopeDepth = ParmVarDeclBits.getNextBits(/*Width=*/7);
1734 unsigned declQualifier = ParmVarDeclBits.getNextBits(/*Width=*/7);
1735 if (isObjCMethodParam) {
1736 assert(scopeDepth == 0);
1737 PD->setObjCMethodScopeInfo(scopeIndex);
1738 PD->ParmVarDeclBits.ScopeDepthOrObjCQuals = declQualifier;
1739 } else {
1740 PD->setScopeInfo(scopeDepth, scopeIndex);
1741 }
1742 PD->ParmVarDeclBits.IsKNRPromoted = ParmVarDeclBits.getNextBit();
1743
1744 PD->ParmVarDeclBits.HasInheritedDefaultArg = ParmVarDeclBits.getNextBit();
1745 if (ParmVarDeclBits.getNextBit()) // hasUninstantiatedDefaultArg.
1746 PD->setUninstantiatedDefaultArg(Record.readExpr());
1747
1748 if (ParmVarDeclBits.getNextBit()) // Valid explicit object parameter
1749 PD->ExplicitObjectParameterIntroducerLoc = Record.readSourceLocation();
1750
1751 // FIXME: If this is a redeclaration of a function from another module, handle
1752 // inheritance of default arguments.
1753}
1754
1756 VisitVarDecl(DD);
1757 auto **BDs = DD->getTrailingObjects();
1758 for (unsigned I = 0; I != DD->NumBindings; ++I) {
1759 BDs[I] = readDeclAs<BindingDecl>();
1760 BDs[I]->setDecomposedDecl(DD);
1761 }
1762}
1763
1765 VisitValueDecl(BD);
1766 BD->Binding = Record.readExpr();
1767}
1768
1770 VisitDecl(AD);
1771 AD->setAsmString(cast<StringLiteral>(Record.readExpr()));
1772 AD->setRParenLoc(readSourceLocation());
1773}
1774
1776 VisitDecl(D);
1777 D->Statement = Record.readStmt();
1778}
1779
1781 VisitDecl(BD);
1782 BD->setBody(cast_or_null<CompoundStmt>(Record.readStmt()));
1783 BD->setSignatureAsWritten(readTypeSourceInfo());
1784 unsigned NumParams = Record.readInt();
1786 Params.reserve(NumParams);
1787 for (unsigned I = 0; I != NumParams; ++I)
1788 Params.push_back(readDeclAs<ParmVarDecl>());
1789 BD->setParams(Params);
1790
1791 BD->setIsVariadic(Record.readInt());
1792 BD->setBlockMissingReturnType(Record.readInt());
1793 BD->setIsConversionFromLambda(Record.readInt());
1794 BD->setDoesNotEscape(Record.readInt());
1795 BD->setCanAvoidCopyToHeap(Record.readInt());
1796
1797 bool capturesCXXThis = Record.readInt();
1798 unsigned numCaptures = Record.readInt();
1800 captures.reserve(numCaptures);
1801 for (unsigned i = 0; i != numCaptures; ++i) {
1802 auto *decl = readDeclAs<VarDecl>();
1803 unsigned flags = Record.readInt();
1804 bool byRef = (flags & 1);
1805 bool nested = (flags & 2);
1806 Expr *copyExpr = ((flags & 4) ? Record.readExpr() : nullptr);
1807
1808 captures.push_back(BlockDecl::Capture(decl, byRef, nested, copyExpr));
1809 }
1810 BD->setCaptures(Reader.getContext(), captures, capturesCXXThis);
1811}
1812
1814 // NumParams is deserialized by OutlinedFunctionDecl::CreateDeserialized().
1815 VisitDecl(D);
1816 for (unsigned I = 0; I < D->NumParams; ++I)
1817 D->setParam(I, readDeclAs<ImplicitParamDecl>());
1818 D->setNothrow(Record.readInt() != 0);
1819 D->setBody(cast_or_null<Stmt>(Record.readStmt()));
1820}
1821
1823 VisitDecl(CD);
1824 unsigned ContextParamPos = Record.readInt();
1825 CD->setNothrow(Record.readInt() != 0);
1826 // Body is set by VisitCapturedStmt.
1827 for (unsigned I = 0; I < CD->NumParams; ++I) {
1828 if (I != ContextParamPos)
1829 CD->setParam(I, readDeclAs<ImplicitParamDecl>());
1830 else
1831 CD->setContextParam(I, readDeclAs<ImplicitParamDecl>());
1832 }
1833}
1834
1836 VisitDecl(D);
1837 D->setLanguage(static_cast<LinkageSpecLanguageIDs>(Record.readInt()));
1838 D->setExternLoc(readSourceLocation());
1839 D->setRBraceLoc(readSourceLocation());
1840}
1841
1843 VisitDecl(D);
1844 D->RBraceLoc = readSourceLocation();
1845}
1846
1848 VisitNamedDecl(D);
1849 D->setLocStart(readSourceLocation());
1850}
1851
1853 RedeclarableResult Redecl = VisitRedeclarable(D);
1854 VisitNamedDecl(D);
1855
1856 BitsUnpacker NamespaceDeclBits(Record.readInt());
1857 D->setInline(NamespaceDeclBits.getNextBit());
1858 D->setNested(NamespaceDeclBits.getNextBit());
1859 D->LocStart = readSourceLocation();
1860 D->RBraceLoc = readSourceLocation();
1861
1862 // Defer loading the anonymous namespace until we've finished merging
1863 // this namespace; loading it might load a later declaration of the
1864 // same namespace, and we have an invariant that older declarations
1865 // get merged before newer ones try to merge.
1866 GlobalDeclID AnonNamespace;
1867 if (Redecl.getFirstID() == ThisDeclID)
1868 AnonNamespace = readDeclID();
1869
1870 mergeRedeclarable(D, Redecl);
1871
1872 if (AnonNamespace.isValid()) {
1873 // Each module has its own anonymous namespace, which is disjoint from
1874 // any other module's anonymous namespaces, so don't attach the anonymous
1875 // namespace at all.
1876 auto *Anon = cast<NamespaceDecl>(Reader.GetDecl(AnonNamespace));
1877 if (!Record.isModule())
1878 D->setAnonymousNamespace(Anon);
1879 }
1880}
1881
1883 VisitNamedDecl(D);
1884 LookupBlockOffsets Offsets;
1885 VisitDeclContext(D, Offsets);
1886 D->IsCBuffer = Record.readBool();
1887 D->KwLoc = readSourceLocation();
1888 D->LBraceLoc = readSourceLocation();
1889 D->RBraceLoc = readSourceLocation();
1890}
1891
1893 RedeclarableResult Redecl = VisitRedeclarable(D);
1894 VisitNamedDecl(D);
1895 D->NamespaceLoc = readSourceLocation();
1896 D->IdentLoc = readSourceLocation();
1897 D->QualifierLoc = Record.readNestedNameSpecifierLoc();
1898 D->Namespace = readDeclAs<NamespaceBaseDecl>();
1899 mergeRedeclarable(D, Redecl);
1900}
1901
1903 VisitNamedDecl(D);
1904 D->setUsingLoc(readSourceLocation());
1905 D->QualifierLoc = Record.readNestedNameSpecifierLoc();
1906 D->DNLoc = Record.readDeclarationNameLoc(D->getDeclName());
1907 D->FirstUsingShadow.setPointer(readDeclAs<UsingShadowDecl>());
1908 D->setTypename(Record.readInt());
1909 if (auto *Pattern = readDeclAs<NamedDecl>())
1910 Reader.getContext().setInstantiatedFromUsingDecl(D, Pattern);
1911 mergeMergeable(D);
1912}
1913
1915 VisitNamedDecl(D);
1916 D->setUsingLoc(readSourceLocation());
1917 D->setEnumLoc(readSourceLocation());
1918 D->setEnumType(Record.readTypeSourceInfo());
1919 D->FirstUsingShadow.setPointer(readDeclAs<UsingShadowDecl>());
1920 if (auto *Pattern = readDeclAs<UsingEnumDecl>())
1921 Reader.getContext().setInstantiatedFromUsingEnumDecl(D, Pattern);
1922 mergeMergeable(D);
1923}
1924
1926 VisitNamedDecl(D);
1927 D->InstantiatedFrom = readDeclAs<NamedDecl>();
1928 auto **Expansions = D->getTrailingObjects();
1929 for (unsigned I = 0; I != D->NumExpansions; ++I)
1930 Expansions[I] = readDeclAs<NamedDecl>();
1931 mergeMergeable(D);
1932}
1933
1935 RedeclarableResult Redecl = VisitRedeclarable(D);
1936 VisitNamedDecl(D);
1937 D->Underlying = readDeclAs<NamedDecl>();
1938 D->IdentifierNamespace = Record.readInt();
1939 D->UsingOrNextShadow = readDeclAs<NamedDecl>();
1940 auto *Pattern = readDeclAs<UsingShadowDecl>();
1941 if (Pattern)
1942 Reader.getContext().setInstantiatedFromUsingShadowDecl(D, Pattern);
1943 mergeRedeclarable(D, Redecl);
1944}
1945
1949 D->NominatedBaseClassShadowDecl = readDeclAs<ConstructorUsingShadowDecl>();
1950 D->ConstructedBaseClassShadowDecl = readDeclAs<ConstructorUsingShadowDecl>();
1951 D->IsVirtual = Record.readInt();
1952}
1953
1955 VisitNamedDecl(D);
1956 D->UsingLoc = readSourceLocation();
1957 D->NamespaceLoc = readSourceLocation();
1958 D->QualifierLoc = Record.readNestedNameSpecifierLoc();
1959 D->NominatedNamespace = readDeclAs<NamedDecl>();
1960 D->CommonAncestor = readDeclAs<DeclContext>();
1961}
1962
1964 VisitValueDecl(D);
1965 D->setUsingLoc(readSourceLocation());
1966 D->QualifierLoc = Record.readNestedNameSpecifierLoc();
1967 D->DNLoc = Record.readDeclarationNameLoc(D->getDeclName());
1968 D->EllipsisLoc = readSourceLocation();
1969 mergeMergeable(D);
1970}
1971
1974 VisitTypeDecl(D);
1975 D->TypenameLocation = readSourceLocation();
1976 D->QualifierLoc = Record.readNestedNameSpecifierLoc();
1977 D->EllipsisLoc = readSourceLocation();
1978 mergeMergeable(D);
1979}
1980
1985
1986void ASTDeclReader::ReadCXXDefinitionData(
1987 struct CXXRecordDecl::DefinitionData &Data, const CXXRecordDecl *D,
1988 Decl *LambdaContext, unsigned IndexInLambdaContext) {
1989
1990 BitsUnpacker CXXRecordDeclBits = Record.readInt();
1991
1992#define FIELD(Name, Width, Merge) \
1993 if (!CXXRecordDeclBits.canGetNextNBits(Width)) \
1994 CXXRecordDeclBits.updateValue(Record.readInt()); \
1995 Data.Name = CXXRecordDeclBits.getNextBits(Width);
1996
1997#include "clang/AST/CXXRecordDeclDefinitionBits.def"
1998#undef FIELD
1999
2000 // Note: the caller has deserialized the IsLambda bit already.
2001 Data.ODRHash = Record.readInt();
2002 Data.HasODRHash = true;
2003
2004 if (Record.readInt()) {
2005 Reader.DefinitionSource[D] =
2006 Loc.F->Kind == ModuleKind::MK_MainFile ||
2007 Reader.getContext().getLangOpts().BuildingPCHWithObjectFile;
2008 }
2009
2010 Record.readUnresolvedSet(Data.Conversions);
2011 Data.ComputedVisibleConversions = Record.readInt();
2012 if (Data.ComputedVisibleConversions)
2013 Record.readUnresolvedSet(Data.VisibleConversions);
2014 assert(Data.Definition && "Data.Definition should be already set!");
2015
2016 if (!Data.IsLambda) {
2017 assert(!LambdaContext && !IndexInLambdaContext &&
2018 "given lambda context for non-lambda");
2019
2020 Data.NumBases = Record.readInt();
2021 if (Data.NumBases)
2022 Data.Bases = ReadGlobalOffset();
2023
2024 Data.NumVBases = Record.readInt();
2025 if (Data.NumVBases)
2026 Data.VBases = ReadGlobalOffset();
2027
2028 Data.FirstFriend = readDeclID().getRawValue();
2029 } else {
2030 using Capture = LambdaCapture;
2031
2032 auto &Lambda = static_cast<CXXRecordDecl::LambdaDefinitionData &>(Data);
2033
2034 BitsUnpacker LambdaBits(Record.readInt());
2035 Lambda.DependencyKind = LambdaBits.getNextBits(/*Width=*/2);
2036 Lambda.IsGenericLambda = LambdaBits.getNextBit();
2037 Lambda.CaptureDefault = LambdaBits.getNextBits(/*Width=*/2);
2038 Lambda.NumCaptures = LambdaBits.getNextBits(/*Width=*/15);
2039 Lambda.HasKnownInternalLinkage = LambdaBits.getNextBit();
2040
2041 Lambda.NumExplicitCaptures = Record.readInt();
2042 Lambda.ManglingNumber = Record.readInt();
2043 if (unsigned DeviceManglingNumber = Record.readInt())
2044 Reader.getContext().DeviceLambdaManglingNumbers[D] = DeviceManglingNumber;
2045 Lambda.IndexInContext = IndexInLambdaContext;
2046 Lambda.ContextDecl = LambdaContext;
2047 Capture *ToCapture = nullptr;
2048 if (Lambda.NumCaptures) {
2049 ToCapture = (Capture *)Reader.getContext().Allocate(sizeof(Capture) *
2050 Lambda.NumCaptures);
2051 Lambda.AddCaptureList(Reader.getContext(), ToCapture);
2052 }
2053 Lambda.MethodTyInfo = readTypeSourceInfo();
2054 for (unsigned I = 0, N = Lambda.NumCaptures; I != N; ++I) {
2055 SourceLocation Loc = readSourceLocation();
2056 BitsUnpacker CaptureBits(Record.readInt());
2057 bool IsImplicit = CaptureBits.getNextBit();
2058 auto Kind =
2059 static_cast<LambdaCaptureKind>(CaptureBits.getNextBits(/*Width=*/3));
2060 switch (Kind) {
2061 case LCK_StarThis:
2062 case LCK_This:
2063 case LCK_VLAType:
2064 new (ToCapture)
2065 Capture(Loc, IsImplicit, Kind, nullptr, SourceLocation());
2066 ToCapture++;
2067 break;
2068 case LCK_ByCopy:
2069 case LCK_ByRef:
2070 auto *Var = readDeclAs<ValueDecl>();
2071 SourceLocation EllipsisLoc = readSourceLocation();
2072 new (ToCapture) Capture(Loc, IsImplicit, Kind, Var, EllipsisLoc);
2073 ToCapture++;
2074 break;
2075 }
2076 }
2077 }
2078}
2079
2081 CXXRecordDecl *D, struct CXXRecordDecl::DefinitionData &&MergeDD) {
2082 assert(D->DefinitionData &&
2083 "merging class definition into non-definition");
2084 auto &DD = *D->DefinitionData;
2085
2086 if (DD.Definition != MergeDD.Definition) {
2087 // Track that we merged the definitions.
2088 Reader.MergedDeclContexts.insert(std::make_pair(MergeDD.Definition,
2089 DD.Definition));
2090 Reader.PendingDefinitions.erase(MergeDD.Definition);
2091 MergeDD.Definition->demoteThisDefinitionToDeclaration();
2092 Reader.mergeDefinitionVisibility(DD.Definition, MergeDD.Definition);
2093 assert(!Reader.Lookups.contains(MergeDD.Definition) &&
2094 "already loaded pending lookups for merged definition");
2095 }
2096
2097 auto PFDI = Reader.PendingFakeDefinitionData.find(&DD);
2098 if (PFDI != Reader.PendingFakeDefinitionData.end() &&
2099 PFDI->second == ASTReader::PendingFakeDefinitionKind::Fake) {
2100 // We faked up this definition data because we found a class for which we'd
2101 // not yet loaded the definition. Replace it with the real thing now.
2102 assert(!DD.IsLambda && !MergeDD.IsLambda && "faked up lambda definition?");
2103 PFDI->second = ASTReader::PendingFakeDefinitionKind::FakeLoaded;
2104
2105 // Don't change which declaration is the definition; that is required
2106 // to be invariant once we select it.
2107 auto *Def = DD.Definition;
2108 DD = std::move(MergeDD);
2109 DD.Definition = Def;
2110 for (auto *R = Reader.getMostRecentExistingDecl(Def); R;
2111 R = R->getPreviousDecl())
2112 cast<CXXRecordDecl>(R)->DefinitionData = &DD;
2113 return;
2114 }
2115
2116 bool DetectedOdrViolation = false;
2117
2118 #define FIELD(Name, Width, Merge) Merge(Name)
2119 #define MERGE_OR(Field) DD.Field |= MergeDD.Field;
2120 #define NO_MERGE(Field) \
2121 DetectedOdrViolation |= DD.Field != MergeDD.Field; \
2122 MERGE_OR(Field)
2123 #include "clang/AST/CXXRecordDeclDefinitionBits.def"
2124 NO_MERGE(IsLambda)
2125 #undef NO_MERGE
2126 #undef MERGE_OR
2127
2128 if (DD.NumBases != MergeDD.NumBases || DD.NumVBases != MergeDD.NumVBases)
2129 DetectedOdrViolation = true;
2130 // FIXME: Issue a diagnostic if the base classes don't match when we come
2131 // to lazily load them.
2132
2133 // FIXME: Issue a diagnostic if the list of conversion functions doesn't
2134 // match when we come to lazily load them.
2135 if (MergeDD.ComputedVisibleConversions && !DD.ComputedVisibleConversions) {
2136 DD.VisibleConversions = std::move(MergeDD.VisibleConversions);
2137 DD.ComputedVisibleConversions = true;
2138 }
2139
2140 // FIXME: Issue a diagnostic if FirstFriend doesn't match when we come to
2141 // lazily load it.
2142
2143 if (DD.IsLambda) {
2144 auto &Lambda1 = static_cast<CXXRecordDecl::LambdaDefinitionData &>(DD);
2145 auto &Lambda2 = static_cast<CXXRecordDecl::LambdaDefinitionData &>(MergeDD);
2146 DetectedOdrViolation |= Lambda1.DependencyKind != Lambda2.DependencyKind;
2147 DetectedOdrViolation |= Lambda1.IsGenericLambda != Lambda2.IsGenericLambda;
2148 DetectedOdrViolation |= Lambda1.CaptureDefault != Lambda2.CaptureDefault;
2149 DetectedOdrViolation |= Lambda1.NumCaptures != Lambda2.NumCaptures;
2150 DetectedOdrViolation |=
2151 Lambda1.NumExplicitCaptures != Lambda2.NumExplicitCaptures;
2152 DetectedOdrViolation |=
2153 Lambda1.HasKnownInternalLinkage != Lambda2.HasKnownInternalLinkage;
2154 DetectedOdrViolation |= Lambda1.ManglingNumber != Lambda2.ManglingNumber;
2155
2156 if (Lambda1.NumCaptures && Lambda1.NumCaptures == Lambda2.NumCaptures) {
2157 for (unsigned I = 0, N = Lambda1.NumCaptures; I != N; ++I) {
2158 LambdaCapture &Cap1 = Lambda1.Captures.front()[I];
2159 LambdaCapture &Cap2 = Lambda2.Captures.front()[I];
2160 DetectedOdrViolation |= Cap1.getCaptureKind() != Cap2.getCaptureKind();
2161 }
2162 Lambda1.AddCaptureList(Reader.getContext(), Lambda2.Captures.front());
2163 }
2164 }
2165
2166 // We don't want to check ODR for decls in the global module fragment.
2167 if (shouldSkipCheckingODR(MergeDD.Definition) || shouldSkipCheckingODR(D))
2168 return;
2169
2170 if (D->getODRHash() != MergeDD.ODRHash) {
2171 DetectedOdrViolation = true;
2172 }
2173
2174 if (DetectedOdrViolation)
2175 Reader.PendingOdrMergeFailures[DD.Definition].push_back(
2176 {MergeDD.Definition, &MergeDD});
2177}
2178
2179void ASTDeclReader::ReadCXXRecordDefinition(CXXRecordDecl *D, bool Update,
2180 Decl *LambdaContext,
2181 unsigned IndexInLambdaContext) {
2182 struct CXXRecordDecl::DefinitionData *DD;
2183 ASTContext &C = Reader.getContext();
2184
2185 // Determine whether this is a lambda closure type, so that we can
2186 // allocate the appropriate DefinitionData structure.
2187 bool IsLambda = Record.readInt();
2188 assert(!(IsLambda && Update) &&
2189 "lambda definition should not be added by update record");
2190 if (IsLambda)
2191 DD = new (C) CXXRecordDecl::LambdaDefinitionData(
2192 D, nullptr, CXXRecordDecl::LDK_Unknown, false, LCD_None);
2193 else
2194 DD = new (C) struct CXXRecordDecl::DefinitionData(D);
2195
2196 CXXRecordDecl *Canon = D->getCanonicalDecl();
2197 // Set decl definition data before reading it, so that during deserialization
2198 // when we read CXXRecordDecl, it already has definition data and we don't
2199 // set fake one.
2200 if (!Canon->DefinitionData)
2201 Canon->DefinitionData = DD;
2202 D->DefinitionData = Canon->DefinitionData;
2203 ReadCXXDefinitionData(*DD, D, LambdaContext, IndexInLambdaContext);
2204
2205 // Mark this declaration as being a definition.
2206 D->setCompleteDefinition(true);
2207
2208 // We might already have a different definition for this record. This can
2209 // happen either because we're reading an update record, or because we've
2210 // already done some merging. Either way, just merge into it.
2211 if (Canon->DefinitionData != DD) {
2212 MergeImpl.MergeDefinitionData(Canon, std::move(*DD));
2213 return;
2214 }
2215
2216 // If this is not the first declaration or is an update record, we can have
2217 // other redeclarations already. Make a note that we need to propagate the
2218 // DefinitionData pointer onto them.
2219 if (Update || Canon != D)
2220 Reader.PendingDefinitions.insert(D);
2221}
2222
2224 RedeclarableResult Redecl = VisitRecordDeclImpl(D);
2225
2226 ASTContext &C = Reader.getContext();
2227
2228 enum CXXRecKind {
2229 CXXRecNotTemplate = 0,
2230 CXXRecTemplate,
2231 CXXRecMemberSpecialization,
2232 CXXLambda
2233 };
2234
2235 Decl *LambdaContext = nullptr;
2236 unsigned IndexInLambdaContext = 0;
2237
2238 switch ((CXXRecKind)Record.readInt()) {
2239 case CXXRecNotTemplate:
2240 // Merged when we merge the folding set entry in the primary template.
2242 mergeRedeclarable(D, Redecl);
2243 break;
2244 case CXXRecTemplate: {
2245 // Merged when we merge the template.
2246 auto *Template = readDeclAs<ClassTemplateDecl>();
2247 D->TemplateOrInstantiation = Template;
2248 break;
2249 }
2250 case CXXRecMemberSpecialization: {
2251 auto *RD = readDeclAs<CXXRecordDecl>();
2252 auto TSK = (TemplateSpecializationKind)Record.readInt();
2253 SourceLocation POI = readSourceLocation();
2255 MSI->setPointOfInstantiation(POI);
2256 D->TemplateOrInstantiation = MSI;
2257 mergeRedeclarable(D, Redecl);
2258 break;
2259 }
2260 case CXXLambda: {
2261 LambdaContext = readDecl();
2262 if (LambdaContext)
2263 IndexInLambdaContext = Record.readInt();
2264 if (LambdaContext)
2265 MergeImpl.mergeLambda(D, Redecl, *LambdaContext, IndexInLambdaContext);
2266 else
2267 // If we don't have a mangling context, treat this like any other
2268 // declaration.
2269 mergeRedeclarable(D, Redecl);
2270 break;
2271 }
2272 }
2273
2274 bool WasDefinition = Record.readInt();
2275 if (WasDefinition)
2276 ReadCXXRecordDefinition(D, /*Update=*/false, LambdaContext,
2277 IndexInLambdaContext);
2278 else
2279 // Propagate DefinitionData pointer from the canonical declaration.
2280 D->DefinitionData = D->getCanonicalDecl()->DefinitionData;
2281
2282 // Lazily load the key function to avoid deserializing every method so we can
2283 // compute it.
2284 if (WasDefinition) {
2285 GlobalDeclID KeyFn = readDeclID();
2286 if (KeyFn.isValid() && D->isCompleteDefinition())
2287 // FIXME: This is wrong for the ARM ABI, where some other module may have
2288 // made this function no longer be a key function. We need an update
2289 // record or similar for that case.
2290 C.KeyFunctions[D] = KeyFn.getRawValue();
2291 }
2292
2293 return Redecl;
2294}
2295
2297 D->setExplicitSpecifier(Record.readExplicitSpec());
2298 D->Ctor = readDeclAs<CXXConstructorDecl>();
2301 static_cast<DeductionCandidate>(Record.readInt()));
2302 D->setSourceDeductionGuide(readDeclAs<CXXDeductionGuideDecl>());
2305 Record.readInt()));
2306}
2307
2310
2311 unsigned NumOverridenMethods = Record.readInt();
2312 if (D->isCanonicalDecl()) {
2313 while (NumOverridenMethods--) {
2314 // Avoid invariant checking of CXXMethodDecl::addOverriddenMethod,
2315 // MD may be initializing.
2316 if (auto *MD = readDeclAs<CXXMethodDecl>())
2317 Reader.getContext().addOverriddenMethod(D, MD->getCanonicalDecl());
2318 }
2319 } else {
2320 // We don't care about which declarations this used to override; we get
2321 // the relevant information from the canonical declaration.
2322 Record.skipInts(NumOverridenMethods);
2323 }
2324}
2325
2327 // We need the inherited constructor information to merge the declaration,
2328 // so we have to read it before we call VisitCXXMethodDecl.
2329 D->setExplicitSpecifier(Record.readExplicitSpec());
2330 if (D->isInheritingConstructor()) {
2331 auto *Shadow = readDeclAs<ConstructorUsingShadowDecl>();
2332 auto *Ctor = readDeclAs<CXXConstructorDecl>();
2333 *D->getTrailingObjects<InheritedConstructor>() =
2334 InheritedConstructor(Shadow, Ctor);
2335 }
2336
2337 if (unsigned NumArgs = Record.readUInt32()) {
2338 CXXDefaultArgExpr **Args =
2339 new (Reader.getContext()) CXXDefaultArgExpr *[NumArgs];
2340 for (unsigned I = 0; I != NumArgs; I++)
2341 Args[I] = cast_or_null<CXXDefaultArgExpr>(Record.readStmt());
2342 D->setCtorClosureDefaultArgs(ArrayRef(Args, NumArgs));
2343 }
2344
2346}
2347
2350
2351 ASTContext &C = Reader.getContext();
2353 if (auto *OperatorDelete = readDeclAs<FunctionDecl>()) {
2354 auto *ThisArg = Record.readExpr();
2355 // FIXME: Check consistency if we have an old and new operator delete.
2356 if (!C.dtorHasOperatorDelete(D, ASTContext::OperatorDeleteKind::Regular)) {
2357 C.addOperatorDeleteForVDtor(D, OperatorDelete,
2359 Canon->OperatorDeleteThisArg = ThisArg;
2360 }
2361 }
2362 if (auto *OperatorGlobDelete = readDeclAs<FunctionDecl>()) {
2363 if (!C.dtorHasOperatorDelete(D,
2365 C.addOperatorDeleteForVDtor(
2366 D, OperatorGlobDelete, ASTContext::OperatorDeleteKind::GlobalRegular);
2367 }
2368 if (auto *OperatorArrayDelete = readDeclAs<FunctionDecl>()) {
2369 if (!C.dtorHasOperatorDelete(D, ASTContext::OperatorDeleteKind::Array))
2370 C.addOperatorDeleteForVDtor(D, OperatorArrayDelete,
2372 }
2373 if (auto *OperatorGlobArrayDelete = readDeclAs<FunctionDecl>()) {
2374 if (!C.dtorHasOperatorDelete(D,
2376 C.addOperatorDeleteForVDtor(D, OperatorGlobArrayDelete,
2378 }
2379}
2380
2382 D->setExplicitSpecifier(Record.readExplicitSpec());
2384}
2385
2387 VisitDecl(D);
2388 D->ImportedModule = readModule();
2389 D->setImportComplete(Record.readInt());
2390 auto *StoredLocs = D->getTrailingObjects();
2391 for (unsigned I = 0, N = Record.back(); I != N; ++I)
2392 StoredLocs[I] = readSourceLocation();
2393 Record.skipInts(1); // The number of stored source locations.
2394}
2395
2397 VisitDecl(D);
2398 D->setColonLoc(readSourceLocation());
2399}
2400
2402 VisitDecl(D);
2403 if (Record.readInt()) // hasFriendDecl
2404 D->Friend = readDeclAs<NamedDecl>();
2405 else
2406 D->Friend = readTypeSourceInfo();
2407 D->NextFriend = readDeclID().getRawValue();
2408 D->FriendLoc = readSourceLocation();
2409 D->EllipsisLoc = readSourceLocation();
2410}
2411
2413 VisitDecl(D);
2414 for (unsigned i = 0; i != D->NumTPLists; ++i)
2415 D->getTrailingObjects()[i] = Record.readTemplateParameterList();
2416 switch (Record.readInt()) {
2417 case FTDK_Type:
2418 D->Friend = readTypeSourceInfo();
2419 break;
2420 case FTDK_Decl:
2421 D->Friend = readDeclAs<NamedDecl>();
2422 break;
2423 case FTDK_Template:
2424 D->Template = Record.readTemplateName();
2425 break;
2426 }
2427 D->NextFriend = readDeclID().getRawValue();
2428 D->FriendLoc = readSourceLocation();
2429 D->EllipsisLoc = readSourceLocation();
2430}
2431
2433 VisitNamedDecl(D);
2434
2435 assert(!D->TemplateParams && "TemplateParams already set!");
2436 D->TemplateParams = Record.readTemplateParameterList();
2437 D->init(readDeclAs<NamedDecl>());
2438}
2439
2442 D->ConstraintExpr = Record.readExpr();
2443 mergeMergeable(D);
2444}
2445
2448 // The size of the template list was read during creation of the Decl, so we
2449 // don't have to re-read it here.
2450 VisitDecl(D);
2452 for (unsigned I = 0; I < D->NumTemplateArgs; ++I)
2453 Args.push_back(Record.readTemplateArgument(/*Canonicalize=*/false));
2454 D->setTemplateArguments(Args);
2455}
2456
2459
2461 llvm::BitstreamCursor &DeclsCursor,
2462 bool IsPartial) {
2463 uint64_t Offset = ReadLocalOffset();
2464 bool Failed =
2465 Reader.ReadSpecializations(M, DeclsCursor, Offset, D, IsPartial);
2466 (void)Failed;
2467 assert(!Failed);
2468}
2469
2470RedeclarableResult
2472 RedeclarableResult Redecl = VisitRedeclarable(D);
2473
2474 // Make sure we've allocated the Common pointer first. We do this before
2475 // VisitTemplateDecl so that getCommonPtr() can be used during initialization.
2477 if (!CanonD->Common) {
2478 CanonD->Common = CanonD->newCommon(Reader.getContext());
2479 Reader.PendingDefinitions.insert(CanonD);
2480 }
2481 D->Common = CanonD->Common;
2482
2483 // If this is the first declaration of the template, fill in the information
2484 // for the 'common' pointer.
2485 if (ThisDeclID == Redecl.getFirstID()) {
2486 if (auto *RTD = readDeclAs<RedeclarableTemplateDecl>()) {
2487 assert(RTD->getKind() == D->getKind() &&
2488 "InstantiatedFromMemberTemplate kind mismatch");
2490 if (Record.readInt())
2492 }
2493 }
2494
2496 D->IdentifierNamespace = Record.readInt();
2497
2498 return Redecl;
2499}
2500
2502 RedeclarableResult Redecl = VisitRedeclarableTemplateDecl(D);
2503 mergeRedeclarableTemplate(D, Redecl);
2504
2505 if (ThisDeclID == Redecl.getFirstID()) {
2506 // This ClassTemplateDecl owns a CommonPtr; read it to keep track of all of
2507 // the specializations.
2508 ReadSpecializations(*Loc.F, D, Loc.F->DeclsCursor, /*IsPartial=*/false);
2509 ReadSpecializations(*Loc.F, D, Loc.F->DeclsCursor, /*IsPartial=*/true);
2510 }
2511}
2512
2514 llvm_unreachable("BuiltinTemplates are not serialized");
2515}
2516
2517/// TODO: Unify with ClassTemplateDecl version?
2518/// May require unifying ClassTemplateDecl and
2519/// VarTemplateDecl beyond TemplateDecl...
2521 RedeclarableResult Redecl = VisitRedeclarableTemplateDecl(D);
2522 mergeRedeclarableTemplate(D, Redecl);
2523
2524 if (ThisDeclID == Redecl.getFirstID()) {
2525 // This VarTemplateDecl owns a CommonPtr; read it to keep track of all of
2526 // the specializations.
2527 ReadSpecializations(*Loc.F, D, Loc.F->DeclsCursor, /*IsPartial=*/false);
2528 ReadSpecializations(*Loc.F, D, Loc.F->DeclsCursor, /*IsPartial=*/true);
2529 }
2530}
2531
2534 RedeclarableResult Redecl = VisitCXXRecordDeclImpl(D);
2535
2536 ASTContext &C = Reader.getContext();
2537 if (Decl *InstD = readDecl()) {
2538 if (auto *CTD = dyn_cast<ClassTemplateDecl>(InstD)) {
2539 D->SpecializedTemplate = CTD;
2540 } else {
2542 Record.readTemplateArgumentList(TemplArgs);
2543 TemplateArgumentList *ArgList
2544 = TemplateArgumentList::CreateCopy(C, TemplArgs);
2545 auto *PS =
2547 SpecializedPartialSpecialization();
2548 PS->PartialSpecialization
2550 PS->TemplateArgs = ArgList;
2551 D->SpecializedTemplate = PS;
2552 }
2553 }
2554
2556 Record.readTemplateArgumentList(TemplArgs, /*Canonicalize*/ true);
2557 D->TemplateArgs = TemplateArgumentList::CreateCopy(C, TemplArgs);
2558 D->PointOfInstantiation = readSourceLocation();
2559 D->SpecializationKind = (TemplateSpecializationKind)Record.readInt();
2560 D->StrictPackMatch = Record.readBool();
2561
2562 bool writtenAsCanonicalDecl = Record.readInt();
2563 if (writtenAsCanonicalDecl) {
2564 auto *CanonPattern = readDeclAs<ClassTemplateDecl>();
2565 if (D->isCanonicalDecl()) { // It's kept in the folding set.
2566 // Set this as, or find, the canonical declaration for this specialization
2568 if (auto *Partial = dyn_cast<ClassTemplatePartialSpecializationDecl>(D)) {
2569 CanonSpec = CanonPattern->getCommonPtr()->PartialSpecializations
2570 .GetOrInsertNode(Partial);
2571 } else {
2572 CanonSpec =
2573 CanonPattern->getCommonPtr()->Specializations.GetOrInsertNode(D);
2574 }
2575 // If there was already a canonical specialization, merge into it.
2576 if (CanonSpec != D) {
2577 MergeImpl.mergeRedeclarable<TagDecl>(D, CanonSpec, Redecl);
2578
2579 // This declaration might be a definition. Merge with any existing
2580 // definition.
2581 if (auto *DDD = D->DefinitionData) {
2582 if (CanonSpec->DefinitionData)
2583 MergeImpl.MergeDefinitionData(CanonSpec, std::move(*DDD));
2584 else
2585 CanonSpec->DefinitionData = D->DefinitionData;
2586 }
2587 D->DefinitionData = CanonSpec->DefinitionData;
2588 }
2589 }
2590 }
2591
2592 // extern/template keyword locations for explicit instantiations
2593 if (Record.readBool()) {
2594 auto *ExplicitInfo = new (C) ExplicitInstantiationInfo;
2595 ExplicitInfo->ExternKeywordLoc = readSourceLocation();
2596 ExplicitInfo->TemplateKeywordLoc = readSourceLocation();
2597 D->ExplicitInfo = ExplicitInfo;
2598 }
2599
2600 if (Record.readBool())
2601 D->setTemplateArgsAsWritten(Record.readASTTemplateArgumentListInfo());
2602
2603 return Redecl;
2604}
2605
2608 // We need to read the template params first because redeclarable is going to
2609 // need them for profiling
2610 TemplateParameterList *Params = Record.readTemplateParameterList();
2611 D->TemplateParams = Params;
2612
2613 RedeclarableResult Redecl = VisitClassTemplateSpecializationDeclImpl(D);
2614
2615 // These are read/set from/to the first declaration.
2616 if (ThisDeclID == Redecl.getFirstID()) {
2617 D->InstantiatedFromMember.setPointer(
2618 readDeclAs<ClassTemplatePartialSpecializationDecl>());
2619 D->InstantiatedFromMember.setInt(Record.readInt());
2620 }
2621}
2622
2624 RedeclarableResult Redecl = VisitRedeclarableTemplateDecl(D);
2625
2626 if (ThisDeclID == Redecl.getFirstID()) {
2627 // This FunctionTemplateDecl owns a CommonPtr; read it.
2628 ReadSpecializations(*Loc.F, D, Loc.F->DeclsCursor, /*IsPartial=*/false);
2629 }
2630}
2631
2632/// TODO: Unify with ClassTemplateSpecializationDecl version?
2633/// May require unifying ClassTemplate(Partial)SpecializationDecl and
2634/// VarTemplate(Partial)SpecializationDecl with a new data
2635/// structure Template(Partial)SpecializationDecl, and
2636/// using Template(Partial)SpecializationDecl as input type.
2639 ASTContext &C = Reader.getContext();
2640 if (Decl *InstD = readDecl()) {
2641 if (auto *VTD = dyn_cast<VarTemplateDecl>(InstD)) {
2642 D->SpecializedTemplate = VTD;
2643 } else {
2645 Record.readTemplateArgumentList(TemplArgs);
2647 C, TemplArgs);
2648 auto *PS =
2649 new (C)
2650 VarTemplateSpecializationDecl::SpecializedPartialSpecialization();
2651 PS->PartialSpecialization =
2653 PS->TemplateArgs = ArgList;
2654 D->SpecializedTemplate = PS;
2655 }
2656 }
2657
2658 // extern/template keyword locations for explicit instantiations
2659 if (Record.readBool()) {
2660 auto *ExplicitInfo = new (C) ExplicitInstantiationInfo;
2661 ExplicitInfo->ExternKeywordLoc = readSourceLocation();
2662 ExplicitInfo->TemplateKeywordLoc = readSourceLocation();
2663 D->ExplicitInfo = ExplicitInfo;
2664 }
2665
2666 if (Record.readBool())
2667 D->setTemplateArgsAsWritten(Record.readASTTemplateArgumentListInfo());
2668
2670 Record.readTemplateArgumentList(TemplArgs, /*Canonicalize*/ true);
2671 D->TemplateArgs = TemplateArgumentList::CreateCopy(C, TemplArgs);
2672 D->PointOfInstantiation = readSourceLocation();
2673 D->SpecializationKind = (TemplateSpecializationKind)Record.readInt();
2674 D->IsCompleteDefinition = Record.readInt();
2675
2676 RedeclarableResult Redecl = VisitVarDeclImpl(D);
2677
2678 bool writtenAsCanonicalDecl = Record.readInt();
2679 if (writtenAsCanonicalDecl) {
2680 auto *CanonPattern = readDeclAs<VarTemplateDecl>();
2681 if (D->isCanonicalDecl()) { // It's kept in the folding set.
2683 if (auto *Partial = dyn_cast<VarTemplatePartialSpecializationDecl>(D)) {
2684 CanonSpec = CanonPattern->getCommonPtr()
2685 ->PartialSpecializations.GetOrInsertNode(Partial);
2686 } else {
2687 CanonSpec =
2688 CanonPattern->getCommonPtr()->Specializations.GetOrInsertNode(D);
2689 }
2690 // If we already have a matching specialization, merge it.
2691 if (CanonSpec != D)
2692 MergeImpl.mergeRedeclarable<VarDecl>(D, CanonSpec, Redecl);
2693 }
2694 }
2695
2696 return Redecl;
2697}
2698
2699/// TODO: Unify with ClassTemplatePartialSpecializationDecl version?
2700/// May require unifying ClassTemplate(Partial)SpecializationDecl and
2701/// VarTemplate(Partial)SpecializationDecl with a new data
2702/// structure Template(Partial)SpecializationDecl, and
2703/// using Template(Partial)SpecializationDecl as input type.
2706 TemplateParameterList *Params = Record.readTemplateParameterList();
2707 D->TemplateParams = Params;
2708
2709 RedeclarableResult Redecl = VisitVarTemplateSpecializationDeclImpl(D);
2710
2711 // These are read/set from/to the first declaration.
2712 if (ThisDeclID == Redecl.getFirstID()) {
2713 D->InstantiatedFromMember.setPointer(
2714 readDeclAs<VarTemplatePartialSpecializationDecl>());
2715 D->InstantiatedFromMember.setInt(Record.readInt());
2716 }
2717}
2718
2720 VisitTypeDecl(D);
2721
2722 D->setDeclaredWithTypename(Record.readInt());
2723
2724 bool TypeConstraintInitialized = D->hasTypeConstraint() && Record.readBool();
2725 if (TypeConstraintInitialized) {
2726 ConceptReference *CR = nullptr;
2727 if (Record.readBool())
2728 CR = Record.readConceptReference();
2729 Expr *ImmediatelyDeclaredConstraint = Record.readExpr();
2730 UnsignedOrNone ArgPackSubstIndex = Record.readUnsignedOrNone();
2731
2732 D->setTypeConstraint(CR, ImmediatelyDeclaredConstraint, ArgPackSubstIndex);
2733 D->NumExpanded = Record.readUnsignedOrNone();
2734 }
2735
2736 if (Record.readInt())
2737 D->setDefaultArgument(Reader.getContext(),
2738 Record.readTemplateArgumentLoc());
2739}
2740
2743 // TemplateParmPosition.
2744 D->setDepth(Record.readInt());
2745 D->setPosition(Record.readInt());
2747 D->setPlaceholderTypeConstraint(Record.readExpr());
2748 if (D->isExpandedParameterPack()) {
2749 auto TypesAndInfos =
2750 D->getTrailingObjects<std::pair<QualType, TypeSourceInfo *>>();
2751 for (unsigned I = 0, N = D->getNumExpansionTypes(); I != N; ++I) {
2752 new (&TypesAndInfos[I].first) QualType(Record.readType());
2753 TypesAndInfos[I].second = readTypeSourceInfo();
2754 }
2755 } else {
2756 // Rest of NonTypeTemplateParmDecl.
2757 D->ParameterPack = Record.readInt();
2758 if (Record.readInt())
2759 D->setDefaultArgument(Reader.getContext(),
2760 Record.readTemplateArgumentLoc());
2761 }
2762}
2763
2766 D->ParameterKind = static_cast<TemplateNameKind>(Record.readInt());
2767 D->setDeclaredWithTypename(Record.readBool());
2768 // TemplateParmPosition.
2769 D->setDepth(Record.readInt());
2770 D->setPosition(Record.readInt());
2771 if (D->isExpandedParameterPack()) {
2772 auto **Data = D->getTrailingObjects();
2773 for (unsigned I = 0, N = D->getNumExpansionTemplateParameters();
2774 I != N; ++I)
2775 Data[I] = Record.readTemplateParameterList();
2776 } else {
2777 // Rest of TemplateTemplateParmDecl.
2778 D->ParameterPack = Record.readInt();
2779 if (Record.readInt())
2780 D->setDefaultArgument(Reader.getContext(),
2781 Record.readTemplateArgumentLoc());
2782 }
2783}
2784
2789
2791 VisitDecl(D);
2792 D->AssertExprAndFailed.setPointer(Record.readExpr());
2793 D->AssertExprAndFailed.setInt(Record.readInt());
2794 D->Message = cast_or_null<StringLiteral>(Record.readExpr());
2795 D->RParenLoc = readSourceLocation();
2796}
2797
2800 // Note: trailing flags were already read by ReadDeclRecord and passed to
2801 // CreateDeserialized, so TypeAndFlags.getInt() is already set.
2802 VisitDecl(D);
2803 auto *Spec = readDeclAs<NamedDecl>();
2804 D->SpecAndTSK.setPointer(Spec);
2805 D->ExternLoc = readSourceLocation();
2806 D->NameLoc = readSourceLocation();
2807 TypeSourceInfo *TSI = readTypeSourceInfo();
2808 unsigned TSK = Record.readInt();
2809 D->SpecAndTSK.setInt(TSK);
2810 D->TypeAndFlags.setPointer(TSI); // preserves trailing flags in int bits
2811 // Read trailing objects.
2812 if (D->hasTrailingQualifier())
2813 *D->getTrailingObjects<NestedNameSpecifierLoc>() =
2814 Record.readNestedNameSpecifierLoc();
2815 if (D->hasTrailingArgsAsWritten())
2816 *D->getTrailingObjects<const ASTTemplateArgumentListInfo *>() =
2817 Record.readASTTemplateArgumentListInfo();
2818
2819 // Rebuild the ASTContext map from specialization to EID.
2820 if (Spec)
2821 Reader.getContext().addExplicitInstantiationDecl(Spec, D);
2822}
2823
2827
2830 VisitDecl(D);
2831 D->ExtendingDecl = readDeclAs<ValueDecl>();
2832 D->ExprWithTemporary = Record.readStmt();
2833 if (Record.readInt()) {
2834 D->Value = new (D->getASTContext()) APValue(Record.readAPValue());
2835 D->getASTContext().addDestruction(D->Value);
2836 }
2837 D->ManglingNumber = Record.readInt();
2838 mergeMergeable(D);
2839}
2840
2842 LookupBlockOffsets &Offsets) {
2843 Offsets.LexicalOffset = ReadLocalOffset();
2844 Offsets.VisibleOffset = ReadLocalOffset();
2845 Offsets.ModuleLocalOffset = ReadLocalOffset();
2846 Offsets.TULocalOffset = ReadLocalOffset();
2847}
2848
2849template <typename T>
2851 GlobalDeclID FirstDeclID = readDeclID();
2852 Decl *MergeWith = nullptr;
2853
2854 bool IsKeyDecl = ThisDeclID == FirstDeclID;
2855 bool IsFirstLocalDecl = false;
2856
2857 uint64_t RedeclOffset = 0;
2858
2859 // invalid FirstDeclID indicates that this declaration was the only
2860 // declaration of its entity, and is used for space optimization.
2861 if (FirstDeclID.isInvalid()) {
2862 FirstDeclID = ThisDeclID;
2863 IsKeyDecl = true;
2864 IsFirstLocalDecl = true;
2865 } else if (unsigned N = Record.readInt()) {
2866 // This declaration was the first local declaration, but may have imported
2867 // other declarations.
2868 IsKeyDecl = N == 1;
2869 IsFirstLocalDecl = true;
2870
2871 // We have some declarations that must be before us in our redeclaration
2872 // chain. Read them now, and remember that we ought to merge with one of
2873 // them.
2874 // FIXME: Provide a known merge target to the second and subsequent such
2875 // declaration.
2876 for (unsigned I = 0; I != N - 1; ++I)
2877 MergeWith = readDecl();
2878
2879 RedeclOffset = ReadLocalOffset();
2880 } else {
2881 // This declaration was not the first local declaration. Read the first
2882 // local declaration now, to trigger the import of other redeclarations.
2883 (void)readDecl();
2884 }
2885
2886 auto *FirstDecl = cast_or_null<T>(Reader.GetDecl(FirstDeclID));
2887 if (FirstDecl != D) {
2888 // We delay loading of the redeclaration chain to avoid deeply nested calls.
2889 // We temporarily set the first (canonical) declaration as the previous one
2890 // which is the one that matters and mark the real previous DeclID to be
2891 // loaded & attached later on.
2893 D->First = FirstDecl->getCanonicalDecl();
2894 }
2895
2896 auto *DAsT = static_cast<T *>(D);
2897
2898 // Note that we need to load local redeclarations of this decl and build a
2899 // decl chain for them. This must happen *after* we perform the preloading
2900 // above; this ensures that the redeclaration chain is built in the correct
2901 // order.
2902 if (IsFirstLocalDecl)
2903 Reader.PendingDeclChains.push_back(std::make_pair(DAsT, RedeclOffset));
2904
2905 return RedeclarableResult(MergeWith, FirstDeclID, IsKeyDecl);
2906}
2907
2908/// Attempts to merge the given declaration (D) with another declaration
2909/// of the same entity.
2910template <typename T>
2912 RedeclarableResult &Redecl) {
2913 // If modules are not available, there is no reason to perform this merge.
2914 if (!Reader.getContext().getLangOpts().Modules)
2915 return;
2916
2917 // If we're not the canonical declaration, we don't need to merge.
2918 if (!DBase->isFirstDecl())
2919 return;
2920
2921 auto *D = static_cast<T *>(DBase);
2922
2923 if (auto *Existing = Redecl.getKnownMergeTarget())
2924 // We already know of an existing declaration we should merge with.
2925 MergeImpl.mergeRedeclarable(D, cast<T>(Existing), Redecl);
2926 else if (FindExistingResult ExistingRes = findExisting(D))
2927 if (T *Existing = ExistingRes)
2928 MergeImpl.mergeRedeclarable(D, Existing, Redecl);
2929}
2930
2931/// Attempt to merge D with a previous declaration of the same lambda, which is
2932/// found by its index within its context declaration, if it has one.
2933///
2934/// We can't look up lambdas in their enclosing lexical or semantic context in
2935/// general, because for lambdas in variables, both of those might be a
2936/// namespace or the translation unit.
2937void ASTDeclMerger::mergeLambda(CXXRecordDecl *D, RedeclarableResult &Redecl,
2938 Decl &Context, unsigned IndexInContext) {
2939 // If modules are not available, there is no reason to perform this merge.
2940 if (!Reader.getContext().getLangOpts().Modules)
2941 return;
2942
2943 // If we're not the canonical declaration, we don't need to merge.
2944 if (!D->isFirstDecl())
2945 return;
2946
2947 if (auto *Existing = Redecl.getKnownMergeTarget())
2948 // We already know of an existing declaration we should merge with.
2949 mergeRedeclarable(D, cast<TagDecl>(Existing), Redecl);
2950
2951 // Look up this lambda to see if we've seen it before. If so, merge with the
2952 // one we already loaded.
2953 NamedDecl *&Slot = Reader.LambdaDeclarationsForMerging[{
2954 Context.getCanonicalDecl(), IndexInContext}];
2955 if (Slot)
2956 mergeRedeclarable(D, cast<TagDecl>(Slot), Redecl);
2957 else
2958 Slot = D;
2959}
2960
2962 RedeclarableResult &Redecl) {
2963 mergeRedeclarable(D, Redecl);
2964 // If we merged the template with a prior declaration chain, merge the
2965 // common pointer.
2966 // FIXME: Actually merge here, don't just overwrite.
2967 D->Common = D->getCanonicalDecl()->Common;
2968}
2969
2970/// "Cast" to type T, asserting if we don't have an implicit conversion.
2971/// We use this to put code in a template that will only be valid for certain
2972/// instantiations.
2973template<typename T> static T assert_cast(T t) { return t; }
2974template<typename T> static T assert_cast(...) {
2975 llvm_unreachable("bad assert_cast");
2976}
2977
2978/// Merge together the pattern declarations from two template
2979/// declarations.
2981 RedeclarableTemplateDecl *Existing,
2982 bool IsKeyDecl) {
2983 auto *DPattern = D->getTemplatedDecl();
2984 auto *ExistingPattern = Existing->getTemplatedDecl();
2985 RedeclarableResult Result(
2986 /*MergeWith*/ ExistingPattern,
2987 DPattern->getCanonicalDecl()->getGlobalID(), IsKeyDecl);
2988
2989 if (auto *DClass = dyn_cast<CXXRecordDecl>(DPattern)) {
2990 // Merge with any existing definition.
2991 // FIXME: This is duplicated in several places. Refactor.
2992 auto *ExistingClass =
2993 cast<CXXRecordDecl>(ExistingPattern)->getCanonicalDecl();
2994 if (auto *DDD = DClass->DefinitionData) {
2995 if (ExistingClass->DefinitionData) {
2996 MergeDefinitionData(ExistingClass, std::move(*DDD));
2997 } else {
2998 ExistingClass->DefinitionData = DClass->DefinitionData;
2999 // We may have skipped this before because we thought that DClass
3000 // was the canonical declaration.
3001 Reader.PendingDefinitions.insert(DClass);
3002 }
3003 }
3004 DClass->DefinitionData = ExistingClass->DefinitionData;
3005
3006 return mergeRedeclarable(DClass, cast<TagDecl>(ExistingPattern),
3007 Result);
3008 }
3009 if (auto *DFunction = dyn_cast<FunctionDecl>(DPattern))
3010 return mergeRedeclarable(DFunction, cast<FunctionDecl>(ExistingPattern),
3011 Result);
3012 if (auto *DVar = dyn_cast<VarDecl>(DPattern))
3013 return mergeRedeclarable(DVar, cast<VarDecl>(ExistingPattern), Result);
3014 if (auto *DAlias = dyn_cast<TypeAliasDecl>(DPattern))
3015 return mergeRedeclarable(DAlias, cast<TypedefNameDecl>(ExistingPattern),
3016 Result);
3017 llvm_unreachable("merged an unknown kind of redeclarable template");
3018}
3019
3020/// Attempts to merge the given declaration (D) with another declaration
3021/// of the same entity.
3022template <typename T>
3024 GlobalDeclID KeyDeclID) {
3025 auto *D = static_cast<T *>(DBase);
3026 T *ExistingCanon = Existing->getCanonicalDecl();
3027 T *DCanon = D->getCanonicalDecl();
3028 if (ExistingCanon != DCanon) {
3029 // Have our redeclaration link point back at the canonical declaration
3030 // of the existing declaration, so that this declaration has the
3031 // appropriate canonical declaration.
3033 D->First = ExistingCanon;
3034 ExistingCanon->Used |= D->Used;
3035 D->Used = false;
3036
3037 bool IsKeyDecl = KeyDeclID.isValid();
3038
3039 // When we merge a template, merge its pattern.
3040 if (auto *DTemplate = dyn_cast<RedeclarableTemplateDecl>(D))
3042 DTemplate, assert_cast<RedeclarableTemplateDecl *>(ExistingCanon),
3043 IsKeyDecl);
3044
3045 // If this declaration is a key declaration, make a note of that.
3046 if (IsKeyDecl)
3047 Reader.KeyDecls[ExistingCanon].push_back(KeyDeclID);
3048 }
3049}
3050
3051/// ODR-like semantics for C/ObjC allow us to merge tag types and a structural
3052/// check in Sema guarantees the types can be merged (see C11 6.2.7/1 or C89
3053/// 6.1.2.6/1). Although most merging is done in Sema, we need to guarantee
3054/// that some types are mergeable during deserialization, otherwise name
3055/// lookup fails. This is the case for EnumConstantDecl.
3057 if (!ND)
3058 return false;
3059 // TODO: implement merge for other necessary decls.
3061 return true;
3062 return false;
3063}
3064
3065/// Attempts to merge LifetimeExtendedTemporaryDecl with
3066/// identical class definitions from two different modules.
3068 // If modules are not available, there is no reason to perform this merge.
3069 if (!Reader.getContext().getLangOpts().Modules)
3070 return;
3071
3072 LifetimeExtendedTemporaryDecl *LETDecl = D;
3073
3075 Reader.LETemporaryForMerging[std::make_pair(
3076 LETDecl->getExtendingDecl(), LETDecl->getManglingNumber())];
3077 if (LookupResult)
3078 Reader.getContext().setPrimaryMergedDecl(LETDecl,
3079 LookupResult->getCanonicalDecl());
3080 else
3081 LookupResult = LETDecl;
3082}
3083
3084/// Attempts to merge the given declaration (D) with another declaration
3085/// of the same entity, for the case where the entity is not actually
3086/// redeclarable. This happens, for instance, when merging the fields of
3087/// identical class definitions from two different modules.
3088template<typename T>
3090 // If modules are not available, there is no reason to perform this merge.
3091 if (!Reader.getContext().getLangOpts().Modules)
3092 return;
3093
3094 // ODR-based merging is performed in C++ and in some cases (tag types) in C.
3095 // Note that C identically-named things in different translation units are
3096 // not redeclarations, but may still have compatible types, where ODR-like
3097 // semantics may apply.
3098 if (!Reader.getContext().getLangOpts().CPlusPlus &&
3099 !allowODRLikeMergeInC(dyn_cast<NamedDecl>(static_cast<T*>(D))))
3100 return;
3101
3102 if (FindExistingResult ExistingRes = findExisting(static_cast<T*>(D)))
3103 if (T *Existing = ExistingRes)
3104 Reader.getContext().setPrimaryMergedDecl(static_cast<T *>(D),
3105 Existing->getCanonicalDecl());
3106}
3107
3109 Record.readOMPChildren(D->Data);
3110 VisitDecl(D);
3111}
3112
3114 Record.readOMPChildren(D->Data);
3115 VisitDecl(D);
3116}
3117
3119 Record.readOMPChildren(D->Data);
3120 VisitDecl(D);
3121}
3122
3124 VisitValueDecl(D);
3125 D->setLocation(readSourceLocation());
3126 Expr *In = Record.readExpr();
3127 Expr *Out = Record.readExpr();
3128 D->setCombinerData(In, Out);
3129 Expr *Combiner = Record.readExpr();
3130 D->setCombiner(Combiner);
3131 Expr *Orig = Record.readExpr();
3132 Expr *Priv = Record.readExpr();
3133 D->setInitializerData(Orig, Priv);
3134 Expr *Init = Record.readExpr();
3135 auto IK = static_cast<OMPDeclareReductionInitKind>(Record.readInt());
3136 D->setInitializer(Init, IK);
3137 D->PrevDeclInScope = readDeclID().getRawValue();
3138}
3139
3141 Record.readOMPChildren(D->Data);
3142 VisitValueDecl(D);
3143 D->VarName = Record.readDeclarationName();
3144 D->PrevDeclInScope = readDeclID().getRawValue();
3145}
3146
3150
3152 VisitDecl(D);
3153 D->DirKind = Record.readEnum<OpenACCDirectiveKind>();
3154 D->DirectiveLoc = Record.readSourceLocation();
3155 D->EndLoc = Record.readSourceLocation();
3156 Record.readOpenACCClauseList(D->Clauses);
3157}
3159 VisitDecl(D);
3160 D->DirKind = Record.readEnum<OpenACCDirectiveKind>();
3161 D->DirectiveLoc = Record.readSourceLocation();
3162 D->EndLoc = Record.readSourceLocation();
3163 D->ParensLoc = Record.readSourceRange();
3164 D->FuncRef = Record.readExpr();
3165 Record.readOpenACCClauseList(D->Clauses);
3166}
3167
3168//===----------------------------------------------------------------------===//
3169// Attribute Reading
3170//===----------------------------------------------------------------------===//
3171
3172namespace {
3173class AttrReader {
3174 ASTRecordReader &Reader;
3175
3176public:
3177 AttrReader(ASTRecordReader &Reader) : Reader(Reader) {}
3178
3179 uint64_t readInt() {
3180 return Reader.readInt();
3181 }
3182
3183 bool readBool() { return Reader.readBool(); }
3184
3185 SourceRange readSourceRange() {
3186 return Reader.readSourceRange();
3187 }
3188
3189 SourceLocation readSourceLocation() {
3190 return Reader.readSourceLocation();
3191 }
3192
3193 Expr *readExpr() { return Reader.readExpr(); }
3194
3195 Attr *readAttr() { return Reader.readAttr(); }
3196
3197 std::string readString() {
3198 return Reader.readString();
3199 }
3200
3201 TypeSourceInfo *readTypeSourceInfo() {
3202 return Reader.readTypeSourceInfo();
3203 }
3204
3205 IdentifierInfo *readIdentifier() {
3206 return Reader.readIdentifier();
3207 }
3208
3209 VersionTuple readVersionTuple() {
3210 return Reader.readVersionTuple();
3211 }
3212
3213 OMPTraitInfo *readOMPTraitInfo() { return Reader.readOMPTraitInfo(); }
3214
3215 template <typename T> T *readDeclAs() { return Reader.readDeclAs<T>(); }
3216};
3217}
3218
3220 AttrReader Record(*this);
3221 auto V = Record.readInt();
3222 if (!V)
3223 return nullptr;
3224
3225 Attr *New = nullptr;
3226 // Kind is stored as a 1-based integer because 0 is used to indicate a null
3227 // Attr pointer.
3228 auto Kind = static_cast<attr::Kind>(V - 1);
3229 ASTContext &Context = getContext();
3230
3231 IdentifierInfo *AttrName = Record.readIdentifier();
3232 IdentifierInfo *ScopeName = Record.readIdentifier();
3233 SourceRange AttrRange = Record.readSourceRange();
3234 SourceLocation ScopeLoc = Record.readSourceLocation();
3235 unsigned ParsedKind = Record.readInt();
3236 unsigned Syntax = Record.readInt();
3237 unsigned SpellingIndex = Record.readInt();
3238 bool IsAlignas = (ParsedKind == AttributeCommonInfo::AT_Aligned &&
3240 SpellingIndex == AlignedAttr::Keyword_alignas);
3241 bool IsRegularKeywordAttribute = Record.readBool();
3242
3243 AttributeCommonInfo Info(AttrName, AttributeScopeInfo(ScopeName, ScopeLoc),
3244 AttrRange, AttributeCommonInfo::Kind(ParsedKind),
3245 {AttributeCommonInfo::Syntax(Syntax), SpellingIndex,
3246 IsAlignas, IsRegularKeywordAttribute});
3247
3248#include "clang/Serialization/AttrPCHRead.inc"
3249
3250 assert(New && "Unable to decode attribute?");
3251 return New;
3252}
3253
3254/// Reads attributes from the current stream position.
3256 for (unsigned I = 0, E = readInt(); I != E; ++I)
3257 if (auto *A = readAttr())
3258 Attrs.push_back(A);
3259}
3260
3261//===----------------------------------------------------------------------===//
3262// ASTReader Implementation
3263//===----------------------------------------------------------------------===//
3264
3265/// Note that we have loaded the declaration with the given
3266/// Index.
3267///
3268/// This routine notes that this declaration has already been loaded,
3269/// so that future GetDecl calls will return this declaration rather
3270/// than trying to load a new declaration.
3271inline void ASTReader::LoadedDecl(unsigned Index, Decl *D) {
3272 assert(!DeclsLoaded[Index] && "Decl loaded twice?");
3273 DeclsLoaded[Index] = D;
3274}
3275
3276/// Determine whether the consumer will be interested in seeing
3277/// this declaration (via HandleTopLevelDecl).
3278///
3279/// This routine should return true for anything that might affect
3280/// code generation, e.g., inline function definitions, Objective-C
3281/// declarations with metadata, etc.
3282bool ASTReader::isConsumerInterestedIn(Decl *D) {
3283 // An ObjCMethodDecl is never considered as "interesting" because its
3284 // implementation container always is.
3285
3286 // An ImportDecl or VarDecl imported from a module map module will get
3287 // emitted when we import the relevant module.
3289 auto *M = D->getImportedOwningModule();
3290 if (M && M->Kind == Module::ModuleMapModule &&
3291 getContext().DeclMustBeEmitted(D))
3292 return false;
3293 }
3294
3295 if (isa<FileScopeAsmDecl, TopLevelStmtDecl, ObjCProtocolDecl, ObjCImplDecl,
3296 ImportDecl, PragmaCommentDecl, PragmaDetectMismatchDecl>(D))
3297 return true;
3298 if (isa<OMPThreadPrivateDecl, OMPDeclareReductionDecl, OMPDeclareMapperDecl,
3299 OMPAllocateDecl, OMPRequiresDecl>(D))
3300 return !D->getDeclContext()->isFunctionOrMethod();
3301 if (const auto *Var = dyn_cast<VarDecl>(D))
3302 return Var->isFileVarDecl() &&
3303 (Var->isThisDeclarationADefinition() == VarDecl::Definition ||
3304 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(Var));
3305 if (const auto *Func = dyn_cast<FunctionDecl>(D))
3306 return Func->doesThisDeclarationHaveABody() || PendingBodies.count(D);
3307
3308 if (auto *ES = D->getASTContext().getExternalSource())
3309 if (ES->hasExternalDefinitions(D) == ExternalASTSource::EK_Never)
3310 return true;
3311
3312 return false;
3313}
3314
3315/// Get the correct cursor and offset for loading a declaration.
3316ASTReader::RecordLocation ASTReader::DeclCursorForID(GlobalDeclID ID,
3317 SourceLocation &Loc) {
3319 assert(M);
3320 unsigned LocalDeclIndex = ID.getLocalDeclIndex();
3321 const DeclOffset &DOffs = M->DeclOffsets[LocalDeclIndex];
3322 Loc = ReadSourceLocation(*M, DOffs.getRawLoc());
3323 return RecordLocation(M, DOffs.getBitOffset(M->DeclsBlockStartOffset));
3324}
3325
3326ASTReader::RecordLocation ASTReader::getLocalBitOffset(uint64_t GlobalOffset) {
3327 auto I = GlobalBitOffsetsMap.find(GlobalOffset);
3328
3329 assert(I != GlobalBitOffsetsMap.end() && "Corrupted global bit offsets map");
3330 return RecordLocation(I->second, GlobalOffset - I->second->GlobalBitOffset);
3331}
3332
3333uint64_t ASTReader::getGlobalBitOffset(ModuleFile &M, uint64_t LocalOffset) {
3334 return LocalOffset + M.GlobalBitOffset;
3335}
3336
3338ASTDeclReader::getOrFakePrimaryClassDefinition(ASTReader &Reader,
3339 CXXRecordDecl *RD) {
3340 // Try to dig out the definition.
3341 auto *DD = RD->DefinitionData;
3342 if (!DD)
3343 DD = RD->getCanonicalDecl()->DefinitionData;
3344
3345 // If there's no definition yet, then DC's definition is added by an update
3346 // record, but we've not yet loaded that update record. In this case, we
3347 // commit to DC being the canonical definition now, and will fix this when
3348 // we load the update record.
3349 if (!DD) {
3350 DD = new (Reader.getContext()) struct CXXRecordDecl::DefinitionData(RD);
3351 RD->setCompleteDefinition(true);
3352 RD->DefinitionData = DD;
3353 RD->getCanonicalDecl()->DefinitionData = DD;
3354
3355 // Track that we did this horrible thing so that we can fix it later.
3356 Reader.PendingFakeDefinitionData.insert(
3357 std::make_pair(DD, ASTReader::PendingFakeDefinitionKind::Fake));
3358 }
3359
3360 return DD->Definition;
3361}
3362
3363/// Find the context in which we should search for previous declarations when
3364/// looking for declarations to merge.
3365DeclContext *ASTDeclReader::getPrimaryContextForMerging(ASTReader &Reader,
3366 DeclContext *DC) {
3367 if (auto *ND = dyn_cast<NamespaceDecl>(DC))
3368 return ND->getFirstDecl();
3369
3370 if (auto *RD = dyn_cast<CXXRecordDecl>(DC))
3371 return getOrFakePrimaryClassDefinition(Reader, RD);
3372
3373 if (auto *RD = dyn_cast<RecordDecl>(DC))
3374 return RD->getDefinition();
3375
3376 if (auto *ED = dyn_cast<EnumDecl>(DC))
3377 return ED->getDefinition();
3378
3379 if (auto *OID = dyn_cast<ObjCInterfaceDecl>(DC))
3380 return OID->getDefinition();
3381
3382 // We can see the TU here only if we have no Sema object. It is possible
3383 // we're in clang-repl so we still need to get the primary context.
3384 if (auto *TU = dyn_cast<TranslationUnitDecl>(DC))
3385 return TU->getPrimaryContext();
3386
3387 return nullptr;
3388}
3389
3390ASTDeclReader::FindExistingResult::~FindExistingResult() {
3391 // Record that we had a typedef name for linkage whether or not we merge
3392 // with that declaration.
3393 if (TypedefNameForLinkage) {
3394 DeclContext *DC = New->getDeclContext()->getRedeclContext();
3395 Reader.ImportedTypedefNamesForLinkage.insert(
3396 std::make_pair(std::make_pair(DC, TypedefNameForLinkage), New));
3397 return;
3398 }
3399
3400 if (!AddResult || Existing)
3401 return;
3402
3403 DeclarationName Name = New->getDeclName();
3404 DeclContext *DC = New->getDeclContext()->getRedeclContext();
3406 setAnonymousDeclForMerging(Reader, New->getLexicalDeclContext(),
3407 AnonymousDeclNumber, New);
3408 } else if (DC->isTranslationUnit() &&
3409 !Reader.getContext().getLangOpts().CPlusPlus) {
3410 if (Reader.getIdResolver().tryAddTopLevelDecl(New, Name))
3411 Reader.PendingFakeLookupResults[Name.getAsIdentifierInfo()]
3412 .push_back(New);
3413 } else if (DeclContext *MergeDC = getPrimaryContextForMerging(Reader, DC)) {
3414 // Add the declaration to its redeclaration context so later merging
3415 // lookups will find it.
3416 MergeDC->makeDeclVisibleInContextImpl(New, /*Internal*/true);
3417 }
3418}
3419
3420/// Find the declaration that should be merged into, given the declaration found
3421/// by name lookup. If we're merging an anonymous declaration within a typedef,
3422/// we need a matching typedef, and we merge with the type inside it.
3424 bool IsTypedefNameForLinkage) {
3425 if (!IsTypedefNameForLinkage)
3426 return Found;
3427
3428 // If we found a typedef declaration that gives a name to some other
3429 // declaration, then we want that inner declaration. Declarations from
3430 // AST files are handled via ImportedTypedefNamesForLinkage.
3431 if (Found->isFromASTFile())
3432 return nullptr;
3433
3434 if (auto *TND = dyn_cast<TypedefNameDecl>(Found))
3435 return TND->getAnonDeclWithTypedefName(/*AnyRedecl*/true);
3436
3437 return nullptr;
3438}
3439
3440/// Find the declaration to use to populate the anonymous declaration table
3441/// for the given lexical DeclContext. We only care about finding local
3442/// definitions of the context; we'll merge imported ones as we go.
3443DeclContext *
3444ASTDeclReader::getPrimaryDCForAnonymousDecl(DeclContext *LexicalDC) {
3445 // For classes, we track the definition as we merge.
3446 if (auto *RD = dyn_cast<CXXRecordDecl>(LexicalDC)) {
3447 auto *DD = RD->getCanonicalDecl()->DefinitionData;
3448 return DD ? DD->Definition : nullptr;
3449 } else if (auto *OID = dyn_cast<ObjCInterfaceDecl>(LexicalDC)) {
3450 return OID->getCanonicalDecl()->getDefinition();
3451 }
3452
3453 // For anything else, walk its merged redeclarations looking for a definition.
3454 // Note that we can't just call getDefinition here because the redeclaration
3455 // chain isn't wired up.
3456 for (auto *D : merged_redecls(cast<Decl>(LexicalDC))) {
3457 if (auto *FD = dyn_cast<FunctionDecl>(D))
3458 if (FD->isThisDeclarationADefinition())
3459 return FD;
3460 if (auto *MD = dyn_cast<ObjCMethodDecl>(D))
3461 if (MD->isThisDeclarationADefinition())
3462 return MD;
3463 if (auto *RD = dyn_cast<RecordDecl>(D))
3465 return RD;
3466 }
3467
3468 // No merged definition yet.
3469 return nullptr;
3470}
3471
3472NamedDecl *ASTDeclReader::getAnonymousDeclForMerging(ASTReader &Reader,
3473 DeclContext *DC,
3474 unsigned Index) {
3475 // If the lexical context has been merged, look into the now-canonical
3476 // definition.
3477 auto *CanonDC = cast<Decl>(DC)->getCanonicalDecl();
3478
3479 // If we've seen this before, return the canonical declaration.
3480 auto &Previous = Reader.AnonymousDeclarationsForMerging[CanonDC];
3481 if (Index < Previous.size() && Previous[Index])
3482 return Previous[Index];
3483
3484 // If this is the first time, but we have parsed a declaration of the context,
3485 // build the anonymous declaration list from the parsed declaration.
3486 auto *PrimaryDC = getPrimaryDCForAnonymousDecl(DC);
3487 auto needToNumberAnonymousDeclsWithin = [](Decl *D) {
3488 if (!D->isFromASTFile())
3489 return true;
3490 // If this is a class template specialization from an AST file, has at least
3491 // one field, but none of the fields have been loaded from external storage,
3492 // this is a situation where the class template specialization decl
3493 // was imported but the definition was instantiated within the source.
3494 // In such a case, we still need to number the anonymous decls.
3495 auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D);
3496 return CTSD && !CTSD->noload_field_empty() &&
3497 !CTSD->hasLoadedFieldsFromExternalStorage();
3498 };
3499 if (PrimaryDC && needToNumberAnonymousDeclsWithin(cast<Decl>(PrimaryDC))) {
3500 numberAnonymousDeclsWithin(PrimaryDC, [&](NamedDecl *ND, unsigned Number) {
3501 if (Previous.size() == Number)
3502 Previous.push_back(cast<NamedDecl>(ND->getCanonicalDecl()));
3503 else
3505 });
3506 }
3507
3508 return Index < Previous.size() ? Previous[Index] : nullptr;
3509}
3510
3511void ASTDeclReader::setAnonymousDeclForMerging(ASTReader &Reader,
3512 DeclContext *DC, unsigned Index,
3513 NamedDecl *D) {
3514 auto *CanonDC = cast<Decl>(DC)->getCanonicalDecl();
3515
3516 auto &Previous = Reader.AnonymousDeclarationsForMerging[CanonDC];
3517 if (Index >= Previous.size())
3518 Previous.resize(Index + 1);
3519 if (!Previous[Index])
3520 Previous[Index] = D;
3521}
3522
3523ASTDeclReader::FindExistingResult ASTDeclReader::findExisting(NamedDecl *D) {
3524 DeclarationName Name = TypedefNameForLinkage ? TypedefNameForLinkage
3525 : D->getDeclName();
3526
3527 if (!Name && !needsAnonymousDeclarationNumber(D)) {
3528 // Don't bother trying to find unnamed declarations that are in
3529 // unmergeable contexts.
3530 FindExistingResult Result(Reader, D, /*Existing=*/nullptr,
3531 AnonymousDeclNumber, TypedefNameForLinkage);
3532 Result.suppress();
3533 return Result;
3534 }
3535
3536 ASTContext &C = Reader.getContext();
3537 DeclContext *DC = D->getDeclContext()->getRedeclContext();
3538 if (TypedefNameForLinkage) {
3539 auto It = Reader.ImportedTypedefNamesForLinkage.find(
3540 std::make_pair(DC, TypedefNameForLinkage));
3541 if (It != Reader.ImportedTypedefNamesForLinkage.end())
3542 if (C.isSameEntity(It->second, D))
3543 return FindExistingResult(Reader, D, It->second, AnonymousDeclNumber,
3544 TypedefNameForLinkage);
3545 // Go on to check in other places in case an existing typedef name
3546 // was not imported.
3547 }
3548
3550 // This is an anonymous declaration that we may need to merge. Look it up
3551 // in its context by number.
3552 if (auto *Existing = getAnonymousDeclForMerging(
3553 Reader, D->getLexicalDeclContext(), AnonymousDeclNumber))
3554 if (C.isSameEntity(Existing, D))
3555 return FindExistingResult(Reader, D, Existing, AnonymousDeclNumber,
3556 TypedefNameForLinkage);
3557 } else if (DC->isTranslationUnit() &&
3558 !Reader.getContext().getLangOpts().CPlusPlus) {
3559 IdentifierResolver &IdResolver = Reader.getIdResolver();
3560
3561 // Temporarily consider the identifier to be up-to-date. We don't want to
3562 // cause additional lookups here.
3563 class UpToDateIdentifierRAII {
3564 IdentifierInfo *II;
3565 bool WasOutToDate = false;
3566
3567 public:
3568 explicit UpToDateIdentifierRAII(IdentifierInfo *II) : II(II) {
3569 if (II) {
3570 WasOutToDate = II->isOutOfDate();
3571 if (WasOutToDate)
3572 II->setOutOfDate(false);
3573 }
3574 }
3575
3576 ~UpToDateIdentifierRAII() {
3577 if (WasOutToDate)
3578 II->setOutOfDate(true);
3579 }
3580 } UpToDate(Name.getAsIdentifierInfo());
3581
3582 for (IdentifierResolver::iterator I = IdResolver.begin(Name),
3583 IEnd = IdResolver.end();
3584 I != IEnd; ++I) {
3585 if (NamedDecl *Existing = getDeclForMerging(*I, TypedefNameForLinkage))
3586 if (C.isSameEntity(Existing, D))
3587 return FindExistingResult(Reader, D, Existing, AnonymousDeclNumber,
3588 TypedefNameForLinkage);
3589 }
3590 } else if (DeclContext *MergeDC = getPrimaryContextForMerging(Reader, DC)) {
3591 DeclContext::lookup_result R = MergeDC->noload_lookup(Name);
3592 for (DeclContext::lookup_iterator I = R.begin(), E = R.end(); I != E; ++I) {
3593 if (NamedDecl *Existing = getDeclForMerging(*I, TypedefNameForLinkage))
3594 if (C.isSameEntity(Existing, D))
3595 return FindExistingResult(Reader, D, Existing, AnonymousDeclNumber,
3596 TypedefNameForLinkage);
3597 }
3598 } else {
3599 // Not in a mergeable context.
3600 return FindExistingResult(Reader);
3601 }
3602
3603 // If this declaration is from a merged context, make a note that we need to
3604 // check that the canonical definition of that context contains the decl.
3605 //
3606 // Note that we don't perform ODR checks for decls from the global module
3607 // fragment.
3608 //
3609 // FIXME: We should do something similar if we merge two definitions of the
3610 // same template specialization into the same CXXRecordDecl.
3611 auto MergedDCIt = Reader.MergedDeclContexts.find(D->getLexicalDeclContext());
3612 if (MergedDCIt != Reader.MergedDeclContexts.end() &&
3613 !shouldSkipCheckingODR(D) && MergedDCIt->second == D->getDeclContext() &&
3615 Reader.PendingOdrMergeChecks.push_back(D);
3616
3617 return FindExistingResult(Reader, D, /*Existing=*/nullptr,
3618 AnonymousDeclNumber, TypedefNameForLinkage);
3619}
3620
3621template<typename DeclT>
3625
3627 llvm_unreachable("getMostRecentDecl on non-redeclarable declaration");
3628}
3629
3631 assert(D);
3632
3633 switch (D->getKind()) {
3634#define ABSTRACT_DECL(TYPE)
3635#define DECL(TYPE, BASE) \
3636 case Decl::TYPE: \
3637 return getMostRecentDeclImpl(cast<TYPE##Decl>(D));
3638#include "clang/AST/DeclNodes.inc"
3639 }
3640 llvm_unreachable("unknown decl kind");
3641}
3642
3643Decl *ASTReader::getMostRecentExistingDecl(Decl *D) {
3645}
3646
3647namespace {
3648void mergeInheritableAttributes(ASTReader &Reader, Decl *D, Decl *Previous) {
3649 InheritableAttr *NewAttr = nullptr;
3650 ASTContext &Context = Reader.getContext();
3651 const auto *IA = Previous->getAttr<MSInheritanceAttr>();
3652
3653 if (IA && !D->hasAttr<MSInheritanceAttr>()) {
3654 NewAttr = cast<InheritableAttr>(IA->clone(Context));
3655 NewAttr->setInherited(true);
3656 D->addAttr(NewAttr);
3657 }
3658
3659 if (!D->hasAttr<AvailabilityAttr>()) {
3660 for (const auto *AA : Previous->specific_attrs<AvailabilityAttr>()) {
3661 NewAttr = AA->clone(Context);
3662 NewAttr->setInherited(true);
3663 D->addAttr(NewAttr);
3664 }
3665 }
3666}
3667} // namespace
3668
3669template<typename DeclT>
3676
3677namespace clang {
3678
3679template<>
3682 Decl *Previous, Decl *Canon) {
3683 auto *PrevVD = cast<VarDecl>(Previous);
3684 D->RedeclLink.setPrevious(PrevVD);
3685 D->First = PrevVD->First;
3686
3687 // We should keep at most one definition on the chain.
3688 // FIXME: Cache the definition once we've found it. Building a chain with
3689 // N definitions currently takes O(N^2) time here.
3690 auto *VD = static_cast<VarDecl *>(D);
3691 if (VD->isThisDeclarationADefinition() == VarDecl::Definition) {
3692 for (VarDecl *CurD = PrevVD; CurD; CurD = CurD->getPreviousDecl()) {
3693 if (CurD->isThisDeclarationADefinition() == VarDecl::Definition) {
3694 // FIXME: For header modules, there are some problems if we don't
3695 // demote definition to declaration.
3696 // See clang/test/Modules/module-init-forcelly-loaded-module.cpp
3697 // for example. Maybe we are able to handle the CodeGen part
3698 // to avoid it emitting duplicated definitions. But just workaround
3699 // now temporarily.
3700 if (VD->getOwningModule() &&
3701 VD->getOwningModule()->isHeaderLikeModule())
3702 VD->demoteThisDefinitionToDeclaration();
3703 Reader.mergeDefinitionVisibility(CurD, VD);
3704 break;
3705 }
3706 }
3707 }
3708}
3709
3711 auto *DT = T->getContainedDeducedType();
3712 return DT && !DT->isDeduced();
3713}
3714
3715template<>
3718 Decl *Previous, Decl *Canon) {
3719 auto *FD = static_cast<FunctionDecl *>(D);
3720 auto *PrevFD = cast<FunctionDecl>(Previous);
3721
3722 FD->RedeclLink.setPrevious(PrevFD);
3723 FD->First = PrevFD->First;
3724
3725 // If the previous declaration is an inline function declaration, then this
3726 // declaration is too.
3727 if (PrevFD->isInlined() != FD->isInlined()) {
3728 // FIXME: [dcl.fct.spec]p4:
3729 // If a function with external linkage is declared inline in one
3730 // translation unit, it shall be declared inline in all translation
3731 // units in which it appears.
3732 //
3733 // Be careful of this case:
3734 //
3735 // module A:
3736 // template<typename T> struct X { void f(); };
3737 // template<typename T> inline void X<T>::f() {}
3738 //
3739 // module B instantiates the declaration of X<int>::f
3740 // module C instantiates the definition of X<int>::f
3741 //
3742 // If module B and C are merged, we do not have a violation of this rule.
3743 FD->setImplicitlyInline(true);
3744 }
3745
3746 auto *FPT = FD->getType()->getAs<FunctionProtoType>();
3747 auto *PrevFPT = PrevFD->getType()->getAs<FunctionProtoType>();
3748 if (FPT && PrevFPT) {
3749 // If we need to propagate an exception specification along the redecl
3750 // chain, make a note of that so that we can do so later.
3751 bool IsUnresolved = isUnresolvedExceptionSpec(FPT->getExceptionSpecType());
3752 bool WasUnresolved =
3754 if (IsUnresolved != WasUnresolved)
3755 Reader.PendingExceptionSpecUpdates.insert(
3756 {Canon, IsUnresolved ? PrevFD : FD});
3757
3758 // If we need to propagate a deduced return type along the redecl chain,
3759 // make a note of that so that we can do it later.
3760 bool IsUndeduced = isUndeducedReturnType(FPT->getReturnType());
3761 bool WasUndeduced = isUndeducedReturnType(PrevFPT->getReturnType());
3762 if (IsUndeduced != WasUndeduced)
3763 Reader.PendingDeducedTypeUpdates.insert(
3764 {cast<FunctionDecl>(Canon),
3765 (IsUndeduced ? PrevFPT : FPT)->getReturnType()});
3766 }
3767}
3768
3769} // namespace clang
3770
3772 llvm_unreachable("attachPreviousDecl on non-redeclarable declaration");
3773}
3774
3775/// Inherit the default template argument from \p From to \p To. Returns
3776/// \c false if there is no default template for \p From.
3777template <typename ParmDecl>
3778static bool inheritDefaultTemplateArgument(ASTContext &Context, ParmDecl *From,
3779 Decl *ToD) {
3780 auto *To = cast<ParmDecl>(ToD);
3781 if (!From->hasDefaultArgument())
3782 return false;
3783 To->setInheritedDefaultArgument(Context, From);
3784 return true;
3785}
3786
3788 TemplateDecl *From,
3789 TemplateDecl *To) {
3790 auto *FromTP = From->getTemplateParameters();
3791 auto *ToTP = To->getTemplateParameters();
3792 assert(FromTP->size() == ToTP->size() && "merged mismatched templates?");
3793
3794 for (unsigned I = 0, N = FromTP->size(); I != N; ++I) {
3795 NamedDecl *FromParam = FromTP->getParam(I);
3796 NamedDecl *ToParam = ToTP->getParam(I);
3797
3798 if (auto *FTTP = dyn_cast<TemplateTypeParmDecl>(FromParam))
3799 inheritDefaultTemplateArgument(Context, FTTP, ToParam);
3800 else if (auto *FNTTP = dyn_cast<NonTypeTemplateParmDecl>(FromParam))
3801 inheritDefaultTemplateArgument(Context, FNTTP, ToParam);
3802 else
3804 Context, cast<TemplateTemplateParmDecl>(FromParam), ToParam);
3805 }
3806}
3807
3808// [basic.link]/p10:
3809// If two declarations of an entity are attached to different modules,
3810// the program is ill-formed;
3812 Decl *D,
3813 Decl *Previous) {
3814 // If it is previous implcitly introduced, it is not meaningful to
3815 // diagnose it.
3816 if (Previous->isImplicit())
3817 return;
3818
3819 // FIXME: Get rid of the enumeration of decl types once we have an appropriate
3820 // abstract for decls of an entity. e.g., the namespace decl and using decl
3821 // doesn't introduce an entity.
3823 return;
3824
3825 // Skip implicit instantiations since it may give false positive diagnostic
3826 // messages.
3827 // FIXME: Maybe this shows the implicit instantiations may have incorrect
3828 // module owner ships. But given we've finished the compilation of a module,
3829 // how can we add new entities to that module?
3831 return;
3833 return;
3834 if (auto *Func = dyn_cast<FunctionDecl>(Previous);
3835 Func && Func->getTemplateSpecializationInfo())
3836 return;
3837
3838 // The module ownership of in-class friend declaration is not straightforward.
3839 // Avoid diagnosing such cases.
3840 if (D->getFriendObjectKind() || Previous->getFriendObjectKind())
3841 return;
3842
3843 // Skip diagnosing in-class declarations.
3844 if (!Previous->getLexicalDeclContext()
3845 ->getNonTransparentContext()
3846 ->isFileContext() ||
3848 return;
3849
3850 Module *M = Previous->getOwningModule();
3851 if (!M)
3852 return;
3853
3854 // We only forbids merging decls within named modules.
3855 if (!M->isNamedModule()) {
3856 // Try to warn the case that we merged decls from global module.
3857 if (!M->isGlobalModule())
3858 return;
3859
3860 if (D->getOwningModule() &&
3862 return;
3863
3864 Reader.PendingWarningForDuplicatedDefsInModuleUnits.push_back(
3865 {D, Previous});
3866 return;
3867 }
3868
3869 // It is fine if they are in the same module.
3870 if (Reader.getContext().isInSameModule(M, D->getOwningModule()))
3871 return;
3872
3873 Reader.Diag(Previous->getLocation(),
3874 diag::err_multiple_decl_in_different_modules)
3875 << cast<NamedDecl>(Previous) << M->Name;
3876 Reader.Diag(D->getLocation(), diag::note_also_found);
3877}
3878
3880 Decl *Previous, Decl *Canon) {
3881 assert(D && Previous);
3882
3883 switch (D->getKind()) {
3884#define ABSTRACT_DECL(TYPE)
3885#define DECL(TYPE, BASE) \
3886 case Decl::TYPE: \
3887 attachPreviousDeclImpl(Reader, cast<TYPE##Decl>(D), Previous, Canon); \
3888 break;
3889#include "clang/AST/DeclNodes.inc"
3890 }
3891
3893
3894 // If the declaration was visible in one module, a redeclaration of it in
3895 // another module remains visible even if it wouldn't be visible by itself.
3896 //
3897 // FIXME: In this case, the declaration should only be visible if a module
3898 // that makes it visible has been imported.
3900 Previous->IdentifierNamespace &
3902
3903 // If the declaration declares a template, it may inherit default arguments
3904 // from the previous declaration.
3905 if (auto *TD = dyn_cast<TemplateDecl>(D))
3906 inheritDefaultTemplateArguments(Reader.getContext(),
3908
3909 // If any of the declaration in the chain contains an Inheritable attribute,
3910 // it needs to be added to all the declarations in the redeclarable chain.
3911 // FIXME: Only the logic of merging MSInheritableAttr is present, it should
3912 // be extended for all inheritable attributes.
3913 mergeInheritableAttributes(Reader, D, Previous);
3914}
3915
3916template<typename DeclT>
3920
3922 llvm_unreachable("attachLatestDecl on non-redeclarable declaration");
3923}
3924
3926 assert(D && Latest);
3927
3928 switch (D->getKind()) {
3929#define ABSTRACT_DECL(TYPE)
3930#define DECL(TYPE, BASE) \
3931 case Decl::TYPE: \
3932 attachLatestDeclImpl(cast<TYPE##Decl>(D), Latest); \
3933 break;
3934#include "clang/AST/DeclNodes.inc"
3935 }
3936}
3937
3938template<typename DeclT>
3942
3944 llvm_unreachable("markIncompleteDeclChain on non-redeclarable declaration");
3945}
3946
3947void ASTReader::markIncompleteDeclChain(Decl *D) {
3948 switch (D->getKind()) {
3949#define ABSTRACT_DECL(TYPE)
3950#define DECL(TYPE, BASE) \
3951 case Decl::TYPE: \
3952 ASTDeclReader::markIncompleteDeclChainImpl(cast<TYPE##Decl>(D)); \
3953 break;
3954#include "clang/AST/DeclNodes.inc"
3955 }
3956}
3957
3958/// Read the declaration at the given offset from the AST file.
3959Decl *ASTReader::ReadDeclRecord(GlobalDeclID ID) {
3960 SourceLocation DeclLoc;
3961 RecordLocation Loc = DeclCursorForID(ID, DeclLoc);
3962 llvm::BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
3963 // Keep track of where we are in the stream, then jump back there
3964 // after reading this declaration.
3965 SavedStreamPosition SavedPosition(DeclsCursor);
3966
3967 ReadingKindTracker ReadingKind(Read_Decl, *this);
3968
3969 // Note that we are loading a declaration record.
3970 Deserializing ADecl(this);
3971
3972 auto Fail = [](const char *what, llvm::Error &&Err) {
3973 llvm::report_fatal_error(Twine("ASTReader::readDeclRecord failed ") + what +
3974 ": " + toString(std::move(Err)));
3975 };
3976
3977 if (llvm::Error JumpFailed = DeclsCursor.JumpToBit(Loc.Offset))
3978 Fail("jumping", std::move(JumpFailed));
3979 ASTRecordReader Record(*this, *Loc.F);
3980 ASTDeclReader Reader(*this, Record, Loc, ID, DeclLoc);
3981 Expected<unsigned> MaybeCode = DeclsCursor.ReadCode();
3982 if (!MaybeCode)
3983 Fail("reading code", MaybeCode.takeError());
3984 unsigned Code = MaybeCode.get();
3985
3986 ASTContext &Context = getContext();
3987 Decl *D = nullptr;
3988 Expected<unsigned> MaybeDeclCode = Record.readRecord(DeclsCursor, Code);
3989 if (!MaybeDeclCode)
3990 llvm::report_fatal_error(
3991 Twine("ASTReader::readDeclRecord failed reading decl code: ") +
3992 toString(MaybeDeclCode.takeError()));
3993
3994 switch ((DeclCode)MaybeDeclCode.get()) {
4001 llvm_unreachable("Record cannot be de-serialized with readDeclRecord");
4002 case DECL_TYPEDEF:
4003 D = TypedefDecl::CreateDeserialized(Context, ID);
4004 break;
4005 case DECL_TYPEALIAS:
4006 D = TypeAliasDecl::CreateDeserialized(Context, ID);
4007 break;
4008 case DECL_ENUM:
4009 D = EnumDecl::CreateDeserialized(Context, ID);
4010 break;
4011 case DECL_RECORD:
4012 D = RecordDecl::CreateDeserialized(Context, ID);
4013 break;
4014 case DECL_ENUM_CONSTANT:
4015 D = EnumConstantDecl::CreateDeserialized(Context, ID);
4016 break;
4017 case DECL_FUNCTION:
4018 D = FunctionDecl::CreateDeserialized(Context, ID);
4019 break;
4020 case DECL_LINKAGE_SPEC:
4021 D = LinkageSpecDecl::CreateDeserialized(Context, ID);
4022 break;
4023 case DECL_EXPORT:
4024 D = ExportDecl::CreateDeserialized(Context, ID);
4025 break;
4026 case DECL_LABEL:
4027 D = LabelDecl::CreateDeserialized(Context, ID);
4028 break;
4029 case DECL_NAMESPACE:
4030 D = NamespaceDecl::CreateDeserialized(Context, ID);
4031 break;
4034 break;
4035 case DECL_USING:
4036 D = UsingDecl::CreateDeserialized(Context, ID);
4037 break;
4038 case DECL_USING_PACK:
4039 D = UsingPackDecl::CreateDeserialized(Context, ID, Record.readInt());
4040 break;
4041 case DECL_USING_SHADOW:
4042 D = UsingShadowDecl::CreateDeserialized(Context, ID);
4043 break;
4044 case DECL_USING_ENUM:
4045 D = UsingEnumDecl::CreateDeserialized(Context, ID);
4046 break;
4049 break;
4052 break;
4055 break;
4058 break;
4061 break;
4062 case DECL_CXX_RECORD:
4063 D = CXXRecordDecl::CreateDeserialized(Context, ID);
4064 break;
4067 break;
4068 case DECL_CXX_METHOD:
4069 D = CXXMethodDecl::CreateDeserialized(Context, ID);
4070 break;
4072 D = CXXConstructorDecl::CreateDeserialized(Context, ID, Record.readInt());
4073 break;
4076 break;
4079 break;
4080 case DECL_ACCESS_SPEC:
4081 D = AccessSpecDecl::CreateDeserialized(Context, ID);
4082 break;
4083 case DECL_FRIEND:
4084 D = FriendDecl::CreateDeserialized(Context, ID);
4085 break;
4088 /*NumTPLists=*/Record.readInt());
4089 break;
4092 break;
4095 break;
4098 break;
4099 case DECL_VAR_TEMPLATE:
4100 D = VarTemplateDecl::CreateDeserialized(Context, ID);
4101 break;
4104 break;
4107 break;
4110 break;
4112 bool HasTypeConstraint = Record.readInt();
4114 HasTypeConstraint);
4115 break;
4116 }
4118 bool HasTypeConstraint = Record.readInt();
4120 HasTypeConstraint);
4121 break;
4122 }
4124 bool HasTypeConstraint = Record.readInt();
4126 Context, ID, Record.readInt(), HasTypeConstraint);
4127 break;
4128 }
4131 break;
4134 Record.readInt());
4135 break;
4138 break;
4139 case DECL_CONCEPT:
4140 D = ConceptDecl::CreateDeserialized(Context, ID);
4141 break;
4144 break;
4145 case DECL_STATIC_ASSERT:
4146 D = StaticAssertDecl::CreateDeserialized(Context, ID);
4147 break;
4150 Record.readInt());
4151 break;
4152 case DECL_OBJC_METHOD:
4153 D = ObjCMethodDecl::CreateDeserialized(Context, ID);
4154 break;
4157 break;
4158 case DECL_OBJC_IVAR:
4159 D = ObjCIvarDecl::CreateDeserialized(Context, ID);
4160 break;
4161 case DECL_OBJC_PROTOCOL:
4162 D = ObjCProtocolDecl::CreateDeserialized(Context, ID);
4163 break;
4166 break;
4167 case DECL_OBJC_CATEGORY:
4168 D = ObjCCategoryDecl::CreateDeserialized(Context, ID);
4169 break;
4172 break;
4175 break;
4178 break;
4179 case DECL_OBJC_PROPERTY:
4180 D = ObjCPropertyDecl::CreateDeserialized(Context, ID);
4181 break;
4184 break;
4185 case DECL_FIELD:
4186 D = FieldDecl::CreateDeserialized(Context, ID);
4187 break;
4188 case DECL_INDIRECTFIELD:
4190 break;
4191 case DECL_VAR:
4192 D = VarDecl::CreateDeserialized(Context, ID);
4193 break;
4196 break;
4197 case DECL_PARM_VAR:
4198 D = ParmVarDecl::CreateDeserialized(Context, ID);
4199 break;
4200 case DECL_DECOMPOSITION:
4201 D = DecompositionDecl::CreateDeserialized(Context, ID, Record.readInt());
4202 break;
4203 case DECL_BINDING:
4204 D = BindingDecl::CreateDeserialized(Context, ID);
4205 break;
4207 D = FileScopeAsmDecl::CreateDeserialized(Context, ID);
4208 break;
4210 D = TopLevelStmtDecl::CreateDeserialized(Context, ID);
4211 break;
4212 case DECL_BLOCK:
4213 D = BlockDecl::CreateDeserialized(Context, ID);
4214 break;
4215 case DECL_MS_PROPERTY:
4216 D = MSPropertyDecl::CreateDeserialized(Context, ID);
4217 break;
4218 case DECL_MS_GUID:
4219 D = MSGuidDecl::CreateDeserialized(Context, ID);
4220 break;
4222 D = UnnamedGlobalConstantDecl::CreateDeserialized(Context, ID);
4223 break;
4225 D = TemplateParamObjectDecl::CreateDeserialized(Context, ID);
4226 break;
4228 D = OutlinedFunctionDecl::CreateDeserialized(Context, ID, Record.readInt());
4229 break;
4230 case DECL_CAPTURED:
4231 D = CapturedDecl::CreateDeserialized(Context, ID, Record.readInt());
4232 break;
4234 Error("attempt to read a C++ base-specifier record as a declaration");
4235 return nullptr;
4237 Error("attempt to read a C++ ctor initializer record as a declaration");
4238 return nullptr;
4239 case DECL_IMPORT:
4240 // Note: last entry of the ImportDecl record is the number of stored source
4241 // locations.
4242 D = ImportDecl::CreateDeserialized(Context, ID, Record.back());
4243 break;
4245 Record.skipInts(1);
4246 unsigned NumChildren = Record.readInt();
4247 Record.skipInts(1);
4248 D = OMPThreadPrivateDecl::CreateDeserialized(Context, ID, NumChildren);
4249 break;
4250 }
4251 case DECL_OMP_ALLOCATE: {
4252 unsigned NumClauses = Record.readInt();
4253 unsigned NumVars = Record.readInt();
4254 Record.skipInts(1);
4255 D = OMPAllocateDecl::CreateDeserialized(Context, ID, NumVars, NumClauses);
4256 break;
4257 }
4258 case DECL_OMP_REQUIRES: {
4259 unsigned NumClauses = Record.readInt();
4260 Record.skipInts(2);
4261 D = OMPRequiresDecl::CreateDeserialized(Context, ID, NumClauses);
4262 break;
4263 }
4266 break;
4268 unsigned NumClauses = Record.readInt();
4269 Record.skipInts(2);
4270 D = OMPDeclareMapperDecl::CreateDeserialized(Context, ID, NumClauses);
4271 break;
4272 }
4275 break;
4277 D = PragmaCommentDecl::CreateDeserialized(Context, ID, Record.readInt());
4278 break;
4281 Record.readInt());
4282 break;
4283 case DECL_EMPTY:
4284 D = EmptyDecl::CreateDeserialized(Context, ID);
4285 break;
4288 break;
4291 break;
4292 case DECL_HLSL_BUFFER:
4293 D = HLSLBufferDecl::CreateDeserialized(Context, ID);
4294 break;
4297 Record.readInt());
4298 break;
4300 D = OpenACCDeclareDecl::CreateDeserialized(Context, ID, Record.readInt());
4301 break;
4303 D = OpenACCRoutineDecl::CreateDeserialized(Context, ID, Record.readInt());
4304 break;
4305 }
4306
4307 assert(D && "Unknown declaration reading AST file");
4308 LoadedDecl(translateGlobalDeclIDToIndex(ID), D);
4309 // Set the DeclContext before doing any deserialization, to make sure internal
4310 // calls to Decl::getASTContext() by Decl's methods will find the
4311 // TranslationUnitDecl without crashing.
4313
4314 // Reading some declarations can result in deep recursion.
4315 runWithSufficientStackSpace(DeclLoc, [&] { Reader.Visit(D); });
4316
4317 // If this declaration is also a declaration context, get the
4318 // offsets for its tables of lexical and visible declarations.
4319 if (auto *DC = dyn_cast<DeclContext>(D)) {
4320 LookupBlockOffsets Offsets;
4321
4322 Reader.VisitDeclContext(DC, Offsets);
4323
4324 // Get the lexical and visible block for the delayed namespace.
4325 // It is sufficient to judge if ID is in DelayedNamespaceOffsetMap.
4326 // But it may be more efficient to filter the other cases.
4327 if (!Offsets && isa<NamespaceDecl>(D))
4328 if (auto Iter = DelayedNamespaceOffsetMap.find(ID);
4329 Iter != DelayedNamespaceOffsetMap.end())
4330 Offsets = Iter->second;
4331
4332 if (Offsets.VisibleOffset &&
4333 ReadVisibleDeclContextStorage(
4334 *Loc.F, DeclsCursor, Offsets.VisibleOffset, ID,
4335 VisibleDeclContextStorageKind::GenerallyVisible))
4336 return nullptr;
4337 if (Offsets.ModuleLocalOffset &&
4338 ReadVisibleDeclContextStorage(
4339 *Loc.F, DeclsCursor, Offsets.ModuleLocalOffset, ID,
4340 VisibleDeclContextStorageKind::ModuleLocalVisible))
4341 return nullptr;
4342 if (Offsets.TULocalOffset &&
4343 ReadVisibleDeclContextStorage(
4344 *Loc.F, DeclsCursor, Offsets.TULocalOffset, ID,
4345 VisibleDeclContextStorageKind::TULocalVisible))
4346 return nullptr;
4347
4348 if (Offsets.LexicalOffset &&
4349 ReadLexicalDeclContextStorage(*Loc.F, DeclsCursor,
4350 Offsets.LexicalOffset, DC))
4351 return nullptr;
4352 }
4353 assert(Record.getIdx() == Record.size());
4354
4355 // Load any relevant update records.
4356 PendingUpdateRecords.push_back(
4357 PendingUpdateRecord(ID, D, /*JustLoaded=*/true));
4358
4359 // Load the categories after recursive loading is finished.
4360 if (auto *Class = dyn_cast<ObjCInterfaceDecl>(D))
4361 // If we already have a definition when deserializing the ObjCInterfaceDecl,
4362 // we put the Decl in PendingDefinitions so we can pull the categories here.
4363 if (Class->isThisDeclarationADefinition() ||
4364 PendingDefinitions.count(Class))
4365 loadObjCCategories(ID, Class);
4366
4367 // If we have deserialized a declaration that has a definition the
4368 // AST consumer might need to know about, queue it.
4369 // We don't pass it to the consumer immediately because we may be in recursive
4370 // loading, and some declarations may still be initializing.
4371 PotentiallyInterestingDecls.push_back(D);
4372
4373 return D;
4374}
4375
4376void ASTReader::PassInterestingDeclsToConsumer() {
4377 assert(Consumer);
4378
4379 if (!CanPassDeclsToConsumer)
4380 return;
4381
4382 // Guard variable to avoid recursively redoing the process of passing
4383 // decls to consumer.
4384 SaveAndRestore GuardPassingDeclsToConsumer(CanPassDeclsToConsumer,
4385 /*NewValue=*/false);
4386
4387 // Ensure that we've loaded all potentially-interesting declarations
4388 // that need to be eagerly loaded.
4389 for (auto ID : EagerlyDeserializedDecls)
4390 GetDecl(ID);
4391 EagerlyDeserializedDecls.clear();
4392
4393 auto ConsumingPotentialInterestingDecls = [this]() {
4394 while (!PotentiallyInterestingDecls.empty()) {
4395 Decl *D = PotentiallyInterestingDecls.front();
4396 PotentiallyInterestingDecls.pop_front();
4397 if (isConsumerInterestedIn(D))
4398 PassInterestingDeclToConsumer(D);
4399 }
4400 };
4401 std::deque<Decl *> MaybeInterestingDecls =
4402 std::move(PotentiallyInterestingDecls);
4403 PotentiallyInterestingDecls.clear();
4404 assert(PotentiallyInterestingDecls.empty());
4405 while (!MaybeInterestingDecls.empty()) {
4406 Decl *D = MaybeInterestingDecls.front();
4407 MaybeInterestingDecls.pop_front();
4408 // Since we load the variable's initializers lazily, it'd be problematic
4409 // if the initializers dependent on each other. So here we try to load the
4410 // initializers of static variables to make sure they are passed to code
4411 // generator by order. If we read anything interesting, we would consume
4412 // that before emitting the current declaration.
4413 if (auto *VD = dyn_cast<VarDecl>(D);
4414 VD && VD->isFileVarDecl() && !VD->isExternallyVisible())
4415 VD->getInit();
4416 ConsumingPotentialInterestingDecls();
4417 if (isConsumerInterestedIn(D))
4418 PassInterestingDeclToConsumer(D);
4419 }
4420
4421 // If we add any new potential interesting decl in the last call, consume it.
4422 ConsumingPotentialInterestingDecls();
4423
4424 for (GlobalDeclID ID : VTablesToEmit) {
4425 auto *RD = cast<CXXRecordDecl>(GetDecl(ID));
4426 assert(!RD->shouldEmitInExternalSource());
4427 PassVTableToConsumer(RD);
4428 }
4429 VTablesToEmit.clear();
4430}
4431
4432void ASTReader::loadDeclUpdateRecords(PendingUpdateRecord &Record) {
4433 // The declaration may have been modified by files later in the chain.
4434 // If this is the case, read the record containing the updates from each file
4435 // and pass it to ASTDeclReader to make the modifications.
4436 GlobalDeclID ID = Record.ID;
4437 Decl *D = Record.D;
4438 ProcessingUpdatesRAIIObj ProcessingUpdates(*this);
4439 DeclUpdateOffsetsMap::iterator UpdI = DeclUpdateOffsets.find(ID);
4440
4441 if (UpdI != DeclUpdateOffsets.end()) {
4442 auto UpdateOffsets = std::move(UpdI->second);
4443 DeclUpdateOffsets.erase(UpdI);
4444
4445 // Check if this decl was interesting to the consumer. If we just loaded
4446 // the declaration, then we know it was interesting and we skip the call
4447 // to isConsumerInterestedIn because it is unsafe to call in the
4448 // current ASTReader state.
4449 bool WasInteresting = Record.JustLoaded || isConsumerInterestedIn(D);
4450 for (auto &FileAndOffset : UpdateOffsets) {
4451 ModuleFile *F = FileAndOffset.first;
4452 uint64_t Offset = FileAndOffset.second;
4453 llvm::BitstreamCursor &Cursor = F->DeclsCursor;
4454 SavedStreamPosition SavedPosition(Cursor);
4455 if (llvm::Error JumpFailed = Cursor.JumpToBit(Offset))
4456 // FIXME don't do a fatal error.
4457 llvm::report_fatal_error(
4458 Twine("ASTReader::loadDeclUpdateRecords failed jumping: ") +
4459 toString(std::move(JumpFailed)));
4460 Expected<unsigned> MaybeCode = Cursor.ReadCode();
4461 if (!MaybeCode)
4462 llvm::report_fatal_error(
4463 Twine("ASTReader::loadDeclUpdateRecords failed reading code: ") +
4464 toString(MaybeCode.takeError()));
4465 unsigned Code = MaybeCode.get();
4466 ASTRecordReader Record(*this, *F);
4467 if (Expected<unsigned> MaybeRecCode = Record.readRecord(Cursor, Code))
4468 assert(MaybeRecCode.get() == DECL_UPDATES &&
4469 "Expected DECL_UPDATES record!");
4470 else
4471 llvm::report_fatal_error(
4472 Twine("ASTReader::loadDeclUpdateRecords failed reading rec code: ") +
4473 toString(MaybeCode.takeError()));
4474
4475 ASTDeclReader Reader(*this, Record, RecordLocation(F, Offset), ID,
4476 SourceLocation());
4477 Reader.UpdateDecl(D);
4478
4479 // We might have made this declaration interesting. If so, remember that
4480 // we need to hand it off to the consumer.
4481 if (!WasInteresting && isConsumerInterestedIn(D)) {
4482 PotentiallyInterestingDecls.push_back(D);
4483 WasInteresting = true;
4484 }
4485 }
4486 }
4487
4488 // Load the pending visible updates for this decl context, if it has any.
4489 if (auto I = PendingVisibleUpdates.find(ID);
4490 I != PendingVisibleUpdates.end()) {
4491 auto VisibleUpdates = std::move(I->second);
4492 PendingVisibleUpdates.erase(I);
4493
4494 auto *DC = cast<DeclContext>(D)->getPrimaryContext();
4495 for (const auto &Update : VisibleUpdates)
4496 Lookups[DC].Table.add(
4497 Update.Mod, Update.Data,
4498 reader::ASTDeclContextNameLookupTrait(*this, *Update.Mod));
4500 }
4501
4502 if (auto I = PendingModuleLocalVisibleUpdates.find(ID);
4503 I != PendingModuleLocalVisibleUpdates.end()) {
4504 auto ModuleLocalVisibleUpdates = std::move(I->second);
4505 PendingModuleLocalVisibleUpdates.erase(I);
4506
4507 auto *DC = cast<DeclContext>(D)->getPrimaryContext();
4508 for (const auto &Update : ModuleLocalVisibleUpdates)
4509 ModuleLocalLookups[DC].Table.add(
4510 Update.Mod, Update.Data,
4511 reader::ModuleLocalNameLookupTrait(*this, *Update.Mod));
4512 // NOTE: Can we optimize the case that the data being loaded
4513 // is not related to current module?
4515 }
4516
4517 if (auto I = TULocalUpdates.find(ID); I != TULocalUpdates.end()) {
4518 auto Updates = std::move(I->second);
4519 TULocalUpdates.erase(I);
4520
4521 auto *DC = cast<DeclContext>(D)->getPrimaryContext();
4522 for (const auto &Update : Updates)
4523 TULocalLookups[DC].Table.add(
4524 Update.Mod, Update.Data,
4525 reader::ASTDeclContextNameLookupTrait(*this, *Update.Mod));
4527 }
4528
4529 // Load any pending related decls.
4530 if (D->isCanonicalDecl()) {
4531 if (auto IT = RelatedDeclsMap.find(ID); IT != RelatedDeclsMap.end()) {
4532 for (auto LID : IT->second)
4533 GetDecl(LID);
4534 RelatedDeclsMap.erase(IT);
4535 }
4536 }
4537
4538 // Load the pending specializations update for this decl, if it has any.
4539 if (auto I = PendingSpecializationsUpdates.find(ID);
4540 I != PendingSpecializationsUpdates.end()) {
4541 auto SpecializationUpdates = std::move(I->second);
4542 PendingSpecializationsUpdates.erase(I);
4543
4544 for (const auto &Update : SpecializationUpdates)
4545 AddSpecializations(D, Update.Data, *Update.Mod, /*IsPartial=*/false);
4546 }
4547
4548 // Load the pending specializations update for this decl, if it has any.
4549 if (auto I = PendingPartialSpecializationsUpdates.find(ID);
4550 I != PendingPartialSpecializationsUpdates.end()) {
4551 auto SpecializationUpdates = std::move(I->second);
4552 PendingPartialSpecializationsUpdates.erase(I);
4553
4554 for (const auto &Update : SpecializationUpdates)
4555 AddSpecializations(D, Update.Data, *Update.Mod, /*IsPartial=*/true);
4556 }
4557}
4558
4559void ASTReader::loadPendingDeclChain(Decl *FirstLocal, uint64_t LocalOffset) {
4560 // Attach FirstLocal to the end of the decl chain.
4561 Decl *CanonDecl = FirstLocal->getCanonicalDecl();
4562 if (FirstLocal != CanonDecl) {
4563 Decl *PrevMostRecent = ASTDeclReader::getMostRecentDecl(CanonDecl);
4565 *this, FirstLocal, PrevMostRecent ? PrevMostRecent : CanonDecl,
4566 CanonDecl);
4567 }
4568
4569 if (!LocalOffset) {
4570 ASTDeclReader::attachLatestDecl(CanonDecl, FirstLocal);
4571 return;
4572 }
4573
4574 // Load the list of other redeclarations from this module file.
4575 ModuleFile *M = getOwningModuleFile(FirstLocal);
4576 assert(M && "imported decl from no module file");
4577
4578 llvm::BitstreamCursor &Cursor = M->DeclsCursor;
4579 SavedStreamPosition SavedPosition(Cursor);
4580 if (llvm::Error JumpFailed = Cursor.JumpToBit(LocalOffset))
4581 llvm::report_fatal_error(
4582 Twine("ASTReader::loadPendingDeclChain failed jumping: ") +
4583 toString(std::move(JumpFailed)));
4584
4586 Expected<unsigned> MaybeCode = Cursor.ReadCode();
4587 if (!MaybeCode)
4588 llvm::report_fatal_error(
4589 Twine("ASTReader::loadPendingDeclChain failed reading code: ") +
4590 toString(MaybeCode.takeError()));
4591 unsigned Code = MaybeCode.get();
4592 if (Expected<unsigned> MaybeRecCode = Cursor.readRecord(Code, Record))
4593 assert(MaybeRecCode.get() == LOCAL_REDECLARATIONS &&
4594 "expected LOCAL_REDECLARATIONS record!");
4595 else
4596 llvm::report_fatal_error(
4597 Twine("ASTReader::loadPendingDeclChain failed reading rec code: ") +
4598 toString(MaybeCode.takeError()));
4599
4600 // FIXME: We have several different dispatches on decl kind here; maybe
4601 // we should instead generate one loop per kind and dispatch up-front?
4602 Decl *MostRecent = FirstLocal;
4603 for (unsigned I = 0, N = Record.size(); I != N; ++I) {
4604 unsigned Idx = N - I - 1;
4605 auto *D = ReadDecl(*M, Record, Idx);
4606 ASTDeclReader::attachPreviousDecl(*this, D, MostRecent, CanonDecl);
4607 MostRecent = D;
4608 }
4609 ASTDeclReader::attachLatestDecl(CanonDecl, MostRecent);
4610}
4611
4612namespace {
4613
4614 /// Given an ObjC interface, goes through the modules and links to the
4615 /// interface all the categories for it.
4616 class ObjCCategoriesVisitor {
4617 ASTReader &Reader;
4618 ObjCInterfaceDecl *Interface;
4619 llvm::SmallPtrSetImpl<ObjCCategoryDecl *> &Deserialized;
4620 ObjCCategoryDecl *Tail = nullptr;
4621 llvm::DenseMap<DeclarationName, ObjCCategoryDecl *> NameCategoryMap;
4622 GlobalDeclID InterfaceID;
4623 unsigned PreviousGeneration;
4624
4625 void add(ObjCCategoryDecl *Cat) {
4626 // Only process each category once.
4627 if (!Deserialized.erase(Cat))
4628 return;
4629
4630 // Check for duplicate categories.
4631 if (Cat->getDeclName()) {
4632 ObjCCategoryDecl *&Existing = NameCategoryMap[Cat->getDeclName()];
4633 if (Existing && Reader.getOwningModuleFile(Existing) !=
4634 Reader.getOwningModuleFile(Cat)) {
4636 StructuralEquivalenceContext Ctx(
4637 Reader.getContext().getLangOpts(), Cat->getASTContext(),
4638 Existing->getASTContext(), NonEquivalentDecls,
4639 StructuralEquivalenceKind::Default,
4640 /*StrictTypeSpelling=*/false,
4641 /*Complain=*/false,
4642 /*ErrorOnTagTypeMismatch=*/true);
4643 if (!Ctx.IsEquivalent(Cat, Existing)) {
4644 // Warn only if the categories with the same name are different.
4645 Reader.Diag(Cat->getLocation(), diag::warn_dup_category_def)
4646 << Interface->getDeclName() << Cat->getDeclName();
4647 Reader.Diag(Existing->getLocation(),
4648 diag::note_previous_definition);
4649 }
4650 } else if (!Existing) {
4651 // Record this category.
4652 Existing = Cat;
4653 }
4654 }
4655
4656 // Add this category to the end of the chain.
4657 if (Tail)
4659 else
4660 Interface->setCategoryListRaw(Cat);
4661 Tail = Cat;
4662 }
4663
4664 public:
4665 ObjCCategoriesVisitor(
4666 ASTReader &Reader, ObjCInterfaceDecl *Interface,
4667 llvm::SmallPtrSetImpl<ObjCCategoryDecl *> &Deserialized,
4668 GlobalDeclID InterfaceID, unsigned PreviousGeneration)
4669 : Reader(Reader), Interface(Interface), Deserialized(Deserialized),
4670 InterfaceID(InterfaceID), PreviousGeneration(PreviousGeneration) {
4671 // Populate the name -> category map with the set of known categories.
4672 for (auto *Cat : Interface->known_categories()) {
4673 if (Cat->getDeclName())
4674 NameCategoryMap[Cat->getDeclName()] = Cat;
4675
4676 // Keep track of the tail of the category list.
4677 Tail = Cat;
4678 }
4679 }
4680
4681 bool operator()(ModuleFile &M) {
4682 // If we've loaded all of the category information we care about from
4683 // this module file, we're done.
4684 if (M.Generation <= PreviousGeneration)
4685 return true;
4686
4687 // Map global ID of the definition down to the local ID used in this
4688 // module file. If there is no such mapping, we'll find nothing here
4689 // (or in any module it imports).
4690 LocalDeclID LocalID =
4691 Reader.mapGlobalIDToModuleFileGlobalID(M, InterfaceID);
4692 if (LocalID.isInvalid())
4693 return true;
4694
4695 // Perform a binary search to find the local redeclarations for this
4696 // declaration (if any).
4697 const ObjCCategoriesInfo Compare = {LocalID, 0};
4698 const ObjCCategoriesInfo *Result = std::lower_bound(
4702 LocalID != Result->getDefinitionID()) {
4703 // We didn't find anything. If the class definition is in this module
4704 // file, then the module files it depends on cannot have any categories,
4705 // so suppress further lookup.
4706 return Reader.isDeclIDFromModule(InterfaceID, M);
4707 }
4708
4709 // We found something. Dig out all of the categories.
4710 unsigned Offset = Result->Offset;
4711 unsigned N = M.ObjCCategories[Offset];
4712 M.ObjCCategories[Offset++] = 0; // Don't try to deserialize again
4713 for (unsigned I = 0; I != N; ++I)
4714 add(Reader.ReadDeclAs<ObjCCategoryDecl>(M, M.ObjCCategories, Offset));
4715 return true;
4716 }
4717 };
4718
4719} // namespace
4720
4721void ASTReader::loadObjCCategories(GlobalDeclID ID, ObjCInterfaceDecl *D,
4722 unsigned PreviousGeneration) {
4723 ObjCCategoriesVisitor Visitor(*this, D, CategoriesDeserialized, ID,
4724 PreviousGeneration);
4725 ModuleMgr.visit(Visitor);
4726}
4727
4728template<typename DeclT, typename Fn>
4729static void forAllLaterRedecls(DeclT *D, Fn F) {
4730 F(D);
4731
4732 // Check whether we've already merged D into its redeclaration chain.
4733 // MostRecent may or may not be nullptr if D has not been merged. If
4734 // not, walk the merged redecl chain and see if it's there.
4735 auto *MostRecent = D->getMostRecentDecl();
4736 bool Found = false;
4737 for (auto *Redecl = MostRecent; Redecl && !Found;
4738 Redecl = Redecl->getPreviousDecl())
4739 Found = (Redecl == D);
4740
4741 // If this declaration is merged, apply the functor to all later decls.
4742 if (Found) {
4743 for (auto *Redecl = MostRecent; Redecl != D;
4744 Redecl = Redecl->getPreviousDecl())
4745 F(Redecl);
4746 }
4747}
4748
4750 while (Record.getIdx() < Record.size()) {
4751 switch ((DeclUpdateKind)Record.readInt()) {
4753 auto *RD = cast<CXXRecordDecl>(D);
4754 Decl *MD = Record.readDecl();
4755 assert(MD && "couldn't read decl from update record");
4756 Reader.PendingAddedClassMembers.push_back({RD, MD});
4757 break;
4758 }
4759
4761 auto *Anon = readDeclAs<NamespaceDecl>();
4762
4763 // Each module has its own anonymous namespace, which is disjoint from
4764 // any other module's anonymous namespaces, so don't attach the anonymous
4765 // namespace at all.
4766 if (!Record.isModule()) {
4767 if (auto *TU = dyn_cast<TranslationUnitDecl>(D))
4768 TU->setAnonymousNamespace(Anon);
4769 else
4770 cast<NamespaceDecl>(D)->setAnonymousNamespace(Anon);
4771 }
4772 break;
4773 }
4774
4776 auto *VD = cast<VarDecl>(D);
4777 VD->NonParmVarDeclBits.IsInline = Record.readInt();
4778 VD->NonParmVarDeclBits.IsInlineSpecified = Record.readInt();
4779 ReadVarDeclInit(VD);
4780 break;
4781 }
4782
4784 SourceLocation POI = Record.readSourceLocation();
4785 if (auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D)) {
4786 VTSD->setPointOfInstantiation(POI);
4787 } else if (auto *VD = dyn_cast<VarDecl>(D)) {
4788 MemberSpecializationInfo *MSInfo = VD->getMemberSpecializationInfo();
4789 assert(MSInfo && "No member specialization information");
4790 MSInfo->setPointOfInstantiation(POI);
4791 } else {
4792 auto *FD = cast<FunctionDecl>(D);
4793 if (auto *FTSInfo = dyn_cast<FunctionTemplateSpecializationInfo *>(
4794 FD->TemplateOrSpecialization))
4795 FTSInfo->setPointOfInstantiation(POI);
4796 else
4797 cast<MemberSpecializationInfo *>(FD->TemplateOrSpecialization)
4798 ->setPointOfInstantiation(POI);
4799 }
4800 break;
4801 }
4802
4804 auto *Param = cast<ParmVarDecl>(D);
4805
4806 // We have to read the default argument regardless of whether we use it
4807 // so that hypothetical further update records aren't messed up.
4808 // TODO: Add a function to skip over the next expr record.
4809 auto *DefaultArg = Record.readExpr();
4810
4811 // Only apply the update if the parameter still has an uninstantiated
4812 // default argument.
4813 if (Param->hasUninstantiatedDefaultArg())
4814 Param->setDefaultArg(DefaultArg);
4815 break;
4816 }
4817
4819 auto *FD = cast<FieldDecl>(D);
4820 auto *DefaultInit = Record.readExpr();
4821
4822 // Only apply the update if the field still has an uninstantiated
4823 // default member initializer.
4824 if (FD->hasInClassInitializer() && !FD->hasNonNullInClassInitializer()) {
4825 if (DefaultInit)
4826 FD->setInClassInitializer(DefaultInit);
4827 else
4828 // Instantiation failed. We can get here if we serialized an AST for
4829 // an invalid program.
4830 FD->removeInClassInitializer();
4831 }
4832 break;
4833 }
4834
4836 auto *FD = cast<FunctionDecl>(D);
4837 if (Reader.PendingBodies[FD]) {
4838 // FIXME: Maybe check for ODR violations.
4839 // It's safe to stop now because this update record is always last.
4840 return;
4841 }
4842
4843 if (Record.readInt()) {
4844 // Maintain AST consistency: any later redeclarations of this function
4845 // are inline if this one is. (We might have merged another declaration
4846 // into this one.)
4847 forAllLaterRedecls(FD, [](FunctionDecl *FD) {
4848 FD->setImplicitlyInline();
4849 });
4850 }
4851 FD->setInnerLocStart(readSourceLocation());
4853 assert(Record.getIdx() == Record.size() && "lazy body must be last");
4854 break;
4855 }
4856
4858 auto *RD = cast<CXXRecordDecl>(D);
4859 auto *OldDD = RD->getCanonicalDecl()->DefinitionData;
4860 bool HadRealDefinition =
4861 OldDD && (OldDD->Definition != RD ||
4862 !Reader.PendingFakeDefinitionData.count(OldDD));
4863 RD->setParamDestroyedInCallee(Record.readInt());
4865 static_cast<RecordArgPassingKind>(Record.readInt()));
4866 ReadCXXRecordDefinition(RD, /*Update*/true);
4867
4868 // Visible update is handled separately.
4869 uint64_t LexicalOffset = ReadLocalOffset();
4870 if (!HadRealDefinition && LexicalOffset) {
4871 Record.readLexicalDeclContextStorage(LexicalOffset, RD);
4872 Reader.PendingFakeDefinitionData.erase(OldDD);
4873 }
4874
4875 auto TSK = (TemplateSpecializationKind)Record.readInt();
4876 SourceLocation POI = readSourceLocation();
4877 if (MemberSpecializationInfo *MSInfo =
4879 MSInfo->setTemplateSpecializationKind(TSK);
4880 MSInfo->setPointOfInstantiation(POI);
4881 } else {
4883 Spec->setTemplateSpecializationKind(TSK);
4884 Spec->setPointOfInstantiation(POI);
4885
4886 if (Record.readInt()) {
4887 auto *PartialSpec =
4888 readDeclAs<ClassTemplatePartialSpecializationDecl>();
4890 Record.readTemplateArgumentList(TemplArgs);
4891 auto *TemplArgList = TemplateArgumentList::CreateCopy(
4892 Reader.getContext(), TemplArgs);
4893
4894 // FIXME: If we already have a partial specialization set,
4895 // check that it matches.
4897 Spec->getSpecializedTemplateOrPartial()))
4898 Spec->setInstantiationOf(PartialSpec, TemplArgList);
4899 }
4900 }
4901
4902 RD->setTagKind(static_cast<TagTypeKind>(Record.readInt()));
4903 RD->setLocation(readSourceLocation());
4904 RD->setLocStart(readSourceLocation());
4905 RD->setBraceRange(readSourceRange());
4906
4907 if (Record.readInt()) {
4908 AttrVec Attrs;
4909 Record.readAttributes(Attrs);
4910 // If the declaration already has attributes, we assume that some other
4911 // AST file already loaded them.
4912 if (!D->hasAttrs())
4913 D->setAttrsImpl(Attrs, Reader.getContext());
4914 }
4915 break;
4916 }
4917
4919 // Set the 'operator delete' directly to avoid emitting another update
4920 // record.
4922 ASTContext &C = Reader.getContext();
4923 auto *Del = readDeclAs<FunctionDecl>();
4924 auto *ThisArg = Record.readExpr();
4925 auto *Dtor = cast<CXXDestructorDecl>(D);
4926 // FIXME: Check consistency if we have an old and new operator delete.
4927 if (!C.dtorHasOperatorDelete(Dtor,
4929 C.addOperatorDeleteForVDtor(Dtor, Del,
4931 Canon->OperatorDeleteThisArg = ThisArg;
4932 }
4933 break;
4934 }
4935
4937 auto *Del = readDeclAs<FunctionDecl>();
4938 auto *Dtor = cast<CXXDestructorDecl>(D);
4939 ASTContext &C = Reader.getContext();
4940 if (!C.dtorHasOperatorDelete(
4942 C.addOperatorDeleteForVDtor(
4944 break;
4945 }
4947 auto *Del = readDeclAs<FunctionDecl>();
4948 auto *Dtor = cast<CXXDestructorDecl>(D);
4949 ASTContext &C = Reader.getContext();
4950 if (!C.dtorHasOperatorDelete(Dtor, ASTContext::OperatorDeleteKind::Array))
4951 C.addOperatorDeleteForVDtor(Dtor, Del,
4953 break;
4954 }
4956 auto *Del = readDeclAs<FunctionDecl>();
4957 auto *Dtor = cast<CXXDestructorDecl>(D);
4958 ASTContext &C = Reader.getContext();
4959 if (!C.dtorHasOperatorDelete(Dtor,
4961 C.addOperatorDeleteForVDtor(
4963 break;
4964 }
4965
4967 SmallVector<QualType, 8> ExceptionStorage;
4968 auto ESI = Record.readExceptionSpecInfo(ExceptionStorage);
4969
4970 // Update this declaration's exception specification, if needed.
4971 auto *FD = cast<FunctionDecl>(D);
4972 auto *FPT = FD->getType()->castAs<FunctionProtoType>();
4973 // FIXME: If the exception specification is already present, check that it
4974 // matches.
4975 if (isUnresolvedExceptionSpec(FPT->getExceptionSpecType())) {
4976 FD->setType(Reader.getContext().getFunctionType(
4977 FPT->getReturnType(), FPT->getParamTypes(),
4978 FPT->getExtProtoInfo().withExceptionSpec(ESI)));
4979
4980 // When we get to the end of deserializing, see if there are other decls
4981 // that we need to propagate this exception specification onto.
4982 Reader.PendingExceptionSpecUpdates.insert(
4983 std::make_pair(FD->getCanonicalDecl(), FD));
4984 }
4985 break;
4986 }
4987
4989 auto *FD = cast<FunctionDecl>(D);
4990 QualType DeducedResultType = Record.readType();
4991 Reader.PendingDeducedTypeUpdates.insert(
4992 {FD->getCanonicalDecl(), DeducedResultType});
4993 break;
4994 }
4995
4997 // Maintain AST consistency: any later redeclarations are used too.
4998 D->markUsed(Reader.getContext());
4999 break;
5000
5002 Reader.getContext().setManglingNumber(cast<NamedDecl>(D),
5003 Record.readInt());
5004 break;
5005
5007 Reader.getContext().setStaticLocalNumber(cast<VarDecl>(D),
5008 Record.readInt());
5009 break;
5010
5012 D->addAttr(OMPThreadPrivateDeclAttr::CreateImplicit(Reader.getContext(),
5013 readSourceRange()));
5014 break;
5015
5017 auto AllocatorKind =
5018 static_cast<OMPAllocateDeclAttr::AllocatorTypeTy>(Record.readInt());
5019 Expr *Allocator = Record.readExpr();
5020 Expr *Alignment = Record.readExpr();
5021 SourceRange SR = readSourceRange();
5022 D->addAttr(OMPAllocateDeclAttr::CreateImplicit(
5023 Reader.getContext(), AllocatorKind, Allocator, Alignment, SR));
5024 break;
5025 }
5026
5028 D->addAttr(OMPTargetIndirectCallAttr::CreateImplicit(Reader.getContext(),
5029 readSourceRange()));
5030 break;
5031
5033 unsigned SubmoduleID = readSubmoduleID();
5034 auto *Exported = cast<NamedDecl>(D);
5035 Module *Owner = SubmoduleID ? Reader.getSubmodule(SubmoduleID) : nullptr;
5036 Reader.getContext().mergeDefinitionIntoModule(Exported, Owner);
5037 Reader.PendingMergedDefinitionsToDeduplicate.insert(Exported);
5038 break;
5039 }
5040
5042 auto MapType = Record.readEnum<OMPDeclareTargetDeclAttr::MapTypeTy>();
5043 auto DevType = Record.readEnum<OMPDeclareTargetDeclAttr::DevTypeTy>();
5044 Expr *IndirectE = Record.readExpr();
5045 bool Indirect = Record.readBool();
5046 unsigned Level = Record.readInt();
5047 D->addAttr(OMPDeclareTargetDeclAttr::CreateImplicit(
5048 Reader.getContext(), MapType, DevType, IndirectE, Indirect, Level,
5049 readSourceRange()));
5050 break;
5051 }
5052
5054 AttrVec Attrs;
5055 Record.readAttributes(Attrs);
5056 assert(Attrs.size() == 1);
5057 D->addAttr(Attrs[0]);
5058 break;
5059 }
5060 }
5061}
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:430
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition ASTContext.h:223
TranslationUnitDecl * getTranslationUnitDecl() const
const LangOptions & getLangOpts() const
Definition ASTContext.h:962
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:2599
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:2170
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:2180
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:2469
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:4206
static BindingDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:3711
A simple helper class to unpack an integer to bits and consuming the bits in order.
Definition ASTReader.h:2661
uint32_t getNextBits(uint32_t Width)
Definition ASTReader.h:2684
A class which contains all the information about a particular captured value.
Definition Decl.h:4713
Represents a block literal declaration, which is like an unnamed FunctionDecl.
Definition Decl.h:4707
void setParams(ArrayRef< ParmVarDecl * > NewParamInfo)
Definition Decl.cpp:5443
void setDoesNotEscape(bool B=true)
Definition Decl.h:4859
void setSignatureAsWritten(TypeSourceInfo *Sig)
Definition Decl.h:4789
void setCanAvoidCopyToHeap(bool B=true)
Definition Decl.h:4864
void setIsConversionFromLambda(bool val=true)
Definition Decl.h:4854
void setBlockMissingReturnType(bool val=true)
Definition Decl.h:4846
static BlockDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5651
void setIsVariadic(bool value)
Definition Decl.h:4783
void setBody(CompoundStmt *B)
Definition Decl.h:4787
void setCaptures(ASTContext &Context, ArrayRef< Capture > Captures, bool CapturesCXXThis)
Definition Decl.cpp:5454
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:2633
static CXXConstructorDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, uint64_t AllocKind)
Definition DeclCXX.cpp:2996
void setCtorClosureDefaultArgs(ArrayRef< CXXDefaultArgExpr * > Args)
Definition DeclCXX.cpp:3141
void setExplicitSpecifier(ExplicitSpecifier ES)
Definition DeclCXX.h:2694
bool isInheritingConstructor() const
Determine whether this is an implicit constructor synthesized to model a call to a constructor inheri...
Definition DeclCXX.h:2857
Represents a C++ conversion function within a class.
Definition DeclCXX.h:2968
void setExplicitSpecifier(ExplicitSpecifier ES)
Definition DeclCXX.h:3001
static CXXConversionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:3273
Represents a C++ deduction guide declaration.
Definition DeclCXX.h:1996
void setDeductionCandidateKind(DeductionCandidate K)
Definition DeclCXX.h:2087
void setSourceDeductionGuide(CXXDeductionGuideDecl *DG)
Definition DeclCXX.h:2075
static CXXDeductionGuideDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:2394
void setSourceDeductionGuideKind(SourceDeductionGuideKind SK)
Definition DeclCXX.h:2083
A default argument (C++ [dcl.fct.default]).
Definition ExprCXX.h:1274
Represents a C++ destructor within a class.
Definition DeclCXX.h:2898
static CXXDestructorDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:3148
CXXDestructorDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Definition DeclCXX.h:2946
Represents a static or instance method of a struct/union/class.
Definition DeclCXX.h:2145
static CXXMethodDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:2513
CXXMethodDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Definition DeclCXX.h:2254
Represents a C++ struct/union/class.
Definition DeclCXX.h:258
CXXRecordDecl * getDefinition() const
Definition DeclCXX.h:548
static CXXRecordDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:155
unsigned getODRHash() const
Definition DeclCXX.cpp:494
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:4979
static CapturedDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumParams)
Definition Decl.cpp:5694
void setContextParam(unsigned i, ImplicitParamDecl *P)
Definition Decl.h:5041
void setNothrow(bool Nothrow=true)
Definition Decl.cpp:5704
void setParam(unsigned i, ImplicitParamDecl *P)
Definition Decl.h:5023
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:3698
static ConstructorUsingShadowDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:3504
static DeclAccessPair make(NamedDecl *D, AccessSpecifier AS)
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Definition DeclBase.h:1466
lookup_result::iterator lookup_iterator
Definition DeclBase.h:2595
bool isFileContext() const
Definition DeclBase.h:2197
void setHasExternalVisibleStorage(bool ES=true) const
State whether this DeclContext has external storage for declarations visible in this context.
Definition DeclBase.h:2723
DeclContextLookupResult lookup_result
Definition DeclBase.h:2594
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
bool isTranslationUnit() const
Definition DeclBase.h:2202
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
DeclContext * getPrimaryContext()
getPrimaryContext - There may be many different declarations of the same entity (including forward de...
bool isFunctionOrMethod() const
Definition DeclBase.h:2178
DeclContext * getNonTransparentContext()
bool isValid() const
Definition DeclID.h: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:1078
Decl * getMostRecentDecl()
Retrieve the most recent declaration that declares the same entity as this declaration (which may be ...
Definition DeclBase.h:1093
FriendObjectKind getFriendObjectKind() const
Determines whether this declaration is the object of a friend declaration and, if so,...
Definition DeclBase.h:1243
T * getAttr() const
Definition DeclBase.h:581
bool hasAttrs() const
Definition DeclBase.h:526
ASTContext & getASTContext() const LLVM_READONLY
Definition DeclBase.cpp: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:1168
void setTopLevelDeclInObjCContainer(bool V=true)
Definition DeclBase.h:646
void markUsed(ASTContext &C)
Mark the declaration used, in the sense of odr-use.
Definition DeclBase.cpp:591
bool isCanonicalDecl() const
Whether this particular Decl is a canonical one.
Definition DeclBase.h:1001
Module * getOwningModule() const
Get the module that owns this declaration (for visibility purposes).
Definition DeclBase.h:854
Module * getImportedOwningModule() const
Get the imported owning module, if this decl is from an imported (non-local) module.
Definition DeclBase.h:824
ObjCDeclQualifier
ObjCDeclQualifier - 'Qualifiers' written next to the return and parameter types in method declaration...
Definition DeclBase.h:198
bool isFromASTFile() const
Determine whether this declaration came from an AST file (such as a precompiled header or module) rat...
Definition DeclBase.h:805
bool isTemplateParameter() const
isTemplateParameter - Determines whether this declaration is a template parameter.
Definition DeclBase.h:2810
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:935
bool hasAttr() const
Definition DeclBase.h:585
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
Definition DeclBase.h:995
ModuleOwnershipKind
The kind of ownership a declaration has, for visibility purposes.
Definition DeclBase.h:216
@ VisiblePromoted
This declaration has an owning module, and is not visible to the current TU but we promoted it to be ...
Definition DeclBase.h:237
@ VisibleWhenImported
This declaration has an owning module, and is visible when that module is imported.
Definition DeclBase.h:229
@ Unowned
This declaration is not owned by a module.
Definition DeclBase.h:218
@ ReachableWhenImported
This declaration has an owning module, and is visible to lookups that occurs within that module.
Definition DeclBase.h:242
@ ModulePrivate
This declaration has an owning module, but is only visible to lookups that occur within that module.
Definition DeclBase.h:248
@ Visible
This declaration has an owning module, but is globally visible (typically because its owning module i...
Definition DeclBase.h:225
Kind getKind() const
Definition DeclBase.h:450
void setModuleOwnershipKind(ModuleOwnershipKind MOK)
Set whether this declaration is hidden from name lookup.
Definition DeclBase.h:898
bool shouldEmitInExternalSource() const
Whether the definition of the declaration should be emitted in external sources.
void setVisibleDespiteOwningModule()
Set that this declaration is globally visible, even if it came from a module that is not visible.
Definition DeclBase.h:882
The name of a declaration.
IdentifierInfo * getAsIdentifierInfo() const
Retrieve the IdentifierInfo * stored in this declaration name, or null if this declaration name isn't...
Selector getObjCSelector() const
Get the Objective-C selector stored in this declaration name.
Represents a ValueDecl that came out of a declarator.
Definition Decl.h: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:4270
static DecompositionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumBindings)
Definition DeclCXX.cpp:3751
Represents an empty-declaration.
Definition Decl.h:5214
static EmptyDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5896
An instance of this object exists for each enum constant that is defined.
Definition Decl.h:3458
static EnumConstantDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5720
void setInitExpr(Expr *E)
Definition Decl.h:3482
void setInitVal(const ASTContext &C, const llvm::APSInt &V)
Definition Decl.h:3483
Represents an enum.
Definition Decl.h:4046
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this enumeration is an instantiation of a member enumeration of a class template specialization,...
Definition Decl.h:4318
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:4122
void setIntegerType(QualType T)
Set the underlying integer type.
Definition Decl.h:4228
void setIntegerTypeSourceInfo(TypeSourceInfo *TInfo)
Set the underlying integer type source info.
Definition Decl.h:4231
unsigned getODRHash()
Definition Decl.cpp:5164
static EnumDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5080
void setScoped(bool Scoped=true)
True if this tag declaration is a scoped enumeration.
Definition Decl.h:4110
void setPromotionType(QualType T)
Set the promotion type.
Definition Decl.h:4214
EnumDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Definition Decl.h:4136
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:4116
Represents an explicit instantiation of a template entity in source code.
static ExplicitInstantiationDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned TrailingFlags)
Represents a standard C++ module export declaration.
Definition Decl.h:5167
static ExportDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:6097
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:3195
void setBitWidth(Expr *Width)
Set the bit-field width for this member.
Definition Decl.h:3330
static FieldDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:4706
const VariableArrayType * CapturedVLAType
Definition Decl.h:3251
void setRParenLoc(SourceLocation L)
Definition Decl.h:4650
void setAsmString(Expr *Asm)
Definition Decl.h:4657
static FileScopeAsmDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5852
FriendDecl - Represents the declaration of a friend entity, which can be a function,...
Definition DeclFriend.h:45
LazyDeclPtr NextFriend
Definition DeclFriend.h:64
FriendUnion Friend
Definition DeclFriend.h:62
static FriendDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Declaration of a friend template.
static FriendTemplateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned FriendTypeNumTPLists)
static DefaultedOrDeletedFunctionInfo * Create(ASTContext &Context, ArrayRef< DeclAccessPair > Lookups, StringLiteral *DeletedMessage=nullptr)
Definition Decl.cpp:3117
Represents a function declaration or definition.
Definition Decl.h:2027
void setDescribedFunctionTemplate(FunctionTemplateDecl *Template)
Definition Decl.cpp:4175
FunctionTemplateDecl * getDescribedFunctionTemplate() const
Retrieves the function template that is described by this function declaration.
Definition Decl.cpp:4170
void setIsPureVirtual(bool P=true)
Definition Decl.cpp:3275
void setDefaultedOrDeletedInfo(DefaultedOrDeletedFunctionInfo *Info)
Definition Decl.cpp:3137
void setFriendConstraintRefersToEnclosingTemplate(bool V=true)
Definition Decl.h:2732
void setHasSkippedBody(bool Skipped=true)
Definition Decl.h:2711
static FunctionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5635
void setUsesSEHTry(bool UST)
Definition Decl.h:2546
void setIsMultiVersion(bool V=true)
Sets the multiversion state for this declaration and all of its redeclarations.
Definition Decl.h:2726
void setHasWrittenPrototype(bool P=true)
State that this function has a written prototype.
Definition Decl.h:2480
bool isExplicitlyDefaulted() const
Whether this function is explicitly defaulted.
Definition Decl.h:2416
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this function is an instantiation of a member function of a class template specialization,...
Definition Decl.cpp:4149
FunctionTemplateSpecializationInfo * getTemplateSpecializationInfo() const
If this function is actually a function template specialization, retrieve information about this func...
Definition Decl.cpp:4300
void setDefaultLoc(SourceLocation NewLoc)
Definition Decl.h:2429
void setInstantiatedFromMemberTemplate(bool Val=true)
Definition Decl.h:2396
void setInlineSpecified(bool I)
Set whether the "inline" keyword was specified for this function.
Definition Decl.h:2933
TemplatedKind
The kind of templated function a FunctionDecl can be.
Definition Decl.h:2032
@ TK_FunctionTemplateSpecialization
Definition Decl.h:2043
@ TK_DependentFunctionTemplateSpecialization
Definition Decl.h:2046
void setTrivial(bool IT)
Definition Decl.h:2405
TemplatedKind getTemplatedKind() const
What kind of templated function this is.
Definition Decl.cpp:4121
void setInstantiatedFromDecl(FunctionDecl *FD)
Specify that this function declaration was instantiated from a FunctionDecl FD.
Definition Decl.cpp:4188
bool isDeletedAsWritten() const
Definition Decl.h:2571
void setHasInheritedPrototype(bool P=true)
State that this function inherited its prototype from a previous declaration.
Definition Decl.h:2492
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:4355
void setVirtualAsWritten(bool V)
State that this function is marked as virtual explicitly.
Definition Decl.h:2376
void setIsDestroyingOperatorDelete(bool IsDestroyingDelete)
Definition Decl.cpp:3532
void setLateTemplateParsed(bool ILT=true)
State that this templated function will be late parsed.
Definition Decl.h:2389
void setImplicitlyInline(bool I=true)
Flag that this function is implicitly inline.
Definition Decl.h:2947
void setTrivialForCall(bool IT)
Definition Decl.h:2408
void setIsTypeAwareOperatorNewOrDelete(bool IsTypeAwareOperator=true)
Definition Decl.cpp:3540
bool isDefaulted() const
Whether this function is defaulted.
Definition Decl.h:2412
void setIneligibleOrNotSelected(bool II)
Definition Decl.h:2448
void setConstexprKind(ConstexprSpecKind CSK)
Definition Decl.h:2500
void setDefaulted(bool D=true)
Definition Decl.h:2413
void setStorageClass(StorageClass SClass)
Sets the storage class as written in the source.
Definition Decl.h:2924
void setDeletedAsWritten(bool D=true, StringLiteral *Message=nullptr)
Definition Decl.cpp:3146
void setExplicitlyDefaulted(bool ED=true)
State that this function is explicitly defaulted.
Definition Decl.h:2421
void setHasImplicitReturnZero(bool IRZ)
State that falling off this function implicitly returns null/zero.
Definition Decl.h:2462
Represents a prototype with parameter type info, e.g.
Definition TypeBase.h:5371
ExceptionSpecificationType getExceptionSpecType() const
Get the kind of exception specification on this function.
Definition TypeBase.h:5678
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:4567
QualType getReturnType() const
Definition TypeBase.h:4907
HLSLBufferDecl - Represent a cbuffer or tbuffer declaration.
Definition Decl.h:5229
static HLSLBufferDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5941
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:5616
Describes a module import declaration, which makes the contents of the named module visible in the cu...
Definition Decl.h:5088
static ImportDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumLocations)
Create a new, deserialized module import declaration.
Definition Decl.cpp:6066
Represents a field injected from an anonymous union/struct into the parent scope.
Definition Decl.h:3502
static IndirectFieldDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5748
void setInherited(bool I)
Definition Attr.h:163
Description of a constructor that was inherited from a base class.
Definition DeclCXX.h:2604
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:5564
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:1271
Implicit declaration of a temporary that was materialized by a MaterializeTemporaryExpr and lifetime-...
Definition DeclCXX.h:3329
static LifetimeExtendedTemporaryDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.h:3359
Represents a linkage specification.
Definition DeclCXX.h:3036
void setExternLoc(SourceLocation L)
Definition DeclCXX.h:3077
void setLanguage(LinkageSpecLanguageIDs L)
Set the language specified by this linkage specification.
Definition DeclCXX.h:3064
void setRBraceLoc(SourceLocation L)
Definition DeclCXX.h:3078
static LinkageSpecDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:3319
Represents the results of name lookup.
Definition Lookup.h:147
A global _GUID constant.
Definition DeclCXX.h:4419
An instance of this class represents the declaration of a property member.
Definition DeclCXX.h:4365
static MSPropertyDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:3789
Provides information a specialization of a member of a class template, which may be a member function...
void setPointOfInstantiation(SourceLocation POI)
Set the first point of instantiation.
Provides common interface for the Decls that cannot be redeclared, but can be merged if the same decl...
Describes a module or submodule.
Definition Module.h:340
@ AllVisible
All of the names in this module are visible.
Definition Module.h:647
std::string Name
The name of this module.
Definition Module.h:343
bool isGlobalModule() const
Does this Module scope describe a fragment of the global module within some C++ module.
Definition Module.h:438
@ ModuleMapModule
This is a module that was defined by a module map and built out of header files.
Definition Module.h:354
bool isNamedModule() const
Does this Module is a named module of a standard named module?
Definition Module.h:423
Module * getTopLevelModule()
Retrieve the top-level module for this (sub)module, which may be this module.
Definition Module.h:940
This represents a decl that may have a name.
Definition Decl.h: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:3222
static NamespaceAliasDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:3424
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:3380
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:4914
void setNothrow(bool Nothrow=true)
Definition Decl.cpp:5680
static OutlinedFunctionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumParams)
Definition Decl.cpp:5668
void setParam(unsigned i, ImplicitParamDecl *P)
Definition Decl.h:4950
Represents a parameter to a function.
Definition Decl.h:1817
static ParmVarDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:2951
void setUninstantiatedDefaultArg(Expr *arg)
Definition Decl.cpp:3024
void setScopeInfo(unsigned scopeDepth, unsigned parameterIndex)
Definition Decl.h:1850
void setObjCMethodScopeInfo(unsigned parameterIndex)
Definition Decl.h:1845
Represents a #pragma comment line.
Definition Decl.h:167
static PragmaCommentDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned ArgSize)
Definition Decl.cpp:5512
Represents a #pragma detect_mismatch line.
Definition Decl.h:201
static PragmaDetectMismatchDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NameValueSize)
Definition Decl.cpp:5537
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:4360
unsigned getODRHash()
Get precomputed ODRHash or add a new one.
Definition Decl.cpp:5415
void setAnonymousStructOrUnion(bool Anon)
Definition Decl.h:4416
void setArgPassingRestrictions(RecordArgPassingKind Kind)
Definition Decl.h:4506
void setNonTrivialToPrimitiveCopy(bool V)
Definition Decl.h:4450
void setHasNonTrivialToPrimitiveCopyCUnion(bool V)
Definition Decl.h:4482
void setHasNonTrivialToPrimitiveDestructCUnion(bool V)
Definition Decl.h:4474
void setHasFlexibleArrayMember(bool V)
Definition Decl.h:4397
void setParamDestroyedInCallee(bool V)
Definition Decl.h:4514
void setNonTrivialToPrimitiveDestroy(bool V)
Definition Decl.h:4458
void setHasObjectMember(bool val)
Definition Decl.h:4421
void setHasVolatileMember(bool val)
Definition Decl.h:4425
void setHasNonTrivialToPrimitiveDefaultInitializeCUnion(bool V)
Definition Decl.h:4466
static RecordDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5236
void setHasUninitializedExplicitInitFields(bool V)
Definition Decl.h:4490
void setNonTrivialToPrimitiveDefaultInitialize(bool V)
Definition Decl.h:4442
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:2114
static RequiresExprBodyDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:2409
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:4157
static StaticAssertDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:3687
StringLiteral - This represents a string literal expression, e.g.
Definition Expr.h:1805
Represents the declaration of a struct/union/class/enum.
Definition Decl.h:3752
void setTagKind(TagKind TK)
Definition Decl.h:3956
void setCompleteDefinitionRequired(bool V=true)
True if this complete decl is required to be complete for some existing use.
Definition Decl.h:3868
void demoteThisDefinitionToDeclaration()
Mark a definition as a declaration and maintain information it was a definition.
Definition Decl.h:3911
bool isThisDeclarationADefinition() const
Return true if this declaration is a completion definition of the type.
Definition Decl.h:3848
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:3883
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
Definition Decl.h:3853
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:4896
void setFreeStanding(bool isFreeStanding=true)
True if this tag is free standing, e.g. "struct foo;".
Definition Decl.h:3891
void setBraceRange(SourceRange R)
Definition Decl.h:3830
void setCompleteDefinition(bool V=true)
True if this decl has its body fully specified.
Definition Decl.h:3856
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:4670
static TopLevelStmtDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5874
The top declaration context.
Definition Decl.h:105
Represents the declaration of a typedef-name via a C++11 alias-declaration.
Definition Decl.h:3723
static TypeAliasDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5822
void setDescribedAliasTemplate(TypeAliasTemplateDecl *TAT)
Definition Decl.h:3742
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:3548
void setLocStart(SourceLocation L)
Definition Decl.h:3583
A container of type source information.
Definition TypeBase.h:8418
QualType getType() const
Return the type wrapped by this type source info.
Definition TypeBase.h:8429
const T * castAs() const
Member-template castAs<specific type>.
Definition TypeBase.h:9344
AutoType * getContainedAutoType() const
Get the AutoType whose type will be deduced for a variable with an initializer of this type.
Definition TypeBase.h:2963
const T * getAs() const
Member-template getAs<specific type>'.
Definition TypeBase.h:9277
Represents the declaration of a typedef-name via the 'typedef' type specifier.
Definition Decl.h:3702
static TypedefDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5809
Base class for declarations which introduce a typedef-name.
Definition Decl.h:3597
void setModedTypeSourceInfo(TypeSourceInfo *unmodedTSI, QualType modedTy)
Definition Decl.h:3662
void setTypeSourceInfo(TypeSourceInfo *newType)
Definition Decl.h:3658
An artificial decl, representing a global anonymous constant value which is uniquified by value withi...
Definition DeclCXX.h:4476
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:4139
static UnresolvedUsingIfExistsDecl * CreateDeserialized(ASTContext &Ctx, GlobalDeclID ID)
Definition DeclCXX.cpp:3663
Represents a dependent using declaration which was marked with typename.
Definition DeclCXX.h:4058
static UnresolvedUsingTypenameDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:3649
Represents a dependent using declaration which was not marked with typename.
Definition DeclCXX.h:3961
void setUsingLoc(SourceLocation L)
Set the source location of the 'using' keyword.
Definition DeclCXX.h:3995
static UnresolvedUsingValueDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:3619
Represents a C++ using-declaration.
Definition DeclCXX.h:3612
void setTypename(bool TN)
Sets whether the using declaration has 'typename'.
Definition DeclCXX.h:3664
void setUsingLoc(SourceLocation L)
Set the source location of the 'using' keyword.
Definition DeclCXX.h:3642
static UsingDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:3552
Represents C++ using-directive.
Definition DeclCXX.h:3117
static UsingDirectiveDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:3341
Represents a C++ using-enum-declaration.
Definition DeclCXX.h:3813
void setEnumType(TypeSourceInfo *TSI)
Definition DeclCXX.h:3852
void setEnumLoc(SourceLocation L)
Definition DeclCXX.h:3838
void setUsingLoc(SourceLocation L)
Definition DeclCXX.h:3834
static UsingEnumDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:3575
Represents a pack of using declarations that a single using-declarator pack-expanded into.
Definition DeclCXX.h:3894
static UsingPackDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumExpansions)
Definition DeclCXX.cpp:3595
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
Definition DeclCXX.h:3420
static UsingShadowDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:3480
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:932
ParmVarDeclBitfields ParmVarDeclBits
Definition Decl.h:1130
static VarDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:2136
VarDeclBitfields VarDeclBits
Definition Decl.h:1129
EvaluatedStmt * ensureEvaluatedStmt() const
Convert the initializer for this declaration to the elaborated EvaluatedStmt form,...
Definition Decl.cpp:2536
NonParmVarDeclBitfields NonParmVarDeclBits
Definition Decl.h:1131
@ Definition
This declaration is definitely a definition.
Definition Decl.h:1322
void setDescribedVarTemplate(VarTemplateDecl *Template)
Definition Decl.cpp:2776
StorageClass getStorageClass() const
Returns the storage class as written in the source.
Definition Decl.h:1174
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:3028
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:5995
@ 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:4337
static bool isUndeducedReturnType(QualType T)
bool operator!=(CanQual< T > x, CanQual< U > y)
TemplateNameKind
Specifies the kind of template name that an identifier refers to.
@ LCD_None
Definition Lambda.h:23
DeductionCandidate
Only used by CXXDeductionGuideDecl.
Definition DeclBase.h:1438
bool shouldSkipCheckingODR(const Decl *D)
Definition ASTReader.h:2703
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
Definition DeclBase.h:1305
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
Definition Specifiers.h:189
U cast(CodeGen::Address addr)
Definition Address.h:327
@ Interface
The "__interface" keyword introduces the elaborated-type-specifier.
Definition TypeBase.h:5975
@ Class
The "class" keyword introduces the elaborated-type-specifier.
Definition TypeBase.h:5981
@ Other
Other implicit parameter.
Definition Decl.h:1772
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
unsigned WasEvaluated
Whether this statement was already evaluated.
Definition Decl.h:888
unsigned HasConstantInitialization
Whether this variable is known to have constant initialization.
Definition Decl.h:899
LazyDeclStmtPtr Value
Definition Decl.h:921
unsigned HasSideEffects
Definition Decl.h:917
APValue Evaluated
Definition Decl.h:922
unsigned CheckedForSideEffects
Definition Decl.h:919
unsigned HasConstantDestruction
Whether this variable is known to have constant destruction.
Definition Decl.h:907
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:4398
uint32_t Part1
{01234567-...
Definition DeclCXX.h:4396
uint16_t Part3
...-cdef-...
Definition DeclCXX.h:4400
uint8_t Part4And5[8]
...-0123-456789abcdef}
Definition DeclCXX.h:4402
static constexpr OptionalUnsigned fromInternalRepresentation(underlying_type Rep)
llvm::DenseSet< std::tuple< Decl *, Decl *, int > > NonEquivalentDeclSet
Store declaration pairs already found to be non-equivalent.