[PATCH] D116593: Fix `performance-unnecessary-value-param` for template specialization
gehry via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Fri Feb 25 00:17:34 PST 2022
Sockke updated this revision to Diff 411336.
Sockke added a comment.
Removed the fix for the template.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D116593/new/
https://reviews.llvm.org/D116593
Files:
clang-tools-extra/clang-tidy/performance/UnnecessaryValueParamCheck.cpp
clang-tools-extra/test/clang-tidy/checkers/performance-unnecessary-value-param-delayed.cpp
clang-tools-extra/test/clang-tidy/checkers/performance-unnecessary-value-param.cpp
Index: clang-tools-extra/test/clang-tidy/checkers/performance-unnecessary-value-param.cpp
===================================================================
--- clang-tools-extra/test/clang-tidy/checkers/performance-unnecessary-value-param.cpp
+++ clang-tools-extra/test/clang-tidy/checkers/performance-unnecessary-value-param.cpp
@@ -109,7 +109,7 @@
template <typename T> void templateWithNonTemplatizedParameter(const ExpensiveToCopyType S, T V) {
// CHECK-MESSAGES: [[@LINE-1]]:90: warning: the const qualified parameter 'S'
- // CHECK-FIXES: template <typename T> void templateWithNonTemplatizedParameter(const ExpensiveToCopyType& S, T V) {
+ // CHECK-NOT-FIXES: template <typename T> void templateWithNonTemplatizedParameter(const ExpensiveToCopyType& S, T V) {
}
void instantiated() {
@@ -381,3 +381,24 @@
// CHECK-FIXES: void templateFunction<ExpensiveToCopyType>(ExpensiveToCopyType E) {
E.constReference();
}
+
+template <class T>
+T templateSpecializationFunction(ExpensiveToCopyType E) {
+ // CHECK-MESSAGES: [[@LINE-1]]:54: warning: the parameter 'E' is copied
+ // CHECK-NOT-FIXES: T templateSpecializationFunction(const ExpensiveToCopyType& E) {
+ return T();
+}
+
+template <>
+bool templateSpecializationFunction(ExpensiveToCopyType E) {
+ // CHECK-MESSAGES: [[@LINE-1]]:57: warning: the parameter 'E' is copied
+ // CHECK-NOT-FIXES: bool templateSpecializationFunction(const ExpensiveToCopyType& E) {
+ return true;
+}
+
+template <>
+int templateSpecializationFunction(ExpensiveToCopyType E) {
+ // CHECK-MESSAGES: [[@LINE-1]]:56: warning: the parameter 'E' is copied
+ // CHECK-NOT-FIXES: int templateSpecializationFunction(const ExpensiveToCopyType& E) {
+ return 0;
+}
Index: clang-tools-extra/test/clang-tidy/checkers/performance-unnecessary-value-param-delayed.cpp
===================================================================
--- clang-tools-extra/test/clang-tidy/checkers/performance-unnecessary-value-param-delayed.cpp
+++ clang-tools-extra/test/clang-tidy/checkers/performance-unnecessary-value-param-delayed.cpp
@@ -69,7 +69,7 @@
template <typename T> void templateWithNonTemplatizedParameter(const ExpensiveToCopyType S, T V) {
// CHECK-MESSAGES: [[@LINE-1]]:90: warning: the const qualified parameter 'S'
- // CHECK-FIXES: template <typename T> void templateWithNonTemplatizedParameter(const ExpensiveToCopyType& S, T V) {
+ // CHECK-NOT-FIXES: template <typename T> void templateWithNonTemplatizedParameter(const ExpensiveToCopyType& S, T V) {
}
void instantiated() {
Index: clang-tools-extra/clang-tidy/performance/UnnecessaryValueParamCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/performance/UnnecessaryValueParamCheck.cpp
+++ clang-tools-extra/clang-tidy/performance/UnnecessaryValueParamCheck.cpp
@@ -51,18 +51,6 @@
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(
@@ -146,11 +134,12 @@
// 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.
+ // 4. the function is a primary template or an explicit template
+ // specialization.
const auto *Method = llvm::dyn_cast<CXXMethodDecl>(Function);
if (Param->getBeginLoc().isMacroID() || (Method && Method->isVirtual()) ||
isReferencedOutsideOfCallExpr(*Function, *Result.Context) ||
- isExplicitTemplateSpecialization(*Function))
+ (Function->getTemplatedKind() != FunctionDecl::TK_NonTemplate))
return;
for (const auto *FunctionDecl = Function; FunctionDecl != nullptr;
FunctionDecl = FunctionDecl->getPreviousDecl()) {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D116593.411336.patch
Type: text/x-patch
Size: 4380 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20220225/fc49179b/attachment.bin>
More information about the cfe-commits
mailing list