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;
147 ASTRecordReader &Record;
148 ASTReader::RecordLocation Loc;
149 const GlobalDeclID ThisDeclID;
150 const SourceLocation ThisDeclLoc;
151
152 using RecordData = ASTReader::RecordData;
153
154 TypeID DeferredTypeID = 0;
155 unsigned AnonymousDeclNumber = 0;
156 GlobalDeclID NamedDeclForTagDecl = GlobalDeclID();
157 IdentifierInfo *TypedefNameForLinkage = nullptr;
158
159 /// A flag to carry the information for a decl from the entity is
160 /// used. We use it to delay the marking of the canonical decl as used until
161 /// the entire declaration is deserialized and merged.
162 bool IsDeclMarkedUsed = false;
163
164 uint64_t GetCurrentCursorOffset();
165
166 uint64_t ReadLocalOffset() {
167 uint64_t LocalOffset = Record.readInt();
168 assert(LocalOffset < Loc.Offset && "offset point after current record");
169 return LocalOffset ? Loc.Offset - LocalOffset : 0;
170 }
171
172 uint64_t ReadGlobalOffset() {
173 uint64_t Local = ReadLocalOffset();
174 return Local ? Record.getGlobalBitOffset(Local) : 0;
175 }
176
177 SourceLocation readSourceLocation() { return Record.readSourceLocation(); }
178
179 SourceRange readSourceRange() { return Record.readSourceRange(); }
180
181 TypeSourceInfo *readTypeSourceInfo() { return Record.readTypeSourceInfo(); }
182
183 GlobalDeclID readDeclID() { return Record.readDeclID(); }
184
185 std::string readString() { return Record.readString(); }
186
187 Decl *readDecl() { return Record.readDecl(); }
188
189 template <typename T> T *readDeclAs() { return Record.readDeclAs<T>(); }
190
191 serialization::SubmoduleID readSubmoduleID() {
192 if (Record.getIdx() == Record.size())
193 return 0;
194
195 return Record.getGlobalSubmoduleID(Record.readInt());
196 }
197
198 Module *readModule() { return Record.getSubmodule(readSubmoduleID()); }
199
200 void ReadCXXRecordDefinition(CXXRecordDecl *D, bool Update,
201 Decl *LambdaContext = nullptr,
202 unsigned IndexInLambdaContext = 0);
203 void ReadCXXDefinitionData(struct CXXRecordDecl::DefinitionData &Data,
204 const CXXRecordDecl *D, Decl *LambdaContext,
205 unsigned IndexInLambdaContext);
206 void ReadObjCDefinitionData(struct ObjCInterfaceDecl::DefinitionData &Data);
207 void ReadObjCDefinitionData(struct ObjCProtocolDecl::DefinitionData &Data);
208
209 static DeclContext *getPrimaryDCForAnonymousDecl(DeclContext *LexicalDC);
210
211 static NamedDecl *getAnonymousDeclForMerging(ASTReader &Reader,
212 DeclContext *DC, unsigned Index);
213 static void setAnonymousDeclForMerging(ASTReader &Reader, DeclContext *DC,
214 unsigned Index, NamedDecl *D);
215
216 /// Commit to a primary definition of the class RD, which is known to be
217 /// a definition of the class. We might not have read the definition data
218 /// for it yet. If we haven't then allocate placeholder definition data
219 /// now too.
220 static CXXRecordDecl *getOrFakePrimaryClassDefinition(ASTReader &Reader,
221 CXXRecordDecl *RD);
222
223 /// Class used to capture the result of searching for an existing
224 /// declaration of a specific kind and name, along with the ability
225 /// to update the place where this result was found (the declaration
226 /// chain hanging off an identifier or the DeclContext we searched in)
227 /// if requested.
228 class FindExistingResult {
229 ASTReader &Reader;
230 NamedDecl *New = nullptr;
231 NamedDecl *Existing = nullptr;
232 bool AddResult = false;
233 unsigned AnonymousDeclNumber = 0;
234 IdentifierInfo *TypedefNameForLinkage = nullptr;
235
236 public:
237 FindExistingResult(ASTReader &Reader) : Reader(Reader) {}
238
239 FindExistingResult(ASTReader &Reader, NamedDecl *New, NamedDecl *Existing,
240 unsigned AnonymousDeclNumber,
241 IdentifierInfo *TypedefNameForLinkage)
242 : Reader(Reader), New(New), Existing(Existing), AddResult(true),
243 AnonymousDeclNumber(AnonymousDeclNumber),
244 TypedefNameForLinkage(TypedefNameForLinkage) {}
245
246 FindExistingResult(FindExistingResult &&Other)
247 : Reader(Other.Reader), New(Other.New), Existing(Other.Existing),
248 AddResult(Other.AddResult),
249 AnonymousDeclNumber(Other.AnonymousDeclNumber),
250 TypedefNameForLinkage(Other.TypedefNameForLinkage) {
251 Other.AddResult = false;
252 }
253
254 FindExistingResult &operator=(FindExistingResult &&) = delete;
255 ~FindExistingResult();
256
257 /// Suppress the addition of this result into the known set of
258 /// names.
259 void suppress() { AddResult = false; }
260
261 operator NamedDecl *() const { return Existing; }
262
263 template <typename T> operator T *() const {
264 return dyn_cast_or_null<T>(Existing);
265 }
266 };
267
268 static DeclContext *getPrimaryContextForMerging(ASTReader &Reader,
269 DeclContext *DC);
270 FindExistingResult findExisting(NamedDecl *D);
271
272public:
274 ASTReader::RecordLocation Loc, GlobalDeclID thisDeclID,
275 SourceLocation ThisDeclLoc)
276 : Reader(Reader), MergeImpl(Reader), Record(Record), Loc(Loc),
277 ThisDeclID(thisDeclID), ThisDeclLoc(ThisDeclLoc) {}
278
279 template <typename DeclT>
281 static Decl *getMostRecentDeclImpl(...);
282 static Decl *getMostRecentDecl(Decl *D);
283
284 template <typename DeclT>
286 Decl *Previous, Decl *Canon);
287 static void attachPreviousDeclImpl(ASTReader &Reader, ...);
288 static void attachPreviousDecl(ASTReader &Reader, Decl *D, Decl *Previous,
289 Decl *Canon);
290
292 Decl *Previous);
293
294 template <typename DeclT>
295 static void attachLatestDeclImpl(Redeclarable<DeclT> *D, Decl *Latest);
296 static void attachLatestDeclImpl(...);
297 static void attachLatestDecl(Decl *D, Decl *latest);
298
299 template <typename DeclT>
301 static void markIncompleteDeclChainImpl(...);
302
304 llvm::BitstreamCursor &DeclsCursor, bool IsPartial);
305
307 void Visit(Decl *D);
308
309 void UpdateDecl(Decl *D);
310
313 Cat->NextClassCategory = Next;
314 }
315
316 void VisitDecl(Decl *D);
320 void VisitNamedDecl(NamedDecl *ND);
321 void VisitLabelDecl(LabelDecl *LD);
326 void VisitTypeDecl(TypeDecl *TD);
327 RedeclarableResult VisitTypedefNameDecl(TypedefNameDecl *TD);
332 RedeclarableResult VisitTagDecl(TagDecl *TD);
333 void VisitEnumDecl(EnumDecl *ED);
334 RedeclarableResult VisitRecordDeclImpl(RecordDecl *RD);
335 void VisitRecordDecl(RecordDecl *RD);
336 RedeclarableResult VisitCXXRecordDeclImpl(CXXRecordDecl *D);
338 RedeclarableResult
340
341 void
345
348 RedeclarableResult
350
354
358 void VisitValueDecl(ValueDecl *VD);
368 void VisitFieldDecl(FieldDecl *FD);
374 RedeclarableResult VisitVarDeclImpl(VarDecl *D);
375 void ReadVarDeclInit(VarDecl *VD);
384 void
394 void VisitUsingDecl(UsingDecl *D);
408 void VisitBlockDecl(BlockDecl *BD);
411 void VisitEmptyDecl(EmptyDecl *D);
413
416
418
419 template <typename T>
420 RedeclarableResult VisitRedeclarable(Redeclarable<T> *D);
421
422 template <typename T>
423 void mergeRedeclarable(Redeclarable<T> *D, RedeclarableResult &Redecl);
424
426 RedeclarableResult &Redecl);
427
428 template <typename T> void mergeMergeable(Mergeable<T> *D);
429
431
433
434 // FIXME: Reorder according to DeclNodes.td?
455};
456} // namespace clang
457
458namespace {
459
460/// Iterator over the redeclarations of a declaration that have already
461/// been merged into the same redeclaration chain.
462template <typename DeclT> class MergedRedeclIterator {
463 DeclT *Start = nullptr;
464 DeclT *Canonical = nullptr;
465 DeclT *Current = nullptr;
466
467public:
468 MergedRedeclIterator() = default;
469 MergedRedeclIterator(DeclT *Start) : Start(Start), Current(Start) {}
470
471 DeclT *operator*() { return Current; }
472
473 MergedRedeclIterator &operator++() {
474 if (Current->isFirstDecl()) {
475 Canonical = Current;
476 Current = Current->getMostRecentDecl();
477 } else
478 Current = Current->getPreviousDecl();
479
480 // If we started in the merged portion, we'll reach our start position
481 // eventually. Otherwise, we'll never reach it, but the second declaration
482 // we reached was the canonical declaration, so stop when we see that one
483 // again.
484 if (Current == Start || Current == Canonical)
485 Current = nullptr;
486 return *this;
487 }
488
489 friend bool operator!=(const MergedRedeclIterator &A,
490 const MergedRedeclIterator &B) {
491 return A.Current != B.Current;
492 }
493};
494
495} // namespace
496
497template <typename DeclT>
498static llvm::iterator_range<MergedRedeclIterator<DeclT>>
499merged_redecls(DeclT *D) {
500 return llvm::make_range(MergedRedeclIterator<DeclT>(D),
501 MergedRedeclIterator<DeclT>());
502}
503
504uint64_t ASTDeclReader::GetCurrentCursorOffset() {
505 return Loc.F->DeclsCursor.GetCurrentBitNo() + Loc.F->GlobalBitOffset;
506}
507
509 if (Record.readInt()) {
510 Reader.DefinitionSource[FD] =
511 Loc.F->Kind == ModuleKind::MK_MainFile ||
512 Reader.getContext().getLangOpts().BuildingPCHWithObjectFile;
513 }
514 if (auto *CD = dyn_cast<CXXConstructorDecl>(FD)) {
515 CD->setNumCtorInitializers(Record.readInt());
516 if (CD->getNumCtorInitializers())
517 CD->CtorInitializers = ReadGlobalOffset();
518 }
519 // Store the offset of the body so we can lazily load it later.
520 Reader.PendingBodies[FD] = GetCurrentCursorOffset();
521 // For now remember ThisDeclarationWasADefinition only for friend functions.
522 if (FD->getFriendObjectKind())
523 Reader.ThisDeclarationWasADefinitionSet.insert(FD);
524}
525
528
529 // At this point we have deserialized and merged the decl and it is safe to
530 // update its canonical decl to signal that the entire entity is used.
531 D->getCanonicalDecl()->Used |= IsDeclMarkedUsed;
532 IsDeclMarkedUsed = false;
533
534 if (auto *DD = dyn_cast<DeclaratorDecl>(D)) {
535 if (auto *TInfo = DD->getTypeSourceInfo())
536 Record.readTypeLoc(TInfo->getTypeLoc());
537 }
538
539 if (auto *TD = dyn_cast<TypeDecl>(D)) {
540 // We have a fully initialized TypeDecl. Read its type now.
542 assert(DeferredTypeID == 0 &&
543 "Deferred type not used for TagDecls and Typedefs");
544 else
545 TD->setTypeForDecl(Reader.GetType(DeferredTypeID).getTypePtrOrNull());
546
547 // If this is a tag declaration with a typedef name for linkage, it's safe
548 // to load that typedef now.
549 if (NamedDeclForTagDecl.isValid())
550 cast<TagDecl>(D)->TypedefNameDeclOrQualifier =
551 cast<TypedefNameDecl>(Reader.GetDecl(NamedDeclForTagDecl));
552 } else if (auto *ID = dyn_cast<ObjCInterfaceDecl>(D)) {
553 // if we have a fully initialized TypeDecl, we can safely read its type now.
554 ID->TypeForDecl = Reader.GetType(DeferredTypeID).getTypePtrOrNull();
555 } else if (auto *FD = dyn_cast<FunctionDecl>(D)) {
556 // FunctionDecl's body was written last after all other Stmts/Exprs.
557 if (Record.readInt())
559 } else if (auto *VD = dyn_cast<VarDecl>(D)) {
560 ReadVarDeclInit(VD);
561 } else if (auto *FD = dyn_cast<FieldDecl>(D)) {
562 if (FD->hasInClassInitializer() && Record.readInt()) {
563 FD->setLazyInClassInitializer(LazyDeclStmtPtr(GetCurrentCursorOffset()));
564 }
565 }
566}
567
569 BitsUnpacker DeclBits(Record.readInt());
570 auto ModuleOwnership =
571 (Decl::ModuleOwnershipKind)DeclBits.getNextBits(/*Width=*/3);
572 D->setReferenced(DeclBits.getNextBit());
573 D->Used = DeclBits.getNextBit();
574 IsDeclMarkedUsed |= D->Used;
575 D->setAccess((AccessSpecifier)DeclBits.getNextBits(/*Width=*/2));
576 D->setImplicit(DeclBits.getNextBit());
577 bool HasStandaloneLexicalDC = DeclBits.getNextBit();
578 bool HasAttrs = DeclBits.getNextBit();
580 D->InvalidDecl = DeclBits.getNextBit();
581 D->FromASTFile = true;
582
585 // We don't want to deserialize the DeclContext of a template
586 // parameter or of a parameter of a function template immediately. These
587 // entities might be used in the formulation of its DeclContext (for
588 // example, a function parameter can be used in decltype() in trailing
589 // return type of the function). Use the translation unit DeclContext as a
590 // placeholder.
591 GlobalDeclID SemaDCIDForTemplateParmDecl = readDeclID();
592 GlobalDeclID LexicalDCIDForTemplateParmDecl =
593 HasStandaloneLexicalDC ? readDeclID() : GlobalDeclID();
594 if (LexicalDCIDForTemplateParmDecl.isInvalid())
595 LexicalDCIDForTemplateParmDecl = SemaDCIDForTemplateParmDecl;
596 Reader.addPendingDeclContextInfo(D,
597 SemaDCIDForTemplateParmDecl,
598 LexicalDCIDForTemplateParmDecl);
599 D->setDeclContext(Reader.getContext().getTranslationUnitDecl());
600 } else {
601 auto *SemaDC = readDeclAs<DeclContext>();
602 auto *LexicalDC =
603 HasStandaloneLexicalDC ? readDeclAs<DeclContext>() : nullptr;
604 if (!LexicalDC)
605 LexicalDC = SemaDC;
606 // If the context is a class, we might not have actually merged it yet, in
607 // the case where the definition comes from an update record.
608 DeclContext *MergedSemaDC;
609 if (auto *RD = dyn_cast<CXXRecordDecl>(SemaDC))
610 MergedSemaDC = getOrFakePrimaryClassDefinition(Reader, RD);
611 else
612 MergedSemaDC = Reader.MergedDeclContexts.lookup(SemaDC);
613 // Avoid calling setLexicalDeclContext() directly because it uses
614 // Decl::getASTContext() internally which is unsafe during derialization.
615 D->setDeclContextsImpl(MergedSemaDC ? MergedSemaDC : SemaDC, LexicalDC,
616 Reader.getContext());
617 }
618 D->setLocation(ThisDeclLoc);
619
620 if (HasAttrs) {
621 AttrVec Attrs;
622 Record.readAttributes(Attrs);
623 // Avoid calling setAttrs() directly because it uses Decl::getASTContext()
624 // internally which is unsafe during derialization.
625 D->setAttrsImpl(Attrs, Reader.getContext());
626 }
627
628 // Determine whether this declaration is part of a (sub)module. If so, it
629 // may not yet be visible.
630 bool ModulePrivate =
631 (ModuleOwnership == Decl::ModuleOwnershipKind::ModulePrivate);
632 if (unsigned SubmoduleID = readSubmoduleID()) {
633 switch (ModuleOwnership) {
636 break;
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.
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.
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(),
908 UnsignedOrNone::fromInternalRepresentation(Record.readUInt32()));
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) {
1130 });
1131 } else
1132 mergeRedeclarable(FD, Redecl);
1133
1134 // Defer calling `setPure` until merging above has guaranteed we've set
1135 // `DefinitionData` (as this will need to access it).
1136 FD->setIsPureVirtual(Pure);
1137
1138 // Read in the parameters.
1139 unsigned NumParams = Record.readInt();
1141 Params.reserve(NumParams);
1142 for (unsigned I = 0; I != NumParams; ++I)
1143 Params.push_back(readDeclAs<ParmVarDecl>());
1144 FD->setParams(Reader.getContext(), Params);
1145
1146 // If the declaration is a SYCL kernel entry point function as indicated by
1147 // the presence of a sycl_kernel_entry_point attribute, register it so that
1148 // associated metadata is recreated.
1149 if (FD->hasAttr<SYCLKernelEntryPointAttr>()) {
1150 auto *SKEPAttr = FD->getAttr<SYCLKernelEntryPointAttr>();
1151 ASTContext &C = Reader.getContext();
1152 const SYCLKernelInfo *SKI = C.findSYCLKernelInfo(SKEPAttr->getKernelName());
1153 if (SKI) {
1155 Reader.Diag(FD->getLocation(), diag::err_sycl_kernel_name_conflict)
1156 << SKEPAttr;
1157 Reader.Diag(SKI->getKernelEntryPointDecl()->getLocation(),
1158 diag::note_previous_declaration);
1159 SKEPAttr->setInvalidAttr();
1160 }
1161 } else {
1162 C.registerSYCLEntryPointFunction(FD);
1163 }
1164 }
1165}
1166
1168 VisitNamedDecl(MD);
1169 if (Record.readInt()) {
1170 // Load the body on-demand. Most clients won't care, because method
1171 // definitions rarely show up in headers.
1172 Reader.PendingBodies[MD] = GetCurrentCursorOffset();
1173 }
1174 MD->setSelfDecl(readDeclAs<ImplicitParamDecl>());
1175 MD->setCmdDecl(readDeclAs<ImplicitParamDecl>());
1176 MD->setInstanceMethod(Record.readInt());
1177 MD->setVariadic(Record.readInt());
1178 MD->setPropertyAccessor(Record.readInt());
1179 MD->setSynthesizedAccessorStub(Record.readInt());
1180 MD->setDefined(Record.readInt());
1181 MD->setOverriding(Record.readInt());
1182 MD->setHasSkippedBody(Record.readInt());
1183
1184 MD->setIsRedeclaration(Record.readInt());
1185 MD->setHasRedeclaration(Record.readInt());
1186 if (MD->hasRedeclaration())
1187 Reader.getContext().setObjCMethodRedeclaration(MD,
1188 readDeclAs<ObjCMethodDecl>());
1189
1191 static_cast<ObjCImplementationControl>(Record.readInt()));
1192 MD->setObjCDeclQualifier((Decl::ObjCDeclQualifier)Record.readInt());
1193 MD->setRelatedResultType(Record.readInt());
1194 MD->setReturnType(Record.readType());
1195 MD->setReturnTypeSourceInfo(readTypeSourceInfo());
1196 MD->DeclEndLoc = readSourceLocation();
1197 unsigned NumParams = Record.readInt();
1199 Params.reserve(NumParams);
1200 for (unsigned I = 0; I != NumParams; ++I)
1201 Params.push_back(readDeclAs<ParmVarDecl>());
1202
1203 MD->setSelLocsKind((SelectorLocationsKind)Record.readInt());
1204 unsigned NumStoredSelLocs = Record.readInt();
1206 SelLocs.reserve(NumStoredSelLocs);
1207 for (unsigned i = 0; i != NumStoredSelLocs; ++i)
1208 SelLocs.push_back(readSourceLocation());
1209
1210 MD->setParamsAndSelLocs(Reader.getContext(), Params, SelLocs);
1211}
1212
1215
1216 D->Variance = Record.readInt();
1217 D->Index = Record.readInt();
1218 D->VarianceLoc = readSourceLocation();
1219 D->ColonLoc = readSourceLocation();
1220}
1221
1223 VisitNamedDecl(CD);
1224 CD->setAtStartLoc(readSourceLocation());
1225 CD->setAtEndRange(readSourceRange());
1226}
1227
1229 unsigned numParams = Record.readInt();
1230 if (numParams == 0)
1231 return nullptr;
1232
1234 typeParams.reserve(numParams);
1235 for (unsigned i = 0; i != numParams; ++i) {
1236 auto *typeParam = readDeclAs<ObjCTypeParamDecl>();
1237 if (!typeParam)
1238 return nullptr;
1239
1240 typeParams.push_back(typeParam);
1241 }
1242
1243 SourceLocation lAngleLoc = readSourceLocation();
1244 SourceLocation rAngleLoc = readSourceLocation();
1245
1246 return ObjCTypeParamList::create(Reader.getContext(), lAngleLoc,
1247 typeParams, rAngleLoc);
1248}
1249
1250void ASTDeclReader::ReadObjCDefinitionData(
1251 struct ObjCInterfaceDecl::DefinitionData &Data) {
1252 // Read the superclass.
1253 Data.SuperClassTInfo = readTypeSourceInfo();
1254
1255 Data.EndLoc = readSourceLocation();
1256 Data.HasDesignatedInitializers = Record.readInt();
1257 Data.ODRHash = Record.readInt();
1258 Data.HasODRHash = true;
1259
1260 // Read the directly referenced protocols and their SourceLocations.
1261 unsigned NumProtocols = Record.readInt();
1263 Protocols.reserve(NumProtocols);
1264 for (unsigned I = 0; I != NumProtocols; ++I)
1265 Protocols.push_back(readDeclAs<ObjCProtocolDecl>());
1267 ProtoLocs.reserve(NumProtocols);
1268 for (unsigned I = 0; I != NumProtocols; ++I)
1269 ProtoLocs.push_back(readSourceLocation());
1270 Data.ReferencedProtocols.set(Protocols.data(), NumProtocols, ProtoLocs.data(),
1271 Reader.getContext());
1272
1273 // Read the transitive closure of protocols referenced by this class.
1274 NumProtocols = Record.readInt();
1275 Protocols.clear();
1276 Protocols.reserve(NumProtocols);
1277 for (unsigned I = 0; I != NumProtocols; ++I)
1278 Protocols.push_back(readDeclAs<ObjCProtocolDecl>());
1279 Data.AllReferencedProtocols.set(Protocols.data(), NumProtocols,
1280 Reader.getContext());
1281}
1282
1284 ObjCInterfaceDecl *D, struct ObjCInterfaceDecl::DefinitionData &&NewDD) {
1285 struct ObjCInterfaceDecl::DefinitionData &DD = D->data();
1286 if (DD.Definition == NewDD.Definition)
1287 return;
1288
1289 Reader.MergedDeclContexts.insert(
1290 std::make_pair(NewDD.Definition, DD.Definition));
1291 Reader.mergeDefinitionVisibility(DD.Definition, NewDD.Definition);
1292
1293 if (D->getODRHash() != NewDD.ODRHash)
1294 Reader.PendingObjCInterfaceOdrMergeFailures[DD.Definition].push_back(
1295 {NewDD.Definition, &NewDD});
1296}
1297
1299 RedeclarableResult Redecl = VisitRedeclarable(ID);
1301 DeferredTypeID = Record.getGlobalTypeID(Record.readInt());
1302 mergeRedeclarable(ID, Redecl);
1303
1304 ID->TypeParamList = ReadObjCTypeParamList();
1305 if (Record.readInt()) {
1306 // Read the definition.
1307 ID->allocateDefinitionData();
1308
1309 ReadObjCDefinitionData(ID->data());
1310 ObjCInterfaceDecl *Canon = ID->getCanonicalDecl();
1311 if (Canon->Data.getPointer()) {
1312 // If we already have a definition, keep the definition invariant and
1313 // merge the data.
1314 MergeImpl.MergeDefinitionData(Canon, std::move(ID->data()));
1315 ID->Data = Canon->Data;
1316 } else {
1317 // Set the definition data of the canonical declaration, so other
1318 // redeclarations will see it.
1319 ID->getCanonicalDecl()->Data = ID->Data;
1320
1321 // We will rebuild this list lazily.
1322 ID->setIvarList(nullptr);
1323 }
1324
1325 // Note that we have deserialized a definition.
1326 Reader.PendingDefinitions.insert(ID);
1327
1328 // Note that we've loaded this Objective-C class.
1329 Reader.ObjCClassesLoaded.push_back(ID);
1330 } else {
1331 ID->Data = ID->getCanonicalDecl()->Data;
1332 }
1333}
1334
1336 VisitFieldDecl(IVD);
1337 IVD->setAccessControl((ObjCIvarDecl::AccessControl)Record.readInt());
1338 // This field will be built lazily.
1339 IVD->setNextIvar(nullptr);
1340 bool synth = Record.readInt();
1341 IVD->setSynthesize(synth);
1342
1343 // Check ivar redeclaration.
1344 if (IVD->isInvalidDecl())
1345 return;
1346 // Don't check ObjCInterfaceDecl as interfaces are named and mismatches can be
1347 // detected in VisitObjCInterfaceDecl. Here we are looking for redeclarations
1348 // in extensions.
1350 return;
1351 ObjCInterfaceDecl *CanonIntf =
1353 IdentifierInfo *II = IVD->getIdentifier();
1354 ObjCIvarDecl *PrevIvar = CanonIntf->lookupInstanceVariable(II);
1355 if (PrevIvar && PrevIvar != IVD) {
1356 auto *ParentExt = dyn_cast<ObjCCategoryDecl>(IVD->getDeclContext());
1357 auto *PrevParentExt =
1358 dyn_cast<ObjCCategoryDecl>(PrevIvar->getDeclContext());
1359 if (ParentExt && PrevParentExt) {
1360 // Postpone diagnostic as we should merge identical extensions from
1361 // different modules.
1362 Reader
1363 .PendingObjCExtensionIvarRedeclarations[std::make_pair(ParentExt,
1364 PrevParentExt)]
1365 .push_back(std::make_pair(IVD, PrevIvar));
1366 } else if (ParentExt || PrevParentExt) {
1367 // Duplicate ivars in extension + implementation are never compatible.
1368 // Compatibility of implementation + implementation should be handled in
1369 // VisitObjCImplementationDecl.
1370 Reader.Diag(IVD->getLocation(), diag::err_duplicate_ivar_declaration)
1371 << II;
1372 Reader.Diag(PrevIvar->getLocation(), diag::note_previous_definition);
1373 }
1374 }
1375}
1376
1377void ASTDeclReader::ReadObjCDefinitionData(
1378 struct ObjCProtocolDecl::DefinitionData &Data) {
1379 unsigned NumProtoRefs = Record.readInt();
1381 ProtoRefs.reserve(NumProtoRefs);
1382 for (unsigned I = 0; I != NumProtoRefs; ++I)
1383 ProtoRefs.push_back(readDeclAs<ObjCProtocolDecl>());
1385 ProtoLocs.reserve(NumProtoRefs);
1386 for (unsigned I = 0; I != NumProtoRefs; ++I)
1387 ProtoLocs.push_back(readSourceLocation());
1388 Data.ReferencedProtocols.set(ProtoRefs.data(), NumProtoRefs,
1389 ProtoLocs.data(), Reader.getContext());
1390 Data.ODRHash = Record.readInt();
1391 Data.HasODRHash = true;
1392}
1393
1395 ObjCProtocolDecl *D, struct ObjCProtocolDecl::DefinitionData &&NewDD) {
1396 struct ObjCProtocolDecl::DefinitionData &DD = D->data();
1397 if (DD.Definition == NewDD.Definition)
1398 return;
1399
1400 Reader.MergedDeclContexts.insert(
1401 std::make_pair(NewDD.Definition, DD.Definition));
1402 Reader.mergeDefinitionVisibility(DD.Definition, NewDD.Definition);
1403
1404 if (D->getODRHash() != NewDD.ODRHash)
1405 Reader.PendingObjCProtocolOdrMergeFailures[DD.Definition].push_back(
1406 {NewDD.Definition, &NewDD});
1407}
1408
1410 RedeclarableResult Redecl = VisitRedeclarable(PD);
1412 mergeRedeclarable(PD, Redecl);
1413
1414 if (Record.readInt()) {
1415 // Read the definition.
1416 PD->allocateDefinitionData();
1417
1418 ReadObjCDefinitionData(PD->data());
1419
1420 ObjCProtocolDecl *Canon = PD->getCanonicalDecl();
1421 if (Canon->Data.getPointer()) {
1422 // If we already have a definition, keep the definition invariant and
1423 // merge the data.
1424 MergeImpl.MergeDefinitionData(Canon, std::move(PD->data()));
1425 PD->Data = Canon->Data;
1426 } else {
1427 // Set the definition data of the canonical declaration, so other
1428 // redeclarations will see it.
1429 PD->getCanonicalDecl()->Data = PD->Data;
1430 }
1431 // Note that we have deserialized a definition.
1432 Reader.PendingDefinitions.insert(PD);
1433 } else {
1434 PD->Data = PD->getCanonicalDecl()->Data;
1435 }
1436}
1437
1441
1444 CD->setCategoryNameLoc(readSourceLocation());
1445 CD->setIvarLBraceLoc(readSourceLocation());
1446 CD->setIvarRBraceLoc(readSourceLocation());
1447
1448 // Note that this category has been deserialized. We do this before
1449 // deserializing the interface declaration, so that it will consider this
1450 /// category.
1451 Reader.CategoriesDeserialized.insert(CD);
1452
1453 CD->ClassInterface = readDeclAs<ObjCInterfaceDecl>();
1454 CD->TypeParamList = ReadObjCTypeParamList();
1455 unsigned NumProtoRefs = Record.readInt();
1457 ProtoRefs.reserve(NumProtoRefs);
1458 for (unsigned I = 0; I != NumProtoRefs; ++I)
1459 ProtoRefs.push_back(readDeclAs<ObjCProtocolDecl>());
1461 ProtoLocs.reserve(NumProtoRefs);
1462 for (unsigned I = 0; I != NumProtoRefs; ++I)
1463 ProtoLocs.push_back(readSourceLocation());
1464 CD->setProtocolList(ProtoRefs.data(), NumProtoRefs, ProtoLocs.data(),
1465 Reader.getContext());
1466
1467 // Protocols in the class extension belong to the class.
1468 if (NumProtoRefs > 0 && CD->ClassInterface && CD->IsClassExtension())
1469 CD->ClassInterface->mergeClassExtensionProtocolList(
1470 (ObjCProtocolDecl *const *)ProtoRefs.data(), NumProtoRefs,
1471 Reader.getContext());
1472}
1473
1475 VisitNamedDecl(CAD);
1476 CAD->setClassInterface(readDeclAs<ObjCInterfaceDecl>());
1477}
1478
1480 VisitNamedDecl(D);
1481 D->setAtLoc(readSourceLocation());
1482 D->setLParenLoc(readSourceLocation());
1483 QualType T = Record.readType();
1484 TypeSourceInfo *TSI = readTypeSourceInfo();
1485 D->setType(T, TSI);
1488 (ObjCPropertyAttribute::Kind)Record.readInt());
1490 (ObjCPropertyDecl::PropertyControl)Record.readInt());
1491 DeclarationName GetterName = Record.readDeclarationName();
1492 SourceLocation GetterLoc = readSourceLocation();
1493 D->setGetterName(GetterName.getObjCSelector(), GetterLoc);
1494 DeclarationName SetterName = Record.readDeclarationName();
1495 SourceLocation SetterLoc = readSourceLocation();
1496 D->setSetterName(SetterName.getObjCSelector(), SetterLoc);
1497 D->setGetterMethodDecl(readDeclAs<ObjCMethodDecl>());
1498 D->setSetterMethodDecl(readDeclAs<ObjCMethodDecl>());
1499 D->setPropertyIvarDecl(readDeclAs<ObjCIvarDecl>());
1500}
1501
1504 D->setClassInterface(readDeclAs<ObjCInterfaceDecl>());
1505}
1506
1509 D->CategoryNameLoc = readSourceLocation();
1510}
1511
1514 D->setSuperClass(readDeclAs<ObjCInterfaceDecl>());
1515 D->SuperLoc = readSourceLocation();
1516 D->setIvarLBraceLoc(readSourceLocation());
1517 D->setIvarRBraceLoc(readSourceLocation());
1518 D->setHasNonZeroConstructors(Record.readInt());
1519 D->setHasDestructors(Record.readInt());
1520 D->NumIvarInitializers = Record.readInt();
1521 if (D->NumIvarInitializers)
1522 D->IvarInitializers = ReadGlobalOffset();
1523}
1524
1526 VisitDecl(D);
1527 D->setAtLoc(readSourceLocation());
1528 D->setPropertyDecl(readDeclAs<ObjCPropertyDecl>());
1529 D->PropertyIvarDecl = readDeclAs<ObjCIvarDecl>();
1530 D->IvarLoc = readSourceLocation();
1531 D->setGetterMethodDecl(readDeclAs<ObjCMethodDecl>());
1532 D->setSetterMethodDecl(readDeclAs<ObjCMethodDecl>());
1533 D->setGetterCXXConstructor(Record.readExpr());
1534 D->setSetterCXXAssignment(Record.readExpr());
1535}
1536
1539 FD->Mutable = Record.readInt();
1540
1541 unsigned Bits = Record.readInt();
1542 FD->StorageKind = Bits >> 1;
1543 if (FD->StorageKind == FieldDecl::ISK_CapturedVLAType)
1544 FD->CapturedVLAType =
1545 cast<VariableArrayType>(Record.readType().getTypePtr());
1546 else if (Bits & 1)
1547 FD->setBitWidth(Record.readExpr());
1548
1549 if (!FD->getDeclName() ||
1550 FD->isPlaceholderVar(Reader.getContext().getLangOpts())) {
1551 if (auto *Tmpl = readDeclAs<FieldDecl>())
1552 Reader.getContext().setInstantiatedFromUnnamedFieldDecl(FD, Tmpl);
1553 }
1554 mergeMergeable(FD);
1555}
1556
1559 PD->GetterId = Record.readIdentifier();
1560 PD->SetterId = Record.readIdentifier();
1561}
1562
1564 VisitValueDecl(D);
1565 D->PartVal.Part1 = Record.readInt();
1566 D->PartVal.Part2 = Record.readInt();
1567 D->PartVal.Part3 = Record.readInt();
1568 for (auto &C : D->PartVal.Part4And5)
1569 C = Record.readInt();
1570
1571 // Add this GUID to the AST context's lookup structure, and merge if needed.
1572 if (MSGuidDecl *Existing = Reader.getContext().MSGuidDecls.GetOrInsertNode(D))
1573 Reader.getContext().setPrimaryMergedDecl(D, Existing->getCanonicalDecl());
1574}
1575
1578 VisitValueDecl(D);
1579 D->Value = Record.readAPValue();
1580
1581 // Add this to the AST context's lookup structure, and merge if needed.
1582 if (UnnamedGlobalConstantDecl *Existing =
1583 Reader.getContext().UnnamedGlobalConstantDecls.GetOrInsertNode(D))
1584 Reader.getContext().setPrimaryMergedDecl(D, Existing->getCanonicalDecl());
1585}
1586
1588 VisitValueDecl(D);
1589 D->Value = Record.readAPValue();
1590
1591 // Add this template parameter object to the AST context's lookup structure,
1592 // and merge if needed.
1593 if (TemplateParamObjectDecl *Existing =
1594 Reader.getContext().TemplateParamObjectDecls.GetOrInsertNode(D))
1595 Reader.getContext().setPrimaryMergedDecl(D, Existing->getCanonicalDecl());
1596}
1597
1599 VisitValueDecl(FD);
1600
1601 FD->ChainingSize = Record.readInt();
1602 assert(FD->ChainingSize >= 2 && "Anonymous chaining must be >= 2");
1603 FD->Chaining = new (Reader.getContext())NamedDecl*[FD->ChainingSize];
1604
1605 for (unsigned I = 0; I != FD->ChainingSize; ++I)
1606 FD->Chaining[I] = readDeclAs<NamedDecl>();
1607
1608 mergeMergeable(FD);
1609}
1610
1612 RedeclarableResult Redecl = VisitRedeclarable(VD);
1614
1615 BitsUnpacker VarDeclBits(Record.readInt());
1616 auto VarLinkage = Linkage(VarDeclBits.getNextBits(/*Width=*/3));
1617 bool DefGeneratedInModule = VarDeclBits.getNextBit();
1618 VD->VarDeclBits.SClass = (StorageClass)VarDeclBits.getNextBits(/*Width=*/3);
1619 VD->VarDeclBits.TSCSpec = VarDeclBits.getNextBits(/*Width=*/2);
1620 VD->VarDeclBits.InitStyle = VarDeclBits.getNextBits(/*Width=*/2);
1621 VD->VarDeclBits.ARCPseudoStrong = VarDeclBits.getNextBit();
1622 bool HasDeducedType = false;
1623 if (!isa<ParmVarDecl>(VD)) {
1624 VD->NonParmVarDeclBits.IsThisDeclarationADemotedDefinition =
1625 VarDeclBits.getNextBit();
1626 VD->NonParmVarDeclBits.ExceptionVar = VarDeclBits.getNextBit();
1627 VD->NonParmVarDeclBits.NRVOVariable = VarDeclBits.getNextBit();
1628 VD->NonParmVarDeclBits.CXXForRangeDecl = VarDeclBits.getNextBit();
1629
1630 VD->NonParmVarDeclBits.IsInline = VarDeclBits.getNextBit();
1631 VD->NonParmVarDeclBits.IsInlineSpecified = VarDeclBits.getNextBit();
1632 VD->NonParmVarDeclBits.IsConstexpr = VarDeclBits.getNextBit();
1633 VD->NonParmVarDeclBits.IsInitCapture = VarDeclBits.getNextBit();
1634 VD->NonParmVarDeclBits.PreviousDeclInSameBlockScope =
1635 VarDeclBits.getNextBit();
1636
1637 VD->NonParmVarDeclBits.EscapingByref = VarDeclBits.getNextBit();
1638 HasDeducedType = VarDeclBits.getNextBit();
1639 VD->NonParmVarDeclBits.ImplicitParamKind =
1640 VarDeclBits.getNextBits(/*Width*/ 3);
1641
1642 VD->NonParmVarDeclBits.ObjCForDecl = VarDeclBits.getNextBit();
1643 VD->NonParmVarDeclBits.IsCXXForRangeImplicitVar = VarDeclBits.getNextBit();
1644 }
1645
1646 // If this variable has a deduced type, defer reading that type until we are
1647 // done deserializing this variable, because the type might refer back to the
1648 // variable.
1649 if (HasDeducedType)
1650 Reader.PendingDeducedVarTypes.push_back({VD, DeferredTypeID});
1651 else
1652 VD->setType(Reader.GetType(DeferredTypeID));
1653 DeferredTypeID = 0;
1654
1655 VD->setCachedLinkage(VarLinkage);
1656
1657 // Reconstruct the one piece of the IdentifierNamespace that we need.
1658 if (VD->getStorageClass() == SC_Extern && VarLinkage != Linkage::None &&
1660 VD->setLocalExternDecl();
1661
1662 if (DefGeneratedInModule) {
1663 Reader.DefinitionSource[VD] =
1664 Loc.F->Kind == ModuleKind::MK_MainFile ||
1665 Reader.getContext().getLangOpts().BuildingPCHWithObjectFile;
1666 }
1667
1668 if (VD->hasAttr<BlocksAttr>()) {
1669 Expr *CopyExpr = Record.readExpr();
1670 if (CopyExpr)
1671 Reader.getContext().setBlockVarCopyInit(VD, CopyExpr, Record.readInt());
1672 }
1673
1674 enum VarKind {
1675 VarNotTemplate = 0, VarTemplate, StaticDataMemberSpecialization
1676 };
1677 switch ((VarKind)Record.readInt()) {
1678 case VarNotTemplate:
1679 // Only true variables (not parameters or implicit parameters) can be
1680 // merged; the other kinds are not really redeclarable at all.
1681 if (!isa<ParmVarDecl>(VD) && !isa<ImplicitParamDecl>(VD) &&
1683 mergeRedeclarable(VD, Redecl);
1684 break;
1685 case VarTemplate:
1686 // Merged when we merge the template.
1687 VD->setDescribedVarTemplate(readDeclAs<VarTemplateDecl>());
1688 break;
1689 case StaticDataMemberSpecialization: { // HasMemberSpecializationInfo.
1690 auto *Tmpl = readDeclAs<VarDecl>();
1691 auto TSK = (TemplateSpecializationKind)Record.readInt();
1692 SourceLocation POI = readSourceLocation();
1693 Reader.getContext().setInstantiatedFromStaticDataMember(VD, Tmpl, TSK,POI);
1694 mergeRedeclarable(VD, Redecl);
1695 break;
1696 }
1697 }
1698
1699 return Redecl;
1700}
1701
1703 if (uint64_t Val = Record.readInt()) {
1704 EvaluatedStmt *Eval = VD->ensureEvaluatedStmt();
1705 Eval->HasConstantInitialization = (Val & 2) != 0;
1706 Eval->HasConstantDestruction = (Val & 4) != 0;
1707 Eval->WasEvaluated = (Val & 8) != 0;
1708 Eval->HasSideEffects = (Val & 16) != 0;
1709 Eval->CheckedForSideEffects = true;
1710 if (Eval->WasEvaluated) {
1711 Eval->Evaluated = Record.readAPValue();
1712 if (Eval->Evaluated.needsCleanup())
1713 Reader.getContext().addDestruction(&Eval->Evaluated);
1714 }
1715
1716 // Store the offset of the initializer. Don't deserialize it yet: it might
1717 // not be needed, and might refer back to the variable, for example if it
1718 // contains a lambda.
1719 Eval->Value = GetCurrentCursorOffset();
1720 }
1721}
1722
1726
1728 VisitVarDecl(PD);
1729
1730 unsigned scopeIndex = Record.readInt();
1731 BitsUnpacker ParmVarDeclBits(Record.readInt());
1732 unsigned isObjCMethodParam = ParmVarDeclBits.getNextBit();
1733 unsigned scopeDepth = ParmVarDeclBits.getNextBits(/*Width=*/7);
1734 unsigned declQualifier = ParmVarDeclBits.getNextBits(/*Width=*/7);
1735 if (isObjCMethodParam) {
1736 assert(scopeDepth == 0);
1737 PD->setObjCMethodScopeInfo(scopeIndex);
1738 PD->ParmVarDeclBits.ScopeDepthOrObjCQuals = declQualifier;
1739 } else {
1740 PD->setScopeInfo(scopeDepth, scopeIndex);
1741 }
1742 PD->ParmVarDeclBits.IsKNRPromoted = ParmVarDeclBits.getNextBit();
1743
1744 PD->ParmVarDeclBits.HasInheritedDefaultArg = ParmVarDeclBits.getNextBit();
1745 if (ParmVarDeclBits.getNextBit()) // hasUninstantiatedDefaultArg.
1746 PD->setUninstantiatedDefaultArg(Record.readExpr());
1747
1748 if (ParmVarDeclBits.getNextBit()) // Valid explicit object parameter
1749 PD->ExplicitObjectParameterIntroducerLoc = Record.readSourceLocation();
1750
1751 // FIXME: If this is a redeclaration of a function from another module, handle
1752 // inheritance of default arguments.
1753}
1754
1756 VisitVarDecl(DD);
1757 auto **BDs = DD->getTrailingObjects();
1758 for (unsigned I = 0; I != DD->NumBindings; ++I) {
1759 BDs[I] = readDeclAs<BindingDecl>();
1760 BDs[I]->setDecomposedDecl(DD);
1761 }
1762}
1763
1765 VisitValueDecl(BD);
1766 BD->Binding = Record.readExpr();
1767}
1768
1770 VisitDecl(AD);
1771 AD->setAsmString(cast<StringLiteral>(Record.readExpr()));
1772 AD->setRParenLoc(readSourceLocation());
1773}
1774
1776 VisitDecl(D);
1777 D->Statement = Record.readStmt();
1778}
1779
1781 VisitDecl(BD);
1782 BD->setBody(cast_or_null<CompoundStmt>(Record.readStmt()));
1783 BD->setSignatureAsWritten(readTypeSourceInfo());
1784 unsigned NumParams = Record.readInt();
1786 Params.reserve(NumParams);
1787 for (unsigned I = 0; I != NumParams; ++I)
1788 Params.push_back(readDeclAs<ParmVarDecl>());
1789 BD->setParams(Params);
1790
1791 BD->setIsVariadic(Record.readInt());
1792 BD->setBlockMissingReturnType(Record.readInt());
1793 BD->setIsConversionFromLambda(Record.readInt());
1794 BD->setDoesNotEscape(Record.readInt());
1795 BD->setCanAvoidCopyToHeap(Record.readInt());
1796
1797 bool capturesCXXThis = Record.readInt();
1798 unsigned numCaptures = Record.readInt();
1800 captures.reserve(numCaptures);
1801 for (unsigned i = 0; i != numCaptures; ++i) {
1802 auto *decl = readDeclAs<VarDecl>();
1803 unsigned flags = Record.readInt();
1804 bool byRef = (flags & 1);
1805 bool nested = (flags & 2);
1806 Expr *copyExpr = ((flags & 4) ? Record.readExpr() : nullptr);
1807
1808 captures.push_back(BlockDecl::Capture(decl, byRef, nested, copyExpr));
1809 }
1810 BD->setCaptures(Reader.getContext(), captures, capturesCXXThis);
1811}
1812
1814 // NumParams is deserialized by OutlinedFunctionDecl::CreateDeserialized().
1815 VisitDecl(D);
1816 for (unsigned I = 0; I < D->NumParams; ++I)
1817 D->setParam(I, readDeclAs<ImplicitParamDecl>());
1818 D->setNothrow(Record.readInt() != 0);
1819 D->setBody(cast_or_null<Stmt>(Record.readStmt()));
1820}
1821
1823 VisitDecl(CD);
1824 unsigned ContextParamPos = Record.readInt();
1825 CD->setNothrow(Record.readInt() != 0);
1826 // Body is set by VisitCapturedStmt.
1827 for (unsigned I = 0; I < CD->NumParams; ++I) {
1828 if (I != ContextParamPos)
1829 CD->setParam(I, readDeclAs<ImplicitParamDecl>());
1830 else
1831 CD->setContextParam(I, readDeclAs<ImplicitParamDecl>());
1832 }
1833}
1834
1836 VisitDecl(D);
1837 D->setLanguage(static_cast<LinkageSpecLanguageIDs>(Record.readInt()));
1838 D->setExternLoc(readSourceLocation());
1839 D->setRBraceLoc(readSourceLocation());
1840}
1841
1843 VisitDecl(D);
1844 D->RBraceLoc = readSourceLocation();
1845}
1846
1848 VisitNamedDecl(D);
1849 D->setLocStart(readSourceLocation());
1850}
1851
1853 RedeclarableResult Redecl = VisitRedeclarable(D);
1854 VisitNamedDecl(D);
1855
1856 BitsUnpacker NamespaceDeclBits(Record.readInt());
1857 D->setInline(NamespaceDeclBits.getNextBit());
1858 D->setNested(NamespaceDeclBits.getNextBit());
1859 D->LocStart = readSourceLocation();
1860 D->RBraceLoc = readSourceLocation();
1861
1862 // Defer loading the anonymous namespace until we've finished merging
1863 // this namespace; loading it might load a later declaration of the
1864 // same namespace, and we have an invariant that older declarations
1865 // get merged before newer ones try to merge.
1866 GlobalDeclID AnonNamespace;
1867 if (Redecl.getFirstID() == ThisDeclID)
1868 AnonNamespace = readDeclID();
1869
1870 mergeRedeclarable(D, Redecl);
1871
1872 if (AnonNamespace.isValid()) {
1873 // Each module has its own anonymous namespace, which is disjoint from
1874 // any other module's anonymous namespaces, so don't attach the anonymous
1875 // namespace at all.
1876 auto *Anon = cast<NamespaceDecl>(Reader.GetDecl(AnonNamespace));
1877 if (!Record.isModule())
1878 D->setAnonymousNamespace(Anon);
1879 }
1880}
1881
1883 VisitNamedDecl(D);
1884 LookupBlockOffsets Offsets;
1885 VisitDeclContext(D, Offsets);
1886 D->IsCBuffer = Record.readBool();
1887 D->KwLoc = readSourceLocation();
1888 D->LBraceLoc = readSourceLocation();
1889 D->RBraceLoc = readSourceLocation();
1890}
1891
1893 RedeclarableResult Redecl = VisitRedeclarable(D);
1894 VisitNamedDecl(D);
1895 D->NamespaceLoc = readSourceLocation();
1896 D->IdentLoc = readSourceLocation();
1897 D->QualifierLoc = Record.readNestedNameSpecifierLoc();
1898 D->Namespace = readDeclAs<NamespaceBaseDecl>();
1899 mergeRedeclarable(D, Redecl);
1900}
1901
1903 VisitNamedDecl(D);
1904 D->setUsingLoc(readSourceLocation());
1905 D->QualifierLoc = Record.readNestedNameSpecifierLoc();
1906 D->DNLoc = Record.readDeclarationNameLoc(D->getDeclName());
1907 D->FirstUsingShadow.setPointer(readDeclAs<UsingShadowDecl>());
1908 D->setTypename(Record.readInt());
1909 if (auto *Pattern = readDeclAs<NamedDecl>())
1910 Reader.getContext().setInstantiatedFromUsingDecl(D, Pattern);
1911 mergeMergeable(D);
1912}
1913
1915 VisitNamedDecl(D);
1916 D->setUsingLoc(readSourceLocation());
1917 D->setEnumLoc(readSourceLocation());
1918 D->setEnumType(Record.readTypeSourceInfo());
1919 D->FirstUsingShadow.setPointer(readDeclAs<UsingShadowDecl>());
1920 if (auto *Pattern = readDeclAs<UsingEnumDecl>())
1921 Reader.getContext().setInstantiatedFromUsingEnumDecl(D, Pattern);
1922 mergeMergeable(D);
1923}
1924
1926 VisitNamedDecl(D);
1927 D->InstantiatedFrom = readDeclAs<NamedDecl>();
1928 auto **Expansions = D->getTrailingObjects();
1929 for (unsigned I = 0; I != D->NumExpansions; ++I)
1930 Expansions[I] = readDeclAs<NamedDecl>();
1931 mergeMergeable(D);
1932}
1933
1935 RedeclarableResult Redecl = VisitRedeclarable(D);
1936 VisitNamedDecl(D);
1937 D->Underlying = readDeclAs<NamedDecl>();
1938 D->IdentifierNamespace = Record.readInt();
1939 D->UsingOrNextShadow = readDeclAs<NamedDecl>();
1940 auto *Pattern = readDeclAs<UsingShadowDecl>();
1941 if (Pattern)
1942 Reader.getContext().setInstantiatedFromUsingShadowDecl(D, Pattern);
1943 mergeRedeclarable(D, Redecl);
1944}
1945
1949 D->NominatedBaseClassShadowDecl = readDeclAs<ConstructorUsingShadowDecl>();
1950 D->ConstructedBaseClassShadowDecl = readDeclAs<ConstructorUsingShadowDecl>();
1951 D->IsVirtual = Record.readInt();
1952}
1953
1955 VisitNamedDecl(D);
1956 D->UsingLoc = readSourceLocation();
1957 D->NamespaceLoc = readSourceLocation();
1958 D->QualifierLoc = Record.readNestedNameSpecifierLoc();
1959 D->NominatedNamespace = readDeclAs<NamedDecl>();
1960 D->CommonAncestor = readDeclAs<DeclContext>();
1961}
1962
1964 VisitValueDecl(D);
1965 D->setUsingLoc(readSourceLocation());
1966 D->QualifierLoc = Record.readNestedNameSpecifierLoc();
1967 D->DNLoc = Record.readDeclarationNameLoc(D->getDeclName());
1968 D->EllipsisLoc = readSourceLocation();
1969 mergeMergeable(D);
1970}
1971
1974 VisitTypeDecl(D);
1975 D->TypenameLocation = readSourceLocation();
1976 D->QualifierLoc = Record.readNestedNameSpecifierLoc();
1977 D->EllipsisLoc = readSourceLocation();
1978 mergeMergeable(D);
1979}
1980
1985
1986void ASTDeclReader::ReadCXXDefinitionData(
1987 struct CXXRecordDecl::DefinitionData &Data, const CXXRecordDecl *D,
1988 Decl *LambdaContext, unsigned IndexInLambdaContext) {
1989
1990 BitsUnpacker CXXRecordDeclBits = Record.readInt();
1991
1992#define FIELD(Name, Width, Merge) \
1993 if (!CXXRecordDeclBits.canGetNextNBits(Width)) \
1994 CXXRecordDeclBits.updateValue(Record.readInt()); \
1995 Data.Name = CXXRecordDeclBits.getNextBits(Width);
1996
1997#include "clang/AST/CXXRecordDeclDefinitionBits.def"
1998#undef FIELD
1999
2000 // Note: the caller has deserialized the IsLambda bit already.
2001 Data.ODRHash = Record.readInt();
2002 Data.HasODRHash = true;
2003
2004 if (Record.readInt()) {
2005 Reader.DefinitionSource[D] =
2006 Loc.F->Kind == ModuleKind::MK_MainFile ||
2007 Reader.getContext().getLangOpts().BuildingPCHWithObjectFile;
2008 }
2009
2010 Record.readUnresolvedSet(Data.Conversions);
2011 Data.ComputedVisibleConversions = Record.readInt();
2012 if (Data.ComputedVisibleConversions)
2013 Record.readUnresolvedSet(Data.VisibleConversions);
2014 assert(Data.Definition && "Data.Definition should be already set!");
2015
2016 if (!Data.IsLambda) {
2017 assert(!LambdaContext && !IndexInLambdaContext &&
2018 "given lambda context for non-lambda");
2019
2020 Data.NumBases = Record.readInt();
2021 if (Data.NumBases)
2022 Data.Bases = ReadGlobalOffset();
2023
2024 Data.NumVBases = Record.readInt();
2025 if (Data.NumVBases)
2026 Data.VBases = ReadGlobalOffset();
2027
2028 Data.FirstFriend = readDeclID().getRawValue();
2029 } else {
2030 using Capture = LambdaCapture;
2031
2032 auto &Lambda = static_cast<CXXRecordDecl::LambdaDefinitionData &>(Data);
2033
2034 BitsUnpacker LambdaBits(Record.readInt());
2035 Lambda.DependencyKind = LambdaBits.getNextBits(/*Width=*/2);
2036 Lambda.IsGenericLambda = LambdaBits.getNextBit();
2037 Lambda.CaptureDefault = LambdaBits.getNextBits(/*Width=*/2);
2038 Lambda.NumCaptures = LambdaBits.getNextBits(/*Width=*/15);
2039 Lambda.HasKnownInternalLinkage = LambdaBits.getNextBit();
2040
2041 Lambda.NumExplicitCaptures = Record.readInt();
2042 Lambda.ManglingNumber = Record.readInt();
2043 if (unsigned DeviceManglingNumber = Record.readInt())
2044 Reader.getContext().DeviceLambdaManglingNumbers[D] = DeviceManglingNumber;
2045 Lambda.IndexInContext = IndexInLambdaContext;
2046 Lambda.ContextDecl = LambdaContext;
2047 Capture *ToCapture = nullptr;
2048 if (Lambda.NumCaptures) {
2049 ToCapture = (Capture *)Reader.getContext().Allocate(sizeof(Capture) *
2050 Lambda.NumCaptures);
2051 Lambda.AddCaptureList(Reader.getContext(), ToCapture);
2052 }
2053 Lambda.MethodTyInfo = readTypeSourceInfo();
2054 for (unsigned I = 0, N = Lambda.NumCaptures; I != N; ++I) {
2055 SourceLocation Loc = readSourceLocation();
2056 BitsUnpacker CaptureBits(Record.readInt());
2057 bool IsImplicit = CaptureBits.getNextBit();
2058 auto Kind =
2059 static_cast<LambdaCaptureKind>(CaptureBits.getNextBits(/*Width=*/3));
2060 switch (Kind) {
2061 case LCK_StarThis:
2062 case LCK_This:
2063 case LCK_VLAType:
2064 new (ToCapture)
2065 Capture(Loc, IsImplicit, Kind, nullptr, SourceLocation());
2066 ToCapture++;
2067 break;
2068 case LCK_ByCopy:
2069 case LCK_ByRef:
2070 auto *Var = readDeclAs<ValueDecl>();
2071 SourceLocation EllipsisLoc = readSourceLocation();
2072 new (ToCapture) Capture(Loc, IsImplicit, Kind, Var, EllipsisLoc);
2073 ToCapture++;
2074 break;
2075 }
2076 }
2077 }
2078}
2079
2081 CXXRecordDecl *D, struct CXXRecordDecl::DefinitionData &&MergeDD) {
2082 assert(D->DefinitionData &&
2083 "merging class definition into non-definition");
2084 auto &DD = *D->DefinitionData;
2085
2086 if (DD.Definition != MergeDD.Definition) {
2087 // Track that we merged the definitions.
2088 Reader.MergedDeclContexts.insert(std::make_pair(MergeDD.Definition,
2089 DD.Definition));
2090 Reader.PendingDefinitions.erase(MergeDD.Definition);
2091 MergeDD.Definition->demoteThisDefinitionToDeclaration();
2092 Reader.mergeDefinitionVisibility(DD.Definition, MergeDD.Definition);
2093 assert(!Reader.Lookups.contains(MergeDD.Definition) &&
2094 "already loaded pending lookups for merged definition");
2095 }
2096
2097 auto PFDI = Reader.PendingFakeDefinitionData.find(&DD);
2098 if (PFDI != Reader.PendingFakeDefinitionData.end() &&
2099 PFDI->second == ASTReader::PendingFakeDefinitionKind::Fake) {
2100 // We faked up this definition data because we found a class for which we'd
2101 // not yet loaded the definition. Replace it with the real thing now.
2102 assert(!DD.IsLambda && !MergeDD.IsLambda && "faked up lambda definition?");
2103 PFDI->second = ASTReader::PendingFakeDefinitionKind::FakeLoaded;
2104
2105 // Don't change which declaration is the definition; that is required
2106 // to be invariant once we select it.
2107 auto *Def = DD.Definition;
2108 DD = std::move(MergeDD);
2109 DD.Definition = Def;
2110 while ((Def = Def->getPreviousDecl()))
2111 cast<CXXRecordDecl>(Def)->DefinitionData = &DD;
2112 return;
2113 }
2114
2115 bool DetectedOdrViolation = false;
2116
2117 #define FIELD(Name, Width, Merge) Merge(Name)
2118 #define MERGE_OR(Field) DD.Field |= MergeDD.Field;
2119 #define NO_MERGE(Field) \
2120 DetectedOdrViolation |= DD.Field != MergeDD.Field; \
2121 MERGE_OR(Field)
2122 #include "clang/AST/CXXRecordDeclDefinitionBits.def"
2123 NO_MERGE(IsLambda)
2124 #undef NO_MERGE
2125 #undef MERGE_OR
2126
2127 if (DD.NumBases != MergeDD.NumBases || DD.NumVBases != MergeDD.NumVBases)
2128 DetectedOdrViolation = true;
2129 // FIXME: Issue a diagnostic if the base classes don't match when we come
2130 // to lazily load them.
2131
2132 // FIXME: Issue a diagnostic if the list of conversion functions doesn't
2133 // match when we come to lazily load them.
2134 if (MergeDD.ComputedVisibleConversions && !DD.ComputedVisibleConversions) {
2135 DD.VisibleConversions = std::move(MergeDD.VisibleConversions);
2136 DD.ComputedVisibleConversions = true;
2137 }
2138
2139 // FIXME: Issue a diagnostic if FirstFriend doesn't match when we come to
2140 // lazily load it.
2141
2142 if (DD.IsLambda) {
2143 auto &Lambda1 = static_cast<CXXRecordDecl::LambdaDefinitionData &>(DD);
2144 auto &Lambda2 = static_cast<CXXRecordDecl::LambdaDefinitionData &>(MergeDD);
2145 DetectedOdrViolation |= Lambda1.DependencyKind != Lambda2.DependencyKind;
2146 DetectedOdrViolation |= Lambda1.IsGenericLambda != Lambda2.IsGenericLambda;
2147 DetectedOdrViolation |= Lambda1.CaptureDefault != Lambda2.CaptureDefault;
2148 DetectedOdrViolation |= Lambda1.NumCaptures != Lambda2.NumCaptures;
2149 DetectedOdrViolation |=
2150 Lambda1.NumExplicitCaptures != Lambda2.NumExplicitCaptures;
2151 DetectedOdrViolation |=
2152 Lambda1.HasKnownInternalLinkage != Lambda2.HasKnownInternalLinkage;
2153 DetectedOdrViolation |= Lambda1.ManglingNumber != Lambda2.ManglingNumber;
2154
2155 if (Lambda1.NumCaptures && Lambda1.NumCaptures == Lambda2.NumCaptures) {
2156 for (unsigned I = 0, N = Lambda1.NumCaptures; I != N; ++I) {
2157 LambdaCapture &Cap1 = Lambda1.Captures.front()[I];
2158 LambdaCapture &Cap2 = Lambda2.Captures.front()[I];
2159 DetectedOdrViolation |= Cap1.getCaptureKind() != Cap2.getCaptureKind();
2160 }
2161 Lambda1.AddCaptureList(Reader.getContext(), Lambda2.Captures.front());
2162 }
2163 }
2164
2165 // We don't want to check ODR for decls in the global module fragment.
2166 if (shouldSkipCheckingODR(MergeDD.Definition) || shouldSkipCheckingODR(D))
2167 return;
2168
2169 if (D->getODRHash() != MergeDD.ODRHash) {
2170 DetectedOdrViolation = true;
2171 }
2172
2173 if (DetectedOdrViolation)
2174 Reader.PendingOdrMergeFailures[DD.Definition].push_back(
2175 {MergeDD.Definition, &MergeDD});
2176}
2177
2178void ASTDeclReader::ReadCXXRecordDefinition(CXXRecordDecl *D, bool Update,
2179 Decl *LambdaContext,
2180 unsigned IndexInLambdaContext) {
2181 struct CXXRecordDecl::DefinitionData *DD;
2182 ASTContext &C = Reader.getContext();
2183
2184 // Determine whether this is a lambda closure type, so that we can
2185 // allocate the appropriate DefinitionData structure.
2186 bool IsLambda = Record.readInt();
2187 assert(!(IsLambda && Update) &&
2188 "lambda definition should not be added by update record");
2189 if (IsLambda)
2190 DD = new (C) CXXRecordDecl::LambdaDefinitionData(
2191 D, nullptr, CXXRecordDecl::LDK_Unknown, false, LCD_None);
2192 else
2193 DD = new (C) struct CXXRecordDecl::DefinitionData(D);
2194
2195 CXXRecordDecl *Canon = D->getCanonicalDecl();
2196 // Set decl definition data before reading it, so that during deserialization
2197 // when we read CXXRecordDecl, it already has definition data and we don't
2198 // set fake one.
2199 if (!Canon->DefinitionData)
2200 Canon->DefinitionData = DD;
2201 D->DefinitionData = Canon->DefinitionData;
2202 ReadCXXDefinitionData(*DD, D, LambdaContext, IndexInLambdaContext);
2203
2204 // Mark this declaration as being a definition.
2205 D->setCompleteDefinition(true);
2206
2207 // We might already have a different definition for this record. This can
2208 // happen either because we're reading an update record, or because we've
2209 // already done some merging. Either way, just merge into it.
2210 if (Canon->DefinitionData != DD) {
2211 MergeImpl.MergeDefinitionData(Canon, std::move(*DD));
2212 return;
2213 }
2214
2215 // If this is not the first declaration or is an update record, we can have
2216 // other redeclarations already. Make a note that we need to propagate the
2217 // DefinitionData pointer onto them.
2218 if (Update || Canon != D)
2219 Reader.PendingDefinitions.insert(D);
2220}
2221
2223 RedeclarableResult Redecl = VisitRecordDeclImpl(D);
2224
2225 ASTContext &C = Reader.getContext();
2226
2227 enum CXXRecKind {
2228 CXXRecNotTemplate = 0,
2229 CXXRecTemplate,
2230 CXXRecMemberSpecialization,
2231 CXXLambda
2232 };
2233
2234 Decl *LambdaContext = nullptr;
2235 unsigned IndexInLambdaContext = 0;
2236
2237 switch ((CXXRecKind)Record.readInt()) {
2238 case CXXRecNotTemplate:
2239 // Merged when we merge the folding set entry in the primary template.
2241 mergeRedeclarable(D, Redecl);
2242 break;
2243 case CXXRecTemplate: {
2244 // Merged when we merge the template.
2245 auto *Template = readDeclAs<ClassTemplateDecl>();
2246 D->TemplateOrInstantiation = Template;
2247 break;
2248 }
2249 case CXXRecMemberSpecialization: {
2250 auto *RD = readDeclAs<CXXRecordDecl>();
2251 auto TSK = (TemplateSpecializationKind)Record.readInt();
2252 SourceLocation POI = readSourceLocation();
2254 MSI->setPointOfInstantiation(POI);
2255 D->TemplateOrInstantiation = MSI;
2256 mergeRedeclarable(D, Redecl);
2257 break;
2258 }
2259 case CXXLambda: {
2260 LambdaContext = readDecl();
2261 if (LambdaContext)
2262 IndexInLambdaContext = Record.readInt();
2263 if (LambdaContext)
2264 MergeImpl.mergeLambda(D, Redecl, *LambdaContext, IndexInLambdaContext);
2265 else
2266 // If we don't have a mangling context, treat this like any other
2267 // declaration.
2268 mergeRedeclarable(D, Redecl);
2269 break;
2270 }
2271 }
2272
2273 bool WasDefinition = Record.readInt();
2274 if (WasDefinition)
2275 ReadCXXRecordDefinition(D, /*Update=*/false, LambdaContext,
2276 IndexInLambdaContext);
2277 else
2278 // Propagate DefinitionData pointer from the canonical declaration.
2279 D->DefinitionData = D->getCanonicalDecl()->DefinitionData;
2280
2281 // Lazily load the key function to avoid deserializing every method so we can
2282 // compute it.
2283 if (WasDefinition) {
2284 GlobalDeclID KeyFn = readDeclID();
2285 if (KeyFn.isValid() && D->isCompleteDefinition())
2286 // FIXME: This is wrong for the ARM ABI, where some other module may have
2287 // made this function no longer be a key function. We need an update
2288 // record or similar for that case.
2289 C.KeyFunctions[D] = KeyFn.getRawValue();
2290 }
2291
2292 return Redecl;
2293}
2294
2296 D->setExplicitSpecifier(Record.readExplicitSpec());
2297 D->Ctor = readDeclAs<CXXConstructorDecl>();
2300 static_cast<DeductionCandidate>(Record.readInt()));
2301 D->setSourceDeductionGuide(readDeclAs<CXXDeductionGuideDecl>());
2304 Record.readInt()));
2305}
2306
2309
2310 unsigned NumOverridenMethods = Record.readInt();
2311 if (D->isCanonicalDecl()) {
2312 while (NumOverridenMethods--) {
2313 // Avoid invariant checking of CXXMethodDecl::addOverriddenMethod,
2314 // MD may be initializing.
2315 if (auto *MD = readDeclAs<CXXMethodDecl>())
2316 Reader.getContext().addOverriddenMethod(D, MD->getCanonicalDecl());
2317 }
2318 } else {
2319 // We don't care about which declarations this used to override; we get
2320 // the relevant information from the canonical declaration.
2321 Record.skipInts(NumOverridenMethods);
2322 }
2323}
2324
2326 // We need the inherited constructor information to merge the declaration,
2327 // so we have to read it before we call VisitCXXMethodDecl.
2328 D->setExplicitSpecifier(Record.readExplicitSpec());
2329 if (D->isInheritingConstructor()) {
2330 auto *Shadow = readDeclAs<ConstructorUsingShadowDecl>();
2331 auto *Ctor = readDeclAs<CXXConstructorDecl>();
2332 *D->getTrailingObjects<InheritedConstructor>() =
2333 InheritedConstructor(Shadow, Ctor);
2334 }
2335
2337}
2338
2341
2342 ASTContext &C = Reader.getContext();
2344 if (auto *OperatorDelete = readDeclAs<FunctionDecl>()) {
2345 auto *ThisArg = Record.readExpr();
2346 // FIXME: Check consistency if we have an old and new operator delete.
2347 if (!C.dtorHasOperatorDelete(D, ASTContext::OperatorDeleteKind::Regular)) {
2348 C.addOperatorDeleteForVDtor(D, OperatorDelete,
2350 Canon->OperatorDeleteThisArg = ThisArg;
2351 }
2352 }
2353 if (auto *OperatorGlobDelete = readDeclAs<FunctionDecl>()) {
2354 if (!C.dtorHasOperatorDelete(D,
2356 C.addOperatorDeleteForVDtor(
2357 D, OperatorGlobDelete, ASTContext::OperatorDeleteKind::GlobalRegular);
2358 }
2359 if (auto *OperatorArrayDelete = readDeclAs<FunctionDecl>()) {
2360 if (!C.dtorHasOperatorDelete(D, ASTContext::OperatorDeleteKind::Array))
2361 C.addOperatorDeleteForVDtor(D, OperatorArrayDelete,
2363 }
2364 if (auto *OperatorGlobArrayDelete = readDeclAs<FunctionDecl>()) {
2365 if (!C.dtorHasOperatorDelete(D,
2367 C.addOperatorDeleteForVDtor(D, OperatorGlobArrayDelete,
2369 }
2370}
2371
2373 D->setExplicitSpecifier(Record.readExplicitSpec());
2375}
2376
2378 VisitDecl(D);
2379 D->ImportedModule = readModule();
2380 D->setImportComplete(Record.readInt());
2381 auto *StoredLocs = D->getTrailingObjects();
2382 for (unsigned I = 0, N = Record.back(); I != N; ++I)
2383 StoredLocs[I] = readSourceLocation();
2384 Record.skipInts(1); // The number of stored source locations.
2385}
2386
2388 VisitDecl(D);
2389 D->setColonLoc(readSourceLocation());
2390}
2391
2393 VisitDecl(D);
2394 if (Record.readInt()) // hasFriendDecl
2395 D->Friend = readDeclAs<NamedDecl>();
2396 else
2397 D->Friend = readTypeSourceInfo();
2398 for (unsigned i = 0; i != D->NumTPLists; ++i)
2399 D->getTrailingObjects()[i] = Record.readTemplateParameterList();
2400 D->NextFriend = readDeclID().getRawValue();
2401 D->UnsupportedFriend = (Record.readInt() != 0);
2402 D->FriendLoc = readSourceLocation();
2403 D->EllipsisLoc = readSourceLocation();
2404}
2405
2407 VisitDecl(D);
2408 unsigned NumParams = Record.readInt();
2409 D->NumParams = NumParams;
2410 D->Params = new (Reader.getContext()) TemplateParameterList *[NumParams];
2411 for (unsigned i = 0; i != NumParams; ++i)
2412 D->Params[i] = Record.readTemplateParameterList();
2413 if (Record.readInt()) // HasFriendDecl
2414 D->Friend = readDeclAs<NamedDecl>();
2415 else
2416 D->Friend = readTypeSourceInfo();
2417 D->FriendLoc = readSourceLocation();
2418}
2419
2421 VisitNamedDecl(D);
2422
2423 assert(!D->TemplateParams && "TemplateParams already set!");
2424 D->TemplateParams = Record.readTemplateParameterList();
2425 D->init(readDeclAs<NamedDecl>());
2426}
2427
2430 D->ConstraintExpr = Record.readExpr();
2431 mergeMergeable(D);
2432}
2433
2436 // The size of the template list was read during creation of the Decl, so we
2437 // don't have to re-read it here.
2438 VisitDecl(D);
2440 for (unsigned I = 0; I < D->NumTemplateArgs; ++I)
2441 Args.push_back(Record.readTemplateArgument(/*Canonicalize=*/false));
2442 D->setTemplateArguments(Args);
2443}
2444
2447
2449 llvm::BitstreamCursor &DeclsCursor,
2450 bool IsPartial) {
2451 uint64_t Offset = ReadLocalOffset();
2452 bool Failed =
2453 Reader.ReadSpecializations(M, DeclsCursor, Offset, D, IsPartial);
2454 (void)Failed;
2455 assert(!Failed);
2456}
2457
2458RedeclarableResult
2460 RedeclarableResult Redecl = VisitRedeclarable(D);
2461
2462 // Make sure we've allocated the Common pointer first. We do this before
2463 // VisitTemplateDecl so that getCommonPtr() can be used during initialization.
2465 if (!CanonD->Common) {
2466 CanonD->Common = CanonD->newCommon(Reader.getContext());
2467 Reader.PendingDefinitions.insert(CanonD);
2468 }
2469 D->Common = CanonD->Common;
2470
2471 // If this is the first declaration of the template, fill in the information
2472 // for the 'common' pointer.
2473 if (ThisDeclID == Redecl.getFirstID()) {
2474 if (auto *RTD = readDeclAs<RedeclarableTemplateDecl>()) {
2475 assert(RTD->getKind() == D->getKind() &&
2476 "InstantiatedFromMemberTemplate kind mismatch");
2478 if (Record.readInt())
2480 }
2481 }
2482
2484 D->IdentifierNamespace = Record.readInt();
2485
2486 return Redecl;
2487}
2488
2490 RedeclarableResult Redecl = VisitRedeclarableTemplateDecl(D);
2491 mergeRedeclarableTemplate(D, Redecl);
2492
2493 if (ThisDeclID == Redecl.getFirstID()) {
2494 // This ClassTemplateDecl owns a CommonPtr; read it to keep track of all of
2495 // the specializations.
2496 ReadSpecializations(*Loc.F, D, Loc.F->DeclsCursor, /*IsPartial=*/false);
2497 ReadSpecializations(*Loc.F, D, Loc.F->DeclsCursor, /*IsPartial=*/true);
2498 }
2499}
2500
2502 llvm_unreachable("BuiltinTemplates are not serialized");
2503}
2504
2505/// TODO: Unify with ClassTemplateDecl version?
2506/// May require unifying ClassTemplateDecl and
2507/// VarTemplateDecl beyond TemplateDecl...
2509 RedeclarableResult Redecl = VisitRedeclarableTemplateDecl(D);
2510 mergeRedeclarableTemplate(D, Redecl);
2511
2512 if (ThisDeclID == Redecl.getFirstID()) {
2513 // This VarTemplateDecl owns a CommonPtr; read it to keep track of all of
2514 // the specializations.
2515 ReadSpecializations(*Loc.F, D, Loc.F->DeclsCursor, /*IsPartial=*/false);
2516 ReadSpecializations(*Loc.F, D, Loc.F->DeclsCursor, /*IsPartial=*/true);
2517 }
2518}
2519
2522 RedeclarableResult Redecl = VisitCXXRecordDeclImpl(D);
2523
2524 ASTContext &C = Reader.getContext();
2525 if (Decl *InstD = readDecl()) {
2526 if (auto *CTD = dyn_cast<ClassTemplateDecl>(InstD)) {
2527 D->SpecializedTemplate = CTD;
2528 } else {
2530 Record.readTemplateArgumentList(TemplArgs);
2531 TemplateArgumentList *ArgList
2532 = TemplateArgumentList::CreateCopy(C, TemplArgs);
2533 auto *PS =
2535 SpecializedPartialSpecialization();
2536 PS->PartialSpecialization
2538 PS->TemplateArgs = ArgList;
2539 D->SpecializedTemplate = PS;
2540 }
2541 }
2542
2544 Record.readTemplateArgumentList(TemplArgs, /*Canonicalize*/ true);
2545 D->TemplateArgs = TemplateArgumentList::CreateCopy(C, TemplArgs);
2546 D->PointOfInstantiation = readSourceLocation();
2547 D->SpecializationKind = (TemplateSpecializationKind)Record.readInt();
2548 D->StrictPackMatch = Record.readBool();
2549
2550 bool writtenAsCanonicalDecl = Record.readInt();
2551 if (writtenAsCanonicalDecl) {
2552 auto *CanonPattern = readDeclAs<ClassTemplateDecl>();
2553 if (D->isCanonicalDecl()) { // It's kept in the folding set.
2554 // Set this as, or find, the canonical declaration for this specialization
2556 if (auto *Partial = dyn_cast<ClassTemplatePartialSpecializationDecl>(D)) {
2557 CanonSpec = CanonPattern->getCommonPtr()->PartialSpecializations
2558 .GetOrInsertNode(Partial);
2559 } else {
2560 CanonSpec =
2561 CanonPattern->getCommonPtr()->Specializations.GetOrInsertNode(D);
2562 }
2563 // If there was already a canonical specialization, merge into it.
2564 if (CanonSpec != D) {
2565 MergeImpl.mergeRedeclarable<TagDecl>(D, CanonSpec, Redecl);
2566
2567 // This declaration might be a definition. Merge with any existing
2568 // definition.
2569 if (auto *DDD = D->DefinitionData) {
2570 if (CanonSpec->DefinitionData)
2571 MergeImpl.MergeDefinitionData(CanonSpec, std::move(*DDD));
2572 else
2573 CanonSpec->DefinitionData = D->DefinitionData;
2574 }
2575 D->DefinitionData = CanonSpec->DefinitionData;
2576 }
2577 }
2578 }
2579
2580 // extern/template keyword locations for explicit instantiations
2581 if (Record.readBool()) {
2582 auto *ExplicitInfo = new (C) ExplicitInstantiationInfo;
2583 ExplicitInfo->ExternKeywordLoc = readSourceLocation();
2584 ExplicitInfo->TemplateKeywordLoc = readSourceLocation();
2585 D->ExplicitInfo = ExplicitInfo;
2586 }
2587
2588 if (Record.readBool())
2589 D->setTemplateArgsAsWritten(Record.readASTTemplateArgumentListInfo());
2590
2591 return Redecl;
2592}
2593
2596 // We need to read the template params first because redeclarable is going to
2597 // need them for profiling
2598 TemplateParameterList *Params = Record.readTemplateParameterList();
2599 D->TemplateParams = Params;
2600
2601 RedeclarableResult Redecl = VisitClassTemplateSpecializationDeclImpl(D);
2602
2603 // These are read/set from/to the first declaration.
2604 if (ThisDeclID == Redecl.getFirstID()) {
2605 D->InstantiatedFromMember.setPointer(
2606 readDeclAs<ClassTemplatePartialSpecializationDecl>());
2607 D->InstantiatedFromMember.setInt(Record.readInt());
2608 }
2609}
2610
2612 RedeclarableResult Redecl = VisitRedeclarableTemplateDecl(D);
2613
2614 if (ThisDeclID == Redecl.getFirstID()) {
2615 // This FunctionTemplateDecl owns a CommonPtr; read it.
2616 ReadSpecializations(*Loc.F, D, Loc.F->DeclsCursor, /*IsPartial=*/false);
2617 }
2618}
2619
2620/// TODO: Unify with ClassTemplateSpecializationDecl version?
2621/// May require unifying ClassTemplate(Partial)SpecializationDecl and
2622/// VarTemplate(Partial)SpecializationDecl with a new data
2623/// structure Template(Partial)SpecializationDecl, and
2624/// using Template(Partial)SpecializationDecl as input type.
2627 ASTContext &C = Reader.getContext();
2628 if (Decl *InstD = readDecl()) {
2629 if (auto *VTD = dyn_cast<VarTemplateDecl>(InstD)) {
2630 D->SpecializedTemplate = VTD;
2631 } else {
2633 Record.readTemplateArgumentList(TemplArgs);
2635 C, TemplArgs);
2636 auto *PS =
2637 new (C)
2638 VarTemplateSpecializationDecl::SpecializedPartialSpecialization();
2639 PS->PartialSpecialization =
2641 PS->TemplateArgs = ArgList;
2642 D->SpecializedTemplate = PS;
2643 }
2644 }
2645
2646 // extern/template keyword locations for explicit instantiations
2647 if (Record.readBool()) {
2648 auto *ExplicitInfo = new (C) ExplicitInstantiationInfo;
2649 ExplicitInfo->ExternKeywordLoc = readSourceLocation();
2650 ExplicitInfo->TemplateKeywordLoc = readSourceLocation();
2651 D->ExplicitInfo = ExplicitInfo;
2652 }
2653
2654 if (Record.readBool())
2655 D->setTemplateArgsAsWritten(Record.readASTTemplateArgumentListInfo());
2656
2658 Record.readTemplateArgumentList(TemplArgs, /*Canonicalize*/ true);
2659 D->TemplateArgs = TemplateArgumentList::CreateCopy(C, TemplArgs);
2660 D->PointOfInstantiation = readSourceLocation();
2661 D->SpecializationKind = (TemplateSpecializationKind)Record.readInt();
2662 D->IsCompleteDefinition = Record.readInt();
2663
2664 RedeclarableResult Redecl = VisitVarDeclImpl(D);
2665
2666 bool writtenAsCanonicalDecl = Record.readInt();
2667 if (writtenAsCanonicalDecl) {
2668 auto *CanonPattern = readDeclAs<VarTemplateDecl>();
2669 if (D->isCanonicalDecl()) { // It's kept in the folding set.
2671 if (auto *Partial = dyn_cast<VarTemplatePartialSpecializationDecl>(D)) {
2672 CanonSpec = CanonPattern->getCommonPtr()
2673 ->PartialSpecializations.GetOrInsertNode(Partial);
2674 } else {
2675 CanonSpec =
2676 CanonPattern->getCommonPtr()->Specializations.GetOrInsertNode(D);
2677 }
2678 // If we already have a matching specialization, merge it.
2679 if (CanonSpec != D)
2680 MergeImpl.mergeRedeclarable<VarDecl>(D, CanonSpec, Redecl);
2681 }
2682 }
2683
2684 return Redecl;
2685}
2686
2687/// TODO: Unify with ClassTemplatePartialSpecializationDecl version?
2688/// May require unifying ClassTemplate(Partial)SpecializationDecl and
2689/// VarTemplate(Partial)SpecializationDecl with a new data
2690/// structure Template(Partial)SpecializationDecl, and
2691/// using Template(Partial)SpecializationDecl as input type.
2694 TemplateParameterList *Params = Record.readTemplateParameterList();
2695 D->TemplateParams = Params;
2696
2697 RedeclarableResult Redecl = VisitVarTemplateSpecializationDeclImpl(D);
2698
2699 // These are read/set from/to the first declaration.
2700 if (ThisDeclID == Redecl.getFirstID()) {
2701 D->InstantiatedFromMember.setPointer(
2702 readDeclAs<VarTemplatePartialSpecializationDecl>());
2703 D->InstantiatedFromMember.setInt(Record.readInt());
2704 }
2705}
2706
2708 VisitTypeDecl(D);
2709
2710 D->setDeclaredWithTypename(Record.readInt());
2711
2712 bool TypeConstraintInitialized = D->hasTypeConstraint() && Record.readBool();
2713 if (TypeConstraintInitialized) {
2714 ConceptReference *CR = nullptr;
2715 if (Record.readBool())
2716 CR = Record.readConceptReference();
2717 Expr *ImmediatelyDeclaredConstraint = Record.readExpr();
2718 UnsignedOrNone ArgPackSubstIndex = Record.readUnsignedOrNone();
2719
2720 D->setTypeConstraint(CR, ImmediatelyDeclaredConstraint, ArgPackSubstIndex);
2721 D->NumExpanded = Record.readUnsignedOrNone();
2722 }
2723
2724 if (Record.readInt())
2725 D->setDefaultArgument(Reader.getContext(),
2726 Record.readTemplateArgumentLoc());
2727}
2728
2731 // TemplateParmPosition.
2732 D->setDepth(Record.readInt());
2733 D->setPosition(Record.readInt());
2735 D->setPlaceholderTypeConstraint(Record.readExpr());
2736 if (D->isExpandedParameterPack()) {
2737 auto TypesAndInfos =
2738 D->getTrailingObjects<std::pair<QualType, TypeSourceInfo *>>();
2739 for (unsigned I = 0, N = D->getNumExpansionTypes(); I != N; ++I) {
2740 new (&TypesAndInfos[I].first) QualType(Record.readType());
2741 TypesAndInfos[I].second = readTypeSourceInfo();
2742 }
2743 } else {
2744 // Rest of NonTypeTemplateParmDecl.
2745 D->ParameterPack = Record.readInt();
2746 if (Record.readInt())
2747 D->setDefaultArgument(Reader.getContext(),
2748 Record.readTemplateArgumentLoc());
2749 }
2750}
2751
2754 D->ParameterKind = static_cast<TemplateNameKind>(Record.readInt());
2755 D->setDeclaredWithTypename(Record.readBool());
2756 // TemplateParmPosition.
2757 D->setDepth(Record.readInt());
2758 D->setPosition(Record.readInt());
2759 if (D->isExpandedParameterPack()) {
2760 auto **Data = D->getTrailingObjects();
2761 for (unsigned I = 0, N = D->getNumExpansionTemplateParameters();
2762 I != N; ++I)
2763 Data[I] = Record.readTemplateParameterList();
2764 } else {
2765 // Rest of TemplateTemplateParmDecl.
2766 D->ParameterPack = Record.readInt();
2767 if (Record.readInt())
2768 D->setDefaultArgument(Reader.getContext(),
2769 Record.readTemplateArgumentLoc());
2770 }
2771}
2772
2777
2779 VisitDecl(D);
2780 D->AssertExprAndFailed.setPointer(Record.readExpr());
2781 D->AssertExprAndFailed.setInt(Record.readInt());
2782 D->Message = cast_or_null<StringLiteral>(Record.readExpr());
2783 D->RParenLoc = readSourceLocation();
2784}
2785
2789
2792 VisitDecl(D);
2793 D->ExtendingDecl = readDeclAs<ValueDecl>();
2794 D->ExprWithTemporary = Record.readStmt();
2795 if (Record.readInt()) {
2796 D->Value = new (D->getASTContext()) APValue(Record.readAPValue());
2797 D->getASTContext().addDestruction(D->Value);
2798 }
2799 D->ManglingNumber = Record.readInt();
2800 mergeMergeable(D);
2801}
2802
2804 LookupBlockOffsets &Offsets) {
2805 Offsets.LexicalOffset = ReadLocalOffset();
2806 Offsets.VisibleOffset = ReadLocalOffset();
2807 Offsets.ModuleLocalOffset = ReadLocalOffset();
2808 Offsets.TULocalOffset = ReadLocalOffset();
2809}
2810
2811template <typename T>
2813 GlobalDeclID FirstDeclID = readDeclID();
2814 Decl *MergeWith = nullptr;
2815
2816 bool IsKeyDecl = ThisDeclID == FirstDeclID;
2817 bool IsFirstLocalDecl = false;
2818
2819 uint64_t RedeclOffset = 0;
2820
2821 // invalid FirstDeclID indicates that this declaration was the only
2822 // declaration of its entity, and is used for space optimization.
2823 if (FirstDeclID.isInvalid()) {
2824 FirstDeclID = ThisDeclID;
2825 IsKeyDecl = true;
2826 IsFirstLocalDecl = true;
2827 } else if (unsigned N = Record.readInt()) {
2828 // This declaration was the first local declaration, but may have imported
2829 // other declarations.
2830 IsKeyDecl = N == 1;
2831 IsFirstLocalDecl = true;
2832
2833 // We have some declarations that must be before us in our redeclaration
2834 // chain. Read them now, and remember that we ought to merge with one of
2835 // them.
2836 // FIXME: Provide a known merge target to the second and subsequent such
2837 // declaration.
2838 for (unsigned I = 0; I != N - 1; ++I)
2839 MergeWith = readDecl();
2840
2841 RedeclOffset = ReadLocalOffset();
2842 } else {
2843 // This declaration was not the first local declaration. Read the first
2844 // local declaration now, to trigger the import of other redeclarations.
2845 (void)readDecl();
2846 }
2847
2848 auto *FirstDecl = cast_or_null<T>(Reader.GetDecl(FirstDeclID));
2849 if (FirstDecl != D) {
2850 // We delay loading of the redeclaration chain to avoid deeply nested calls.
2851 // We temporarily set the first (canonical) declaration as the previous one
2852 // which is the one that matters and mark the real previous DeclID to be
2853 // loaded & attached later on.
2855 D->First = FirstDecl->getCanonicalDecl();
2856 }
2857
2858 auto *DAsT = static_cast<T *>(D);
2859
2860 // Note that we need to load local redeclarations of this decl and build a
2861 // decl chain for them. This must happen *after* we perform the preloading
2862 // above; this ensures that the redeclaration chain is built in the correct
2863 // order.
2864 if (IsFirstLocalDecl)
2865 Reader.PendingDeclChains.push_back(std::make_pair(DAsT, RedeclOffset));
2866
2867 return RedeclarableResult(MergeWith, FirstDeclID, IsKeyDecl);
2868}
2869
2870/// Attempts to merge the given declaration (D) with another declaration
2871/// of the same entity.
2872template <typename T>
2874 RedeclarableResult &Redecl) {
2875 // If modules are not available, there is no reason to perform this merge.
2876 if (!Reader.getContext().getLangOpts().Modules)
2877 return;
2878
2879 // If we're not the canonical declaration, we don't need to merge.
2880 if (!DBase->isFirstDecl())
2881 return;
2882
2883 auto *D = static_cast<T *>(DBase);
2884
2885 if (auto *Existing = Redecl.getKnownMergeTarget())
2886 // We already know of an existing declaration we should merge with.
2887 MergeImpl.mergeRedeclarable(D, cast<T>(Existing), Redecl);
2888 else if (FindExistingResult ExistingRes = findExisting(D))
2889 if (T *Existing = ExistingRes)
2890 MergeImpl.mergeRedeclarable(D, Existing, Redecl);
2891}
2892
2893/// Attempt to merge D with a previous declaration of the same lambda, which is
2894/// found by its index within its context declaration, if it has one.
2895///
2896/// We can't look up lambdas in their enclosing lexical or semantic context in
2897/// general, because for lambdas in variables, both of those might be a
2898/// namespace or the translation unit.
2899void ASTDeclMerger::mergeLambda(CXXRecordDecl *D, RedeclarableResult &Redecl,
2900 Decl &Context, unsigned IndexInContext) {
2901 // If modules are not available, there is no reason to perform this merge.
2902 if (!Reader.getContext().getLangOpts().Modules)
2903 return;
2904
2905 // If we're not the canonical declaration, we don't need to merge.
2906 if (!D->isFirstDecl())
2907 return;
2908
2909 if (auto *Existing = Redecl.getKnownMergeTarget())
2910 // We already know of an existing declaration we should merge with.
2911 mergeRedeclarable(D, cast<TagDecl>(Existing), Redecl);
2912
2913 // Look up this lambda to see if we've seen it before. If so, merge with the
2914 // one we already loaded.
2915 NamedDecl *&Slot = Reader.LambdaDeclarationsForMerging[{
2916 Context.getCanonicalDecl(), IndexInContext}];
2917 if (Slot)
2918 mergeRedeclarable(D, cast<TagDecl>(Slot), Redecl);
2919 else
2920 Slot = D;
2921}
2922
2924 RedeclarableResult &Redecl) {
2925 mergeRedeclarable(D, Redecl);
2926 // If we merged the template with a prior declaration chain, merge the
2927 // common pointer.
2928 // FIXME: Actually merge here, don't just overwrite.
2929 D->Common = D->getCanonicalDecl()->Common;
2930}
2931
2932/// "Cast" to type T, asserting if we don't have an implicit conversion.
2933/// We use this to put code in a template that will only be valid for certain
2934/// instantiations.
2935template<typename T> static T assert_cast(T t) { return t; }
2936template<typename T> static T assert_cast(...) {
2937 llvm_unreachable("bad assert_cast");
2938}
2939
2940/// Merge together the pattern declarations from two template
2941/// declarations.
2943 RedeclarableTemplateDecl *Existing,
2944 bool IsKeyDecl) {
2945 auto *DPattern = D->getTemplatedDecl();
2946 auto *ExistingPattern = Existing->getTemplatedDecl();
2947 RedeclarableResult Result(
2948 /*MergeWith*/ ExistingPattern,
2949 DPattern->getCanonicalDecl()->getGlobalID(), IsKeyDecl);
2950
2951 if (auto *DClass = dyn_cast<CXXRecordDecl>(DPattern)) {
2952 // Merge with any existing definition.
2953 // FIXME: This is duplicated in several places. Refactor.
2954 auto *ExistingClass =
2955 cast<CXXRecordDecl>(ExistingPattern)->getCanonicalDecl();
2956 if (auto *DDD = DClass->DefinitionData) {
2957 if (ExistingClass->DefinitionData) {
2958 MergeDefinitionData(ExistingClass, std::move(*DDD));
2959 } else {
2960 ExistingClass->DefinitionData = DClass->DefinitionData;
2961 // We may have skipped this before because we thought that DClass
2962 // was the canonical declaration.
2963 Reader.PendingDefinitions.insert(DClass);
2964 }
2965 }
2966 DClass->DefinitionData = ExistingClass->DefinitionData;
2967
2968 return mergeRedeclarable(DClass, cast<TagDecl>(ExistingPattern),
2969 Result);
2970 }
2971 if (auto *DFunction = dyn_cast<FunctionDecl>(DPattern))
2972 return mergeRedeclarable(DFunction, cast<FunctionDecl>(ExistingPattern),
2973 Result);
2974 if (auto *DVar = dyn_cast<VarDecl>(DPattern))
2975 return mergeRedeclarable(DVar, cast<VarDecl>(ExistingPattern), Result);
2976 if (auto *DAlias = dyn_cast<TypeAliasDecl>(DPattern))
2977 return mergeRedeclarable(DAlias, cast<TypedefNameDecl>(ExistingPattern),
2978 Result);
2979 llvm_unreachable("merged an unknown kind of redeclarable template");
2980}
2981
2982/// Attempts to merge the given declaration (D) with another declaration
2983/// of the same entity.
2984template <typename T>
2986 GlobalDeclID KeyDeclID) {
2987 auto *D = static_cast<T *>(DBase);
2988 T *ExistingCanon = Existing->getCanonicalDecl();
2989 T *DCanon = D->getCanonicalDecl();
2990 if (ExistingCanon != DCanon) {
2991 // Have our redeclaration link point back at the canonical declaration
2992 // of the existing declaration, so that this declaration has the
2993 // appropriate canonical declaration.
2995 D->First = ExistingCanon;
2996 ExistingCanon->Used |= D->Used;
2997 D->Used = false;
2998
2999 bool IsKeyDecl = KeyDeclID.isValid();
3000
3001 // When we merge a template, merge its pattern.
3002 if (auto *DTemplate = dyn_cast<RedeclarableTemplateDecl>(D))
3004 DTemplate, assert_cast<RedeclarableTemplateDecl *>(ExistingCanon),
3005 IsKeyDecl);
3006
3007 // If this declaration is a key declaration, make a note of that.
3008 if (IsKeyDecl)
3009 Reader.KeyDecls[ExistingCanon].push_back(KeyDeclID);
3010 }
3011}
3012
3013/// ODR-like semantics for C/ObjC allow us to merge tag types and a structural
3014/// check in Sema guarantees the types can be merged (see C11 6.2.7/1 or C89
3015/// 6.1.2.6/1). Although most merging is done in Sema, we need to guarantee
3016/// that some types are mergeable during deserialization, otherwise name
3017/// lookup fails. This is the case for EnumConstantDecl.
3019 if (!ND)
3020 return false;
3021 // TODO: implement merge for other necessary decls.
3023 return true;
3024 return false;
3025}
3026
3027/// Attempts to merge LifetimeExtendedTemporaryDecl with
3028/// identical class definitions from two different modules.
3030 // If modules are not available, there is no reason to perform this merge.
3031 if (!Reader.getContext().getLangOpts().Modules)
3032 return;
3033
3034 LifetimeExtendedTemporaryDecl *LETDecl = D;
3035
3037 Reader.LETemporaryForMerging[std::make_pair(
3038 LETDecl->getExtendingDecl(), LETDecl->getManglingNumber())];
3039 if (LookupResult)
3040 Reader.getContext().setPrimaryMergedDecl(LETDecl,
3041 LookupResult->getCanonicalDecl());
3042 else
3043 LookupResult = LETDecl;
3044}
3045
3046/// Attempts to merge the given declaration (D) with another declaration
3047/// of the same entity, for the case where the entity is not actually
3048/// redeclarable. This happens, for instance, when merging the fields of
3049/// identical class definitions from two different modules.
3050template<typename T>
3052 // If modules are not available, there is no reason to perform this merge.
3053 if (!Reader.getContext().getLangOpts().Modules)
3054 return;
3055
3056 // ODR-based merging is performed in C++ and in some cases (tag types) in C.
3057 // Note that C identically-named things in different translation units are
3058 // not redeclarations, but may still have compatible types, where ODR-like
3059 // semantics may apply.
3060 if (!Reader.getContext().getLangOpts().CPlusPlus &&
3061 !allowODRLikeMergeInC(dyn_cast<NamedDecl>(static_cast<T*>(D))))
3062 return;
3063
3064 if (FindExistingResult ExistingRes = findExisting(static_cast<T*>(D)))
3065 if (T *Existing = ExistingRes)
3066 Reader.getContext().setPrimaryMergedDecl(static_cast<T *>(D),
3067 Existing->getCanonicalDecl());
3068}
3069
3071 Record.readOMPChildren(D->Data);
3072 VisitDecl(D);
3073}
3074
3076 Record.readOMPChildren(D->Data);
3077 VisitDecl(D);
3078}
3079
3081 Record.readOMPChildren(D->Data);
3082 VisitDecl(D);
3083}
3084
3086 VisitValueDecl(D);
3087 D->setLocation(readSourceLocation());
3088 Expr *In = Record.readExpr();
3089 Expr *Out = Record.readExpr();
3090 D->setCombinerData(In, Out);
3091 Expr *Combiner = Record.readExpr();
3092 D->setCombiner(Combiner);
3093 Expr *Orig = Record.readExpr();
3094 Expr *Priv = Record.readExpr();
3095 D->setInitializerData(Orig, Priv);
3096 Expr *Init = Record.readExpr();
3097 auto IK = static_cast<OMPDeclareReductionInitKind>(Record.readInt());
3098 D->setInitializer(Init, IK);
3099 D->PrevDeclInScope = readDeclID().getRawValue();
3100}
3101
3103 Record.readOMPChildren(D->Data);
3104 VisitValueDecl(D);
3105 D->VarName = Record.readDeclarationName();
3106 D->PrevDeclInScope = readDeclID().getRawValue();
3107}
3108
3112
3114 VisitDecl(D);
3115 D->DirKind = Record.readEnum<OpenACCDirectiveKind>();
3116 D->DirectiveLoc = Record.readSourceLocation();
3117 D->EndLoc = Record.readSourceLocation();
3118 Record.readOpenACCClauseList(D->Clauses);
3119}
3121 VisitDecl(D);
3122 D->DirKind = Record.readEnum<OpenACCDirectiveKind>();
3123 D->DirectiveLoc = Record.readSourceLocation();
3124 D->EndLoc = Record.readSourceLocation();
3125 D->ParensLoc = Record.readSourceRange();
3126 D->FuncRef = Record.readExpr();
3127 Record.readOpenACCClauseList(D->Clauses);
3128}
3129
3130//===----------------------------------------------------------------------===//
3131// Attribute Reading
3132//===----------------------------------------------------------------------===//
3133
3134namespace {
3135class AttrReader {
3136 ASTRecordReader &Reader;
3137
3138public:
3139 AttrReader(ASTRecordReader &Reader) : Reader(Reader) {}
3140
3141 uint64_t readInt() {
3142 return Reader.readInt();
3143 }
3144
3145 bool readBool() { return Reader.readBool(); }
3146
3147 SourceRange readSourceRange() {
3148 return Reader.readSourceRange();
3149 }
3150
3151 SourceLocation readSourceLocation() {
3152 return Reader.readSourceLocation();
3153 }
3154
3155 Expr *readExpr() { return Reader.readExpr(); }
3156
3157 Attr *readAttr() { return Reader.readAttr(); }
3158
3159 std::string readString() {
3160 return Reader.readString();
3161 }
3162
3163 TypeSourceInfo *readTypeSourceInfo() {
3164 return Reader.readTypeSourceInfo();
3165 }
3166
3167 IdentifierInfo *readIdentifier() {
3168 return Reader.readIdentifier();
3169 }
3170
3171 VersionTuple readVersionTuple() {
3172 return Reader.readVersionTuple();
3173 }
3174
3175 OMPTraitInfo *readOMPTraitInfo() { return Reader.readOMPTraitInfo(); }
3176
3177 template <typename T> T *readDeclAs() { return Reader.readDeclAs<T>(); }
3178};
3179}
3180
3182 AttrReader Record(*this);
3183 auto V = Record.readInt();
3184 if (!V)
3185 return nullptr;
3186
3187 Attr *New = nullptr;
3188 // Kind is stored as a 1-based integer because 0 is used to indicate a null
3189 // Attr pointer.
3190 auto Kind = static_cast<attr::Kind>(V - 1);
3191 ASTContext &Context = getContext();
3192
3193 IdentifierInfo *AttrName = Record.readIdentifier();
3194 IdentifierInfo *ScopeName = Record.readIdentifier();
3195 SourceRange AttrRange = Record.readSourceRange();
3196 SourceLocation ScopeLoc = Record.readSourceLocation();
3197 unsigned ParsedKind = Record.readInt();
3198 unsigned Syntax = Record.readInt();
3199 unsigned SpellingIndex = Record.readInt();
3200 bool IsAlignas = (ParsedKind == AttributeCommonInfo::AT_Aligned &&
3202 SpellingIndex == AlignedAttr::Keyword_alignas);
3203 bool IsRegularKeywordAttribute = Record.readBool();
3204
3205 AttributeCommonInfo Info(AttrName, AttributeScopeInfo(ScopeName, ScopeLoc),
3206 AttrRange, AttributeCommonInfo::Kind(ParsedKind),
3207 {AttributeCommonInfo::Syntax(Syntax), SpellingIndex,
3208 IsAlignas, IsRegularKeywordAttribute});
3209
3210#include "clang/Serialization/AttrPCHRead.inc"
3211
3212 assert(New && "Unable to decode attribute?");
3213 return New;
3214}
3215
3216/// Reads attributes from the current stream position.
3218 for (unsigned I = 0, E = readInt(); I != E; ++I)
3219 if (auto *A = readAttr())
3220 Attrs.push_back(A);
3221}
3222
3223//===----------------------------------------------------------------------===//
3224// ASTReader Implementation
3225//===----------------------------------------------------------------------===//
3226
3227/// Note that we have loaded the declaration with the given
3228/// Index.
3229///
3230/// This routine notes that this declaration has already been loaded,
3231/// so that future GetDecl calls will return this declaration rather
3232/// than trying to load a new declaration.
3233inline void ASTReader::LoadedDecl(unsigned Index, Decl *D) {
3234 assert(!DeclsLoaded[Index] && "Decl loaded twice?");
3235 DeclsLoaded[Index] = D;
3236}
3237
3238/// Determine whether the consumer will be interested in seeing
3239/// this declaration (via HandleTopLevelDecl).
3240///
3241/// This routine should return true for anything that might affect
3242/// code generation, e.g., inline function definitions, Objective-C
3243/// declarations with metadata, etc.
3244bool ASTReader::isConsumerInterestedIn(Decl *D) {
3245 // An ObjCMethodDecl is never considered as "interesting" because its
3246 // implementation container always is.
3247
3248 // An ImportDecl or VarDecl imported from a module map module will get
3249 // emitted when we import the relevant module.
3251 auto *M = D->getImportedOwningModule();
3252 if (M && M->Kind == Module::ModuleMapModule &&
3253 getContext().DeclMustBeEmitted(D))
3254 return false;
3255 }
3256
3257 if (isa<FileScopeAsmDecl, TopLevelStmtDecl, ObjCProtocolDecl, ObjCImplDecl,
3258 ImportDecl, PragmaCommentDecl, PragmaDetectMismatchDecl>(D))
3259 return true;
3260 if (isa<OMPThreadPrivateDecl, OMPDeclareReductionDecl, OMPDeclareMapperDecl,
3261 OMPAllocateDecl, OMPRequiresDecl>(D))
3262 return !D->getDeclContext()->isFunctionOrMethod();
3263 if (const auto *Var = dyn_cast<VarDecl>(D))
3264 return Var->isFileVarDecl() &&
3265 (Var->isThisDeclarationADefinition() == VarDecl::Definition ||
3266 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(Var));
3267 if (const auto *Func = dyn_cast<FunctionDecl>(D))
3268 return Func->doesThisDeclarationHaveABody() || PendingBodies.count(D);
3269
3270 if (auto *ES = D->getASTContext().getExternalSource())
3271 if (ES->hasExternalDefinitions(D) == ExternalASTSource::EK_Never)
3272 return true;
3273
3274 return false;
3275}
3276
3277/// Get the correct cursor and offset for loading a declaration.
3278ASTReader::RecordLocation ASTReader::DeclCursorForID(GlobalDeclID ID,
3279 SourceLocation &Loc) {
3281 assert(M);
3282 unsigned LocalDeclIndex = ID.getLocalDeclIndex();
3283 const DeclOffset &DOffs = M->DeclOffsets[LocalDeclIndex];
3284 Loc = ReadSourceLocation(*M, DOffs.getRawLoc());
3285 return RecordLocation(M, DOffs.getBitOffset(M->DeclsBlockStartOffset));
3286}
3287
3288ASTReader::RecordLocation ASTReader::getLocalBitOffset(uint64_t GlobalOffset) {
3289 auto I = GlobalBitOffsetsMap.find(GlobalOffset);
3290
3291 assert(I != GlobalBitOffsetsMap.end() && "Corrupted global bit offsets map");
3292 return RecordLocation(I->second, GlobalOffset - I->second->GlobalBitOffset);
3293}
3294
3295uint64_t ASTReader::getGlobalBitOffset(ModuleFile &M, uint64_t LocalOffset) {
3296 return LocalOffset + M.GlobalBitOffset;
3297}
3298
3300ASTDeclReader::getOrFakePrimaryClassDefinition(ASTReader &Reader,
3301 CXXRecordDecl *RD) {
3302 // Try to dig out the definition.
3303 auto *DD = RD->DefinitionData;
3304 if (!DD)
3305 DD = RD->getCanonicalDecl()->DefinitionData;
3306
3307 // If there's no definition yet, then DC's definition is added by an update
3308 // record, but we've not yet loaded that update record. In this case, we
3309 // commit to DC being the canonical definition now, and will fix this when
3310 // we load the update record.
3311 if (!DD) {
3312 DD = new (Reader.getContext()) struct CXXRecordDecl::DefinitionData(RD);
3313 RD->setCompleteDefinition(true);
3314 RD->DefinitionData = DD;
3315 RD->getCanonicalDecl()->DefinitionData = DD;
3316
3317 // Track that we did this horrible thing so that we can fix it later.
3318 Reader.PendingFakeDefinitionData.insert(
3319 std::make_pair(DD, ASTReader::PendingFakeDefinitionKind::Fake));
3320 }
3321
3322 return DD->Definition;
3323}
3324
3325/// Find the context in which we should search for previous declarations when
3326/// looking for declarations to merge.
3327DeclContext *ASTDeclReader::getPrimaryContextForMerging(ASTReader &Reader,
3328 DeclContext *DC) {
3329 if (auto *ND = dyn_cast<NamespaceDecl>(DC))
3330 return ND->getFirstDecl();
3331
3332 if (auto *RD = dyn_cast<CXXRecordDecl>(DC))
3333 return getOrFakePrimaryClassDefinition(Reader, RD);
3334
3335 if (auto *RD = dyn_cast<RecordDecl>(DC))
3336 return RD->getDefinition();
3337
3338 if (auto *ED = dyn_cast<EnumDecl>(DC))
3339 return ED->getDefinition();
3340
3341 if (auto *OID = dyn_cast<ObjCInterfaceDecl>(DC))
3342 return OID->getDefinition();
3343
3344 // We can see the TU here only if we have no Sema object. It is possible
3345 // we're in clang-repl so we still need to get the primary context.
3346 if (auto *TU = dyn_cast<TranslationUnitDecl>(DC))
3347 return TU->getPrimaryContext();
3348
3349 return nullptr;
3350}
3351
3352ASTDeclReader::FindExistingResult::~FindExistingResult() {
3353 // Record that we had a typedef name for linkage whether or not we merge
3354 // with that declaration.
3355 if (TypedefNameForLinkage) {
3356 DeclContext *DC = New->getDeclContext()->getRedeclContext();
3357 Reader.ImportedTypedefNamesForLinkage.insert(
3358 std::make_pair(std::make_pair(DC, TypedefNameForLinkage), New));
3359 return;
3360 }
3361
3362 if (!AddResult || Existing)
3363 return;
3364
3365 DeclarationName Name = New->getDeclName();
3366 DeclContext *DC = New->getDeclContext()->getRedeclContext();
3368 setAnonymousDeclForMerging(Reader, New->getLexicalDeclContext(),
3369 AnonymousDeclNumber, New);
3370 } else if (DC->isTranslationUnit() &&
3371 !Reader.getContext().getLangOpts().CPlusPlus) {
3372 if (Reader.getIdResolver().tryAddTopLevelDecl(New, Name))
3373 Reader.PendingFakeLookupResults[Name.getAsIdentifierInfo()]
3374 .push_back(New);
3375 } else if (DeclContext *MergeDC = getPrimaryContextForMerging(Reader, DC)) {
3376 // Add the declaration to its redeclaration context so later merging
3377 // lookups will find it.
3378 MergeDC->makeDeclVisibleInContextImpl(New, /*Internal*/true);
3379 }
3380}
3381
3382/// Find the declaration that should be merged into, given the declaration found
3383/// by name lookup. If we're merging an anonymous declaration within a typedef,
3384/// we need a matching typedef, and we merge with the type inside it.
3386 bool IsTypedefNameForLinkage) {
3387 if (!IsTypedefNameForLinkage)
3388 return Found;
3389
3390 // If we found a typedef declaration that gives a name to some other
3391 // declaration, then we want that inner declaration. Declarations from
3392 // AST files are handled via ImportedTypedefNamesForLinkage.
3393 if (Found->isFromASTFile())
3394 return nullptr;
3395
3396 if (auto *TND = dyn_cast<TypedefNameDecl>(Found))
3397 return TND->getAnonDeclWithTypedefName(/*AnyRedecl*/true);
3398
3399 return nullptr;
3400}
3401
3402/// Find the declaration to use to populate the anonymous declaration table
3403/// for the given lexical DeclContext. We only care about finding local
3404/// definitions of the context; we'll merge imported ones as we go.
3405DeclContext *
3406ASTDeclReader::getPrimaryDCForAnonymousDecl(DeclContext *LexicalDC) {
3407 // For classes, we track the definition as we merge.
3408 if (auto *RD = dyn_cast<CXXRecordDecl>(LexicalDC)) {
3409 auto *DD = RD->getCanonicalDecl()->DefinitionData;
3410 return DD ? DD->Definition : nullptr;
3411 } else if (auto *OID = dyn_cast<ObjCInterfaceDecl>(LexicalDC)) {
3412 return OID->getCanonicalDecl()->getDefinition();
3413 }
3414
3415 // For anything else, walk its merged redeclarations looking for a definition.
3416 // Note that we can't just call getDefinition here because the redeclaration
3417 // chain isn't wired up.
3418 for (auto *D : merged_redecls(cast<Decl>(LexicalDC))) {
3419 if (auto *FD = dyn_cast<FunctionDecl>(D))
3420 if (FD->isThisDeclarationADefinition())
3421 return FD;
3422 if (auto *MD = dyn_cast<ObjCMethodDecl>(D))
3423 if (MD->isThisDeclarationADefinition())
3424 return MD;
3425 if (auto *RD = dyn_cast<RecordDecl>(D))
3427 return RD;
3428 }
3429
3430 // No merged definition yet.
3431 return nullptr;
3432}
3433
3434NamedDecl *ASTDeclReader::getAnonymousDeclForMerging(ASTReader &Reader,
3435 DeclContext *DC,
3436 unsigned Index) {
3437 // If the lexical context has been merged, look into the now-canonical
3438 // definition.
3439 auto *CanonDC = cast<Decl>(DC)->getCanonicalDecl();
3440
3441 // If we've seen this before, return the canonical declaration.
3442 auto &Previous = Reader.AnonymousDeclarationsForMerging[CanonDC];
3443 if (Index < Previous.size() && Previous[Index])
3444 return Previous[Index];
3445
3446 // If this is the first time, but we have parsed a declaration of the context,
3447 // build the anonymous declaration list from the parsed declaration.
3448 auto *PrimaryDC = getPrimaryDCForAnonymousDecl(DC);
3449 auto needToNumberAnonymousDeclsWithin = [](Decl *D) {
3450 if (!D->isFromASTFile())
3451 return true;
3452 // If this is a class template specialization from an AST file, has at least
3453 // one field, but none of the fields have been loaded from external storage,
3454 // this is a situation where the class template specialization decl
3455 // was imported but the definition was instantiated within the source.
3456 // In such a case, we still need to number the anonymous decls.
3457 auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D);
3458 return CTSD && !CTSD->noload_field_empty() &&
3459 !CTSD->hasLoadedFieldsFromExternalStorage();
3460 };
3461 if (PrimaryDC && needToNumberAnonymousDeclsWithin(cast<Decl>(PrimaryDC))) {
3462 numberAnonymousDeclsWithin(PrimaryDC, [&](NamedDecl *ND, unsigned Number) {
3463 if (Previous.size() == Number)
3464 Previous.push_back(cast<NamedDecl>(ND->getCanonicalDecl()));
3465 else
3466 Previous[Number] = cast<NamedDecl>(ND->getCanonicalDecl());
3467 });
3468 }
3469
3470 return Index < Previous.size() ? Previous[Index] : nullptr;
3471}
3472
3473void ASTDeclReader::setAnonymousDeclForMerging(ASTReader &Reader,
3474 DeclContext *DC, unsigned Index,
3475 NamedDecl *D) {
3476 auto *CanonDC = cast<Decl>(DC)->getCanonicalDecl();
3477
3478 auto &Previous = Reader.AnonymousDeclarationsForMerging[CanonDC];
3479 if (Index >= Previous.size())
3480 Previous.resize(Index + 1);
3481 if (!Previous[Index])
3482 Previous[Index] = D;
3483}
3484
3485ASTDeclReader::FindExistingResult ASTDeclReader::findExisting(NamedDecl *D) {
3486 DeclarationName Name = TypedefNameForLinkage ? TypedefNameForLinkage
3487 : D->getDeclName();
3488
3489 if (!Name && !needsAnonymousDeclarationNumber(D)) {
3490 // Don't bother trying to find unnamed declarations that are in
3491 // unmergeable contexts.
3492 FindExistingResult Result(Reader, D, /*Existing=*/nullptr,
3493 AnonymousDeclNumber, TypedefNameForLinkage);
3494 Result.suppress();
3495 return Result;
3496 }
3497
3498 ASTContext &C = Reader.getContext();
3499 DeclContext *DC = D->getDeclContext()->getRedeclContext();
3500 if (TypedefNameForLinkage) {
3501 auto It = Reader.ImportedTypedefNamesForLinkage.find(
3502 std::make_pair(DC, TypedefNameForLinkage));
3503 if (It != Reader.ImportedTypedefNamesForLinkage.end())
3504 if (C.isSameEntity(It->second, D))
3505 return FindExistingResult(Reader, D, It->second, AnonymousDeclNumber,
3506 TypedefNameForLinkage);
3507 // Go on to check in other places in case an existing typedef name
3508 // was not imported.
3509 }
3510
3512 // This is an anonymous declaration that we may need to merge. Look it up
3513 // in its context by number.
3514 if (auto *Existing = getAnonymousDeclForMerging(
3515 Reader, D->getLexicalDeclContext(), AnonymousDeclNumber))
3516 if (C.isSameEntity(Existing, D))
3517 return FindExistingResult(Reader, D, Existing, AnonymousDeclNumber,
3518 TypedefNameForLinkage);
3519 } else if (DC->isTranslationUnit() &&
3520 !Reader.getContext().getLangOpts().CPlusPlus) {
3521 IdentifierResolver &IdResolver = Reader.getIdResolver();
3522
3523 // Temporarily consider the identifier to be up-to-date. We don't want to
3524 // cause additional lookups here.
3525 class UpToDateIdentifierRAII {
3526 IdentifierInfo *II;
3527 bool WasOutToDate = false;
3528
3529 public:
3530 explicit UpToDateIdentifierRAII(IdentifierInfo *II) : II(II) {
3531 if (II) {
3532 WasOutToDate = II->isOutOfDate();
3533 if (WasOutToDate)
3534 II->setOutOfDate(false);
3535 }
3536 }
3537
3538 ~UpToDateIdentifierRAII() {
3539 if (WasOutToDate)
3540 II->setOutOfDate(true);
3541 }
3542 } UpToDate(Name.getAsIdentifierInfo());
3543
3544 for (IdentifierResolver::iterator I = IdResolver.begin(Name),
3545 IEnd = IdResolver.end();
3546 I != IEnd; ++I) {
3547 if (NamedDecl *Existing = getDeclForMerging(*I, TypedefNameForLinkage))
3548 if (C.isSameEntity(Existing, D))
3549 return FindExistingResult(Reader, D, Existing, AnonymousDeclNumber,
3550 TypedefNameForLinkage);
3551 }
3552 } else if (DeclContext *MergeDC = getPrimaryContextForMerging(Reader, DC)) {
3553 DeclContext::lookup_result R = MergeDC->noload_lookup(Name);
3554 for (DeclContext::lookup_iterator I = R.begin(), E = R.end(); I != E; ++I) {
3555 if (NamedDecl *Existing = getDeclForMerging(*I, TypedefNameForLinkage))
3556 if (C.isSameEntity(Existing, D))
3557 return FindExistingResult(Reader, D, Existing, AnonymousDeclNumber,
3558 TypedefNameForLinkage);
3559 }
3560 } else {
3561 // Not in a mergeable context.
3562 return FindExistingResult(Reader);
3563 }
3564
3565 // If this declaration is from a merged context, make a note that we need to
3566 // check that the canonical definition of that context contains the decl.
3567 //
3568 // Note that we don't perform ODR checks for decls from the global module
3569 // fragment.
3570 //
3571 // FIXME: We should do something similar if we merge two definitions of the
3572 // same template specialization into the same CXXRecordDecl.
3573 auto MergedDCIt = Reader.MergedDeclContexts.find(D->getLexicalDeclContext());
3574 if (MergedDCIt != Reader.MergedDeclContexts.end() &&
3575 !shouldSkipCheckingODR(D) && MergedDCIt->second == D->getDeclContext() &&
3577 Reader.PendingOdrMergeChecks.push_back(D);
3578
3579 return FindExistingResult(Reader, D, /*Existing=*/nullptr,
3580 AnonymousDeclNumber, TypedefNameForLinkage);
3581}
3582
3583template<typename DeclT>
3587
3589 llvm_unreachable("getMostRecentDecl on non-redeclarable declaration");
3590}
3591
3593 assert(D);
3594
3595 switch (D->getKind()) {
3596#define ABSTRACT_DECL(TYPE)
3597#define DECL(TYPE, BASE) \
3598 case Decl::TYPE: \
3599 return getMostRecentDeclImpl(cast<TYPE##Decl>(D));
3600#include "clang/AST/DeclNodes.inc"
3601 }
3602 llvm_unreachable("unknown decl kind");
3603}
3604
3605Decl *ASTReader::getMostRecentExistingDecl(Decl *D) {
3607}
3608
3609namespace {
3610void mergeInheritableAttributes(ASTReader &Reader, Decl *D, Decl *Previous) {
3611 InheritableAttr *NewAttr = nullptr;
3612 ASTContext &Context = Reader.getContext();
3613 const auto *IA = Previous->getAttr<MSInheritanceAttr>();
3614
3615 if (IA && !D->hasAttr<MSInheritanceAttr>()) {
3616 NewAttr = cast<InheritableAttr>(IA->clone(Context));
3617 NewAttr->setInherited(true);
3618 D->addAttr(NewAttr);
3619 }
3620
3621 const auto *AA = Previous->getAttr<AvailabilityAttr>();
3622 if (AA && !D->hasAttr<AvailabilityAttr>()) {
3623 NewAttr = AA->clone(Context);
3624 NewAttr->setInherited(true);
3625 D->addAttr(NewAttr);
3626 }
3627}
3628} // namespace
3629
3630template<typename DeclT>
3637
3638namespace clang {
3639
3640template<>
3643 Decl *Previous, Decl *Canon) {
3644 auto *VD = static_cast<VarDecl *>(D);
3645 auto *PrevVD = cast<VarDecl>(Previous);
3646 D->RedeclLink.setPrevious(PrevVD);
3647 D->First = PrevVD->First;
3648
3649 // We should keep at most one definition on the chain.
3650 // FIXME: Cache the definition once we've found it. Building a chain with
3651 // N definitions currently takes O(N^2) time here.
3652 if (VD->isThisDeclarationADefinition() == VarDecl::Definition) {
3653 for (VarDecl *CurD = PrevVD; CurD; CurD = CurD->getPreviousDecl()) {
3654 if (CurD->isThisDeclarationADefinition() == VarDecl::Definition) {
3655 Reader.mergeDefinitionVisibility(CurD, VD);
3656 VD->demoteThisDefinitionToDeclaration();
3657 break;
3658 }
3659 }
3660 }
3661}
3662
3664 auto *DT = T->getContainedDeducedType();
3665 return DT && !DT->isDeduced();
3666}
3667
3668template<>
3671 Decl *Previous, Decl *Canon) {
3672 auto *FD = static_cast<FunctionDecl *>(D);
3673 auto *PrevFD = cast<FunctionDecl>(Previous);
3674
3675 FD->RedeclLink.setPrevious(PrevFD);
3676 FD->First = PrevFD->First;
3677
3678 // If the previous declaration is an inline function declaration, then this
3679 // declaration is too.
3680 if (PrevFD->isInlined() != FD->isInlined()) {
3681 // FIXME: [dcl.fct.spec]p4:
3682 // If a function with external linkage is declared inline in one
3683 // translation unit, it shall be declared inline in all translation
3684 // units in which it appears.
3685 //
3686 // Be careful of this case:
3687 //
3688 // module A:
3689 // template<typename T> struct X { void f(); };
3690 // template<typename T> inline void X<T>::f() {}
3691 //
3692 // module B instantiates the declaration of X<int>::f
3693 // module C instantiates the definition of X<int>::f
3694 //
3695 // If module B and C are merged, we do not have a violation of this rule.
3696 FD->setImplicitlyInline(true);
3697 }
3698
3699 auto *FPT = FD->getType()->getAs<FunctionProtoType>();
3700 auto *PrevFPT = PrevFD->getType()->getAs<FunctionProtoType>();
3701 if (FPT && PrevFPT) {
3702 // If we need to propagate an exception specification along the redecl
3703 // chain, make a note of that so that we can do so later.
3704 bool IsUnresolved = isUnresolvedExceptionSpec(FPT->getExceptionSpecType());
3705 bool WasUnresolved =
3707 if (IsUnresolved != WasUnresolved)
3708 Reader.PendingExceptionSpecUpdates.insert(
3709 {Canon, IsUnresolved ? PrevFD : FD});
3710
3711 // If we need to propagate a deduced return type along the redecl chain,
3712 // make a note of that so that we can do it later.
3713 bool IsUndeduced = isUndeducedReturnType(FPT->getReturnType());
3714 bool WasUndeduced = isUndeducedReturnType(PrevFPT->getReturnType());
3715 if (IsUndeduced != WasUndeduced)
3716 Reader.PendingDeducedTypeUpdates.insert(
3717 {cast<FunctionDecl>(Canon),
3718 (IsUndeduced ? PrevFPT : FPT)->getReturnType()});
3719 }
3720}
3721
3722} // namespace clang
3723
3725 llvm_unreachable("attachPreviousDecl on non-redeclarable declaration");
3726}
3727
3728/// Inherit the default template argument from \p From to \p To. Returns
3729/// \c false if there is no default template for \p From.
3730template <typename ParmDecl>
3731static bool inheritDefaultTemplateArgument(ASTContext &Context, ParmDecl *From,
3732 Decl *ToD) {
3733 auto *To = cast<ParmDecl>(ToD);
3734 if (!From->hasDefaultArgument())
3735 return false;
3736 To->setInheritedDefaultArgument(Context, From);
3737 return true;
3738}
3739
3741 TemplateDecl *From,
3742 TemplateDecl *To) {
3743 auto *FromTP = From->getTemplateParameters();
3744 auto *ToTP = To->getTemplateParameters();
3745 assert(FromTP->size() == ToTP->size() && "merged mismatched templates?");
3746
3747 for (unsigned I = 0, N = FromTP->size(); I != N; ++I) {
3748 NamedDecl *FromParam = FromTP->getParam(I);
3749 NamedDecl *ToParam = ToTP->getParam(I);
3750
3751 if (auto *FTTP = dyn_cast<TemplateTypeParmDecl>(FromParam))
3752 inheritDefaultTemplateArgument(Context, FTTP, ToParam);
3753 else if (auto *FNTTP = dyn_cast<NonTypeTemplateParmDecl>(FromParam))
3754 inheritDefaultTemplateArgument(Context, FNTTP, ToParam);
3755 else
3757 Context, cast<TemplateTemplateParmDecl>(FromParam), ToParam);
3758 }
3759}
3760
3761// [basic.link]/p10:
3762// If two declarations of an entity are attached to different modules,
3763// the program is ill-formed;
3765 Decl *D,
3766 Decl *Previous) {
3767 // If it is previous implcitly introduced, it is not meaningful to
3768 // diagnose it.
3769 if (Previous->isImplicit())
3770 return;
3771
3772 // FIXME: Get rid of the enumeration of decl types once we have an appropriate
3773 // abstract for decls of an entity. e.g., the namespace decl and using decl
3774 // doesn't introduce an entity.
3776 return;
3777
3778 // Skip implicit instantiations since it may give false positive diagnostic
3779 // messages.
3780 // FIXME: Maybe this shows the implicit instantiations may have incorrect
3781 // module owner ships. But given we've finished the compilation of a module,
3782 // how can we add new entities to that module?
3784 return;
3786 return;
3787 if (auto *Func = dyn_cast<FunctionDecl>(Previous);
3788 Func && Func->getTemplateSpecializationInfo())
3789 return;
3790
3791 // The module ownership of in-class friend declaration is not straightforward.
3792 // Avoid diagnosing such cases.
3793 if (D->getFriendObjectKind() || Previous->getFriendObjectKind())
3794 return;
3795
3796 // Skip diagnosing in-class declarations.
3797 if (!Previous->getLexicalDeclContext()
3798 ->getNonTransparentContext()
3799 ->isFileContext() ||
3801 return;
3802
3803 Module *M = Previous->getOwningModule();
3804 if (!M)
3805 return;
3806
3807 // We only forbids merging decls within named modules.
3808 if (!M->isNamedModule()) {
3809 // Try to warn the case that we merged decls from global module.
3810 if (!M->isGlobalModule())
3811 return;
3812
3813 if (D->getOwningModule() &&
3815 return;
3816
3817 Reader.PendingWarningForDuplicatedDefsInModuleUnits.push_back(
3818 {D, Previous});
3819 return;
3820 }
3821
3822 // It is fine if they are in the same module.
3823 if (Reader.getContext().isInSameModule(M, D->getOwningModule()))
3824 return;
3825
3826 Reader.Diag(Previous->getLocation(),
3827 diag::err_multiple_decl_in_different_modules)
3828 << cast<NamedDecl>(Previous) << M->Name;
3829 Reader.Diag(D->getLocation(), diag::note_also_found);
3830}
3831
3833 Decl *Previous, Decl *Canon) {
3834 assert(D && Previous);
3835
3836 switch (D->getKind()) {
3837#define ABSTRACT_DECL(TYPE)
3838#define DECL(TYPE, BASE) \
3839 case Decl::TYPE: \
3840 attachPreviousDeclImpl(Reader, cast<TYPE##Decl>(D), Previous, Canon); \
3841 break;
3842#include "clang/AST/DeclNodes.inc"
3843 }
3844
3846
3847 // If the declaration was visible in one module, a redeclaration of it in
3848 // another module remains visible even if it wouldn't be visible by itself.
3849 //
3850 // FIXME: In this case, the declaration should only be visible if a module
3851 // that makes it visible has been imported.
3853 Previous->IdentifierNamespace &
3855
3856 // If the declaration declares a template, it may inherit default arguments
3857 // from the previous declaration.
3858 if (auto *TD = dyn_cast<TemplateDecl>(D))
3859 inheritDefaultTemplateArguments(Reader.getContext(),
3861
3862 // If any of the declaration in the chain contains an Inheritable attribute,
3863 // it needs to be added to all the declarations in the redeclarable chain.
3864 // FIXME: Only the logic of merging MSInheritableAttr is present, it should
3865 // be extended for all inheritable attributes.
3866 mergeInheritableAttributes(Reader, D, Previous);
3867}
3868
3869template<typename DeclT>
3873
3875 llvm_unreachable("attachLatestDecl on non-redeclarable declaration");
3876}
3877
3879 assert(D && Latest);
3880
3881 switch (D->getKind()) {
3882#define ABSTRACT_DECL(TYPE)
3883#define DECL(TYPE, BASE) \
3884 case Decl::TYPE: \
3885 attachLatestDeclImpl(cast<TYPE##Decl>(D), Latest); \
3886 break;
3887#include "clang/AST/DeclNodes.inc"
3888 }
3889}
3890
3891template<typename DeclT>
3895
3897 llvm_unreachable("markIncompleteDeclChain on non-redeclarable declaration");
3898}
3899
3900void ASTReader::markIncompleteDeclChain(Decl *D) {
3901 switch (D->getKind()) {
3902#define ABSTRACT_DECL(TYPE)
3903#define DECL(TYPE, BASE) \
3904 case Decl::TYPE: \
3905 ASTDeclReader::markIncompleteDeclChainImpl(cast<TYPE##Decl>(D)); \
3906 break;
3907#include "clang/AST/DeclNodes.inc"
3908 }
3909}
3910
3911/// Read the declaration at the given offset from the AST file.
3912Decl *ASTReader::ReadDeclRecord(GlobalDeclID ID) {
3913 SourceLocation DeclLoc;
3914 RecordLocation Loc = DeclCursorForID(ID, DeclLoc);
3915 llvm::BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
3916 // Keep track of where we are in the stream, then jump back there
3917 // after reading this declaration.
3918 SavedStreamPosition SavedPosition(DeclsCursor);
3919
3920 ReadingKindTracker ReadingKind(Read_Decl, *this);
3921
3922 // Note that we are loading a declaration record.
3923 Deserializing ADecl(this);
3924
3925 auto Fail = [](const char *what, llvm::Error &&Err) {
3926 llvm::report_fatal_error(Twine("ASTReader::readDeclRecord failed ") + what +
3927 ": " + toString(std::move(Err)));
3928 };
3929
3930 if (llvm::Error JumpFailed = DeclsCursor.JumpToBit(Loc.Offset))
3931 Fail("jumping", std::move(JumpFailed));
3932 ASTRecordReader Record(*this, *Loc.F);
3933 ASTDeclReader Reader(*this, Record, Loc, ID, DeclLoc);
3934 Expected<unsigned> MaybeCode = DeclsCursor.ReadCode();
3935 if (!MaybeCode)
3936 Fail("reading code", MaybeCode.takeError());
3937 unsigned Code = MaybeCode.get();
3938
3939 ASTContext &Context = getContext();
3940 Decl *D = nullptr;
3941 Expected<unsigned> MaybeDeclCode = Record.readRecord(DeclsCursor, Code);
3942 if (!MaybeDeclCode)
3943 llvm::report_fatal_error(
3944 Twine("ASTReader::readDeclRecord failed reading decl code: ") +
3945 toString(MaybeDeclCode.takeError()));
3946
3947 switch ((DeclCode)MaybeDeclCode.get()) {
3954 llvm_unreachable("Record cannot be de-serialized with readDeclRecord");
3955 case DECL_TYPEDEF:
3956 D = TypedefDecl::CreateDeserialized(Context, ID);
3957 break;
3958 case DECL_TYPEALIAS:
3959 D = TypeAliasDecl::CreateDeserialized(Context, ID);
3960 break;
3961 case DECL_ENUM:
3962 D = EnumDecl::CreateDeserialized(Context, ID);
3963 break;
3964 case DECL_RECORD:
3965 D = RecordDecl::CreateDeserialized(Context, ID);
3966 break;
3967 case DECL_ENUM_CONSTANT:
3968 D = EnumConstantDecl::CreateDeserialized(Context, ID);
3969 break;
3970 case DECL_FUNCTION:
3971 D = FunctionDecl::CreateDeserialized(Context, ID);
3972 break;
3973 case DECL_LINKAGE_SPEC:
3974 D = LinkageSpecDecl::CreateDeserialized(Context, ID);
3975 break;
3976 case DECL_EXPORT:
3977 D = ExportDecl::CreateDeserialized(Context, ID);
3978 break;
3979 case DECL_LABEL:
3980 D = LabelDecl::CreateDeserialized(Context, ID);
3981 break;
3982 case DECL_NAMESPACE:
3983 D = NamespaceDecl::CreateDeserialized(Context, ID);
3984 break;
3987 break;
3988 case DECL_USING:
3989 D = UsingDecl::CreateDeserialized(Context, ID);
3990 break;
3991 case DECL_USING_PACK:
3992 D = UsingPackDecl::CreateDeserialized(Context, ID, Record.readInt());
3993 break;
3994 case DECL_USING_SHADOW:
3995 D = UsingShadowDecl::CreateDeserialized(Context, ID);
3996 break;
3997 case DECL_USING_ENUM:
3998 D = UsingEnumDecl::CreateDeserialized(Context, ID);
3999 break;
4002 break;
4005 break;
4008 break;
4011 break;
4014 break;
4015 case DECL_CXX_RECORD:
4016 D = CXXRecordDecl::CreateDeserialized(Context, ID);
4017 break;
4020 break;
4021 case DECL_CXX_METHOD:
4022 D = CXXMethodDecl::CreateDeserialized(Context, ID);
4023 break;
4025 D = CXXConstructorDecl::CreateDeserialized(Context, ID, Record.readInt());
4026 break;
4029 break;
4032 break;
4033 case DECL_ACCESS_SPEC:
4034 D = AccessSpecDecl::CreateDeserialized(Context, ID);
4035 break;
4036 case DECL_FRIEND:
4037 D = FriendDecl::CreateDeserialized(Context, ID, Record.readInt());
4038 break;
4041 break;
4044 break;
4047 break;
4050 break;
4051 case DECL_VAR_TEMPLATE:
4052 D = VarTemplateDecl::CreateDeserialized(Context, ID);
4053 break;
4056 break;
4059 break;
4062 break;
4064 bool HasTypeConstraint = Record.readInt();
4066 HasTypeConstraint);
4067 break;
4068 }
4070 bool HasTypeConstraint = Record.readInt();
4072 HasTypeConstraint);
4073 break;
4074 }
4076 bool HasTypeConstraint = Record.readInt();
4078 Context, ID, Record.readInt(), HasTypeConstraint);
4079 break;
4080 }
4083 break;
4086 Record.readInt());
4087 break;
4090 break;
4091 case DECL_CONCEPT:
4092 D = ConceptDecl::CreateDeserialized(Context, ID);
4093 break;
4096 break;
4097 case DECL_STATIC_ASSERT:
4098 D = StaticAssertDecl::CreateDeserialized(Context, ID);
4099 break;
4100 case DECL_OBJC_METHOD:
4101 D = ObjCMethodDecl::CreateDeserialized(Context, ID);
4102 break;
4105 break;
4106 case DECL_OBJC_IVAR:
4107 D = ObjCIvarDecl::CreateDeserialized(Context, ID);
4108 break;
4109 case DECL_OBJC_PROTOCOL:
4110 D = ObjCProtocolDecl::CreateDeserialized(Context, ID);
4111 break;
4114 break;
4115 case DECL_OBJC_CATEGORY:
4116 D = ObjCCategoryDecl::CreateDeserialized(Context, ID);
4117 break;
4120 break;
4123 break;
4126 break;
4127 case DECL_OBJC_PROPERTY:
4128 D = ObjCPropertyDecl::CreateDeserialized(Context, ID);
4129 break;
4132 break;
4133 case DECL_FIELD:
4134 D = FieldDecl::CreateDeserialized(Context, ID);
4135 break;
4136 case DECL_INDIRECTFIELD:
4138 break;
4139 case DECL_VAR:
4140 D = VarDecl::CreateDeserialized(Context, ID);
4141 break;
4144 break;
4145 case DECL_PARM_VAR:
4146 D = ParmVarDecl::CreateDeserialized(Context, ID);
4147 break;
4148 case DECL_DECOMPOSITION:
4149 D = DecompositionDecl::CreateDeserialized(Context, ID, Record.readInt());
4150 break;
4151 case DECL_BINDING:
4152 D = BindingDecl::CreateDeserialized(Context, ID);
4153 break;
4155 D = FileScopeAsmDecl::CreateDeserialized(Context, ID);
4156 break;
4158 D = TopLevelStmtDecl::CreateDeserialized(Context, ID);
4159 break;
4160 case DECL_BLOCK:
4161 D = BlockDecl::CreateDeserialized(Context, ID);
4162 break;
4163 case DECL_MS_PROPERTY:
4164 D = MSPropertyDecl::CreateDeserialized(Context, ID);
4165 break;
4166 case DECL_MS_GUID:
4167 D = MSGuidDecl::CreateDeserialized(Context, ID);
4168 break;
4170 D = UnnamedGlobalConstantDecl::CreateDeserialized(Context, ID);
4171 break;
4173 D = TemplateParamObjectDecl::CreateDeserialized(Context, ID);
4174 break;
4176 D = OutlinedFunctionDecl::CreateDeserialized(Context, ID, Record.readInt());
4177 break;
4178 case DECL_CAPTURED:
4179 D = CapturedDecl::CreateDeserialized(Context, ID, Record.readInt());
4180 break;
4182 Error("attempt to read a C++ base-specifier record as a declaration");
4183 return nullptr;
4185 Error("attempt to read a C++ ctor initializer record as a declaration");
4186 return nullptr;
4187 case DECL_IMPORT:
4188 // Note: last entry of the ImportDecl record is the number of stored source
4189 // locations.
4190 D = ImportDecl::CreateDeserialized(Context, ID, Record.back());
4191 break;
4193 Record.skipInts(1);
4194 unsigned NumChildren = Record.readInt();
4195 Record.skipInts(1);
4196 D = OMPThreadPrivateDecl::CreateDeserialized(Context, ID, NumChildren);
4197 break;
4198 }
4199 case DECL_OMP_ALLOCATE: {
4200 unsigned NumClauses = Record.readInt();
4201 unsigned NumVars = Record.readInt();
4202 Record.skipInts(1);
4203 D = OMPAllocateDecl::CreateDeserialized(Context, ID, NumVars, NumClauses);
4204 break;
4205 }
4206 case DECL_OMP_REQUIRES: {
4207 unsigned NumClauses = Record.readInt();
4208 Record.skipInts(2);
4209 D = OMPRequiresDecl::CreateDeserialized(Context, ID, NumClauses);
4210 break;
4211 }
4214 break;
4216 unsigned NumClauses = Record.readInt();
4217 Record.skipInts(2);
4218 D = OMPDeclareMapperDecl::CreateDeserialized(Context, ID, NumClauses);
4219 break;
4220 }
4223 break;
4225 D = PragmaCommentDecl::CreateDeserialized(Context, ID, Record.readInt());
4226 break;
4229 Record.readInt());
4230 break;
4231 case DECL_EMPTY:
4232 D = EmptyDecl::CreateDeserialized(Context, ID);
4233 break;
4236 break;
4239 break;
4240 case DECL_HLSL_BUFFER:
4241 D = HLSLBufferDecl::CreateDeserialized(Context, ID);
4242 break;
4245 Record.readInt());
4246 break;
4248 D = OpenACCDeclareDecl::CreateDeserialized(Context, ID, Record.readInt());
4249 break;
4251 D = OpenACCRoutineDecl::CreateDeserialized(Context, ID, Record.readInt());
4252 break;
4253 }
4254
4255 assert(D && "Unknown declaration reading AST file");
4256 LoadedDecl(translateGlobalDeclIDToIndex(ID), D);
4257 // Set the DeclContext before doing any deserialization, to make sure internal
4258 // calls to Decl::getASTContext() by Decl's methods will find the
4259 // TranslationUnitDecl without crashing.
4261
4262 // Reading some declarations can result in deep recursion.
4263 runWithSufficientStackSpace(DeclLoc, [&] { Reader.Visit(D); });
4264
4265 // If this declaration is also a declaration context, get the
4266 // offsets for its tables of lexical and visible declarations.
4267 if (auto *DC = dyn_cast<DeclContext>(D)) {
4268 LookupBlockOffsets Offsets;
4269
4270 Reader.VisitDeclContext(DC, Offsets);
4271
4272 // Get the lexical and visible block for the delayed namespace.
4273 // It is sufficient to judge if ID is in DelayedNamespaceOffsetMap.
4274 // But it may be more efficient to filter the other cases.
4275 if (!Offsets && isa<NamespaceDecl>(D))
4276 if (auto Iter = DelayedNamespaceOffsetMap.find(ID);
4277 Iter != DelayedNamespaceOffsetMap.end())
4278 Offsets = Iter->second;
4279
4280 if (Offsets.VisibleOffset &&
4281 ReadVisibleDeclContextStorage(
4282 *Loc.F, DeclsCursor, Offsets.VisibleOffset, ID,
4283 VisibleDeclContextStorageKind::GenerallyVisible))
4284 return nullptr;
4285 if (Offsets.ModuleLocalOffset &&
4286 ReadVisibleDeclContextStorage(
4287 *Loc.F, DeclsCursor, Offsets.ModuleLocalOffset, ID,
4288 VisibleDeclContextStorageKind::ModuleLocalVisible))
4289 return nullptr;
4290 if (Offsets.TULocalOffset &&
4291 ReadVisibleDeclContextStorage(
4292 *Loc.F, DeclsCursor, Offsets.TULocalOffset, ID,
4293 VisibleDeclContextStorageKind::TULocalVisible))
4294 return nullptr;
4295
4296 if (Offsets.LexicalOffset &&
4297 ReadLexicalDeclContextStorage(*Loc.F, DeclsCursor,
4298 Offsets.LexicalOffset, DC))
4299 return nullptr;
4300 }
4301 assert(Record.getIdx() == Record.size());
4302
4303 // Load any relevant update records.
4304 PendingUpdateRecords.push_back(
4305 PendingUpdateRecord(ID, D, /*JustLoaded=*/true));
4306
4307 // Load the categories after recursive loading is finished.
4308 if (auto *Class = dyn_cast<ObjCInterfaceDecl>(D))
4309 // If we already have a definition when deserializing the ObjCInterfaceDecl,
4310 // we put the Decl in PendingDefinitions so we can pull the categories here.
4311 if (Class->isThisDeclarationADefinition() ||
4312 PendingDefinitions.count(Class))
4313 loadObjCCategories(ID, Class);
4314
4315 // If we have deserialized a declaration that has a definition the
4316 // AST consumer might need to know about, queue it.
4317 // We don't pass it to the consumer immediately because we may be in recursive
4318 // loading, and some declarations may still be initializing.
4319 PotentiallyInterestingDecls.push_back(D);
4320
4321 return D;
4322}
4323
4324void ASTReader::PassInterestingDeclsToConsumer() {
4325 assert(Consumer);
4326
4327 if (!CanPassDeclsToConsumer)
4328 return;
4329
4330 // Guard variable to avoid recursively redoing the process of passing
4331 // decls to consumer.
4332 SaveAndRestore GuardPassingDeclsToConsumer(CanPassDeclsToConsumer,
4333 /*NewValue=*/false);
4334
4335 // Ensure that we've loaded all potentially-interesting declarations
4336 // that need to be eagerly loaded.
4337 for (auto ID : EagerlyDeserializedDecls)
4338 GetDecl(ID);
4339 EagerlyDeserializedDecls.clear();
4340
4341 auto ConsumingPotentialInterestingDecls = [this]() {
4342 while (!PotentiallyInterestingDecls.empty()) {
4343 Decl *D = PotentiallyInterestingDecls.front();
4344 PotentiallyInterestingDecls.pop_front();
4345 if (isConsumerInterestedIn(D))
4346 PassInterestingDeclToConsumer(D);
4347 }
4348 };
4349 std::deque<Decl *> MaybeInterestingDecls =
4350 std::move(PotentiallyInterestingDecls);
4351 PotentiallyInterestingDecls.clear();
4352 assert(PotentiallyInterestingDecls.empty());
4353 while (!MaybeInterestingDecls.empty()) {
4354 Decl *D = MaybeInterestingDecls.front();
4355 MaybeInterestingDecls.pop_front();
4356 // Since we load the variable's initializers lazily, it'd be problematic
4357 // if the initializers dependent on each other. So here we try to load the
4358 // initializers of static variables to make sure they are passed to code
4359 // generator by order. If we read anything interesting, we would consume
4360 // that before emitting the current declaration.
4361 if (auto *VD = dyn_cast<VarDecl>(D);
4362 VD && VD->isFileVarDecl() && !VD->isExternallyVisible())
4363 VD->getInit();
4364 ConsumingPotentialInterestingDecls();
4365 if (isConsumerInterestedIn(D))
4366 PassInterestingDeclToConsumer(D);
4367 }
4368
4369 // If we add any new potential interesting decl in the last call, consume it.
4370 ConsumingPotentialInterestingDecls();
4371
4372 for (GlobalDeclID ID : VTablesToEmit) {
4373 auto *RD = cast<CXXRecordDecl>(GetDecl(ID));
4374 assert(!RD->shouldEmitInExternalSource());
4375 PassVTableToConsumer(RD);
4376 }
4377 VTablesToEmit.clear();
4378}
4379
4380void ASTReader::loadDeclUpdateRecords(PendingUpdateRecord &Record) {
4381 // The declaration may have been modified by files later in the chain.
4382 // If this is the case, read the record containing the updates from each file
4383 // and pass it to ASTDeclReader to make the modifications.
4384 GlobalDeclID ID = Record.ID;
4385 Decl *D = Record.D;
4386 ProcessingUpdatesRAIIObj ProcessingUpdates(*this);
4387 DeclUpdateOffsetsMap::iterator UpdI = DeclUpdateOffsets.find(ID);
4388
4389 if (UpdI != DeclUpdateOffsets.end()) {
4390 auto UpdateOffsets = std::move(UpdI->second);
4391 DeclUpdateOffsets.erase(UpdI);
4392
4393 // Check if this decl was interesting to the consumer. If we just loaded
4394 // the declaration, then we know it was interesting and we skip the call
4395 // to isConsumerInterestedIn because it is unsafe to call in the
4396 // current ASTReader state.
4397 bool WasInteresting = Record.JustLoaded || isConsumerInterestedIn(D);
4398 for (auto &FileAndOffset : UpdateOffsets) {
4399 ModuleFile *F = FileAndOffset.first;
4400 uint64_t Offset = FileAndOffset.second;
4401 llvm::BitstreamCursor &Cursor = F->DeclsCursor;
4402 SavedStreamPosition SavedPosition(Cursor);
4403 if (llvm::Error JumpFailed = Cursor.JumpToBit(Offset))
4404 // FIXME don't do a fatal error.
4405 llvm::report_fatal_error(
4406 Twine("ASTReader::loadDeclUpdateRecords failed jumping: ") +
4407 toString(std::move(JumpFailed)));
4408 Expected<unsigned> MaybeCode = Cursor.ReadCode();
4409 if (!MaybeCode)
4410 llvm::report_fatal_error(
4411 Twine("ASTReader::loadDeclUpdateRecords failed reading code: ") +
4412 toString(MaybeCode.takeError()));
4413 unsigned Code = MaybeCode.get();
4414 ASTRecordReader Record(*this, *F);
4415 if (Expected<unsigned> MaybeRecCode = Record.readRecord(Cursor, Code))
4416 assert(MaybeRecCode.get() == DECL_UPDATES &&
4417 "Expected DECL_UPDATES record!");
4418 else
4419 llvm::report_fatal_error(
4420 Twine("ASTReader::loadDeclUpdateRecords failed reading rec code: ") +
4421 toString(MaybeCode.takeError()));
4422
4423 ASTDeclReader Reader(*this, Record, RecordLocation(F, Offset), ID,
4424 SourceLocation());
4425 Reader.UpdateDecl(D);
4426
4427 // We might have made this declaration interesting. If so, remember that
4428 // we need to hand it off to the consumer.
4429 if (!WasInteresting && isConsumerInterestedIn(D)) {
4430 PotentiallyInterestingDecls.push_back(D);
4431 WasInteresting = true;
4432 }
4433 }
4434 }
4435
4436 // Load the pending visible updates for this decl context, if it has any.
4437 if (auto I = PendingVisibleUpdates.find(ID);
4438 I != PendingVisibleUpdates.end()) {
4439 auto VisibleUpdates = std::move(I->second);
4440 PendingVisibleUpdates.erase(I);
4441
4442 auto *DC = cast<DeclContext>(D)->getPrimaryContext();
4443 for (const auto &Update : VisibleUpdates)
4444 Lookups[DC].Table.add(
4445 Update.Mod, Update.Data,
4446 reader::ASTDeclContextNameLookupTrait(*this, *Update.Mod));
4448 }
4449
4450 if (auto I = PendingModuleLocalVisibleUpdates.find(ID);
4451 I != PendingModuleLocalVisibleUpdates.end()) {
4452 auto ModuleLocalVisibleUpdates = std::move(I->second);
4453 PendingModuleLocalVisibleUpdates.erase(I);
4454
4455 auto *DC = cast<DeclContext>(D)->getPrimaryContext();
4456 for (const auto &Update : ModuleLocalVisibleUpdates)
4457 ModuleLocalLookups[DC].Table.add(
4458 Update.Mod, Update.Data,
4459 reader::ModuleLocalNameLookupTrait(*this, *Update.Mod));
4460 // NOTE: Can we optimize the case that the data being loaded
4461 // is not related to current module?
4463 }
4464
4465 if (auto I = TULocalUpdates.find(ID); I != TULocalUpdates.end()) {
4466 auto Updates = std::move(I->second);
4467 TULocalUpdates.erase(I);
4468
4469 auto *DC = cast<DeclContext>(D)->getPrimaryContext();
4470 for (const auto &Update : Updates)
4471 TULocalLookups[DC].Table.add(
4472 Update.Mod, Update.Data,
4473 reader::ASTDeclContextNameLookupTrait(*this, *Update.Mod));
4475 }
4476
4477 // Load any pending related decls.
4478 if (D->isCanonicalDecl()) {
4479 if (auto IT = RelatedDeclsMap.find(ID); IT != RelatedDeclsMap.end()) {
4480 for (auto LID : IT->second)
4481 GetDecl(LID);
4482 RelatedDeclsMap.erase(IT);
4483 }
4484 }
4485
4486 // Load the pending specializations update for this decl, if it has any.
4487 if (auto I = PendingSpecializationsUpdates.find(ID);
4488 I != PendingSpecializationsUpdates.end()) {
4489 auto SpecializationUpdates = std::move(I->second);
4490 PendingSpecializationsUpdates.erase(I);
4491
4492 for (const auto &Update : SpecializationUpdates)
4493 AddSpecializations(D, Update.Data, *Update.Mod, /*IsPartial=*/false);
4494 }
4495
4496 // Load the pending specializations update for this decl, if it has any.
4497 if (auto I = PendingPartialSpecializationsUpdates.find(ID);
4498 I != PendingPartialSpecializationsUpdates.end()) {
4499 auto SpecializationUpdates = std::move(I->second);
4500 PendingPartialSpecializationsUpdates.erase(I);
4501
4502 for (const auto &Update : SpecializationUpdates)
4503 AddSpecializations(D, Update.Data, *Update.Mod, /*IsPartial=*/true);
4504 }
4505}
4506
4507void ASTReader::loadPendingDeclChain(Decl *FirstLocal, uint64_t LocalOffset) {
4508 // Attach FirstLocal to the end of the decl chain.
4509 Decl *CanonDecl = FirstLocal->getCanonicalDecl();
4510 if (FirstLocal != CanonDecl) {
4511 Decl *PrevMostRecent = ASTDeclReader::getMostRecentDecl(CanonDecl);
4513 *this, FirstLocal, PrevMostRecent ? PrevMostRecent : CanonDecl,
4514 CanonDecl);
4515 }
4516
4517 if (!LocalOffset) {
4518 ASTDeclReader::attachLatestDecl(CanonDecl, FirstLocal);
4519 return;
4520 }
4521
4522 // Load the list of other redeclarations from this module file.
4523 ModuleFile *M = getOwningModuleFile(FirstLocal);
4524 assert(M && "imported decl from no module file");
4525
4526 llvm::BitstreamCursor &Cursor = M->DeclsCursor;
4527 SavedStreamPosition SavedPosition(Cursor);
4528 if (llvm::Error JumpFailed = Cursor.JumpToBit(LocalOffset))
4529 llvm::report_fatal_error(
4530 Twine("ASTReader::loadPendingDeclChain failed jumping: ") +
4531 toString(std::move(JumpFailed)));
4532
4534 Expected<unsigned> MaybeCode = Cursor.ReadCode();
4535 if (!MaybeCode)
4536 llvm::report_fatal_error(
4537 Twine("ASTReader::loadPendingDeclChain failed reading code: ") +
4538 toString(MaybeCode.takeError()));
4539 unsigned Code = MaybeCode.get();
4540 if (Expected<unsigned> MaybeRecCode = Cursor.readRecord(Code, Record))
4541 assert(MaybeRecCode.get() == LOCAL_REDECLARATIONS &&
4542 "expected LOCAL_REDECLARATIONS record!");
4543 else
4544 llvm::report_fatal_error(
4545 Twine("ASTReader::loadPendingDeclChain failed reading rec code: ") +
4546 toString(MaybeCode.takeError()));
4547
4548 // FIXME: We have several different dispatches on decl kind here; maybe
4549 // we should instead generate one loop per kind and dispatch up-front?
4550 Decl *MostRecent = FirstLocal;
4551 for (unsigned I = 0, N = Record.size(); I != N; ++I) {
4552 unsigned Idx = N - I - 1;
4553 auto *D = ReadDecl(*M, Record, Idx);
4554 ASTDeclReader::attachPreviousDecl(*this, D, MostRecent, CanonDecl);
4555 MostRecent = D;
4556 }
4557 ASTDeclReader::attachLatestDecl(CanonDecl, MostRecent);
4558}
4559
4560namespace {
4561
4562 /// Given an ObjC interface, goes through the modules and links to the
4563 /// interface all the categories for it.
4564 class ObjCCategoriesVisitor {
4565 ASTReader &Reader;
4566 ObjCInterfaceDecl *Interface;
4567 llvm::SmallPtrSetImpl<ObjCCategoryDecl *> &Deserialized;
4568 ObjCCategoryDecl *Tail = nullptr;
4569 llvm::DenseMap<DeclarationName, ObjCCategoryDecl *> NameCategoryMap;
4570 GlobalDeclID InterfaceID;
4571 unsigned PreviousGeneration;
4572
4573 void add(ObjCCategoryDecl *Cat) {
4574 // Only process each category once.
4575 if (!Deserialized.erase(Cat))
4576 return;
4577
4578 // Check for duplicate categories.
4579 if (Cat->getDeclName()) {
4580 ObjCCategoryDecl *&Existing = NameCategoryMap[Cat->getDeclName()];
4581 if (Existing && Reader.getOwningModuleFile(Existing) !=
4582 Reader.getOwningModuleFile(Cat)) {
4584 StructuralEquivalenceContext Ctx(
4585 Reader.getContext().getLangOpts(), Cat->getASTContext(),
4586 Existing->getASTContext(), NonEquivalentDecls,
4587 StructuralEquivalenceKind::Default,
4588 /*StrictTypeSpelling=*/false,
4589 /*Complain=*/false,
4590 /*ErrorOnTagTypeMismatch=*/true);
4591 if (!Ctx.IsEquivalent(Cat, Existing)) {
4592 // Warn only if the categories with the same name are different.
4593 Reader.Diag(Cat->getLocation(), diag::warn_dup_category_def)
4594 << Interface->getDeclName() << Cat->getDeclName();
4595 Reader.Diag(Existing->getLocation(),
4596 diag::note_previous_definition);
4597 }
4598 } else if (!Existing) {
4599 // Record this category.
4600 Existing = Cat;
4601 }
4602 }
4603
4604 // Add this category to the end of the chain.
4605 if (Tail)
4607 else
4608 Interface->setCategoryListRaw(Cat);
4609 Tail = Cat;
4610 }
4611
4612 public:
4613 ObjCCategoriesVisitor(
4614 ASTReader &Reader, ObjCInterfaceDecl *Interface,
4615 llvm::SmallPtrSetImpl<ObjCCategoryDecl *> &Deserialized,
4616 GlobalDeclID InterfaceID, unsigned PreviousGeneration)
4617 : Reader(Reader), Interface(Interface), Deserialized(Deserialized),
4618 InterfaceID(InterfaceID), PreviousGeneration(PreviousGeneration) {
4619 // Populate the name -> category map with the set of known categories.
4620 for (auto *Cat : Interface->known_categories()) {
4621 if (Cat->getDeclName())
4622 NameCategoryMap[Cat->getDeclName()] = Cat;
4623
4624 // Keep track of the tail of the category list.
4625 Tail = Cat;
4626 }
4627 }
4628
4629 bool operator()(ModuleFile &M) {
4630 // If we've loaded all of the category information we care about from
4631 // this module file, we're done.
4632 if (M.Generation <= PreviousGeneration)
4633 return true;
4634
4635 // Map global ID of the definition down to the local ID used in this
4636 // module file. If there is no such mapping, we'll find nothing here
4637 // (or in any module it imports).
4638 LocalDeclID LocalID =
4639 Reader.mapGlobalIDToModuleFileGlobalID(M, InterfaceID);
4640 if (LocalID.isInvalid())
4641 return true;
4642
4643 // Perform a binary search to find the local redeclarations for this
4644 // declaration (if any).
4645 const ObjCCategoriesInfo Compare = {LocalID, 0};
4646 const ObjCCategoriesInfo *Result = std::lower_bound(
4650 LocalID != Result->getDefinitionID()) {
4651 // We didn't find anything. If the class definition is in this module
4652 // file, then the module files it depends on cannot have any categories,
4653 // so suppress further lookup.
4654 return Reader.isDeclIDFromModule(InterfaceID, M);
4655 }
4656
4657 // We found something. Dig out all of the categories.
4658 unsigned Offset = Result->Offset;
4659 unsigned N = M.ObjCCategories[Offset];
4660 M.ObjCCategories[Offset++] = 0; // Don't try to deserialize again
4661 for (unsigned I = 0; I != N; ++I)
4662 add(Reader.ReadDeclAs<ObjCCategoryDecl>(M, M.ObjCCategories, Offset));
4663 return true;
4664 }
4665 };
4666
4667} // namespace
4668
4669void ASTReader::loadObjCCategories(GlobalDeclID ID, ObjCInterfaceDecl *D,
4670 unsigned PreviousGeneration) {
4671 ObjCCategoriesVisitor Visitor(*this, D, CategoriesDeserialized, ID,
4672 PreviousGeneration);
4673 ModuleMgr.visit(Visitor);
4674}
4675
4676template<typename DeclT, typename Fn>
4677static void forAllLaterRedecls(DeclT *D, Fn F) {
4678 F(D);
4679
4680 // Check whether we've already merged D into its redeclaration chain.
4681 // MostRecent may or may not be nullptr if D has not been merged. If
4682 // not, walk the merged redecl chain and see if it's there.
4683 auto *MostRecent = D->getMostRecentDecl();
4684 bool Found = false;
4685 for (auto *Redecl = MostRecent; Redecl && !Found;
4686 Redecl = Redecl->getPreviousDecl())
4687 Found = (Redecl == D);
4688
4689 // If this declaration is merged, apply the functor to all later decls.
4690 if (Found) {
4691 for (auto *Redecl = MostRecent; Redecl != D;
4692 Redecl = Redecl->getPreviousDecl())
4693 F(Redecl);
4694 }
4695}
4696
4698 while (Record.getIdx() < Record.size()) {
4699 switch ((DeclUpdateKind)Record.readInt()) {
4701 auto *RD = cast<CXXRecordDecl>(D);
4702 Decl *MD = Record.readDecl();
4703 assert(MD && "couldn't read decl from update record");
4704 Reader.PendingAddedClassMembers.push_back({RD, MD});
4705 break;
4706 }
4707
4709 auto *Anon = readDeclAs<NamespaceDecl>();
4710
4711 // Each module has its own anonymous namespace, which is disjoint from
4712 // any other module's anonymous namespaces, so don't attach the anonymous
4713 // namespace at all.
4714 if (!Record.isModule()) {
4715 if (auto *TU = dyn_cast<TranslationUnitDecl>(D))
4716 TU->setAnonymousNamespace(Anon);
4717 else
4718 cast<NamespaceDecl>(D)->setAnonymousNamespace(Anon);
4719 }
4720 break;
4721 }
4722
4724 auto *VD = cast<VarDecl>(D);
4725 VD->NonParmVarDeclBits.IsInline = Record.readInt();
4726 VD->NonParmVarDeclBits.IsInlineSpecified = Record.readInt();
4727 ReadVarDeclInit(VD);
4728 break;
4729 }
4730
4732 SourceLocation POI = Record.readSourceLocation();
4733 if (auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D)) {
4734 VTSD->setPointOfInstantiation(POI);
4735 } else if (auto *VD = dyn_cast<VarDecl>(D)) {
4736 MemberSpecializationInfo *MSInfo = VD->getMemberSpecializationInfo();
4737 assert(MSInfo && "No member specialization information");
4738 MSInfo->setPointOfInstantiation(POI);
4739 } else {
4740 auto *FD = cast<FunctionDecl>(D);
4741 if (auto *FTSInfo = dyn_cast<FunctionTemplateSpecializationInfo *>(
4742 FD->TemplateOrSpecialization))
4743 FTSInfo->setPointOfInstantiation(POI);
4744 else
4745 cast<MemberSpecializationInfo *>(FD->TemplateOrSpecialization)
4746 ->setPointOfInstantiation(POI);
4747 }
4748 break;
4749 }
4750
4752 auto *Param = cast<ParmVarDecl>(D);
4753
4754 // We have to read the default argument regardless of whether we use it
4755 // so that hypothetical further update records aren't messed up.
4756 // TODO: Add a function to skip over the next expr record.
4757 auto *DefaultArg = Record.readExpr();
4758
4759 // Only apply the update if the parameter still has an uninstantiated
4760 // default argument.
4761 if (Param->hasUninstantiatedDefaultArg())
4762 Param->setDefaultArg(DefaultArg);
4763 break;
4764 }
4765
4767 auto *FD = cast<FieldDecl>(D);
4768 auto *DefaultInit = Record.readExpr();
4769
4770 // Only apply the update if the field still has an uninstantiated
4771 // default member initializer.
4772 if (FD->hasInClassInitializer() && !FD->hasNonNullInClassInitializer()) {
4773 if (DefaultInit)
4774 FD->setInClassInitializer(DefaultInit);
4775 else
4776 // Instantiation failed. We can get here if we serialized an AST for
4777 // an invalid program.
4778 FD->removeInClassInitializer();
4779 }
4780 break;
4781 }
4782
4784 auto *FD = cast<FunctionDecl>(D);
4785 if (Reader.PendingBodies[FD]) {
4786 // FIXME: Maybe check for ODR violations.
4787 // It's safe to stop now because this update record is always last.
4788 return;
4789 }
4790
4791 if (Record.readInt()) {
4792 // Maintain AST consistency: any later redeclarations of this function
4793 // are inline if this one is. (We might have merged another declaration
4794 // into this one.)
4795 forAllLaterRedecls(FD, [](FunctionDecl *FD) {
4796 FD->setImplicitlyInline();
4797 });
4798 }
4799 FD->setInnerLocStart(readSourceLocation());
4801 assert(Record.getIdx() == Record.size() && "lazy body must be last");
4802 break;
4803 }
4804
4806 auto *RD = cast<CXXRecordDecl>(D);
4807 auto *OldDD = RD->getCanonicalDecl()->DefinitionData;
4808 bool HadRealDefinition =
4809 OldDD && (OldDD->Definition != RD ||
4810 !Reader.PendingFakeDefinitionData.count(OldDD));
4811 RD->setParamDestroyedInCallee(Record.readInt());
4813 static_cast<RecordArgPassingKind>(Record.readInt()));
4814 ReadCXXRecordDefinition(RD, /*Update*/true);
4815
4816 // Visible update is handled separately.
4817 uint64_t LexicalOffset = ReadLocalOffset();
4818 if (!HadRealDefinition && LexicalOffset) {
4819 Record.readLexicalDeclContextStorage(LexicalOffset, RD);
4820 Reader.PendingFakeDefinitionData.erase(OldDD);
4821 }
4822
4823 auto TSK = (TemplateSpecializationKind)Record.readInt();
4824 SourceLocation POI = readSourceLocation();
4825 if (MemberSpecializationInfo *MSInfo =
4827 MSInfo->setTemplateSpecializationKind(TSK);
4828 MSInfo->setPointOfInstantiation(POI);
4829 } else {
4831 Spec->setTemplateSpecializationKind(TSK);
4832 Spec->setPointOfInstantiation(POI);
4833
4834 if (Record.readInt()) {
4835 auto *PartialSpec =
4836 readDeclAs<ClassTemplatePartialSpecializationDecl>();
4838 Record.readTemplateArgumentList(TemplArgs);
4839 auto *TemplArgList = TemplateArgumentList::CreateCopy(
4840 Reader.getContext(), TemplArgs);
4841
4842 // FIXME: If we already have a partial specialization set,
4843 // check that it matches.
4845 Spec->getSpecializedTemplateOrPartial()))
4846 Spec->setInstantiationOf(PartialSpec, TemplArgList);
4847 }
4848 }
4849
4850 RD->setTagKind(static_cast<TagTypeKind>(Record.readInt()));
4851 RD->setLocation(readSourceLocation());
4852 RD->setLocStart(readSourceLocation());
4853 RD->setBraceRange(readSourceRange());
4854
4855 if (Record.readInt()) {
4856 AttrVec Attrs;
4857 Record.readAttributes(Attrs);
4858 // If the declaration already has attributes, we assume that some other
4859 // AST file already loaded them.
4860 if (!D->hasAttrs())
4861 D->setAttrsImpl(Attrs, Reader.getContext());
4862 }
4863 break;
4864 }
4865
4867 // Set the 'operator delete' directly to avoid emitting another update
4868 // record.
4870 ASTContext &C = Reader.getContext();
4871 auto *Del = readDeclAs<FunctionDecl>();
4872 auto *ThisArg = Record.readExpr();
4873 auto *Dtor = cast<CXXDestructorDecl>(D);
4874 // FIXME: Check consistency if we have an old and new operator delete.
4875 if (!C.dtorHasOperatorDelete(Dtor,
4877 C.addOperatorDeleteForVDtor(Dtor, Del,
4879 Canon->OperatorDeleteThisArg = ThisArg;
4880 }
4881 break;
4882 }
4883
4885 auto *Del = readDeclAs<FunctionDecl>();
4886 auto *Dtor = cast<CXXDestructorDecl>(D);
4887 ASTContext &C = Reader.getContext();
4888 if (!C.dtorHasOperatorDelete(
4890 C.addOperatorDeleteForVDtor(
4892 break;
4893 }
4895 auto *Del = readDeclAs<FunctionDecl>();
4896 auto *Dtor = cast<CXXDestructorDecl>(D);
4897 ASTContext &C = Reader.getContext();
4898 if (!C.dtorHasOperatorDelete(Dtor, ASTContext::OperatorDeleteKind::Array))
4899 C.addOperatorDeleteForVDtor(Dtor, Del,
4901 break;
4902 }
4904 auto *Del = readDeclAs<FunctionDecl>();
4905 auto *Dtor = cast<CXXDestructorDecl>(D);
4906 ASTContext &C = Reader.getContext();
4907 if (!C.dtorHasOperatorDelete(Dtor,
4909 C.addOperatorDeleteForVDtor(
4911 break;
4912 }
4913
4915 SmallVector<QualType, 8> ExceptionStorage;
4916 auto ESI = Record.readExceptionSpecInfo(ExceptionStorage);
4917
4918 // Update this declaration's exception specification, if needed.
4919 auto *FD = cast<FunctionDecl>(D);
4920 auto *FPT = FD->getType()->castAs<FunctionProtoType>();
4921 // FIXME: If the exception specification is already present, check that it
4922 // matches.
4923 if (isUnresolvedExceptionSpec(FPT->getExceptionSpecType())) {
4924 FD->setType(Reader.getContext().getFunctionType(
4925 FPT->getReturnType(), FPT->getParamTypes(),
4926 FPT->getExtProtoInfo().withExceptionSpec(ESI)));
4927
4928 // When we get to the end of deserializing, see if there are other decls
4929 // that we need to propagate this exception specification onto.
4930 Reader.PendingExceptionSpecUpdates.insert(
4931 std::make_pair(FD->getCanonicalDecl(), FD));
4932 }
4933 break;
4934 }
4935
4937 auto *FD = cast<FunctionDecl>(D);
4938 QualType DeducedResultType = Record.readType();
4939 Reader.PendingDeducedTypeUpdates.insert(
4940 {FD->getCanonicalDecl(), DeducedResultType});
4941 break;
4942 }
4943
4945 // Maintain AST consistency: any later redeclarations are used too.
4946 D->markUsed(Reader.getContext());
4947 break;
4948
4950 Reader.getContext().setManglingNumber(cast<NamedDecl>(D),
4951 Record.readInt());
4952 break;
4953
4955 Reader.getContext().setStaticLocalNumber(cast<VarDecl>(D),
4956 Record.readInt());
4957 break;
4958
4960 D->addAttr(OMPThreadPrivateDeclAttr::CreateImplicit(Reader.getContext(),
4961 readSourceRange()));
4962 break;
4963
4965 auto AllocatorKind =
4966 static_cast<OMPAllocateDeclAttr::AllocatorTypeTy>(Record.readInt());
4967 Expr *Allocator = Record.readExpr();
4968 Expr *Alignment = Record.readExpr();
4969 SourceRange SR = readSourceRange();
4970 D->addAttr(OMPAllocateDeclAttr::CreateImplicit(
4971 Reader.getContext(), AllocatorKind, Allocator, Alignment, SR));
4972 break;
4973 }
4974
4976 unsigned SubmoduleID = readSubmoduleID();
4977 auto *Exported = cast<NamedDecl>(D);
4978 Module *Owner = SubmoduleID ? Reader.getSubmodule(SubmoduleID) : nullptr;
4979 Reader.getContext().mergeDefinitionIntoModule(Exported, Owner);
4980 Reader.PendingMergedDefinitionsToDeduplicate.insert(Exported);
4981 break;
4982 }
4983
4985 auto MapType = Record.readEnum<OMPDeclareTargetDeclAttr::MapTypeTy>();
4986 auto DevType = Record.readEnum<OMPDeclareTargetDeclAttr::DevTypeTy>();
4987 Expr *IndirectE = Record.readExpr();
4988 bool Indirect = Record.readBool();
4989 unsigned Level = Record.readInt();
4990 D->addAttr(OMPDeclareTargetDeclAttr::CreateImplicit(
4991 Reader.getContext(), MapType, DevType, IndirectE, Indirect, Level,
4992 readSourceRange()));
4993 break;
4994 }
4995
4997 AttrVec Attrs;
4998 Record.readAttributes(Attrs);
4999 assert(Attrs.size() == 1);
5000 D->addAttr(Attrs[0]);
5001 break;
5002 }
5003 }
5004}
This file provides AST data structures related to concepts.
Defines the clang::ASTContext interface.
#define V(N, I)
static T assert_cast(T t)
"Cast" to type T, asserting if we don't have an implicit conversion.
static bool allowODRLikeMergeInC(NamedDecl *ND)
ODR-like semantics for C/ObjC allow us to merge tag types and a structural check in Sema guarantees t...
static NamedDecl * getDeclForMerging(NamedDecl *Found, bool IsTypedefNameForLinkage)
Find the declaration that should be merged into, given the declaration found by name lookup.
static bool inheritDefaultTemplateArgument(ASTContext &Context, ParmDecl *From, Decl *ToD)
Inherit the default template argument from From to To.
static void inheritDefaultTemplateArguments(ASTContext &Context, TemplateDecl *From, TemplateDecl *To)
static void forAllLaterRedecls(DeclT *D, Fn F)
static llvm::iterator_range< MergedRedeclIterator< DeclT > > merged_redecls(DeclT *D)
#define NO_MERGE(Field)
Defines the clang::attr::Kind enum.
clang::CharUnits operator*(clang::CharUnits::QuantityType Scale, const clang::CharUnits &CU)
Definition CharUnits.h:225
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
This file defines OpenMP nodes for declarative directives.
Defines the C++ template declaration subclasses.
Defines the ExceptionSpecificationType enumeration and various utility functions.
FormatToken * Previous
The previous token in the unwrapped line.
FormatToken * Next
The next token in the unwrapped line.
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines the LambdaCapture class.
Defines several types used to describe C++ lambda expressions that are shared between the parser and ...
Defines the clang::LangOptions interface.
llvm::MachO::Record Record
Definition MachO.h:31
Defines the clang::Module class, which describes a module in the source code.
This file defines OpenMP AST classes for clauses.
static std::string toString(const clang::SanitizerSet &Sanitizers)
Produce a string containing comma-separated names of sanitizers in Sanitizers set.
Defines the clang::SourceLocation class and associated facilities.
Defines various enumerations that describe declaration and type specifiers.
C Language Family Type Representation.
__DEVICE__ void * memcpy(void *__a, const void *__b, size_t __c)
bool needsCleanup() const
Returns whether the object performed allocations.
Definition APValue.cpp:437
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition ASTContext.h:220
TranslationUnitDecl * getTranslationUnitDecl() const
const LangOptions & getLangOpts() const
Definition ASTContext.h:938
void addDestruction(T *Ptr) const
If T isn't trivially destructible, calls AddDeallocation to register it for destruction.
ExternalASTSource * getExternalSource() const
Retrieve a pointer to the external AST source associated with this AST context, if any.
void mergeTemplatePattern(RedeclarableTemplateDecl *D, RedeclarableTemplateDecl *Existing, bool IsKeyDecl)
Merge together the pattern declarations from two template declarations.
ASTDeclMerger(ASTReader &Reader)
void mergeRedeclarable(Redeclarable< T > *D, T *Existing, RedeclarableResult &Redecl)
void mergeLambda(CXXRecordDecl *D, RedeclarableResult &Redecl, Decl &Context, unsigned Number)
Attempt to merge D with a previous declaration of the same lambda, which is found by its index within...
void MergeDefinitionData(CXXRecordDecl *D, struct CXXRecordDecl::DefinitionData &&NewDD)
void mergeRedeclarableImpl(Redeclarable< T > *D, T *Existing, GlobalDeclID KeyDeclID)
Attempts to merge the given declaration (D) with another declaration of the same entity.
void VisitTemplateParamObjectDecl(TemplateParamObjectDecl *D)
void VisitObjCImplementationDecl(ObjCImplementationDecl *D)
void mergeRedeclarableTemplate(RedeclarableTemplateDecl *D, RedeclarableResult &Redecl)
void VisitImportDecl(ImportDecl *D)
void VisitBindingDecl(BindingDecl *BD)
void VisitNamespaceDecl(NamespaceDecl *D)
void VisitTopLevelStmtDecl(TopLevelStmtDecl *D)
RedeclarableResult VisitRedeclarableTemplateDecl(RedeclarableTemplateDecl *D)
void VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D)
void VisitUnresolvedUsingIfExistsDecl(UnresolvedUsingIfExistsDecl *D)
void ReadFunctionDefinition(FunctionDecl *FD)
void VisitLabelDecl(LabelDecl *LD)
void VisitObjCCategoryDecl(ObjCCategoryDecl *D)
void VisitUsingDirectiveDecl(UsingDirectiveDecl *D)
RedeclarableResult VisitClassTemplateSpecializationDeclImpl(ClassTemplateSpecializationDecl *D)
void VisitFunctionDecl(FunctionDecl *FD)
void VisitObjCMethodDecl(ObjCMethodDecl *D)
void VisitUsingShadowDecl(UsingShadowDecl *D)
void VisitVarTemplateSpecializationDecl(VarTemplateSpecializationDecl *D)
void VisitVarDecl(VarDecl *VD)
RedeclarableResult VisitRedeclarable(Redeclarable< T > *D)
void VisitDeclContext(DeclContext *DC, LookupBlockOffsets &Offsets)
void VisitMSGuidDecl(MSGuidDecl *D)
void VisitPragmaCommentDecl(PragmaCommentDecl *D)
void VisitRecordDecl(RecordDecl *RD)
void VisitLifetimeExtendedTemporaryDecl(LifetimeExtendedTemporaryDecl *D)
void VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D)
void VisitRequiresExprBodyDecl(RequiresExprBodyDecl *D)
void ReadVarDeclInit(VarDecl *VD)
static Decl * getMostRecentDeclImpl(Redeclarable< DeclT > *D)
void VisitNamespaceAliasDecl(NamespaceAliasDecl *D)
void VisitIndirectFieldDecl(IndirectFieldDecl *FD)
void VisitObjCContainerDecl(ObjCContainerDecl *D)
void VisitBlockDecl(BlockDecl *BD)
void VisitOpenACCRoutineDecl(OpenACCRoutineDecl *D)
void VisitExportDecl(ExportDecl *D)
static void attachLatestDecl(Decl *D, Decl *latest)
void VisitStaticAssertDecl(StaticAssertDecl *D)
void VisitEmptyDecl(EmptyDecl *D)
void VisitOMPCapturedExprDecl(OMPCapturedExprDecl *D)
void VisitValueDecl(ValueDecl *VD)
void VisitEnumDecl(EnumDecl *ED)
void mergeRedeclarable(Redeclarable< T > *D, RedeclarableResult &Redecl)
Attempts to merge the given declaration (D) with another declaration of the same entity.
void VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D)
void VisitFriendTemplateDecl(FriendTemplateDecl *D)
void VisitObjCProtocolDecl(ObjCProtocolDecl *D)
void VisitClassTemplatePartialSpecializationDecl(ClassTemplatePartialSpecializationDecl *D)
void VisitObjCTypeParamDecl(ObjCTypeParamDecl *D)
void VisitDeclaratorDecl(DeclaratorDecl *DD)
RedeclarableResult VisitTypedefNameDecl(TypedefNameDecl *TD)
void VisitFriendDecl(FriendDecl *D)
void VisitLinkageSpecDecl(LinkageSpecDecl *D)
void VisitCXXRecordDecl(CXXRecordDecl *D)
ASTDeclReader(ASTReader &Reader, ASTRecordReader &Record, ASTReader::RecordLocation Loc, GlobalDeclID thisDeclID, SourceLocation ThisDeclLoc)
void VisitFileScopeAsmDecl(FileScopeAsmDecl *AD)
void VisitImplicitConceptSpecializationDecl(ImplicitConceptSpecializationDecl *D)
void VisitNamedDecl(NamedDecl *ND)
void mergeMergeable(Mergeable< T > *D)
Attempts to merge the given declaration (D) with another declaration of the same entity,...
void VisitBuiltinTemplateDecl(BuiltinTemplateDecl *D)
static Decl * getMostRecentDecl(Decl *D)
void VisitObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *D)
void VisitCXXConstructorDecl(CXXConstructorDecl *D)
void VisitPragmaDetectMismatchDecl(PragmaDetectMismatchDecl *D)
void VisitImplicitParamDecl(ImplicitParamDecl *PD)
void VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D)
static void setNextObjCCategory(ObjCCategoryDecl *Cat, ObjCCategoryDecl *Next)
void VisitMSPropertyDecl(MSPropertyDecl *FD)
void VisitClassTemplateSpecializationDecl(ClassTemplateSpecializationDecl *D)
void VisitFieldDecl(FieldDecl *FD)
RedeclarableResult VisitVarDeclImpl(VarDecl *D)
void VisitOMPDeclareMapperDecl(OMPDeclareMapperDecl *D)
void VisitCapturedDecl(CapturedDecl *CD)
void VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D)
void VisitObjCInterfaceDecl(ObjCInterfaceDecl *D)
RedeclarableResult VisitCXXRecordDeclImpl(CXXRecordDecl *D)
void VisitAccessSpecDecl(AccessSpecDecl *D)
void VisitCXXMethodDecl(CXXMethodDecl *D)
void VisitOpenACCDeclareDecl(OpenACCDeclareDecl *D)
void VisitOMPAllocateDecl(OMPAllocateDecl *D)
void VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D)
static void attachLatestDeclImpl(Redeclarable< DeclT > *D, Decl *Latest)
static void markIncompleteDeclChainImpl(Redeclarable< DeclT > *D)
RedeclarableResult VisitTagDecl(TagDecl *TD)
ObjCTypeParamList * ReadObjCTypeParamList()
void VisitHLSLBufferDecl(HLSLBufferDecl *D)
void VisitOMPThreadPrivateDecl(OMPThreadPrivateDecl *D)
void VisitCXXDeductionGuideDecl(CXXDeductionGuideDecl *GD)
void VisitConstructorUsingShadowDecl(ConstructorUsingShadowDecl *D)
void VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D)
static void checkMultipleDefinitionInNamedModules(ASTReader &Reader, Decl *D, Decl *Previous)
void VisitUsingEnumDecl(UsingEnumDecl *D)
void VisitObjCImplDecl(ObjCImplDecl *D)
void VisitTranslationUnitDecl(TranslationUnitDecl *TU)
void VisitUnnamedGlobalConstantDecl(UnnamedGlobalConstantDecl *D)
void VisitTypeDecl(TypeDecl *TD)
void VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D)
void VisitEnumConstantDecl(EnumConstantDecl *ECD)
void VisitTypeAliasDecl(TypeAliasDecl *TD)
static void attachPreviousDeclImpl(ASTReader &Reader, Redeclarable< DeclT > *D, Decl *Previous, Decl *Canon)
void VisitConceptDecl(ConceptDecl *D)
void VisitObjCPropertyDecl(ObjCPropertyDecl *D)
void VisitOutlinedFunctionDecl(OutlinedFunctionDecl *D)
void VisitObjCIvarDecl(ObjCIvarDecl *D)
void VisitUsingPackDecl(UsingPackDecl *D)
void VisitFunctionTemplateDecl(FunctionTemplateDecl *D)
void VisitOMPDeclareReductionDecl(OMPDeclareReductionDecl *D)
RedeclarableResult VisitVarTemplateSpecializationDeclImpl(VarTemplateSpecializationDecl *D)
TODO: Unify with ClassTemplateSpecializationDecl version?
void VisitUsingDecl(UsingDecl *D)
void VisitObjCAtDefsFieldDecl(ObjCAtDefsFieldDecl *D)
void VisitVarTemplatePartialSpecializationDecl(VarTemplatePartialSpecializationDecl *D)
TODO: Unify with ClassTemplatePartialSpecializationDecl version?
void VisitParmVarDecl(ParmVarDecl *PD)
void VisitVarTemplateDecl(VarTemplateDecl *D)
TODO: Unify with ClassTemplateDecl version?
static void attachPreviousDecl(ASTReader &Reader, Decl *D, Decl *Previous, Decl *Canon)
void VisitClassTemplateDecl(ClassTemplateDecl *D)
void VisitCXXDestructorDecl(CXXDestructorDecl *D)
void VisitTemplateDecl(TemplateDecl *D)
void VisitCXXConversionDecl(CXXConversionDecl *D)
void VisitTypedefDecl(TypedefDecl *TD)
void VisitOMPRequiresDecl(OMPRequiresDecl *D)
RedeclarableResult VisitRecordDeclImpl(RecordDecl *RD)
void VisitDecompositionDecl(DecompositionDecl *DD)
void ReadSpecializations(ModuleFile &M, Decl *D, llvm::BitstreamCursor &DeclsCursor, bool IsPartial)
Reads an AST files chain containing the contents of a translation unit.
Definition ASTReader.h:430
bool isDeclIDFromModule(GlobalDeclID ID, ModuleFile &M) const
Returns true if global DeclID ID originated from module M.
DiagnosticBuilder Diag(unsigned DiagID) const
Report a diagnostic.
ASTContext & getContext()
Retrieve the AST context that this AST reader supplements.
Definition ASTReader.h:2607
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:2181
ModuleFile * getOwningModuleFile(const Decl *D) const
Retrieve the module file that owns the given declaration, or NULL if the declaration is not from a mo...
T * ReadDeclAs(ModuleFile &F, const RecordDataImpl &R, unsigned &I)
Reads a declaration from the given position in a record in the given module.
Definition ASTReader.h:2191
LocalDeclID mapGlobalIDToModuleFileGlobalID(ModuleFile &M, GlobalDeclID GlobalID)
Map a global declaration ID into the declaration ID used to refer to this declaration within the give...
friend class ASTDeclReader
Definition ASTReader.h:434
Decl * GetDecl(GlobalDeclID ID)
Resolve a declaration ID into a declaration, potentially building a new declaration.
SourceLocation ReadSourceLocation(ModuleFile &MF, RawLocEncoding Raw) const
Read a source location from raw form.
Definition ASTReader.h:2477
void runWithSufficientStackSpace(SourceLocation Loc, llvm::function_ref< void()> Fn)
friend class ASTRecordReader
Definition ASTReader.h:436
SmallVector< uint64_t, 64 > RecordData
Definition ASTReader.h:445
serialization::ModuleFile ModuleFile
Definition ASTReader.h:476
An object for streaming information from a record.
bool readBool()
Read a boolean value, advancing Idx.
std::string readString()
Read a string, advancing Idx.
SourceRange readSourceRange()
Read a source range, advancing Idx.
SourceLocation readSourceLocation()
Read a source location, advancing Idx.
void readAttributes(AttrVec &Attrs)
Reads attributes from the current stream position, advancing Idx.
T * readDeclAs()
Reads a declaration from the given position in the record, advancing Idx.
IdentifierInfo * readIdentifier()
ASTContext & getContext()
Retrieve the AST context that this AST reader supplements.
TypeSourceInfo * readTypeSourceInfo()
Reads a declarator info from the given record, advancing Idx.
OMPTraitInfo * readOMPTraitInfo()
Read an OMPTraitInfo object, advancing Idx.
VersionTuple readVersionTuple()
Read a version tuple, advancing Idx.
uint64_t readInt()
Returns the current value in this record, and advances to the next value.
Attr * readAttr()
Reads one attribute from the current stream position, advancing Idx.
Expr * readExpr()
Reads an expression.
Represents an access specifier followed by colon ':'.
Definition DeclCXX.h:86
static AccessSpecDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:60
void setColonLoc(SourceLocation CLoc)
Sets the location of the colon.
Definition DeclCXX.h:111
Attr - This represents one attribute.
Definition Attr.h:45
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:4181
static BindingDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:3653
A simple helper class to unpack an integer to bits and consuming the bits in order.
Definition ASTReader.h:2669
uint32_t getNextBits(uint32_t Width)
Definition ASTReader.h:2692
A class which contains all the information about a particular captured value.
Definition Decl.h:4660
Represents a block literal declaration, which is like an unnamed FunctionDecl.
Definition Decl.h:4654
void setParams(ArrayRef< ParmVarDecl * > NewParamInfo)
Definition Decl.cpp:5366
void setDoesNotEscape(bool B=true)
Definition Decl.h:4806
void setSignatureAsWritten(TypeSourceInfo *Sig)
Definition Decl.h:4736
void setCanAvoidCopyToHeap(bool B=true)
Definition Decl.h:4811
void setIsConversionFromLambda(bool val=true)
Definition Decl.h:4801
void setBlockMissingReturnType(bool val=true)
Definition Decl.h:4793
static BlockDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5569
void setIsVariadic(bool value)
Definition Decl.h:4730
void setBody(CompoundStmt *B)
Definition Decl.h:4734
void setCaptures(ASTContext &Context, ArrayRef< Capture > Captures, bool CapturesCXXThis)
Definition Decl.cpp:5377
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
void setExplicitSpecifier(ExplicitSpecifier ES)
Definition DeclCXX.h:2665
bool isInheritingConstructor() const
Determine whether this is an implicit constructor synthesized to model a call to a constructor inheri...
Definition DeclCXX.h:2831
Represents a C++ conversion function within a class.
Definition DeclCXX.h:2939
void setExplicitSpecifier(ExplicitSpecifier ES)
Definition DeclCXX.h:2976
static CXXConversionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:3215
Represents a C++ deduction guide declaration.
Definition DeclCXX.h:1979
void setDeductionCandidateKind(DeductionCandidate K)
Definition DeclCXX.h:2071
void setSourceDeductionGuide(CXXDeductionGuideDecl *DG)
Definition DeclCXX.h:2059
static CXXDeductionGuideDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:2380
void setSourceDeductionGuideKind(SourceDeductionGuideKind SK)
Definition DeclCXX.h:2067
Represents a C++ destructor within a class.
Definition DeclCXX.h:2869
static CXXDestructorDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:3090
CXXDestructorDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Definition DeclCXX.h:2917
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
CXXMethodDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Definition DeclCXX.h:2225
Represents a C++ struct/union/class.
Definition DeclCXX.h:258
CXXRecordDecl * getDefinition() const
Definition DeclCXX.h:548
static CXXRecordDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:154
unsigned getODRHash() const
Definition DeclCXX.cpp:490
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:4926
static CapturedDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumParams)
Definition Decl.cpp:5612
void setContextParam(unsigned i, ImplicitParamDecl *P)
Definition Decl.h:4988
void setNothrow(bool Nothrow=true)
Definition Decl.cpp:5622
void setParam(unsigned i, ImplicitParamDecl *P)
Definition Decl.h:4970
Declaration of a class template.
static ClassTemplateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Create an empty class template node.
static ClassTemplatePartialSpecializationDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a class template specialization, which refers to a class template with a given set of temp...
static ClassTemplateSpecializationDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setTemplateArgsAsWritten(const ASTTemplateArgumentListInfo *ArgsWritten)
Set the template argument list as written in the sources.
Declaration of a C++20 concept.
static ConceptDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
A reference to a concept and its template args, as it appears in the code.
Definition ASTConcept.h:130
Represents a shadow constructor declaration introduced into a class by a C++11 using-declaration that...
Definition DeclCXX.h:3673
static ConstructorUsingShadowDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:3446
static DeclAccessPair make(NamedDecl *D, AccessSpecifier AS)
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Definition DeclBase.h:1449
lookup_result::iterator lookup_iterator
Definition DeclBase.h:2578
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
DeclContextLookupResult lookup_result
Definition DeclBase.h:2577
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
bool isTranslationUnit() const
Definition DeclBase.h:2185
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
DeclContext * getPrimaryContext()
getPrimaryContext - There may be many different declarations of the same entity (including forward de...
bool isFunctionOrMethod() const
Definition DeclBase.h:2161
DeclContext * getNonTransparentContext()
bool isValid() const
Definition DeclID.h:121
DeclID getRawValue() const
Definition DeclID.h:115
bool isInvalid() const
Definition DeclID.h:123
A simple visitor class that helps create declaration visitors.
Definition DeclVisitor.h:68
Decl - This represents one declaration (or definition), e.g.
Definition DeclBase.h:86
Decl * getPreviousDecl()
Retrieve the previous declaration that declares the same entity as this declaration,...
Definition DeclBase.h: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:546
void setOwningModuleID(unsigned ID)
Set the owning module ID.
Definition DeclBase.cpp:126
void addAttr(Attr *A)
void setLocalExternDecl()
Changes the namespace of this declaration to reflect that it's a function-local extern declaration.
Definition DeclBase.h: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:590
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
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:256
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:382
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.
Definition DeclBase.h:229
@ Unowned
This declaration is not owned by a module.
Definition DeclBase.h:218
@ ReachableWhenImported
This declaration has an owning module, and is visible to lookups that occurs within that module.
Definition DeclBase.h:234
@ ModulePrivate
This declaration has an owning module, but is only visible to lookups that occur within that module.
Definition DeclBase.h:240
@ Visible
This declaration has an owning module, but is globally visible (typically because its owning module i...
Definition DeclBase.h:225
Kind getKind() const
Definition DeclBase.h: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.
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.
IdentifierInfo * getAsIdentifierInfo() const
Retrieve the IdentifierInfo * stored in this declaration name, or null if this declaration name isn't...
Selector getObjCSelector() const
Get the Objective-C selector stored in this declaration name.
Represents a ValueDecl that came out of a declarator.
Definition Decl.h:780
void setInnerLocStart(SourceLocation L)
Definition Decl.h:823
void setTypeSourceInfo(TypeSourceInfo *TI)
Definition Decl.h:814
TypeSourceInfo * getTypeSourceInfo() const
Definition Decl.h:809
A decomposition declaration.
Definition DeclCXX.h:4245
static DecompositionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumBindings)
Definition DeclCXX.cpp:3693
Represents an empty-declaration.
Definition Decl.h:5161
static EmptyDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5814
An instance of this object exists for each enum constant that is defined.
Definition Decl.h:3423
static EnumConstantDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5638
void setInitExpr(Expr *E)
Definition Decl.h:3447
void setInitVal(const ASTContext &C, const llvm::APSInt &V)
Definition Decl.h:3448
Represents an enum.
Definition Decl.h:4007
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this enumeration is an instantiation of a member enumeration of a class template specialization,...
Definition Decl.h:4270
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:4078
void setIntegerType(QualType T)
Set the underlying integer type.
Definition Decl.h:4180
void setIntegerTypeSourceInfo(TypeSourceInfo *TInfo)
Set the underlying integer type source info.
Definition Decl.h:4183
unsigned getODRHash()
Definition Decl.cpp:5094
static EnumDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5010
void setScoped(bool Scoped=true)
True if this tag declaration is a scoped enumeration.
Definition Decl.h:4066
void setPromotionType(QualType T)
Set the promotion type.
Definition Decl.h:4166
EnumDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Definition Decl.h:4088
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:4072
Represents a standard C++ module export declaration.
Definition Decl.h:5114
static ExportDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:6015
This represents one expression.
Definition Expr.h:112
RAII class for safely pairing a StartedDeserializing call with FinishedDeserializing.
Represents a member of a struct/union/class.
Definition Decl.h:3160
void setBitWidth(Expr *Width)
Set the bit-field width for this member.
Definition Decl.h:3295
static FieldDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:4698
const VariableArrayType * CapturedVLAType
Definition Decl.h:3216
void setRParenLoc(SourceLocation L)
Definition Decl.h:4597
void setAsmString(Expr *Asm)
Definition Decl.h:4604
static FileScopeAsmDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5770
FriendDecl - Represents the declaration of a friend entity, which can be a function,...
Definition DeclFriend.h:54
static FriendDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned FriendTypeNumTPLists)
Declaration of a friend template.
static FriendTemplateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
static DefaultedOrDeletedFunctionInfo * Create(ASTContext &Context, ArrayRef< DeclAccessPair > Lookups, StringLiteral *DeletedMessage=nullptr)
Definition Decl.cpp:3129
Represents a function declaration or definition.
Definition Decl.h:2000
void setDescribedFunctionTemplate(FunctionTemplateDecl *Template)
Definition Decl.cpp:4187
FunctionTemplateDecl * getDescribedFunctionTemplate() const
Retrieves the function template that is described by this function declaration.
Definition Decl.cpp:4182
void setIsPureVirtual(bool P=true)
Definition Decl.cpp:3287
void setDefaultedOrDeletedInfo(DefaultedOrDeletedFunctionInfo *Info)
Definition Decl.cpp:3149
void setFriendConstraintRefersToEnclosingTemplate(bool V=true)
Definition Decl.h:2701
void setHasSkippedBody(bool Skipped=true)
Definition Decl.h:2680
static FunctionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5553
void setUsesSEHTry(bool UST)
Definition Decl.h:2519
void setIsMultiVersion(bool V=true)
Sets the multiversion state for this declaration and all of its redeclarations.
Definition Decl.h:2695
void setHasWrittenPrototype(bool P=true)
State that this function has a written prototype.
Definition Decl.h:2453
bool isExplicitlyDefaulted() const
Whether this function is explicitly defaulted.
Definition Decl.h:2389
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this function is an instantiation of a member function of a class template specialization,...
Definition Decl.cpp:4161
FunctionTemplateSpecializationInfo * getTemplateSpecializationInfo() const
If this function is actually a function template specialization, retrieve information about this func...
Definition Decl.cpp:4312
void setDefaultLoc(SourceLocation NewLoc)
Definition Decl.h:2402
void setInstantiatedFromMemberTemplate(bool Val=true)
Definition Decl.h:2369
void setInlineSpecified(bool I)
Set whether the "inline" keyword was specified for this function.
Definition Decl.h:2902
TemplatedKind
The kind of templated function a FunctionDecl can be.
Definition Decl.h:2005
@ TK_FunctionTemplateSpecialization
Definition Decl.h:2016
@ TK_DependentFunctionTemplateSpecialization
Definition Decl.h:2019
void setTrivial(bool IT)
Definition Decl.h:2378
TemplatedKind getTemplatedKind() const
What kind of templated function this is.
Definition Decl.cpp:4133
void setInstantiatedFromDecl(FunctionDecl *FD)
Specify that this function declaration was instantiated from a FunctionDecl FD.
Definition Decl.cpp:4200
bool isDeletedAsWritten() const
Definition Decl.h:2544
void setHasInheritedPrototype(bool P=true)
State that this function inherited its prototype from a previous declaration.
Definition Decl.h:2465
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:4367
void setVirtualAsWritten(bool V)
State that this function is marked as virtual explicitly.
Definition Decl.h:2349
void setIsDestroyingOperatorDelete(bool IsDestroyingDelete)
Definition Decl.cpp:3544
void setLateTemplateParsed(bool ILT=true)
State that this templated function will be late parsed.
Definition Decl.h:2362
void setImplicitlyInline(bool I=true)
Flag that this function is implicitly inline.
Definition Decl.h:2916
void setTrivialForCall(bool IT)
Definition Decl.h:2381
void setIsTypeAwareOperatorNewOrDelete(bool IsTypeAwareOperator=true)
Definition Decl.cpp:3552
bool isDefaulted() const
Whether this function is defaulted.
Definition Decl.h:2385
void setIneligibleOrNotSelected(bool II)
Definition Decl.h:2421
void setConstexprKind(ConstexprSpecKind CSK)
Definition Decl.h:2473
void setDefaulted(bool D=true)
Definition Decl.h:2386
void setStorageClass(StorageClass SClass)
Sets the storage class as written in the source.
Definition Decl.h:2893
void setDeletedAsWritten(bool D=true, StringLiteral *Message=nullptr)
Definition Decl.cpp:3158
void setExplicitlyDefaulted(bool ED=true)
State that this function is explicitly defaulted.
Definition Decl.h:2394
void setHasImplicitReturnZero(bool IRZ)
State that falling off this function implicitly returns null/zero.
Definition Decl.h:2435
Represents a prototype with parameter type info, e.g.
Definition TypeBase.h:5254
ExceptionSpecificationType getExceptionSpecType() const
Get the kind of exception specification on this function.
Definition TypeBase.h:5561
Declaration of a template function.
static FunctionTemplateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Create an empty function template node.
Provides information about a function template specialization, which is a FunctionDecl that has been ...
FunctionTemplateDecl * getTemplate() const
Retrieve the template from which this function was specialized.
static FunctionTemplateSpecializationInfo * Create(ASTContext &C, FunctionDecl *FD, FunctionTemplateDecl *Template, TemplateSpecializationKind TSK, TemplateArgumentList *TemplateArgs, const TemplateArgumentListInfo *TemplateArgsAsWritten, SourceLocation POI, MemberSpecializationInfo *MSInfo)
void Profile(llvm::FoldingSetNodeID &ID)
FunctionDecl * getFunction() const
Retrieve the declaration of the function template specialization.
FunctionType - C99 6.7.5.3 - Function Declarators.
Definition TypeBase.h:4450
QualType getReturnType() const
Definition TypeBase.h:4790
HLSLBufferDecl - Represent a cbuffer or tbuffer declaration.
Definition Decl.h:5176
static HLSLBufferDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5859
One of these records is kept for each identifier that is lexed.
void setOutOfDate(bool OOD)
Set whether the information for this identifier is out of date with respect to the external source.
bool isOutOfDate() const
Determine whether the information for this identifier is out of date with respect to the external sou...
iterator begin(DeclarationName Name)
Returns an iterator over decls with the name 'Name'.
iterator end()
Returns the end iterator.
void setTemplateArguments(ArrayRef< TemplateArgument > Converted)
static ImplicitConceptSpecializationDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID, unsigned NumTemplateArgs)
static ImplicitParamDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5534
Describes a module import declaration, which makes the contents of the named module visible in the cu...
Definition Decl.h:5035
static ImportDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumLocations)
Create a new, deserialized module import declaration.
Definition Decl.cpp:5984
Represents a field injected from an anonymous union/struct into the parent scope.
Definition Decl.h:3467
static IndirectFieldDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5666
void setInherited(bool I)
Definition Attr.h:157
Description of a constructor that was inherited from a base class.
Definition DeclCXX.h:2575
Represents the declaration of a label.
Definition Decl.h:524
void setLocStart(SourceLocation L)
Definition Decl.h:552
static LabelDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5487
Describes the capture of a variable or of this, or of a C++1y init-capture.
LambdaCaptureKind getCaptureKind() const
Determine the kind of capture.
Definition ExprCXX.cpp:1264
Implicit declaration of a temporary that was materialized by a MaterializeTemporaryExpr and lifetime-...
Definition DeclCXX.h:3304
static LifetimeExtendedTemporaryDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.h:3334
Represents a linkage specification.
Definition DeclCXX.h:3011
void setExternLoc(SourceLocation L)
Definition DeclCXX.h:3052
void setLanguage(LinkageSpecLanguageIDs L)
Set the language specified by this linkage specification.
Definition DeclCXX.h:3039
void setRBraceLoc(SourceLocation L)
Definition DeclCXX.h:3053
static LinkageSpecDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:3261
Represents the results of name lookup.
Definition Lookup.h:147
A global _GUID constant.
Definition DeclCXX.h:4394
An instance of this class represents the declaration of a property member.
Definition DeclCXX.h:4340
static MSPropertyDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:3731
Provides information a specialization of a member of a class template, which may be a member function...
void setPointOfInstantiation(SourceLocation POI)
Set the first point of instantiation.
Provides common interface for the Decls that cannot be redeclared, but can be merged if the same decl...
Describes a module or submodule.
Definition Module.h: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:274
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
Definition Decl.h:295
bool isPlaceholderVar(const LangOptions &LangOpts) const
Definition Decl.cpp:1095
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
Definition Decl.h:340
void setDeclName(DeclarationName N)
Set the name of this declaration.
Definition Decl.h:343
Represents a C++ namespace alias.
Definition DeclCXX.h:3197
static NamespaceAliasDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:3366
Represent a C++ namespace.
Definition Decl.h:592
void setAnonymousNamespace(NamespaceDecl *D)
Definition Decl.h:679
void setNested(bool Nested)
Set whether this is a nested namespace declaration.
Definition Decl.h:660
void setInline(bool Inline)
Set whether this is an inline namespace declaration.
Definition Decl.h:651
static NamespaceDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:3322
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
static NonTypeTemplateParmDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, bool HasTypeConstraint)
unsigned getNumExpansionTypes() const
Retrieves the number of expansion types in an expanded parameter pack.
bool isExpandedParameterPack() const
Whether this parameter is a non-type template parameter pack that has a known list of different types...
bool hasPlaceholderTypeConstraint() const
Determine whether this non-type template parameter's type has a placeholder with a type-constraint.
void setPlaceholderTypeConstraint(Expr *E)
void setDefaultArgument(const ASTContext &C, const TemplateArgumentLoc &DefArg)
Set the default argument for this template parameter, and whether that default argument was inherited...
This represents 'pragma omp allocate ...' directive.
Definition DeclOpenMP.h:536
static OMPAllocateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NVars, unsigned NClauses)
Pseudo declaration for capturing expressions.
Definition DeclOpenMP.h:445
static OMPCapturedExprDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
OMPChildren * Data
Data, associated with the directive.
Definition DeclOpenMP.h:43
This represents 'pragma omp declare mapper ...' directive.
Definition DeclOpenMP.h:349
static OMPDeclareMapperDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned N)
Creates deserialized declare mapper node.
This represents 'pragma omp declare reduction ...' directive.
Definition DeclOpenMP.h:239
void setInitializerData(Expr *OrigE, Expr *PrivE)
Set initializer Orig and Priv vars.
Definition DeclOpenMP.h:319
void setInitializer(Expr *E, OMPDeclareReductionInitKind IK)
Set initializer expression for the declare reduction construct.
Definition DeclOpenMP.h:314
void setCombiner(Expr *E)
Set combiner expression for the declare reduction construct.
Definition DeclOpenMP.h:291
void setCombinerData(Expr *InE, Expr *OutE)
Set combiner In and Out vars.
Definition DeclOpenMP.h:293
static OMPDeclareReductionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Create deserialized declare reduction node.
This represents 'pragma omp requires...' directive.
Definition DeclOpenMP.h:479
static OMPRequiresDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned N)
Create deserialized requires node.
This represents 'pragma omp threadprivate ...' directive.
Definition DeclOpenMP.h:110
static OMPThreadPrivateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned N)
Represents a field declaration created by an @defs(...).
Definition DeclObjC.h:2030
static ObjCAtDefsFieldDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
ObjCCategoryDecl - Represents a category declaration.
Definition DeclObjC.h:2329
void setProtocolList(ObjCProtocolDecl *const *List, unsigned Num, const SourceLocation *Locs, ASTContext &C)
setProtocolList - Set the list of protocols that this interface implements.
Definition DeclObjC.h:2391
static ObjCCategoryDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setIvarLBraceLoc(SourceLocation Loc)
Definition DeclObjC.h:2463
void setCategoryNameLoc(SourceLocation Loc)
Definition DeclObjC.h:2461
void setIvarRBraceLoc(SourceLocation Loc)
Definition DeclObjC.h:2465
bool IsClassExtension() const
Definition DeclObjC.h:2437
ObjCCategoryImplDecl - An object of this class encapsulates a category @implementation declaration.
Definition DeclObjC.h:2545
static ObjCCategoryImplDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
ObjCCompatibleAliasDecl - Represents alias of a class.
Definition DeclObjC.h:2775
static ObjCCompatibleAliasDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setClassInterface(ObjCInterfaceDecl *D)
Definition DeclObjC.h:2795
ObjCContainerDecl - Represents a container for method declarations.
Definition DeclObjC.h:948
void setAtStartLoc(SourceLocation Loc)
Definition DeclObjC.h:1098
void setAtEndRange(SourceRange atEnd)
Definition DeclObjC.h:1105
void setClassInterface(ObjCInterfaceDecl *IFace)
ObjCImplementationDecl - Represents a class definition - this is where method definitions are specifi...
Definition DeclObjC.h:2597
static ObjCImplementationDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setIvarLBraceLoc(SourceLocation Loc)
Definition DeclObjC.h:2741
void setSuperClass(ObjCInterfaceDecl *superCls)
Definition DeclObjC.h:2739
void setIvarRBraceLoc(SourceLocation Loc)
Definition DeclObjC.h:2743
void setHasDestructors(bool val)
Definition DeclObjC.h:2708
void setHasNonZeroConstructors(bool val)
Definition DeclObjC.h:2703
Represents an ObjC class declaration.
Definition DeclObjC.h:1154
void mergeClassExtensionProtocolList(ObjCProtocolDecl *const *List, unsigned Num, ASTContext &C)
mergeClassExtensionProtocolList - Merge class extension's protocol list into the protocol list for th...
Definition DeclObjC.cpp:439
ObjCIvarDecl * lookupInstanceVariable(IdentifierInfo *IVarName, ObjCInterfaceDecl *&ClassDeclared)
Definition DeclObjC.cpp:634
unsigned getODRHash()
Get precomputed ODRHash or add a new one.
Definition DeclObjC.cpp:788
static ObjCInterfaceDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID)
ObjCInterfaceDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this Objective-C class.
Definition DeclObjC.h:1915
ObjCIvarDecl - Represents an ObjC instance variable.
Definition DeclObjC.h:1952
void setAccessControl(AccessControl ac)
Definition DeclObjC.h:1998
void setNextIvar(ObjCIvarDecl *ivar)
Definition DeclObjC.h:1989
ObjCInterfaceDecl * getContainingInterface()
Return the class interface that this ivar is logically contained in; this is either the interface whe...
void setSynthesize(bool synth)
Definition DeclObjC.h:2006
static ObjCIvarDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
ObjCMethodDecl - Represents an instance or class method declaration.
Definition DeclObjC.h:140
void setSynthesizedAccessorStub(bool isSynthesizedAccessorStub)
Definition DeclObjC.h:448
void setObjCDeclQualifier(ObjCDeclQualifier QV)
Definition DeclObjC.h:250
void setDefined(bool isDefined)
Definition DeclObjC.h:453
void setSelfDecl(ImplicitParamDecl *SD)
Definition DeclObjC.h:419
void setReturnTypeSourceInfo(TypeSourceInfo *TInfo)
Definition DeclObjC.h:344
void setHasRedeclaration(bool HRD) const
Definition DeclObjC.h:272
void setIsRedeclaration(bool RD)
Definition DeclObjC.h:267
void setCmdDecl(ImplicitParamDecl *CD)
Definition DeclObjC.h:421
bool hasRedeclaration() const
True if redeclared in the same interface.
Definition DeclObjC.h:271
void setRelatedResultType(bool RRT=true)
Note whether this method has a related result type.
Definition DeclObjC.h:261
void setOverriding(bool IsOver)
Definition DeclObjC.h:463
void setPropertyAccessor(bool isAccessor)
Definition DeclObjC.h:440
void setDeclImplementation(ObjCImplementationControl ic)
Definition DeclObjC.h:496
void setReturnType(QualType T)
Definition DeclObjC.h:330
static ObjCMethodDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclObjC.cpp:862
void setHasSkippedBody(bool Skipped=true)
Definition DeclObjC.h:478
void setInstanceMethod(bool isInst)
Definition DeclObjC.h:427
void setVariadic(bool isVar)
Definition DeclObjC.h:432
Represents one property declaration in an Objective-C interface.
Definition DeclObjC.h:731
void setAtLoc(SourceLocation L)
Definition DeclObjC.h:797
void setPropertyImplementation(PropertyControl pc)
Definition DeclObjC.h:908
void setSetterName(Selector Sel, SourceLocation Loc=SourceLocation())
Definition DeclObjC.h:896
void setPropertyAttributes(ObjCPropertyAttribute::Kind PRVal)
Definition DeclObjC.h:819
static ObjCPropertyDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setPropertyAttributesAsWritten(ObjCPropertyAttribute::Kind PRVal)
Definition DeclObjC.h:831
void setLParenLoc(SourceLocation L)
Definition DeclObjC.h:800
void setPropertyIvarDecl(ObjCIvarDecl *Ivar)
Definition DeclObjC.h:920
void setSetterMethodDecl(ObjCMethodDecl *gDecl)
Definition DeclObjC.h:905
void setType(QualType T, TypeSourceInfo *TSI)
Definition DeclObjC.h:806
void setGetterName(Selector Sel, SourceLocation Loc=SourceLocation())
Definition DeclObjC.h:888
void setGetterMethodDecl(ObjCMethodDecl *gDecl)
Definition DeclObjC.h:902
ObjCPropertyImplDecl - Represents implementation declaration of a property in a class or category imp...
Definition DeclObjC.h:2805
void setSetterMethodDecl(ObjCMethodDecl *MD)
Definition DeclObjC.h:2905
void setSetterCXXAssignment(Expr *setterCXXAssignment)
Definition DeclObjC.h:2919
static ObjCPropertyImplDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setGetterMethodDecl(ObjCMethodDecl *MD)
Definition DeclObjC.h:2902
void setAtLoc(SourceLocation Loc)
Definition DeclObjC.h:2868
void setPropertyDecl(ObjCPropertyDecl *Prop)
Definition DeclObjC.h:2873
void setGetterCXXConstructor(Expr *getterCXXConstructor)
Definition DeclObjC.h:2911
Represents an Objective-C protocol declaration.
Definition DeclObjC.h:2084
static ObjCProtocolDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
ObjCProtocolDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this Objective-C protocol.
Definition DeclObjC.h:2297
unsigned getODRHash()
Get precomputed ODRHash or add a new one.
Represents the declaration of an Objective-C type parameter.
Definition DeclObjC.h:578
static ObjCTypeParamDecl * CreateDeserialized(ASTContext &ctx, GlobalDeclID ID)
Stores a list of Objective-C type parameters for a parameterized class or a category/extension thereo...
Definition DeclObjC.h:662
static ObjCTypeParamList * create(ASTContext &ctx, SourceLocation lAngleLoc, ArrayRef< ObjCTypeParamDecl * > typeParams, SourceLocation rAngleLoc)
Create a new Objective-C type parameter list.
static OpenACCDeclareDecl * CreateDeserialized(ASTContext &Ctx, GlobalDeclID ID, unsigned NumClauses)
static OpenACCRoutineDecl * CreateDeserialized(ASTContext &Ctx, GlobalDeclID ID, unsigned NumClauses)
Represents a partial function definition.
Definition Decl.h:4861
void setNothrow(bool Nothrow=true)
Definition Decl.cpp:5598
static OutlinedFunctionDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumParams)
Definition Decl.cpp:5586
void setParam(unsigned i, ImplicitParamDecl *P)
Definition Decl.h:4897
Represents a parameter to a function.
Definition Decl.h:1790
static ParmVarDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:2963
void setUninstantiatedDefaultArg(Expr *arg)
Definition Decl.cpp:3036
void setScopeInfo(unsigned scopeDepth, unsigned parameterIndex)
Definition Decl.h:1823
void setObjCMethodScopeInfo(unsigned parameterIndex)
Definition Decl.h:1818
Represents a #pragma comment line.
Definition Decl.h:167
static PragmaCommentDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned ArgSize)
Definition Decl.cpp:5435
Represents a #pragma detect_mismatch line.
Definition Decl.h:201
static PragmaDetectMismatchDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NameValueSize)
Definition Decl.cpp:5460
A (possibly-)qualified type.
Definition TypeBase.h:937
bool isNull() const
Return true if this QualType doesn't point to a type yet.
Definition TypeBase.h:1004
Represents a struct/union/class.
Definition Decl.h:4312
unsigned getODRHash()
Get precomputed ODRHash or add a new one.
Definition Decl.cpp:5338
void setAnonymousStructOrUnion(bool Anon)
Definition Decl.h:4368
void setArgPassingRestrictions(RecordArgPassingKind Kind)
Definition Decl.h:4458
void setNonTrivialToPrimitiveCopy(bool V)
Definition Decl.h:4402
void setHasNonTrivialToPrimitiveCopyCUnion(bool V)
Definition Decl.h:4434
void setHasNonTrivialToPrimitiveDestructCUnion(bool V)
Definition Decl.h:4426
void setHasFlexibleArrayMember(bool V)
Definition Decl.h:4349
void setParamDestroyedInCallee(bool V)
Definition Decl.h:4466
void setNonTrivialToPrimitiveDestroy(bool V)
Definition Decl.h:4410
void setHasObjectMember(bool val)
Definition Decl.h:4373
void setHasVolatileMember(bool val)
Definition Decl.h:4377
void setHasNonTrivialToPrimitiveDefaultInitializeCUnion(bool V)
Definition Decl.h:4418
static RecordDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5166
void setHasUninitializedExplicitInitFields(bool V)
Definition Decl.h:4442
void setNonTrivialToPrimitiveDefaultInitialize(bool V)
Definition Decl.h:4394
Declaration of a redeclarable template.
CommonBase * Common
Pointer to the common data shared by all declarations of this template.
virtual CommonBase * newCommon(ASTContext &C) const =0
RedeclarableTemplateDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this template.
void setMemberSpecialization()
Note that this member template is a specialization.
void setInstantiatedFromMemberTemplate(RedeclarableTemplateDecl *TD)
Provides common interface for the Decls that can be redeclared.
DeclLink RedeclLink
Points to the next redeclaration in the chain.
bool isFirstDecl() const
True if this is the first declaration in its redeclaration chain.
static DeclLink PreviousDeclLink(decl_type *D)
Represents the body of a requires-expression.
Definition DeclCXX.h: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:4132
static StaticAssertDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:3629
StringLiteral - This represents a string literal expression, e.g.
Definition Expr.h:1799
Represents the declaration of a struct/union/class/enum.
Definition Decl.h:3717
void setTagKind(TagKind TK)
Definition Decl.h:3915
void setCompleteDefinitionRequired(bool V=true)
True if this complete decl is required to be complete for some existing use.
Definition Decl.h:3827
void demoteThisDefinitionToDeclaration()
Mark a definition as a declaration and maintain information it was a definition.
Definition Decl.h:3870
bool isThisDeclarationADefinition() const
Return true if this declaration is a completion definition of the type.
Definition Decl.h:3807
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:3842
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
Definition Decl.h:3812
bool isFirstDecl() const
True if this is the first declaration in its redeclaration chain.
TagDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Definition Decl.cpp:4888
void setFreeStanding(bool isFreeStanding=true)
True if this tag is free standing, e.g. "struct foo;".
Definition Decl.h:3850
void setBraceRange(SourceRange R)
Definition Decl.h:3789
void setCompleteDefinition(bool V=true)
True if this decl has its body fully specified.
Definition Decl.h:3815
A convenient class for passing around template argument information.
A template argument list.
static TemplateArgumentList * CreateCopy(ASTContext &Context, ArrayRef< TemplateArgument > Args)
Create a new template argument list that copies the given set of template arguments.
The base class of all kinds of template declarations (e.g., class, function, etc.).
TemplateParameterList * TemplateParams
void init(NamedDecl *NewTemplatedDecl)
Initialize the underlying templated declaration.
NamedDecl * getTemplatedDecl() const
Get the underlying, templated declaration.
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
A template parameter object.
TemplateParamObjectDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Stores a list of template parameters for a TemplateDecl and its derived classes.
TemplateTemplateParmDecl - Declares a template template parameter, e.g., "T" in.
unsigned getNumExpansionTemplateParameters() const
Retrieves the number of expansion template parameters in an expanded parameter pack.
static TemplateTemplateParmDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setDeclaredWithTypename(bool withTypename)
Set whether this template template parameter was declared with the 'typename' or 'class' keyword.
void setDefaultArgument(const ASTContext &C, const TemplateArgumentLoc &DefArg)
Set the default argument for this template parameter, and whether that default argument was inherited...
bool isExpandedParameterPack() const
Whether this parameter is a template template parameter pack that has a known list of different templ...
Declaration of a template type parameter.
void setTypeConstraint(ConceptReference *CR, Expr *ImmediatelyDeclaredConstraint, UnsignedOrNone ArgPackSubstIndex)
static TemplateTypeParmDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID)
bool hasTypeConstraint() const
Determine whether this template parameter has a type-constraint.
void setDefaultArgument(const ASTContext &C, const TemplateArgumentLoc &DefArg)
Set the default argument for this template parameter.
void setDeclaredWithTypename(bool withTypename)
Set whether this template type parameter was declared with the 'typename' or 'class' keyword.
A declaration that models statements at global scope.
Definition Decl.h:4617
static TopLevelStmtDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5792
The top declaration context.
Definition Decl.h:105
Represents the declaration of a typedef-name via a C++11 alias-declaration.
Definition Decl.h:3688
static TypeAliasDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5740
void setDescribedAliasTemplate(TypeAliasTemplateDecl *TAT)
Definition Decl.h:3707
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:3513
void setLocStart(SourceLocation L)
Definition Decl.h:3548
A container of type source information.
Definition TypeBase.h:8249
QualType getType() const
Return the type wrapped by this type source info.
Definition TypeBase.h:8260
const T * castAs() const
Member-template castAs<specific type>.
Definition TypeBase.h:9158
AutoType * getContainedAutoType() const
Get the AutoType whose type will be deduced for a variable with an initializer of this type.
Definition TypeBase.h:2899
const T * getAs() const
Member-template getAs<specific type>'.
Definition TypeBase.h:9091
Represents the declaration of a typedef-name via the 'typedef' type specifier.
Definition Decl.h:3667
static TypedefDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:5727
Base class for declarations which introduce a typedef-name.
Definition Decl.h:3562
void setModedTypeSourceInfo(TypeSourceInfo *unmodedTSI, QualType modedTy)
Definition Decl.h:3627
void setTypeSourceInfo(TypeSourceInfo *newType)
Definition Decl.h:3623
An artificial decl, representing a global anonymous constant value which is uniquified by value withi...
Definition DeclCXX.h:4451
void addDecl(NamedDecl *D)
A set of unresolved declarations.
This node is generated when a using-declaration that was annotated with attribute((using_if_exists)) ...
Definition DeclCXX.h:4114
static UnresolvedUsingIfExistsDecl * CreateDeserialized(ASTContext &Ctx, GlobalDeclID ID)
Definition DeclCXX.cpp:3605
Represents a dependent using declaration which was marked with typename.
Definition DeclCXX.h:4033
static UnresolvedUsingTypenameDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:3591
Represents a dependent using declaration which was not marked with typename.
Definition DeclCXX.h:3936
void setUsingLoc(SourceLocation L)
Set the source location of the 'using' keyword.
Definition DeclCXX.h:3970
static UnresolvedUsingValueDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:3561
Represents a C++ using-declaration.
Definition DeclCXX.h:3587
void setTypename(bool TN)
Sets whether the using declaration has 'typename'.
Definition DeclCXX.h:3639
void setUsingLoc(SourceLocation L)
Set the source location of the 'using' keyword.
Definition DeclCXX.h:3617
static UsingDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:3494
Represents C++ using-directive.
Definition DeclCXX.h:3092
static UsingDirectiveDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:3283
Represents a C++ using-enum-declaration.
Definition DeclCXX.h:3788
void setEnumType(TypeSourceInfo *TSI)
Definition DeclCXX.h:3827
void setEnumLoc(SourceLocation L)
Definition DeclCXX.h:3813
void setUsingLoc(SourceLocation L)
Definition DeclCXX.h:3809
static UsingEnumDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:3517
Represents a pack of using declarations that a single using-declarator pack-expanded into.
Definition DeclCXX.h:3869
static UsingPackDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, unsigned NumExpansions)
Definition DeclCXX.cpp:3537
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
Definition DeclCXX.h:3395
static UsingShadowDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition DeclCXX.cpp:3422
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Definition Decl.h:712
void setType(QualType newType)
Definition Decl.h:724
Represents a variable declaration or definition.
Definition Decl.h:926
ParmVarDeclBitfields ParmVarDeclBits
Definition Decl.h:1124
static VarDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Definition Decl.cpp:2157
VarDeclBitfields VarDeclBits
Definition Decl.h:1123
EvaluatedStmt * ensureEvaluatedStmt() const
Convert the initializer for this declaration to the elaborated EvaluatedStmt form,...
Definition Decl.cpp:2557
NonParmVarDeclBitfields NonParmVarDeclBits
Definition Decl.h:1125
@ Definition
This declaration is definitely a definition.
Definition Decl.h:1301
void setDescribedVarTemplate(VarTemplateDecl *Template)
Definition Decl.cpp:2815
StorageClass getStorageClass() const
Returns the storage class as written in the source.
Definition Decl.h:1168
VarDecl * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
Declaration of a variable template.
static VarTemplateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Create an empty variable template node.
static VarTemplatePartialSpecializationDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a variable template specialization, which refers to a variable template with a given set o...
void setTemplateArgsAsWritten(const ASTTemplateArgumentListInfo *ArgsWritten)
Set the template argument list as written in the sources.
static VarTemplateSpecializationDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
RawLocEncoding getRawLoc() const
uint64_t getBitOffset(const uint64_t DeclTypesBlockStartOffset) const
Information about a module that has been loaded by the ASTReader.
Definition ModuleFile.h:130
const serialization::ObjCCategoriesInfo * ObjCCategoriesMap
Array of category list location information within this module file, sorted by the definition ID.
Definition ModuleFile.h:463
unsigned LocalNumObjCCategoriesInMap
The number of redeclaration info entries in ObjCCategoriesMap.
Definition ModuleFile.h:466
llvm::BitstreamCursor DeclsCursor
DeclsCursor - This is a cursor to the start of the DECLTYPES_BLOCK block.
Definition ModuleFile.h:442
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:452
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:445
ModuleKind Kind
The type of this module.
Definition ModuleFile.h:142
SmallVector< uint64_t, 1 > ObjCCategories
The Objective-C category lists for categories known to this module.
Definition ModuleFile.h:470
const unsigned int LOCAL_REDECLARATIONS
Record code for a list of local redeclarations of a declaration.
DeclCode
Record codes for each kind of declaration.
const unsigned int DECL_UPDATES
Record of updates for a declaration that was modified after being deserialized.
@ DECL_EMPTY
An EmptyDecl record.
@ DECL_CAPTURED
A CapturedDecl record.
@ DECL_CXX_BASE_SPECIFIERS
A record containing CXXBaseSpecifiers.
@ DECL_CXX_RECORD
A CXXRecordDecl record.
@ DECL_VAR_TEMPLATE_PARTIAL_SPECIALIZATION
A VarTemplatePartialSpecializationDecl record.
@ DECL_OMP_ALLOCATE
An OMPAllocateDcl record.
@ DECL_MS_PROPERTY
A MSPropertyDecl record.
@ DECL_OMP_DECLARE_MAPPER
An OMPDeclareMapperDecl record.
@ DECL_TOP_LEVEL_STMT_DECL
A TopLevelStmtDecl record.
@ DECL_REQUIRES_EXPR_BODY
A RequiresExprBodyDecl record.
@ DECL_STATIC_ASSERT
A StaticAssertDecl record.
@ DECL_INDIRECTFIELD
A IndirectFieldDecl record.
@ DECL_TEMPLATE_TEMPLATE_PARM
A TemplateTemplateParmDecl record.
@ DECL_IMPORT
An ImportDecl recording a module import.
@ DECL_UNNAMED_GLOBAL_CONSTANT
A UnnamedGlobalConstantDecl record.
@ DECL_ACCESS_SPEC
An AccessSpecDecl record.
@ DECL_OBJC_TYPE_PARAM
An ObjCTypeParamDecl record.
@ DECL_OBJC_CATEGORY_IMPL
A ObjCCategoryImplDecl record.
@ DECL_ENUM_CONSTANT
An EnumConstantDecl record.
@ DECL_PARM_VAR
A ParmVarDecl record.
@ DECL_TYPEDEF
A TypedefDecl record.
@ DECL_EXPANDED_TEMPLATE_TEMPLATE_PARM_PACK
A TemplateTemplateParmDecl record that stores an expanded template template parameter pack.
@ DECL_HLSL_BUFFER
A HLSLBufferDecl record.
@ DECL_NAMESPACE_ALIAS
A NamespaceAliasDecl record.
@ DECL_TYPEALIAS
A TypeAliasDecl record.
@ DECL_FUNCTION_TEMPLATE
A FunctionTemplateDecl record.
@ DECL_MS_GUID
A MSGuidDecl record.
@ DECL_UNRESOLVED_USING_TYPENAME
An UnresolvedUsingTypenameDecl record.
@ DECL_CLASS_TEMPLATE_SPECIALIZATION
A ClassTemplateSpecializationDecl record.
@ DECL_FILE_SCOPE_ASM
A FileScopeAsmDecl record.
@ DECL_CXX_CONSTRUCTOR
A CXXConstructorDecl record.
@ DECL_CXX_CONVERSION
A CXXConversionDecl record.
@ DECL_FIELD
A FieldDecl record.
@ DECL_LINKAGE_SPEC
A LinkageSpecDecl record.
@ DECL_CONTEXT_TU_LOCAL_VISIBLE
A record that stores the set of declarations that are only visible to the TU.
@ DECL_NAMESPACE
A NamespaceDecl record.
@ DECL_NON_TYPE_TEMPLATE_PARM
A NonTypeTemplateParmDecl record.
@ DECL_USING_PACK
A UsingPackDecl record.
@ DECL_FUNCTION
A FunctionDecl record.
@ DECL_USING_DIRECTIVE
A UsingDirecitveDecl record.
@ DECL_RECORD
A RecordDecl record.
@ DECL_CONTEXT_LEXICAL
A record that stores the set of declarations that are lexically stored within a given DeclContext.
@ DECL_OUTLINEDFUNCTION
A OutlinedFunctionDecl record.
@ DECL_BLOCK
A BlockDecl record.
@ DECL_UNRESOLVED_USING_VALUE
An UnresolvedUsingValueDecl record.
@ DECL_TYPE_ALIAS_TEMPLATE
A TypeAliasTemplateDecl record.
@ DECL_CXX_CTOR_INITIALIZERS
A record containing CXXCtorInitializers.
@ DECL_OBJC_CATEGORY
A ObjCCategoryDecl record.
@ DECL_VAR
A VarDecl record.
@ DECL_UNRESOLVED_USING_IF_EXISTS
An UnresolvedUsingIfExistsDecl record.
@ DECL_USING
A UsingDecl record.
@ DECL_OBJC_PROTOCOL
A ObjCProtocolDecl record.
@ DECL_TEMPLATE_TYPE_PARM
A TemplateTypeParmDecl record.
@ DECL_VAR_TEMPLATE_SPECIALIZATION
A VarTemplateSpecializationDecl record.
@ DECL_OBJC_IMPLEMENTATION
A ObjCImplementationDecl record.
@ DECL_LABEL
A LabelDecl record.
@ DECL_OBJC_COMPATIBLE_ALIAS
A ObjCCompatibleAliasDecl record.
@ DECL_CONSTRUCTOR_USING_SHADOW
A ConstructorUsingShadowDecl record.
@ DECL_USING_ENUM
A UsingEnumDecl record.
@ DECL_FRIEND_TEMPLATE
A FriendTemplateDecl record.
@ DECL_PRAGMA_DETECT_MISMATCH
A PragmaDetectMismatchDecl record.
@ DECL_EXPANDED_NON_TYPE_TEMPLATE_PARM_PACK
A NonTypeTemplateParmDecl record that stores an expanded non-type template parameter pack.
@ DECL_OBJC_AT_DEFS_FIELD
A ObjCAtDefsFieldDecl record.
@ DECL_IMPLICIT_PARAM
An ImplicitParamDecl record.
@ DECL_FRIEND
A FriendDecl record.
@ DECL_CXX_METHOD
A CXXMethodDecl record.
@ DECL_EXPORT
An ExportDecl record.
@ DECL_BINDING
A BindingDecl record.
@ DECL_PRAGMA_COMMENT
A PragmaCommentDecl record.
@ DECL_ENUM
An EnumDecl record.
@ DECL_CONTEXT_MODULE_LOCAL_VISIBLE
A record containing the set of declarations that are only visible from DeclContext in the same module...
@ DECL_DECOMPOSITION
A DecompositionDecl record.
@ DECL_OMP_DECLARE_REDUCTION
An OMPDeclareReductionDecl record.
@ DECL_OMP_THREADPRIVATE
An OMPThreadPrivateDecl record.
@ DECL_OBJC_METHOD
A ObjCMethodDecl record.
@ DECL_CXX_DESTRUCTOR
A CXXDestructorDecl record.
@ DECL_OMP_CAPTUREDEXPR
An OMPCapturedExprDecl record.
@ DECL_CLASS_TEMPLATE
A ClassTemplateDecl record.
@ DECL_USING_SHADOW
A UsingShadowDecl record.
@ DECL_CONCEPT
A ConceptDecl record.
@ DECL_CXX_DEDUCTION_GUIDE
A CXXDeductionGuideDecl record.
@ DECL_OMP_REQUIRES
An OMPRequiresDecl record.
@ DECL_OBJC_IVAR
A ObjCIvarDecl record.
@ DECL_OBJC_PROPERTY
A ObjCPropertyDecl record.
@ DECL_TEMPLATE_PARAM_OBJECT
A TemplateParamObjectDecl record.
@ DECL_OBJC_INTERFACE
A ObjCInterfaceDecl record.
@ DECL_VAR_TEMPLATE
A VarTemplateDecl record.
@ DECL_LIFETIME_EXTENDED_TEMPORARY
An LifetimeExtendedTemporaryDecl record.
@ DECL_CLASS_TEMPLATE_PARTIAL_SPECIALIZATION
A ClassTemplatePartialSpecializationDecl record.
@ DECL_IMPLICIT_CONCEPT_SPECIALIZATION
An ImplicitConceptSpecializationDecl record.
@ DECL_CONTEXT_VISIBLE
A record that stores the set of declarations that are visible from a given DeclContext.
@ DECL_OBJC_PROPERTY_IMPL
A ObjCPropertyImplDecl record.
Defines the Linkage enumeration and various utility functions.
const internal::VariadicAllOfMatcher< Decl > decl
Matches declarations.
ComparisonCategoryResult Compare(const T &X, const T &Y)
Helper to compare two comparable types.
Definition Primitives.h:25
std::variant< struct RequiresDecl, struct HeaderDecl, struct UmbrellaDirDecl, struct ModuleDecl, struct ExcludeDecl, struct ExportDecl, struct ExportAsDecl, struct ExternModuleDecl, struct UseDecl, struct LinkDecl, struct ConfigMacrosDecl, struct ConflictDecl > Decl
All declarations that can appear in a module declaration.
bool needsAnonymousDeclarationNumber(const NamedDecl *D)
Determine whether the given declaration needs an anonymous declaration number.
void numberAnonymousDeclsWithin(const DeclContext *DC, Fn Visit)
Visit each declaration within DC that needs an anonymous declaration number and call Visit with the d...
Definition ASTCommon.h:75
uint64_t TypeID
An ID number that refers to a type in an AST file.
Definition ASTBitCodes.h:88
@ MK_MainFile
File is a PCH file treated as the actual main file.
Definition ModuleFile.h:57
uint32_t SubmoduleID
An ID number that refers to a submodule in a module file.
bool isPartOfPerModuleInitializer(const Decl *D)
Determine whether the given declaration will be included in the per-module initializer if it needs to...
Definition ASTCommon.h:95
The JSON file list parser is used to communicate input to InstallAPI.
OpenACCDirectiveKind
bool isa(CodeGen::Address addr)
Definition Address.h:330
SelectorLocationsKind
Whether all locations of the selector identifiers are in a "standard" position.
LazyOffsetPtr< Stmt, uint64_t, &ExternalASTSource::GetExternalDeclStmt > LazyDeclStmtPtr
A lazy pointer to a statement.
PragmaMSCommentKind
Definition PragmaKinds.h:14
bool isUnresolvedExceptionSpec(ExceptionSpecificationType ESpecType)
ConstexprSpecKind
Define the kind of constexpr specifier.
Definition Specifiers.h:35
LinkageSpecLanguageIDs
Represents the language in a linkage specification.
Definition DeclCXX.h:3003
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
SmallVector< Attr *, 4 > AttrVec
AttrVec - A vector of Attr, which is how they are stored on the AST.
OMPDeclareReductionInitKind
Definition DeclOpenMP.h:223
StorageClass
Storage classes.
Definition Specifiers.h: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.
Definition Linkage.h:30
@ Result
The result type of a method or function.
Definition TypeBase.h:905
const FunctionProtoType * T
@ Template
We are parsing a template declaration.
Definition Parser.h:81
TagTypeKind
The kind of a tag type.
Definition TypeBase.h:5878
@ VarTemplate
The name was classified as a variable template name.
Definition Sema.h:583
ObjCImplementationControl
Definition DeclObjC.h:118
RecordArgPassingKind
Enum that represents the different ways arguments are passed to and returned from function calls.
Definition Decl.h:4289
static bool isUndeducedReturnType(QualType T)
bool operator!=(CanQual< T > x, CanQual< U > y)
TemplateNameKind
Specifies the kind of template name that an identifier refers to.
@ LCD_None
Definition Lambda.h:23
DeductionCandidate
Only used by CXXDeductionGuideDecl.
Definition DeclBase.h:1421
bool shouldSkipCheckingODR(const Decl *D)
Definition ASTReader.h:2711
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
U cast(CodeGen::Address addr)
Definition Address.h:327
@ Interface
The "__interface" keyword introduces the elaborated-type-specifier.
Definition TypeBase.h:5858
@ Class
The "class" keyword introduces the elaborated-type-specifier.
Definition TypeBase.h:5864
@ Other
Other implicit parameter.
Definition Decl.h:1746
unsigned long uint64_t
Structure used to store a statement, the constant value to which it was evaluated (if any),...
Definition Decl.h:887
bool HasConstantDestruction
Whether this variable is known to have constant destruction.
Definition Decl.h:905
bool WasEvaluated
Whether this statement was already evaluated.
Definition Decl.h:889
bool CheckedForSideEffects
Definition Decl.h:913
LazyDeclStmtPtr Value
Definition Decl.h:915
APValue Evaluated
Definition Decl.h:916
bool HasConstantInitialization
Whether this variable is known to have constant initialization.
Definition Decl.h:898
Provides information about an explicit instantiation of a variable or class template.
SourceLocation ExternKeywordLoc
The location of the extern keyword.
Data that is common to all of the declarations of a given function template.
llvm::FoldingSetVector< FunctionTemplateSpecializationInfo > Specializations
The function template specializations for this function template, including explicit specializations ...
uint16_t Part2
...-89ab-...
Definition DeclCXX.h:4373
uint32_t Part1
{01234567-...
Definition DeclCXX.h:4371
uint16_t Part3
...-cdef-...
Definition DeclCXX.h:4375
uint8_t Part4And5[8]
...-0123-456789abcdef}
Definition DeclCXX.h:4377
llvm::DenseSet< std::tuple< Decl *, Decl *, int > > NonEquivalentDeclSet
Store declaration pairs already found to be non-equivalent.
static constexpr UnsignedOrNone fromInternalRepresentation(unsigned Rep)