diff options
author | Felix Berger <flx@google.com> | 2017-07-26 00:45:41 +0000 |
---|---|---|
committer | Felix Berger <flx@google.com> | 2017-07-26 00:45:41 +0000 |
commit | b5c13269d3a68326663b0de04a3c047d7fd8e3cc (patch) | |
tree | 7839b1cc980abc0dae273b5c75bebcf3fe106911 /clang-tidy/performance | |
parent | 89a511008ba57782e6706db7d9898fb623cc107e (diff) |
[clang-tidy] Do not issue fixit for explicit template specializations
Summary:
Do not issue fixit in UnnecessaryValueParamCheck if the function is an explicit template specialization as this could cause build breakages.
Reviewers: alexfh
Subscribers: JDevlieghere, xazax.hun, cfe-commits
Differential Revision: https://reviews.llvm.org/D35718
git-svn-id: https://llvm.org/svn/llvm-project/clang-tools-extra/trunk@309067 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'clang-tidy/performance')
-rw-r--r-- | clang-tidy/performance/UnnecessaryValueParamCheck.cpp | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/clang-tidy/performance/UnnecessaryValueParamCheck.cpp b/clang-tidy/performance/UnnecessaryValueParamCheck.cpp index 04b81826..0dc47d5d 100644 --- a/clang-tidy/performance/UnnecessaryValueParamCheck.cpp +++ b/clang-tidy/performance/UnnecessaryValueParamCheck.cpp @@ -58,6 +58,18 @@ bool hasLoopStmtAncestor(const DeclRefExpr &DeclRef, const Decl &Decl, return Matches.empty(); } +bool isExplicitTemplateSpecialization(const FunctionDecl &Function) { + if (const auto *SpecializationInfo = Function.getTemplateSpecializationInfo()) + if (SpecializationInfo->getTemplateSpecializationKind() == + TSK_ExplicitSpecialization) + return true; + if (const auto *Method = llvm::dyn_cast<CXXMethodDecl>(&Function)) + if (Method->getTemplatedKind() == FunctionDecl::TK_MemberSpecialization && + Method->getMemberSpecializationInfo()->isExplicitSpecialization()) + return true; + return false; +} + } // namespace UnnecessaryValueParamCheck::UnnecessaryValueParamCheck( @@ -133,9 +145,11 @@ void UnnecessaryValueParamCheck::check(const MatchFinder::MatchResult &Result) { // 2. the function is virtual as it might break overrides // 3. the function is referenced outside of a call expression within the // compilation unit as the signature change could introduce build errors. + // 4. the function is an explicit template specialization. const auto *Method = llvm::dyn_cast<CXXMethodDecl>(Function); if (Param->getLocStart().isMacroID() || (Method && Method->isVirtual()) || - isReferencedOutsideOfCallExpr(*Function, *Result.Context)) + isReferencedOutsideOfCallExpr(*Function, *Result.Context) || + isExplicitTemplateSpecialization(*Function)) return; for (const auto *FunctionDecl = Function; FunctionDecl != nullptr; FunctionDecl = FunctionDecl->getPreviousDecl()) { |