hokein created this revision. hokein added a reviewer: kbobyrev. Herald added a project: clang. hokein requested review of this revision.
Instead of collecting all specializations and doing a post-filterin, we can just get all targeted specializations from getPartialSpecializationsizations. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D89220 Files: clang/include/clang/AST/DeclTemplate.h clang/lib/AST/DeclTemplate.cpp clang/lib/Tooling/Refactoring/Rename/USRFindingAction.cpp Index: clang/lib/Tooling/Refactoring/Rename/USRFindingAction.cpp =================================================================== --- clang/lib/Tooling/Refactoring/Rename/USRFindingAction.cpp +++ clang/lib/Tooling/Refactoring/Rename/USRFindingAction.cpp @@ -27,6 +27,7 @@ #include "clang/Tooling/Refactoring.h" #include "clang/Tooling/Refactoring/Rename/USRFinder.h" #include "clang/Tooling/Tooling.h" +#include "llvm/ADT/STLExtras.h" #include <algorithm> #include <set> @@ -96,12 +97,6 @@ return true; } - bool VisitClassTemplatePartialSpecializationDecl( - const ClassTemplatePartialSpecializationDecl *PartialSpec) { - PartialSpecs.push_back(PartialSpec); - return true; - } - private: void handleCXXRecordDecl(const CXXRecordDecl *RecordDecl) { if (!RecordDecl->getDefinition()) { @@ -118,11 +113,10 @@ void handleClassTemplateDecl(const ClassTemplateDecl *TemplateDecl) { for (const auto *Specialization : TemplateDecl->specializations()) addUSRsOfCtorDtors(Specialization); - - for (const auto *PartialSpec : PartialSpecs) { - if (PartialSpec->getSpecializedTemplate() == TemplateDecl) - addUSRsOfCtorDtors(PartialSpec); - } + SmallVector<ClassTemplatePartialSpecializationDecl *, 4> PartialSpecs; + TemplateDecl->getPartialSpecializations(PartialSpecs); + llvm::for_each(PartialSpecs, + [&](const auto *Spec) { addUSRsOfCtorDtors(Spec); }); addUSRsOfCtorDtors(TemplateDecl->getTemplatedDecl()); } @@ -184,7 +178,6 @@ std::set<std::string> USRSet; std::vector<const CXXMethodDecl *> OverriddenMethods; std::vector<const CXXMethodDecl *> InstantiatedMethods; - std::vector<const ClassTemplatePartialSpecializationDecl *> PartialSpecs; }; } // namespace Index: clang/lib/AST/DeclTemplate.cpp =================================================================== --- clang/lib/AST/DeclTemplate.cpp +++ clang/lib/AST/DeclTemplate.cpp @@ -440,7 +440,7 @@ } llvm::FoldingSetVector<ClassTemplatePartialSpecializationDecl> & -ClassTemplateDecl::getPartialSpecializations() { +ClassTemplateDecl::getPartialSpecializations() const { LoadLazySpecializations(); return getCommonPtr()->PartialSpecializations; } @@ -528,7 +528,7 @@ } void ClassTemplateDecl::getPartialSpecializations( - SmallVectorImpl<ClassTemplatePartialSpecializationDecl *> &PS) { + SmallVectorImpl<ClassTemplatePartialSpecializationDecl *> &PS) const { llvm::FoldingSetVector<ClassTemplatePartialSpecializationDecl> &PartialSpecs = getPartialSpecializations(); PS.clear(); Index: clang/include/clang/AST/DeclTemplate.h =================================================================== --- clang/include/clang/AST/DeclTemplate.h +++ clang/include/clang/AST/DeclTemplate.h @@ -2266,7 +2266,7 @@ /// Retrieve the set of partial specializations of this class /// template. llvm::FoldingSetVector<ClassTemplatePartialSpecializationDecl> & - getPartialSpecializations(); + getPartialSpecializations() const; ClassTemplateDecl(ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName Name, TemplateParameterList *Params, @@ -2363,7 +2363,7 @@ /// Retrieve the partial specializations as an ordered list. void getPartialSpecializations( - SmallVectorImpl<ClassTemplatePartialSpecializationDecl *> &PS); + SmallVectorImpl<ClassTemplatePartialSpecializationDecl *> &PS) const; /// Find a class template partial specialization with the given /// type T.
Index: clang/lib/Tooling/Refactoring/Rename/USRFindingAction.cpp =================================================================== --- clang/lib/Tooling/Refactoring/Rename/USRFindingAction.cpp +++ clang/lib/Tooling/Refactoring/Rename/USRFindingAction.cpp @@ -27,6 +27,7 @@ #include "clang/Tooling/Refactoring.h" #include "clang/Tooling/Refactoring/Rename/USRFinder.h" #include "clang/Tooling/Tooling.h" +#include "llvm/ADT/STLExtras.h" #include <algorithm> #include <set> @@ -96,12 +97,6 @@ return true; } - bool VisitClassTemplatePartialSpecializationDecl( - const ClassTemplatePartialSpecializationDecl *PartialSpec) { - PartialSpecs.push_back(PartialSpec); - return true; - } - private: void handleCXXRecordDecl(const CXXRecordDecl *RecordDecl) { if (!RecordDecl->getDefinition()) { @@ -118,11 +113,10 @@ void handleClassTemplateDecl(const ClassTemplateDecl *TemplateDecl) { for (const auto *Specialization : TemplateDecl->specializations()) addUSRsOfCtorDtors(Specialization); - - for (const auto *PartialSpec : PartialSpecs) { - if (PartialSpec->getSpecializedTemplate() == TemplateDecl) - addUSRsOfCtorDtors(PartialSpec); - } + SmallVector<ClassTemplatePartialSpecializationDecl *, 4> PartialSpecs; + TemplateDecl->getPartialSpecializations(PartialSpecs); + llvm::for_each(PartialSpecs, + [&](const auto *Spec) { addUSRsOfCtorDtors(Spec); }); addUSRsOfCtorDtors(TemplateDecl->getTemplatedDecl()); } @@ -184,7 +178,6 @@ std::set<std::string> USRSet; std::vector<const CXXMethodDecl *> OverriddenMethods; std::vector<const CXXMethodDecl *> InstantiatedMethods; - std::vector<const ClassTemplatePartialSpecializationDecl *> PartialSpecs; }; } // namespace Index: clang/lib/AST/DeclTemplate.cpp =================================================================== --- clang/lib/AST/DeclTemplate.cpp +++ clang/lib/AST/DeclTemplate.cpp @@ -440,7 +440,7 @@ } llvm::FoldingSetVector<ClassTemplatePartialSpecializationDecl> & -ClassTemplateDecl::getPartialSpecializations() { +ClassTemplateDecl::getPartialSpecializations() const { LoadLazySpecializations(); return getCommonPtr()->PartialSpecializations; } @@ -528,7 +528,7 @@ } void ClassTemplateDecl::getPartialSpecializations( - SmallVectorImpl<ClassTemplatePartialSpecializationDecl *> &PS) { + SmallVectorImpl<ClassTemplatePartialSpecializationDecl *> &PS) const { llvm::FoldingSetVector<ClassTemplatePartialSpecializationDecl> &PartialSpecs = getPartialSpecializations(); PS.clear(); Index: clang/include/clang/AST/DeclTemplate.h =================================================================== --- clang/include/clang/AST/DeclTemplate.h +++ clang/include/clang/AST/DeclTemplate.h @@ -2266,7 +2266,7 @@ /// Retrieve the set of partial specializations of this class /// template. llvm::FoldingSetVector<ClassTemplatePartialSpecializationDecl> & - getPartialSpecializations(); + getPartialSpecializations() const; ClassTemplateDecl(ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName Name, TemplateParameterList *Params, @@ -2363,7 +2363,7 @@ /// Retrieve the partial specializations as an ordered list. void getPartialSpecializations( - SmallVectorImpl<ClassTemplatePartialSpecializationDecl *> &PS); + SmallVectorImpl<ClassTemplatePartialSpecializationDecl *> &PS) const; /// Find a class template partial specialization with the given /// type T.
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits