| // RUN: %check_clang_tidy %s readability-avoid-const-params-in-decls %t | 
 |  | 
 | using alias_type = bool; | 
 | using alias_const_type = const bool; | 
 |  | 
 |  | 
 | void F1(const int i); | 
 | // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: parameter 'i' is const-qualified in the function declaration; const-qualification of parameters only has an effect in function definitions [readability-avoid-const-params-in-decls] | 
 | // CHECK-FIXES: void F1(int i); | 
 |  | 
 | void F2(const int *const i); | 
 | // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: parameter 'i' is const-qualified | 
 | // CHECK-FIXES: void F2(const int *i); | 
 |  | 
 | void F3(int const i); | 
 | // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: parameter 'i' is const-qualified | 
 | // CHECK-FIXES: void F3(int i); | 
 |  | 
 | void F4(alias_type const i); | 
 | // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: parameter 'i' is const-qualified | 
 | // CHECK-FIXES: void F4(alias_type i); | 
 |  | 
 | void F5(const int); | 
 | // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: parameter 1 is const-qualified | 
 | // CHECK-FIXES: void F5(int); | 
 |  | 
 | void F6(const int *const); | 
 | // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: parameter 1 is const-qualified | 
 | // CHECK-FIXES: void F6(const int *); | 
 |  | 
 | void F7(int, const int); | 
 | // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: parameter 2 is const-qualified | 
 | // CHECK-FIXES: void F7(int, int); | 
 |  | 
 | void F8(const int, const int); | 
 | // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: parameter 1 is const-qualified | 
 | // CHECK-MESSAGES: :[[@LINE-2]]:20: warning: parameter 2 is const-qualified | 
 | // CHECK-FIXES: void F8(int, int); | 
 |  | 
 | void F9(const int long_name); | 
 | // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: parameter 'long_name' | 
 | // CHECK-FIXES: void F9(int long_name); | 
 |  | 
 | void F10(const int *const *const long_name); | 
 | // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: parameter 'long_name' | 
 | // CHECK-FIXES: void F10(const int *const *long_name); | 
 |  | 
 | void F11(const unsigned int /*v*/); | 
 | // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: parameter 1 | 
 | // CHECK-FIXES: void F11(unsigned int /*v*/); | 
 |  | 
 | 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' | 
 |   // CHECK-FIXES: Foo(int i); | 
 |  | 
 |   void operator()(const int i); | 
 |   // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: parameter 'i' | 
 |   // 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) {} | 
 | void NF3(int const i) {} | 
 | void NF4(alias_type const i) {} | 
 | 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); | 
 | void NF(const int &i); | 
 | void NF(const int *i); | 
 | void NF(alias_const_type i); | 
 | void NF(const alias_type&); | 
 | void NF(const int&); | 
 | void NF(const int*); | 
 | void NF(const int* const*); | 
 | void NF(alias_const_type); | 
 |  | 
 | // Regression test for when the 'const' token is not in the code. | 
 | #define CONCAT(a, b) a##b | 
 | void ConstNotVisible(CONCAT(cons, t) int i); | 
 | // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: parameter 'i' | 
 | // We warn, but we can't give a fix | 
 | // CHECK-FIXES: void ConstNotVisible(CONCAT(cons, t) int i); | 
 |  | 
 | // Regression test. We should not warn (or crash) on lambda expressions | 
 | auto lambda_with_name = [](const int n) {}; | 
 | auto lambda_without_name = [](const int) {}; |