================ @@ -0,0 +1,93 @@ +// RUN: %check_clang_tidy -std=c++14-or-later %s performance-unnecessary-value-param %t + +struct ExpensiveToCopyType { + virtual ~ExpensiveToCopyType(); +}; + +template <typename T> void templateWithNonTemplatizedParameter(const ExpensiveToCopyType S, T V) { + // CHECK-MESSAGES: [[@LINE-1]]:90: warning: the const qualified parameter 'S' + // CHECK-MESSAGES: [[@LINE-2]]:95: warning: the parameter 'V' + // CHECK-FIXES: template <typename T> void templateWithNonTemplatizedParameter(const ExpensiveToCopyType& S, const T& V) { +} + +void instantiatedWithExpensiveValue() { + templateWithNonTemplatizedParameter( + ExpensiveToCopyType(), ExpensiveToCopyType()); + templateWithNonTemplatizedParameter(ExpensiveToCopyType(), 5); +} + +template <typename T> void templateWithNonTemplatizedParameterCheapTemplate(const ExpensiveToCopyType S, T V) { + // CHECK-MESSAGES: [[@LINE-1]]:103: warning: the const qualified parameter 'S' + // CHECK-FIXES: template <typename T> void templateWithNonTemplatizedParameterCheapTemplate(const ExpensiveToCopyType& S, T V) { +} + +void instantiatedWithCheapValue() { + templateWithNonTemplatizedParameterCheapTemplate(ExpensiveToCopyType(), 5); +} + +template <typename T> void nonInstantiatedTemplateWithConstValue(const T S) {} +template <typename T> void nonInstantiatedTemplateWithNonConstValue(T S) {} + +template <typename T> void instantiatedTemplateSpecialization(T NoSpecS) {} +template <> +void instantiatedTemplateSpecialization<ExpensiveToCopyType>( + ExpensiveToCopyType SpecS) { + // CHECK-MESSAGES: [[@LINE-1]]:25: warning: the parameter 'SpecS' + // When updating a template specialization, we also update the main template. ---------------- 5chmidti wrote:
> Note that it is template specialization and not an overload. Template specialization must have exactly the same signature. Whoops, I must have done something weird to think this works. Then what I would have originally written applies: When a specialization A is defined in another TU, applying a fix to specialization B from the analyzed TU or the underlying template, will make A no longer compile. The same goes for specializations in headers that are not included, and also specializations that are: ```c++ template <typename T> void instantiatedTemplateSpecialization(T NoSpecS) {} template <> void instantiatedTemplateSpecialization<ExpensiveToCopyType>( ExpensiveToCopyType SpecS) { // CHECK-MESSAGES: [[@LINE-1]]:25: warning: the parameter 'SpecS' // When updating a template specialization, we also update the main template. // CHECK-FIXES: const T& NoSpecS // CHECK-FIXES: const ExpensiveToCopyType& SpecS // CHECK-FIXES: const int& SpecS <- fails, no fix generated it seems } template <> void instantiatedTemplateSpecialization<int>( int SpecS) { } ``` https://github.com/llvm/llvm-project/pull/97767 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits