Index: clang-tidy/readability/AvoidConstParamsInDecls.cpp =================================================================== --- clang-tidy/readability/AvoidConstParamsInDecls.cpp +++ clang-tidy/readability/AvoidConstParamsInDecls.cpp @@ -36,7 +36,12 @@ functionDecl(unless(isDefinition()), // Lambdas are always their own definition, but they // generate a non-definition FunctionDecl too. Ignore those. - unless(cxxMethodDecl(ofClass(cxxRecordDecl(isLambda())))), + // Class template instantiations have a non-definition + // CXXMethodDecl for methods that aren't used in this + // translation unit. Ignore those, as the template will have + // already been checked. + unless(cxxMethodDecl(ofClass(cxxRecordDecl(anyOf( + isLambda(), ast_matchers::isTemplateInstantiation()))))), has(typeLoc(forEach(ConstParamDecl)))) .bind("func"), this); Index: test/clang-tidy/readability-avoid-const-params-in-decls.cpp =================================================================== --- test/clang-tidy/readability-avoid-const-params-in-decls.cpp +++ test/clang-tidy/readability-avoid-const-params-in-decls.cpp @@ -53,6 +53,12 @@ // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: parameter 'b' // CHECK-FIXES: void F12(bool b = true); +template +int F13(const bool b = true); +// CHECK-MESSAGES: :[[@LINE-1]]:9: warning: parameter 'b' +// CHECK-FIXES: int F13(bool b = true); +int f13 = F13(); + struct Foo { Foo(const int i); // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: parameter 'i' @@ -63,6 +69,18 @@ // CHECK-FIXES: void operator()(int i); }; +template +struct FooT { + FooT(const int i); + // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: parameter 'i' + // CHECK-FIXES: FooT(int i); + + void operator()(const int i); + // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: parameter 'i' + // CHECK-FIXES: void operator()(int i); +}; +FooT f(1); + // Do not match on definitions void NF1(const int i) {} void NF2(const int *const i) {} @@ -72,6 +90,25 @@ void NF6(const int *const) {} void NF7(int, const int) {} void NF8(const int, const int) {} +template +int NF9(const int, const int) { return 0; } +int nf9 = NF9(1, 2); + +// Do not match on inline member functions +struct Bar { + Bar(const int i) {} + + void operator()(const int i) {} +}; + +// Do not match on inline member functions of a templated class +template +struct BarT { + BarT(const int i) {} + + void operator()(const int i) {} +}; +BarT b(1); // Do not match on other stuff void NF(const alias_type& i);