Index: clang-tools-extra/trunk/clang-tidy/performance/UnnecessaryValueParamCheck.cpp =================================================================== --- clang-tools-extra/trunk/clang-tidy/performance/UnnecessaryValueParamCheck.cpp +++ clang-tools-extra/trunk/clang-tidy/performance/UnnecessaryValueParamCheck.cpp @@ -128,7 +128,10 @@ const auto &CurrentParam = *FunctionDecl->getParamDecl(Index); Diag << utils::fixit::changeVarDeclToReference(CurrentParam, *Result.Context); - if (!IsConstQualified) + // The parameter of each declaration needs to be checked individually as to + // whether it is const or not as constness can differ between definition and + // declaration. + if (!CurrentParam.getType().getCanonicalType().isConstQualified()) Diag << utils::fixit::changeVarDeclToConst(CurrentParam); } } Index: clang-tools-extra/trunk/test/clang-tidy/performance-unnecessary-value-param.cpp =================================================================== --- clang-tools-extra/trunk/test/clang-tidy/performance-unnecessary-value-param.cpp +++ clang-tools-extra/trunk/test/clang-tidy/performance-unnecessary-value-param.cpp @@ -244,3 +244,19 @@ void NegativeForIncompleteType(IncompleteType I) { // CHECK-MESSAGES: [[@LINE-1]]:47: error: variable has incomplete type 'IncompleteType' [clang-diagnostic-error] } + +// Case where parameter in declaration is already const-qualified but not in +// implementation. Make sure a second 'const' is not added to the declaration. +void PositiveConstDeclaration(const ExpensiveToCopyType A); +// CHECK-FIXES: void PositiveConstDeclaration(const ExpensiveToCopyType& A); +void PositiveConstDeclaration(ExpensiveToCopyType A) { + // CHECK-MESSAGES: [[@LINE-1]]:51: warning: the parameter 'A' is copied + // CHECK-FIXES: void PositiveConstDeclaration(const ExpensiveToCopyType& A) { +} + +void PositiveNonConstDeclaration(ExpensiveToCopyType A); +// CHECK-FIXES: void PositiveNonConstDeclaration(const ExpensiveToCopyType& A); +void PositiveNonConstDeclaration(const ExpensiveToCopyType A) { + // CHECK-MESSAGES: [[@LINE-1]]:60: warning: the const qualified parameter 'A' + // CHECK-FIXES: void PositiveNonConstDeclaration(const ExpensiveToCopyType& A) { +}