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