2016-03-30 19:31:33 +08:00
// 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
2016-04-12 13:45:13 +08:00
// CHECK-FIXES: void F2(const int *i);
2016-03-30 19:31:33 +08:00
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
2016-04-12 13:45:13 +08:00
// CHECK-FIXES: void F6(const int *);
2016-03-30 19:31:33 +08:00
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'
2016-04-12 13:45:13 +08:00
// CHECK-FIXES: void F10(const int *const *long_name);
2016-03-30 19:31:33 +08:00
2016-04-12 13:45:13 +08:00
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);
2016-03-30 19:31:33 +08:00
2016-10-11 20:02:16 +08:00
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 > ( ) ;
2016-03-30 19:31:33 +08:00
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);
} ;
2016-10-11 20:02:16 +08:00
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 ) ;
2016-03-30 19:31:33 +08:00
// 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 ) { }
2016-10-11 20:02:16 +08:00
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 ) ;
2016-03-30 19:31:33 +08:00
// 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 ) ;
2016-06-02 04:37:23 +08:00
// 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);
2016-06-28 22:19:41 +08:00
// Regression test. We should not warn (or crash) on lambda expressions
auto lambda_with_name = [ ] ( const int n ) { } ;
auto lambda_without_name = [ ] ( const int ) { } ;