clang 20.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"
52#include "clang/Basic/Stack.h"
58#include "llvm/ADT/DenseMap.h"
59#include "llvm/ADT/FoldingSet.h"
60#include "llvm/ADT/STLExtras.h"
61#include "llvm/ADT/SmallPtrSet.h"
62#include "llvm/ADT/SmallVector.h"
63#include "llvm/ADT/iterator_range.h"
64#include "llvm/Bitstream/BitstreamReader.h"
65#include "llvm/Support/Casting.h"
66#include "llvm/Support/ErrorHandling.h"
67#include "llvm/Support/SaveAndRestore.h"
68#include <algorithm>
69#include <cassert>
70#include <cstdint>
71#include <cstring>
72#include <string>
73#include <utility>
74
75using namespace clang;
76using namespace serialization;
77
78//===----------------------------------------------------------------------===//
79// Declaration Merging
80//===----------------------------------------------------------------------===//
81
82namespace {
83/// Results from loading a RedeclarableDecl.
84class RedeclarableResult {
85 Decl *MergeWith;
86 GlobalDeclID FirstID;
87 bool IsKeyDecl;
88
89public:
90 RedeclarableResult(Decl *MergeWith, GlobalDeclID FirstID, bool IsKeyDecl)
91 : MergeWith(MergeWith), FirstID(FirstID), IsKeyDecl(IsKeyDecl) {}
92
93 /// Retrieve the first ID.
94 GlobalDeclID getFirstID() const { return FirstID; }
95
96 /// Is this declaration a key declaration?
97 bool isKeyDecl() const { return IsKeyDecl; }
98
99 /// Get a known declaration that this should be merged with, if
100 /// any.
101 Decl *getKnownMergeTarget() const { return MergeWith; }
102};
103} // namespace
104
105namespace clang {
107 ASTReader &Reader;
108
109public:
110 ASTDeclMerger(ASTReader &Reader) : Reader(Reader) {}
111
112 void mergeLambda(CXXRecordDecl *D, RedeclarableResult &Redecl, Decl &Context,
113 unsigned Number);
114
115 /// \param KeyDeclID the decl ID of the key declaration \param D.
116 /// GlobalDeclID() if \param is not a key declaration.
117 /// See the comments of ASTReader::KeyDecls for the explanation
118 /// of key declaration.
119 template <typename T>
120 void mergeRedeclarableImpl(Redeclarable<T> *D, T *Existing,
121 GlobalDeclID KeyDeclID);
122
123 template <typename T>
125 RedeclarableResult &Redecl) {
127 D, Existing, Redecl.isKeyDecl() ? Redecl.getFirstID() : GlobalDeclID());
128 }
129
131 RedeclarableTemplateDecl *Existing, bool IsKeyDecl);
132
134 struct CXXRecordDecl::DefinitionData &&NewDD);
136 struct ObjCInterfaceDecl::DefinitionData &&NewDD);
138 struct ObjCProtocolDecl::DefinitionData &&NewDD);
139};
140} // namespace clang
141
142//===----------------------------------------------------------------------===//
143// Declaration deserialization
144//===----------------------------------------------------------------------===//
145
146namespace clang {
147class ASTDeclReader : public DeclVisitor<ASTDeclReader, void> {
148 ASTReader &Reader;
149 ASTDeclMerger MergeImpl;
151 ASTReader::RecordLocation Loc;
152 const GlobalDeclID ThisDeclID;
153 const SourceLocation ThisDeclLoc;
154
156
157 TypeID DeferredTypeID = 0;
158 unsigned AnonymousDeclNumber = 0;
159 GlobalDeclID NamedDeclForTagDecl = GlobalDeclID();
160 IdentifierInfo *TypedefNameForLinkage = nullptr;
161
162 /// A flag to carry the information for a decl from the entity is
163 /// used. We use it to delay the marking of the canonical decl as used until
164 /// the entire declaration is deserialized and merged.
165 bool IsDeclMarkedUsed = false;
166
167 uint64_t GetCurrentCursorOffset();
168
169 uint64_t ReadLocalOffset() {
170 uint64_t LocalOffset = Record.readInt();
171 assert(LocalOffset < Loc.Offset && "offset point after current record");
172 return LocalOffset ? Loc.Offset - LocalOffset : 0;
173 }
174
175 uint64_t ReadGlobalOffset() {
176 uint64_t Local = ReadLocalOffset();
177 return Local ? Record.getGlobalBitOffset(Local) : 0;
178 }
179
180 SourceLocation readSourceLocation() { return Record.readSourceLocation(); }
181
182 SourceRange readSourceRange() { return Record.readSourceRange(); }
183
184 TypeSourceInfo *readTypeSourceInfo() { return Record.readTypeSourceInfo(); }
185
186 GlobalDeclID readDeclID() { return Record.readDeclID(); }
187
188 std::string readString() { return Record.readString(); }
189
190 Decl *readDecl() { return Record.readDecl(); }
191
192 template <typename T> T *readDeclAs() { return Record.readDeclAs<T>(); }
193
194 serialization::SubmoduleID readSubmoduleID() {
195 if (Record.getIdx() == Record.size())
196 return 0;
197
198 return Record.getGlobalSubmoduleID(Record.readInt());
199 }
200
201 Module *readModule() { return Record.getSubmodule(readSubmoduleID()); }
202
203 void ReadCXXRecordDefinition(CXXRecordDecl *D, bool Update,
204 Decl *LambdaContext = nullptr,
205 unsigned IndexInLambdaContext = 0);
206 void ReadCXXDefinitionData(struct CXXRecordDecl::DefinitionData &Data,
207 const CXXRecordDecl *D, Decl *LambdaContext,
208 unsigned IndexInLambdaContext);
209 void ReadObjCDefinitionData(struct ObjCInterfaceDecl::DefinitionData &Data);
210 void ReadObjCDefinitionData(struct ObjCProtocolDecl::DefinitionData &Data);
211
212 static DeclContext *getPrimaryDCForAnonymousDecl(DeclContext *LexicalDC);
213
214 static NamedDecl *getAnonymousDeclForMerging(ASTReader &Reader,
215 DeclContext *DC, unsigned Index);
216 static void setAnonymousDeclForMerging(ASTReader &Reader, DeclContext *DC,
217 unsigned Index, NamedDecl *D);
218
219 /// Commit to a primary definition of the class RD, which is known to be
220 /// a definition of the class. We might not have read the definition data
221 /// for it yet. If we haven't then allocate placeholder definition data
222 /// now too.
223 static CXXRecordDecl *getOrFakePrimaryClassDefinition(ASTReader &Reader,
224 CXXRecordDecl *RD);
225
226 /// Class used to capture the result of searching for an existing
227 /// declaration of a specific kind and name, along with the ability
228 /// to update the place where this result was found (the declaration
229 /// chain hanging off an identifier or the DeclContext we searched in)
230 /// if requested.
231 class FindExistingResult {
232 ASTReader &Reader;
233 NamedDecl *New = nullptr;
234 NamedDecl *Existing = nullptr;
235 bool AddResult = false;
236 unsigned AnonymousDeclNumber = 0;
237 IdentifierInfo *TypedefNameForLinkage = nullptr;
238
239 public:
240 FindExistingResult(ASTReader &Reader) : Reader(Reader) {}
241
242 FindExistingResult(ASTReader &Reader, NamedDecl *New, NamedDecl *Existing,
243 unsigned AnonymousDeclNumber,
244 IdentifierInfo *TypedefNameForLinkage)
245 : Reader(Reader), New(New), Existing(Existing), AddResult(true),
246 AnonymousDeclNumber(AnonymousDeclNumber),
247 TypedefNameForLinkage(TypedefNameForLinkage) {}
248
249 FindExistingResult(FindExistingResult &&Other)
250 : Reader(Other.Reader), New(Other.New), Existing(Other.Existing),
251 AddResult(Other.AddResult),
252 AnonymousDeclNumber(Other.AnonymousDeclNumber),
253 TypedefNameForLinkage(Other.TypedefNameForLinkage) {
254 Other.AddResult = false;
255 }
256
257 FindExistingResult &operator=(FindExistingResult &&) = delete;
258 ~FindExistingResult();
259
260 /// Suppress the addition of this result into the known set of
261 /// names.
262 void suppress() { AddResult = false; }
263
264 operator NamedDecl *() const { return Existing; }
265
266 template <typename T> operator T *() const {
267 return dyn_cast_or_null<T>(Existing);
268 }
269 };
270
271 static DeclContext *getPrimaryContextForMerging(ASTReader &Reader,
272 DeclContext *DC);
273 FindExistingResult findExisting(NamedDecl *D);
274
275public:
277 ASTReader::RecordLocation Loc, GlobalDeclID thisDeclID,
278 SourceLocation ThisDeclLoc)
279 : Reader(Reader), MergeImpl(Reader), Record(Record), Loc(Loc),
280 ThisDeclID(thisDeclID), ThisDeclLoc(ThisDeclLoc) {}
281
282 template <typename DeclT>
284 static Decl *getMostRecentDeclImpl(...);
285 static Decl *getMostRecentDecl(Decl *D);
286
287 template <typename DeclT>
289 Decl *Previous, Decl *Canon);
290 static void attachPreviousDeclImpl(ASTReader &Reader, ...);
291 static void attachPreviousDecl(ASTReader &Reader, Decl *D, Decl *Previous,
292 Decl *Canon);
293
295 Decl *Previous);
296
297 template <typename DeclT>
298 static void attachLatestDeclImpl(Redeclarable<DeclT> *D, Decl *Latest);
299 static void attachLatestDeclImpl(...);
300 static void attachLatestDecl(Decl *D, Decl *latest);
301
302 template <typename DeclT>
304 static void markIncompleteDeclChainImpl(...);
305
307 llvm::BitstreamCursor &DeclsCursor, bool IsPartial);
308
310 void Visit(Decl *D);
311
312 void UpdateDecl(Decl *D);
313
315 ObjCCategoryDecl *Next) {
316 Cat->NextClassCategory = Next;
317 }
318
319 void VisitDecl(Decl *D);
323 void VisitNamedDecl(NamedDecl *ND);
324 void VisitLabelDecl(LabelDecl *LD);
329 void VisitTypeDecl(TypeDecl *TD);
330 RedeclarableResult VisitTypedefNameDecl(TypedefNameDecl *TD);
335 RedeclarableResult VisitTagDecl(TagDecl *TD);
336 void VisitEnumDecl(EnumDecl *ED);
337 RedeclarableResult VisitRecordDeclImpl(RecordDecl *RD);
338 void VisitRecordDecl(RecordDecl *RD);
339 RedeclarableResult VisitCXXRecordDeclImpl(CXXRecordDecl *D);
341 RedeclarableResult
343
344 void
347 }
348
351 RedeclarableResult
353
356 }
357
361 void VisitValueDecl(ValueDecl *VD);
371 void VisitFieldDecl(FieldDecl *FD);
377 RedeclarableResult VisitVarDeclImpl(VarDecl *D);
378 void ReadVarDeclInit(VarDecl *VD);
387 void
411 void VisitBlockDecl(BlockDecl *BD);
415
416 std::pair<uint64_t, uint64_t> VisitDeclContext(DeclContext *DC);
417
418 template <typename T>
419 RedeclarableResult VisitRedeclarable(Redeclarable<T> *D);
420
421 template <typename T>
422 void mergeRedeclarable(Redeclarable<T> *D, RedeclarableResult &Redecl);
423
425 RedeclarableResult &Redecl);
426
427 template <typename T> void mergeMergeable(Mergeable<T> *D);
428
430
432
433 // FIXME: Reorder according to DeclNodes.td?
454};
455} // namespace clang
456
457namespace {
458
459/// Iterator over the redeclarations of a declaration that have already
460/// been merged into the same redeclaration chain.
461template <typename DeclT> class MergedRedeclIterator {
462 DeclT *Start = nullptr;
463 DeclT *Canonical = nullptr;
464 DeclT *Current = nullptr;
465
466public:
467 MergedRedeclIterator() = default;
468 MergedRedeclIterator(DeclT *Start) : Start(Start), Current(Start) {}
469
470 DeclT *operator*() { return Current; }
471
472 MergedRedeclIterator &operator++() {
473 if (Current->isFirstDecl()) {
474 Canonical = Current;
475 Current = Current->getMostRecentDecl();
476 } else
477 Current = Current->getPreviousDecl();
478
479 // If we started in the merged portion, we'll reach our start position
480 // eventually. Otherwise, we'll never reach it, but the second declaration
481 // we reached was the canonical declaration, so stop when we see that one
482 // again.
483 if (Current == Start || Current == Canonical)
484 Current = nullptr;
485 return *this;
486 }
487
488 friend bool operator!=(const MergedRedeclIterator &A,
489 const MergedRedeclIterator &B) {
490 return A.Current != B.Current;
491 }
492};
493
494} // namespace
495
496template <typename DeclT>
497static llvm::iterator_range<MergedRedeclIterator<DeclT>>
499 return llvm::make_range(MergedRedeclIterator<DeclT>(D),
500 MergedRedeclIterator<DeclT>());
501}
502
503uint64_t ASTDeclReader::GetCurrentCursorOffset() {
504 return Loc.F->DeclsCursor.GetCurrentBitNo() + Loc.F->GlobalBitOffset;
505}
506
508 if (Record.readInt()) {
509 Reader.DefinitionSource[FD] =
510 Loc.F->Kind == ModuleKind::MK_MainFile ||
511 Reader.getContext().getLangOpts().BuildingPCHWithObjectFile;
512 }
513 if (auto *CD = dyn_cast<CXXConstructorDecl>(FD)) {
514 CD->setNumCtorInitializers(Record.readInt());
515 if (CD->getNumCtorInitializers())
516 CD->CtorInitializers = ReadGlobalOffset();
517 }
518 // Store the offset of the body so we can lazily load it later.
519 Reader.PendingBodies[FD] = GetCurrentCursorOffset();
520}
521
524
525 // At this point we have deserialized and merged the decl and it is safe to
526 // update its canonical decl to signal that the entire entity is used.
527 D->getCanonicalDecl()->Used |= IsDeclMarkedUsed;
528 IsDeclMarkedUsed = false;
529
530 if (auto *DD = dyn_cast<DeclaratorDecl>(D)) {
531 if (auto *TInfo = DD->getTypeSourceInfo())
532 Record.readTypeLoc(TInfo->getTypeLoc());
533 }
534
535 if (auto *TD = dyn_cast<TypeDecl>(D)) {
536 // We have a fully initialized TypeDecl. Read its type now.
537 TD->setTypeForDecl(Reader.GetType(DeferredTypeID).getTypePtrOrNull());
538
539 // If this is a tag declaration with a typedef name for linkage, it's safe
540 // to load that typedef now.
541 if (NamedDeclForTagDecl.isValid())
542 cast<TagDecl>(D)->TypedefNameDeclOrQualifier =
543 cast<TypedefNameDecl>(Reader.GetDecl(NamedDeclForTagDecl));
544 } else if (auto *ID = dyn_cast<ObjCInterfaceDecl>(D)) {
545 // if we have a fully initialized TypeDecl, we can safely read its type now.
546 ID->TypeForDecl = Reader.GetType(DeferredTypeID).getTypePtrOrNull();
547 } else if (auto *FD = dyn_cast<FunctionDecl>(D)) {
548 // FunctionDecl's body was written last after all other Stmts/Exprs.
549 if (Record.readInt())
551 } else if (auto *VD = dyn_cast<VarDecl>(D)) {
552 ReadVarDeclInit(VD);
553 } else if (auto *FD = dyn_cast<FieldDecl>(D)) {
554 if (FD->hasInClassInitializer() && Record.readInt()) {
555 FD->setLazyInClassInitializer(LazyDeclStmtPtr(GetCurrentCursorOffset()));
556 }
557 }
558}
559
561 BitsUnpacker DeclBits(Record.readInt());
562 auto ModuleOwnership =
563 (Decl::ModuleOwnershipKind)DeclBits.getNextBits(/*Width=*/3);
564 D->setReferenced(DeclBits.getNextBit());
565 D->Used = DeclBits.getNextBit();
566 IsDeclMarkedUsed |= D->Used;
567 D->setAccess((AccessSpecifier)DeclBits.getNextBits(/*Width=*/2));
568 D->setImplicit(DeclBits.getNextBit());
569 bool HasStandaloneLexicalDC = DeclBits.getNextBit();
570 bool HasAttrs = DeclBits.getNextBit();
572 D->InvalidDecl = DeclBits.getNextBit();
573 D->FromASTFile = true;
574
576 isa<ParmVarDecl, ObjCTypeParamDecl>(D)) {
577 // We don't want to deserialize the DeclContext of a template
578 // parameter or of a parameter of a function template immediately. These
579 // entities might be used in the formulation of its DeclContext (for
580 // example, a function parameter can be used in decltype() in trailing
581 // return type of the function). Use the translation unit DeclContext as a
582 // placeholder.
583 GlobalDeclID SemaDCIDForTemplateParmDecl = readDeclID();
584 GlobalDeclID LexicalDCIDForTemplateParmDecl =
585 HasStandaloneLexicalDC ? readDeclID() : GlobalDeclID();
586 if (LexicalDCIDForTemplateParmDecl.isInvalid())
587 LexicalDCIDForTemplateParmDecl = SemaDCIDForTemplateParmDecl;
588 Reader.addPendingDeclContextInfo(D,
589 SemaDCIDForTemplateParmDecl,
590 LexicalDCIDForTemplateParmDecl);
592 } else {
593 auto *SemaDC = readDeclAs<DeclContext>();
594 auto *LexicalDC =
595 HasStandaloneLexicalDC ? readDeclAs<DeclContext>() : nullptr;
596 if (!LexicalDC)
597 LexicalDC = SemaDC;
598 // If the context is a class, we might not have actually merged it yet, in
599 // the case where the definition comes from an update record.
600 DeclContext *MergedSemaDC;
601 if (auto *RD = dyn_cast<CXXRecordDecl>(SemaDC))
602 MergedSemaDC = getOrFakePrimaryClassDefinition(Reader, RD);
603 else
604 MergedSemaDC = Reader.MergedDeclContexts.lookup(SemaDC);
605 // Avoid calling setLexicalDeclContext() directly because it uses
606 // Decl::getASTContext() internally which is unsafe during derialization.
607 D->setDeclContextsImpl(MergedSemaDC ? MergedSemaDC : SemaDC, LexicalDC,
608 Reader.getContext());
609 }
610 D->setLocation(ThisDeclLoc);
611
612 if (HasAttrs) {
613 AttrVec Attrs;
614 Record.readAttributes(Attrs);
615 // Avoid calling setAttrs() directly because it uses Decl::getASTContext()
616 // internally which is unsafe during derialization.
617 D->setAttrsImpl(Attrs, Reader.getContext());
618 }
619
620 // Determine whether this declaration is part of a (sub)module. If so, it
621 // may not yet be visible.
622 bool ModulePrivate =
623 (ModuleOwnership == Decl::ModuleOwnershipKind::ModulePrivate);
624 if (unsigned SubmoduleID = readSubmoduleID()) {
625 switch (ModuleOwnership) {
628 break;
633 break;
634 }
635
636 D->setModuleOwnershipKind(ModuleOwnership);
637 // Store the owning submodule ID in the declaration.
639
640 if (ModulePrivate) {
641 // Module-private declarations are never visible, so there is no work to
642 // do.
643 } else if (Reader.getContext().getLangOpts().ModulesLocalVisibility) {
644 // If local visibility is being tracked, this declaration will become
645 // hidden and visible as the owning module does.
646 } else if (Module *Owner = Reader.getSubmodule(SubmoduleID)) {
647 // Mark the declaration as visible when its owning module becomes visible.
648 if (Owner->NameVisibility == Module::AllVisible)
650 else
651 Reader.HiddenNamesMap[Owner].push_back(D);
652 }
653 } else if (ModulePrivate) {
655 }
656}
657
659 VisitDecl(D);
660 D->setLocation(readSourceLocation());
661 D->CommentKind = (PragmaMSCommentKind)Record.readInt();
662 std::string Arg = readString();
663 memcpy(D->getTrailingObjects<char>(), Arg.data(), Arg.size());
664 D->getTrailingObjects<char>()[Arg.size()] = '\0';
665}
666
668 VisitDecl(D);
669 D->setLocation(readSourceLocation());
670 std::string Name = readString();
671 memcpy(D->getTrailingObjects<char>(), Name.data(), Name.size());
672 D->getTrailingObjects<char>()[Name.size()] = '\0';
673
674 D->ValueStart = Name.size() + 1;
675 std::string Value = readString();
676 memcpy(D->getTrailingObjects<char>() + D->ValueStart, Value.data(),
677 Value.size());
678 D->getTrailingObjects<char>()[D->ValueStart + Value.size()] = '\0';
679}
680
682 llvm_unreachable("Translation units are not serialized");
683}
684
686 VisitDecl(ND);
687 ND->setDeclName(Record.readDeclarationName());
688 AnonymousDeclNumber = Record.readInt();
689}
690
692 VisitNamedDecl(TD);
693 TD->setLocStart(readSourceLocation());
694 // Delay type reading until after we have fully initialized the decl.
695 DeferredTypeID = Record.getGlobalTypeID(Record.readInt());
696}
697
699 RedeclarableResult Redecl = VisitRedeclarable(TD);
700 VisitTypeDecl(TD);
701 TypeSourceInfo *TInfo = readTypeSourceInfo();
702 if (Record.readInt()) { // isModed
703 QualType modedT = Record.readType();
704 TD->setModedTypeSourceInfo(TInfo, modedT);
705 } else
706 TD->setTypeSourceInfo(TInfo);
707 // Read and discard the declaration for which this is a typedef name for
708 // linkage, if it exists. We cannot rely on our type to pull in this decl,
709 // because it might have been merged with a type from another module and
710 // thus might not refer to our version of the declaration.
711 readDecl();
712 return Redecl;
713}
714
716 RedeclarableResult Redecl = VisitTypedefNameDecl(TD);
717 mergeRedeclarable(TD, Redecl);
718}
719
721 RedeclarableResult Redecl = VisitTypedefNameDecl(TD);
722 if (auto *Template = readDeclAs<TypeAliasTemplateDecl>())
723 // Merged when we merge the template.
724 TD->setDescribedAliasTemplate(Template);
725 else
726 mergeRedeclarable(TD, Redecl);
727}
728
729RedeclarableResult ASTDeclReader::VisitTagDecl(TagDecl *TD) {
730 RedeclarableResult Redecl = VisitRedeclarable(TD);
731 VisitTypeDecl(TD);
732
733 TD->IdentifierNamespace = Record.readInt();
734
735 BitsUnpacker TagDeclBits(Record.readInt());
736 TD->setTagKind(
737 static_cast<TagTypeKind>(TagDeclBits.getNextBits(/*Width=*/3)));
738 TD->setCompleteDefinition(TagDeclBits.getNextBit());
739 TD->setEmbeddedInDeclarator(TagDeclBits.getNextBit());
740 TD->setFreeStanding(TagDeclBits.getNextBit());
741 TD->setCompleteDefinitionRequired(TagDeclBits.getNextBit());
742 TD->setBraceRange(readSourceRange());
743
744 switch (TagDeclBits.getNextBits(/*Width=*/2)) {
745 case 0:
746 break;
747 case 1: { // ExtInfo
748 auto *Info = new (Reader.getContext()) TagDecl::ExtInfo();
749 Record.readQualifierInfo(*Info);
750 TD->TypedefNameDeclOrQualifier = Info;
751 break;
752 }
753 case 2: // TypedefNameForAnonDecl
754 NamedDeclForTagDecl = readDeclID();
755 TypedefNameForLinkage = Record.readIdentifier();
756 break;
757 default:
758 llvm_unreachable("unexpected tag info kind");
759 }
760
761 if (!isa<CXXRecordDecl>(TD))
762 mergeRedeclarable(TD, Redecl);
763 return Redecl;
764}
765
767 VisitTagDecl(ED);
768 if (TypeSourceInfo *TI = readTypeSourceInfo())
770 else
771 ED->setIntegerType(Record.readType());
772 ED->setPromotionType(Record.readType());
773
774 BitsUnpacker EnumDeclBits(Record.readInt());
775 ED->setNumPositiveBits(EnumDeclBits.getNextBits(/*Width=*/8));
776 ED->setNumNegativeBits(EnumDeclBits.getNextBits(/*Width=*/8));
777 ED->setScoped(EnumDeclBits.getNextBit());
778 ED->setScopedUsingClassTag(EnumDeclBits.getNextBit());
779 ED->setFixed(EnumDeclBits.getNextBit());
780
781 ED->setHasODRHash(true);
782 ED->ODRHash = Record.readInt();
783
784 // If this is a definition subject to the ODR, and we already have a
785 // definition, merge this one into it.
786 if (ED->isCompleteDefinition() && Reader.getContext().getLangOpts().Modules) {
787 EnumDecl *&OldDef = Reader.EnumDefinitions[ED->getCanonicalDecl()];
788 if (!OldDef) {
789 // This is the first time we've seen an imported definition. Look for a
790 // local definition before deciding that we are the first definition.
791 for (auto *D : merged_redecls(ED->getCanonicalDecl())) {
792 if (!D->isFromASTFile() && D->isCompleteDefinition()) {
793 OldDef = D;
794 break;
795 }
796 }
797 }
798 if (OldDef) {
799 Reader.MergedDeclContexts.insert(std::make_pair(ED, OldDef));
801 Reader.mergeDefinitionVisibility(OldDef, ED);
802 // We don't want to check the ODR hash value for declarations from global
803 // module fragment.
804 if (!shouldSkipCheckingODR(ED) && !shouldSkipCheckingODR(OldDef) &&
805 OldDef->getODRHash() != ED->getODRHash())
806 Reader.PendingEnumOdrMergeFailures[OldDef].push_back(ED);
807 } else {
808 OldDef = ED;
809 }
810 }
811
812 if (auto *InstED = readDeclAs<EnumDecl>()) {
813 auto TSK = (TemplateSpecializationKind)Record.readInt();
814 SourceLocation POI = readSourceLocation();
815 ED->setInstantiationOfMemberEnum(Reader.getContext(), InstED, TSK);
817 }
818}
819
821 RedeclarableResult Redecl = VisitTagDecl(RD);
822
823 BitsUnpacker RecordDeclBits(Record.readInt());
824 RD->setHasFlexibleArrayMember(RecordDeclBits.getNextBit());
825 RD->setAnonymousStructOrUnion(RecordDeclBits.getNextBit());
826 RD->setHasObjectMember(RecordDeclBits.getNextBit());
827 RD->setHasVolatileMember(RecordDeclBits.getNextBit());
829 RD->setNonTrivialToPrimitiveCopy(RecordDeclBits.getNextBit());
830 RD->setNonTrivialToPrimitiveDestroy(RecordDeclBits.getNextBit());
832 RecordDeclBits.getNextBit());
835 RD->setParamDestroyedInCallee(RecordDeclBits.getNextBit());
837 (RecordArgPassingKind)RecordDeclBits.getNextBits(/*Width=*/2));
838 return Redecl;
839}
840
843 RD->setODRHash(Record.readInt());
844
845 // Maintain the invariant of a redeclaration chain containing only
846 // a single definition.
847 if (RD->isCompleteDefinition()) {
848 RecordDecl *Canon = static_cast<RecordDecl *>(RD->getCanonicalDecl());
849 RecordDecl *&OldDef = Reader.RecordDefinitions[Canon];
850 if (!OldDef) {
851 // This is the first time we've seen an imported definition. Look for a
852 // local definition before deciding that we are the first definition.
853 for (auto *D : merged_redecls(Canon)) {
854 if (!D->isFromASTFile() && D->isCompleteDefinition()) {
855 OldDef = D;
856 break;
857 }
858 }
859 }
860 if (OldDef) {
861 Reader.MergedDeclContexts.insert(std::make_pair(RD, OldDef));
863 Reader.mergeDefinitionVisibility(OldDef, RD);
864 if (OldDef->getODRHash() != RD->getODRHash())
865 Reader.PendingRecordOdrMergeFailures[OldDef].push_back(RD);
866 } else {
867 OldDef = RD;
868 }
869 }
870}
871
873 VisitNamedDecl(VD);
874 // For function or variable declarations, defer reading the type in case the
875 // declaration has a deduced type that references an entity declared within
876 // the function definition or variable initializer.
877 if (isa<FunctionDecl, VarDecl>(VD))
878 DeferredTypeID = Record.getGlobalTypeID(Record.readInt());
879 else
880 VD->setType(Record.readType());
881}
882
884 VisitValueDecl(ECD);
885 if (Record.readInt())
886 ECD->setInitExpr(Record.readExpr());
887 ECD->setInitVal(Reader.getContext(), Record.readAPSInt());
888 mergeMergeable(ECD);
889}
890
892 VisitValueDecl(DD);
893 DD->setInnerLocStart(readSourceLocation());
894 if (Record.readInt()) { // hasExtInfo
895 auto *Info = new (Reader.getContext()) DeclaratorDecl::ExtInfo();
896 Record.readQualifierInfo(*Info);
897 Info->TrailingRequiresClause = Record.readExpr();
898 DD->DeclInfo = Info;
899 }
900 QualType TSIType = Record.readType();
902 TSIType.isNull() ? nullptr
903 : Reader.getContext().CreateTypeSourceInfo(TSIType));
904}
905
907 RedeclarableResult Redecl = VisitRedeclarable(FD);
908
909 FunctionDecl *Existing = nullptr;
910
911 switch ((FunctionDecl::TemplatedKind)Record.readInt()) {
913 break;
915 FD->setInstantiatedFromDecl(readDeclAs<FunctionDecl>());
916 break;
918 auto *Template = readDeclAs<FunctionTemplateDecl>();
919 Template->init(FD);
920 FD->setDescribedFunctionTemplate(Template);
921 break;
922 }
924 auto *InstFD = readDeclAs<FunctionDecl>();
925 auto TSK = (TemplateSpecializationKind)Record.readInt();
926 SourceLocation POI = readSourceLocation();
927 FD->setInstantiationOfMemberFunction(Reader.getContext(), InstFD, TSK);
929 break;
930 }
932 auto *Template = readDeclAs<FunctionTemplateDecl>();
933 auto TSK = (TemplateSpecializationKind)Record.readInt();
934
935 // Template arguments.
937 Record.readTemplateArgumentList(TemplArgs, /*Canonicalize*/ true);
938
939 // Template args as written.
940 TemplateArgumentListInfo TemplArgsWritten;
941 bool HasTemplateArgumentsAsWritten = Record.readBool();
942 if (HasTemplateArgumentsAsWritten)
943 Record.readTemplateArgumentListInfo(TemplArgsWritten);
944
945 SourceLocation POI = readSourceLocation();
946
947 ASTContext &C = Reader.getContext();
948 TemplateArgumentList *TemplArgList =
950
951 MemberSpecializationInfo *MSInfo = nullptr;
952 if (Record.readInt()) {
953 auto *FD = readDeclAs<FunctionDecl>();
954 auto TSK = (TemplateSpecializationKind)Record.readInt();
955 SourceLocation POI = readSourceLocation();
956
957 MSInfo = new (C) MemberSpecializationInfo(FD, TSK);
958 MSInfo->setPointOfInstantiation(POI);
959 }
960
963 C, FD, Template, TSK, TemplArgList,
964 HasTemplateArgumentsAsWritten ? &TemplArgsWritten : nullptr, POI,
965 MSInfo);
966 FD->TemplateOrSpecialization = FTInfo;
967
968 if (FD->isCanonicalDecl()) { // if canonical add to template's set.
969 // The template that contains the specializations set. It's not safe to
970 // use getCanonicalDecl on Template since it may still be initializing.
971 auto *CanonTemplate = readDeclAs<FunctionTemplateDecl>();
972 // Get the InsertPos by FindNodeOrInsertPos() instead of calling
973 // InsertNode(FTInfo) directly to avoid the getASTContext() call in
974 // FunctionTemplateSpecializationInfo's Profile().
975 // We avoid getASTContext because a decl in the parent hierarchy may
976 // be initializing.
977 llvm::FoldingSetNodeID ID;
979 void *InsertPos = nullptr;
980 FunctionTemplateDecl::Common *CommonPtr = CanonTemplate->getCommonPtr();
982 CommonPtr->Specializations.FindNodeOrInsertPos(ID, InsertPos);
983 if (InsertPos)
984 CommonPtr->Specializations.InsertNode(FTInfo, InsertPos);
985 else {
986 assert(Reader.getContext().getLangOpts().Modules &&
987 "already deserialized this template specialization");
988 Existing = ExistingInfo->getFunction();
989 }
990 }
991 break;
992 }
994 // Templates.
995 UnresolvedSet<8> Candidates;
996 unsigned NumCandidates = Record.readInt();
997 while (NumCandidates--)
998 Candidates.addDecl(readDeclAs<NamedDecl>());
999
1000 // Templates args.
1001 TemplateArgumentListInfo TemplArgsWritten;
1002 bool HasTemplateArgumentsAsWritten = Record.readBool();
1003 if (HasTemplateArgumentsAsWritten)
1004 Record.readTemplateArgumentListInfo(TemplArgsWritten);
1005
1007 Reader.getContext(), Candidates,
1008 HasTemplateArgumentsAsWritten ? &TemplArgsWritten : nullptr);
1009 // These are not merged; we don't need to merge redeclarations of dependent
1010 // template friends.
1011 break;
1012 }
1013 }
1014
1016
1017 // Attach a type to this function. Use the real type if possible, but fall
1018 // back to the type as written if it involves a deduced return type.
1019 if (FD->getTypeSourceInfo() && FD->getTypeSourceInfo()
1020 ->getType()
1021 ->castAs<FunctionType>()
1022 ->getReturnType()
1024 // We'll set up the real type in Visit, once we've finished loading the
1025 // function.
1026 FD->setType(FD->getTypeSourceInfo()->getType());
1027 Reader.PendingDeducedFunctionTypes.push_back({FD, DeferredTypeID});
1028 } else {
1029 FD->setType(Reader.GetType(DeferredTypeID));
1030 }
1031 DeferredTypeID = 0;
1032
1033 FD->DNLoc = Record.readDeclarationNameLoc(FD->getDeclName());
1034 FD->IdentifierNamespace = Record.readInt();
1035
1036 // FunctionDecl's body is handled last at ASTDeclReader::Visit,
1037 // after everything else is read.
1038 BitsUnpacker FunctionDeclBits(Record.readInt());
1039
1040 FD->setCachedLinkage((Linkage)FunctionDeclBits.getNextBits(/*Width=*/3));
1041 FD->setStorageClass((StorageClass)FunctionDeclBits.getNextBits(/*Width=*/3));
1042 FD->setInlineSpecified(FunctionDeclBits.getNextBit());
1043 FD->setImplicitlyInline(FunctionDeclBits.getNextBit());
1044 FD->setHasSkippedBody(FunctionDeclBits.getNextBit());
1045 FD->setVirtualAsWritten(FunctionDeclBits.getNextBit());
1046 // We defer calling `FunctionDecl::setPure()` here as for methods of
1047 // `CXXTemplateSpecializationDecl`s, we may not have connected up the
1048 // definition (which is required for `setPure`).
1049 const bool Pure = FunctionDeclBits.getNextBit();
1050 FD->setHasInheritedPrototype(FunctionDeclBits.getNextBit());
1051 FD->setHasWrittenPrototype(FunctionDeclBits.getNextBit());
1052 FD->setDeletedAsWritten(FunctionDeclBits.getNextBit());
1053 FD->setTrivial(FunctionDeclBits.getNextBit());
1054 FD->setTrivialForCall(FunctionDeclBits.getNextBit());
1055 FD->setDefaulted(FunctionDeclBits.getNextBit());
1056 FD->setExplicitlyDefaulted(FunctionDeclBits.getNextBit());
1057 FD->setIneligibleOrNotSelected(FunctionDeclBits.getNextBit());
1058 FD->setConstexprKind(
1059 (ConstexprSpecKind)FunctionDeclBits.getNextBits(/*Width=*/2));
1060 FD->setHasImplicitReturnZero(FunctionDeclBits.getNextBit());
1061 FD->setIsMultiVersion(FunctionDeclBits.getNextBit());
1062 FD->setLateTemplateParsed(FunctionDeclBits.getNextBit());
1064 FunctionDeclBits.getNextBit());
1065 FD->setUsesSEHTry(FunctionDeclBits.getNextBit());
1066
1067 FD->EndRangeLoc = readSourceLocation();
1068 if (FD->isExplicitlyDefaulted())
1069 FD->setDefaultLoc(readSourceLocation());
1070
1071 FD->ODRHash = Record.readInt();
1072 FD->setHasODRHash(true);
1073
1074 if (FD->isDefaulted() || FD->isDeletedAsWritten()) {
1075 // If 'Info' is nonzero, we need to read an DefaultedOrDeletedInfo; if,
1076 // additionally, the second bit is also set, we also need to read
1077 // a DeletedMessage for the DefaultedOrDeletedInfo.
1078 if (auto Info = Record.readInt()) {
1079 bool HasMessage = Info & 2;
1080 StringLiteral *DeletedMessage =
1081 HasMessage ? cast<StringLiteral>(Record.readExpr()) : nullptr;
1082
1083 unsigned NumLookups = Record.readInt();
1085 for (unsigned I = 0; I != NumLookups; ++I) {
1086 NamedDecl *ND = Record.readDeclAs<NamedDecl>();
1087 AccessSpecifier AS = (AccessSpecifier)Record.readInt();
1088 Lookups.push_back(DeclAccessPair::make(ND, AS));
1089 }
1090
1093 Reader.getContext(), Lookups, DeletedMessage));
1094 }
1095 }
1096
1097 if (Existing)
1098 MergeImpl.mergeRedeclarable(FD, Existing, Redecl);
1099 else if (auto Kind = FD->getTemplatedKind();
1102 // Function Templates have their FunctionTemplateDecls merged instead of
1103 // their FunctionDecls.
1104 auto merge = [this, &Redecl, FD](auto &&F) {
1105 auto *Existing = cast_or_null<FunctionDecl>(Redecl.getKnownMergeTarget());
1106 RedeclarableResult NewRedecl(Existing ? F(Existing) : nullptr,
1107 Redecl.getFirstID(), Redecl.isKeyDecl());
1108 mergeRedeclarableTemplate(F(FD), NewRedecl);
1109 };
1111 merge(
1112 [](FunctionDecl *FD) { return FD->getDescribedFunctionTemplate(); });
1113 else
1114 merge([](FunctionDecl *FD) {
1115 return FD->getTemplateSpecializationInfo()->getTemplate();
1116 });
1117 } else
1118 mergeRedeclarable(FD, Redecl);
1119
1120 // Defer calling `setPure` until merging above has guaranteed we've set
1121 // `DefinitionData` (as this will need to access it).
1122 FD->setIsPureVirtual(Pure);
1123
1124 // Read in the parameters.
1125 unsigned NumParams = Record.readInt();
1127 Params.reserve(NumParams);
1128 for (unsigned I = 0; I != NumParams; ++I)
1129 Params.push_back(readDeclAs<ParmVarDecl>());
1130 FD->setParams(Reader.getContext(), Params);
1131
1132 // If the declaration is a SYCL kernel entry point function as indicated by
1133 // the presence of a sycl_kernel_entry_point attribute, register it so that
1134 // associated metadata is recreated.
1135 if (FD->hasAttr<SYCLKernelEntryPointAttr>()) {
1136 auto *SKEPAttr = FD->getAttr<SYCLKernelEntryPointAttr>();
1137 ASTContext &C = Reader.getContext();
1138 const SYCLKernelInfo *SKI = C.findSYCLKernelInfo(SKEPAttr->getKernelName());
1139 if (SKI) {
1141 Reader.Diag(FD->getLocation(), diag::err_sycl_kernel_name_conflict);
1142 Reader.Diag(SKI->getKernelEntryPointDecl()->getLocation(),
1143 diag::note_previous_declaration);
1144 SKEPAttr->setInvalidAttr();
1145 }
1146 } else {
1147 C.registerSYCLEntryPointFunction(FD);
1148 }
1149 }
1150}
1151
1153 VisitNamedDecl(MD);
1154 if (Record.readInt()) {
1155 // Load the body on-demand. Most clients won't care, because method
1156 // definitions rarely show up in headers.
1157 Reader.PendingBodies[MD] = GetCurrentCursorOffset();
1158 }
1159 MD->setSelfDecl(readDeclAs<ImplicitParamDecl>());
1160 MD->setCmdDecl(readDeclAs<ImplicitParamDecl>());
1161 MD->setInstanceMethod(Record.readInt());
1162 MD->setVariadic(Record.readInt());
1163 MD->setPropertyAccessor(Record.readInt());
1164 MD->setSynthesizedAccessorStub(Record.readInt());
1165 MD->setDefined(Record.readInt());
1166 MD->setOverriding(Record.readInt());
1167 MD->setHasSkippedBody(Record.readInt());
1168
1169 MD->setIsRedeclaration(Record.readInt());
1170 MD->setHasRedeclaration(Record.readInt());
1171 if (MD->hasRedeclaration())
1173 readDeclAs<ObjCMethodDecl>());
1174
1176 static_cast<ObjCImplementationControl>(Record.readInt()));
1178 MD->setRelatedResultType(Record.readInt());
1179 MD->setReturnType(Record.readType());
1180 MD->setReturnTypeSourceInfo(readTypeSourceInfo());
1181 MD->DeclEndLoc = readSourceLocation();
1182 unsigned NumParams = Record.readInt();
1184 Params.reserve(NumParams);
1185 for (unsigned I = 0; I != NumParams; ++I)
1186 Params.push_back(readDeclAs<ParmVarDecl>());
1187
1188 MD->setSelLocsKind((SelectorLocationsKind)Record.readInt());
1189 unsigned NumStoredSelLocs = Record.readInt();
1191 SelLocs.reserve(NumStoredSelLocs);
1192 for (unsigned i = 0; i != NumStoredSelLocs; ++i)
1193 SelLocs.push_back(readSourceLocation());
1194
1195 MD->setParamsAndSelLocs(Reader.getContext(), Params, SelLocs);
1196}
1197
1200
1201 D->Variance = Record.readInt();
1202 D->Index = Record.readInt();
1203 D->VarianceLoc = readSourceLocation();
1204 D->ColonLoc = readSourceLocation();
1205}
1206
1208 VisitNamedDecl(CD);
1209 CD->setAtStartLoc(readSourceLocation());
1210 CD->setAtEndRange(readSourceRange());
1211}
1212
1214 unsigned numParams = Record.readInt();
1215 if (numParams == 0)
1216 return nullptr;
1217
1219 typeParams.reserve(numParams);
1220 for (unsigned i = 0; i != numParams; ++i) {
1221 auto *typeParam = readDeclAs<ObjCTypeParamDecl>();
1222 if (!typeParam)
1223 return nullptr;
1224
1225 typeParams.push_back(typeParam);
1226 }
1227
1228 SourceLocation lAngleLoc = readSourceLocation();
1229 SourceLocation rAngleLoc = readSourceLocation();
1230
1231 return ObjCTypeParamList::create(Reader.getContext(), lAngleLoc,
1232 typeParams, rAngleLoc);
1233}
1234
1235void ASTDeclReader::ReadObjCDefinitionData(
1236 struct ObjCInterfaceDecl::DefinitionData &Data) {
1237 // Read the superclass.
1238 Data.SuperClassTInfo = readTypeSourceInfo();
1239
1240 Data.EndLoc = readSourceLocation();
1241 Data.HasDesignatedInitializers = Record.readInt();
1242 Data.ODRHash = Record.readInt();
1243 Data.HasODRHash = true;
1244
1245 // Read the directly referenced protocols and their SourceLocations.
1246 unsigned NumProtocols = Record.readInt();
1248 Protocols.reserve(NumProtocols);
1249 for (unsigned I = 0; I != NumProtocols; ++I)
1250 Protocols.push_back(readDeclAs<ObjCProtocolDecl>());
1252 ProtoLocs.reserve(NumProtocols);
1253 for (unsigned I = 0; I != NumProtocols; ++I)
1254 ProtoLocs.push_back(readSourceLocation());
1255 Data.ReferencedProtocols.set(Protocols.data(), NumProtocols, ProtoLocs.data(),
1256 Reader.getContext());
1257
1258 // Read the transitive closure of protocols referenced by this class.
1259 NumProtocols = Record.readInt();
1260 Protocols.clear();
1261 Protocols.reserve(NumProtocols);
1262 for (unsigned I = 0; I != NumProtocols; ++I)
1263 Protocols.push_back(readDeclAs<ObjCProtocolDecl>());
1264 Data.AllReferencedProtocols.set(Protocols.data(), NumProtocols,
1265 Reader.getContext());
1266}
1267
1269 ObjCInterfaceDecl *D, struct ObjCInterfaceDecl::DefinitionData &&NewDD) {
1270 struct ObjCInterfaceDecl::DefinitionData &DD = D->data();
1271 if (DD.Definition == NewDD.Definition)
1272 return;
1273
1274 Reader.MergedDeclContexts.insert(
1275 std::make_pair(NewDD.Definition, DD.Definition));
1276 Reader.mergeDefinitionVisibility(DD.Definition, NewDD.Definition);
1277
1278 if (D->getODRHash() != NewDD.ODRHash)
1279 Reader.PendingObjCInterfaceOdrMergeFailures[DD.Definition].push_back(
1280 {NewDD.Definition, &NewDD});
1281}
1282
1284 RedeclarableResult Redecl = VisitRedeclarable(ID);
1286 DeferredTypeID = Record.getGlobalTypeID(Record.readInt());
1287 mergeRedeclarable(ID, Redecl);
1288
1289 ID->TypeParamList = ReadObjCTypeParamList();
1290 if (Record.readInt()) {
1291 // Read the definition.
1292 ID->allocateDefinitionData();
1293
1294 ReadObjCDefinitionData(ID->data());
1295 ObjCInterfaceDecl *Canon = ID->getCanonicalDecl();
1296 if (Canon->Data.getPointer()) {
1297 // If we already have a definition, keep the definition invariant and
1298 // merge the data.
1299 MergeImpl.MergeDefinitionData(Canon, std::move(ID->data()));
1300 ID->Data = Canon->Data;
1301 } else {
1302 // Set the definition data of the canonical declaration, so other
1303 // redeclarations will see it.
1304 ID->getCanonicalDecl()->Data = ID->Data;
1305
1306 // We will rebuild this list lazily.
1307 ID->setIvarList(nullptr);
1308 }
1309
1310 // Note that we have deserialized a definition.
1311 Reader.PendingDefinitions.insert(ID);
1312
1313 // Note that we've loaded this Objective-C class.
1314 Reader.ObjCClassesLoaded.push_back(ID);
1315 } else {
1316 ID->Data = ID->getCanonicalDecl()->Data;
1317 }
1318}
1319
1321 VisitFieldDecl(IVD);
1323 // This field will be built lazily.
1324 IVD->setNextIvar(nullptr);
1325 bool synth = Record.readInt();
1326 IVD->setSynthesize(synth);
1327
1328 // Check ivar redeclaration.
1329 if (IVD->isInvalidDecl())
1330 return;
1331 // Don't check ObjCInterfaceDecl as interfaces are named and mismatches can be
1332 // detected in VisitObjCInterfaceDecl. Here we are looking for redeclarations
1333 // in extensions.
1334 if (isa<ObjCInterfaceDecl>(IVD->getDeclContext()))
1335 return;
1336 ObjCInterfaceDecl *CanonIntf =
1338 IdentifierInfo *II = IVD->getIdentifier();
1339 ObjCIvarDecl *PrevIvar = CanonIntf->lookupInstanceVariable(II);
1340 if (PrevIvar && PrevIvar != IVD) {
1341 auto *ParentExt = dyn_cast<ObjCCategoryDecl>(IVD->getDeclContext());
1342 auto *PrevParentExt =
1343 dyn_cast<ObjCCategoryDecl>(PrevIvar->getDeclContext());
1344 if (ParentExt && PrevParentExt) {
1345 // Postpone diagnostic as we should merge identical extensions from
1346 // different modules.
1347 Reader
1348 .PendingObjCExtensionIvarRedeclarations[std::make_pair(ParentExt,
1349 PrevParentExt)]
1350 .push_back(std::make_pair(IVD, PrevIvar));
1351 } else if (ParentExt || PrevParentExt) {
1352 // Duplicate ivars in extension + implementation are never compatible.
1353 // Compatibility of implementation + implementation should be handled in
1354 // VisitObjCImplementationDecl.
1355 Reader.Diag(IVD->getLocation(), diag::err_duplicate_ivar_declaration)
1356 << II;
1357 Reader.Diag(PrevIvar->getLocation(), diag::note_previous_definition);
1358 }
1359 }
1360}
1361
1362void ASTDeclReader::ReadObjCDefinitionData(
1363 struct ObjCProtocolDecl::DefinitionData &Data) {
1364 unsigned NumProtoRefs = Record.readInt();
1366 ProtoRefs.reserve(NumProtoRefs);
1367 for (unsigned I = 0; I != NumProtoRefs; ++I)
1368 ProtoRefs.push_back(readDeclAs<ObjCProtocolDecl>());
1370 ProtoLocs.reserve(NumProtoRefs);
1371 for (unsigned I = 0; I != NumProtoRefs; ++I)
1372 ProtoLocs.push_back(readSourceLocation());
1373 Data.ReferencedProtocols.set(ProtoRefs.data(), NumProtoRefs,
1374 ProtoLocs.data(), Reader.getContext());
1375 Data.ODRHash = Record.readInt();
1376 Data.HasODRHash = true;
1377}
1378
1380 ObjCProtocolDecl *D, struct ObjCProtocolDecl::DefinitionData &&NewDD) {
1381 struct ObjCProtocolDecl::DefinitionData &DD = D->data();
1382 if (DD.Definition == NewDD.Definition)
1383 return;
1384
1385 Reader.MergedDeclContexts.insert(
1386 std::make_pair(NewDD.Definition, DD.Definition));
1387 Reader.mergeDefinitionVisibility(DD.Definition, NewDD.Definition);
1388
1389 if (D->getODRHash() != NewDD.ODRHash)
1390 Reader.PendingObjCProtocolOdrMergeFailures[DD.Definition].push_back(
1391 {NewDD.Definition, &NewDD});
1392}
1393
1395 RedeclarableResult Redecl = VisitRedeclarable(PD);
1397 mergeRedeclarable(PD, Redecl);
1398
1399 if (Record.readInt()) {
1400 // Read the definition.
1401 PD->allocateDefinitionData();
1402
1403 ReadObjCDefinitionData(PD->data());
1404
1405 ObjCProtocolDecl *Canon = PD->getCanonicalDecl();
1406 if (Canon->Data.getPointer()) {
1407 // If we already have a definition, keep the definition invariant and
1408 // merge the data.
1409 MergeImpl.MergeDefinitionData(Canon, std::move(PD->data()));
1410 PD->Data = Canon->Data;
1411 } else {
1412 // Set the definition data of the canonical declaration, so other
1413 // redeclarations will see it.
1414 PD->getCanonicalDecl()->Data = PD->Data;
1415 }
1416 // Note that we have deserialized a definition.
1417 Reader.PendingDefinitions.insert(PD);
1418 } else {
1419 PD->Data = PD->getCanonicalDecl()->Data;
1420 }
1421}
1422
1424 VisitFieldDecl(FD);
1425}
1426
1429 CD->setCategoryNameLoc(readSourceLocation());
1430 CD->setIvarLBraceLoc(readSourceLocation());
1431 CD->setIvarRBraceLoc(readSourceLocation());
1432
1433 // Note that this category has been deserialized. We do this before
1434 // deserializing the interface declaration, so that it will consider this
1435 /// category.
1436 Reader.CategoriesDeserialized.insert(CD);
1437
1438 CD->ClassInterface = readDeclAs<ObjCInterfaceDecl>();
1439 CD->TypeParamList = ReadObjCTypeParamList();
1440 unsigned NumProtoRefs = Record.readInt();
1442 ProtoRefs.reserve(NumProtoRefs);
1443 for (unsigned I = 0; I != NumProtoRefs; ++I)
1444 ProtoRefs.push_back(readDeclAs<ObjCProtocolDecl>());
1446 ProtoLocs.reserve(NumProtoRefs);
1447 for (unsigned I = 0; I != NumProtoRefs; ++I)
1448 ProtoLocs.push_back(readSourceLocation());
1449 CD->setProtocolList(ProtoRefs.data(), NumProtoRefs, ProtoLocs.data(),
1450 Reader.getContext());
1451
1452 // Protocols in the class extension belong to the class.
1453 if (NumProtoRefs > 0 && CD->ClassInterface && CD->IsClassExtension())
1454 CD->ClassInterface->mergeClassExtensionProtocolList(
1455 (ObjCProtocolDecl *const *)ProtoRefs.data(), NumProtoRefs,
1456 Reader.getContext());
1457}
1458
1460 VisitNamedDecl(CAD);
1461 CAD->setClassInterface(readDeclAs<ObjCInterfaceDecl>());
1462}
1463
1466 D->setAtLoc(readSourceLocation());
1467 D->setLParenLoc(readSourceLocation());
1468 QualType T = Record.readType();
1469 TypeSourceInfo *TSI = readTypeSourceInfo();
1470 D->setType(T, TSI);
1471 D->setPropertyAttributes((ObjCPropertyAttribute::Kind)Record.readInt());
1472 D->setPropertyAttributesAsWritten(
1474 D->setPropertyImplementation(
1476 DeclarationName GetterName = Record.readDeclarationName();
1477 SourceLocation GetterLoc = readSourceLocation();
1478 D->setGetterName(GetterName.getObjCSelector(), GetterLoc);
1479 DeclarationName SetterName = Record.readDeclarationName();
1480 SourceLocation SetterLoc = readSourceLocation();
1481 D->setSetterName(SetterName.getObjCSelector(), SetterLoc);
1482 D->setGetterMethodDecl(readDeclAs<ObjCMethodDecl>());
1483 D->setSetterMethodDecl(readDeclAs<ObjCMethodDecl>());
1484 D->setPropertyIvarDecl(readDeclAs<ObjCIvarDecl>());
1485}
1486
1489 D->setClassInterface(readDeclAs<ObjCInterfaceDecl>());
1490}
1491
1494 D->CategoryNameLoc = readSourceLocation();
1495}
1496
1499 D->setSuperClass(readDeclAs<ObjCInterfaceDecl>());
1500 D->SuperLoc = readSourceLocation();
1501 D->setIvarLBraceLoc(readSourceLocation());
1502 D->setIvarRBraceLoc(readSourceLocation());
1503 D->setHasNonZeroConstructors(Record.readInt());
1504 D->setHasDestructors(Record.readInt());
1505 D->NumIvarInitializers = Record.readInt();
1506 if (D->NumIvarInitializers)
1507 D->IvarInitializers = ReadGlobalOffset();
1508}
1509
1511 VisitDecl(D);
1512 D->setAtLoc(readSourceLocation());
1513 D->setPropertyDecl(readDeclAs<ObjCPropertyDecl>());
1514 D->PropertyIvarDecl = readDeclAs<ObjCIvarDecl>();
1515 D->IvarLoc = readSourceLocation();
1516 D->setGetterMethodDecl(readDeclAs<ObjCMethodDecl>());
1517 D->setSetterMethodDecl(readDeclAs<ObjCMethodDecl>());
1518 D->setGetterCXXConstructor(Record.readExpr());
1519 D->setSetterCXXAssignment(Record.readExpr());
1520}
1521
1524 FD->Mutable = Record.readInt();
1525
1526 unsigned Bits = Record.readInt();
1527 FD->StorageKind = Bits >> 1;
1528 if (FD->StorageKind == FieldDecl::ISK_CapturedVLAType)
1529 FD->CapturedVLAType =
1530 cast<VariableArrayType>(Record.readType().getTypePtr());
1531 else if (Bits & 1)
1532 FD->setBitWidth(Record.readExpr());
1533
1534 if (!FD->getDeclName() ||
1535 FD->isPlaceholderVar(Reader.getContext().getLangOpts())) {
1536 if (auto *Tmpl = readDeclAs<FieldDecl>())
1538 }
1539 mergeMergeable(FD);
1540}
1541
1544 PD->GetterId = Record.readIdentifier();
1545 PD->SetterId = Record.readIdentifier();
1546}
1547
1550 D->PartVal.Part1 = Record.readInt();
1551 D->PartVal.Part2 = Record.readInt();
1552 D->PartVal.Part3 = Record.readInt();
1553 for (auto &C : D->PartVal.Part4And5)
1554 C = Record.readInt();
1555
1556 // Add this GUID to the AST context's lookup structure, and merge if needed.
1557 if (MSGuidDecl *Existing = Reader.getContext().MSGuidDecls.GetOrInsertNode(D))
1558 Reader.getContext().setPrimaryMergedDecl(D, Existing->getCanonicalDecl());
1559}
1560
1564 D->Value = Record.readAPValue();
1565
1566 // Add this to the AST context's lookup structure, and merge if needed.
1567 if (UnnamedGlobalConstantDecl *Existing =
1568 Reader.getContext().UnnamedGlobalConstantDecls.GetOrInsertNode(D))
1569 Reader.getContext().setPrimaryMergedDecl(D, Existing->getCanonicalDecl());
1570}
1571
1574 D->Value = Record.readAPValue();
1575
1576 // Add this template parameter object to the AST context's lookup structure,
1577 // and merge if needed.
1578 if (TemplateParamObjectDecl *Existing =
1579 Reader.getContext().TemplateParamObjectDecls.GetOrInsertNode(D))
1580 Reader.getContext().setPrimaryMergedDecl(D, Existing->getCanonicalDecl());
1581}
1582
1584 VisitValueDecl(FD);
1585
1586 FD->ChainingSize = Record.readInt();
1587 assert(FD->ChainingSize >= 2 && "Anonymous chaining must be >= 2");
1588 FD->Chaining = new (Reader.getContext())NamedDecl*[FD->ChainingSize];
1589
1590 for (unsigned I = 0; I != FD->ChainingSize; ++I)
1591 FD->Chaining[I] = readDeclAs<NamedDecl>();
1592
1593 mergeMergeable(FD);
1594}
1595
1597 RedeclarableResult Redecl = VisitRedeclarable(VD);
1599
1600 BitsUnpacker VarDeclBits(Record.readInt());
1601 auto VarLinkage = Linkage(VarDeclBits.getNextBits(/*Width=*/3));
1602 bool DefGeneratedInModule = VarDeclBits.getNextBit();
1603 VD->VarDeclBits.SClass = (StorageClass)VarDeclBits.getNextBits(/*Width=*/3);
1604 VD->VarDeclBits.TSCSpec = VarDeclBits.getNextBits(/*Width=*/2);
1605 VD->VarDeclBits.InitStyle = VarDeclBits.getNextBits(/*Width=*/2);
1606 VD->VarDeclBits.ARCPseudoStrong = VarDeclBits.getNextBit();
1607 bool HasDeducedType = false;
1608 if (!isa<ParmVarDecl>(VD)) {
1609 VD->NonParmVarDeclBits.IsThisDeclarationADemotedDefinition =
1610 VarDeclBits.getNextBit();
1611 VD->NonParmVarDeclBits.ExceptionVar = VarDeclBits.getNextBit();
1612 VD->NonParmVarDeclBits.NRVOVariable = VarDeclBits.getNextBit();
1613 VD->NonParmVarDeclBits.CXXForRangeDecl = VarDeclBits.getNextBit();
1614
1615 VD->NonParmVarDeclBits.IsInline = VarDeclBits.getNextBit();
1616 VD->NonParmVarDeclBits.IsInlineSpecified = VarDeclBits.getNextBit();
1617 VD->NonParmVarDeclBits.IsConstexpr = VarDeclBits.getNextBit();
1618 VD->NonParmVarDeclBits.IsInitCapture = VarDeclBits.getNextBit();
1619 VD->NonParmVarDeclBits.PreviousDeclInSameBlockScope =
1620 VarDeclBits.getNextBit();
1621
1622 VD->NonParmVarDeclBits.EscapingByref = VarDeclBits.getNextBit();
1623 HasDeducedType = VarDeclBits.getNextBit();
1624 VD->NonParmVarDeclBits.ImplicitParamKind =
1625 VarDeclBits.getNextBits(/*Width*/ 3);
1626
1627 VD->NonParmVarDeclBits.ObjCForDecl = VarDeclBits.getNextBit();
1628 }
1629
1630 // If this variable has a deduced type, defer reading that type until we are
1631 // done deserializing this variable, because the type might refer back to the
1632 // variable.
1633 if (HasDeducedType)
1634 Reader.PendingDeducedVarTypes.push_back({VD, DeferredTypeID});
1635 else
1636 VD->setType(Reader.GetType(DeferredTypeID));
1637 DeferredTypeID = 0;
1638
1639 VD->setCachedLinkage(VarLinkage);
1640
1641 // Reconstruct the one piece of the IdentifierNamespace that we need.
1642 if (VD->getStorageClass() == SC_Extern && VarLinkage != Linkage::None &&
1644 VD->setLocalExternDecl();
1645
1646 if (DefGeneratedInModule) {
1647 Reader.DefinitionSource[VD] =
1648 Loc.F->Kind == ModuleKind::MK_MainFile ||
1649 Reader.getContext().getLangOpts().BuildingPCHWithObjectFile;
1650 }
1651
1652 if (VD->hasAttr<BlocksAttr>()) {
1653 Expr *CopyExpr = Record.readExpr();
1654 if (CopyExpr)
1655 Reader.getContext().setBlockVarCopyInit(VD, CopyExpr, Record.readInt());
1656 }
1657
1658 enum VarKind {
1659 VarNotTemplate = 0, VarTemplate, StaticDataMemberSpecialization
1660 };
1661 switch ((VarKind)Record.readInt()) {
1662 case VarNotTemplate:
1663 // Only true variables (not parameters or implicit parameters) can be
1664 // merged; the other kinds are not really redeclarable at all.
1665 if (!isa<ParmVarDecl>(VD) && !isa<ImplicitParamDecl>(VD) &&
1666 !isa<VarTemplateSpecializationDecl>(VD))
1667 mergeRedeclarable(VD, Redecl);
1668 break;
1669 case VarTemplate:
1670 // Merged when we merge the template.
1671 VD->setDescribedVarTemplate(readDeclAs<VarTemplateDecl>());
1672 break;
1673 case StaticDataMemberSpecialization: { // HasMemberSpecializationInfo.
1674 auto *Tmpl = readDeclAs<VarDecl>();
1675 auto TSK = (TemplateSpecializationKind)Record.readInt();
1676 SourceLocation POI = readSourceLocation();
1677 Reader.getContext().setInstantiatedFromStaticDataMember(VD, Tmpl, TSK,POI);
1678 mergeRedeclarable(VD, Redecl);
1679 break;
1680 }
1681 }
1682
1683 return Redecl;
1684}
1685
1687 if (uint64_t Val = Record.readInt()) {
1688 EvaluatedStmt *Eval = VD->ensureEvaluatedStmt();
1689 Eval->HasConstantInitialization = (Val & 2) != 0;
1690 Eval->HasConstantDestruction = (Val & 4) != 0;
1691 Eval->WasEvaluated = (Val & 8) != 0;
1692 if (Eval->WasEvaluated) {
1693 Eval->Evaluated = Record.readAPValue();
1694 if (Eval->Evaluated.needsCleanup())
1695 Reader.getContext().addDestruction(&Eval->Evaluated);
1696 }
1697
1698 // Store the offset of the initializer. Don't deserialize it yet: it might
1699 // not be needed, and might refer back to the variable, for example if it
1700 // contains a lambda.
1701 Eval->Value = GetCurrentCursorOffset();
1702 }
1703}
1704
1706 VisitVarDecl(PD);
1707}
1708
1710 VisitVarDecl(PD);
1711
1712 unsigned scopeIndex = Record.readInt();
1713 BitsUnpacker ParmVarDeclBits(Record.readInt());
1714 unsigned isObjCMethodParam = ParmVarDeclBits.getNextBit();
1715 unsigned scopeDepth = ParmVarDeclBits.getNextBits(/*Width=*/7);
1716 unsigned declQualifier = ParmVarDeclBits.getNextBits(/*Width=*/7);
1717 if (isObjCMethodParam) {
1718 assert(scopeDepth == 0);
1719 PD->setObjCMethodScopeInfo(scopeIndex);
1720 PD->ParmVarDeclBits.ScopeDepthOrObjCQuals = declQualifier;
1721 } else {
1722 PD->setScopeInfo(scopeDepth, scopeIndex);
1723 }
1724 PD->ParmVarDeclBits.IsKNRPromoted = ParmVarDeclBits.getNextBit();
1725
1726 PD->ParmVarDeclBits.HasInheritedDefaultArg = ParmVarDeclBits.getNextBit();
1727 if (ParmVarDeclBits.getNextBit()) // hasUninstantiatedDefaultArg.
1728 PD->setUninstantiatedDefaultArg(Record.readExpr());
1729
1730 if (ParmVarDeclBits.getNextBit()) // Valid explicit object parameter
1731 PD->ExplicitObjectParameterIntroducerLoc = Record.readSourceLocation();
1732
1733 // FIXME: If this is a redeclaration of a function from another module, handle
1734 // inheritance of default arguments.
1735}
1736
1738 VisitVarDecl(DD);
1739 auto **BDs = DD->getTrailingObjects<BindingDecl *>();
1740 for (unsigned I = 0; I != DD->NumBindings; ++I) {
1741 BDs[I] = readDeclAs<BindingDecl>();
1742 BDs[I]->setDecomposedDecl(DD);
1743 }
1744}
1745
1747 VisitValueDecl(BD);
1748 BD->Binding = Record.readExpr();
1749}
1750
1752 VisitDecl(AD);
1753 AD->setAsmString(cast<StringLiteral>(Record.readExpr()));
1754 AD->setRParenLoc(readSourceLocation());
1755}
1756
1758 VisitDecl(D);
1759 D->Statement = Record.readStmt();
1760}
1761
1763 VisitDecl(BD);
1764 BD->setBody(cast_or_null<CompoundStmt>(Record.readStmt()));
1765 BD->setSignatureAsWritten(readTypeSourceInfo());
1766 unsigned NumParams = Record.readInt();
1768 Params.reserve(NumParams);
1769 for (unsigned I = 0; I != NumParams; ++I)
1770 Params.push_back(readDeclAs<ParmVarDecl>());
1771 BD->setParams(Params);
1772
1773 BD->setIsVariadic(Record.readInt());
1774 BD->setBlockMissingReturnType(Record.readInt());
1775 BD->setIsConversionFromLambda(Record.readInt());
1776 BD->setDoesNotEscape(Record.readInt());
1777 BD->setCanAvoidCopyToHeap(Record.readInt());
1778
1779 bool capturesCXXThis = Record.readInt();
1780 unsigned numCaptures = Record.readInt();
1782 captures.reserve(numCaptures);
1783 for (unsigned i = 0; i != numCaptures; ++i) {
1784 auto *decl = readDeclAs<VarDecl>();
1785 unsigned flags = Record.readInt();
1786 bool byRef = (flags & 1);
1787 bool nested = (flags & 2);
1788 Expr *copyExpr = ((flags & 4) ? Record.readExpr() : nullptr);
1789
1790 captures.push_back(BlockDecl::Capture(decl, byRef, nested, copyExpr));
1791 }
1792 BD->setCaptures(Reader.getContext(), captures, capturesCXXThis);
1793}
1794
1796 VisitDecl(CD);
1797 unsigned ContextParamPos = Record.readInt();
1798 CD->setNothrow(Record.readInt() != 0);
1799 // Body is set by VisitCapturedStmt.
1800 for (unsigned I = 0; I < CD->NumParams; ++I) {
1801 if (I != ContextParamPos)
1802 CD->setParam(I, readDeclAs<ImplicitParamDecl>());
1803 else
1804 CD->setContextParam(I, readDeclAs<ImplicitParamDecl>());
1805 }
1806}
1807
1809 VisitDecl(D);
1810 D->setLanguage(static_cast<LinkageSpecLanguageIDs>(Record.readInt()));
1811 D->setExternLoc(readSourceLocation());
1812 D->setRBraceLoc(readSourceLocation());
1813}
1814
1816 VisitDecl(D);
1817 D->RBraceLoc = readSourceLocation();
1818}
1819
1822 D->setLocStart(readSourceLocation());
1823}
1824
1826 RedeclarableResult Redecl = VisitRedeclarable(D);
1828
1829 BitsUnpacker NamespaceDeclBits(Record.readInt());
1830 D->setInline(NamespaceDeclBits.getNextBit());
1831 D->setNested(NamespaceDeclBits.getNextBit());
1832 D->LocStart = readSourceLocation();
1833 D->RBraceLoc = readSourceLocation();
1834
1835 // Defer loading the anonymous namespace until we've finished merging
1836 // this namespace; loading it might load a later declaration of the
1837 // same namespace, and we have an invariant that older declarations
1838 // get merged before newer ones try to merge.
1839 GlobalDeclID AnonNamespace;
1840 if (Redecl.getFirstID() == ThisDeclID)
1841 AnonNamespace = readDeclID();
1842
1843 mergeRedeclarable(D, Redecl);
1844
1845 if (AnonNamespace.isValid()) {
1846 // Each module has its own anonymous namespace, which is disjoint from
1847 // any other module's anonymous namespaces, so don't attach the anonymous
1848 // namespace at all.
1849 auto *Anon = cast<NamespaceDecl>(Reader.GetDecl(AnonNamespace));
1850 if (!Record.isModule())
1851 D->setAnonymousNamespace(Anon);
1852 }
1853}
1854
1858 D->IsCBuffer = Record.readBool();
1859 D->KwLoc = readSourceLocation();
1860 D->LBraceLoc = readSourceLocation();
1861 D->RBraceLoc = readSourceLocation();
1862}
1863
1865 RedeclarableResult Redecl = VisitRedeclarable(D);
1867 D->NamespaceLoc = readSourceLocation();
1868 D->IdentLoc = readSourceLocation();
1869 D->QualifierLoc = Record.readNestedNameSpecifierLoc();
1870 D->Namespace = readDeclAs<NamedDecl>();
1871 mergeRedeclarable(D, Redecl);
1872}
1873
1876 D->setUsingLoc(readSourceLocation());
1877 D->QualifierLoc = Record.readNestedNameSpecifierLoc();
1878 D->DNLoc = Record.readDeclarationNameLoc(D->getDeclName());
1879 D->FirstUsingShadow.setPointer(readDeclAs<UsingShadowDecl>());
1880 D->setTypename(Record.readInt());
1881 if (auto *Pattern = readDeclAs<NamedDecl>())
1882 Reader.getContext().setInstantiatedFromUsingDecl(D, Pattern);
1884}
1885
1888 D->setUsingLoc(readSourceLocation());
1889 D->setEnumLoc(readSourceLocation());
1890 D->setEnumType(Record.readTypeSourceInfo());
1891 D->FirstUsingShadow.setPointer(readDeclAs<UsingShadowDecl>());
1892 if (auto *Pattern = readDeclAs<UsingEnumDecl>())
1895}
1896
1899 D->InstantiatedFrom = readDeclAs<NamedDecl>();
1900 auto **Expansions = D->getTrailingObjects<NamedDecl *>();
1901 for (unsigned I = 0; I != D->NumExpansions; ++I)
1902 Expansions[I] = readDeclAs<NamedDecl>();
1904}
1905
1907 RedeclarableResult Redecl = VisitRedeclarable(D);
1909 D->Underlying = readDeclAs<NamedDecl>();
1910 D->IdentifierNamespace = Record.readInt();
1911 D->UsingOrNextShadow = readDeclAs<NamedDecl>();
1912 auto *Pattern = readDeclAs<UsingShadowDecl>();
1913 if (Pattern)
1915 mergeRedeclarable(D, Redecl);
1916}
1917
1921 D->NominatedBaseClassShadowDecl = readDeclAs<ConstructorUsingShadowDecl>();
1922 D->ConstructedBaseClassShadowDecl = readDeclAs<ConstructorUsingShadowDecl>();
1923 D->IsVirtual = Record.readInt();
1924}
1925
1928 D->UsingLoc = readSourceLocation();
1929 D->NamespaceLoc = readSourceLocation();
1930 D->QualifierLoc = Record.readNestedNameSpecifierLoc();
1931 D->NominatedNamespace = readDeclAs<NamedDecl>();
1932 D->CommonAncestor = readDeclAs<DeclContext>();
1933}
1934
1937 D->setUsingLoc(readSourceLocation());
1938 D->QualifierLoc = Record.readNestedNameSpecifierLoc();
1939 D->DNLoc = Record.readDeclarationNameLoc(D->getDeclName());
1940 D->EllipsisLoc = readSourceLocation();
1942}
1943
1947 D->TypenameLocation = readSourceLocation();
1948 D->QualifierLoc = Record.readNestedNameSpecifierLoc();
1949 D->EllipsisLoc = readSourceLocation();
1951}
1952
1956}
1957
1958void ASTDeclReader::ReadCXXDefinitionData(
1959 struct CXXRecordDecl::DefinitionData &Data, const CXXRecordDecl *D,
1960 Decl *LambdaContext, unsigned IndexInLambdaContext) {
1961
1962 BitsUnpacker CXXRecordDeclBits = Record.readInt();
1963
1964#define FIELD(Name, Width, Merge) \
1965 if (!CXXRecordDeclBits.canGetNextNBits(Width)) \
1966 CXXRecordDeclBits.updateValue(Record.readInt()); \
1967 Data.Name = CXXRecordDeclBits.getNextBits(Width);
1968
1969#include "clang/AST/CXXRecordDeclDefinitionBits.def"
1970#undef FIELD
1971
1972 // Note: the caller has deserialized the IsLambda bit already.
1973 Data.ODRHash = Record.readInt();
1974 Data.HasODRHash = true;
1975
1976 if (Record.readInt()) {
1977 Reader.DefinitionSource[D] =
1978 Loc.F->Kind == ModuleKind::MK_MainFile ||
1979 Reader.getContext().getLangOpts().BuildingPCHWithObjectFile;
1980 }
1981
1982 Record.readUnresolvedSet(Data.Conversions);
1983 Data.ComputedVisibleConversions = Record.readInt();
1984 if (Data.ComputedVisibleConversions)
1985 Record.readUnresolvedSet(Data.VisibleConversions);
1986 assert(Data.Definition && "Data.Definition should be already set!");
1987
1988 if (!Data.IsLambda) {
1989 assert(!LambdaContext && !IndexInLambdaContext &&
1990 "given lambda context for non-lambda");
1991
1992 Data.NumBases = Record.readInt();
1993 if (Data.NumBases)
1994 Data.Bases = ReadGlobalOffset();
1995
1996 Data.NumVBases = Record.readInt();
1997 if (Data.NumVBases)
1998 Data.VBases = ReadGlobalOffset();
1999
2000 Data.FirstFriend = readDeclID().getRawValue();
2001 } else {
2002 using Capture = LambdaCapture;
2003
2004 auto &Lambda = static_cast<CXXRecordDecl::LambdaDefinitionData &>(Data);
2005
2006 BitsUnpacker LambdaBits(Record.readInt());
2007 Lambda.DependencyKind = LambdaBits.getNextBits(/*Width=*/2);
2008 Lambda.IsGenericLambda = LambdaBits.getNextBit();
2009 Lambda.CaptureDefault = LambdaBits.getNextBits(/*Width=*/2);
2010 Lambda.NumCaptures = LambdaBits.getNextBits(/*Width=*/15);
2011 Lambda.HasKnownInternalLinkage = LambdaBits.getNextBit();
2012
2013 Lambda.NumExplicitCaptures = Record.readInt();
2014 Lambda.ManglingNumber = Record.readInt();
2015 if (unsigned DeviceManglingNumber = Record.readInt())
2016 Reader.getContext().DeviceLambdaManglingNumbers[D] = DeviceManglingNumber;
2017 Lambda.IndexInContext = IndexInLambdaContext;
2018 Lambda.ContextDecl = LambdaContext;
2019 Capture *ToCapture = nullptr;
2020 if (Lambda.NumCaptures) {
2021 ToCapture = (Capture *)Reader.getContext().Allocate(sizeof(Capture) *
2022 Lambda.NumCaptures);
2023 Lambda.AddCaptureList(Reader.getContext(), ToCapture);
2024 }
2025 Lambda.MethodTyInfo = readTypeSourceInfo();
2026 for (unsigned I = 0, N = Lambda.NumCaptures; I != N; ++I) {
2027 SourceLocation Loc = readSourceLocation();
2028 BitsUnpacker CaptureBits(Record.readInt());
2029 bool IsImplicit = CaptureBits.getNextBit();
2030 auto Kind =
2031 static_cast<LambdaCaptureKind>(CaptureBits.getNextBits(/*Width=*/3));
2032 switch (Kind) {
2033 case LCK_StarThis:
2034 case LCK_This:
2035 case LCK_VLAType:
2036 new (ToCapture)
2037 Capture(Loc, IsImplicit, Kind, nullptr, SourceLocation());
2038 ToCapture++;
2039 break;
2040 case LCK_ByCopy:
2041 case LCK_ByRef:
2042 auto *Var = readDeclAs<ValueDecl>();
2043 SourceLocation EllipsisLoc = readSourceLocation();
2044 new (ToCapture) Capture(Loc, IsImplicit, Kind, Var, EllipsisLoc);
2045 ToCapture++;
2046 break;
2047 }
2048 }
2049 }
2050}
2051
2053 CXXRecordDecl *D, struct CXXRecordDecl::DefinitionData &&MergeDD) {
2054 assert(D->DefinitionData &&
2055 "merging class definition into non-definition");
2056 auto &DD = *D->DefinitionData;
2057
2058 if (DD.Definition != MergeDD.Definition) {
2059 // Track that we merged the definitions.
2060 Reader.MergedDeclContexts.insert(std::make_pair(MergeDD.Definition,
2061 DD.Definition));
2062 Reader.PendingDefinitions.erase(MergeDD.Definition);
2063 MergeDD.Definition->demoteThisDefinitionToDeclaration();
2064 Reader.mergeDefinitionVisibility(DD.Definition, MergeDD.Definition);
2065 assert(!Reader.Lookups.contains(MergeDD.Definition) &&
2066 "already loaded pending lookups for merged definition");
2067 }
2068
2069 auto PFDI = Reader.PendingFakeDefinitionData.find(&DD);
2070 if (PFDI != Reader.PendingFakeDefinitionData.end() &&
2071 PFDI->second == ASTReader::PendingFakeDefinitionKind::Fake) {
2072 // We faked up this definition data because we found a class for which we'd
2073 // not yet loaded the definition. Replace it with the real thing now.
2074 assert(!DD.IsLambda && !MergeDD.IsLambda && "faked up lambda definition?");
2075 PFDI->second = ASTReader::PendingFakeDefinitionKind::FakeLoaded;
2076
2077 // Don't change which declaration is the definition; that is required
2078 // to be invariant once we select it.
2079 auto *Def = DD.Definition;
2080 DD = std::move(MergeDD);
2081 DD.Definition = Def;
2082 return;
2083 }
2084
2085 bool DetectedOdrViolation = false;
2086
2087 #define FIELD(Name, Width, Merge) Merge(Name)
2088 #define MERGE_OR(Field) DD.Field |= MergeDD.Field;
2089 #define NO_MERGE(Field) \
2090 DetectedOdrViolation |= DD.Field != MergeDD.Field; \
2091 MERGE_OR(Field)
2092 #include "clang/AST/CXXRecordDeclDefinitionBits.def"
2093 NO_MERGE(IsLambda)
2094 #undef NO_MERGE
2095 #undef MERGE_OR
2096
2097 if (DD.NumBases != MergeDD.NumBases || DD.NumVBases != MergeDD.NumVBases)
2098 DetectedOdrViolation = true;
2099 // FIXME: Issue a diagnostic if the base classes don't match when we come
2100 // to lazily load them.
2101
2102 // FIXME: Issue a diagnostic if the list of conversion functions doesn't
2103 // match when we come to lazily load them.
2104 if (MergeDD.ComputedVisibleConversions && !DD.ComputedVisibleConversions) {
2105 DD.VisibleConversions = std::move(MergeDD.VisibleConversions);
2106 DD.ComputedVisibleConversions = true;
2107 }
2108
2109 // FIXME: Issue a diagnostic if FirstFriend doesn't match when we come to
2110 // lazily load it.
2111
2112 if (DD.IsLambda) {
2113 auto &Lambda1 = static_cast<CXXRecordDecl::LambdaDefinitionData &>(DD);
2114 auto &Lambda2 = static_cast<CXXRecordDecl::LambdaDefinitionData &>(MergeDD);
2115 DetectedOdrViolation |= Lambda1.DependencyKind != Lambda2.DependencyKind;
2116 DetectedOdrViolation |= Lambda1.IsGenericLambda != Lambda2.IsGenericLambda;
2117 DetectedOdrViolation |= Lambda1.CaptureDefault != Lambda2.CaptureDefault;
2118 DetectedOdrViolation |= Lambda1.NumCaptures != Lambda2.NumCaptures;
2119 DetectedOdrViolation |=
2120 Lambda1.NumExplicitCaptures != Lambda2.NumExplicitCaptures;
2121 DetectedOdrViolation |=
2122 Lambda1.HasKnownInternalLinkage != Lambda2.HasKnownInternalLinkage;
2123 DetectedOdrViolation |= Lambda1.ManglingNumber != Lambda2.ManglingNumber;
2124
2125 if (Lambda1.NumCaptures && Lambda1.NumCaptures == Lambda2.NumCaptures) {
2126 for (unsigned I = 0, N = Lambda1.NumCaptures; I != N; ++I) {
2127 LambdaCapture &Cap1 = Lambda1.Captures.front()[I];
2128 LambdaCapture &Cap2 = Lambda2.Captures.front()[I];
2129 DetectedOdrViolation |= Cap1.getCaptureKind() != Cap2.getCaptureKind();
2130 }
2131 Lambda1.AddCaptureList(Reader.getContext(), Lambda2.Captures.front());
2132 }
2133 }
2134
2135 // We don't want to check ODR for decls in the global module fragment.
2136 if (shouldSkipCheckingODR(MergeDD.Definition) || shouldSkipCheckingODR(D))
2137 return;
2138
2139 if (D->getODRHash() != MergeDD.ODRHash) {
2140 DetectedOdrViolation = true;
2141 }
2142
2143 if (DetectedOdrViolation)
2144 Reader.PendingOdrMergeFailures[DD.Definition].push_back(
2145 {MergeDD.Definition, &MergeDD});
2146}
2147
2148void ASTDeclReader::ReadCXXRecordDefinition(CXXRecordDecl *D, bool Update,
2149 Decl *LambdaContext,
2150 unsigned IndexInLambdaContext) {
2151 struct CXXRecordDecl::DefinitionData *DD;
2152 ASTContext &C = Reader.getContext();
2153
2154 // Determine whether this is a lambda closure type, so that we can
2155 // allocate the appropriate DefinitionData structure.
2156 bool IsLambda = Record.readInt();
2157 assert(!(IsLambda && Update) &&
2158 "lambda definition should not be added by update record");
2159 if (IsLambda)
2160 DD = new (C) CXXRecordDecl::LambdaDefinitionData(
2161 D, nullptr, CXXRecordDecl::LDK_Unknown, false, LCD_None);
2162 else
2163 DD = new (C) struct CXXRecordDecl::DefinitionData(D);
2164
2165 CXXRecordDecl *Canon = D->getCanonicalDecl();
2166 // Set decl definition data before reading it, so that during deserialization
2167 // when we read CXXRecordDecl, it already has definition data and we don't
2168 // set fake one.
2169 if (!Canon->DefinitionData)
2170 Canon->DefinitionData = DD;
2171 D->DefinitionData = Canon->DefinitionData;
2172 ReadCXXDefinitionData(*DD, D, LambdaContext, IndexInLambdaContext);
2173
2174 // Mark this declaration as being a definition.
2175 D->setCompleteDefinition(true);
2176
2177 // We might already have a different definition for this record. This can
2178 // happen either because we're reading an update record, or because we've
2179 // already done some merging. Either way, just merge into it.
2180 if (Canon->DefinitionData != DD) {
2181 MergeImpl.MergeDefinitionData(Canon, std::move(*DD));
2182 return;
2183 }
2184
2185 // If this is not the first declaration or is an update record, we can have
2186 // other redeclarations already. Make a note that we need to propagate the
2187 // DefinitionData pointer onto them.
2188 if (Update || Canon != D)
2189 Reader.PendingDefinitions.insert(D);
2190}
2191
2193 RedeclarableResult Redecl = VisitRecordDeclImpl(D);
2194
2195 ASTContext &C = Reader.getContext();
2196
2197 enum CXXRecKind {
2198 CXXRecNotTemplate = 0,
2199 CXXRecTemplate,
2200 CXXRecMemberSpecialization,
2201 CXXLambda
2202 };
2203
2204 Decl *LambdaContext = nullptr;
2205 unsigned IndexInLambdaContext = 0;
2206
2207 switch ((CXXRecKind)Record.readInt()) {
2208 case CXXRecNotTemplate:
2209 // Merged when we merge the folding set entry in the primary template.
2210 if (!isa<ClassTemplateSpecializationDecl>(D))
2211 mergeRedeclarable(D, Redecl);
2212 break;
2213 case CXXRecTemplate: {
2214 // Merged when we merge the template.
2215 auto *Template = readDeclAs<ClassTemplateDecl>();
2216 D->TemplateOrInstantiation = Template;
2217 if (!Template->getTemplatedDecl()) {
2218 // We've not actually loaded the ClassTemplateDecl yet, because we're
2219 // currently being loaded as its pattern. Rely on it to set up our
2220 // TypeForDecl (see VisitClassTemplateDecl).
2221 //
2222 // Beware: we do not yet know our canonical declaration, and may still
2223 // get merged once the surrounding class template has got off the ground.
2224 DeferredTypeID = 0;
2225 }
2226 break;
2227 }
2228 case CXXRecMemberSpecialization: {
2229 auto *RD = readDeclAs<CXXRecordDecl>();
2230 auto TSK = (TemplateSpecializationKind)Record.readInt();
2231 SourceLocation POI = readSourceLocation();
2233 MSI->setPointOfInstantiation(POI);
2234 D->TemplateOrInstantiation = MSI;
2235 mergeRedeclarable(D, Redecl);
2236 break;
2237 }
2238 case CXXLambda: {
2239 LambdaContext = readDecl();
2240 if (LambdaContext)
2241 IndexInLambdaContext = Record.readInt();
2242 if (LambdaContext)
2243 MergeImpl.mergeLambda(D, Redecl, *LambdaContext, IndexInLambdaContext);
2244 else
2245 // If we don't have a mangling context, treat this like any other
2246 // declaration.
2247 mergeRedeclarable(D, Redecl);
2248 break;
2249 }
2250 }
2251
2252 bool WasDefinition = Record.readInt();
2253 if (WasDefinition)
2254 ReadCXXRecordDefinition(D, /*Update=*/false, LambdaContext,
2255 IndexInLambdaContext);
2256 else
2257 // Propagate DefinitionData pointer from the canonical declaration.
2258 D->DefinitionData = D->getCanonicalDecl()->DefinitionData;
2259
2260 // Lazily load the key function to avoid deserializing every method so we can
2261 // compute it.
2262 if (WasDefinition) {
2263 GlobalDeclID KeyFn = readDeclID();
2264 if (KeyFn.isValid() && D->isCompleteDefinition())
2265 // FIXME: This is wrong for the ARM ABI, where some other module may have
2266 // made this function no longer be a key function. We need an update
2267 // record or similar for that case.
2268 C.KeyFunctions[D] = KeyFn.getRawValue();
2269 }
2270
2271 return Redecl;
2272}
2273
2275 D->setExplicitSpecifier(Record.readExplicitSpec());
2276 D->Ctor = readDeclAs<CXXConstructorDecl>();
2278 D->setDeductionCandidateKind(
2279 static_cast<DeductionCandidate>(Record.readInt()));
2280}
2281
2284
2285 unsigned NumOverridenMethods = Record.readInt();
2286 if (D->isCanonicalDecl()) {
2287 while (NumOverridenMethods--) {
2288 // Avoid invariant checking of CXXMethodDecl::addOverriddenMethod,
2289 // MD may be initializing.
2290 if (auto *MD = readDeclAs<CXXMethodDecl>())
2292 }
2293 } else {
2294 // We don't care about which declarations this used to override; we get
2295 // the relevant information from the canonical declaration.
2296 Record.skipInts(NumOverridenMethods);
2297 }
2298}
2299
2301 // We need the inherited constructor information to merge the declaration,
2302 // so we have to read it before we call VisitCXXMethodDecl.
2303 D->setExplicitSpecifier(Record.readExplicitSpec());
2304 if (D->isInheritingConstructor()) {
2305 auto *Shadow = readDeclAs<ConstructorUsingShadowDecl>();
2306 auto *Ctor = readDeclAs<CXXConstructorDecl>();
2307 *D->getTrailingObjects<InheritedConstructor>() =
2308 InheritedConstructor(Shadow, Ctor);
2309 }
2310
2312}
2313
2316
2317 if (auto *OperatorDelete = readDeclAs<FunctionDecl>()) {
2319 auto *ThisArg = Record.readExpr();
2320 // FIXME: Check consistency if we have an old and new operator delete.
2321 if (!Canon->OperatorDelete) {
2322 Canon->OperatorDelete = OperatorDelete;
2323 Canon->OperatorDeleteThisArg = ThisArg;
2324 }
2325 }
2326}
2327
2329 D->setExplicitSpecifier(Record.readExplicitSpec());
2331}
2332
2334 VisitDecl(D);
2335 D->ImportedModule = readModule();
2336 D->setImportComplete(Record.readInt());
2337 auto *StoredLocs = D->getTrailingObjects<SourceLocation>();
2338 for (unsigned I = 0, N = Record.back(); I != N; ++I)
2339 StoredLocs[I] = readSourceLocation();
2340 Record.skipInts(1); // The number of stored source locations.
2341}
2342
2344 VisitDecl(D);
2345 D->setColonLoc(readSourceLocation());
2346}
2347
2349 VisitDecl(D);
2350 if (Record.readInt()) // hasFriendDecl
2351 D->Friend = readDeclAs<NamedDecl>();
2352 else
2353 D->Friend = readTypeSourceInfo();
2354 for (unsigned i = 0; i != D->NumTPLists; ++i)
2355 D->getTrailingObjects<TemplateParameterList *>()[i] =
2356 Record.readTemplateParameterList();
2357 D->NextFriend = readDeclID().getRawValue();
2358 D->UnsupportedFriend = (Record.readInt() != 0);
2359 D->FriendLoc = readSourceLocation();
2360 D->EllipsisLoc = readSourceLocation();
2361}
2362
2364 VisitDecl(D);
2365 unsigned NumParams = Record.readInt();
2366 D->NumParams = NumParams;
2367 D->Params = new (Reader.getContext()) TemplateParameterList *[NumParams];
2368 for (unsigned i = 0; i != NumParams; ++i)
2369 D->Params[i] = Record.readTemplateParameterList();
2370 if (Record.readInt()) // HasFriendDecl
2371 D->Friend = readDeclAs<NamedDecl>();
2372 else
2373 D->Friend = readTypeSourceInfo();
2374 D->FriendLoc = readSourceLocation();
2375}
2376
2379
2380 assert(!D->TemplateParams && "TemplateParams already set!");
2381 D->TemplateParams = Record.readTemplateParameterList();
2382 D->init(readDeclAs<NamedDecl>());
2383}
2384
2387 D->ConstraintExpr = Record.readExpr();
2389}
2390
2393 // The size of the template list was read during creation of the Decl, so we
2394 // don't have to re-read it here.
2395 VisitDecl(D);
2397 for (unsigned I = 0; I < D->NumTemplateArgs; ++I)
2398 Args.push_back(Record.readTemplateArgument(/*Canonicalize=*/true));
2399 D->setTemplateArguments(Args);
2400}
2401
2403}
2404
2406 llvm::BitstreamCursor &DeclsCursor,
2407 bool IsPartial) {
2408 uint64_t Offset = ReadLocalOffset();
2409 bool Failed =
2410 Reader.ReadSpecializations(M, DeclsCursor, Offset, D, IsPartial);
2411 (void)Failed;
2412 assert(!Failed);
2413}
2414
2415RedeclarableResult
2417 RedeclarableResult Redecl = VisitRedeclarable(D);
2418
2419 // Make sure we've allocated the Common pointer first. We do this before
2420 // VisitTemplateDecl so that getCommonPtr() can be used during initialization.
2422 if (!CanonD->Common) {
2423 CanonD->Common = CanonD->newCommon(Reader.getContext());
2424 Reader.PendingDefinitions.insert(CanonD);
2425 }
2426 D->Common = CanonD->Common;
2427
2428 // If this is the first declaration of the template, fill in the information
2429 // for the 'common' pointer.
2430 if (ThisDeclID == Redecl.getFirstID()) {
2431 if (auto *RTD = readDeclAs<RedeclarableTemplateDecl>()) {
2432 assert(RTD->getKind() == D->getKind() &&
2433 "InstantiatedFromMemberTemplate kind mismatch");
2434 D->setInstantiatedFromMemberTemplate(RTD);
2435 if (Record.readInt())
2436 D->setMemberSpecialization();
2437 }
2438 }
2439
2441 D->IdentifierNamespace = Record.readInt();
2442
2443 return Redecl;
2444}
2445
2447 RedeclarableResult Redecl = VisitRedeclarableTemplateDecl(D);
2449
2450 if (ThisDeclID == Redecl.getFirstID()) {
2451 // This ClassTemplateDecl owns a CommonPtr; read it to keep track of all of
2452 // the specializations.
2453 ReadSpecializations(*Loc.F, D, Loc.F->DeclsCursor, /*IsPartial=*/false);
2454 ReadSpecializations(*Loc.F, D, Loc.F->DeclsCursor, /*IsPartial=*/true);
2455 }
2456
2457 if (D->getTemplatedDecl()->TemplateOrInstantiation) {
2458 // We were loaded before our templated declaration was. We've not set up
2459 // its corresponding type yet (see VisitCXXRecordDeclImpl), so reconstruct
2460 // it now.
2462 D->getTemplatedDecl(), D->getInjectedClassNameSpecialization());
2463 }
2464}
2465
2467 llvm_unreachable("BuiltinTemplates are not serialized");
2468}
2469
2470/// TODO: Unify with ClassTemplateDecl version?
2471/// May require unifying ClassTemplateDecl and
2472/// VarTemplateDecl beyond TemplateDecl...
2474 RedeclarableResult Redecl = VisitRedeclarableTemplateDecl(D);
2476
2477 if (ThisDeclID == Redecl.getFirstID()) {
2478 // This VarTemplateDecl owns a CommonPtr; read it to keep track of all of
2479 // the specializations.
2480 ReadSpecializations(*Loc.F, D, Loc.F->DeclsCursor, /*IsPartial=*/false);
2481 ReadSpecializations(*Loc.F, D, Loc.F->DeclsCursor, /*IsPartial=*/true);
2482 }
2483}
2484
2487 RedeclarableResult Redecl = VisitCXXRecordDeclImpl(D);
2488
2489 ASTContext &C = Reader.getContext();
2490 if (Decl *InstD = readDecl()) {
2491 if (auto *CTD = dyn_cast<ClassTemplateDecl>(InstD)) {
2492 D->SpecializedTemplate = CTD;
2493 } else {
2495 Record.readTemplateArgumentList(TemplArgs);
2496 TemplateArgumentList *ArgList
2497 = TemplateArgumentList::CreateCopy(C, TemplArgs);
2498 auto *PS =
2500 SpecializedPartialSpecialization();
2501 PS->PartialSpecialization
2502 = cast<ClassTemplatePartialSpecializationDecl>(InstD);
2503 PS->TemplateArgs = ArgList;
2504 D->SpecializedTemplate = PS;
2505 }
2506 }
2507
2509 Record.readTemplateArgumentList(TemplArgs, /*Canonicalize*/ true);
2510 D->TemplateArgs = TemplateArgumentList::CreateCopy(C, TemplArgs);
2511 D->PointOfInstantiation = readSourceLocation();
2512 D->SpecializationKind = (TemplateSpecializationKind)Record.readInt();
2513
2514 bool writtenAsCanonicalDecl = Record.readInt();
2515 if (writtenAsCanonicalDecl) {
2516 auto *CanonPattern = readDeclAs<ClassTemplateDecl>();
2517 if (D->isCanonicalDecl()) { // It's kept in the folding set.
2518 // Set this as, or find, the canonical declaration for this specialization
2520 if (auto *Partial = dyn_cast<ClassTemplatePartialSpecializationDecl>(D)) {
2521 CanonSpec = CanonPattern->getCommonPtr()->PartialSpecializations
2522 .GetOrInsertNode(Partial);
2523 } else {
2524 CanonSpec =
2525 CanonPattern->getCommonPtr()->Specializations.GetOrInsertNode(D);
2526 }
2527 // If there was already a canonical specialization, merge into it.
2528 if (CanonSpec != D) {
2529 MergeImpl.mergeRedeclarable<TagDecl>(D, CanonSpec, Redecl);
2530
2531 // This declaration might be a definition. Merge with any existing
2532 // definition.
2533 if (auto *DDD = D->DefinitionData) {
2534 if (CanonSpec->DefinitionData)
2535 MergeImpl.MergeDefinitionData(CanonSpec, std::move(*DDD));
2536 else
2537 CanonSpec->DefinitionData = D->DefinitionData;
2538 }
2539 D->DefinitionData = CanonSpec->DefinitionData;
2540 }
2541 }
2542 }
2543
2544 // extern/template keyword locations for explicit instantiations
2545 if (Record.readBool()) {
2546 auto *ExplicitInfo = new (C) ExplicitInstantiationInfo;
2547 ExplicitInfo->ExternKeywordLoc = readSourceLocation();
2548 ExplicitInfo->TemplateKeywordLoc = readSourceLocation();
2549 D->ExplicitInfo = ExplicitInfo;
2550 }
2551
2552 if (Record.readBool())
2553 D->setTemplateArgsAsWritten(Record.readASTTemplateArgumentListInfo());
2554
2555 return Redecl;
2556}
2557
2560 // We need to read the template params first because redeclarable is going to
2561 // need them for profiling
2562 TemplateParameterList *Params = Record.readTemplateParameterList();
2563 D->TemplateParams = Params;
2564
2565 RedeclarableResult Redecl = VisitClassTemplateSpecializationDeclImpl(D);
2566
2567 // These are read/set from/to the first declaration.
2568 if (ThisDeclID == Redecl.getFirstID()) {
2569 D->InstantiatedFromMember.setPointer(
2570 readDeclAs<ClassTemplatePartialSpecializationDecl>());
2571 D->InstantiatedFromMember.setInt(Record.readInt());
2572 }
2573}
2574
2576 RedeclarableResult Redecl = VisitRedeclarableTemplateDecl(D);
2577
2578 if (ThisDeclID == Redecl.getFirstID()) {
2579 // This FunctionTemplateDecl owns a CommonPtr; read it.
2580 ReadSpecializations(*Loc.F, D, Loc.F->DeclsCursor, /*IsPartial=*/false);
2581 }
2582}
2583
2584/// TODO: Unify with ClassTemplateSpecializationDecl version?
2585/// May require unifying ClassTemplate(Partial)SpecializationDecl and
2586/// VarTemplate(Partial)SpecializationDecl with a new data
2587/// structure Template(Partial)SpecializationDecl, and
2588/// using Template(Partial)SpecializationDecl as input type.
2591 ASTContext &C = Reader.getContext();
2592 if (Decl *InstD = readDecl()) {
2593 if (auto *VTD = dyn_cast<VarTemplateDecl>(InstD)) {
2594 D->SpecializedTemplate = VTD;
2595 } else {
2597 Record.readTemplateArgumentList(TemplArgs);
2599 C, TemplArgs);
2600 auto *PS =
2601 new (C)
2602 VarTemplateSpecializationDecl::SpecializedPartialSpecialization();
2603 PS->PartialSpecialization =
2604 cast<VarTemplatePartialSpecializationDecl>(InstD);
2605 PS->TemplateArgs = ArgList;
2606 D->SpecializedTemplate = PS;
2607 }
2608 }
2609
2610 // extern/template keyword locations for explicit instantiations
2611 if (Record.readBool()) {
2612 auto *ExplicitInfo = new (C) ExplicitInstantiationInfo;
2613 ExplicitInfo->ExternKeywordLoc = readSourceLocation();
2614 ExplicitInfo->TemplateKeywordLoc = readSourceLocation();
2615 D->ExplicitInfo = ExplicitInfo;
2616 }
2617
2618 if (Record.readBool())
2619 D->setTemplateArgsAsWritten(Record.readASTTemplateArgumentListInfo());
2620
2622 Record.readTemplateArgumentList(TemplArgs, /*Canonicalize*/ true);
2623 D->TemplateArgs = TemplateArgumentList::CreateCopy(C, TemplArgs);
2624 D->PointOfInstantiation = readSourceLocation();
2625 D->SpecializationKind = (TemplateSpecializationKind)Record.readInt();
2626 D->IsCompleteDefinition = Record.readInt();
2627
2628 RedeclarableResult Redecl = VisitVarDeclImpl(D);
2629
2630 bool writtenAsCanonicalDecl = Record.readInt();
2631 if (writtenAsCanonicalDecl) {
2632 auto *CanonPattern = readDeclAs<VarTemplateDecl>();
2633 if (D->isCanonicalDecl()) { // It's kept in the folding set.
2635 if (auto *Partial = dyn_cast<VarTemplatePartialSpecializationDecl>(D)) {
2636 CanonSpec = CanonPattern->getCommonPtr()
2637 ->PartialSpecializations.GetOrInsertNode(Partial);
2638 } else {
2639 CanonSpec =
2640 CanonPattern->getCommonPtr()->Specializations.GetOrInsertNode(D);
2641 }
2642 // If we already have a matching specialization, merge it.
2643 if (CanonSpec != D)
2644 MergeImpl.mergeRedeclarable<VarDecl>(D, CanonSpec, Redecl);
2645 }
2646 }
2647
2648 return Redecl;
2649}
2650
2651/// TODO: Unify with ClassTemplatePartialSpecializationDecl version?
2652/// May require unifying ClassTemplate(Partial)SpecializationDecl and
2653/// VarTemplate(Partial)SpecializationDecl with a new data
2654/// structure Template(Partial)SpecializationDecl, and
2655/// using Template(Partial)SpecializationDecl as input type.
2658 TemplateParameterList *Params = Record.readTemplateParameterList();
2659 D->TemplateParams = Params;
2660
2661 RedeclarableResult Redecl = VisitVarTemplateSpecializationDeclImpl(D);
2662
2663 // These are read/set from/to the first declaration.
2664 if (ThisDeclID == Redecl.getFirstID()) {
2665 D->InstantiatedFromMember.setPointer(
2666 readDeclAs<VarTemplatePartialSpecializationDecl>());
2667 D->InstantiatedFromMember.setInt(Record.readInt());
2668 }
2669}
2670
2673
2674 D->setDeclaredWithTypename(Record.readInt());
2675
2676 bool TypeConstraintInitialized = D->hasTypeConstraint() && Record.readBool();
2677 if (TypeConstraintInitialized) {
2678 ConceptReference *CR = nullptr;
2679 if (Record.readBool())
2680 CR = Record.readConceptReference();
2681 Expr *ImmediatelyDeclaredConstraint = Record.readExpr();
2682
2683 D->setTypeConstraint(CR, ImmediatelyDeclaredConstraint);
2684 if ((D->ExpandedParameterPack = Record.readInt()))
2685 D->NumExpanded = Record.readInt();
2686 }
2687
2688 if (Record.readInt())
2689 D->setDefaultArgument(Reader.getContext(),
2690 Record.readTemplateArgumentLoc());
2691}
2692
2695 // TemplateParmPosition.
2696 D->setDepth(Record.readInt());
2697 D->setPosition(Record.readInt());
2698 if (D->hasPlaceholderTypeConstraint())
2699 D->setPlaceholderTypeConstraint(Record.readExpr());
2700 if (D->isExpandedParameterPack()) {
2701 auto TypesAndInfos =
2702 D->getTrailingObjects<std::pair<QualType, TypeSourceInfo *>>();
2703 for (unsigned I = 0, N = D->getNumExpansionTypes(); I != N; ++I) {
2704 new (&TypesAndInfos[I].first) QualType(Record.readType());
2705 TypesAndInfos[I].second = readTypeSourceInfo();
2706 }
2707 } else {
2708 // Rest of NonTypeTemplateParmDecl.
2709 D->ParameterPack = Record.readInt();
2710 if (Record.readInt())
2711 D->setDefaultArgument(Reader.getContext(),
2712 Record.readTemplateArgumentLoc());
2713 }
2714}
2715
2718 D->setDeclaredWithTypename(Record.readBool());
2719 // TemplateParmPosition.
2720 D->setDepth(Record.readInt());
2721 D->setPosition(Record.readInt());
2722 if (D->isExpandedParameterPack()) {
2723 auto **Data = D->getTrailingObjects<TemplateParameterList *>();
2724 for (unsigned I = 0, N = D->getNumExpansionTemplateParameters();
2725 I != N; ++I)
2726 Data[I] = Record.readTemplateParameterList();
2727 } else {
2728 // Rest of TemplateTemplateParmDecl.
2729 D->ParameterPack = Record.readInt();
2730 if (Record.readInt())
2731 D->setDefaultArgument(Reader.getContext(),
2732 Record.readTemplateArgumentLoc());
2733 }
2734}
2735
2737 RedeclarableResult Redecl = VisitRedeclarableTemplateDecl(D);
2739}
2740
2742 VisitDecl(D);
2743 D->AssertExprAndFailed.setPointer(Record.readExpr());
2744 D->AssertExprAndFailed.setInt(Record.readInt());
2745 D->Message = cast_or_null<StringLiteral>(Record.readExpr());
2746 D->RParenLoc = readSourceLocation();
2747}
2748
2750 VisitDecl(D);
2751}
2752
2755 VisitDecl(D);
2756 D->ExtendingDecl = readDeclAs<ValueDecl>();
2757 D->ExprWithTemporary = Record.readStmt();
2758 if (Record.readInt()) {
2759 D->Value = new (D->getASTContext()) APValue(Record.readAPValue());
2760 D->getASTContext().addDestruction(D->Value);
2761 }
2762 D->ManglingNumber = Record.readInt();
2764}
2765
2766std::pair<uint64_t, uint64_t>
2768 uint64_t LexicalOffset = ReadLocalOffset();
2769 uint64_t VisibleOffset = ReadLocalOffset();
2770 return std::make_pair(LexicalOffset, VisibleOffset);
2771}
2772
2773template <typename T>
2775 GlobalDeclID FirstDeclID = readDeclID();
2776 Decl *MergeWith = nullptr;
2777
2778 bool IsKeyDecl = ThisDeclID == FirstDeclID;
2779 bool IsFirstLocalDecl = false;
2780
2781 uint64_t RedeclOffset = 0;
2782
2783 // invalid FirstDeclID indicates that this declaration was the only
2784 // declaration of its entity, and is used for space optimization.
2785 if (FirstDeclID.isInvalid()) {
2786 FirstDeclID = ThisDeclID;
2787 IsKeyDecl = true;
2788 IsFirstLocalDecl = true;
2789 } else if (unsigned N = Record.readInt()) {
2790 // This declaration was the first local declaration, but may have imported
2791 // other declarations.
2792 IsKeyDecl = N == 1;
2793 IsFirstLocalDecl = true;
2794
2795 // We have some declarations that must be before us in our redeclaration
2796 // chain. Read them now, and remember that we ought to merge with one of
2797 // them.
2798 // FIXME: Provide a known merge target to the second and subsequent such
2799 // declaration.
2800 for (unsigned I = 0; I != N - 1; ++I)
2801 MergeWith = readDecl();
2802
2803 RedeclOffset = ReadLocalOffset();
2804 } else {
2805 // This declaration was not the first local declaration. Read the first
2806 // local declaration now, to trigger the import of other redeclarations.
2807 (void)readDecl();
2808 }
2809
2810 auto *FirstDecl = cast_or_null<T>(Reader.GetDecl(FirstDeclID));
2811 if (FirstDecl != D) {
2812 // We delay loading of the redeclaration chain to avoid deeply nested calls.
2813 // We temporarily set the first (canonical) declaration as the previous one
2814 // which is the one that matters and mark the real previous DeclID to be
2815 // loaded & attached later on.
2816 D->RedeclLink = Redeclarable<T>::PreviousDeclLink(FirstDecl);
2817 D->First = FirstDecl->getCanonicalDecl();
2818 }
2819
2820 auto *DAsT = static_cast<T *>(D);
2821
2822 // Note that we need to load local redeclarations of this decl and build a
2823 // decl chain for them. This must happen *after* we perform the preloading
2824 // above; this ensures that the redeclaration chain is built in the correct
2825 // order.
2826 if (IsFirstLocalDecl)
2827 Reader.PendingDeclChains.push_back(std::make_pair(DAsT, RedeclOffset));
2828
2829 return RedeclarableResult(MergeWith, FirstDeclID, IsKeyDecl);
2830}
2831
2832/// Attempts to merge the given declaration (D) with another declaration
2833/// of the same entity.
2834template <typename T>
2836 RedeclarableResult &Redecl) {
2837 // If modules are not available, there is no reason to perform this merge.
2838 if (!Reader.getContext().getLangOpts().Modules)
2839 return;
2840
2841 // If we're not the canonical declaration, we don't need to merge.
2842 if (!DBase->isFirstDecl())
2843 return;
2844
2845 auto *D = static_cast<T *>(DBase);
2846
2847 if (auto *Existing = Redecl.getKnownMergeTarget())
2848 // We already know of an existing declaration we should merge with.
2849 MergeImpl.mergeRedeclarable(D, cast<T>(Existing), Redecl);
2850 else if (FindExistingResult ExistingRes = findExisting(D))
2851 if (T *Existing = ExistingRes)
2852 MergeImpl.mergeRedeclarable(D, Existing, Redecl);
2853}
2854
2855/// Attempt to merge D with a previous declaration of the same lambda, which is
2856/// found by its index within its context declaration, if it has one.
2857///
2858/// We can't look up lambdas in their enclosing lexical or semantic context in
2859/// general, because for lambdas in variables, both of those might be a
2860/// namespace or the translation unit.
2861void ASTDeclMerger::mergeLambda(CXXRecordDecl *D, RedeclarableResult &Redecl,
2862 Decl &Context, unsigned IndexInContext) {
2863 // If modules are not available, there is no reason to perform this merge.
2864 if (!Reader.getContext().getLangOpts().Modules)
2865 return;
2866
2867 // If we're not the canonical declaration, we don't need to merge.
2868 if (!D->isFirstDecl())
2869 return;
2870
2871 if (auto *Existing = Redecl.getKnownMergeTarget())
2872 // We already know of an existing declaration we should merge with.
2873 mergeRedeclarable(D, cast<TagDecl>(Existing), Redecl);
2874
2875 // Look up this lambda to see if we've seen it before. If so, merge with the
2876 // one we already loaded.
2877 NamedDecl *&Slot = Reader.LambdaDeclarationsForMerging[{
2878 Context.getCanonicalDecl(), IndexInContext}];
2879 if (Slot)
2880 mergeRedeclarable(D, cast<TagDecl>(Slot), Redecl);
2881 else
2882 Slot = D;
2883}
2884
2886 RedeclarableResult &Redecl) {
2887 mergeRedeclarable(D, Redecl);
2888 // If we merged the template with a prior declaration chain, merge the
2889 // common pointer.
2890 // FIXME: Actually merge here, don't just overwrite.
2891 D->Common = D->getCanonicalDecl()->Common;
2892}
2893
2894/// "Cast" to type T, asserting if we don't have an implicit conversion.
2895/// We use this to put code in a template that will only be valid for certain
2896/// instantiations.
2897template<typename T> static T assert_cast(T t) { return t; }
2898template<typename T> static T assert_cast(...) {
2899 llvm_unreachable("bad assert_cast");
2900}
2901
2902/// Merge together the pattern declarations from two template
2903/// declarations.
2905 RedeclarableTemplateDecl *Existing,
2906 bool IsKeyDecl) {
2907 auto *DPattern = D->getTemplatedDecl();
2908 auto *ExistingPattern = Existing->getTemplatedDecl();
2909 RedeclarableResult Result(
2910 /*MergeWith*/ ExistingPattern,
2911 DPattern->getCanonicalDecl()->getGlobalID(), IsKeyDecl);
2912
2913 if (auto *DClass = dyn_cast<CXXRecordDecl>(DPattern)) {
2914 // Merge with any existing definition.
2915 // FIXME: This is duplicated in several places. Refactor.
2916 auto *ExistingClass =
2917 cast<CXXRecordDecl>(ExistingPattern)->getCanonicalDecl();
2918 if (auto *DDD = DClass->DefinitionData) {
2919 if (ExistingClass->DefinitionData) {
2920 MergeDefinitionData(ExistingClass, std::move(*DDD));
2921 } else {
2922 ExistingClass->DefinitionData = DClass->DefinitionData;
2923 // We may have skipped this before because we thought that DClass
2924 // was the canonical declaration.
2925 Reader.PendingDefinitions.insert(DClass);
2926 }
2927 }
2928 DClass->DefinitionData = ExistingClass->DefinitionData;
2929
2930 return mergeRedeclarable(DClass, cast<TagDecl>(ExistingPattern),
2931 Result);
2932 }
2933 if (auto *DFunction = dyn_cast<FunctionDecl>(DPattern))
2934 return mergeRedeclarable(DFunction, cast<FunctionDecl>(ExistingPattern),
2935 Result);
2936 if (auto *DVar = dyn_cast<VarDecl>(DPattern))
2937 return mergeRedeclarable(DVar, cast<VarDecl>(ExistingPattern), Result);
2938 if (auto *DAlias = dyn_cast<TypeAliasDecl>(DPattern))
2939 return mergeRedeclarable(DAlias, cast<TypedefNameDecl>(ExistingPattern),
2940 Result);
2941 llvm_unreachable("merged an unknown kind of redeclarable template");
2942}
2943
2944/// Attempts to merge the given declaration (D) with another declaration
2945/// of the same entity.
2946template <typename T>
2948 GlobalDeclID KeyDeclID) {
2949 auto *D = static_cast<T *>(DBase);
2950 T *ExistingCanon = Existing->getCanonicalDecl();
2951 T *DCanon = D->getCanonicalDecl();
2952 if (ExistingCanon != DCanon) {
2953 // Have our redeclaration link point back at the canonical declaration
2954 // of the existing declaration, so that this declaration has the
2955 // appropriate canonical declaration.
2956 D->RedeclLink = Redeclarable<T>::PreviousDeclLink(ExistingCanon);
2957 D->First = ExistingCanon;
2958 ExistingCanon->Used |= D->Used;
2959 D->Used = false;
2960
2961 bool IsKeyDecl = KeyDeclID.isValid();
2962
2963 // When we merge a template, merge its pattern.
2964 if (auto *DTemplate = dyn_cast<RedeclarableTemplateDecl>(D))
2966 DTemplate, assert_cast<RedeclarableTemplateDecl *>(ExistingCanon),
2967 IsKeyDecl);
2968
2969 // If this declaration is a key declaration, make a note of that.
2970 if (IsKeyDecl)
2971 Reader.KeyDecls[ExistingCanon].push_back(KeyDeclID);
2972 }
2973}
2974
2975/// ODR-like semantics for C/ObjC allow us to merge tag types and a structural
2976/// check in Sema guarantees the types can be merged (see C11 6.2.7/1 or C89
2977/// 6.1.2.6/1). Although most merging is done in Sema, we need to guarantee
2978/// that some types are mergeable during deserialization, otherwise name
2979/// lookup fails. This is the case for EnumConstantDecl.
2981 if (!ND)
2982 return false;
2983 // TODO: implement merge for other necessary decls.
2984 if (isa<EnumConstantDecl, FieldDecl, IndirectFieldDecl>(ND))
2985 return true;
2986 return false;
2987}
2988
2989/// Attempts to merge LifetimeExtendedTemporaryDecl with
2990/// identical class definitions from two different modules.
2992 // If modules are not available, there is no reason to perform this merge.
2993 if (!Reader.getContext().getLangOpts().Modules)
2994 return;
2995
2997
2999 Reader.LETemporaryForMerging[std::make_pair(
3000 LETDecl->getExtendingDecl(), LETDecl->getManglingNumber())];
3001 if (LookupResult)
3002 Reader.getContext().setPrimaryMergedDecl(LETDecl,
3003 LookupResult->getCanonicalDecl());
3004 else
3005 LookupResult = LETDecl;
3006}
3007
3008/// Attempts to merge the given declaration (D) with another declaration
3009/// of the same entity, for the case where the entity is not actually
3010/// redeclarable. This happens, for instance, when merging the fields of
3011/// identical class definitions from two different modules.
3012template<typename T>
3014 // If modules are not available, there is no reason to perform this merge.
3015 if (!Reader.getContext().getLangOpts().Modules)
3016 return;
3017
3018 // ODR-based merging is performed in C++ and in some cases (tag types) in C.
3019 // Note that C identically-named things in different translation units are
3020 // not redeclarations, but may still have compatible types, where ODR-like
3021 // semantics may apply.
3022 if (!Reader.getContext().getLangOpts().CPlusPlus &&
3023 !allowODRLikeMergeInC(dyn_cast<NamedDecl>(static_cast<T*>(D))))
3024 return;
3025
3026 if (FindExistingResult ExistingRes = findExisting(static_cast<T*>(D)))
3027 if (T *Existing = ExistingRes)
3028 Reader.getContext().setPrimaryMergedDecl(static_cast<T *>(D),
3029 Existing->getCanonicalDecl());
3030}
3031
3033 Record.readOMPChildren(D->Data);
3034 VisitDecl(D);
3035}
3036
3038 Record.readOMPChildren(D->Data);
3039 VisitDecl(D);
3040}
3041
3043 Record.readOMPChildren(D->Data);
3044 VisitDecl(D);
3045}
3046
3049 D->setLocation(readSourceLocation());
3050 Expr *In = Record.readExpr();
3051 Expr *Out = Record.readExpr();
3052 D->setCombinerData(In, Out);
3053 Expr *Combiner = Record.readExpr();
3054 D->setCombiner(Combiner);
3055 Expr *Orig = Record.readExpr();
3056 Expr *Priv = Record.readExpr();
3057 D->setInitializerData(Orig, Priv);
3058 Expr *Init = Record.readExpr();
3059 auto IK = static_cast<OMPDeclareReductionInitKind>(Record.readInt());
3060 D->setInitializer(Init, IK);
3061 D->PrevDeclInScope = readDeclID().getRawValue();
3062}
3063
3065 Record.readOMPChildren(D->Data);
3067 D->VarName = Record.readDeclarationName();
3068 D->PrevDeclInScope = readDeclID().getRawValue();
3069}
3070
3072 VisitVarDecl(D);
3073}
3074
3075//===----------------------------------------------------------------------===//
3076// Attribute Reading
3077//===----------------------------------------------------------------------===//
3078
3079namespace {
3080class AttrReader {
3081 ASTRecordReader &Reader;
3082
3083public:
3084 AttrReader(ASTRecordReader &Reader) : Reader(Reader) {}
3085
3086 uint64_t readInt() {
3087 return Reader.readInt();
3088 }
3089
3090 bool readBool() { return Reader.readBool(); }
3091
3092 SourceRange readSourceRange() {
3093 return Reader.readSourceRange();
3094 }
3095
3096 SourceLocation readSourceLocation() {
3097 return Reader.readSourceLocation();
3098 }
3099
3100 Expr *readExpr() { return Reader.readExpr(); }
3101
3102 Attr *readAttr() { return Reader.readAttr(); }
3103
3104 std::string readString() {
3105 return Reader.readString();
3106 }
3107
3108 TypeSourceInfo *readTypeSourceInfo() {
3109 return Reader.readTypeSourceInfo();
3110 }
3111
3112 IdentifierInfo *readIdentifier() {
3113 return Reader.readIdentifier();
3114 }
3115
3116 VersionTuple readVersionTuple() {
3117 return Reader.readVersionTuple();
3118 }
3119
3120 OMPTraitInfo *readOMPTraitInfo() { return Reader.readOMPTraitInfo(); }
3121
3122 template <typename T> T *readDeclAs() { return Reader.readDeclAs<T>(); }
3123};
3124}
3125
3127 AttrReader Record(*this);
3128 auto V = Record.readInt();
3129 if (!V)
3130 return nullptr;
3131
3132 Attr *New = nullptr;
3133 // Kind is stored as a 1-based integer because 0 is used to indicate a null
3134 // Attr pointer.
3135 auto Kind = static_cast<attr::Kind>(V - 1);
3136 ASTContext &Context = getContext();
3137
3138 IdentifierInfo *AttrName = Record.readIdentifier();
3139 IdentifierInfo *ScopeName = Record.readIdentifier();
3140 SourceRange AttrRange = Record.readSourceRange();
3141 SourceLocation ScopeLoc = Record.readSourceLocation();
3142 unsigned ParsedKind = Record.readInt();
3143 unsigned Syntax = Record.readInt();
3144 unsigned SpellingIndex = Record.readInt();
3145 bool IsAlignas = (ParsedKind == AttributeCommonInfo::AT_Aligned &&
3147 SpellingIndex == AlignedAttr::Keyword_alignas);
3148 bool IsRegularKeywordAttribute = Record.readBool();
3149
3150 AttributeCommonInfo Info(AttrName, ScopeName, AttrRange, ScopeLoc,
3151 AttributeCommonInfo::Kind(ParsedKind),
3152 {AttributeCommonInfo::Syntax(Syntax), SpellingIndex,
3153 IsAlignas, IsRegularKeywordAttribute});
3154
3155#include "clang/Serialization/AttrPCHRead.inc"
3156
3157 assert(New && "Unable to decode attribute?");
3158 return New;
3159}
3160
3161/// Reads attributes from the current stream position.
3163 for (unsigned I = 0, E = readInt(); I != E; ++I)
3164 if (auto *A = readAttr())
3165 Attrs.push_back(A);
3166}
3167
3168//===----------------------------------------------------------------------===//
3169// ASTReader Implementation
3170//===----------------------------------------------------------------------===//
3171
3172/// Note that we have loaded the declaration with the given
3173/// Index.
3174///
3175/// This routine notes that this declaration has already been loaded,
3176/// so that future GetDecl calls will return this declaration rather
3177/// than trying to load a new declaration.
3178inline void ASTReader::LoadedDecl(unsigned Index, Decl *D) {
3179 assert(!DeclsLoaded[Index] && "Decl loaded twice?");
3180 DeclsLoaded[Index] = D;
3181}
3182
3183/// Determine whether the consumer will be interested in seeing
3184/// this declaration (via HandleTopLevelDecl).
3185///
3186/// This routine should return true for anything that might affect
3187/// code generation, e.g., inline function definitions, Objective-C
3188/// declarations with metadata, etc.
3189bool ASTReader::isConsumerInterestedIn(Decl *D) {
3190 // An ObjCMethodDecl is never considered as "interesting" because its
3191 // implementation container always is.
3192
3193 // An ImportDecl or VarDecl imported from a module map module will get
3194 // emitted when we import the relevant module.
3196 auto *M = D->getImportedOwningModule();
3197 if (M && M->Kind == Module::ModuleMapModule &&
3198 getContext().DeclMustBeEmitted(D))
3199 return false;
3200 }
3201
3204 return true;
3207 return !D->getDeclContext()->isFunctionOrMethod();
3208 if (const auto *Var = dyn_cast<VarDecl>(D))
3209 return Var->isFileVarDecl() &&
3210 (Var->isThisDeclarationADefinition() == VarDecl::Definition ||
3211 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(Var));
3212 if (const auto *Func = dyn_cast<FunctionDecl>(D))
3213 return Func->doesThisDeclarationHaveABody() || PendingBodies.count(D);
3214
3215 if (auto *ES = D->getASTContext().getExternalSource())
3216 if (ES->hasExternalDefinitions(D) == ExternalASTSource::EK_Never)
3217 return true;
3218
3219 return false;
3220}
3221
3222/// Get the correct cursor and offset for loading a declaration.
3223ASTReader::RecordLocation ASTReader::DeclCursorForID(GlobalDeclID ID,
3226 assert(M);
3227 unsigned LocalDeclIndex = ID.getLocalDeclIndex();
3228 const DeclOffset &DOffs = M->DeclOffsets[LocalDeclIndex];
3229 Loc = ReadSourceLocation(*M, DOffs.getRawLoc());
3230 return RecordLocation(M, DOffs.getBitOffset(M->DeclsBlockStartOffset));
3231}
3232
3233ASTReader::RecordLocation ASTReader::getLocalBitOffset(uint64_t GlobalOffset) {
3234 auto I = GlobalBitOffsetsMap.find(GlobalOffset);
3235
3236 assert(I != GlobalBitOffsetsMap.end() && "Corrupted global bit offsets map");
3237 return RecordLocation(I->second, GlobalOffset - I->second->GlobalBitOffset);
3238}
3239
3240uint64_t ASTReader::getGlobalBitOffset(ModuleFile &M, uint64_t LocalOffset) {
3241 return LocalOffset + M.GlobalBitOffset;
3242}
3243
3245ASTDeclReader::getOrFakePrimaryClassDefinition(ASTReader &Reader,
3246 CXXRecordDecl *RD) {
3247 // Try to dig out the definition.
3248 auto *DD = RD->DefinitionData;
3249 if (!DD)
3250 DD = RD->getCanonicalDecl()->DefinitionData;
3251
3252 // If there's no definition yet, then DC's definition is added by an update
3253 // record, but we've not yet loaded that update record. In this case, we
3254 // commit to DC being the canonical definition now, and will fix this when
3255 // we load the update record.
3256 if (!DD) {
3257 DD = new (Reader.getContext()) struct CXXRecordDecl::DefinitionData(RD);
3258 RD->setCompleteDefinition(true);
3259 RD->DefinitionData = DD;
3260 RD->getCanonicalDecl()->DefinitionData = DD;
3261
3262 // Track that we did this horrible thing so that we can fix it later.
3263 Reader.PendingFakeDefinitionData.insert(
3264 std::make_pair(DD, ASTReader::PendingFakeDefinitionKind::Fake));
3265 }
3266
3267 return DD->Definition;
3268}
3269
3270/// Find the context in which we should search for previous declarations when
3271/// looking for declarations to merge.
3272DeclContext *ASTDeclReader::getPrimaryContextForMerging(ASTReader &Reader,
3273 DeclContext *DC) {
3274 if (auto *ND = dyn_cast<NamespaceDecl>(DC))
3275 return ND->getFirstDecl();
3276
3277 if (auto *RD = dyn_cast<CXXRecordDecl>(DC))
3278 return getOrFakePrimaryClassDefinition(Reader, RD);
3279
3280 if (auto *RD = dyn_cast<RecordDecl>(DC))
3281 return RD->getDefinition();
3282
3283 if (auto *ED = dyn_cast<EnumDecl>(DC))
3284 return ED->getDefinition();
3285
3286 if (auto *OID = dyn_cast<ObjCInterfaceDecl>(DC))
3287 return OID->getDefinition();
3288
3289 // We can see the TU here only if we have no Sema object. It is possible
3290 // we're in clang-repl so we still need to get the primary context.
3291 if (auto *TU = dyn_cast<TranslationUnitDecl>(DC))
3292 return TU->getPrimaryContext();
3293
3294 return nullptr;
3295}
3296
3297ASTDeclReader::FindExistingResult::~FindExistingResult() {
3298 // Record that we had a typedef name for linkage whether or not we merge
3299 // with that declaration.
3300 if (TypedefNameForLinkage) {
3301 DeclContext *DC = New->getDeclContext()->getRedeclContext();
3302 Reader.ImportedTypedefNamesForLinkage.insert(
3303 std::make_pair(std::make_pair(DC, TypedefNameForLinkage), New));
3304 return;
3305 }
3306
3307 if (!AddResult || Existing)
3308 return;
3309
3310 DeclarationName Name = New->getDeclName();
3311 DeclContext *DC = New->getDeclContext()->getRedeclContext();
3313 setAnonymousDeclForMerging(Reader, New->getLexicalDeclContext(),
3314 AnonymousDeclNumber, New);
3315 } else if (DC->isTranslationUnit() &&
3316 !Reader.getContext().getLangOpts().CPlusPlus) {
3317 if (Reader.getIdResolver().tryAddTopLevelDecl(New, Name))
3318 Reader.PendingFakeLookupResults[Name.getAsIdentifierInfo()]
3319 .push_back(New);
3320 } else if (DeclContext *MergeDC = getPrimaryContextForMerging(Reader, DC)) {
3321 // Add the declaration to its redeclaration context so later merging
3322 // lookups will find it.
3323 MergeDC->makeDeclVisibleInContextImpl(New, /*Internal*/true);
3324 }
3325}
3326
3327/// Find the declaration that should be merged into, given the declaration found
3328/// by name lookup. If we're merging an anonymous declaration within a typedef,
3329/// we need a matching typedef, and we merge with the type inside it.
3331 bool IsTypedefNameForLinkage) {
3332 if (!IsTypedefNameForLinkage)
3333 return Found;
3334
3335 // If we found a typedef declaration that gives a name to some other
3336 // declaration, then we want that inner declaration. Declarations from
3337 // AST files are handled via ImportedTypedefNamesForLinkage.
3338 if (Found->isFromASTFile())
3339 return nullptr;
3340
3341 if (auto *TND = dyn_cast<TypedefNameDecl>(Found))
3342 return TND->getAnonDeclWithTypedefName(/*AnyRedecl*/true);
3343
3344 return nullptr;
3345}
3346
3347/// Find the declaration to use to populate the anonymous declaration table
3348/// for the given lexical DeclContext. We only care about finding local
3349/// definitions of the context; we'll merge imported ones as we go.
3351ASTDeclReader::getPrimaryDCForAnonymousDecl(DeclContext *LexicalDC) {
3352 // For classes, we track the definition as we merge.
3353 if (auto *RD = dyn_cast<CXXRecordDecl>(LexicalDC)) {
3354 auto *DD = RD->getCanonicalDecl()->DefinitionData;
3355 return DD ? DD->Definition : nullptr;
3356 } else if (auto *OID = dyn_cast<ObjCInterfaceDecl>(LexicalDC)) {
3357 return OID->getCanonicalDecl()->getDefinition();
3358 }
3359
3360 // For anything else, walk its merged redeclarations looking for a definition.
3361 // Note that we can't just call getDefinition here because the redeclaration
3362 // chain isn't wired up.
3363 for (auto *D : merged_redecls(cast<Decl>(LexicalDC))) {
3364 if (auto *FD = dyn_cast<FunctionDecl>(D))
3365 if (FD->isThisDeclarationADefinition())
3366 return FD;
3367 if (auto *MD = dyn_cast<ObjCMethodDecl>(D))
3368 if (MD->isThisDeclarationADefinition())
3369 return MD;
3370 if (auto *RD = dyn_cast<RecordDecl>(D))
3372 return RD;
3373 }
3374
3375 // No merged definition yet.
3376 return nullptr;
3377}
3378
3379NamedDecl *ASTDeclReader::getAnonymousDeclForMerging(ASTReader &Reader,
3380 DeclContext *DC,
3381 unsigned Index) {
3382 // If the lexical context has been merged, look into the now-canonical
3383 // definition.
3384 auto *CanonDC = cast<Decl>(DC)->getCanonicalDecl();
3385
3386 // If we've seen this before, return the canonical declaration.
3387 auto &Previous = Reader.AnonymousDeclarationsForMerging[CanonDC];
3388 if (Index < Previous.size() && Previous[Index])
3389 return Previous[Index];
3390
3391 // If this is the first time, but we have parsed a declaration of the context,
3392 // build the anonymous declaration list from the parsed declaration.
3393 auto *PrimaryDC = getPrimaryDCForAnonymousDecl(DC);
3394 if (PrimaryDC && !cast<Decl>(PrimaryDC)->isFromASTFile()) {
3395 numberAnonymousDeclsWithin(PrimaryDC, [&](NamedDecl *ND, unsigned Number) {
3396 if (Previous.size() == Number)
3397 Previous.push_back(cast<NamedDecl>(ND->getCanonicalDecl()));
3398 else
3399 Previous[Number] = cast<NamedDecl>(ND->getCanonicalDecl());
3400 });
3401 }
3402
3403 return Index < Previous.size() ? Previous[Index] : nullptr;
3404}
3405
3406void ASTDeclReader::setAnonymousDeclForMerging(ASTReader &Reader,
3407 DeclContext *DC, unsigned Index,
3408 NamedDecl *D) {
3409 auto *CanonDC = cast<Decl>(DC)->getCanonicalDecl();
3410
3411 auto &Previous = Reader.AnonymousDeclarationsForMerging[CanonDC];
3412 if (Index >= Previous.size())
3413 Previous.resize(Index + 1);
3414 if (!Previous[Index])
3415 Previous[Index] = D;
3416}
3417
3418ASTDeclReader::FindExistingResult ASTDeclReader::findExisting(NamedDecl *D) {
3419 DeclarationName Name = TypedefNameForLinkage ? TypedefNameForLinkage
3420 : D->getDeclName();
3421
3422 if (!Name && !needsAnonymousDeclarationNumber(D)) {
3423 // Don't bother trying to find unnamed declarations that are in
3424 // unmergeable contexts.
3425 FindExistingResult Result(Reader, D, /*Existing=*/nullptr,
3426 AnonymousDeclNumber, TypedefNameForLinkage);
3427 Result.suppress();
3428 return Result;
3429 }
3430
3431 ASTContext &C = Reader.getContext();
3433 if (TypedefNameForLinkage) {
3434 auto It = Reader.ImportedTypedefNamesForLinkage.find(
3435 std::make_pair(DC, TypedefNameForLinkage));
3436 if (It != Reader.ImportedTypedefNamesForLinkage.end())
3437 if (C.isSameEntity(It->second, D))
3438 return FindExistingResult(Reader, D, It->second, AnonymousDeclNumber,
3439 TypedefNameForLinkage);
3440 // Go on to check in other places in case an existing typedef name
3441 // was not imported.
3442 }
3443
3445 // This is an anonymous declaration that we may need to merge. Look it up
3446 // in its context by number.
3447 if (auto *Existing = getAnonymousDeclForMerging(
3448 Reader, D->getLexicalDeclContext(), AnonymousDeclNumber))
3449 if (C.isSameEntity(Existing, D))
3450 return FindExistingResult(Reader, D, Existing, AnonymousDeclNumber,
3451 TypedefNameForLinkage);
3452 } else if (DC->isTranslationUnit() &&
3453 !Reader.getContext().getLangOpts().CPlusPlus) {
3454 IdentifierResolver &IdResolver = Reader.getIdResolver();
3455
3456 // Temporarily consider the identifier to be up-to-date. We don't want to
3457 // cause additional lookups here.
3458 class UpToDateIdentifierRAII {
3459 IdentifierInfo *II;
3460 bool WasOutToDate = false;
3461
3462 public:
3463 explicit UpToDateIdentifierRAII(IdentifierInfo *II) : II(II) {
3464 if (II) {
3465 WasOutToDate = II->isOutOfDate();
3466 if (WasOutToDate)
3467 II->setOutOfDate(false);
3468 }
3469 }
3470
3471 ~UpToDateIdentifierRAII() {
3472 if (WasOutToDate)
3473 II->setOutOfDate(true);
3474 }
3475 } UpToDate(Name.getAsIdentifierInfo());
3476
3477 for (IdentifierResolver::iterator I = IdResolver.begin(Name),
3478 IEnd = IdResolver.end();
3479 I != IEnd; ++I) {
3480 if (NamedDecl *Existing = getDeclForMerging(*I, TypedefNameForLinkage))
3481 if (C.isSameEntity(Existing, D))
3482 return FindExistingResult(Reader, D, Existing, AnonymousDeclNumber,
3483 TypedefNameForLinkage);
3484 }
3485 } else if (DeclContext *MergeDC = getPrimaryContextForMerging(Reader, DC)) {
3486 DeclContext::lookup_result R = MergeDC->noload_lookup(Name);
3487 for (DeclContext::lookup_iterator I = R.begin(), E = R.end(); I != E; ++I) {
3488 if (NamedDecl *Existing = getDeclForMerging(*I, TypedefNameForLinkage))
3489 if (C.isSameEntity(Existing, D))
3490 return FindExistingResult(Reader, D, Existing, AnonymousDeclNumber,
3491 TypedefNameForLinkage);
3492 }
3493 } else {
3494 // Not in a mergeable context.
3495 return FindExistingResult(Reader);
3496 }
3497
3498 // If this declaration is from a merged context, make a note that we need to
3499 // check that the canonical definition of that context contains the decl.
3500 //
3501 // Note that we don't perform ODR checks for decls from the global module
3502 // fragment.
3503 //
3504 // FIXME: We should do something similar if we merge two definitions of the
3505 // same template specialization into the same CXXRecordDecl.
3506 auto MergedDCIt = Reader.MergedDeclContexts.find(D->getLexicalDeclContext());
3507 if (MergedDCIt != Reader.MergedDeclContexts.end() &&
3508 !shouldSkipCheckingODR(D) && MergedDCIt->second == D->getDeclContext() &&
3509 !shouldSkipCheckingODR(cast<Decl>(D->getDeclContext())))
3510 Reader.PendingOdrMergeChecks.push_back(D);
3511
3512 return FindExistingResult(Reader, D, /*Existing=*/nullptr,
3513 AnonymousDeclNumber, TypedefNameForLinkage);
3514}
3515
3516template<typename DeclT>
3518 return D->RedeclLink.getLatestNotUpdated();
3519}
3520
3522 llvm_unreachable("getMostRecentDecl on non-redeclarable declaration");
3523}
3524
3526 assert(D);
3527
3528 switch (D->getKind()) {
3529#define ABSTRACT_DECL(TYPE)
3530#define DECL(TYPE, BASE) \
3531 case Decl::TYPE: \
3532 return getMostRecentDeclImpl(cast<TYPE##Decl>(D));
3533#include "clang/AST/DeclNodes.inc"
3534 }
3535 llvm_unreachable("unknown decl kind");
3536}
3537
3538Decl *ASTReader::getMostRecentExistingDecl(Decl *D) {
3540}
3541
3542namespace {
3543void mergeInheritableAttributes(ASTReader &Reader, Decl *D, Decl *Previous) {
3544 InheritableAttr *NewAttr = nullptr;
3545 ASTContext &Context = Reader.getContext();
3546 const auto *IA = Previous->getAttr<MSInheritanceAttr>();
3547
3548 if (IA && !D->hasAttr<MSInheritanceAttr>()) {
3549 NewAttr = cast<InheritableAttr>(IA->clone(Context));
3550 NewAttr->setInherited(true);
3551 D->addAttr(NewAttr);
3552 }
3553
3554 const auto *AA = Previous->getAttr<AvailabilityAttr>();
3555 if (AA && !D->hasAttr<AvailabilityAttr>()) {
3556 NewAttr = AA->clone(Context);
3557 NewAttr->setInherited(true);
3558 D->addAttr(NewAttr);
3559 }
3560}
3561} // namespace
3562
3563template<typename DeclT>
3566 Decl *Previous, Decl *Canon) {
3567 D->RedeclLink.setPrevious(cast<DeclT>(Previous));
3568 D->First = cast<DeclT>(Previous)->First;
3569}
3570
3571namespace clang {
3572
3573template<>
3576 Decl *Previous, Decl *Canon) {
3577 auto *VD = static_cast<VarDecl *>(D);
3578 auto *PrevVD = cast<VarDecl>(Previous);
3579 D->RedeclLink.setPrevious(PrevVD);
3580 D->First = PrevVD->First;
3581
3582 // We should keep at most one definition on the chain.
3583 // FIXME: Cache the definition once we've found it. Building a chain with
3584 // N definitions currently takes O(N^2) time here.
3585 if (VD->isThisDeclarationADefinition() == VarDecl::Definition) {
3586 for (VarDecl *CurD = PrevVD; CurD; CurD = CurD->getPreviousDecl()) {
3587 if (CurD->isThisDeclarationADefinition() == VarDecl::Definition) {
3588 Reader.mergeDefinitionVisibility(CurD, VD);
3589 VD->demoteThisDefinitionToDeclaration();
3590 break;
3591 }
3592 }
3593 }
3594}
3595
3597 auto *DT = T->getContainedDeducedType();
3598 return DT && !DT->isDeduced();
3599}
3600
3601template<>
3604 Decl *Previous, Decl *Canon) {
3605 auto *FD = static_cast<FunctionDecl *>(D);
3606 auto *PrevFD = cast<FunctionDecl>(Previous);
3607
3608 FD->RedeclLink.setPrevious(PrevFD);
3609 FD->First = PrevFD->First;
3610
3611 // If the previous declaration is an inline function declaration, then this
3612 // declaration is too.
3613 if (PrevFD->isInlined() != FD->isInlined()) {
3614 // FIXME: [dcl.fct.spec]p4:
3615 // If a function with external linkage is declared inline in one
3616 // translation unit, it shall be declared inline in all translation
3617 // units in which it appears.
3618 //
3619 // Be careful of this case:
3620 //
3621 // module A:
3622 // template<typename T> struct X { void f(); };
3623 // template<typename T> inline void X<T>::f() {}
3624 //
3625 // module B instantiates the declaration of X<int>::f
3626 // module C instantiates the definition of X<int>::f
3627 //
3628 // If module B and C are merged, we do not have a violation of this rule.
3629 FD->setImplicitlyInline(true);
3630 }
3631
3632 auto *FPT = FD->getType()->getAs<FunctionProtoType>();
3633 auto *PrevFPT = PrevFD->getType()->getAs<FunctionProtoType>();
3634 if (FPT && PrevFPT) {
3635 // If we need to propagate an exception specification along the redecl
3636 // chain, make a note of that so that we can do so later.
3637 bool IsUnresolved = isUnresolvedExceptionSpec(FPT->getExceptionSpecType());
3638 bool WasUnresolved =
3640 if (IsUnresolved != WasUnresolved)
3641 Reader.PendingExceptionSpecUpdates.insert(
3642 {Canon, IsUnresolved ? PrevFD : FD});
3643
3644 // If we need to propagate a deduced return type along the redecl chain,
3645 // make a note of that so that we can do it later.
3646 bool IsUndeduced = isUndeducedReturnType(FPT->getReturnType());
3647 bool WasUndeduced = isUndeducedReturnType(PrevFPT->getReturnType());
3648 if (IsUndeduced != WasUndeduced)
3649 Reader.PendingDeducedTypeUpdates.insert(
3650 {cast<FunctionDecl>(Canon),
3651 (IsUndeduced ? PrevFPT : FPT)->getReturnType()});
3652 }
3653}
3654
3655} // namespace clang
3656
3658 llvm_unreachable("attachPreviousDecl on non-redeclarable declaration");
3659}
3660
3661/// Inherit the default template argument from \p From to \p To. Returns
3662/// \c false if there is no default template for \p From.
3663template <typename ParmDecl>
3664static bool inheritDefaultTemplateArgument(ASTContext &Context, ParmDecl *From,
3665 Decl *ToD) {
3666 auto *To = cast<ParmDecl>(ToD);
3667 if (!From->hasDefaultArgument())
3668 return false;
3669 To->setInheritedDefaultArgument(Context, From);
3670 return true;
3671}
3672
3674 TemplateDecl *From,
3675 TemplateDecl *To) {
3676 auto *FromTP = From->getTemplateParameters();
3677 auto *ToTP = To->getTemplateParameters();
3678 assert(FromTP->size() == ToTP->size() && "merged mismatched templates?");
3679
3680 for (unsigned I = 0, N = FromTP->size(); I != N; ++I) {
3681 NamedDecl *FromParam = FromTP->getParam(I);
3682 NamedDecl *ToParam = ToTP->getParam(I);
3683
3684 if (auto *FTTP = dyn_cast<TemplateTypeParmDecl>(FromParam))
3685 inheritDefaultTemplateArgument(Context, FTTP, ToParam);
3686 else if (auto *FNTTP = dyn_cast<NonTypeTemplateParmDecl>(FromParam))
3687 inheritDefaultTemplateArgument(Context, FNTTP, ToParam);
3688 else
3690 Context, cast<TemplateTemplateParmDecl>(FromParam), ToParam);
3691 }
3692}
3693
3694// [basic.link]/p10:
3695// If two declarations of an entity are attached to different modules,
3696// the program is ill-formed;
3698 Decl *D,
3699 Decl *Previous) {
3700 // If it is previous implcitly introduced, it is not meaningful to
3701 // diagnose it.
3702 if (Previous->isImplicit())
3703 return;
3704
3705 // FIXME: Get rid of the enumeration of decl types once we have an appropriate
3706 // abstract for decls of an entity. e.g., the namespace decl and using decl
3707 // doesn't introduce an entity.
3708 if (!isa<VarDecl, FunctionDecl, TagDecl, RedeclarableTemplateDecl>(Previous))
3709 return;
3710
3711 // Skip implicit instantiations since it may give false positive diagnostic
3712 // messages.
3713 // FIXME: Maybe this shows the implicit instantiations may have incorrect
3714 // module owner ships. But given we've finished the compilation of a module,
3715 // how can we add new entities to that module?
3716 if (isa<VarTemplateSpecializationDecl>(Previous))
3717 return;
3718 if (isa<ClassTemplateSpecializationDecl>(Previous))
3719 return;
3720 if (auto *Func = dyn_cast<FunctionDecl>(Previous);
3721 Func && Func->getTemplateSpecializationInfo())
3722 return;
3723
3724 Module *M = Previous->getOwningModule();
3725 if (!M)
3726 return;
3727
3728 // We only forbids merging decls within named modules.
3729 if (!M->isNamedModule()) {
3730 // Try to warn the case that we merged decls from global module.
3731 if (!M->isGlobalModule())
3732 return;
3733
3734 if (D->getOwningModule() &&
3736 return;
3737
3738 Reader.PendingWarningForDuplicatedDefsInModuleUnits.push_back(
3739 {D, Previous});
3740 return;
3741 }
3742
3743 // It is fine if they are in the same module.
3744 if (Reader.getContext().isInSameModule(M, D->getOwningModule()))
3745 return;
3746
3747 Reader.Diag(Previous->getLocation(),
3748 diag::err_multiple_decl_in_different_modules)
3749 << cast<NamedDecl>(Previous) << M->Name;
3750 Reader.Diag(D->getLocation(), diag::note_also_found);
3751}
3752
3754 Decl *Previous, Decl *Canon) {
3755 assert(D && Previous);
3756
3757 switch (D->getKind()) {
3758#define ABSTRACT_DECL(TYPE)
3759#define DECL(TYPE, BASE) \
3760 case Decl::TYPE: \
3761 attachPreviousDeclImpl(Reader, cast<TYPE##Decl>(D), Previous, Canon); \
3762 break;
3763#include "clang/AST/DeclNodes.inc"
3764 }
3765
3767
3768 // If the declaration was visible in one module, a redeclaration of it in
3769 // another module remains visible even if it wouldn't be visible by itself.
3770 //
3771 // FIXME: In this case, the declaration should only be visible if a module
3772 // that makes it visible has been imported.
3774 Previous->IdentifierNamespace &
3776
3777 // If the declaration declares a template, it may inherit default arguments
3778 // from the previous declaration.
3779 if (auto *TD = dyn_cast<TemplateDecl>(D))
3781 cast<TemplateDecl>(Previous), TD);
3782
3783 // If any of the declaration in the chain contains an Inheritable attribute,
3784 // it needs to be added to all the declarations in the redeclarable chain.
3785 // FIXME: Only the logic of merging MSInheritableAttr is present, it should
3786 // be extended for all inheritable attributes.
3787 mergeInheritableAttributes(Reader, D, Previous);
3788}
3789
3790template<typename DeclT>
3792 D->RedeclLink.setLatest(cast<DeclT>(Latest));
3793}
3794
3796 llvm_unreachable("attachLatestDecl on non-redeclarable declaration");
3797}
3798
3800 assert(D && Latest);
3801
3802 switch (D->getKind()) {
3803#define ABSTRACT_DECL(TYPE)
3804#define DECL(TYPE, BASE) \
3805 case Decl::TYPE: \
3806 attachLatestDeclImpl(cast<TYPE##Decl>(D), Latest); \
3807 break;
3808#include "clang/AST/DeclNodes.inc"
3809 }
3810}
3811
3812template<typename DeclT>
3814 D->RedeclLink.markIncomplete();
3815}
3816
3818 llvm_unreachable("markIncompleteDeclChain on non-redeclarable declaration");
3819}
3820
3821void ASTReader::markIncompleteDeclChain(Decl *D) {
3822 switch (D->getKind()) {
3823#define ABSTRACT_DECL(TYPE)
3824#define DECL(TYPE, BASE) \
3825 case Decl::TYPE: \
3826 ASTDeclReader::markIncompleteDeclChainImpl(cast<TYPE##Decl>(D)); \
3827 break;
3828#include "clang/AST/DeclNodes.inc"
3829 }
3830}
3831
3832/// Read the declaration at the given offset from the AST file.
3833Decl *ASTReader::ReadDeclRecord(GlobalDeclID ID) {
3834 SourceLocation DeclLoc;
3835 RecordLocation Loc = DeclCursorForID(ID, DeclLoc);
3836 llvm::BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
3837 // Keep track of where we are in the stream, then jump back there
3838 // after reading this declaration.
3839 SavedStreamPosition SavedPosition(DeclsCursor);
3840
3841 ReadingKindTracker ReadingKind(Read_Decl, *this);
3842
3843 // Note that we are loading a declaration record.
3844 Deserializing ADecl(this);
3845
3846 auto Fail = [](const char *what, llvm::Error &&Err) {
3847 llvm::report_fatal_error(Twine("ASTReader::readDeclRecord failed ") + what +
3848 ": " + toString(std::move(Err)));
3849 };
3850
3851 if (llvm::Error JumpFailed = DeclsCursor.JumpToBit(Loc.Offset))
3852 Fail("jumping", std::move(JumpFailed));
3853 ASTRecordReader Record(*this, *Loc.F);
3854 ASTDeclReader Reader(*this, Record, Loc, ID, DeclLoc);
3855 Expected<unsigned> MaybeCode = DeclsCursor.ReadCode();
3856 if (!MaybeCode)
3857 Fail("reading code", MaybeCode.takeError());
3858 unsigned Code = MaybeCode.get();
3859
3860 ASTContext &Context = getContext();
3861 Decl *D = nullptr;
3862 Expected<unsigned> MaybeDeclCode = Record.readRecord(DeclsCursor, Code);
3863 if (!MaybeDeclCode)
3864 llvm::report_fatal_error(
3865 Twine("ASTReader::readDeclRecord failed reading decl code: ") +
3866 toString(MaybeDeclCode.takeError()));
3867
3868 switch ((DeclCode)MaybeDeclCode.get()) {
3873 llvm_unreachable("Record cannot be de-serialized with readDeclRecord");
3874 case DECL_TYPEDEF:
3875 D = TypedefDecl::CreateDeserialized(Context, ID);
3876 break;
3877 case DECL_TYPEALIAS:
3878 D = TypeAliasDecl::CreateDeserialized(Context, ID);
3879 break;
3880 case DECL_ENUM:
3881 D = EnumDecl::CreateDeserialized(Context, ID);
3882 break;
3883 case DECL_RECORD:
3884 D = RecordDecl::CreateDeserialized(Context, ID);
3885 break;
3886 case DECL_ENUM_CONSTANT:
3888 break;
3889 case DECL_FUNCTION:
3890 D = FunctionDecl::CreateDeserialized(Context, ID);
3891 break;
3892 case DECL_LINKAGE_SPEC:
3894 break;
3895 case DECL_EXPORT:
3896 D = ExportDecl::CreateDeserialized(Context, ID);
3897 break;
3898 case DECL_LABEL:
3899 D = LabelDecl::CreateDeserialized(Context, ID);
3900 break;
3901 case DECL_NAMESPACE:
3902 D = NamespaceDecl::CreateDeserialized(Context, ID);
3903 break;
3906 break;
3907 case DECL_USING:
3908 D = UsingDecl::CreateDeserialized(Context, ID);
3909 break;
3910 case DECL_USING_PACK:
3911 D = UsingPackDecl::CreateDeserialized(Context, ID, Record.readInt());
3912 break;
3913 case DECL_USING_SHADOW:
3915 break;
3916 case DECL_USING_ENUM:
3917 D = UsingEnumDecl::CreateDeserialized(Context, ID);
3918 break;
3921 break;
3924 break;
3927 break;
3930 break;
3933 break;
3934 case DECL_CXX_RECORD:
3935 D = CXXRecordDecl::CreateDeserialized(Context, ID);
3936 break;
3939 break;
3940 case DECL_CXX_METHOD:
3941 D = CXXMethodDecl::CreateDeserialized(Context, ID);
3942 break;
3944 D = CXXConstructorDecl::CreateDeserialized(Context, ID, Record.readInt());
3945 break;
3948 break;
3951 break;
3952 case DECL_ACCESS_SPEC:
3954 break;
3955 case DECL_FRIEND:
3956 D = FriendDecl::CreateDeserialized(Context, ID, Record.readInt());
3957 break;
3960 break;
3963 break;
3966 break;
3969 break;
3970 case DECL_VAR_TEMPLATE:
3972 break;
3975 break;
3978 break;
3981 break;
3983 bool HasTypeConstraint = Record.readInt();
3985 HasTypeConstraint);
3986 break;
3987 }
3989 bool HasTypeConstraint = Record.readInt();
3991 HasTypeConstraint);
3992 break;
3993 }
3995 bool HasTypeConstraint = Record.readInt();
3997 Context, ID, Record.readInt(), HasTypeConstraint);
3998 break;
3999 }
4002 break;
4005 Record.readInt());
4006 break;
4009 break;
4010 case DECL_CONCEPT:
4011 D = ConceptDecl::CreateDeserialized(Context, ID);
4012 break;
4015 break;
4016 case DECL_STATIC_ASSERT:
4018 break;
4019 case DECL_OBJC_METHOD:
4021 break;
4024 break;
4025 case DECL_OBJC_IVAR:
4026 D = ObjCIvarDecl::CreateDeserialized(Context, ID);
4027 break;
4028 case DECL_OBJC_PROTOCOL:
4030 break;
4033 break;
4034 case DECL_OBJC_CATEGORY:
4036 break;
4039 break;
4042 break;
4045 break;
4046 case DECL_OBJC_PROPERTY:
4048 break;
4051 break;
4052 case DECL_FIELD:
4053 D = FieldDecl::CreateDeserialized(Context, ID);
4054 break;
4055 case DECL_INDIRECTFIELD:
4057 break;
4058 case DECL_VAR:
4059 D = VarDecl::CreateDeserialized(Context, ID);
4060 break;
4063 break;
4064 case DECL_PARM_VAR:
4065 D = ParmVarDecl::CreateDeserialized(Context, ID);
4066 break;
4067 case DECL_DECOMPOSITION:
4068 D = DecompositionDecl::CreateDeserialized(Context, ID, Record.readInt());
4069 break;
4070 case DECL_BINDING:
4071 D = BindingDecl::CreateDeserialized(Context, ID);
4072 break;
4075 break;
4078 break;
4079 case DECL_BLOCK:
4080 D = BlockDecl::CreateDeserialized(Context, ID);
4081 break;
4082 case DECL_MS_PROPERTY:
4084 break;
4085 case DECL_MS_GUID:
4086 D = MSGuidDecl::CreateDeserialized(Context, ID);
4087 break;
4089 D = UnnamedGlobalConstantDecl::CreateDeserialized(Context, ID);
4090 break;
4092 D = TemplateParamObjectDecl::CreateDeserialized(Context, ID);
4093 break;
4094 case DECL_CAPTURED:
4095 D = CapturedDecl::CreateDeserialized(Context, ID, Record.readInt());
4096 break;
4098 Error("attempt to read a C++ base-specifier record as a declaration");
4099 return nullptr;
4101 Error("attempt to read a C++ ctor initializer record as a declaration");
4102 return nullptr;
4103 case DECL_IMPORT:
4104 // Note: last entry of the ImportDecl record is the number of stored source
4105 // locations.
4106 D = ImportDecl::CreateDeserialized(Context, ID, Record.back());
4107 break;
4109 Record.skipInts(1);
4110 unsigned NumChildren = Record.readInt();
4111 Record.skipInts(1);
4112 D = OMPThreadPrivateDecl::CreateDeserialized(Context, ID, NumChildren);
4113 break;
4114 }
4115 case DECL_OMP_ALLOCATE: {
4116 unsigned NumClauses = Record.readInt();
4117 unsigned NumVars = Record.readInt();
4118 Record.skipInts(1);
4119 D = OMPAllocateDecl::CreateDeserialized(Context, ID, NumVars, NumClauses);
4120 break;
4121 }
4122 case DECL_OMP_REQUIRES: {
4123 unsigned NumClauses = Record.readInt();
4124 Record.skipInts(2);
4125 D = OMPRequiresDecl::CreateDeserialized(Context, ID, NumClauses);
4126 break;
4127 }
4130 break;
4132 unsigned NumClauses = Record.readInt();
4133 Record.skipInts(2);
4134 D = OMPDeclareMapperDecl::CreateDeserialized(Context, ID, NumClauses);
4135 break;
4136 }
4139 break;
4141 D = PragmaCommentDecl::CreateDeserialized(Context, ID, Record.readInt());
4142 break;
4145 Record.readInt());
4146 break;
4147 case DECL_EMPTY:
4148 D = EmptyDecl::CreateDeserialized(Context, ID);
4149 break;
4152 break;
4155 break;
4156 case DECL_HLSL_BUFFER:
4158 break;
4161 Record.readInt());
4162 break;
4163 }
4164
4165 assert(D && "Unknown declaration reading AST file");
4166 LoadedDecl(translateGlobalDeclIDToIndex(ID), D);
4167 // Set the DeclContext before doing any deserialization, to make sure internal
4168 // calls to Decl::getASTContext() by Decl's methods will find the
4169 // TranslationUnitDecl without crashing.
4171
4172 // Reading some declarations can result in deep recursion.
4173 runWithSufficientStackSpace(DeclLoc, [&] { Reader.Visit(D); });
4174
4175 // If this declaration is also a declaration context, get the
4176 // offsets for its tables of lexical and visible declarations.
4177 if (auto *DC = dyn_cast<DeclContext>(D)) {
4178 std::pair<uint64_t, uint64_t> Offsets = Reader.VisitDeclContext(DC);
4179
4180 // Get the lexical and visible block for the delayed namespace.
4181 // It is sufficient to judge if ID is in DelayedNamespaceOffsetMap.
4182 // But it may be more efficient to filter the other cases.
4183 if (!Offsets.first && !Offsets.second && isa<NamespaceDecl>(D))
4184 if (auto Iter = DelayedNamespaceOffsetMap.find(ID);
4185 Iter != DelayedNamespaceOffsetMap.end())
4186 Offsets = Iter->second;
4187
4188 if (Offsets.first &&
4189 ReadLexicalDeclContextStorage(*Loc.F, DeclsCursor, Offsets.first, DC))
4190 return nullptr;
4191 if (Offsets.second &&
4192 ReadVisibleDeclContextStorage(*Loc.F, DeclsCursor, Offsets.second, ID))
4193 return nullptr;
4194 }
4195 assert(Record.getIdx() == Record.size());
4196
4197 // Load any relevant update records.
4198 PendingUpdateRecords.push_back(
4199 PendingUpdateRecord(ID, D, /*JustLoaded=*/true));
4200
4201 // Load the categories after recursive loading is finished.
4202 if (auto *Class = dyn_cast<ObjCInterfaceDecl>(D))
4203 // If we already have a definition when deserializing the ObjCInterfaceDecl,
4204 // we put the Decl in PendingDefinitions so we can pull the categories here.
4205 if (Class->isThisDeclarationADefinition() ||
4206 PendingDefinitions.count(Class))
4207 loadObjCCategories(ID, Class);
4208
4209 // If we have deserialized a declaration that has a definition the
4210 // AST consumer might need to know about, queue it.
4211 // We don't pass it to the consumer immediately because we may be in recursive
4212 // loading, and some declarations may still be initializing.
4213 PotentiallyInterestingDecls.push_back(D);
4214
4215 return D;
4216}
4217
4218void ASTReader::PassInterestingDeclsToConsumer() {
4219 assert(Consumer);
4220
4221 if (PassingDeclsToConsumer)
4222 return;
4223
4224 // Guard variable to avoid recursively redoing the process of passing
4225 // decls to consumer.
4226 SaveAndRestore GuardPassingDeclsToConsumer(PassingDeclsToConsumer, true);
4227
4228 // Ensure that we've loaded all potentially-interesting declarations
4229 // that need to be eagerly loaded.
4230 for (auto ID : EagerlyDeserializedDecls)
4231 GetDecl(ID);
4232 EagerlyDeserializedDecls.clear();
4233
4234 auto ConsumingPotentialInterestingDecls = [this]() {
4235 while (!PotentiallyInterestingDecls.empty()) {
4236 Decl *D = PotentiallyInterestingDecls.front();
4237 PotentiallyInterestingDecls.pop_front();
4238 if (isConsumerInterestedIn(D))
4239 PassInterestingDeclToConsumer(D);
4240 }
4241 };
4242 std::deque<Decl *> MaybeInterestingDecls =
4243 std::move(PotentiallyInterestingDecls);
4244 PotentiallyInterestingDecls.clear();
4245 assert(PotentiallyInterestingDecls.empty());
4246 while (!MaybeInterestingDecls.empty()) {
4247 Decl *D = MaybeInterestingDecls.front();
4248 MaybeInterestingDecls.pop_front();
4249 // Since we load the variable's initializers lazily, it'd be problematic
4250 // if the initializers dependent on each other. So here we try to load the
4251 // initializers of static variables to make sure they are passed to code
4252 // generator by order. If we read anything interesting, we would consume
4253 // that before emitting the current declaration.
4254 if (auto *VD = dyn_cast<VarDecl>(D);
4255 VD && VD->isFileVarDecl() && !VD->isExternallyVisible())
4256 VD->getInit();
4257 ConsumingPotentialInterestingDecls();
4258 if (isConsumerInterestedIn(D))
4259 PassInterestingDeclToConsumer(D);
4260 }
4261
4262 // If we add any new potential interesting decl in the last call, consume it.
4263 ConsumingPotentialInterestingDecls();
4264
4265 for (GlobalDeclID ID : VTablesToEmit) {
4266 auto *RD = cast<CXXRecordDecl>(GetDecl(ID));
4267 assert(!RD->shouldEmitInExternalSource());
4268 PassVTableToConsumer(RD);
4269 }
4270 VTablesToEmit.clear();
4271}
4272
4273void ASTReader::loadDeclUpdateRecords(PendingUpdateRecord &Record) {
4274 // The declaration may have been modified by files later in the chain.
4275 // If this is the case, read the record containing the updates from each file
4276 // and pass it to ASTDeclReader to make the modifications.
4277 GlobalDeclID ID = Record.ID;
4278 Decl *D = Record.D;
4279 ProcessingUpdatesRAIIObj ProcessingUpdates(*this);
4280 DeclUpdateOffsetsMap::iterator UpdI = DeclUpdateOffsets.find(ID);
4281
4282 if (UpdI != DeclUpdateOffsets.end()) {
4283 auto UpdateOffsets = std::move(UpdI->second);
4284 DeclUpdateOffsets.erase(UpdI);
4285
4286 // Check if this decl was interesting to the consumer. If we just loaded
4287 // the declaration, then we know it was interesting and we skip the call
4288 // to isConsumerInterestedIn because it is unsafe to call in the
4289 // current ASTReader state.
4290 bool WasInteresting = Record.JustLoaded || isConsumerInterestedIn(D);
4291 for (auto &FileAndOffset : UpdateOffsets) {
4292 ModuleFile *F = FileAndOffset.first;
4293 uint64_t Offset = FileAndOffset.second;
4294 llvm::BitstreamCursor &Cursor = F->DeclsCursor;
4295 SavedStreamPosition SavedPosition(Cursor);
4296 if (llvm::Error JumpFailed = Cursor.JumpToBit(Offset))
4297 // FIXME don't do a fatal error.
4298 llvm::report_fatal_error(
4299 Twine("ASTReader::loadDeclUpdateRecords failed jumping: ") +
4300 toString(std::move(JumpFailed)));
4301 Expected<unsigned> MaybeCode = Cursor.ReadCode();
4302 if (!MaybeCode)
4303 llvm::report_fatal_error(
4304 Twine("ASTReader::loadDeclUpdateRecords failed reading code: ") +
4305 toString(MaybeCode.takeError()));
4306 unsigned Code = MaybeCode.get();
4307 ASTRecordReader Record(*this, *F);
4308 if (Expected<unsigned> MaybeRecCode = Record.readRecord(Cursor, Code))
4309 assert(MaybeRecCode.get() == DECL_UPDATES &&
4310 "Expected DECL_UPDATES record!");
4311 else
4312 llvm::report_fatal_error(
4313 Twine("ASTReader::loadDeclUpdateRecords failed reading rec code: ") +
4314 toString(MaybeCode.takeError()));
4315
4316 ASTDeclReader Reader(*this, Record, RecordLocation(F, Offset), ID,
4317 SourceLocation());
4318 Reader.UpdateDecl(D);
4319
4320 // We might have made this declaration interesting. If so, remember that
4321 // we need to hand it off to the consumer.
4322 if (!WasInteresting && isConsumerInterestedIn(D)) {
4323 PotentiallyInterestingDecls.push_back(D);
4324 WasInteresting = true;
4325 }
4326 }
4327 }
4328
4329 // Load the pending visible updates for this decl context, if it has any.
4330 auto I = PendingVisibleUpdates.find(ID);
4331 if (I != PendingVisibleUpdates.end()) {
4332 auto VisibleUpdates = std::move(I->second);
4333 PendingVisibleUpdates.erase(I);
4334
4335 auto *DC = cast<DeclContext>(D)->getPrimaryContext();
4336 for (const auto &Update : VisibleUpdates)
4337 Lookups[DC].Table.add(
4338 Update.Mod, Update.Data,
4341 }
4342
4343 // Load any pending related decls.
4344 if (D->isCanonicalDecl()) {
4345 if (auto IT = RelatedDeclsMap.find(ID); IT != RelatedDeclsMap.end()) {
4346 for (auto LID : IT->second)
4347 GetDecl(LID);
4348 RelatedDeclsMap.erase(IT);
4349 }
4350 }
4351
4352 // Load the pending specializations update for this decl, if it has any.
4353 if (auto I = PendingSpecializationsUpdates.find(ID);
4354 I != PendingSpecializationsUpdates.end()) {
4355 auto SpecializationUpdates = std::move(I->second);
4356 PendingSpecializationsUpdates.erase(I);
4357
4358 for (const auto &Update : SpecializationUpdates)
4359 AddSpecializations(D, Update.Data, *Update.Mod, /*IsPartial=*/false);
4360 }
4361
4362 // Load the pending specializations update for this decl, if it has any.
4363 if (auto I = PendingPartialSpecializationsUpdates.find(ID);
4364 I != PendingPartialSpecializationsUpdates.end()) {
4365 auto SpecializationUpdates = std::move(I->second);
4366 PendingPartialSpecializationsUpdates.erase(I);
4367
4368 for (const auto &Update : SpecializationUpdates)
4369 AddSpecializations(D, Update.Data, *Update.Mod, /*IsPartial=*/true);
4370 }
4371}
4372
4373void ASTReader::loadPendingDeclChain(Decl *FirstLocal, uint64_t LocalOffset) {
4374 // Attach FirstLocal to the end of the decl chain.
4375 Decl *CanonDecl = FirstLocal->getCanonicalDecl();
4376 if (FirstLocal != CanonDecl) {
4377 Decl *PrevMostRecent = ASTDeclReader::getMostRecentDecl(CanonDecl);
4379 *this, FirstLocal, PrevMostRecent ? PrevMostRecent : CanonDecl,
4380 CanonDecl);
4381 }
4382
4383 if (!LocalOffset) {
4384 ASTDeclReader::attachLatestDecl(CanonDecl, FirstLocal);
4385 return;
4386 }
4387
4388 // Load the list of other redeclarations from this module file.
4389 ModuleFile *M = getOwningModuleFile(FirstLocal);
4390 assert(M && "imported decl from no module file");
4391
4392 llvm::BitstreamCursor &Cursor = M->DeclsCursor;
4393 SavedStreamPosition SavedPosition(Cursor);
4394 if (llvm::Error JumpFailed = Cursor.JumpToBit(LocalOffset))
4395 llvm::report_fatal_error(
4396 Twine("ASTReader::loadPendingDeclChain failed jumping: ") +
4397 toString(std::move(JumpFailed)));
4398
4400 Expected<unsigned> MaybeCode = Cursor.ReadCode();
4401 if (!MaybeCode)
4402 llvm::report_fatal_error(
4403 Twine("ASTReader::loadPendingDeclChain failed reading code: ") +
4404 toString(MaybeCode.takeError()));
4405 unsigned Code = MaybeCode.get();
4406 if (Expected<unsigned> MaybeRecCode = Cursor.readRecord(Code, Record))
4407 assert(MaybeRecCode.get() == LOCAL_REDECLARATIONS &&
4408 "expected LOCAL_REDECLARATIONS record!");
4409 else
4410 llvm::report_fatal_error(
4411 Twine("ASTReader::loadPendingDeclChain failed reading rec code: ") +
4412 toString(MaybeCode.takeError()));
4413
4414 // FIXME: We have several different dispatches on decl kind here; maybe
4415 // we should instead generate one loop per kind and dispatch up-front?
4416 Decl *MostRecent = FirstLocal;
4417 for (unsigned I = 0, N = Record.size(); I != N; ++I) {
4418 unsigned Idx = N - I - 1;
4419 auto *D = ReadDecl(*M, Record, Idx);
4420 ASTDeclReader::attachPreviousDecl(*this, D, MostRecent, CanonDecl);
4421 MostRecent = D;
4422 }
4423 ASTDeclReader::attachLatestDecl(CanonDecl, MostRecent);
4424}
4425
4426namespace {
4427
4428 /// Given an ObjC interface, goes through the modules and links to the
4429 /// interface all the categories for it.
4430 class ObjCCategoriesVisitor {
4431 ASTReader &Reader;
4433 llvm::SmallPtrSetImpl<ObjCCategoryDecl *> &Deserialized;
4434 ObjCCategoryDecl *Tail = nullptr;
4435 llvm::DenseMap<DeclarationName, ObjCCategoryDecl *> NameCategoryMap;
4436 GlobalDeclID InterfaceID;
4437 unsigned PreviousGeneration;
4438
4439 void add(ObjCCategoryDecl *Cat) {
4440 // Only process each category once.
4441 if (!Deserialized.erase(Cat))
4442 return;
4443
4444 // Check for duplicate categories.
4445 if (Cat->getDeclName()) {
4446 ObjCCategoryDecl *&Existing = NameCategoryMap[Cat->getDeclName()];
4447 if (Existing && Reader.getOwningModuleFile(Existing) !=
4448 Reader.getOwningModuleFile(Cat)) {
4451 Cat->getASTContext(), Existing->getASTContext(),
4452 NonEquivalentDecls, StructuralEquivalenceKind::Default,
4453 /*StrictTypeSpelling =*/false,
4454 /*Complain =*/false,
4455 /*ErrorOnTagTypeMismatch =*/true);
4456 if (!Ctx.IsEquivalent(Cat, Existing)) {
4457 // Warn only if the categories with the same name are different.
4458 Reader.Diag(Cat->getLocation(), diag::warn_dup_category_def)
4459 << Interface->getDeclName() << Cat->getDeclName();
4460 Reader.Diag(Existing->getLocation(),
4461 diag::note_previous_definition);
4462 }
4463 } else if (!Existing) {
4464 // Record this category.
4465 Existing = Cat;
4466 }
4467 }
4468
4469 // Add this category to the end of the chain.
4470 if (Tail)
4472 else
4473 Interface->setCategoryListRaw(Cat);
4474 Tail = Cat;
4475 }
4476
4477 public:
4478 ObjCCategoriesVisitor(
4480 llvm::SmallPtrSetImpl<ObjCCategoryDecl *> &Deserialized,
4481 GlobalDeclID InterfaceID, unsigned PreviousGeneration)
4482 : Reader(Reader), Interface(Interface), Deserialized(Deserialized),
4483 InterfaceID(InterfaceID), PreviousGeneration(PreviousGeneration) {
4484 // Populate the name -> category map with the set of known categories.
4485 for (auto *Cat : Interface->known_categories()) {
4486 if (Cat->getDeclName())
4487 NameCategoryMap[Cat->getDeclName()] = Cat;
4488
4489 // Keep track of the tail of the category list.
4490 Tail = Cat;
4491 }
4492 }
4493
4494 bool operator()(ModuleFile &M) {
4495 // If we've loaded all of the category information we care about from
4496 // this module file, we're done.
4497 if (M.Generation <= PreviousGeneration)
4498 return true;
4499
4500 // Map global ID of the definition down to the local ID used in this
4501 // module file. If there is no such mapping, we'll find nothing here
4502 // (or in any module it imports).
4503 LocalDeclID LocalID =
4504 Reader.mapGlobalIDToModuleFileGlobalID(M, InterfaceID);
4505 if (LocalID.isInvalid())
4506 return true;
4507
4508 // Perform a binary search to find the local redeclarations for this
4509 // declaration (if any).
4510 const ObjCCategoriesInfo Compare = { LocalID, 0 };
4511 const ObjCCategoriesInfo *Result
4512 = std::lower_bound(M.ObjCCategoriesMap,
4514 Compare);
4515 if (Result == M.ObjCCategoriesMap + M.LocalNumObjCCategoriesInMap ||
4516 LocalID != Result->getDefinitionID()) {
4517 // We didn't find anything. If the class definition is in this module
4518 // file, then the module files it depends on cannot have any categories,
4519 // so suppress further lookup.
4520 return Reader.isDeclIDFromModule(InterfaceID, M);
4521 }
4522
4523 // We found something. Dig out all of the categories.
4524 unsigned Offset = Result->Offset;
4525 unsigned N = M.ObjCCategories[Offset];
4526 M.ObjCCategories[Offset++] = 0; // Don't try to deserialize again
4527 for (unsigned I = 0; I != N; ++I)
4528 add(Reader.ReadDeclAs<ObjCCategoryDecl>(M, M.ObjCCategories, Offset));
4529 return true;
4530 }
4531 };
4532
4533} // namespace
4534
4535void ASTReader::loadObjCCategories(GlobalDeclID ID, ObjCInterfaceDecl *D,
4536 unsigned PreviousGeneration) {
4537 ObjCCategoriesVisitor Visitor(*this, D, CategoriesDeserialized, ID,
4538 PreviousGeneration);
4539 ModuleMgr.visit(Visitor);
4540}
4541
4542template<typename DeclT, typename Fn>
4543static void forAllLaterRedecls(DeclT *D, Fn F) {
4544 F(D);
4545
4546 // Check whether we've already merged D into its redeclaration chain.
4547 // MostRecent may or may not be nullptr if D has not been merged. If
4548 // not, walk the merged redecl chain and see if it's there.
4549 auto *MostRecent = D->getMostRecentDecl();
4550 bool Found = false;
4551 for (auto *Redecl = MostRecent; Redecl && !Found;
4552 Redecl = Redecl->getPreviousDecl())
4553 Found = (Redecl == D);
4554
4555 // If this declaration is merged, apply the functor to all later decls.
4556 if (Found) {
4557 for (auto *Redecl = MostRecent; Redecl != D;
4558 Redecl = Redecl->getPreviousDecl())
4559 F(Redecl);
4560 }
4561}
4562
4564 while (Record.getIdx() < Record.size()) {
4565 switch ((DeclUpdateKind)Record.readInt()) {
4567 auto *RD = cast<CXXRecordDecl>(D);
4568 Decl *MD = Record.readDecl();
4569 assert(MD && "couldn't read decl from update record");
4570 Reader.PendingAddedClassMembers.push_back({RD, MD});
4571 break;
4572 }
4573
4575 auto *Anon = readDeclAs<NamespaceDecl>();
4576
4577 // Each module has its own anonymous namespace, which is disjoint from
4578 // any other module's anonymous namespaces, so don't attach the anonymous
4579 // namespace at all.
4580 if (!Record.isModule()) {
4581 if (auto *TU = dyn_cast<TranslationUnitDecl>(D))
4582 TU->setAnonymousNamespace(Anon);
4583 else
4584 cast<NamespaceDecl>(D)->setAnonymousNamespace(Anon);
4585 }
4586 break;
4587 }
4588
4590 auto *VD = cast<VarDecl>(D);
4591 VD->NonParmVarDeclBits.IsInline = Record.readInt();
4592 VD->NonParmVarDeclBits.IsInlineSpecified = Record.readInt();
4593 ReadVarDeclInit(VD);
4594 break;
4595 }
4596
4598 SourceLocation POI = Record.readSourceLocation();
4599 if (auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D)) {
4600 VTSD->setPointOfInstantiation(POI);
4601 } else if (auto *VD = dyn_cast<VarDecl>(D)) {
4602 MemberSpecializationInfo *MSInfo = VD->getMemberSpecializationInfo();
4603 assert(MSInfo && "No member specialization information");
4604 MSInfo->setPointOfInstantiation(POI);
4605 } else {
4606 auto *FD = cast<FunctionDecl>(D);
4607 if (auto *FTSInfo = FD->TemplateOrSpecialization
4609 FTSInfo->setPointOfInstantiation(POI);
4610 else
4611 cast<MemberSpecializationInfo *>(FD->TemplateOrSpecialization)
4612 ->setPointOfInstantiation(POI);
4613 }
4614 break;
4615 }
4616
4618 auto *Param = cast<ParmVarDecl>(D);
4619
4620 // We have to read the default argument regardless of whether we use it
4621 // so that hypothetical further update records aren't messed up.
4622 // TODO: Add a function to skip over the next expr record.
4623 auto *DefaultArg = Record.readExpr();
4624
4625 // Only apply the update if the parameter still has an uninstantiated
4626 // default argument.
4627 if (Param->hasUninstantiatedDefaultArg())
4628 Param->setDefaultArg(DefaultArg);
4629 break;
4630 }
4631
4633 auto *FD = cast<FieldDecl>(D);
4634 auto *DefaultInit = Record.readExpr();
4635
4636 // Only apply the update if the field still has an uninstantiated
4637 // default member initializer.
4638 if (FD->hasInClassInitializer() && !FD->hasNonNullInClassInitializer()) {
4639 if (DefaultInit)
4640 FD->setInClassInitializer(DefaultInit);
4641 else
4642 // Instantiation failed. We can get here if we serialized an AST for
4643 // an invalid program.
4644 FD->removeInClassInitializer();
4645 }
4646 break;
4647 }
4648
4650 auto *FD = cast<FunctionDecl>(D);
4651 if (Reader.PendingBodies[FD]) {
4652 // FIXME: Maybe check for ODR violations.
4653 // It's safe to stop now because this update record is always last.
4654 return;
4655 }
4656
4657 if (Record.readInt()) {
4658 // Maintain AST consistency: any later redeclarations of this function
4659 // are inline if this one is. (We might have merged another declaration
4660 // into this one.)
4661 forAllLaterRedecls(FD, [](FunctionDecl *FD) {
4662 FD->setImplicitlyInline();
4663 });
4664 }
4665 FD->setInnerLocStart(readSourceLocation());
4667 assert(Record.getIdx() == Record.size() && "lazy body must be last");
4668 break;
4669 }
4670
4672 auto *RD = cast<CXXRecordDecl>(D);
4673 auto *OldDD = RD->getCanonicalDecl()->DefinitionData;
4674 bool HadRealDefinition =
4675 OldDD && (OldDD->Definition != RD ||
4676 !Reader.PendingFakeDefinitionData.count(OldDD));
4677 RD->setParamDestroyedInCallee(Record.readInt());
4679 static_cast<RecordArgPassingKind>(Record.readInt()));
4680 ReadCXXRecordDefinition(RD, /*Update*/true);
4681
4682 // Visible update is handled separately.
4683 uint64_t LexicalOffset = ReadLocalOffset();
4684 if (!HadRealDefinition && LexicalOffset) {
4685 Record.readLexicalDeclContextStorage(LexicalOffset, RD);
4686 Reader.PendingFakeDefinitionData.erase(OldDD);
4687 }
4688
4689 auto TSK = (TemplateSpecializationKind)Record.readInt();
4690 SourceLocation POI = readSourceLocation();
4691 if (MemberSpecializationInfo *MSInfo =
4693 MSInfo->setTemplateSpecializationKind(TSK);
4694 MSInfo->setPointOfInstantiation(POI);
4695 } else {
4696 auto *Spec = cast<ClassTemplateSpecializationDecl>(RD);
4697 Spec->setTemplateSpecializationKind(TSK);
4698 Spec->setPointOfInstantiation(POI);
4699
4700 if (Record.readInt()) {
4701 auto *PartialSpec =
4702 readDeclAs<ClassTemplatePartialSpecializationDecl>();
4704 Record.readTemplateArgumentList(TemplArgs);
4705 auto *TemplArgList = TemplateArgumentList::CreateCopy(
4706 Reader.getContext(), TemplArgs);
4707
4708 // FIXME: If we already have a partial specialization set,
4709 // check that it matches.
4710 if (!isa<ClassTemplatePartialSpecializationDecl *>(
4711 Spec->getSpecializedTemplateOrPartial()))
4712 Spec->setInstantiationOf(PartialSpec, TemplArgList);
4713 }
4714 }
4715
4716 RD->setTagKind(static_cast<TagTypeKind>(Record.readInt()));
4717 RD->setLocation(readSourceLocation());
4718 RD->setLocStart(readSourceLocation());
4719 RD->setBraceRange(readSourceRange());
4720
4721 if (Record.readInt()) {
4722 AttrVec Attrs;
4723 Record.readAttributes(Attrs);
4724 // If the declaration already has attributes, we assume that some other
4725 // AST file already loaded them.
4726 if (!D->hasAttrs())
4727 D->setAttrsImpl(Attrs, Reader.getContext());
4728 }
4729 break;
4730 }
4731
4733 // Set the 'operator delete' directly to avoid emitting another update
4734 // record.
4735 auto *Del = readDeclAs<FunctionDecl>();
4736 auto *First = cast<CXXDestructorDecl>(D->getCanonicalDecl());
4737 auto *ThisArg = Record.readExpr();
4738 // FIXME: Check consistency if we have an old and new operator delete.
4739 if (!First->OperatorDelete) {
4740 First->OperatorDelete = Del;
4741 First->OperatorDeleteThisArg = ThisArg;
4742 }
4743 break;
4744 }
4745
4747 SmallVector<QualType, 8> ExceptionStorage;
4748 auto ESI = Record.readExceptionSpecInfo(ExceptionStorage);
4749
4750 // Update this declaration's exception specification, if needed.
4751 auto *FD = cast<FunctionDecl>(D);
4752 auto *FPT = FD->getType()->castAs<FunctionProtoType>();
4753 // FIXME: If the exception specification is already present, check that it
4754 // matches.
4755 if (isUnresolvedExceptionSpec(FPT->getExceptionSpecType())) {
4756 FD->setType(Reader.getContext().getFunctionType(
4757 FPT->getReturnType(), FPT->getParamTypes(),
4758 FPT->getExtProtoInfo().withExceptionSpec(ESI)));
4759
4760 // When we get to the end of deserializing, see if there are other decls
4761 // that we need to propagate this exception specification onto.
4762 Reader.PendingExceptionSpecUpdates.insert(
4763 std::make_pair(FD->getCanonicalDecl(), FD));
4764 }
4765 break;
4766 }
4767
4769 auto *FD = cast<FunctionDecl>(D);
4770 QualType DeducedResultType = Record.readType();
4771 Reader.PendingDeducedTypeUpdates.insert(
4772 {FD->getCanonicalDecl(), DeducedResultType});
4773 break;
4774 }
4775
4777 // Maintain AST consistency: any later redeclarations are used too.
4778 D->markUsed(Reader.getContext());
4779 break;
4780
4782 Reader.getContext().setManglingNumber(cast<NamedDecl>(D),
4783 Record.readInt());
4784 break;
4785
4787 Reader.getContext().setStaticLocalNumber(cast<VarDecl>(D),
4788 Record.readInt());
4789 break;
4790
4792 D->addAttr(OMPThreadPrivateDeclAttr::CreateImplicit(Reader.getContext(),
4793 readSourceRange()));
4794 break;
4795
4797 auto AllocatorKind =
4798 static_cast<OMPAllocateDeclAttr::AllocatorTypeTy>(Record.readInt());
4799 Expr *Allocator = Record.readExpr();
4800 Expr *Alignment = Record.readExpr();
4801 SourceRange SR = readSourceRange();
4802 D->addAttr(OMPAllocateDeclAttr::CreateImplicit(
4803 Reader.getContext(), AllocatorKind, Allocator, Alignment, SR));
4804 break;
4805 }
4806
4807 case UPD_DECL_EXPORTED: {
4808 unsigned SubmoduleID = readSubmoduleID();
4809 auto *Exported = cast<NamedDecl>(D);
4810 Module *Owner = SubmoduleID ? Reader.getSubmodule(SubmoduleID) : nullptr;
4811 Reader.getContext().mergeDefinitionIntoModule(Exported, Owner);
4812 Reader.PendingMergedDefinitionsToDeduplicate.insert(Exported);
4813 break;
4814 }
4815
4817 auto MapType = Record.readEnum<OMPDeclareTargetDeclAttr::MapTypeTy>();
4818 auto DevType = Record.readEnum<OMPDeclareTargetDeclAttr::DevTypeTy>();
4819 Expr *IndirectE = Record.readExpr();
4820 bool Indirect = Record.readBool();
4821 unsigned Level = Record.readInt();
4822 D->addAttr(OMPDeclareTargetDeclAttr::CreateImplicit(
4823 Reader.getContext(), MapType, DevType, IndirectE, Indirect, Level,
4824 readSourceRange()));
4825 break;
4826 }
4827
4829 AttrVec Attrs;
4830 Record.readAttributes(Attrs);
4831 assert(Attrs.size() == 1);
4832 D->addAttr(Attrs[0]);
4833 break;
4834 }
4835 }
4836}
This file provides AST data structures related to concepts.
Defines the clang::ASTContext interface.
#define V(N, I)
Definition: ASTContext.h:3453
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)
static char ID
Definition: Arena.cpp:183
Defines the clang::attr::Kind enum.
clang::CharUnits operator*(clang::CharUnits::QuantityType Scale, const clang::CharUnits &CU)
Definition: CharUnits.h:225
const Decl * D
enum clang::sema::@1724::IndirectLocalPathEntry::EntryKind Kind
Expr * E
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.
unsigned Iter
Definition: HTMLLogger.cpp:153
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.
SourceLocation Loc
Definition: SemaObjC.cpp:759
bool Indirect
Definition: SemaObjC.cpp:760
Defines the clang::SourceLocation class and associated facilities.
Defines various enumerations that describe declaration and type specifiers.
Defines utilities for dealing with stack allocation and stack space.
C Language Family Type Representation.
StateNode * Previous
__DEVICE__ void * memcpy(void *__a, const void *__b, size_t __c)
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
Definition: APValue.h:122
bool needsCleanup() const
Returns whether the object performed allocations.
Definition: APValue.cpp:431
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition: ASTContext.h:188
TranslationUnitDecl * getTranslationUnitDecl() const
Definition: ASTContext.h:1141
void setInstantiatedFromUsingDecl(NamedDecl *Inst, NamedDecl *Pattern)
Remember that the using decl Inst is an instantiation of the using decl Pattern of a class template.
QualType getInjectedClassNameType(CXXRecordDecl *Decl, QualType TST) const
getInjectedClassNameType - Return the unique reference to the injected class name type for the specif...
void setInstantiatedFromUsingShadowDecl(UsingShadowDecl *Inst, UsingShadowDecl *Pattern)
const LangOptions & getLangOpts() const
Definition: ASTContext.h:834
void setInstantiatedFromUsingEnumDecl(UsingEnumDecl *Inst, UsingEnumDecl *Pattern)
Remember that the using enum decl Inst is an instantiation of the using enum decl Pattern of a class ...
void setStaticLocalNumber(const VarDecl *VD, unsigned Number)
void addOverriddenMethod(const CXXMethodDecl *Method, const CXXMethodDecl *Overridden)
Note that the given C++ Method overrides the given Overridden method.
void setManglingNumber(const NamedDecl *ND, unsigned Number)
void * Allocate(size_t Size, unsigned Align=8) const
Definition: ASTContext.h:754
TypeSourceInfo * CreateTypeSourceInfo(QualType T, unsigned Size=0) const
Allocate an uninitialized TypeSourceInfo.
void setInstantiatedFromStaticDataMember(VarDecl *Inst, VarDecl *Tmpl, TemplateSpecializationKind TSK, SourceLocation PointOfInstantiation=SourceLocation())
Note that the static data member Inst is an instantiation of the static data member template Tmpl of ...
QualType getFunctionType(QualType ResultTy, ArrayRef< QualType > Args, const FunctionProtoType::ExtProtoInfo &EPI) const
Return a normal function type with a typed argument list.
Definition: ASTContext.h:1681
void setInstantiatedFromUnnamedFieldDecl(FieldDecl *Inst, FieldDecl *Tmpl)
void setBlockVarCopyInit(const VarDecl *VD, Expr *CopyExpr, bool CanThrow)
Set the copy initialization expression of a block var decl.
void addDestruction(T *Ptr) const
If T isn't trivially destructible, calls AddDeallocation to register it for destruction.
Definition: ASTContext.h:3261
ExternalASTSource * getExternalSource() const
Retrieve a pointer to the external AST source associated with this AST context, if any.
Definition: ASTContext.h:1274
void mergeDefinitionIntoModule(NamedDecl *ND, Module *M, bool NotifyListeners=true)
Note that the definition ND has been merged into module M, and should be visible whenever M is visibl...
void setPrimaryMergedDecl(Decl *D, Decl *Primary)
Definition: ASTContext.h:1101
void setObjCMethodRedeclaration(const ObjCMethodDecl *MD, const ObjCMethodDecl *Redecl)
bool isInSameModule(const Module *M1, const Module *M2)
If the two module M1 and M2 are in the same module.
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 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 UpdateDecl(Decl *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 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 VisitDecl(Decl *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 VisitObjCIvarDecl(ObjCIvarDecl *D)
void VisitUsingPackDecl(UsingPackDecl *D)
void VisitFunctionTemplateDecl(FunctionTemplateDecl *D)
void VisitOMPDeclareReductionDecl(OMPDeclareReductionDecl *D)
RedeclarableResult VisitVarTemplateSpecializationDeclImpl(VarTemplateSpecializationDecl *D)
TODO: Unify with ClassTemplateSpecializationDecl version? May require unifying ClassTemplate(Partial)...
void VisitUsingDecl(UsingDecl *D)
void VisitObjCAtDefsFieldDecl(ObjCAtDefsFieldDecl *D)
void VisitVarTemplatePartialSpecializationDecl(VarTemplatePartialSpecializationDecl *D)
TODO: Unify with ClassTemplatePartialSpecializationDecl version? May require unifying ClassTemplate(P...
void VisitParmVarDecl(ParmVarDecl *PD)
void VisitVarTemplateDecl(VarTemplateDecl *D)
TODO: Unify with ClassTemplateDecl version? May require unifying ClassTemplateDecl and VarTemplateDec...
static void attachPreviousDecl(ASTReader &Reader, Decl *D, Decl *Previous, Decl *Canon)
std::pair< uint64_t, uint64_t > VisitDeclContext(DeclContext *DC)
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:383
bool isDeclIDFromModule(GlobalDeclID ID, ModuleFile &M) const
Returns true if global DeclID ID originated from module M.
Definition: ASTReader.cpp:7888
DiagnosticBuilder Diag(unsigned DiagID) const
Report a diagnostic.
Definition: ASTReader.cpp:9870
ASTContext & getContext()
Retrieve the AST context that this AST reader supplements.
Definition: ASTReader.h:2501
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:2077
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...
Definition: ASTReader.cpp:7908
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:2087
SourceLocation ReadSourceLocation(ModuleFile &MF, RawLocEncoding Raw, LocSeq *Seq=nullptr) const
Read a source location from raw form.
Definition: ASTReader.h:2370
LocalDeclID mapGlobalIDToModuleFileGlobalID(ModuleFile &M, GlobalDeclID GlobalID)
Map a global declaration ID into the declaration ID used to refer to this declaration within the give...
Definition: ASTReader.cpp:8108
QualType GetType(serialization::TypeID ID)
Resolve a type ID into a type, potentially building a new type.
Definition: ASTReader.cpp:7331
IdentifierResolver & getIdResolver()
Get the identifier resolver used for name lookup / updates in the translation unit scope.
Decl * GetDecl(GlobalDeclID ID)
Resolve a declaration ID into a declaration, potentially building a new declaration.
Definition: ASTReader.cpp:8087
Module * getSubmodule(serialization::SubmoduleID GlobalID)
Retrieve the submodule that corresponds to a global submodule ID.
Definition: ASTReader.cpp:9434
void mergeDefinitionVisibility(NamedDecl *Def, NamedDecl *MergedDef)
Note that MergedDef is a redefinition of the canonical definition Def, so Def should be visible whene...
Definition: ASTReader.cpp:4477
void runWithSufficientStackSpace(SourceLocation Loc, llvm::function_ref< void()> Fn)
Definition: ASTReader.cpp:9878
SmallVector< uint64_t, 64 > RecordData
Definition: ASTReader.h:398
An object for streaming information from a record.
bool readBool()
Read a boolean value, advancing Idx.
std::string readString()
Read a string, 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.
Definition: ASTReader.cpp:7292
SourceRange readSourceRange(LocSeq *Seq=nullptr)
Read a source range, 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.
SourceLocation readSourceLocation(LocSeq *Seq=nullptr)
Read a source location, advancing Idx.
Represents an access specifier followed by colon ':'.
Definition: DeclCXX.h:86
static AccessSpecDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: DeclCXX.cpp:59
Attr - This represents one attribute.
Definition: Attr.h:43
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:4130
static BindingDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: DeclCXX.cpp:3431
A simple helper class to unpack an integer to bits and consuming the bits in order.
Definition: ASTReader.h:2563
uint32_t getNextBits(uint32_t Width)
Definition: ASTReader.h:2586
A class which contains all the information about a particular captured value.
Definition: Decl.h:4494
Represents a block literal declaration, which is like an unnamed FunctionDecl.
Definition: Decl.h:4488
void setParams(ArrayRef< ParmVarDecl * > NewParamInfo)
Definition: Decl.cpp:5254
void setDoesNotEscape(bool B=true)
Definition: Decl.h:4640
void setSignatureAsWritten(TypeSourceInfo *Sig)
Definition: Decl.h:4570
void setCanAvoidCopyToHeap(bool B=true)
Definition: Decl.h:4645
void setIsConversionFromLambda(bool val=true)
Definition: Decl.h:4635
void setBlockMissingReturnType(bool val=true)
Definition: Decl.h:4627
static BlockDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: Decl.cpp:5445
void setIsVariadic(bool value)
Definition: Decl.h:4564
void setBody(CompoundStmt *B)
Definition: Decl.h:4568
void setCaptures(ASTContext &Context, ArrayRef< Capture > Captures, bool CapturesCXXThis)
Definition: Decl.cpp:5265
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:2553
static CXXConstructorDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, uint64_t AllocKind)
Definition: DeclCXX.cpp:2795
Represents a C++ conversion function within a class.
Definition: DeclCXX.h:2885
static CXXConversionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: DeclCXX.cpp:2996
Represents a C++ deduction guide declaration.
Definition: DeclCXX.h:1967
static CXXDeductionGuideDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: DeclCXX.cpp:2261
Represents a C++ destructor within a class.
Definition: DeclCXX.h:2817
static CXXDestructorDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: DeclCXX.cpp:2942
Represents a static or instance method of a struct/union/class.
Definition: DeclCXX.h:2078
static CXXMethodDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: DeclCXX.cpp:2379
Represents a C++ struct/union/class.
Definition: DeclCXX.h:258
CXXRecordDecl * getDefinition() const
Definition: DeclCXX.h:565
static CXXRecordDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID)
Definition: DeclCXX.cpp:163
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this class is an instantiation of a member class of a class template specialization,...
Definition: DeclCXX.cpp:1977
CXXRecordDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Definition: DeclCXX.h:524
Represents the body of a CapturedStmt, and serves as its DeclContext.
Definition: Decl.h:4687
static CapturedDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumParams)
Definition: Decl.cpp:5459
void setContextParam(unsigned i, ImplicitParamDecl *P)
Definition: Decl.h:4753
void setNothrow(bool Nothrow=true)
Definition: Decl.cpp:5469
void setParam(unsigned i, ImplicitParamDecl *P)
Definition: Decl.h:4735
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)
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:124
Represents a shadow constructor declaration introduced into a class by a C++11 using-declaration that...
Definition: DeclCXX.h:3621
static ConstructorUsingShadowDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: DeclCXX.cpp:3223
static DeclAccessPair make(NamedDecl *D, AccessSpecifier AS)
The results of name lookup within a DeclContext.
Definition: DeclBase.h:1368
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Definition: DeclBase.h:1435
void setHasExternalVisibleStorage(bool ES=true) const
State whether this DeclContext has external storage for declarations visible in this context.
Definition: DeclBase.h:2682
bool isTranslationUnit() const
Definition: DeclBase.h:2165
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
Definition: DeclBase.cpp:1990
DeclContext * getPrimaryContext()
getPrimaryContext - There may be many different declarations of the same entity (including forward de...
Definition: DeclBase.cpp:1424
bool isFunctionOrMethod() const
Definition: DeclBase.h:2141
bool isValid() const
Definition: DeclID.h:124
DeclID getRawValue() const
Definition: DeclID.h:118
bool isInvalid() const
Definition: DeclID.h:126
A simple visitor class that helps create declaration visitors.
Definition: DeclVisitor.h:67
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:1050
Decl * getMostRecentDecl()
Retrieve the most recent declaration that declares the same entity as this declaration (which may be ...
Definition: DeclBase.h:1065
T * getAttr() const
Definition: DeclBase.h:576
bool hasAttrs() const
Definition: DeclBase.h:521
ASTContext & getASTContext() const LLVM_READONLY
Definition: DeclBase.cpp:520
void setOwningModuleID(unsigned ID)
Set the owning module ID.
Definition: DeclBase.cpp:126
void addAttr(Attr *A)
Definition: DeclBase.cpp:1010
void setLocalExternDecl()
Changes the namespace of this declaration to reflect that it's a function-local extern declaration.
Definition: DeclBase.h:1140
void setTopLevelDeclInObjCContainer(bool V=true)
Definition: DeclBase.h:635
void markUsed(ASTContext &C)
Mark the declaration used, in the sense of odr-use.
Definition: DeclBase.cpp:564
bool isCanonicalDecl() const
Whether this particular Decl is a canonical one.
Definition: DeclBase.h:973
Module * getOwningModule() const
Get the module that owns this declaration (for visibility purposes).
Definition: DeclBase.h:835
bool isFirstDecl() const
True if this is the first declaration in its redeclaration chain.
Definition: DeclBase.h:1059
Module * getImportedOwningModule() const
Get the imported owning module, if this decl is from an imported (non-local) module.
Definition: DeclBase.h:805
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:786
bool isTemplateParameter() const
isTemplateParameter - Determines whether this declaration is a template parameter.
Definition: DeclBase.h:2766
bool isInvalidDecl() const
Definition: DeclBase.h:591
unsigned FromASTFile
Whether this declaration was loaded from an AST file.
Definition: DeclBase.h:340
void setAccess(AccessSpecifier AS)
Definition: DeclBase.h:505
SourceLocation getLocation() const
Definition: DeclBase.h:442
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:229
void setImplicit(bool I=true)
Definition: DeclBase.h:597
void setReferenced(bool R=true)
Definition: DeclBase.h:626
void setLocation(SourceLocation L)
Definition: DeclBase.h:443
DeclContext * getDeclContext()
Definition: DeclBase.h:451
void setCachedLinkage(Linkage L) const
Definition: DeclBase.h:420
void setDeclContext(DeclContext *DC)
setDeclContext - Set both the semantic and lexical DeclContext to DC.
Definition: DeclBase.cpp:355
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
Definition: DeclBase.h:907
bool hasAttr() const
Definition: DeclBase.h:580
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
Definition: DeclBase.h:967
ModuleOwnershipKind
The kind of ownership a declaration has, for visibility purposes.
Definition: DeclBase.h:216
@ VisibleWhenImported
This declaration has an owning module, and is visible when that module is imported.
@ Unowned
This declaration is not owned by a module.
@ ReachableWhenImported
This declaration has an owning module, and is visible to lookups that occurs within that module.
@ ModulePrivate
This declaration has an owning module, but is only visible to lookups that occur within that module.
@ Visible
This declaration has an owning module, but is globally visible (typically because its owning module i...
Kind getKind() const
Definition: DeclBase.h:445
void setModuleOwnershipKind(ModuleOwnershipKind MOK)
Set whether this declaration is hidden from name lookup.
Definition: DeclBase.h:870
bool shouldEmitInExternalSource() const
Whether the definition of the declaration should be emitted in external sources.
Definition: DeclBase.cpp:1148
void setVisibleDespiteOwningModule()
Set that this declaration is globally visible, even if it came from a module that is not visible.
Definition: DeclBase.h:859
The name of a declaration.
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:735
void setInnerLocStart(SourceLocation L)
Definition: Decl.h:778
void setTypeSourceInfo(TypeSourceInfo *TI)
Definition: Decl.h:769
TypeSourceInfo * getTypeSourceInfo() const
Definition: Decl.h:764
A decomposition declaration.
Definition: DeclCXX.h:4189
static DecompositionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumBindings)
Definition: DeclCXX.cpp:3461
bool isDeduced() const
Definition: Type.h:6549
Represents an empty-declaration.
Definition: Decl.h:4926
static EmptyDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: Decl.cpp:5657
An instance of this object exists for each enum constant that is defined.
Definition: Decl.h:3291
static EnumConstantDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: Decl.cpp:5485
void setInitExpr(Expr *E)
Definition: Decl.h:3315
void setInitVal(const ASTContext &C, const llvm::APSInt &V)
Definition: Decl.h:3316
Represents an enum.
Definition: Decl.h:3861
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this enumeration is an instantiation of a member enumeration of a class template specialization,...
Definition: Decl.h:4120
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:3932
void setIntegerType(QualType T)
Set the underlying integer type.
Definition: Decl.h:4030
void setIntegerTypeSourceInfo(TypeSourceInfo *TInfo)
Set the underlying integer type source info.
Definition: Decl.h:4033
unsigned getODRHash()
Definition: Decl.cpp:4976
static EnumDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: Decl.cpp:4889
void setScoped(bool Scoped=true)
True if this tag declaration is a scoped enumeration.
Definition: Decl.h:3920
void setPromotionType(QualType T)
Set the promotion type.
Definition: Decl.h:4016
EnumDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Definition: Decl.h:3942
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:3926
Represents a standard C++ module export declaration.
Definition: Decl.h:4879
static ExportDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: Decl.cpp:5780
This represents one expression.
Definition: Expr.h:110
Represents a member of a struct/union/class.
Definition: Decl.h:3033
void setBitWidth(Expr *Width)
Set the bit-field width for this member.
Definition: Decl.h:3163
static FieldDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: Decl.cpp:4564
const VariableArrayType * CapturedVLAType
Definition: Decl.h:3089
void setRParenLoc(SourceLocation L)
Definition: Decl.h:4433
void setAsmString(StringLiteral *Asm)
Definition: Decl.h:4440
static FileScopeAsmDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: Decl.cpp:5617
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)
Definition: DeclFriend.cpp:63
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:3103
Represents a function declaration or definition.
Definition: Decl.h:1935
void setDescribedFunctionTemplate(FunctionTemplateDecl *Template)
Definition: Decl.cpp:4057
FunctionTemplateDecl * getDescribedFunctionTemplate() const
Retrieves the function template that is described by this function declaration.
Definition: Decl.cpp:4052
void setIsPureVirtual(bool P=true)
Definition: Decl.cpp:3262
void setDefaultedOrDeletedInfo(DefaultedOrDeletedFunctionInfo *Info)
Definition: Decl.cpp:3124
void setFriendConstraintRefersToEnclosingTemplate(bool V=true)
Definition: Decl.h:2577
void setHasSkippedBody(bool Skipped=true)
Definition: Decl.h:2556
static FunctionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: Decl.cpp:5435
void setUsesSEHTry(bool UST)
Definition: Decl.h:2447
void setIsMultiVersion(bool V=true)
Sets the multiversion state for this declaration and all of its redeclarations.
Definition: Decl.h:2571
void setHasWrittenPrototype(bool P=true)
State that this function has a written prototype.
Definition: Decl.h:2381
bool isExplicitlyDefaulted() const
Whether this function is explicitly defaulted.
Definition: Decl.h:2317
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this function is an instantiation of a member function of a class template specialization,...
Definition: Decl.cpp:4031
FunctionTemplateSpecializationInfo * getTemplateSpecializationInfo() const
If this function is actually a function template specialization, retrieve information about this func...
Definition: Decl.cpp:4182
void setDefaultLoc(SourceLocation NewLoc)
Definition: Decl.h:2330
void setInlineSpecified(bool I)
Set whether the "inline" keyword was specified for this function.
Definition: Decl.h:2777
TemplatedKind
The kind of templated function a FunctionDecl can be.
Definition: Decl.h:1940
@ TK_MemberSpecialization
Definition: Decl.h:1947
@ TK_DependentNonTemplate
Definition: Decl.h:1956
@ TK_FunctionTemplateSpecialization
Definition: Decl.h:1951
@ TK_DependentFunctionTemplateSpecialization
Definition: Decl.h:1954
void setTrivial(bool IT)
Definition: Decl.h:2306
TemplatedKind getTemplatedKind() const
What kind of templated function this is.
Definition: Decl.cpp:4003
void setInstantiatedFromDecl(FunctionDecl *FD)
Specify that this function declaration was instantiated from a FunctionDecl FD.
Definition: Decl.cpp:4070
bool isDeletedAsWritten() const
Definition: Decl.h:2472
void setHasInheritedPrototype(bool P=true)
State that this function inherited its prototype from a previous declaration.
Definition: Decl.h:2393
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:4236
void setVirtualAsWritten(bool V)
State that this function is marked as virtual explicitly.
Definition: Decl.h:2284
void setLateTemplateParsed(bool ILT=true)
State that this templated function will be late parsed.
Definition: Decl.h:2297
void setImplicitlyInline(bool I=true)
Flag that this function is implicitly inline.
Definition: Decl.h:2791
void setTrivialForCall(bool IT)
Definition: Decl.h:2309
bool isDefaulted() const
Whether this function is defaulted.
Definition: Decl.h:2313
void setIneligibleOrNotSelected(bool II)
Definition: Decl.h:2349
void setConstexprKind(ConstexprSpecKind CSK)
Definition: Decl.h:2401
void setDefaulted(bool D=true)
Definition: Decl.h:2314
void setStorageClass(StorageClass SClass)
Sets the storage class as written in the source.
Definition: Decl.h:2768
void setDeletedAsWritten(bool D=true, StringLiteral *Message=nullptr)
Definition: Decl.cpp:3133
void setExplicitlyDefaulted(bool ED=true)
State that this function is explicitly defaulted.
Definition: Decl.h:2322
void setHasImplicitReturnZero(bool IRZ)
State that falling off this function implicitly returns null/zero.
Definition: Decl.h:2363
Represents a prototype with parameter type info, e.g.
Definition: Type.h:5107
ExceptionSpecificationType getExceptionSpecType() const
Get the kind of exception specification on this function.
Definition: Type.h:5387
Declaration of a template function.
Definition: DeclTemplate.h:959
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 ...
Definition: DeclTemplate.h:472
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)
Definition: DeclTemplate.h:604
FunctionDecl * getFunction() const
Retrieve the declaration of the function template specialization.
Definition: DeclTemplate.h:524
FunctionType - C99 6.7.5.3 - Function Declarators.
Definition: Type.h:4321
QualType getReturnType() const
Definition: Type.h:4648
HLSLBufferDecl - Represent a cbuffer or tbuffer declaration.
Definition: Decl.h:4941
static HLSLBufferDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: Decl.cpp:5690
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 - Iterate over the decls of a specified declaration name.
IdentifierResolver - Keeps track of shadowed decls on enclosing scopes.
iterator begin(DeclarationName Name)
Returns an iterator over decls with the name 'Name'.
bool tryAddTopLevelDecl(NamedDecl *D, DeclarationName Name)
Try to add the given declaration to the top level scope, if it (or a redeclaration of it) hasn't alre...
iterator end()
Returns the end iterator.
static ImplicitConceptSpecializationDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID, unsigned NumTemplateArgs)
static ImplicitParamDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: Decl.cpp:5416
Describes a module import declaration, which makes the contents of the named module visible in the cu...
Definition: Decl.h:4800
static ImportDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumLocations)
Create a new, deserialized module import declaration.
Definition: Decl.cpp:5747
Represents a field injected from an anonymous union/struct into the parent scope.
Definition: Decl.h:3335
static IndirectFieldDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: Decl.cpp:5512
void setInherited(bool I)
Definition: Attr.h:155
Description of a constructor that was inherited from a base class.
Definition: DeclCXX.h:2524
Represents the declaration of a label.
Definition: Decl.h:503
static LabelDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: Decl.cpp:5376
Describes the capture of a variable or of this, or of a C++1y init-capture.
Definition: LambdaCapture.h:25
LambdaCaptureKind getCaptureKind() const
Determine the kind of capture.
Definition: ExprCXX.cpp:1245
Implicit declaration of a temporary that was materialized by a MaterializeTemporaryExpr and lifetime-...
Definition: DeclCXX.h:3252
unsigned getManglingNumber() const
Definition: DeclCXX.h:3301
static LifetimeExtendedTemporaryDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: DeclCXX.h:3282
Represents a linkage specification.
Definition: DeclCXX.h:2957
static LinkageSpecDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: DeclCXX.cpp:3042
Represents the results of name lookup.
Definition: Lookup.h:46
A global _GUID constant.
Definition: DeclCXX.h:4312
An instance of this class represents the declaration of a property member.
Definition: DeclCXX.h:4258
static MSPropertyDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: DeclCXX.cpp:3500
Provides information a specialization of a member of a class template, which may be a member function...
Definition: DeclTemplate.h:620
void setPointOfInstantiation(SourceLocation POI)
Set the first point of instantiation.
Definition: DeclTemplate.h:665
Provides common interface for the Decls that cannot be redeclared, but can be merged if the same decl...
Definition: Redeclarable.h:313
Describes a module or submodule.
Definition: Module.h:115
@ AllVisible
All of the names in this module are visible.
Definition: Module.h:418
std::string Name
The name of this module.
Definition: Module.h:118
bool isGlobalModule() const
Does this Module scope describe a fragment of the global module within some C++ module.
Definition: Module.h:210
@ ModuleMapModule
This is a module that was defined by a module map and built out of header files.
Definition: Module.h:129
bool isNamedModule() const
Does this Module is a named module of a standard named module?
Definition: Module.h:195
Module * getTopLevelModule()
Retrieve the top-level module for this (sub)module, which may be this module.
Definition: Module.h:693
This represents a decl that may have a name.
Definition: Decl.h:253
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
Definition: Decl.h:274
bool isPlaceholderVar(const LangOptions &LangOpts) const
Definition: Decl.cpp:1089
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
Definition: Decl.h:319
void setDeclName(DeclarationName N)
Set the name of this declaration.
Definition: Decl.h:322
Represents a C++ namespace alias.
Definition: DeclCXX.h:3143
static NamespaceAliasDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: DeclCXX.cpp:3143
Represent a C++ namespace.
Definition: Decl.h:551
static NamespaceDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: DeclCXX.cpp:3097
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
static NonTypeTemplateParmDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, bool HasTypeConstraint)
This represents '#pragma omp allocate ...' directive.
Definition: DeclOpenMP.h:474
static OMPAllocateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NVars, unsigned NClauses)
Definition: DeclOpenMP.cpp:66
Pseudo declaration for capturing expressions.
Definition: DeclOpenMP.h:383
static OMPCapturedExprDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: DeclOpenMP.cpp:183
This represents '#pragma omp declare mapper ...' directive.
Definition: DeclOpenMP.h:287
static OMPDeclareMapperDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned N)
Creates deserialized declare mapper node.
Definition: DeclOpenMP.cpp:152
This represents '#pragma omp declare reduction ...' directive.
Definition: DeclOpenMP.h:177
static OMPDeclareReductionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Create deserialized declare reduction node.
Definition: DeclOpenMP.cpp:122
This represents '#pragma omp requires...' directive.
Definition: DeclOpenMP.h:417
static OMPRequiresDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned N)
Create deserialized requires node.
Definition: DeclOpenMP.cpp:93
This represents '#pragma omp threadprivate ...' directive.
Definition: DeclOpenMP.h:110
static OMPThreadPrivateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned N)
Definition: DeclOpenMP.cpp:38
Helper data structure representing the traits in a match clause of an declare variant or metadirectiv...
Represents a field declaration created by an @defs(...).
Definition: DeclObjC.h:2029
static ObjCAtDefsFieldDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: DeclObjC.cpp:1915
ObjCCategoryDecl - Represents a category declaration.
Definition: DeclObjC.h:2328
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:2390
static ObjCCategoryDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: DeclObjC.cpp:2149
void setIvarLBraceLoc(SourceLocation Loc)
Definition: DeclObjC.h:2462
void setCategoryNameLoc(SourceLocation Loc)
Definition: DeclObjC.h:2460
void setIvarRBraceLoc(SourceLocation Loc)
Definition: DeclObjC.h:2464
bool IsClassExtension() const
Definition: DeclObjC.h:2436
ObjCCategoryImplDecl - An object of this class encapsulates a category @implementation declaration.
Definition: DeclObjC.h:2544
static ObjCCategoryImplDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: DeclObjC.cpp:2191
ObjCCompatibleAliasDecl - Represents alias of a class.
Definition: DeclObjC.h:2774
static ObjCCompatibleAliasDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: DeclObjC.cpp:2341
void setClassInterface(ObjCInterfaceDecl *D)
Definition: DeclObjC.h:2794
ObjCContainerDecl - Represents a container for method declarations.
Definition: DeclObjC.h:947
void setAtStartLoc(SourceLocation Loc)
Definition: DeclObjC.h:1097
void setAtEndRange(SourceRange atEnd)
Definition: DeclObjC.h:1104
ObjCImplementationDecl - Represents a class definition - this is where method definitions are specifi...
Definition: DeclObjC.h:2596
static ObjCImplementationDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: DeclObjC.cpp:2298
Represents an ObjC class declaration.
Definition: DeclObjC.h:1153
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:440
ObjCIvarDecl * lookupInstanceVariable(IdentifierInfo *IVarName, ObjCInterfaceDecl *&ClassDeclared)
Definition: DeclObjC.cpp:635
static ObjCInterfaceDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID)
Definition: DeclObjC.cpp:1552
ObjCInterfaceDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this Objective-C class.
Definition: DeclObjC.h:1914
ObjCIvarDecl - Represents an ObjC instance variable.
Definition: DeclObjC.h:1951
void setAccessControl(AccessControl ac)
Definition: DeclObjC.h:1997
void setNextIvar(ObjCIvarDecl *ivar)
Definition: DeclObjC.h:1988
ObjCInterfaceDecl * getContainingInterface()
Return the class interface that this ivar is logically contained in; this is either the interface whe...
Definition: DeclObjC.cpp:1873
void setSynthesize(bool synth)
Definition: DeclObjC.h:2005
static ObjCIvarDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: DeclObjC.cpp:1867
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:863
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:730
static ObjCPropertyDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: DeclObjC.cpp:2361
ObjCPropertyImplDecl - Represents implementation declaration of a property in a class or category imp...
Definition: DeclObjC.h:2804
static ObjCPropertyImplDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: DeclObjC.cpp:2395
Represents an Objective-C protocol declaration.
Definition: DeclObjC.h:2083
static ObjCProtocolDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: DeclObjC.cpp:1950
ObjCProtocolDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this Objective-C protocol.
Definition: DeclObjC.h:2296
Represents the declaration of an Objective-C type parameter.
Definition: DeclObjC.h:578
static ObjCTypeParamDecl * CreateDeserialized(ASTContext &ctx, GlobalDeclID ID)
Definition: DeclObjC.cpp:1487
Stores a list of Objective-C type parameters for a parameterized class or a category/extension thereo...
Definition: DeclObjC.h:659
static ObjCTypeParamList * create(ASTContext &ctx, SourceLocation lAngleLoc, ArrayRef< ObjCTypeParamDecl * > typeParams, SourceLocation rAngleLoc)
Create a new Objective-C type parameter list.
Definition: DeclObjC.cpp:1518
Represents a parameter to a function.
Definition: Decl.h:1725
static ParmVarDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: Decl.cpp:2939
void setUninstantiatedDefaultArg(Expr *arg)
Definition: Decl.cpp:3012
void setScopeInfo(unsigned scopeDepth, unsigned parameterIndex)
Definition: Decl.h:1758
void setObjCMethodScopeInfo(unsigned parameterIndex)
Definition: Decl.h:1753
Represents a #pragma comment line.
Definition: Decl.h:146
static PragmaCommentDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned ArgSize)
Definition: Decl.cpp:5323
Represents a #pragma detect_mismatch line.
Definition: Decl.h:180
static PragmaDetectMismatchDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NameValueSize)
Definition: Decl.cpp:5349
A (possibly-)qualified type.
Definition: Type.h:929
bool isNull() const
Return true if this QualType doesn't point to a type yet.
Definition: Type.h:996
const Type * getTypePtrOrNull() const
Definition: Type.h:7940
Represents a struct/union/class.
Definition: Decl.h:4162
unsigned getODRHash()
Get precomputed ODRHash or add a new one.
Definition: Decl.cpp:5227
void setAnonymousStructOrUnion(bool Anon)
Definition: Decl.h:4218
void setArgPassingRestrictions(RecordArgPassingKind Kind)
Definition: Decl.h:4300
void setNonTrivialToPrimitiveCopy(bool V)
Definition: Decl.h:4252
void setHasNonTrivialToPrimitiveCopyCUnion(bool V)
Definition: Decl.h:4284
void setHasNonTrivialToPrimitiveDestructCUnion(bool V)
Definition: Decl.h:4276
void setHasFlexibleArrayMember(bool V)
Definition: Decl.h:4199
void setParamDestroyedInCallee(bool V)
Definition: Decl.h:4308
void setNonTrivialToPrimitiveDestroy(bool V)
Definition: Decl.h:4260
void setHasObjectMember(bool val)
Definition: Decl.h:4223
void setHasVolatileMember(bool val)
Definition: Decl.h:4227
void setHasNonTrivialToPrimitiveDefaultInitializeCUnion(bool V)
Definition: Decl.h:4268
static RecordDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID)
Definition: Decl.cpp:5051
void setNonTrivialToPrimitiveDefaultInitialize(bool V)
Definition: Decl.h:4244
Declaration of a redeclarable template.
Definition: DeclTemplate.h:721
CommonBase * Common
Pointer to the common data shared by all declarations of this template.
Definition: DeclTemplate.h:812
virtual CommonBase * newCommon(ASTContext &C) const =0
Provides common interface for the Decls that can be redeclared.
Definition: Redeclarable.h:84
decl_type * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
Definition: Redeclarable.h:203
bool isFirstDecl() const
True if this is the first declaration in its redeclaration chain.
Definition: Redeclarable.h:222
static DeclLink PreviousDeclLink(decl_type *D)
Definition: Redeclarable.h:164
Represents the body of a requires-expression.
Definition: DeclCXX.h:2047
static RequiresExprBodyDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: DeclCXX.cpp:2274
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:4081
static StaticAssertDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: DeclCXX.cpp:3408
StringLiteral - This represents a string literal expression, e.g.
Definition: Expr.h:1778
Represents the declaration of a struct/union/class/enum.
Definition: Decl.h:3578
void setTagKind(TagKind TK)
Definition: Decl.h:3777
void setCompleteDefinitionRequired(bool V=true)
True if this complete decl is required to be complete for some existing use.
Definition: Decl.h:3696
void demoteThisDefinitionToDeclaration()
Mark a definition as a declaration and maintain information it was a definition.
Definition: Decl.h:3745
bool isThisDeclarationADefinition() const
Return true if this declaration is a completion definition of the type.
Definition: Decl.h:3676
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:3711
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
Definition: Decl.h:3681
TagDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Definition: Decl.cpp:4751
void setFreeStanding(bool isFreeStanding=true)
True if this tag is free standing, e.g. "struct foo;".
Definition: Decl.h:3719
void setBraceRange(SourceRange R)
Definition: Decl.h:3658
void setCompleteDefinition(bool V=true)
True if this decl has its body fully specified.
Definition: Decl.h:3684
A convenient class for passing around template argument information.
Definition: TemplateBase.h:632
A template argument list.
Definition: DeclTemplate.h:250
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.).
Definition: DeclTemplate.h:399
NamedDecl * getTemplatedDecl() const
Get the underlying, templated declaration.
Definition: DeclTemplate.h:431
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
Definition: DeclTemplate.h:418
A template parameter object.
Stores a list of template parameters for a TemplateDecl and its derived classes.
Definition: DeclTemplate.h:73
TemplateTemplateParmDecl - Declares a template template parameter, e.g., "T" in.
static TemplateTemplateParmDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Declaration of a template type parameter.
static TemplateTypeParmDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID)
A declaration that models statements at global scope.
Definition: Decl.h:4451
static TopLevelStmtDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: Decl.cpp:5635
The top declaration context.
Definition: Decl.h:84
Represents the declaration of a typedef-name via a C++11 alias-declaration.
Definition: Decl.h:3549
static TypeAliasDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: Decl.cpp:5586
void setDescribedAliasTemplate(TypeAliasTemplateDecl *TAT)
Definition: Decl.h:3568
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:3384
void setLocStart(SourceLocation L)
Definition: Decl.h:3413
A container of type source information.
Definition: Type.h:7907
QualType getType() const
Return the type wrapped by this type source info.
Definition: Type.h:7918
const T * castAs() const
Member-template castAs<specific type>.
Definition: Type.h:8805
AutoType * getContainedAutoType() const
Get the AutoType whose type will be deduced for a variable with an initializer of this type.
Definition: Type.h:2811
DeducedType * getContainedDeducedType() const
Get the DeducedType whose type will be deduced for a variable with an initializer of this type.
Definition: Type.cpp:2045
const T * getAs() const
Member-template getAs<specific type>'.
Definition: Type.h:8736
Represents the declaration of a typedef-name via the 'typedef' type specifier.
Definition: Decl.h:3528
static TypedefDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: Decl.cpp:5573
Base class for declarations which introduce a typedef-name.
Definition: Decl.h:3427
void setModedTypeSourceInfo(TypeSourceInfo *unmodedTSI, QualType modedTy)
Definition: Decl.h:3492
void setTypeSourceInfo(TypeSourceInfo *newType)
Definition: Decl.h:3488
An artificial decl, representing a global anonymous constant value which is uniquified by value withi...
Definition: DeclCXX.h:4369
void addDecl(NamedDecl *D)
Definition: UnresolvedSet.h:92
A set of unresolved declarations.
This node is generated when a using-declaration that was annotated with attribute((using_if_exists)) ...
Definition: DeclCXX.h:4063
static UnresolvedUsingIfExistsDecl * CreateDeserialized(ASTContext &Ctx, GlobalDeclID ID)
Definition: DeclCXX.cpp:3384
Represents a dependent using declaration which was marked with typename.
Definition: DeclCXX.h:3982
static UnresolvedUsingTypenameDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: DeclCXX.cpp:3370
Represents a dependent using declaration which was not marked with typename.
Definition: DeclCXX.h:3885
static UnresolvedUsingValueDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: DeclCXX.cpp:3340
Represents a C++ using-declaration.
Definition: DeclCXX.h:3535
static UsingDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: DeclCXX.cpp:3271
Represents C++ using-directive.
Definition: DeclCXX.h:3038
static UsingDirectiveDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: DeclCXX.cpp:3064
Represents a C++ using-enum-declaration.
Definition: DeclCXX.h:3736
static UsingEnumDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: DeclCXX.cpp:3295
Represents a pack of using declarations that a single using-declarator pack-expanded into.
Definition: DeclCXX.h:3817
static UsingPackDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumExpansions)
Definition: DeclCXX.cpp:3315
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
Definition: DeclCXX.h:3343
static UsingShadowDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: DeclCXX.cpp:3199
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Definition: Decl.h:671
void setType(QualType newType)
Definition: Decl.h:683
Represents a variable declaration or definition.
Definition: Decl.h:882
ParmVarDeclBitfields ParmVarDeclBits
Definition: Decl.h:1075
static VarDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition: Decl.cpp:2146
VarDeclBitfields VarDeclBits
Definition: Decl.h:1074
EvaluatedStmt * ensureEvaluatedStmt() const
Convert the initializer for this declaration to the elaborated EvaluatedStmt form,...
Definition: Decl.cpp:2529
NonParmVarDeclBitfields NonParmVarDeclBits
Definition: Decl.h:1076
@ Definition
This declaration is definitely a definition.
Definition: Decl.h:1252
void setDescribedVarTemplate(VarTemplateDecl *Template)
Definition: Decl.cpp:2791
StorageClass getStorageClass() const
Returns the storage class as written in the source.
Definition: Decl.h:1119
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...
static VarTemplateSpecializationDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
RetTy Visit(PTR(Decl) D)
Definition: DeclVisitor.h:37
Source location and bit offset of a declaration.
Definition: ASTBitCodes.h:252
RawLocEncoding getRawLoc() const
Definition: ASTBitCodes.h:271
uint64_t getBitOffset(const uint64_t DeclTypesBlockStartOffset) const
Definition: ASTBitCodes.h:277
Information about a module that has been loaded by the ASTReader.
Definition: ModuleFile.h:130
const serialization::ObjCCategoriesInfo * ObjCCategoriesMap
Array of category list location information within this module file, sorted by the definition ID.
Definition: ModuleFile.h:469
unsigned LocalNumObjCCategoriesInMap
The number of redeclaration info entries in ObjCCategoriesMap.
Definition: ModuleFile.h:472
llvm::BitstreamCursor DeclsCursor
DeclsCursor - This is a cursor to the start of the DECLTYPES_BLOCK block.
Definition: ModuleFile.h:448
uint64_t GlobalBitOffset
The global bit offset (or base) of this module.
Definition: ModuleFile.h:216
const DeclOffset * DeclOffsets
Offset of each declaration within the bitstream, indexed by the declaration ID (-1).
Definition: ModuleFile.h:458
unsigned Generation
The generation of which this module file is a part.
Definition: ModuleFile.h:206
uint64_t DeclsBlockStartOffset
The offset to the start of the DECLTYPES_BLOCK block.
Definition: ModuleFile.h:451
SmallVector< uint64_t, 1 > ObjCCategories
The Objective-C category lists for categories known to this module.
Definition: ModuleFile.h:476
void visit(llvm::function_ref< bool(ModuleFile &M)> Visitor, llvm::SmallPtrSetImpl< ModuleFile * > *ModuleFilesHit=nullptr)
Visit each of the modules.
Class that performs name lookup into a DeclContext stored in an AST file.
const unsigned int LOCAL_REDECLARATIONS
Record code for a list of local redeclarations of a declaration.
Definition: ASTBitCodes.h:1219
DeclCode
Record codes for each kind of declaration.
Definition: ASTBitCodes.h:1227
const unsigned int DECL_UPDATES
Record of updates for a declaration that was modified after being deserialized.
Definition: ASTBitCodes.h:1215
@ DECL_EMPTY
An EmptyDecl record.
Definition: ASTBitCodes.h:1475
@ DECL_CAPTURED
A CapturedDecl record.
Definition: ASTBitCodes.h:1316
@ DECL_CXX_BASE_SPECIFIERS
A record containing CXXBaseSpecifiers.
Definition: ASTBitCodes.h:1446
@ DECL_CXX_RECORD
A CXXRecordDecl record.
Definition: ASTBitCodes.h:1377
@ DECL_VAR_TEMPLATE_PARTIAL_SPECIALIZATION
A VarTemplatePartialSpecializationDecl record.
Definition: ASTBitCodes.h:1419
@ DECL_OMP_ALLOCATE
An OMPAllocateDcl record.
Definition: ASTBitCodes.h:1472
@ DECL_MS_PROPERTY
A MSPropertyDecl record.
Definition: ASTBitCodes.h:1283
@ DECL_OMP_DECLARE_MAPPER
An OMPDeclareMapperDecl record.
Definition: ASTBitCodes.h:1496
@ DECL_TOP_LEVEL_STMT_DECL
A TopLevelStmtDecl record.
Definition: ASTBitCodes.h:1310
@ DECL_REQUIRES_EXPR_BODY
A RequiresExprBodyDecl record.
Definition: ASTBitCodes.h:1481
@ DECL_STATIC_ASSERT
A StaticAssertDecl record.
Definition: ASTBitCodes.h:1443
@ DECL_INDIRECTFIELD
A IndirectFieldDecl record.
Definition: ASTBitCodes.h:1452
@ DECL_TEMPLATE_TEMPLATE_PARM
A TemplateTemplateParmDecl record.
Definition: ASTBitCodes.h:1431
@ DECL_IMPORT
An ImportDecl recording a module import.
Definition: ASTBitCodes.h:1463
@ DECL_UNNAMED_GLOBAL_CONSTANT
A UnnamedGlobalConstantDecl record.
Definition: ASTBitCodes.h:1502
@ DECL_ACCESS_SPEC
An AccessSpecDecl record.
Definition: ASTBitCodes.h:1395
@ DECL_OBJC_TYPE_PARAM
An ObjCTypeParamDecl record.
Definition: ASTBitCodes.h:1484
@ DECL_OBJC_CATEGORY_IMPL
A ObjCCategoryImplDecl record.
Definition: ASTBitCodes.h:1265
@ DECL_ENUM_CONSTANT
An EnumConstantDecl record.
Definition: ASTBitCodes.h:1241
@ DECL_PARM_VAR
A ParmVarDecl record.
Definition: ASTBitCodes.h:1298
@ DECL_TYPEDEF
A TypedefDecl record.
Definition: ASTBitCodes.h:1229
@ DECL_EXPANDED_TEMPLATE_TEMPLATE_PARM_PACK
A TemplateTemplateParmDecl record that stores an expanded template template parameter pack.
Definition: ASTBitCodes.h:1460
@ DECL_HLSL_BUFFER
A HLSLBufferDecl record.
Definition: ASTBitCodes.h:1505
@ DECL_NAMESPACE_ALIAS
A NamespaceAliasDecl record.
Definition: ASTBitCodes.h:1344
@ DECL_TYPEALIAS
A TypeAliasDecl record.
Definition: ASTBitCodes.h:1232
@ DECL_FUNCTION_TEMPLATE
A FunctionTemplateDecl record.
Definition: ASTBitCodes.h:1422
@ DECL_MS_GUID
A MSGuidDecl record.
Definition: ASTBitCodes.h:1286
@ DECL_UNRESOLVED_USING_TYPENAME
An UnresolvedUsingTypenameDecl record.
Definition: ASTBitCodes.h:1368
@ DECL_CLASS_TEMPLATE_SPECIALIZATION
A ClassTemplateSpecializationDecl record.
Definition: ASTBitCodes.h:1407
@ DECL_FILE_SCOPE_ASM
A FileScopeAsmDecl record.
Definition: ASTBitCodes.h:1307
@ DECL_CXX_CONSTRUCTOR
A CXXConstructorDecl record.
Definition: ASTBitCodes.h:1386
@ DECL_CXX_CONVERSION
A CXXConversionDecl record.
Definition: ASTBitCodes.h:1392
@ DECL_FIELD
A FieldDecl record.
Definition: ASTBitCodes.h:1280
@ DECL_LINKAGE_SPEC
A LinkageSpecDecl record.
Definition: ASTBitCodes.h:1371
@ DECL_NAMESPACE
A NamespaceDecl record.
Definition: ASTBitCodes.h:1341
@ DECL_NON_TYPE_TEMPLATE_PARM
A NonTypeTemplateParmDecl record.
Definition: ASTBitCodes.h:1428
@ DECL_USING_PACK
A UsingPackDecl record.
Definition: ASTBitCodes.h:1353
@ DECL_FUNCTION
A FunctionDecl record.
Definition: ASTBitCodes.h:1244
@ DECL_USING_DIRECTIVE
A UsingDirecitveDecl record.
Definition: ASTBitCodes.h:1362
@ DECL_RECORD
A RecordDecl record.
Definition: ASTBitCodes.h:1238
@ DECL_CONTEXT_LEXICAL
A record that stores the set of declarations that are lexically stored within a given DeclContext.
Definition: ASTBitCodes.h:1326
@ DECL_BLOCK
A BlockDecl record.
Definition: ASTBitCodes.h:1313
@ DECL_UNRESOLVED_USING_VALUE
An UnresolvedUsingValueDecl record.
Definition: ASTBitCodes.h:1365
@ DECL_TYPE_ALIAS_TEMPLATE
A TypeAliasTemplateDecl record.
Definition: ASTBitCodes.h:1434
@ DECL_CXX_CTOR_INITIALIZERS
A record containing CXXCtorInitializers.
Definition: ASTBitCodes.h:1449
@ DECL_OBJC_CATEGORY
A ObjCCategoryDecl record.
Definition: ASTBitCodes.h:1262
@ DECL_VAR
A VarDecl record.
Definition: ASTBitCodes.h:1292
@ DECL_UNRESOLVED_USING_IF_EXISTS
An UnresolvedUsingIfExistsDecl record.
Definition: ASTBitCodes.h:1440
@ DECL_USING
A UsingDecl record.
Definition: ASTBitCodes.h:1347
@ DECL_OBJC_PROTOCOL
A ObjCProtocolDecl record.
Definition: ASTBitCodes.h:1253
@ DECL_TEMPLATE_TYPE_PARM
A TemplateTypeParmDecl record.
Definition: ASTBitCodes.h:1425
@ DECL_VAR_TEMPLATE_SPECIALIZATION
A VarTemplateSpecializationDecl record.
Definition: ASTBitCodes.h:1416
@ DECL_OBJC_IMPLEMENTATION
A ObjCImplementationDecl record.
Definition: ASTBitCodes.h:1268
@ DECL_LABEL
A LabelDecl record.
Definition: ASTBitCodes.h:1338
@ DECL_OBJC_COMPATIBLE_ALIAS
A ObjCCompatibleAliasDecl record.
Definition: ASTBitCodes.h:1271
@ DECL_CONSTRUCTOR_USING_SHADOW
A ConstructorUsingShadowDecl record.
Definition: ASTBitCodes.h:1359
@ DECL_USING_ENUM
A UsingEnumDecl record.
Definition: ASTBitCodes.h:1350
@ DECL_FRIEND_TEMPLATE
A FriendTemplateDecl record.
Definition: ASTBitCodes.h:1401
@ DECL_PRAGMA_DETECT_MISMATCH
A PragmaDetectMismatchDecl record.
Definition: ASTBitCodes.h:1493
@ DECL_EXPANDED_NON_TYPE_TEMPLATE_PARM_PACK
A NonTypeTemplateParmDecl record that stores an expanded non-type template parameter pack.
Definition: ASTBitCodes.h:1456
@ DECL_OBJC_AT_DEFS_FIELD
A ObjCAtDefsFieldDecl record.
Definition: ASTBitCodes.h:1259
@ DECL_IMPLICIT_PARAM
An ImplicitParamDecl record.
Definition: ASTBitCodes.h:1295
@ DECL_FRIEND
A FriendDecl record.
Definition: ASTBitCodes.h:1398
@ DECL_CXX_METHOD
A CXXMethodDecl record.
Definition: ASTBitCodes.h:1383
@ DECL_EXPORT
An ExportDecl record.
Definition: ASTBitCodes.h:1374
@ DECL_BINDING
A BindingDecl record.
Definition: ASTBitCodes.h:1304
@ DECL_PRAGMA_COMMENT
A PragmaCommentDecl record.
Definition: ASTBitCodes.h:1490
@ DECL_ENUM
An EnumDecl record.
Definition: ASTBitCodes.h:1235
@ DECL_DECOMPOSITION
A DecompositionDecl record.
Definition: ASTBitCodes.h:1301
@ DECL_OMP_DECLARE_REDUCTION
An OMPDeclareReductionDecl record.
Definition: ASTBitCodes.h:1499
@ DECL_OMP_THREADPRIVATE
An OMPThreadPrivateDecl record.
Definition: ASTBitCodes.h:1466
@ DECL_OBJC_METHOD
A ObjCMethodDecl record.
Definition: ASTBitCodes.h:1247
@ DECL_CXX_DESTRUCTOR
A CXXDestructorDecl record.
Definition: ASTBitCodes.h:1389
@ DECL_OMP_CAPTUREDEXPR
An OMPCapturedExprDecl record.
Definition: ASTBitCodes.h:1487
@ DECL_CLASS_TEMPLATE
A ClassTemplateDecl record.
Definition: ASTBitCodes.h:1404
@ DECL_USING_SHADOW
A UsingShadowDecl record.
Definition: ASTBitCodes.h:1356
@ DECL_CONCEPT
A ConceptDecl record.
Definition: ASTBitCodes.h:1437
@ DECL_CXX_DEDUCTION_GUIDE
A CXXDeductionGuideDecl record.
Definition: ASTBitCodes.h:1380
@ DECL_OMP_REQUIRES
An OMPRequiresDecl record.
Definition: ASTBitCodes.h:1469
@ DECL_OBJC_IVAR
A ObjCIvarDecl record.
Definition: ASTBitCodes.h:1256
@ DECL_OBJC_PROPERTY
A ObjCPropertyDecl record.
Definition: ASTBitCodes.h:1274
@ DECL_TEMPLATE_PARAM_OBJECT
A TemplateParamObjectDecl record.
Definition: ASTBitCodes.h:1289
@ DECL_OBJC_INTERFACE
A ObjCInterfaceDecl record.
Definition: ASTBitCodes.h:1250
@ DECL_VAR_TEMPLATE
A VarTemplateDecl record.
Definition: ASTBitCodes.h:1413
@ DECL_LIFETIME_EXTENDED_TEMPORARY
An LifetimeExtendedTemporaryDecl record.
Definition: ASTBitCodes.h:1478
@ DECL_CLASS_TEMPLATE_PARTIAL_SPECIALIZATION
A ClassTemplatePartialSpecializationDecl record.
Definition: ASTBitCodes.h:1410
@ DECL_IMPLICIT_CONCEPT_SPECIALIZATION
An ImplicitConceptSpecializationDecl record.
Definition: ASTBitCodes.h:1508
@ DECL_CONTEXT_VISIBLE
A record that stores the set of declarations that are visible from a given DeclContext.
Definition: ASTBitCodes.h:1335
@ DECL_OBJC_PROPERTY_IMPL
A ObjCPropertyImplDecl record.
Definition: ASTBitCodes.h:1277
Defines the Linkage enumeration and various utility functions.
const internal::VariadicAllOfMatcher< Decl > decl
Matches declarations.
ComparisonCategoryResult Compare(const T &X, const T &Y)
Helper to compare two comparable types.
Definition: Primitives.h:25
uint64_t TypeID
An ID number that refers to a type in an AST file.
Definition: ASTBitCodes.h:88
uint32_t SubmoduleID
An ID number that refers to a submodule in a module file.
Definition: ASTBitCodes.h:185
bool needsAnonymousDeclarationNumber(const NamedDecl *D)
Determine whether the given declaration needs an anonymous declaration number.
Definition: ASTCommon.cpp:472
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:72
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:92
@ UPD_CXX_INSTANTIATED_DEFAULT_MEMBER_INITIALIZER
Definition: ASTCommon.h:33
@ UPD_DECL_MARKED_OPENMP_DECLARETARGET
Definition: ASTCommon.h:42
@ UPD_CXX_POINT_OF_INSTANTIATION
Definition: ASTCommon.h:30
@ UPD_CXX_RESOLVED_EXCEPTION_SPEC
Definition: ASTCommon.h:35
@ UPD_CXX_ADDED_FUNCTION_DEFINITION
Definition: ASTCommon.h:28
@ UPD_DECL_MARKED_OPENMP_THREADPRIVATE
Definition: ASTCommon.h:40
@ UPD_CXX_INSTANTIATED_DEFAULT_ARGUMENT
Definition: ASTCommon.h:32
@ UPD_DECL_MARKED_OPENMP_ALLOCATE
Definition: ASTCommon.h:41
@ UPD_CXX_ADDED_ANONYMOUS_NAMESPACE
Definition: ASTCommon.h:27
@ UPD_CXX_INSTANTIATED_CLASS_DEFINITION
Definition: ASTCommon.h:31
The JSON file list parser is used to communicate input to InstallAPI.
SelectorLocationsKind
Whether all locations of the selector identifiers are in a "standard" position.
PragmaMSCommentKind
Definition: PragmaKinds.h:14
bool isUnresolvedExceptionSpec(ExceptionSpecificationType ESpecType)
ConstexprSpecKind
Define the kind of constexpr specifier.
Definition: Specifiers.h:35
LinkageSpecLanguageIDs
Represents the language in a linkage specification.
Definition: DeclCXX.h:2949
LazyOffsetPtr< Stmt, uint64_t, &ExternalASTSource::GetExternalDeclStmt > LazyDeclStmtPtr
A lazy pointer to a statement.
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
OMPDeclareReductionInitKind
Definition: DeclOpenMP.h:161
StorageClass
Storage classes.
Definition: Specifiers.h:248
@ SC_Extern
Definition: Specifiers.h:251
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.
@ Result
The result type of a method or function.
TagTypeKind
The kind of a tag type.
Definition: Type.h:6876
ObjCImplementationControl
Definition: DeclObjC.h:118
RecordArgPassingKind
Enum that represents the different ways arguments are passed to and returned from function calls.
Definition: Decl.h:4139
static bool isUndeducedReturnType(QualType T)
bool operator!=(CanQual< T > x, CanQual< U > y)
@ LCD_None
Definition: Lambda.h:23
for(const auto &A :T->param_types())
const FunctionProtoType * T
DeductionCandidate
Only used by CXXDeductionGuideDecl.
Definition: DeclBase.h:1407
bool shouldSkipCheckingODR(const Decl *D)
Definition: ASTReader.h:2605
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
Definition: DeclBase.h:1274
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
Definition: Specifiers.h:188
@ Interface
The "__interface" keyword introduces the elaborated-type-specifier.
@ Class
The "class" keyword introduces the elaborated-type-specifier.
@ Other
Other implicit parameter.
AccessSpecifier
A C++ access specifier (public, private, protected), plus the special value "none" which means differ...
Definition: Specifiers.h:123
unsigned long uint64_t
Structure used to store a statement, the constant value to which it was evaluated (if any),...
Definition: Decl.h:847
bool HasConstantDestruction
Whether this variable is known to have constant destruction.
Definition: Decl.h:865
bool WasEvaluated
Whether this statement was already evaluated.
Definition: Decl.h:849
LazyDeclStmtPtr Value
Definition: Decl.h:872
APValue Evaluated
Definition: Decl.h:873
bool HasConstantInitialization
Whether this variable is known to have constant initialization.
Definition: Decl.h:858
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.
Definition: DeclTemplate.h:965
llvm::FoldingSetVector< FunctionTemplateSpecializationInfo > Specializations
The function template specializations for this function template, including explicit specializations ...
Definition: DeclTemplate.h:968
A struct with extended info about a syntactic name qualifier, to be used for the case of out-of-line ...
Definition: Decl.h:708
Helper class that saves the current stream position and then restores it when destroyed.
llvm::DenseSet< std::tuple< Decl *, Decl *, int > > NonEquivalentDeclSet
Store declaration pairs already found to be non-equivalent.
Describes the categories of an Objective-C class.
Definition: ASTBitCodes.h:2065