Skip to content

Commit

Permalink
[clang-tidy] readability-avoid-const-params-in-decls template instant…
Browse files Browse the repository at this point in the history
…iation bugfix

Summary: Bugfix for 30398.  Don't warn for template instantiations

Reviewers: aaron.ballman, hokein, alexfh

Subscribers: omtcyfz, cfe-commits

Differential Revision: https://reviews.llvm.org/D24652

llvm-svn: 283873
  • Loading branch information
pepsiman committed Oct 11, 2016
1 parent 8acba11 commit 8cb9b02
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 1 deletion.
Expand Up @@ -36,7 +36,12 @@ void AvoidConstParamsInDecls::registerMatchers(MatchFinder *Finder) {
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);
Expand Down
Expand Up @@ -53,6 +53,12 @@ void F12(const bool b = true);
// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: parameter 'b'
// CHECK-FIXES: void F12(bool b = true);

template<class T>
int F13(const bool b = true);
// CHECK-MESSAGES: :[[@LINE-1]]:9: warning: parameter 'b'
// CHECK-FIXES: int F13(bool b = true);
int f13 = F13<int>();

struct Foo {
Foo(const int i);
// CHECK-MESSAGES: :[[@LINE-1]]:7: warning: parameter 'i'
Expand All @@ -63,6 +69,18 @@ struct Foo {
// CHECK-FIXES: void operator()(int i);
};

template <class T>
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<int> f(1);

// Do not match on definitions
void NF1(const int i) {}
void NF2(const int *const i) {}
Expand All @@ -72,6 +90,25 @@ void NF5(const int) {}
void NF6(const int *const) {}
void NF7(int, const int) {}
void NF8(const int, const int) {}
template <class T>
int NF9(const int, const int) { return 0; }
int nf9 = NF9<int>(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 <class T>
struct BarT {
BarT(const int i) {}

void operator()(const int i) {}
};
BarT<int> b(1);

// Do not match on other stuff
void NF(const alias_type& i);
Expand Down

0 comments on commit 8cb9b02

Please sign in to comment.