Lines Matching defs:D
38 template <typename DT> bool isDefinitionInDependentContext(DT *D) {
39 return D->isDependentContext() && D->isThisDeclarationADefinition();
65 uint64_t Emit(Decl *D) {
68 D->getDeclKindName() + "'");
72 void Visit(Decl *D);
74 void VisitDecl(Decl *D);
75 void VisitPragmaCommentDecl(PragmaCommentDecl *D);
76 void VisitPragmaDetectMismatchDecl(PragmaDetectMismatchDecl *D);
77 void VisitTranslationUnitDecl(TranslationUnitDecl *D);
78 void VisitNamedDecl(NamedDecl *D);
80 void VisitNamespaceDecl(NamespaceDecl *D);
81 void VisitUsingDirectiveDecl(UsingDirectiveDecl *D);
82 void VisitNamespaceAliasDecl(NamespaceAliasDecl *D);
83 void VisitTypeDecl(TypeDecl *D);
84 void VisitTypedefNameDecl(TypedefNameDecl *D);
85 void VisitTypedefDecl(TypedefDecl *D);
86 void VisitTypeAliasDecl(TypeAliasDecl *D);
87 void VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D);
88 void VisitUnresolvedUsingIfExistsDecl(UnresolvedUsingIfExistsDecl *D);
89 void VisitTagDecl(TagDecl *D);
90 void VisitEnumDecl(EnumDecl *D);
91 void VisitRecordDecl(RecordDecl *D);
92 void VisitCXXRecordDecl(CXXRecordDecl *D);
94 ClassTemplateSpecializationDecl *D);
96 ClassTemplatePartialSpecializationDecl *D);
97 void VisitVarTemplateSpecializationDecl(VarTemplateSpecializationDecl *D);
99 VarTemplatePartialSpecializationDecl *D);
100 void VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D);
101 void VisitValueDecl(ValueDecl *D);
102 void VisitEnumConstantDecl(EnumConstantDecl *D);
103 void VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D);
104 void VisitDeclaratorDecl(DeclaratorDecl *D);
105 void VisitFunctionDecl(FunctionDecl *D);
106 void VisitCXXDeductionGuideDecl(CXXDeductionGuideDecl *D);
107 void VisitCXXMethodDecl(CXXMethodDecl *D);
108 void VisitCXXConstructorDecl(CXXConstructorDecl *D);
109 void VisitCXXDestructorDecl(CXXDestructorDecl *D);
110 void VisitCXXConversionDecl(CXXConversionDecl *D);
111 void VisitFieldDecl(FieldDecl *D);
112 void VisitMSPropertyDecl(MSPropertyDecl *D);
113 void VisitMSGuidDecl(MSGuidDecl *D);
114 void VisitUnnamedGlobalConstantDecl(UnnamedGlobalConstantDecl *D);
115 void VisitTemplateParamObjectDecl(TemplateParamObjectDecl *D);
116 void VisitIndirectFieldDecl(IndirectFieldDecl *D);
117 void VisitVarDecl(VarDecl *D);
118 void VisitImplicitParamDecl(ImplicitParamDecl *D);
119 void VisitParmVarDecl(ParmVarDecl *D);
120 void VisitDecompositionDecl(DecompositionDecl *D);
121 void VisitBindingDecl(BindingDecl *D);
122 void VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D);
123 void VisitTemplateDecl(TemplateDecl *D);
124 void VisitConceptDecl(ConceptDecl *D);
126 ImplicitConceptSpecializationDecl *D);
127 void VisitRequiresExprBodyDecl(RequiresExprBodyDecl *D);
128 void VisitRedeclarableTemplateDecl(RedeclarableTemplateDecl *D);
129 void VisitClassTemplateDecl(ClassTemplateDecl *D);
130 void VisitVarTemplateDecl(VarTemplateDecl *D);
131 void VisitFunctionTemplateDecl(FunctionTemplateDecl *D);
132 void VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D);
133 void VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D);
134 void VisitUsingDecl(UsingDecl *D);
135 void VisitUsingEnumDecl(UsingEnumDecl *D);
136 void VisitUsingPackDecl(UsingPackDecl *D);
137 void VisitUsingShadowDecl(UsingShadowDecl *D);
138 void VisitConstructorUsingShadowDecl(ConstructorUsingShadowDecl *D);
139 void VisitLinkageSpecDecl(LinkageSpecDecl *D);
140 void VisitExportDecl(ExportDecl *D);
141 void VisitFileScopeAsmDecl(FileScopeAsmDecl *D);
142 void VisitTopLevelStmtDecl(TopLevelStmtDecl *D);
143 void VisitImportDecl(ImportDecl *D);
144 void VisitAccessSpecDecl(AccessSpecDecl *D);
145 void VisitFriendDecl(FriendDecl *D);
146 void VisitFriendTemplateDecl(FriendTemplateDecl *D);
147 void VisitStaticAssertDecl(StaticAssertDecl *D);
148 void VisitBlockDecl(BlockDecl *D);
149 void VisitOutlinedFunctionDecl(OutlinedFunctionDecl *D);
150 void VisitCapturedDecl(CapturedDecl *D);
151 void VisitEmptyDecl(EmptyDecl *D);
152 void VisitLifetimeExtendedTemporaryDecl(LifetimeExtendedTemporaryDecl *D);
154 template <typename T> void VisitRedeclarable(Redeclarable<T> *D);
155 void VisitHLSLBufferDecl(HLSLBufferDecl *D);
158 void VisitObjCMethodDecl(ObjCMethodDecl *D);
159 void VisitObjCTypeParamDecl(ObjCTypeParamDecl *D);
160 void VisitObjCContainerDecl(ObjCContainerDecl *D);
161 void VisitObjCInterfaceDecl(ObjCInterfaceDecl *D);
162 void VisitObjCIvarDecl(ObjCIvarDecl *D);
163 void VisitObjCProtocolDecl(ObjCProtocolDecl *D);
164 void VisitObjCAtDefsFieldDecl(ObjCAtDefsFieldDecl *D);
165 void VisitObjCCategoryDecl(ObjCCategoryDecl *D);
166 void VisitObjCImplDecl(ObjCImplDecl *D);
167 void VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D);
168 void VisitObjCImplementationDecl(ObjCImplementationDecl *D);
169 void VisitObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *D);
170 void VisitObjCPropertyDecl(ObjCPropertyDecl *D);
171 void VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D);
172 void VisitOMPThreadPrivateDecl(OMPThreadPrivateDecl *D);
173 void VisitOMPAllocateDecl(OMPAllocateDecl *D);
174 void VisitOMPRequiresDecl(OMPRequiresDecl *D);
175 void VisitOMPDeclareReductionDecl(OMPDeclareReductionDecl *D);
176 void VisitOMPDeclareMapperDecl(OMPDeclareMapperDecl *D);
177 void VisitOMPCapturedExprDecl(OMPCapturedExprDecl *D);
196 /// declaration of D.
198 const Decl *D, bool IncludeLocal,
202 for (const Decl *R = D->getMostRecentDecl(); R; R = R->getPreviousDecl()) {
211 /// provides a declaration of D. The intent is to provide a sufficient
213 void AddFirstDeclFromEachModule(const Decl *D, bool IncludeLocal) {
215 CollectFirstDeclFromEachModule(D, IncludeLocal, Firsts);
222 /// file that provides a declaration of D. We store the DeclId and an
223 /// ODRHash of the template arguments of D which should provide enough
224 /// information to load D only if the template instantiator needs it.
226 const Decl *D, llvm::SmallVectorImpl<const Decl *> &SpecsInMap,
228 assert((isa<ClassTemplateSpecializationDecl>(D) ||
229 isa<VarTemplateSpecializationDecl>(D) || isa<FunctionDecl>(D)) &&
232 CollectFirstDeclFromEachModule(D, /*IncludeLocal*/ true, Firsts);
261 void AddTemplateSpecializations(DeclTy *D) {
262 auto *Common = D->getCommonPtr();
268 Writer.Chain && Writer.Chain->haveUnloadedSpecializations(D)) {
269 D->LoadLazySpecializations();
270 assert(!Writer.Chain->haveUnloadedSpecializations(D));
283 for (auto *D : AllSpecs) {
284 assert(D->isCanonicalDecl() && "non-canonical decl in set");
285 AddFirstSpecializationDeclFromEachModule(D, Specs, PartialSpecs);
289 D, Specs, /*IsPartial=*/false));
292 if (isa<FunctionTemplateDecl>(D)) {
298 D, PartialSpecs, /*IsPartial=*/true));
330 bool clang::CanElideDeclDef(const Decl *D) {
331 if (auto *FD = dyn_cast<FunctionDecl>(D)) {
342 if (auto *VD = dyn_cast<VarDecl>(D)) {
358 void ASTDeclWriter::Visit(Decl *D) {
359 DeclVisitor<ASTDeclWriter>::Visit(D);
364 if (auto *DD = dyn_cast<DeclaratorDecl>(D)) {
372 if (auto *FD = dyn_cast<FunctionDecl>(D)) {
385 if (auto *VD = dyn_cast<VarDecl>(D)) {
394 if (auto *FD = dyn_cast<FieldDecl>(D)) {
409 if (auto *DC = dyn_cast<DeclContext>(D))
413 void ASTDeclWriter::VisitDecl(Decl *D) {
425 DeclBits.addBits((uint64_t)D->getModuleOwnershipKind(), /*BitWidth=*/3);
426 DeclBits.addBit(D->isReferenced());
427 DeclBits.addBit(D->isUsed(false));
428 DeclBits.addBits(D->getAccess(), /*BitWidth=*/2);
429 DeclBits.addBit(D->isImplicit());
430 DeclBits.addBit(D->getDeclContext() != D->getLexicalDeclContext());
431 DeclBits.addBit(D->hasAttrs());
432 DeclBits.addBit(D->isTopLevelDeclInObjCContainer());
433 DeclBits.addBit(D->isInvalidDecl());
436 Record.AddDeclRef(cast_or_null<Decl>(D->getDeclContext()));
437 if (D->getDeclContext() != D->getLexicalDeclContext())
438 Record.AddDeclRef(cast_or_null<Decl>(D->getLexicalDeclContext()));
440 if (D->hasAttrs())
441 Record.AddAttributes(D->getAttrs());
443 Record.push_back(Writer.getSubmoduleID(D->getOwningModule()));
453 if (D->isOutOfLine()) {
454 auto *DC = D->getDeclContext();
466 void ASTDeclWriter::VisitPragmaCommentDecl(PragmaCommentDecl *D) {
467 StringRef Arg = D->getArg();
469 VisitDecl(D);
470 Record.AddSourceLocation(D->getBeginLoc());
471 Record.push_back(D->getCommentKind());
477 PragmaDetectMismatchDecl *D) {
478 StringRef Name = D->getName();
479 StringRef Value = D->getValue();
481 VisitDecl(D);
482 Record.AddSourceLocation(D->getBeginLoc());
488 void ASTDeclWriter::VisitTranslationUnitDecl(TranslationUnitDecl *D) {
492 void ASTDeclWriter::VisitNamedDecl(NamedDecl *D) {
493 VisitDecl(D);
494 Record.AddDeclarationName(D->getDeclName());
495 Record.push_back(needsAnonymousDeclarationNumber(D)
496 ? Writer.getAnonymousDeclarationNumber(D)
500 void ASTDeclWriter::VisitTypeDecl(TypeDecl *D) {
501 VisitNamedDecl(D);
502 Record.AddSourceLocation(D->getBeginLoc());
503 Record.AddTypeRef(QualType(D->getTypeForDecl(), 0));
506 void ASTDeclWriter::VisitTypedefNameDecl(TypedefNameDecl *D) {
507 VisitRedeclarable(D);
508 VisitTypeDecl(D);
509 Record.AddTypeSourceInfo(D->getTypeSourceInfo());
510 Record.push_back(D->isModed());
511 if (D->isModed())
512 Record.AddTypeRef(D->getUnderlyingType());
513 Record.AddDeclRef(D->getAnonDeclWithTypedefName(false));
516 void ASTDeclWriter::VisitTypedefDecl(TypedefDecl *D) {
517 VisitTypedefNameDecl(D);
518 if (D->getDeclContext() == D->getLexicalDeclContext() &&
519 !D->hasAttrs() &&
520 !D->isImplicit() &&
521 D->getFirstDecl() == D->getMostRecentDecl() &&
522 !D->isInvalidDecl() &&
523 !D->isTopLevelDeclInObjCContainer() &&
524 !D->isModulePrivate() &&
525 !needsAnonymousDeclarationNumber(D) &&
526 D->getDeclName().getNameKind() == DeclarationName::Identifier)
532 void ASTDeclWriter::VisitTypeAliasDecl(TypeAliasDecl *D) {
533 VisitTypedefNameDecl(D);
534 Record.AddDeclRef(D->getDescribedAliasTemplate());
538 void ASTDeclWriter::VisitTagDecl(TagDecl *D) {
543 VisitRedeclarable(D);
544 VisitTypeDecl(D);
545 Record.push_back(D->getIdentifierNamespace());
548 TagDeclBits.addBits(llvm::to_underlying(D->getTagKind()), /*BitWidth=*/3);
549 TagDeclBits.addBit(!isa<CXXRecordDecl>(D) ? D->isCompleteDefinition() : 0);
550 TagDeclBits.addBit(D->isEmbeddedInDeclarator());
551 TagDeclBits.addBit(D->isFreeStanding());
552 TagDeclBits.addBit(D->isCompleteDefinitionRequired());
554 D->hasExtInfo() ? 1 : (D->getTypedefNameForAnonDecl() ? 2 : 0),
558 Record.AddSourceRange(D->getBraceRange());
560 if (D->hasExtInfo()) {
561 Record.AddQualifierInfo(*D->getExtInfo());
562 } else if (auto *TD = D->getTypedefNameForAnonDecl()) {
568 void ASTDeclWriter::VisitEnumDecl(EnumDecl *D) {
573 VisitTagDecl(D);
574 Record.AddTypeSourceInfo(D->getIntegerTypeSourceInfo());
575 if (!D->getIntegerTypeSourceInfo())
576 Record.AddTypeRef(D->getIntegerType());
577 Record.AddTypeRef(D->getPromotionType());
580 EnumDeclBits.addBits(D->getNumPositiveBits(), /*BitWidth=*/8);
581 EnumDeclBits.addBits(D->getNumNegativeBits(), /*BitWidth=*/8);
582 EnumDeclBits.addBit(D->isScoped());
583 EnumDeclBits.addBit(D->isScopedUsingClassTag());
584 EnumDeclBits.addBit(D->isFixed());
587 Record.push_back(D->getODRHash());
589 if (MemberSpecializationInfo *MemberInfo = D->getMemberSpecializationInfo()) {
597 if (D->getDeclContext() == D->getLexicalDeclContext() && !D->hasAttrs() &&
598 !D->isInvalidDecl() && !D->isImplicit() && !D->hasExtInfo() &&
599 !D->getTypedefNameForAnonDecl() &&
600 D->getFirstDecl() == D->getMostRecentDecl() &&
601 !D->isTopLevelDeclInObjCContainer() &&
602 !CXXRecordDecl::classofKind(D->getKind()) &&
603 !D->getIntegerTypeSourceInfo() && !D->getMemberSpecializationInfo() &&
604 !needsAnonymousDeclarationNumber(D) &&
605 D->getDeclName().getNameKind() == DeclarationName::Identifier)
611 void ASTDeclWriter::VisitRecordDecl(RecordDecl *D) {
616 VisitTagDecl(D);
619 RecordDeclBits.addBit(D->hasFlexibleArrayMember());
620 RecordDeclBits.addBit(D->isAnonymousStructOrUnion());
621 RecordDeclBits.addBit(D->hasObjectMember());
622 RecordDeclBits.addBit(D->hasVolatileMember());
623 RecordDeclBits.addBit(D->isNonTrivialToPrimitiveDefaultInitialize());
624 RecordDeclBits.addBit(D->isNonTrivialToPrimitiveCopy());
625 RecordDeclBits.addBit(D->isNonTrivialToPrimitiveDestroy());
626 RecordDeclBits.addBit(D->hasNonTrivialToPrimitiveDefaultInitializeCUnion());
627 RecordDeclBits.addBit(D->hasNonTrivialToPrimitiveDestructCUnion());
628 RecordDeclBits.addBit(D->hasNonTrivialToPrimitiveCopyCUnion());
629 RecordDeclBits.addBit(D->hasUninitializedExplicitInitFields());
630 RecordDeclBits.addBit(D->isParamDestroyedInCallee());
631 RecordDeclBits.addBits(llvm::to_underlying(D->getArgPassingRestrictions()), 2);
636 if (!isa<CXXRecordDecl>(D))
637 Record.push_back(D->getODRHash());
639 if (D->getDeclContext() == D->getLexicalDeclContext() && !D->hasAttrs() &&
640 !D->isImplicit() && !D->isInvalidDecl() && !D->hasExtInfo() &&
641 !D->getTypedefNameForAnonDecl() &&
642 D->getFirstDecl() == D->getMostRecentDecl() &&
643 !D->isTopLevelDeclInObjCContainer() &&
644 !CXXRecordDecl::classofKind(D->getKind()) &&
645 !needsAnonymousDeclarationNumber(D) &&
646 D->getDeclName().getNameKind() == DeclarationName::Identifier)
652 void ASTDeclWriter::VisitValueDecl(ValueDecl *D) {
653 VisitNamedDecl(D);
654 Record.AddTypeRef(D->getType());
657 void ASTDeclWriter::VisitEnumConstantDecl(EnumConstantDecl *D) {
658 VisitValueDecl(D);
659 Record.push_back(D->getInitExpr()? 1 : 0);
660 if (D->getInitExpr())
661 Record.AddStmt(D->getInitExpr());
662 Record.AddAPSInt(D->getInitVal());
667 void ASTDeclWriter::VisitDeclaratorDecl(DeclaratorDecl *D) {
668 VisitValueDecl(D);
669 Record.AddSourceLocation(D->getInnerLocStart());
670 Record.push_back(D->hasExtInfo());
671 if (D->hasExtInfo()) {
672 DeclaratorDecl::ExtInfo *Info = D->getExtInfo();
677 Record.AddTypeRef(D->getTypeSourceInfo() ? D->getTypeSourceInfo()->getType()
681 void ASTDeclWriter::VisitFunctionDecl(FunctionDecl *D) {
686 VisitRedeclarable(D);
688 Record.push_back(D->getTemplatedKind());
689 switch (D->getTemplatedKind()) {
693 Record.AddDeclRef(D->getInstantiatedFromDecl());
696 Record.AddDeclRef(D->getDescribedFunctionTemplate());
699 MemberSpecializationInfo *MemberInfo = D->getMemberSpecializationInfo();
707 FTSInfo = D->getTemplateSpecializationInfo();
709 RegisterTemplateSpecialization(FTSInfo->getTemplate(), D);
735 if (D->isCanonicalDecl()) {
744 DFTSInfo = D->getDependentSpecializationInfo();
760 VisitDeclaratorDecl(D);
761 Record.AddDeclarationNameLoc(D->DNLoc, D->getDeclName());
762 Record.push_back(D->getIdentifierNamespace());
769 FunctionDeclBits.addBits(llvm::to_underlying(D->getLinkageInternal()), 3);
770 FunctionDeclBits.addBits((uint32_t)D->getStorageClass(), /*BitWidth=*/3);
771 FunctionDeclBits.addBit(D->isInlineSpecified());
772 FunctionDeclBits.addBit(D->isInlined());
773 FunctionDeclBits.addBit(D->hasSkippedBody());
774 FunctionDeclBits.addBit(D->isVirtualAsWritten());
775 FunctionDeclBits.addBit(D->isPureVirtual());
776 FunctionDeclBits.addBit(D->hasInheritedPrototype());
777 FunctionDeclBits.addBit(D->hasWrittenPrototype());
778 FunctionDeclBits.addBit(D->isDeletedBit());
779 FunctionDeclBits.addBit(D->isTrivial());
780 FunctionDeclBits.addBit(D->isTrivialForCall());
781 FunctionDeclBits.addBit(D->isDefaulted());
782 FunctionDeclBits.addBit(D->isExplicitlyDefaulted());
783 FunctionDeclBits.addBit(D->isIneligibleOrNotSelected());
784 FunctionDeclBits.addBits((uint64_t)(D->getConstexprKind()), /*BitWidth=*/2);
785 FunctionDeclBits.addBit(D->hasImplicitReturnZero());
786 FunctionDeclBits.addBit(D->isMultiVersion());
787 FunctionDeclBits.addBit(D->isLateTemplateParsed());
788 FunctionDeclBits.addBit(D->isInstantiatedFromMemberTemplate());
789 FunctionDeclBits.addBit(D->FriendConstraintRefersToEnclosingTemplate());
790 FunctionDeclBits.addBit(D->usesSEHTry());
793 Record.AddSourceLocation(D->getEndLoc());
794 if (D->isExplicitlyDefaulted())
795 Record.AddSourceLocation(D->getDefaultLoc());
797 Record.push_back(D->getODRHash());
799 if (D->isDefaulted() || D->isDeletedAsWritten()) {
800 if (auto *FDI = D->getDefalutedOrDeletedInfo()) {
818 if (D->getFriendObjectKind()) {
822 if (auto *RD = dyn_cast<CXXRecordDecl>(D->getLexicalParent());
825 Writer.GetDeclRef(D));
829 Record.push_back(D->param_size());
830 for (auto *P : D->parameters())
845 void ASTDeclWriter::VisitCXXDeductionGuideDecl(CXXDeductionGuideDecl *D) {
846 addExplicitSpecifier(D->getExplicitSpecifier(), Record);
847 Record.AddDeclRef(D->Ctor);
848 VisitFunctionDecl(D);
849 Record.push_back(static_cast<unsigned char>(D->getDeductionCandidateKind()));
850 Record.AddDeclRef(D->getSourceDeductionGuide());
852 static_cast<unsigned char>(D->getSourceDeductionGuideKind()));
856 void ASTDeclWriter::VisitObjCMethodDecl(ObjCMethodDecl *D) {
861 VisitNamedDecl(D);
864 bool HasBodyStuff = D->getBody() != nullptr;
867 Record.AddStmt(D->getBody());
869 Record.AddDeclRef(D->getSelfDecl());
870 Record.AddDeclRef(D->getCmdDecl());
871 Record.push_back(D->isInstanceMethod());
872 Record.push_back(D->isVariadic());
873 Record.push_back(D->isPropertyAccessor());
874 Record.push_back(D->isSynthesizedAccessorStub());
875 Record.push_back(D->isDefined());
876 Record.push_back(D->isOverriding());
877 Record.push_back(D->hasSkippedBody());
879 Record.push_back(D->isRedeclaration());
880 Record.push_back(D->hasRedeclaration());
881 if (D->hasRedeclaration()) {
882 assert(Record.getASTContext().getObjCMethodRedeclaration(D));
883 Record.AddDeclRef(Record.getASTContext().getObjCMethodRedeclaration(D));
887 Record.push_back(llvm::to_underlying(D->getImplementationControl()));
889 Record.push_back(D->getObjCDeclQualifier());
890 Record.push_back(D->hasRelatedResultType());
891 Record.AddTypeRef(D->getReturnType());
892 Record.AddTypeSourceInfo(D->getReturnTypeSourceInfo());
893 Record.AddSourceLocation(D->getEndLoc());
894 Record.push_back(D->param_size());
895 for (const auto *P : D->parameters())
898 Record.push_back(D->getSelLocsKind());
899 unsigned NumStoredSelLocs = D->getNumStoredSelLocs();
900 SourceLocation *SelLocs = D->getStoredSelLocs();
908 void ASTDeclWriter::VisitObjCTypeParamDecl(ObjCTypeParamDecl *D) {
909 VisitTypedefNameDecl(D);
910 Record.push_back(D->Variance);
911 Record.push_back(D->Index);
912 Record.AddSourceLocation(D->VarianceLoc);
913 Record.AddSourceLocation(D->ColonLoc);
918 void ASTDeclWriter::VisitObjCContainerDecl(ObjCContainerDecl *D) {
923 VisitNamedDecl(D);
924 Record.AddSourceLocation(D->getAtStartLoc());
925 Record.AddSourceRange(D->getAtEndRange());
929 void ASTDeclWriter::VisitObjCInterfaceDecl(ObjCInterfaceDecl *D) {
930 VisitRedeclarable(D);
931 VisitObjCContainerDecl(D);
932 Record.AddTypeRef(QualType(D->getTypeForDecl(), 0));
933 AddObjCTypeParamList(D->TypeParamList);
935 Record.push_back(D->isThisDeclarationADefinition());
936 if (D->isThisDeclarationADefinition()) {
938 ObjCInterfaceDecl::DefinitionData &Data = D->data();
940 Record.AddTypeSourceInfo(D->getSuperClassTInfo());
941 Record.AddSourceLocation(D->getEndOfDefinitionLoc());
943 Record.push_back(D->getODRHash());
947 for (const auto *P : D->protocols())
949 for (const auto &PL : D->protocol_locs())
961 if (ObjCCategoryDecl *Cat = D->getCategoryListRaw()) {
963 Writer.ObjCClassesWithCategories.insert(D);
974 void ASTDeclWriter::VisitObjCIvarDecl(ObjCIvarDecl *D) {
975 VisitFieldDecl(D);
977 Record.push_back(D->getAccessControl());
978 Record.push_back(D->getSynthesize());
980 if (D->getDeclContext() == D->getLexicalDeclContext() &&
981 !D->hasAttrs() &&
982 !D->isImplicit() &&
983 !D->isUsed(false) &&
984 !D->isInvalidDecl() &&
985 !D->isReferenced() &&
986 !D->isModulePrivate() &&
987 !D->getBitWidth() &&
988 !D->hasExtInfo() &&
989 D->getDeclName())
995 void ASTDeclWriter::VisitObjCProtocolDecl(ObjCProtocolDecl *D) {
996 VisitRedeclarable(D);
997 VisitObjCContainerDecl(D);
999 Record.push_back(D->isThisDeclarationADefinition());
1000 if (D->isThisDeclarationADefinition()) {
1001 Record.push_back(D->protocol_size());
1002 for (const auto *I : D->protocols())
1004 for (const auto &PL : D->protocol_locs())
1006 Record.push_back(D->getODRHash());
1012 void ASTDeclWriter::VisitObjCAtDefsFieldDecl(ObjCAtDefsFieldDecl *D) {
1013 VisitFieldDecl(D);
1017 void ASTDeclWriter::VisitObjCCategoryDecl(ObjCCategoryDecl *D) {
1018 VisitObjCContainerDecl(D);
1019 Record.AddSourceLocation(D->getCategoryNameLoc());
1020 Record.AddSourceLocation(D->getIvarLBraceLoc());
1021 Record.AddSourceLocation(D->getIvarRBraceLoc());
1022 Record.AddDeclRef(D->getClassInterface());
1023 AddObjCTypeParamList(D->TypeParamList);
1024 Record.push_back(D->protocol_size());
1025 for (const auto *I : D->protocols())
1027 for (const auto &PL : D->protocol_locs())
1032 void ASTDeclWriter::VisitObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *D) {
1033 VisitNamedDecl(D);
1034 Record.AddDeclRef(D->getClassInterface());
1038 void ASTDeclWriter::VisitObjCPropertyDecl(ObjCPropertyDecl *D) {
1039 VisitNamedDecl(D);
1040 Record.AddSourceLocation(D->getAtLoc());
1041 Record.AddSourceLocation(D->getLParenLoc());
1042 Record.AddTypeRef(D->getType());
1043 Record.AddTypeSourceInfo(D->getTypeSourceInfo());
1045 Record.push_back((unsigned)D->getPropertyAttributes());
1046 Record.push_back((unsigned)D->getPropertyAttributesAsWritten());
1048 Record.push_back((unsigned)D->getPropertyImplementation());
1049 Record.AddDeclarationName(D->getGetterName());
1050 Record.AddSourceLocation(D->getGetterNameLoc());
1051 Record.AddDeclarationName(D->getSetterName());
1052 Record.AddSourceLocation(D->getSetterNameLoc());
1053 Record.AddDeclRef(D->getGetterMethodDecl());
1054 Record.AddDeclRef(D->getSetterMethodDecl());
1055 Record.AddDeclRef(D->getPropertyIvarDecl());
1059 void ASTDeclWriter::VisitObjCImplDecl(ObjCImplDecl *D) {
1060 VisitObjCContainerDecl(D);
1061 Record.AddDeclRef(D->getClassInterface());
1065 void ASTDeclWriter::VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) {
1066 VisitObjCImplDecl(D);
1067 Record.AddSourceLocation(D->getCategoryNameLoc());
1071 void ASTDeclWriter::VisitObjCImplementationDecl(ObjCImplementationDecl *D) {
1072 VisitObjCImplDecl(D);
1073 Record.AddDeclRef(D->getSuperClass());
1074 Record.AddSourceLocation(D->getSuperClassLoc());
1075 Record.AddSourceLocation(D->getIvarLBraceLoc());
1076 Record.AddSourceLocation(D->getIvarRBraceLoc());
1077 Record.push_back(D->hasNonZeroConstructors());
1078 Record.push_back(D->hasDestructors());
1079 Record.push_back(D->NumIvarInitializers);
1080 if (D->NumIvarInitializers)
1082 llvm::ArrayRef(D->init_begin(), D->init_end()));
1086 void ASTDeclWriter::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D) {
1087 VisitDecl(D);
1088 Record.AddSourceLocation(D->getBeginLoc());
1089 Record.AddDeclRef(D->getPropertyDecl());
1090 Record.AddDeclRef(D->getPropertyIvarDecl());
1091 Record.AddSourceLocation(D->getPropertyIvarDeclLoc());
1092 Record.AddDeclRef(D->getGetterMethodDecl());
1093 Record.AddDeclRef(D->getSetterMethodDecl());
1094 Record.AddStmt(D->getGetterCXXConstructor());
1095 Record.AddStmt(D->getSetterCXXAssignment());
1099 void ASTDeclWriter::VisitFieldDecl(FieldDecl *D) {
1100 VisitDeclaratorDecl(D);
1101 Record.push_back(D->isMutable());
1103 Record.push_back((D->StorageKind << 1) | D->BitField);
1104 if (D->StorageKind == FieldDecl::ISK_CapturedVLAType)
1105 Record.AddTypeRef(QualType(D->getCapturedVLAType(), 0));
1106 else if (D->BitField)
1107 Record.AddStmt(D->getBitWidth());
1109 if (!D->getDeclName() || D->isPlaceholderVar(Writer.getLangOpts()))
1111 Record.getASTContext().getInstantiatedFromUnnamedFieldDecl(D));
1113 if (D->getDeclContext() == D->getLexicalDeclContext() &&
1114 !D->hasAttrs() &&
1115 !D->isImplicit() &&
1116 !D->isUsed(false) &&
1117 !D->isInvalidDecl() &&
1118 !D->isReferenced() &&
1119 !D->isTopLevelDeclInObjCContainer() &&
1120 !D->isModulePrivate() &&
1121 !D->getBitWidth() &&
1122 !D->hasInClassInitializer() &&
1123 !D->hasCapturedVLAType() &&
1124 !D->hasExtInfo() &&
1125 !ObjCIvarDecl::classofKind(D->getKind()) &&
1126 !ObjCAtDefsFieldDecl::classofKind(D->getKind()) &&
1127 D->getDeclName())
1133 void ASTDeclWriter::VisitMSPropertyDecl(MSPropertyDecl *D) {
1134 VisitDeclaratorDecl(D);
1135 Record.AddIdentifierRef(D->getGetterId());
1136 Record.AddIdentifierRef(D->getSetterId());
1140 void ASTDeclWriter::VisitMSGuidDecl(MSGuidDecl *D) {
1141 VisitValueDecl(D);
1142 MSGuidDecl::Parts Parts = D->getParts();
1151 UnnamedGlobalConstantDecl *D) {
1152 VisitValueDecl(D);
1153 Record.AddAPValue(D->getValue());
1157 void ASTDeclWriter::VisitTemplateParamObjectDecl(TemplateParamObjectDecl *D) {
1158 VisitValueDecl(D);
1159 Record.AddAPValue(D->getValue());
1163 void ASTDeclWriter::VisitIndirectFieldDecl(IndirectFieldDecl *D) {
1164 VisitValueDecl(D);
1165 Record.push_back(D->getChainingSize());
1167 for (const auto *P : D->chain())
1172 void ASTDeclWriter::VisitVarDecl(VarDecl *D) {
1173 VisitRedeclarable(D);
1174 VisitDeclaratorDecl(D);
1180 VarDeclBits.addBits(llvm::to_underlying(D->getLinkageInternal()),
1184 if (Writer.WritingModule && D->getStorageDuration() == SD_Static &&
1185 !D->getDescribedVarTemplate()) {
1191 (D->hasAttr<DLLExportAttr>() &&
1193 Record.getASTContext().GetGVALinkageForVariable(D) >=
1198 VarDeclBits.addBits(D->getStorageClass(), /*BitWidth=*/3);
1199 VarDeclBits.addBits(D->getTSCSpec(), /*BitWidth=*/2);
1200 VarDeclBits.addBits(D->getInitStyle(), /*BitWidth=*/2);
1201 VarDeclBits.addBit(D->isARCPseudoStrong());
1204 if (!isa<ParmVarDecl>(D)) {
1205 VarDeclBits.addBit(D->isThisDeclarationADemotedDefinition());
1206 VarDeclBits.addBit(D->isExceptionVariable());
1207 VarDeclBits.addBit(D->isNRVOVariable());
1208 VarDeclBits.addBit(D->isCXXForRangeDecl());
1210 VarDeclBits.addBit(D->isInline());
1211 VarDeclBits.addBit(D->isInlineSpecified());
1212 VarDeclBits.addBit(D->isConstexpr());
1213 VarDeclBits.addBit(D->isInitCapture());
1214 VarDeclBits.addBit(D->isPreviousDeclInSameBlockScope());
1216 VarDeclBits.addBit(D->isEscapingByref());
1217 HasDeducedType = D->getType()->getContainedDeducedType();
1220 if (const auto *IPD = dyn_cast<ImplicitParamDecl>(D))
1226 VarDeclBits.addBit(D->isObjCForDecl());
1232 Writer.AddDeclRef(D, Writer.ModularCodegenDecls);
1234 if (D->hasAttr<BlocksAttr>()) {
1235 BlockVarCopyInit Init = Record.getASTContext().getBlockVarCopyInit(D);
1244 if (VarTemplateDecl *TemplD = D->getDescribedVarTemplate()) {
1248 = D->getMemberSpecializationInfo()) {
1257 if (D->getDeclContext() == D->getLexicalDeclContext() && !D->hasAttrs() &&
1258 !D->isTopLevelDeclInObjCContainer() &&
1259 !needsAnonymousDeclarationNumber(D) &&
1260 D->getDeclName().getNameKind() == DeclarationName::Identifier &&
1261 !D->hasExtInfo() && D->getFirstDecl() == D->getMostRecentDecl() &&
1262 D->getKind() == Decl::Var && !D->isInline() && !D->isConstexpr() &&
1263 !D->isInitCapture() && !D->isPreviousDeclInSameBlockScope() &&
1264 !D->isEscapingByref() && !HasDeducedType &&
1265 D->getStorageDuration() != SD_Static && !D->getDescribedVarTemplate() &&
1266 !D->getMemberSpecializationInfo() && !D->isObjCForDecl() &&
1267 !isa<ImplicitParamDecl>(D) && !D->isEscapingByref())
1273 void ASTDeclWriter::VisitImplicitParamDecl(ImplicitParamDecl *D) {
1274 VisitVarDecl(D);
1278 void ASTDeclWriter::VisitParmVarDecl(ParmVarDecl *D) {
1279 VisitVarDecl(D);
1284 Record.push_back(D->getFunctionScopeIndex());
1287 ParmVarDeclBits.addBit(D->isObjCMethodParameter());
1288 ParmVarDeclBits.addBits(D->getFunctionScopeDepth(), /*BitsWidth=*/7);
1290 ParmVarDeclBits.addBits(D->getObjCDeclQualifier(), /*BitsWidth=*/7);
1291 ParmVarDeclBits.addBit(D->isKNRPromoted());
1292 ParmVarDeclBits.addBit(D->hasInheritedDefaultArg());
1293 ParmVarDeclBits.addBit(D->hasUninstantiatedDefaultArg());
1294 ParmVarDeclBits.addBit(D->getExplicitObjectParamThisLoc().isValid());
1297 if (D->hasUninstantiatedDefaultArg())
1298 Record.AddStmt(D->getUninstantiatedDefaultArg());
1299 if (D->getExplicitObjectParamThisLoc().isValid())
1300 Record.AddSourceLocation(D->getExplicitObjectParamThisLoc());
1306 if (D->getDeclContext() == D->getLexicalDeclContext() && !D->hasAttrs() &&
1307 !D->hasExtInfo() && D->getStorageClass() == 0 && !D->isInvalidDecl() &&
1308 !D->isTopLevelDeclInObjCContainer() &&
1309 D->getInitStyle() == VarDecl::CInit && // Can params have anything else?
1310 D->getInit() == nullptr) // No default expr.
1315 assert(!D->getTSCSpec() && "PARM_VAR_DECL can't use TLS");
1316 assert(!D->isThisDeclarationADemotedDefinition()
1318 assert(D->getAccess() == AS_none && "PARM_VAR_DECL can't be public/private");
1319 assert(!D->isExceptionVariable() && "PARM_VAR_DECL can't be exception var");
1320 assert(D->getPreviousDecl() == nullptr && "PARM_VAR_DECL can't be redecl");
1321 assert(!D->isStaticDataMember() &&
1325 void ASTDeclWriter::VisitDecompositionDecl(DecompositionDecl *D) {
1327 Record.push_back(D->bindings().size());
1329 VisitVarDecl(D);
1330 for (auto *B : D->bindings())
1335 void ASTDeclWriter::VisitBindingDecl(BindingDecl *D) {
1336 VisitValueDecl(D);
1337 Record.AddStmt(D->getBinding());
1341 void ASTDeclWriter::VisitFileScopeAsmDecl(FileScopeAsmDecl *D) {
1342 VisitDecl(D);
1343 Record.AddStmt(D->getAsmString());
1344 Record.AddSourceLocation(D->getRParenLoc());
1348 void ASTDeclWriter::VisitTopLevelStmtDecl(TopLevelStmtDecl *D) {
1349 VisitDecl(D);
1350 Record.AddStmt(D->getStmt());
1354 void ASTDeclWriter::VisitEmptyDecl(EmptyDecl *D) {
1355 VisitDecl(D);
1360 LifetimeExtendedTemporaryDecl *D) {
1361 VisitDecl(D);
1362 Record.AddDeclRef(D->getExtendingDecl());
1363 Record.AddStmt(D->getTemporaryExpr());
1364 Record.push_back(static_cast<bool>(D->getValue()));
1365 if (D->getValue())
1366 Record.AddAPValue(*D->getValue());
1367 Record.push_back(D->getManglingNumber());
1370 void ASTDeclWriter::VisitBlockDecl(BlockDecl *D) {
1371 VisitDecl(D);
1372 Record.AddStmt(D->getBody());
1373 Record.AddTypeSourceInfo(D->getSignatureAsWritten());
1374 Record.push_back(D->param_size());
1375 for (ParmVarDecl *P : D->parameters())
1377 Record.push_back(D->isVariadic());
1378 Record.push_back(D->blockMissingReturnType());
1379 Record.push_back(D->isConversionFromLambda());
1380 Record.push_back(D->doesNotEscape());
1381 Record.push_back(D->canAvoidCopyToHeap());
1382 Record.push_back(D->capturesCXXThis());
1383 Record.push_back(D->getNumCaptures());
1384 for (const auto &capture : D->captures()) {
1399 void ASTDeclWriter::VisitOutlinedFunctionDecl(OutlinedFunctionDecl *D) {
1400 Record.push_back(D->getNumParams());
1401 VisitDecl(D);
1402 for (unsigned I = 0; I < D->getNumParams(); ++I)
1403 Record.AddDeclRef(D->getParam(I));
1404 Record.push_back(D->isNothrow() ? 1 : 0);
1405 Record.AddStmt(D->getBody());
1420 void ASTDeclWriter::VisitLinkageSpecDecl(LinkageSpecDecl *D) {
1425 VisitDecl(D);
1426 Record.push_back(llvm::to_underlying(D->getLanguage()));
1427 Record.AddSourceLocation(D->getExternLoc());
1428 Record.AddSourceLocation(D->getRBraceLoc());
1432 void ASTDeclWriter::VisitExportDecl(ExportDecl *D) {
1433 VisitDecl(D);
1434 Record.AddSourceLocation(D->getRBraceLoc());
1438 void ASTDeclWriter::VisitLabelDecl(LabelDecl *D) {
1439 VisitNamedDecl(D);
1440 Record.AddSourceLocation(D->getBeginLoc());
1445 void ASTDeclWriter::VisitNamespaceDecl(NamespaceDecl *D) {
1446 VisitRedeclarable(D);
1447 VisitNamedDecl(D);
1450 NamespaceDeclBits.addBit(D->isInline());
1451 NamespaceDeclBits.addBit(D->isNested());
1454 Record.AddSourceLocation(D->getBeginLoc());
1455 Record.AddSourceLocation(D->getRBraceLoc());
1457 if (D->isFirstDecl())
1458 Record.AddDeclRef(D->getAnonymousNamespace());
1461 if (Writer.hasChain() && D->isAnonymousNamespace() &&
1462 D == D->getMostRecentDecl()) {
1468 D->getParent()->getRedeclContext()->getPrimaryContext());
1471 ASTWriter::DeclUpdate(UPD_CXX_ADDED_ANONYMOUS_NAMESPACE, D));
1476 void ASTDeclWriter::VisitNamespaceAliasDecl(NamespaceAliasDecl *D) {
1477 VisitRedeclarable(D);
1478 VisitNamedDecl(D);
1479 Record.AddSourceLocation(D->getNamespaceLoc());
1480 Record.AddSourceLocation(D->getTargetNameLoc());
1481 Record.AddNestedNameSpecifierLoc(D->getQualifierLoc());
1482 Record.AddDeclRef(D->getNamespace());
1486 void ASTDeclWriter::VisitUsingDecl(UsingDecl *D) {
1487 VisitNamedDecl(D);
1488 Record.AddSourceLocation(D->getUsingLoc());
1489 Record.AddNestedNameSpecifierLoc(D->getQualifierLoc());
1490 Record.AddDeclarationNameLoc(D->DNLoc, D->getDeclName());
1491 Record.AddDeclRef(D->FirstUsingShadow.getPointer());
1492 Record.push_back(D->hasTypename());
1493 Record.AddDeclRef(Record.getASTContext().getInstantiatedFromUsingDecl(D));
1497 void ASTDeclWriter::VisitUsingEnumDecl(UsingEnumDecl *D) {
1498 VisitNamedDecl(D);
1499 Record.AddSourceLocation(D->getUsingLoc());
1500 Record.AddSourceLocation(D->getEnumLoc());
1501 Record.AddTypeSourceInfo(D->getEnumType());
1502 Record.AddDeclRef(D->FirstUsingShadow.getPointer());
1503 Record.AddDeclRef(Record.getASTContext().getInstantiatedFromUsingEnumDecl(D));
1507 void ASTDeclWriter::VisitUsingPackDecl(UsingPackDecl *D) {
1508 Record.push_back(D->NumExpansions);
1509 VisitNamedDecl(D);
1510 Record.AddDeclRef(D->getInstantiatedFromUsingDecl());
1511 for (auto *E : D->expansions())
1516 void ASTDeclWriter::VisitUsingShadowDecl(UsingShadowDecl *D) {
1517 VisitRedeclarable(D);
1518 VisitNamedDecl(D);
1519 Record.AddDeclRef(D->getTargetDecl());
1520 Record.push_back(D->getIdentifierNamespace());
1521 Record.AddDeclRef(D->UsingOrNextShadow);
1523 Record.getASTContext().getInstantiatedFromUsingShadowDecl(D));
1525 if (D->getDeclContext() == D->getLexicalDeclContext() &&
1526 D->getFirstDecl() == D->getMostRecentDecl() && !D->hasAttrs() &&
1527 !needsAnonymousDeclarationNumber(D) &&
1528 D->getDeclName().getNameKind() == DeclarationName::Identifier)
1535 ConstructorUsingShadowDecl *D) {
1536 VisitUsingShadowDecl(D);
1537 Record.AddDeclRef(D->NominatedBaseClassShadowDecl);
1538 Record.AddDeclRef(D->ConstructedBaseClassShadowDecl);
1539 Record.push_back(D->IsVirtual);
1543 void ASTDeclWriter::VisitUsingDirectiveDecl(UsingDirectiveDecl *D) {
1544 VisitNamedDecl(D);
1545 Record.AddSourceLocation(D->getUsingLoc());
1546 Record.AddSourceLocation(D->getNamespaceKeyLocation());
1547 Record.AddNestedNameSpecifierLoc(D->getQualifierLoc());
1548 Record.AddDeclRef(D->getNominatedNamespace());
1549 Record.AddDeclRef(dyn_cast<Decl>(D->getCommonAncestor()));
1553 void ASTDeclWriter::VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D) {
1554 VisitValueDecl(D);
1555 Record.AddSourceLocation(D->getUsingLoc());
1556 Record.AddNestedNameSpecifierLoc(D->getQualifierLoc());
1557 Record.AddDeclarationNameLoc(D->DNLoc, D->getDeclName());
1558 Record.AddSourceLocation(D->getEllipsisLoc());
1563 UnresolvedUsingTypenameDecl *D) {
1564 VisitTypeDecl(D);
1565 Record.AddSourceLocation(D->getTypenameLoc());
1566 Record.AddNestedNameSpecifierLoc(D->getQualifierLoc());
1567 Record.AddSourceLocation(D->getEllipsisLoc());
1572 UnresolvedUsingIfExistsDecl *D) {
1573 VisitNamedDecl(D);
1577 void ASTDeclWriter::VisitCXXRecordDecl(CXXRecordDecl *D) {
1578 VisitRecordDecl(D);
1586 if (ClassTemplateDecl *TemplD = D->getDescribedClassTemplate()) {
1590 = D->getMemberSpecializationInfo()) {
1595 } else if (D->isLambda()) {
1598 if (auto *Context = D->getLambdaContextDecl()) {
1600 Record.push_back(D->getLambdaIndexInContext());
1606 if (auto *FD = llvm::dyn_cast_or_null<FunctionDecl>(D->getDeclContext());
1609 Writer.GetDeclRef(D));
1615 Record.push_back(D->isThisDeclarationADefinition());
1616 if (D->isThisDeclarationADefinition())
1617 Record.AddCXXDefinitionData(D);
1619 if (D->isCompleteDefinition() && D->isInNamedModule())
1620 Writer.AddDeclRef(D, Writer.ModularCodegenDecls);
1627 if (D->isCompleteDefinition())
1628 Record.AddDeclRef(Record.getASTContext().getCurrentKeyFunction(D));
1633 void ASTDeclWriter::VisitCXXMethodDecl(CXXMethodDecl *D) {
1634 VisitFunctionDecl(D);
1635 if (D->isCanonicalDecl()) {
1636 Record.push_back(D->size_overridden_methods());
1637 for (const CXXMethodDecl *MD : D->overridden_methods())
1644 if (D->getDeclContext() == D->getLexicalDeclContext() &&
1645 D->getFirstDecl() == D->getMostRecentDecl() && !D->isInvalidDecl() &&
1646 !D->hasAttrs() && !D->isTopLevelDeclInObjCContainer() &&
1647 D->getDeclName().getNameKind() == DeclarationName::Identifier &&
1648 !D->hasExtInfo() && !D->isExplicitlyDefaulted()) {
1649 if (D->getTemplatedKind() == FunctionDecl::TK_NonTemplate ||
1650 D->getTemplatedKind() == FunctionDecl::TK_FunctionTemplate ||
1651 D->getTemplatedKind() == FunctionDecl::TK_MemberSpecialization ||
1652 D->getTemplatedKind() == FunctionDecl::TK_DependentNonTemplate)
1653 AbbrevToUse = Writer.getDeclCXXMethodAbbrev(D->getTemplatedKind());
1654 else if (D->getTemplatedKind() ==
1657 D->getTemplateSpecializationInfo();
1664 AbbrevToUse = Writer.getDeclCXXMethodAbbrev(D->getTemplatedKind());
1666 } else if (D->getTemplatedKind() ==
1669 D->getDependentSpecializationInfo();
1671 AbbrevToUse = Writer.getDeclCXXMethodAbbrev(D->getTemplatedKind());
1678 void ASTDeclWriter::VisitCXXConstructorDecl(CXXConstructorDecl *D) {
1683 Record.push_back(D->getTrailingAllocKind());
1684 addExplicitSpecifier(D->getExplicitSpecifier(), Record);
1685 if (auto Inherited = D->getInheritedConstructor()) {
1690 VisitCXXMethodDecl(D);
1694 void ASTDeclWriter::VisitCXXDestructorDecl(CXXDestructorDecl *D) {
1695 VisitCXXMethodDecl(D);
1697 Record.AddDeclRef(D->getOperatorDelete());
1698 if (D->getOperatorDelete())
1699 Record.AddStmt(D->getOperatorDeleteThisArg());
1704 void ASTDeclWriter::VisitCXXConversionDecl(CXXConversionDecl *D) {
1705 addExplicitSpecifier(D->getExplicitSpecifier(), Record);
1706 VisitCXXMethodDecl(D);
1710 void ASTDeclWriter::VisitImportDecl(ImportDecl *D) {
1711 VisitDecl(D);
1712 Record.push_back(Writer.getSubmoduleID(D->getImportedModule()));
1713 ArrayRef<SourceLocation> IdentifierLocs = D->getIdentifierLocs();
1716 Record.AddSourceLocation(D->getEndLoc());
1728 void ASTDeclWriter::VisitAccessSpecDecl(AccessSpecDecl *D) {
1729 VisitDecl(D);
1730 Record.AddSourceLocation(D->getColonLoc());
1734 void ASTDeclWriter::VisitFriendDecl(FriendDecl *D) {
1737 Record.push_back(D->NumTPLists);
1738 VisitDecl(D);
1739 bool hasFriendDecl = isa<NamedDecl *>(D->Friend);
1742 Record.AddDeclRef(D->getFriendDecl());
1744 Record.AddTypeSourceInfo(D->getFriendType());
1745 for (unsigned i = 0; i < D->NumTPLists; ++i)
1746 Record.AddTemplateParameterList(D->getFriendTypeTemplateParameterList(i));
1747 Record.AddDeclRef(D->getNextFriend());
1748 Record.push_back(D->UnsupportedFriend);
1749 Record.AddSourceLocation(D->FriendLoc);
1750 Record.AddSourceLocation(D->EllipsisLoc);
1754 void ASTDeclWriter::VisitFriendTemplateDecl(FriendTemplateDecl *D) {
1755 VisitDecl(D);
1756 Record.push_back(D->getNumTemplateParameters());
1757 for (unsigned i = 0, e = D->getNumTemplateParameters(); i != e; ++i)
1758 Record.AddTemplateParameterList(D->getTemplateParameterList(i));
1759 Record.push_back(D->getFriendDecl() != nullptr);
1760 if (D->getFriendDecl())
1761 Record.AddDeclRef(D->getFriendDecl());
1763 Record.AddTypeSourceInfo(D->getFriendType());
1764 Record.AddSourceLocation(D->getFriendLoc());
1768 void ASTDeclWriter::VisitTemplateDecl(TemplateDecl *D) {
1769 VisitNamedDecl(D);
1771 Record.AddTemplateParameterList(D->getTemplateParameters());
1772 Record.AddDeclRef(D->getTemplatedDecl());
1775 void ASTDeclWriter::VisitConceptDecl(ConceptDecl *D) {
1776 VisitTemplateDecl(D);
1777 Record.AddStmt(D->getConstraintExpr());
1782 ImplicitConceptSpecializationDecl *D) {
1783 Record.push_back(D->getTemplateArguments().size());
1784 VisitDecl(D);
1785 for (const TemplateArgument &Arg : D->getTemplateArguments())
1790 void ASTDeclWriter::VisitRequiresExprBodyDecl(RequiresExprBodyDecl *D) {
1794 void ASTDeclWriter::VisitRedeclarableTemplateDecl(RedeclarableTemplateDecl *D) {
1795 VisitRedeclarable(D);
1799 if (D->isFirstDecl()) {
1801 Record.AddDeclRef(D->getInstantiatedFromMemberTemplate());
1802 if (D->getInstantiatedFromMemberTemplate())
1803 Record.push_back(D->isMemberSpecialization());
1806 VisitTemplateDecl(D);
1807 Record.push_back(D->getIdentifierNamespace());
1810 void ASTDeclWriter::VisitClassTemplateDecl(ClassTemplateDecl *D) {
1811 VisitRedeclarableTemplateDecl(D);
1813 if (D->isFirstDecl())
1814 AddTemplateSpecializations(D);
1820 Record.getASTContext().DeclarationNames.getCXXDeductionGuideName(D);
1821 for (auto *DG : D->getDeclContext()->noload_lookup(Name))
1829 ClassTemplateSpecializationDecl *D) {
1830 RegisterTemplateSpecialization(D->getSpecializedTemplate(), D);
1832 VisitCXXRecordDecl(D);
1836 = D->getSpecializedTemplateOrPartial();
1841 Record.AddTemplateArgumentList(&D->getTemplateInstantiationArgs());
1844 Record.AddTemplateArgumentList(&D->getTemplateArgs());
1845 Record.AddSourceLocation(D->getPointOfInstantiation());
1846 Record.push_back(D->getSpecializationKind());
1847 Record.push_back(D->isCanonicalDecl());
1849 if (D->isCanonicalDecl()) {
1851 Record.AddDeclRef(D->getSpecializedTemplate()->getCanonicalDecl());
1855 D->getTemplateSpecializationKind() ==
1857 D->getTemplateSpecializationKind() == TSK_ExplicitInstantiationDefinition;
1860 Record.AddSourceLocation(D->getExternKeywordLoc());
1861 Record.AddSourceLocation(D->getTemplateKeywordLoc());
1865 D->getTemplateArgsAsWritten();
1878 D->getSpecializedTemplate());
1879 for (auto *DG : D->getDeclContext()->noload_lookup(Name))
1887 ClassTemplatePartialSpecializationDecl *D) {
1888 Record.AddTemplateParameterList(D->getTemplateParameters());
1890 VisitClassTemplateSpecializationDecl(D);
1893 if (D->getPreviousDecl() == nullptr) {
1894 Record.AddDeclRef(D->getInstantiatedFromMember());
1895 Record.push_back(D->isMemberSpecialization());
1901 void ASTDeclWriter::VisitVarTemplateDecl(VarTemplateDecl *D) {
1902 VisitRedeclarableTemplateDecl(D);
1904 if (D->isFirstDecl())
1905 AddTemplateSpecializations(D);
1910 VarTemplateSpecializationDecl *D) {
1911 RegisterTemplateSpecialization(D->getSpecializedTemplate(), D);
1914 InstFrom = D->getSpecializedTemplateOrPartial();
1919 Record.AddTemplateArgumentList(&D->getTemplateInstantiationArgs());
1923 D->getTemplateSpecializationKind() ==
1925 D->getTemplateSpecializationKind() == TSK_ExplicitInstantiationDefinition;
1928 Record.AddSourceLocation(D->getExternKeywordLoc());
1929 Record.AddSourceLocation(D->getTemplateKeywordLoc());
1933 D->getTemplateArgsAsWritten();
1938 Record.AddTemplateArgumentList(&D->getTemplateArgs());
1939 Record.AddSourceLocation(D->getPointOfInstantiation());
1940 Record.push_back(D->getSpecializationKind());
1941 Record.push_back(D->IsCompleteDefinition);
1943 VisitVarDecl(D);
1945 Record.push_back(D->isCanonicalDecl());
1947 if (D->isCanonicalDecl()) {
1949 Record.AddDeclRef(D->getSpecializedTemplate()->getCanonicalDecl());
1956 VarTemplatePartialSpecializationDecl *D) {
1957 Record.AddTemplateParameterList(D->getTemplateParameters());
1959 VisitVarTemplateSpecializationDecl(D);
1962 if (D->getPreviousDecl() == nullptr) {
1963 Record.AddDeclRef(D->getInstantiatedFromMember());
1964 Record.push_back(D->isMemberSpecialization());
1970 void ASTDeclWriter::VisitFunctionTemplateDecl(FunctionTemplateDecl *D) {
1971 VisitRedeclarableTemplateDecl(D);
1973 if (D->isFirstDecl())
1974 AddTemplateSpecializations(D);
1978 void ASTDeclWriter::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) {
1979 Record.push_back(D->hasTypeConstraint());
1980 VisitTypeDecl(D);
1982 Record.push_back(D->wasDeclaredWithTypename());
1984 const TypeConstraint *TC = D->getTypeConstraint();
1985 if (D->hasTypeConstraint())
1993 Record.push_back(D->isExpandedParameterPack());
1994 if (D->isExpandedParameterPack())
1995 Record.push_back(D->getNumExpansionParameters());
1998 bool OwnsDefaultArg = D->hasDefaultArgument() &&
1999 !D->defaultArgumentWasInherited();
2002 Record.AddTemplateArgumentLoc(D->getDefaultArgument());
2004 if (!D->hasTypeConstraint() && !OwnsDefaultArg &&
2005 D->getDeclContext() == D->getLexicalDeclContext() &&
2006 !D->isInvalidDecl() && !D->hasAttrs() &&
2007 !D->isTopLevelDeclInObjCContainer() && !D->isImplicit() &&
2008 D->getDeclName().getNameKind() == DeclarationName::Identifier)
2014 void ASTDeclWriter::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) {
2018 Expr *TypeConstraint = D->getPlaceholderTypeConstraint();
2020 if (D->isExpandedParameterPack())
2021 Record.push_back(D->getNumExpansionTypes());
2023 VisitDeclaratorDecl(D);
2025 Record.push_back(D->getDepth());
2026 Record.push_back(D->getPosition());
2030 if (D->isExpandedParameterPack()) {
2031 for (unsigned I = 0, N = D->getNumExpansionTypes(); I != N; ++I) {
2032 Record.AddTypeRef(D->getExpansionType(I));
2033 Record.AddTypeSourceInfo(D->getExpansionTypeSourceInfo(I));
2039 Record.push_back(D->isParameterPack());
2040 bool OwnsDefaultArg = D->hasDefaultArgument() &&
2041 !D->defaultArgumentWasInherited();
2044 Record.AddTemplateArgumentLoc(D->getDefaultArgument());
2049 void ASTDeclWriter::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) {
2053 if (D->isExpandedParameterPack())
2054 Record.push_back(D->getNumExpansionTemplateParameters());
2056 VisitTemplateDecl(D);
2057 Record.push_back(D->wasDeclaredWithTypename());
2059 Record.push_back(D->getDepth());
2060 Record.push_back(D->getPosition());
2062 if (D->isExpandedParameterPack()) {
2063 for (unsigned I = 0, N = D->getNumExpansionTemplateParameters();
2065 Record.AddTemplateParameterList(D->getExpansionTemplateParameters(I));
2069 Record.push_back(D->isParameterPack());
2070 bool OwnsDefaultArg = D->hasDefaultArgument() &&
2071 !D->defaultArgumentWasInherited();
2074 Record.AddTemplateArgumentLoc(D->getDefaultArgument());
2079 void ASTDeclWriter::VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D) {
2080 VisitRedeclarableTemplateDecl(D);
2084 void ASTDeclWriter::VisitStaticAssertDecl(StaticAssertDecl *D) {
2085 VisitDecl(D);
2086 Record.AddStmt(D->getAssertExpr());
2087 Record.push_back(D->isFailed());
2088 Record.AddStmt(D->getMessage());
2089 Record.AddSourceLocation(D->getRParenLoc());
2124 const Decl *ASTWriter::getFirstLocalDecl(const Decl *D) {
2125 assert(IsLocalDecl(D) && "expected a local declaration");
2127 const Decl *Canon = D->getCanonicalDecl();
2135 for (const Decl *Redecl = D; Redecl; Redecl = Redecl->getPreviousDecl())
2137 D = Redecl;
2138 return CacheEntry = D;
2142 void ASTDeclWriter::VisitRedeclarable(Redeclarable<T> *D) {
2143 T *First = D->getFirstDecl();
2145 T *DAsT = static_cast<T *>(D);
2157 // that all redeclarations visible to this module are before D in the
2192 (void)Writer.GetDeclRef(D->getPreviousDecl());
2200 void ASTDeclWriter::VisitHLSLBufferDecl(HLSLBufferDecl *D) {
2201 VisitNamedDecl(D);
2202 VisitDeclContext(D);
2203 Record.push_back(D->isCBuffer());
2204 Record.AddSourceLocation(D->getLocStart());
2205 Record.AddSourceLocation(D->getLBraceLoc());
2206 Record.AddSourceLocation(D->getRBraceLoc());
2211 void ASTDeclWriter::VisitOMPThreadPrivateDecl(OMPThreadPrivateDecl *D) {
2212 Record.writeOMPChildren(D->Data);
2213 VisitDecl(D);
2217 void ASTDeclWriter::VisitOMPAllocateDecl(OMPAllocateDecl *D) {
2218 Record.writeOMPChildren(D->Data);
2219 VisitDecl(D);
2223 void ASTDeclWriter::VisitOMPRequiresDecl(OMPRequiresDecl *D) {
2224 Record.writeOMPChildren(D->Data);
2225 VisitDecl(D);
2229 void ASTDeclWriter::VisitOMPDeclareReductionDecl(OMPDeclareReductionDecl *D) {
2234 VisitValueDecl(D);
2235 Record.AddSourceLocation(D->getBeginLoc());
2236 Record.AddStmt(D->getCombinerIn());
2237 Record.AddStmt(D->getCombinerOut());
2238 Record.AddStmt(D->getCombiner());
2239 Record.AddStmt(D->getInitOrig());
2240 Record.AddStmt(D->getInitPriv());
2241 Record.AddStmt(D->getInitializer());
2242 Record.push_back(llvm::to_underlying(D->getInitializerKind()));
2243 Record.AddDeclRef(D->getPrevDeclInScope());
2247 void ASTDeclWriter::VisitOMPDeclareMapperDecl(OMPDeclareMapperDecl *D) {
2248 Record.writeOMPChildren(D->Data);
2249 VisitValueDecl(D);
2250 Record.AddDeclarationName(D->getVarName());
2251 Record.AddDeclRef(D->getPrevDeclInScope());
2255 void ASTDeclWriter::VisitOMPCapturedExprDecl(OMPCapturedExprDecl *D) {
2256 VisitVarDecl(D);
2902 static bool isRequiredDecl(const Decl *D, ASTContext &Context,
2912 if (isa<PragmaCommentDecl, PragmaDetectMismatchDecl>(D))
2922 if (isa<FileScopeAsmDecl, TopLevelStmtDecl, ObjCImplDecl>(D))
2925 if (WritingModule && isPartOfPerModuleInitializer(D)) {
2931 return Context.DeclMustBeEmitted(D);
2934 void ASTWriter::WriteDecl(ASTContext &Context, Decl *D) {
2935 PrettyDeclStackTraceEntry CrashInfo(Context, D, SourceLocation(),
2940 assert(!D->isFromASTFile() && "should not be emitting imported decl");
2941 LocalDeclID &IDR = DeclIDs[D];
2953 W.Visit(D);
2956 uint64_t Offset = W.Emit(D);
2959 SourceLocation Loc = D->getLocation();
2977 associateDeclWithFile(D, ID);
2981 if (isRequiredDecl(D, Context, WritingModule))
2982 AddDeclRef(D, EagerlyDeserializedDecls);