1 | // RUN: %check_clang_tidy %s readability-avoid-const-params-in-decls %t |
2 | |
3 | using alias_type = bool; |
4 | using alias_const_type = const bool; |
5 | |
6 | |
7 | void F1(const int i); |
8 | // 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] |
9 | // CHECK-FIXES: void F1(int i); |
10 | |
11 | void F2(const int *const i); |
12 | // CHECK-MESSAGES: :[[@LINE-1]]:20: warning: parameter 'i' is const-qualified |
13 | // CHECK-FIXES: void F2(const int *i); |
14 | |
15 | void F3(int const i); |
16 | // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: parameter 'i' is const-qualified |
17 | // CHECK-FIXES: void F3(int i); |
18 | |
19 | void F4(alias_type const i); |
20 | // CHECK-MESSAGES: :[[@LINE-1]]:20: warning: parameter 'i' is const-qualified |
21 | // CHECK-FIXES: void F4(alias_type i); |
22 | |
23 | void F5(const int); |
24 | // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: parameter 1 is const-qualified |
25 | // CHECK-FIXES: void F5(int); |
26 | |
27 | void F6(const int *const); |
28 | // CHECK-MESSAGES: :[[@LINE-1]]:20: warning: parameter 1 is const-qualified |
29 | // CHECK-FIXES: void F6(const int *); |
30 | |
31 | void F7(int, const int); |
32 | // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: parameter 2 is const-qualified |
33 | // CHECK-FIXES: void F7(int, int); |
34 | |
35 | void F8(const int, const int); |
36 | // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: parameter 1 is const-qualified |
37 | // CHECK-MESSAGES: :[[@LINE-2]]:20: warning: parameter 2 is const-qualified |
38 | // CHECK-FIXES: void F8(int, int); |
39 | |
40 | void F9(const int long_name); |
41 | // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: parameter 'long_name' |
42 | // CHECK-FIXES: void F9(int long_name); |
43 | |
44 | void F10(const int *const *const long_name); |
45 | // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: parameter 'long_name' |
46 | // CHECK-FIXES: void F10(const int *const *long_name); |
47 | |
48 | void F11(const unsigned int /*v*/); |
49 | // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: parameter 1 |
50 | // CHECK-FIXES: void F11(unsigned int /*v*/); |
51 | |
52 | void F12(const bool b = true); |
53 | // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: parameter 'b' |
54 | // CHECK-FIXES: void F12(bool b = true); |
55 | |
56 | template<class T> |
57 | int F13(const bool b = true); |
58 | // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: parameter 'b' |
59 | // CHECK-FIXES: int F13(bool b = true); |
60 | int f13 = F13<int>(); |
61 | |
62 | template <typename T> |
63 | struct A {}; |
64 | |
65 | void F14(const A<const int>); |
66 | // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: parameter 1 is const-qualified |
67 | // CHECK-FIXES: void F14(A<const int>); |
68 | |
69 | void F15(const A<const int> Named); |
70 | // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: parameter 'Named' is const-qualified |
71 | // CHECK-FIXES: void F15(A<const int> Named); |
72 | |
73 | void F16(const A<const int> *const); |
74 | // CHECK-MESSAGES: :[[@LINE-1]]:30: warning: parameter 1 is const-qualified |
75 | // CHECK-FIXES: void F16(const A<const int> *); |
76 | |
77 | void F17(const A<const int> *const Named); |
78 | // CHECK-MESSAGES: :[[@LINE-1]]:30: warning: parameter 'Named' is const-qualified |
79 | // CHECK-FIXES: void F17(const A<const int> *Named); |
80 | |
81 | struct Foo { |
82 | Foo(const int i); |
83 | // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: parameter 'i' |
84 | // CHECK-FIXES: Foo(int i); |
85 | |
86 | void operator()(const int i); |
87 | // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: parameter 'i' |
88 | // CHECK-FIXES: void operator()(int i); |
89 | }; |
90 | |
91 | template <class T> |
92 | struct { |
93 | (const int i); |
94 | // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: parameter 'i' |
95 | // CHECK-FIXES: FooT(int i); |
96 | |
97 | void (const int i); |
98 | // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: parameter 'i' |
99 | // CHECK-FIXES: void operator()(int i); |
100 | }; |
101 | FooT<int> f(1); |
102 | |
103 | template <class T> |
104 | struct BingT { |
105 | BingT(const T i); |
106 | // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: parameter 'i' |
107 | // CHECK-FIXES: BingT(T i); |
108 | |
109 | void operator()(const T i); |
110 | // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: parameter 'i' |
111 | // CHECK-FIXES: void operator()(T i); |
112 | }; |
113 | BingT<int> f2(1); |
114 | |
115 | template <class T> |
116 | struct NeverInstantiatedT { |
117 | NeverInstantiatedT(const T i); |
118 | // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: parameter 'i' |
119 | // CHECK-FIXES: NeverInstantiatedT(T i); |
120 | |
121 | void operator()(const T i); |
122 | // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: parameter 'i' |
123 | // CHECK-FIXES: void operator()(T i); |
124 | }; |
125 | |
126 | // Do not match on definitions |
127 | void NF1(const int i) {} |
128 | void NF2(const int *const i) {} |
129 | void NF3(int const i) {} |
130 | void NF4(alias_type const i) {} |
131 | void NF5(const int) {} |
132 | void NF6(const int *const) {} |
133 | void NF7(int, const int) {} |
134 | void NF8(const int, const int) {} |
135 | template <class T> |
136 | int NF9(const int, const int) { return 0; } |
137 | int nf9 = NF9<int>(1, 2); |
138 | |
139 | // Do not match on inline member functions |
140 | struct Bar { |
141 | Bar(const int i) {} |
142 | |
143 | void operator()(const int i) {} |
144 | }; |
145 | |
146 | // Do not match on inline member functions of a templated class |
147 | template <class T> |
148 | struct BarT { |
149 | BarT(const int i) {} |
150 | |
151 | void operator()(const int i) {} |
152 | }; |
153 | BarT<int> b(1); |
154 | template <class T> |
155 | struct BatT { |
156 | BatT(const T i) {} |
157 | |
158 | void operator()(const T i) {} |
159 | }; |
160 | BatT<int> b2(1); |
161 | |
162 | // Do not match on other stuff |
163 | void NF(const alias_type& i); |
164 | void NF(const int &i); |
165 | void NF(const int *i); |
166 | void NF(alias_const_type i); |
167 | void NF(const alias_type&); |
168 | void NF(const int&); |
169 | void NF(const int*); |
170 | void NF(const int* const*); |
171 | void NF(alias_const_type); |
172 | |
173 | // Regression tests involving macros, which are ignored by default. |
174 | #define CONCAT(a, b) a##b |
175 | void ConstNotVisible(CONCAT(cons, t) int i); |
176 | |
177 | #define CONST_INT_PARAM const int i |
178 | void ConstInMacro(CONST_INT_PARAM); |
179 | |
180 | #define DECLARE_FUNCTION_WITH_ARG(x) struct InsideMacro{ x } |
181 | DECLARE_FUNCTION_WITH_ARG( |
182 | void member_function(const int i); |
183 | ); |
184 | |
185 | // Regression test. We should not warn (or crash) on lambda expressions |
186 | auto lambda_with_name = [](const int n) {}; |
187 | auto lambda_without_name = [](const int) {}; |
188 | |