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 @@ -118,8 +118,10 @@ "invocation but only used as a const reference; " "consider making it a const reference") << paramNameOrIndex(Param->getName(), Index); - // Do not propose fixes in macros since we cannot place them correctly. - if (Param->getLocStart().isMacroID()) + // Do not propose fixes in macros since we cannot place them correctly, or if + // function is virtual as it might break overrides. + const auto *Method = llvm::dyn_cast(Function); + if (Param->getLocStart().isMacroID() || (Method && Method->isVirtual())) return; for (const auto *FunctionDecl = Function; FunctionDecl != nullptr; FunctionDecl = FunctionDecl->getPreviousDecl()) { 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 @@ -182,6 +182,19 @@ } }; +struct VirtualMethodWarningOnly { + virtual void methodWithExpensiveValueParam(ExpensiveToCopyType T) {} + // CHECK-MESSAGES: [[@LINE-1]]:66: warning: the parameter 'T' is copied + // CHECK-FIXES: virtual void methodWithExpensiveValueParam(ExpensiveToCopyType T) {} + virtual ~VirtualMethodWarningOnly() {} +}; + +struct PositiveNonVirualMethod { + void method(const ExpensiveToCopyType T) {} + // CHECK-MESSAGES: [[@LINE-1]]:41: warning: the const qualified parameter 'T' is copied + // CHECK-FIXES: void method(const ExpensiveToCopyType& T) {} +}; + struct NegativeDeletedMethod { ~NegativeDeletedMethod() {} NegativeDeletedMethod& operator=(NegativeDeletedMethod N) = delete;