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