diff --git a/clang/include/clang/AST/DeclTemplate.h b/clang/include/clang/AST/DeclTemplate.h --- a/clang/include/clang/AST/DeclTemplate.h +++ b/clang/include/clang/AST/DeclTemplate.h @@ -2266,7 +2266,7 @@ /// Retrieve the set of partial specializations of this class /// template. llvm::FoldingSetVector & - 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 &PS); + SmallVectorImpl &PS) const; /// Find a class template partial specialization with the given /// type T. diff --git a/clang/lib/AST/DeclTemplate.cpp b/clang/lib/AST/DeclTemplate.cpp --- a/clang/lib/AST/DeclTemplate.cpp +++ b/clang/lib/AST/DeclTemplate.cpp @@ -440,7 +440,7 @@ } llvm::FoldingSetVector & -ClassTemplateDecl::getPartialSpecializations() { +ClassTemplateDecl::getPartialSpecializations() const { LoadLazySpecializations(); return getCommonPtr()->PartialSpecializations; } @@ -528,7 +528,7 @@ } void ClassTemplateDecl::getPartialSpecializations( - SmallVectorImpl &PS) { + SmallVectorImpl &PS) const { llvm::FoldingSetVector &PartialSpecs = getPartialSpecializations(); PS.clear(); diff --git a/clang/lib/Tooling/Refactoring/Rename/USRFindingAction.cpp b/clang/lib/Tooling/Refactoring/Rename/USRFindingAction.cpp --- a/clang/lib/Tooling/Refactoring/Rename/USRFindingAction.cpp +++ b/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 #include @@ -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 PartialSpecs; + TemplateDecl->getPartialSpecializations(PartialSpecs); + llvm::for_each(PartialSpecs, + [&](const auto *Spec) { addUSRsOfCtorDtors(Spec); }); addUSRsOfCtorDtors(TemplateDecl->getTemplatedDecl()); } @@ -184,7 +178,6 @@ std::set USRSet; std::vector OverriddenMethods; std::vector InstantiatedMethods; - std::vector PartialSpecs; }; } // namespace