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