blob: b0bdeae78bb3bfc50eef2fef9b1c7ec93ca5fddd [file] [log] [blame]
Alexander Kornienkoc3ceb272015-10-28 01:36:20 +00001// RUN: %check_clang_tidy %s modernize-redundant-void-arg %t
2
Benjamin Kramere18da832015-10-28 05:16:37 +00003#define NULL 0
Alexander Kornienkoc3ceb272015-10-28 01:36:20 +00004
5int foo();
6
7void bar();
8
9void bar2();
10
11extern "C" void ecfoo(void);
12
13extern "C" void ecfoo(void) {
14}
15
16extern int i;
17
18int j = 1;
19
20int foo(void) {
21// CHECK-MESSAGES: :[[@LINE-1]]:9: warning: redundant void argument list in function definition [modernize-redundant-void-arg]
22// CHECK-FIXES: {{^}}int foo() {{{$}}
23 return 0;
24}
25
26typedef unsigned int my_uint;
27
28typedef void my_void;
29
30// A function taking void and returning a pointer to function taking void
31// and returning int.
32int (*returns_fn_void_int(void))(void);
33// CHECK-MESSAGES: :[[@LINE-1]]:27: warning: {{.*}} in function declaration
34// CHECK-MESSAGES: :[[@LINE-2]]:34: warning: {{.*}} in function declaration
35// CHECK-FIXES: {{^}}int (*returns_fn_void_int())();{{$}}
36
37typedef int (*returns_fn_void_int_t(void))(void);
38// CHECK-MESSAGES: :[[@LINE-1]]:37: warning: {{.*}} in typedef
39// CHECK-MESSAGES: :[[@LINE-2]]:44: warning: {{.*}} in typedef
40// CHECK-FIXES: {{^}}typedef int (*returns_fn_void_int_t())();{{$}}
41
42int (*returns_fn_void_int(void))(void) {
43// CHECK-MESSAGES: :[[@LINE-1]]:27: warning: {{.*}} in function definition
44// CHECK-MESSAGES: :[[@LINE-2]]:34: warning: {{.*}} in function definition
45// CHECK-FIXES: {{^}}int (*returns_fn_void_int())() {{{$}}
46 return nullptr;
47}
48
49// A function taking void and returning a pointer to a function taking void
50// and returning a pointer to a function taking void and returning void.
51void (*(*returns_fn_returns_fn_void_void(void))(void))(void);
52// CHECK-MESSAGES: :[[@LINE-1]]:42: warning: {{.*}} in function declaration
53// CHECK-MESSAGES: :[[@LINE-2]]:49: warning: {{.*}} in function declaration
54// CHECK-MESSAGES: :[[@LINE-3]]:56: warning: {{.*}} in function declaration
55// CHECK-FIXES: {{^}}void (*(*returns_fn_returns_fn_void_void())())();{{$}}
56
57typedef void (*(*returns_fn_returns_fn_void_void_t(void))(void))(void);
58// CHECK-MESSAGES: :[[@LINE-1]]:52: warning: {{.*}} in typedef
59// CHECK-MESSAGES: :[[@LINE-2]]:59: warning: {{.*}} in typedef
60// CHECK-MESSAGES: :[[@LINE-3]]:66: warning: {{.*}} in typedef
61// CHECK-FIXES: {{^}}typedef void (*(*returns_fn_returns_fn_void_void_t())())();{{$}}
62
63void (*(*returns_fn_returns_fn_void_void(void))(void))(void) {
64// CHECK-MESSAGES: :[[@LINE-1]]:42: warning: {{.*}} in function definition
65// CHECK-MESSAGES: :[[@LINE-2]]:49: warning: {{.*}} in function definition
66// CHECK-MESSAGES: :[[@LINE-3]]:56: warning: {{.*}} in function definition
67// CHECK-FIXES: {{^}}void (*(*returns_fn_returns_fn_void_void())())() {{{$}}
68 return nullptr;
69}
70
71void bar(void) {
72// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: {{.*}} in function definition
73// CHECK-FIXES: {{^}}void bar() {{{$}}
74}
75
76void op_fn(int i) {
77}
78
79class gronk {
80public:
81 gronk();
82 ~gronk();
83
84 void foo();
85 void bar();
86 void bar2
87 ();
88 void operation(int i) { }
89
90private:
91 int m_i;
92 int *m_pi;
93 float m_f;
94 float *m_pf;
95 double m_d;
96 double *m_pd;
97
98 void (*f1)(void);
99 // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: {{.*}} in field declaration
100 // CHECK-FIXES: {{^ }}void (*f1)();{{$}}
101
102 void (*op)(int i);
103
104 void (gronk::*p1)(void);
105 // CHECK-MESSAGES: :[[@LINE-1]]:21: warning: {{.*}} in field declaration
106 // CHECK-FIXES: {{^ }}void (gronk::*p1)();{{$}}
107
108 int (gronk::*p_mi);
109
110 void (gronk::*p2)(int);
111
112 void (*(*returns_fn_returns_fn_void_void(void))(void))(void);
113 // CHECK-MESSAGES: :[[@LINE-1]]:44: warning: {{.*}} in function declaration
114 // CHECK-MESSAGES: :[[@LINE-2]]:51: warning: {{.*}} in function declaration
115 // CHECK-MESSAGES: :[[@LINE-3]]:58: warning: {{.*}} in function declaration
116 // CHECK-FIXES: {{^}} void (*(*returns_fn_returns_fn_void_void())())();{{$}}
117
118 void (*(*(gronk::*returns_fn_returns_fn_void_void_mem)(void))(void))(void);
119 // CHECK-MESSAGES: :[[@LINE-1]]:58: warning: {{.*}} in field declaration
120 // CHECK-MESSAGES: :[[@LINE-2]]:65: warning: {{.*}} in field declaration
121 // CHECK-MESSAGES: :[[@LINE-3]]:72: warning: {{.*}} in field declaration
122 // CHECK-FIXES: {{^}} void (*(*(gronk::*returns_fn_returns_fn_void_void_mem)())())();{{$}}
123};
124
125int i;
126int *pi;
127void *pv = (void *) pi;
128float f;
129float *fi;
130double d;
131double *pd;
132
133void (*f1)(void);
134// CHECK-MESSAGES: :[[@LINE-1]]:12: warning: {{.*}} in variable declaration
135// CHECK-FIXES: {{^}}void (*f1)();{{$}}
136
137void (*f2)(void) = nullptr;
138// CHECK-MESSAGES: :[[@LINE-1]]:12: warning: {{.*}} in variable declaration with initializer
139// CHECK-FIXES: {{^}}void (*f2)() = nullptr;{{$}}
140
141void (*f2b)(void)(nullptr);
142// CHECK-MESSAGES: :[[@LINE-1]]:13: warning: {{.*}} in variable declaration with initializer
143// CHECK-FIXES: {{^}}void (*f2b)()(nullptr);{{$}}
144
145void (*f2c)(void){nullptr};
146// CHECK-MESSAGES: :[[@LINE-1]]:13: warning: {{.*}} in variable declaration with initializer
147// CHECK-FIXES: {{^}}void (*f2c)(){nullptr};{{$}}
148
149void (*f2d)(void) = NULL;
150// CHECK-MESSAGES: :[[@LINE-1]]:13: warning: {{.*}} in variable declaration with initializer
151// CHECK-FIXES: {{^}}void (*f2d)() = NULL;{{$}}
152
153void (*f2e)(void)(NULL);
154// CHECK-MESSAGES: :[[@LINE-1]]:13: warning: {{.*}} in variable declaration with initializer
155// CHECK-FIXES: {{^}}void (*f2e)()(NULL);{{$}}
156
157void (*f2f)(void){NULL};
158// CHECK-MESSAGES: :[[@LINE-1]]:13: warning: {{.*}} in variable declaration with initializer
159// CHECK-FIXES: {{^}}void (*f2f)(){NULL};{{$}}
160
161void (*f3)(void) = bar;
162// CHECK-MESSAGES: :[[@LINE-1]]:12: warning: {{.*}} in variable declaration with initializer
163// CHECK-FIXES: {{^}}void (*f3)() = bar;{{$}}
164
165void (*o1)(int i);
166void (*o2)(int i) = nullptr;
167void (*o3)(int i)(nullptr);
168void (*o4)(int i){nullptr};
169void (*o5)(int i) = NULL;
170void (*o6)(int i)(NULL);
171void (*o7)(int i){NULL};
172void (*o8)(int i) = op_fn;
173
174void (*fa)();
175
176void (*fb)() = nullptr;
177
178void (*fc)() = bar;
179
180typedef void (function_ptr)(void);
181// CHECK-MESSAGES: :[[@LINE-1]]:29: warning: {{.*}} in typedef
182// CHECK-FIXES: {{^}}typedef void (function_ptr)();{{$}}
183
184// intentionally not LLVM style to check preservation of whitesapce
185typedef void (function_ptr2)
186 (
187 void
188 );
189// CHECK-MESSAGES: :[[@LINE-2]]:9: warning: {{.*}} in typedef
190// CHECK-FIXES: {{^typedef void \(function_ptr2\)$}}
191// CHECK-FIXES-NEXT: {{^ \($}}
192// CHECK-FIXES-NEXT: {{^ $}}
193// CHECK-FIXES-NEXT: {{^ \);$}}
194
195// intentionally not LLVM style to check preservation of whitesapce
196typedef
197void
198(
199*
200(
201*
202returns_fn_returns_fn_void_void_t2
203(
204void
205)
206)
207(
208void
209)
210)
211(
212void
213)
214;
215// CHECK-MESSAGES: :[[@LINE-11]]:1: warning: {{.*}} in typedef
216// CHECK-MESSAGES: :[[@LINE-8]]:1: warning: {{.*}} in typedef
217// CHECK-MESSAGES: :[[@LINE-5]]:1: warning: {{.*}} in typedef
218// CHECK-FIXES: {{^typedef$}}
219// CHECK-FIXES-NEXT: {{^void$}}
220// CHECK-FIXES-NEXT: {{^\($}}
221// CHECK-FIXES-NEXT: {{^\*$}}
222// CHECK-FIXES-NEXT: {{^\($}}
223// CHECK-FIXES-NEXT: {{^\*$}}
224// CHECK-FIXES-NEXT: {{^returns_fn_returns_fn_void_void_t2$}}
225// CHECK-FIXES-NEXT: {{^\($}}
226// CHECK-FIXES-NOT: {{[^ ]}}
227// CHECK-FIXES: {{^\)$}}
228// CHECK-FIXES-NEXT: {{^\)$}}
229// CHECK-FIXES-NEXT: {{^\($}}
230// CHECK-FIXES-NOT: {{[^ ]}}
231// CHECK-FIXES: {{^\)$}}
232// CHECK-FIXES-NEXT: {{^\)$}}
233// CHECK-FIXES-NEXT: {{^\($}}
234// CHECK-FIXES-NOT: {{[^ ]}}
235// CHECK-FIXES: {{^\)$}}
236// CHECK-FIXES-NEXT: {{^;$}}
237
238
239void (gronk::*p1)(void);
240// CHECK-MESSAGES: :[[@LINE-1]]:19: warning: {{.*}} in variable declaration
241// CHECK-FIXES: {{^}}void (gronk::*p1)();{{$}}
242
243void (gronk::*p2)(void) = &gronk::foo;
244// CHECK-MESSAGES: :[[@LINE-1]]:19: warning: {{.*}} in variable declaration with initializer
245// CHECK-FIXES: {{^}}void (gronk::*p2)() = &gronk::foo;{{$}}
246
247typedef void (gronk::*member_function_ptr)(void);
248// CHECK-MESSAGES: :[[@LINE-1]]:44: warning: {{.*}} in typedef
249// CHECK-FIXES: {{^}}typedef void (gronk::*member_function_ptr)();{{$}}
250
251// intentionally not LLVM style to check preservation of whitesapce
252typedef void (gronk::*member_function_ptr2)
253 (
254 void
255 );
256// CHECK-MESSAGES: :[[@LINE-2]]:9: warning: {{.*}} in typedef
257// CHECK-FIXES: {{^typedef void \(gronk::\*member_function_ptr2\)$}}
258// CHECK-FIXES-NEXT: {{^ \($}}
259// CHECK-FIXES-NEXT: {{^ $}}
260// CHECK-FIXES-NEXT: {{^ \);$}}
261
262void gronk::foo() {
263 void (*f1)(void) = &::bar;
264 // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: {{.*}} in variable declaration with initializer
265 // CHECK-FIXES: {{^ }}void (*f1)() = &::bar;{{$}}
266
267 void (*f2)(void);
268 // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: {{.*}} in variable declaration
269 // CHECK-FIXES: {{^ }}void (*f2)();{{$}}
270
271 // intentionally not LLVM style to check preservation of whitesapce
272 void (*f3)
273 (
274 void
275 );
276 // CHECK-MESSAGES: :[[@LINE-2]]:11: warning: {{.*}} in variable declaration
277 // CHECK-FIXES: {{^ }}void (*f3){{$}}
278 // CHECK-FIXES-NEXT: {{^ \($}}
279 // CHECK-FIXES-NEXT: {{^ $}}
280 // CHECK-FIXES-NEXT: {{^ \);$}}
281}
282
283void gronk::bar(void) {
284// CHECK-MESSAGES: :[[@LINE-1]]:17: warning: {{.*}} in function definition
285// CHECK-FIXES: {{^}}void gronk::bar() {{{$}}
286 void (gronk::*p3)(void) = &gronk::foo;
287 // CHECK-MESSAGES: :[[@LINE-1]]:21: warning: {{.*}} in variable declaration with initializer
288 // CHECK-FIXES: {{^ }}void (gronk::*p3)() = &gronk::foo;{{$}}
289
290 void (gronk::*p4)(void);
291 // CHECK-MESSAGES: :[[@LINE-1]]:21: warning: {{.*}} in variable declaration
292 // CHECK-FIXES: {{^ }}void (gronk::*p4)();{{$}}
293
294 // intentionally not LLVM style to check preservation of whitesapce
295 void (gronk::*p5)
296 (
297 void
298 );
299 // CHECK-MESSAGES: :[[@LINE-2]]:11: warning: {{.*}} in variable declaration
300 // CHECK-FIXES: {{^ }}void (gronk::*p5){{$}}
301 // CHECK-FIXES-NEXT: {{^ \($}}
302 // CHECK-FIXES-NExT: {{^ $}}
303 // CHECK-FIXES-NExT: {{^ \);$}}
304}
305
306// intentionally not LLVM style to check preservation of whitesapce
307void gronk::bar2
308 (
309 void
310 )
311// CHECK-MESSAGES: :[[@LINE-2]]:3: warning: {{.*}} in function definition
312// CHECK-FIXES: {{^void gronk::bar2$}}
313// CHECK-FIXES-NEXT: {{^ \($}}
314// CHECK-FIXES-NEXT: {{^ $}}
315// CHECK-FIXES-NEXT: {{^ \)$}}
316{
317}
318
319gronk::gronk(void)
320// CHECK-MESSAGES: :[[@LINE-1]]:14: warning: {{.*}} in function definition
321// CHECK-FIXES: {{^}}gronk::gronk(){{$}}
322 : f1(nullptr),
323 p1(nullptr) {
324}
325
326gronk::~gronk(void) {
327// CHECK-MESSAGES: :[[@LINE-1]]:15: warning: {{.*}} in function definition
328// CHECK-FIXES: {{^}}gronk::~gronk() {{{$}}
329}
330
331class nutter {
332public:
333 nutter();
334};
335
336nutter::nutter(void) {
337// CHECK-MESSAGES: :[[@LINE-1]]:16: warning: {{.*}} in function definition
338// CHECK-FIXES: {{^}}nutter::nutter() {{{$}}
339 void (*f3)(void) = static_cast<void (*)(void)>(0);
340 // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: {{.*}} in variable declaration with initializer
341 // CHECK-MESSAGES: :[[@LINE-2]]:43: warning: {{.*}} in named cast
342 // CHECK-FIXES: void (*f3)() = static_cast<void (*)()>(0);{{$}}
343
344 void (*f4)(void) = (void (*)(void)) 0;
345 // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: {{.*}} in variable declaration with initializer
346 // CHECK-MESSAGES: :[[@LINE-2]]:32: warning: {{.*}} in cast expression
347 // CHECK-FIXES: void (*f4)() = (void (*)()) 0;{{$}}
348
349 void (*f5)(void) = reinterpret_cast<void (*)(void)>(0);
350 // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: {{.*}} in variable declaration with initializer
351 // CHECK-MESSAGES: :[[@LINE-2]]:48: warning: {{.*}} in named cast
352 // CHECK-FIXES: void (*f5)() = reinterpret_cast<void (*)()>(0);{{$}}
353
354 // intentionally not LLVM style to check preservation of whitesapce
355 void (*f6)(void) = static_cast<void (*)
356 (
357 void
358 )>(0);
359 // CHECK-MESSAGES: :[[@LINE-4]]:14: warning: {{.*}} in variable declaration with initializer
360 // CHECK-MESSAGES: :[[@LINE-3]]:11: warning: {{.*}} in named cast
361 // CHECK-FIXES: {{^ }}void (*f6)() = static_cast<void (*){{$}}
362 // CHECK-FIXES-NEXT: {{^ \($}}
363 // CHECK-FIXES-NEXT: {{^ $}}
364 // CHECK-FIXES-NEXT: {{^ }})>(0);{{$}}
365
366 // intentionally not LLVM style to check preservation of whitesapce
367 void (*f7)(void) = (void (*)
368 (
369 void
370 )) 0;
371 // CHECK-MESSAGES: :[[@LINE-4]]:14: warning: {{.*}} in variable declaration with initializer
372 // CHECK-MESSAGES: :[[@LINE-3]]:11: warning: {{.*}} in cast expression
373 // CHECK-FIXES: {{^ }}void (*f7)() = (void (*){{$}}
374 // CHECK-FIXES-NEXT: {{^ \($}}
375 // CHECK-FIXES-NEXT: {{^ $}}
376 // CHECK-FIXES-NEXT: {{^ \)\) 0;$}}
377
378 // intentionally not LLVM style to check preservation of whitesapce
379 void (*f8)(void) = reinterpret_cast<void (*)
380 (
381 void
382 )>(0);
383 // CHECK-MESSAGES: :[[@LINE-4]]:14: warning: {{.*}} in variable declaration with initializer
384 // CHECK-MESSAGES: :[[@LINE-3]]:11: warning: {{.*}} in named cast
385 // CHECK-FIXES: {{^ }}void (*f8)() = reinterpret_cast<void (*){{$}}
386 // CHECK-FIXES-NEXT: {{^ \($}}
387 // CHECK-FIXES-NEXT: {{^ $}}
388 // CHECK-FIXES-NEXT: {{^ \)>\(0\);$}}
389
390 void (*o1)(int) = static_cast<void (*)(int)>(0);
391 void (*o2)(int) = (void (*)(int)) 0;
392 void (*o3)(int) = reinterpret_cast<void (*)(int)>(0);
393}
394
395class generator {
396public:
397 int operator()(void) { return 1; }
398 // CHECK-MESSAGES: :[[@LINE-1]]:18: warning: {{.*}} in function definition
399 // CHECK-FIXES: {{^ }}int operator()() { return 1; }{{$}}
400};
401
402void test_lambda_functions() {
403 auto lamb_duh = [](void (*fn)(void)) { (*fn)(); };
404 // CHECK-MESSAGES: :[[@LINE-1]]:33: warning: {{.*}} in variable declaration
405 // CHECK-FIXES: {{^ }}auto lamb_duh = [](void (*fn)()) { (*fn)(); };{{$}}
406
407 auto lambda_generator = [](void) { return 1; };
408 // CHECK-MESSAGES: :[[@LINE-1]]:30: warning: {{.*}} in lambda expression
409 // CHECK-FIXES: {{^ }}auto lambda_generator = []() { return 1; };{{$}}
410
411 auto gen2 = []() { return 1; };
412
413 auto gen3 = []{ return 1; };
414
415 auto void_returner = [](void) -> void (*)(void) { return f1; };
416 // CHECK-MESSAGES: [[@LINE-1]]:27: warning: {{.*}} in lambda expression
417 // CHECK-MESSAGES: [[@LINE-2]]:45: warning: {{.*}} in lambda expression
418 // CHECK-FIXES: {{^ }}auto void_returner = []() -> void (*)() { return f1; };{{$}}
419}
Angel Garcia Gomezdd4ed3a2015-11-02 11:39:17 +0000420
421#define M(x) x
422
423M(void inmacro(void) {})
424// CHECK-MESSAGES: :[[@LINE-1]]:16: warning: {{.*}} in function definition
425// CHECK-FIXES: M(void inmacro() {})
426
427#define F(A, B) \
428 struct F_##A##_##B { \
429 F_##A##_##B(void); \
430 }; \
431 F_##A##_##B::F_##A##_##B(void)
432
433F(Foo, Bar) {
434
435}