1*89a1d03eSRichard // RUN: %check_clang_tidy %s modernize-redundant-void-arg %t
2*89a1d03eSRichard
3*89a1d03eSRichard #define NULL 0
4*89a1d03eSRichard
5*89a1d03eSRichard int foo();
6*89a1d03eSRichard
7*89a1d03eSRichard void bar();
8*89a1d03eSRichard
9*89a1d03eSRichard void bar2();
10*89a1d03eSRichard
11*89a1d03eSRichard extern "C" void ecfoo(void);
12*89a1d03eSRichard
ecfoo(void)13*89a1d03eSRichard extern "C" void ecfoo(void) {
14*89a1d03eSRichard }
15*89a1d03eSRichard
16*89a1d03eSRichard extern int i;
17*89a1d03eSRichard
18*89a1d03eSRichard int j = 1;
19*89a1d03eSRichard
foo(void)20*89a1d03eSRichard int foo(void) {
21*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: redundant void argument list in function definition [modernize-redundant-void-arg]
22*89a1d03eSRichard // CHECK-FIXES: {{^}}int foo() {{{$}}
23*89a1d03eSRichard return 0;
24*89a1d03eSRichard }
25*89a1d03eSRichard
26*89a1d03eSRichard typedef unsigned int my_uint;
27*89a1d03eSRichard
28*89a1d03eSRichard typedef void my_void;
29*89a1d03eSRichard
30*89a1d03eSRichard // A function taking void and returning a pointer to function taking void
31*89a1d03eSRichard // and returning int.
32*89a1d03eSRichard int (*returns_fn_void_int(void))(void);
33*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: {{.*}} in function declaration
34*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-2]]:34: warning: {{.*}} in function declaration
35*89a1d03eSRichard // CHECK-FIXES: {{^}}int (*returns_fn_void_int())();{{$}}
36*89a1d03eSRichard
37*89a1d03eSRichard typedef int (*returns_fn_void_int_t(void))(void);
38*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:37: warning: {{.*}} in typedef
39*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-2]]:44: warning: {{.*}} in typedef
40*89a1d03eSRichard // CHECK-FIXES: {{^}}typedef int (*returns_fn_void_int_t())();{{$}}
41*89a1d03eSRichard
42*89a1d03eSRichard // Should work for type aliases as well as typedef.
43*89a1d03eSRichard using returns_fn_void_int_t2 = int (*(void))(void);
44*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:39: warning: {{.*}} in type alias
45*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-2]]:46: warning: {{.*}} in type alias
46*89a1d03eSRichard // CHECK-FIXES: {{^}}using returns_fn_void_int_t2 = int (*())();{{$}}
47*89a1d03eSRichard
returns_fn_void_int(void)48*89a1d03eSRichard int (*returns_fn_void_int(void))(void) {
49*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: {{.*}} in function definition
50*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-2]]:34: warning: {{.*}} in function definition
51*89a1d03eSRichard // CHECK-FIXES: {{^}}int (*returns_fn_void_int())() {{{$}}
52*89a1d03eSRichard return nullptr;
53*89a1d03eSRichard }
54*89a1d03eSRichard
55*89a1d03eSRichard // A function taking void and returning a pointer to a function taking void
56*89a1d03eSRichard // and returning a pointer to a function taking void and returning void.
57*89a1d03eSRichard void (*(*returns_fn_returns_fn_void_void(void))(void))(void);
58*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:42: warning: {{.*}} in function declaration
59*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-2]]:49: warning: {{.*}} in function declaration
60*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-3]]:56: warning: {{.*}} in function declaration
61*89a1d03eSRichard // CHECK-FIXES: {{^}}void (*(*returns_fn_returns_fn_void_void())())();{{$}}
62*89a1d03eSRichard
63*89a1d03eSRichard typedef void (*(*returns_fn_returns_fn_void_void_t(void))(void))(void);
64*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:52: warning: {{.*}} in typedef
65*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-2]]:59: warning: {{.*}} in typedef
66*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-3]]:66: warning: {{.*}} in typedef
67*89a1d03eSRichard // CHECK-FIXES: {{^}}typedef void (*(*returns_fn_returns_fn_void_void_t())())();{{$}}
68*89a1d03eSRichard
returns_fn_returns_fn_void_void(void)69*89a1d03eSRichard void (*(*returns_fn_returns_fn_void_void(void))(void))(void) {
70*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:42: warning: {{.*}} in function definition
71*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-2]]:49: warning: {{.*}} in function definition
72*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-3]]:56: warning: {{.*}} in function definition
73*89a1d03eSRichard // CHECK-FIXES: {{^}}void (*(*returns_fn_returns_fn_void_void())())() {{{$}}
74*89a1d03eSRichard return nullptr;
75*89a1d03eSRichard }
76*89a1d03eSRichard
bar(void)77*89a1d03eSRichard void bar(void) {
78*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: {{.*}} in function definition
79*89a1d03eSRichard // CHECK-FIXES: {{^}}void bar() {{{$}}
80*89a1d03eSRichard }
81*89a1d03eSRichard
op_fn(int i)82*89a1d03eSRichard void op_fn(int i) {
83*89a1d03eSRichard }
84*89a1d03eSRichard
85*89a1d03eSRichard class gronk {
86*89a1d03eSRichard public:
87*89a1d03eSRichard gronk();
88*89a1d03eSRichard ~gronk();
89*89a1d03eSRichard
90*89a1d03eSRichard void foo();
91*89a1d03eSRichard void bar();
92*89a1d03eSRichard void bar2
93*89a1d03eSRichard ();
operation(int i)94*89a1d03eSRichard void operation(int i) { }
95*89a1d03eSRichard
96*89a1d03eSRichard private:
97*89a1d03eSRichard int m_i;
98*89a1d03eSRichard int *m_pi;
99*89a1d03eSRichard float m_f;
100*89a1d03eSRichard float *m_pf;
101*89a1d03eSRichard double m_d;
102*89a1d03eSRichard double *m_pd;
103*89a1d03eSRichard
104*89a1d03eSRichard void (*f1)(void);
105*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: {{.*}} in field declaration
106*89a1d03eSRichard // CHECK-FIXES: {{^ }}void (*f1)();{{$}}
107*89a1d03eSRichard
108*89a1d03eSRichard void (*op)(int i);
109*89a1d03eSRichard
110*89a1d03eSRichard void (gronk::*p1)(void);
111*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:21: warning: {{.*}} in field declaration
112*89a1d03eSRichard // CHECK-FIXES: {{^ }}void (gronk::*p1)();{{$}}
113*89a1d03eSRichard
114*89a1d03eSRichard int (gronk::*p_mi);
115*89a1d03eSRichard
116*89a1d03eSRichard void (gronk::*p2)(int);
117*89a1d03eSRichard
118*89a1d03eSRichard void (*(*returns_fn_returns_fn_void_void(void))(void))(void);
119*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:44: warning: {{.*}} in function declaration
120*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-2]]:51: warning: {{.*}} in function declaration
121*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-3]]:58: warning: {{.*}} in function declaration
122*89a1d03eSRichard // CHECK-FIXES: {{^}} void (*(*returns_fn_returns_fn_void_void())())();{{$}}
123*89a1d03eSRichard
124*89a1d03eSRichard void (*(*(gronk::*returns_fn_returns_fn_void_void_mem)(void))(void))(void);
125*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:58: warning: {{.*}} in field declaration
126*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-2]]:65: warning: {{.*}} in field declaration
127*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-3]]:72: warning: {{.*}} in field declaration
128*89a1d03eSRichard // CHECK-FIXES: {{^}} void (*(*(gronk::*returns_fn_returns_fn_void_void_mem)())())();{{$}}
129*89a1d03eSRichard };
130*89a1d03eSRichard
131*89a1d03eSRichard int i;
132*89a1d03eSRichard int *pi;
133*89a1d03eSRichard void *pv = (void *) pi;
134*89a1d03eSRichard float f;
135*89a1d03eSRichard float *fi;
136*89a1d03eSRichard double d;
137*89a1d03eSRichard double *pd;
138*89a1d03eSRichard
139*89a1d03eSRichard void (*f1)(void);
140*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: {{.*}} in variable declaration
141*89a1d03eSRichard // CHECK-FIXES: {{^}}void (*f1)();{{$}}
142*89a1d03eSRichard
143*89a1d03eSRichard void (*f2)(void) = nullptr;
144*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: {{.*}} in variable declaration with initializer
145*89a1d03eSRichard // CHECK-FIXES: {{^}}void (*f2)() = nullptr;{{$}}
146*89a1d03eSRichard
147*89a1d03eSRichard void (*f2b)(void)(nullptr);
148*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: {{.*}} in variable declaration with initializer
149*89a1d03eSRichard // CHECK-FIXES: {{^}}void (*f2b)()(nullptr);{{$}}
150*89a1d03eSRichard
151*89a1d03eSRichard void (*f2c)(void){nullptr};
152*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: {{.*}} in variable declaration with initializer
153*89a1d03eSRichard // CHECK-FIXES: {{^}}void (*f2c)(){nullptr};{{$}}
154*89a1d03eSRichard
155*89a1d03eSRichard void (*f2d)(void) = NULL;
156*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: {{.*}} in variable declaration with initializer
157*89a1d03eSRichard // CHECK-FIXES: {{^}}void (*f2d)() = NULL;{{$}}
158*89a1d03eSRichard
159*89a1d03eSRichard void (*f2e)(void)(NULL);
160*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: {{.*}} in variable declaration with initializer
161*89a1d03eSRichard // CHECK-FIXES: {{^}}void (*f2e)()(NULL);{{$}}
162*89a1d03eSRichard
163*89a1d03eSRichard void (*f2f)(void){NULL};
164*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: {{.*}} in variable declaration with initializer
165*89a1d03eSRichard // CHECK-FIXES: {{^}}void (*f2f)(){NULL};{{$}}
166*89a1d03eSRichard
167*89a1d03eSRichard void (*f3)(void) = bar;
168*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: {{.*}} in variable declaration with initializer
169*89a1d03eSRichard // CHECK-FIXES: {{^}}void (*f3)() = bar;{{$}}
170*89a1d03eSRichard
171*89a1d03eSRichard void (*o1)(int i);
172*89a1d03eSRichard void (*o2)(int i) = nullptr;
173*89a1d03eSRichard void (*o3)(int i)(nullptr);
174*89a1d03eSRichard void (*o4)(int i){nullptr};
175*89a1d03eSRichard void (*o5)(int i) = NULL;
176*89a1d03eSRichard void (*o6)(int i)(NULL);
177*89a1d03eSRichard void (*o7)(int i){NULL};
178*89a1d03eSRichard void (*o8)(int i) = op_fn;
179*89a1d03eSRichard
180*89a1d03eSRichard void (*fa)();
181*89a1d03eSRichard
182*89a1d03eSRichard void (*fb)() = nullptr;
183*89a1d03eSRichard
184*89a1d03eSRichard void (*fc)() = bar;
185*89a1d03eSRichard
186*89a1d03eSRichard typedef void (function_ptr)(void);
187*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:29: warning: {{.*}} in typedef
188*89a1d03eSRichard // CHECK-FIXES: {{^}}typedef void (function_ptr)();{{$}}
189*89a1d03eSRichard
190*89a1d03eSRichard // intentionally not LLVM style to check preservation of whitespace
191*89a1d03eSRichard typedef void (function_ptr2)
192*89a1d03eSRichard (
193*89a1d03eSRichard void
194*89a1d03eSRichard );
195*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-2]]:9: warning: {{.*}} in typedef
196*89a1d03eSRichard // CHECK-FIXES: {{^typedef void \(function_ptr2\)$}}
197*89a1d03eSRichard // CHECK-FIXES-NEXT: {{^ \($}}
198*89a1d03eSRichard // CHECK-FIXES-NEXT: {{^ $}}
199*89a1d03eSRichard // CHECK-FIXES-NEXT: {{^ \);$}}
200*89a1d03eSRichard
201*89a1d03eSRichard // intentionally not LLVM style to check preservation of whitespace
202*89a1d03eSRichard // clang-format off
203*89a1d03eSRichard typedef
204*89a1d03eSRichard void
205*89a1d03eSRichard (
206*89a1d03eSRichard *
207*89a1d03eSRichard (
208*89a1d03eSRichard *
209*89a1d03eSRichard returns_fn_returns_fn_void_void_t2
210*89a1d03eSRichard (
211*89a1d03eSRichard void
212*89a1d03eSRichard )
213*89a1d03eSRichard )
214*89a1d03eSRichard (
215*89a1d03eSRichard void
216*89a1d03eSRichard )
217*89a1d03eSRichard )
218*89a1d03eSRichard (
219*89a1d03eSRichard void
220*89a1d03eSRichard )
221*89a1d03eSRichard ;
222*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-11]]:1: warning: {{.*}} in typedef
223*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-8]]:1: warning: {{.*}} in typedef
224*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-5]]:1: warning: {{.*}} in typedef
225*89a1d03eSRichard // CHECK-FIXES: {{^typedef$}}
226*89a1d03eSRichard // CHECK-FIXES-NEXT: {{^void$}}
227*89a1d03eSRichard // CHECK-FIXES-NEXT: {{^\($}}
228*89a1d03eSRichard // CHECK-FIXES-NEXT: {{^\*$}}
229*89a1d03eSRichard // CHECK-FIXES-NEXT: {{^\($}}
230*89a1d03eSRichard // CHECK-FIXES-NEXT: {{^\*$}}
231*89a1d03eSRichard // CHECK-FIXES-NEXT: {{^returns_fn_returns_fn_void_void_t2$}}
232*89a1d03eSRichard // CHECK-FIXES-NEXT: {{^\($}}
233*89a1d03eSRichard // CHECK-FIXES-NOT: {{[^ ]}}
234*89a1d03eSRichard // CHECK-FIXES: {{^\)$}}
235*89a1d03eSRichard // CHECK-FIXES-NEXT: {{^\)$}}
236*89a1d03eSRichard // CHECK-FIXES-NEXT: {{^\($}}
237*89a1d03eSRichard // CHECK-FIXES-NOT: {{[^ ]}}
238*89a1d03eSRichard // CHECK-FIXES: {{^\)$}}
239*89a1d03eSRichard // CHECK-FIXES-NEXT: {{^\)$}}
240*89a1d03eSRichard // CHECK-FIXES-NEXT: {{^\($}}
241*89a1d03eSRichard // CHECK-FIXES-NOT: {{[^ ]}}
242*89a1d03eSRichard // CHECK-FIXES: {{^\)$}}
243*89a1d03eSRichard // CHECK-FIXES-NEXT: {{^;$}}
244*89a1d03eSRichard // clang-format on
245*89a1d03eSRichard
246*89a1d03eSRichard void (gronk::*p1)(void);
247*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: {{.*}} in variable declaration
248*89a1d03eSRichard // CHECK-FIXES: {{^}}void (gronk::*p1)();{{$}}
249*89a1d03eSRichard
250*89a1d03eSRichard void (gronk::*p2)(void) = &gronk::foo;
251*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: {{.*}} in variable declaration with initializer
252*89a1d03eSRichard // CHECK-FIXES: {{^}}void (gronk::*p2)() = &gronk::foo;{{$}}
253*89a1d03eSRichard
254*89a1d03eSRichard typedef void (gronk::*member_function_ptr)(void);
255*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:44: warning: {{.*}} in typedef
256*89a1d03eSRichard // CHECK-FIXES: {{^}}typedef void (gronk::*member_function_ptr)();{{$}}
257*89a1d03eSRichard
258*89a1d03eSRichard // intentionally not LLVM style to check preservation of whitespace
259*89a1d03eSRichard typedef void (gronk::*member_function_ptr2)
260*89a1d03eSRichard (
261*89a1d03eSRichard void
262*89a1d03eSRichard );
263*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-2]]:9: warning: {{.*}} in typedef
264*89a1d03eSRichard // CHECK-FIXES: {{^typedef void \(gronk::\*member_function_ptr2\)$}}
265*89a1d03eSRichard // CHECK-FIXES-NEXT: {{^ \($}}
266*89a1d03eSRichard // CHECK-FIXES-NEXT: {{^ $}}
267*89a1d03eSRichard // CHECK-FIXES-NEXT: {{^ \);$}}
268*89a1d03eSRichard
foo()269*89a1d03eSRichard void gronk::foo() {
270*89a1d03eSRichard void (*f1)(void) = &::bar;
271*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: {{.*}} in variable declaration with initializer
272*89a1d03eSRichard // CHECK-FIXES: {{^ }}void (*f1)() = &::bar;{{$}}
273*89a1d03eSRichard
274*89a1d03eSRichard void (*f2)(void);
275*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: {{.*}} in variable declaration
276*89a1d03eSRichard // CHECK-FIXES: {{^ }}void (*f2)();{{$}}
277*89a1d03eSRichard
278*89a1d03eSRichard // intentionally not LLVM style to check preservation of whitespace
279*89a1d03eSRichard void (*f3)
280*89a1d03eSRichard (
281*89a1d03eSRichard void
282*89a1d03eSRichard );
283*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-2]]:11: warning: {{.*}} in variable declaration
284*89a1d03eSRichard // CHECK-FIXES: {{^ }}void (*f3){{$}}
285*89a1d03eSRichard // CHECK-FIXES-NEXT: {{^ \($}}
286*89a1d03eSRichard // CHECK-FIXES-NEXT: {{^ $}}
287*89a1d03eSRichard // CHECK-FIXES-NEXT: {{^ \);$}}
288*89a1d03eSRichard }
289*89a1d03eSRichard
bar(void)290*89a1d03eSRichard void gronk::bar(void) {
291*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: {{.*}} in function definition
292*89a1d03eSRichard // CHECK-FIXES: {{^}}void gronk::bar() {{{$}}
293*89a1d03eSRichard void (gronk::*p3)(void) = &gronk::foo;
294*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:21: warning: {{.*}} in variable declaration with initializer
295*89a1d03eSRichard // CHECK-FIXES: {{^ }}void (gronk::*p3)() = &gronk::foo;{{$}}
296*89a1d03eSRichard
297*89a1d03eSRichard void (gronk::*p4)(void);
298*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:21: warning: {{.*}} in variable declaration
299*89a1d03eSRichard // CHECK-FIXES: {{^ }}void (gronk::*p4)();{{$}}
300*89a1d03eSRichard
301*89a1d03eSRichard // intentionally not LLVM style to check preservation of whitespace
302*89a1d03eSRichard void (gronk::*p5)
303*89a1d03eSRichard (
304*89a1d03eSRichard void
305*89a1d03eSRichard );
306*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-2]]:11: warning: {{.*}} in variable declaration
307*89a1d03eSRichard // CHECK-FIXES: {{^ }}void (gronk::*p5){{$}}
308*89a1d03eSRichard // CHECK-FIXES-NEXT: {{^ \($}}
309*89a1d03eSRichard // CHECK-FIXES-NExT: {{^ $}}
310*89a1d03eSRichard // CHECK-FIXES-NExT: {{^ \);$}}
311*89a1d03eSRichard }
312*89a1d03eSRichard
313*89a1d03eSRichard // intentionally not LLVM style to check preservation of whitespace
bar2(void)314*89a1d03eSRichard void gronk::bar2
315*89a1d03eSRichard (
316*89a1d03eSRichard void
317*89a1d03eSRichard )
318*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-2]]:3: warning: {{.*}} in function definition
319*89a1d03eSRichard // CHECK-FIXES: {{^void gronk::bar2$}}
320*89a1d03eSRichard // CHECK-FIXES-NEXT: {{^ \($}}
321*89a1d03eSRichard // CHECK-FIXES-NEXT: {{^ $}}
322*89a1d03eSRichard // CHECK-FIXES-NEXT: {{^ \)$}}
323*89a1d03eSRichard {
324*89a1d03eSRichard }
325*89a1d03eSRichard
gronk(void)326*89a1d03eSRichard gronk::gronk(void)
327*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: {{.*}} in function definition
328*89a1d03eSRichard // CHECK-FIXES: {{^}}gronk::gronk(){{$}}
329*89a1d03eSRichard : f1(nullptr),
330*89a1d03eSRichard p1(nullptr) {
331*89a1d03eSRichard }
332*89a1d03eSRichard
~gronk(void)333*89a1d03eSRichard gronk::~gronk(void) {
334*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: {{.*}} in function definition
335*89a1d03eSRichard // CHECK-FIXES: {{^}}gronk::~gronk() {{{$}}
336*89a1d03eSRichard }
337*89a1d03eSRichard
338*89a1d03eSRichard class nutter {
339*89a1d03eSRichard public:
340*89a1d03eSRichard nutter();
341*89a1d03eSRichard };
342*89a1d03eSRichard
nutter(void)343*89a1d03eSRichard nutter::nutter(void) {
344*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: {{.*}} in function definition
345*89a1d03eSRichard // CHECK-FIXES: {{^}}nutter::nutter() {{{$}}
346*89a1d03eSRichard void (*f3)(void) = static_cast<void (*)(void)>(0);
347*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: {{.*}} in variable declaration with initializer
348*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-2]]:43: warning: {{.*}} in named cast
349*89a1d03eSRichard // CHECK-FIXES: void (*f3)() = static_cast<void (*)()>(0);{{$}}
350*89a1d03eSRichard
351*89a1d03eSRichard void (*f4)(void) = (void (*)(void)) 0;
352*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: {{.*}} in variable declaration with initializer
353*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-2]]:32: warning: {{.*}} in cast expression
354*89a1d03eSRichard // CHECK-FIXES: void (*f4)() = (void (*)()) 0;{{$}}
355*89a1d03eSRichard
356*89a1d03eSRichard void (*f5)(void) = reinterpret_cast<void (*)(void)>(0);
357*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: {{.*}} in variable declaration with initializer
358*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-2]]:48: warning: {{.*}} in named cast
359*89a1d03eSRichard // CHECK-FIXES: void (*f5)() = reinterpret_cast<void (*)()>(0);{{$}}
360*89a1d03eSRichard
361*89a1d03eSRichard // intentionally not LLVM style to check preservation of whitespace
362*89a1d03eSRichard void (*f6)(void) = static_cast<void (*)
363*89a1d03eSRichard (
364*89a1d03eSRichard void
365*89a1d03eSRichard )>(0);
366*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-4]]:14: warning: {{.*}} in variable declaration with initializer
367*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-3]]:11: warning: {{.*}} in named cast
368*89a1d03eSRichard // CHECK-FIXES: {{^ }}void (*f6)() = static_cast<void (*){{$}}
369*89a1d03eSRichard // CHECK-FIXES-NEXT: {{^ \($}}
370*89a1d03eSRichard // CHECK-FIXES-NEXT: {{^ $}}
371*89a1d03eSRichard // CHECK-FIXES-NEXT: {{^ }})>(0);{{$}}
372*89a1d03eSRichard
373*89a1d03eSRichard // intentionally not LLVM style to check preservation of whitespace
374*89a1d03eSRichard void (*f7)(void) = (void (*)
375*89a1d03eSRichard (
376*89a1d03eSRichard void
377*89a1d03eSRichard )) 0;
378*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-4]]:14: warning: {{.*}} in variable declaration with initializer
379*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-3]]:11: warning: {{.*}} in cast expression
380*89a1d03eSRichard // CHECK-FIXES: {{^ }}void (*f7)() = (void (*){{$}}
381*89a1d03eSRichard // CHECK-FIXES-NEXT: {{^ \($}}
382*89a1d03eSRichard // CHECK-FIXES-NEXT: {{^ $}}
383*89a1d03eSRichard // CHECK-FIXES-NEXT: {{^ \)\) 0;$}}
384*89a1d03eSRichard
385*89a1d03eSRichard // intentionally not LLVM style to check preservation of whitespace
386*89a1d03eSRichard void (*f8)(void) = reinterpret_cast<void (*)
387*89a1d03eSRichard (
388*89a1d03eSRichard void
389*89a1d03eSRichard )>(0);
390*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-4]]:14: warning: {{.*}} in variable declaration with initializer
391*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-3]]:11: warning: {{.*}} in named cast
392*89a1d03eSRichard // CHECK-FIXES: {{^ }}void (*f8)() = reinterpret_cast<void (*){{$}}
393*89a1d03eSRichard // CHECK-FIXES-NEXT: {{^ \($}}
394*89a1d03eSRichard // CHECK-FIXES-NEXT: {{^ $}}
395*89a1d03eSRichard // CHECK-FIXES-NEXT: {{^ \)>\(0\);$}}
396*89a1d03eSRichard
397*89a1d03eSRichard void (*o1)(int) = static_cast<void (*)(int)>(0);
398*89a1d03eSRichard void (*o2)(int) = (void (*)(int)) 0;
399*89a1d03eSRichard void (*o3)(int) = reinterpret_cast<void (*)(int)>(0);
400*89a1d03eSRichard }
401*89a1d03eSRichard
402*89a1d03eSRichard class generator {
403*89a1d03eSRichard public:
operator ()(void)404*89a1d03eSRichard int operator()(void) { return 1; }
405*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:18: warning: {{.*}} in function definition
406*89a1d03eSRichard // CHECK-FIXES: {{^ }}int operator()() { return 1; }{{$}}
407*89a1d03eSRichard };
408*89a1d03eSRichard
test_lambda_functions()409*89a1d03eSRichard void test_lambda_functions() {
410*89a1d03eSRichard auto lamb_duh = [](void (*fn)(void)) { (*fn)(); };
411*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:33: warning: {{.*}} in variable declaration
412*89a1d03eSRichard // CHECK-FIXES: {{^ }}auto lamb_duh = [](void (*fn)()) { (*fn)(); };{{$}}
413*89a1d03eSRichard
414*89a1d03eSRichard auto lambda_generator = [](void) { return 1; };
415*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:30: warning: {{.*}} in lambda expression
416*89a1d03eSRichard // CHECK-FIXES: {{^ }}auto lambda_generator = []() { return 1; };{{$}}
417*89a1d03eSRichard
418*89a1d03eSRichard auto gen2 = []() { return 1; };
419*89a1d03eSRichard
420*89a1d03eSRichard auto gen3 = []{ return 1; };
421*89a1d03eSRichard
422*89a1d03eSRichard auto void_returner = [](void) -> void (*)(void) { return f1; };
423*89a1d03eSRichard // CHECK-MESSAGES: [[@LINE-1]]:27: warning: {{.*}} in lambda expression
424*89a1d03eSRichard // CHECK-MESSAGES: [[@LINE-2]]:45: warning: {{.*}} in lambda expression
425*89a1d03eSRichard // CHECK-FIXES: {{^ }}auto void_returner = []() -> void (*)() { return f1; };{{$}}
426*89a1d03eSRichard }
427*89a1d03eSRichard
428*89a1d03eSRichard #define M(x) x
429*89a1d03eSRichard
430*89a1d03eSRichard M(void inmacro(void) {})
431*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: {{.*}} in function definition
432*89a1d03eSRichard // CHECK-FIXES: M(void inmacro() {})
433*89a1d03eSRichard
434*89a1d03eSRichard #define F(A, B) \
435*89a1d03eSRichard struct F_##A##_##B { \
436*89a1d03eSRichard F_##A##_##B(void); \
437*89a1d03eSRichard }; \
438*89a1d03eSRichard F_##A##_##B::F_##A##_##B(void)
439*89a1d03eSRichard
F(Foo,Bar)440*89a1d03eSRichard F(Foo, Bar) {
441*89a1d03eSRichard
442*89a1d03eSRichard }
443*89a1d03eSRichard
444*89a1d03eSRichard struct DefinitionWithNoBody {
445*89a1d03eSRichard DefinitionWithNoBody(void) = delete;
446*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:24: warning: {{.*}} in function definition
447*89a1d03eSRichard // CHECK-FIXES: DefinitionWithNoBody() = delete;
448*89a1d03eSRichard };
449*89a1d03eSRichard
450*89a1d03eSRichard
451*89a1d03eSRichard
452*89a1d03eSRichard #define BODY {}
453*89a1d03eSRichard #define LAMBDA1 [](void){}
454*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:20: warning: redundant void argument list in lambda expression [modernize-redundant-void-arg]
455*89a1d03eSRichard // CHECK-FIXES: LAMBDA1 [](){}
456*89a1d03eSRichard
457*89a1d03eSRichard #define LAMBDA2 [](void)BODY
458*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:20: warning: redundant void argument list in lambda expression [modernize-redundant-void-arg]
459*89a1d03eSRichard // CHECK-FIXES: LAMBDA2 []()BODY
460*89a1d03eSRichard
461*89a1d03eSRichard #define LAMBDA3(captures, args, body) captures args body
462*89a1d03eSRichard #define WRAP(...) __VA_ARGS__
463*89a1d03eSRichard
464*89a1d03eSRichard #define LAMBDA4 (void)LAMBDA3([],(void),BODY)
465*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:35: warning: redundant void argument list in lambda expression [modernize-redundant-void-arg]
466*89a1d03eSRichard // CHECK-FIXES: LAMBDA4 (void)LAMBDA3([],(),BODY)
467*89a1d03eSRichard
468*89a1d03eSRichard #define LAMBDA5 []() -> void (*)(void) {return BODY;}
469*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:34: warning: redundant void argument list in lambda expression [modernize-redundant-void-arg]
470*89a1d03eSRichard // CHECK-FIXES: LAMBDA5 []() -> void (*)() {return BODY;}
lambda_expression_with_macro_test()471*89a1d03eSRichard void lambda_expression_with_macro_test(){
472*89a1d03eSRichard (void)LAMBDA1;
473*89a1d03eSRichard (void)LAMBDA2;
474*89a1d03eSRichard (void)LAMBDA3([], (void), BODY);
475*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: redundant void argument list in lambda expression [modernize-redundant-void-arg]
476*89a1d03eSRichard // CHECK-FIXES: (void)LAMBDA3([], (), BODY);
477*89a1d03eSRichard
478*89a1d03eSRichard LAMBDA4;
479*89a1d03eSRichard LAMBDA5;
480*89a1d03eSRichard WRAP((void)WRAP(WRAP(LAMBDA3(WRAP([]), WRAP((void)), WRAP(BODY)))));
481*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:48: warning: redundant void argument list in lambda expression [modernize-redundant-void-arg]
482*89a1d03eSRichard // CHECK-FIXES: WRAP((void)WRAP(WRAP(LAMBDA3(WRAP([]), WRAP(()), WRAP(BODY)))));
483*89a1d03eSRichard
484*89a1d03eSRichard (void)WRAP([](void) {});
485*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: redundant void argument list in lambda expression [modernize-redundant-void-arg]
486*89a1d03eSRichard // CHECK-FIXES: (void)WRAP([]() {});
487*89a1d03eSRichard
488*89a1d03eSRichard [](void) BODY;
489*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: redundant void argument list in lambda expression [modernize-redundant-void-arg]
490*89a1d03eSRichard // CHECK-FIXES: []() BODY;
491*89a1d03eSRichard }
492*89a1d03eSRichard
493*89a1d03eSRichard namespace qqq {
494*89a1d03eSRichard void foo() BODY
495*89a1d03eSRichard void bar(void) BODY;
496*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: redundant void argument list in function definition
497*89a1d03eSRichard // CHECK-FIXES: void bar() BODY;
498*89a1d03eSRichard }
499*89a1d03eSRichard
500*89a1d03eSRichard struct S_1 {
g_1S_1501*89a1d03eSRichard void g_1(void) const {
502*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: redundant void argument list in function definition [modernize-redundant-void-arg]
503*89a1d03eSRichard // CHECK-FIXES: void g_1() const {
504*89a1d03eSRichard int a;
505*89a1d03eSRichard (void)a;
506*89a1d03eSRichard }
507*89a1d03eSRichard
g_2S_1508*89a1d03eSRichard void g_2() const {
509*89a1d03eSRichard int a;
510*89a1d03eSRichard (void)a;
511*89a1d03eSRichard }
512*89a1d03eSRichard };
513*89a1d03eSRichard
514*89a1d03eSRichard template <typename T0>
515*89a1d03eSRichard struct S_2 {
g_1S_2516*89a1d03eSRichard void g_1(void) const {
517*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: redundant void argument list in function definition [modernize-redundant-void-arg]
518*89a1d03eSRichard // CHECK-FIXES: void g_1() const {
519*89a1d03eSRichard int a;
520*89a1d03eSRichard (void)a;
521*89a1d03eSRichard }
522*89a1d03eSRichard
g_2S_2523*89a1d03eSRichard void g_2() const {
524*89a1d03eSRichard int a;
525*89a1d03eSRichard (void)a;
526*89a1d03eSRichard }
527*89a1d03eSRichard };
528*89a1d03eSRichard
529*89a1d03eSRichard template <typename T0>
530*89a1d03eSRichard struct S_3 {
531*89a1d03eSRichard template <typename T1>
g_1S_3532*89a1d03eSRichard void g_1(void) const {
533*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: redundant void argument list in function definition [modernize-redundant-void-arg]
534*89a1d03eSRichard // CHECK-FIXES: void g_1() const {
535*89a1d03eSRichard int a;
536*89a1d03eSRichard (void)a;
537*89a1d03eSRichard }
538*89a1d03eSRichard template <typename T2>
g_2S_3539*89a1d03eSRichard void g_2() const {
540*89a1d03eSRichard int a;
541*89a1d03eSRichard (void)a;
542*89a1d03eSRichard }
543*89a1d03eSRichard };
544*89a1d03eSRichard
545*89a1d03eSRichard template <typename T1>
g_3(void)546*89a1d03eSRichard void g_3(void) {
547*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: redundant void argument list in function definition [modernize-redundant-void-arg]
548*89a1d03eSRichard // CHECK-FIXES: void g_3() {
549*89a1d03eSRichard int a;
550*89a1d03eSRichard (void)a;
551*89a1d03eSRichard }
552*89a1d03eSRichard
553*89a1d03eSRichard //Template instantiation
f_testTemplate()554*89a1d03eSRichard void f_testTemplate() {
555*89a1d03eSRichard S_1();
556*89a1d03eSRichard S_2<int>();
557*89a1d03eSRichard S_3<int>();
558*89a1d03eSRichard g_3<int>();
559*89a1d03eSRichard }
560*89a1d03eSRichard
561*89a1d03eSRichard #define return_t(T) T
562*89a1d03eSRichard extern return_t(void) func(void);
563*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: redundant void argument list in function declaration
564*89a1d03eSRichard // CHECK-FIXES: extern return_t(void) func();
565*89a1d03eSRichard
func(void)566*89a1d03eSRichard return_t(void) func(void) {
567*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:21: warning: redundant void argument list in function definition
568*89a1d03eSRichard // CHECK-FIXES: return_t(void) func() {
569*89a1d03eSRichard int a;
570*89a1d03eSRichard (void)a;
571*89a1d03eSRichard }
572*89a1d03eSRichard
573*89a1d03eSRichard extern return_t(void) func(return_t(void) (*fp)(void));
574*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:49: warning: redundant void argument list in variable declaration
575*89a1d03eSRichard // CHECK-FIXES: extern return_t(void) func(return_t(void) (*fp)());
576*89a1d03eSRichard
func(return_t (void)(* fp)(void))577*89a1d03eSRichard return_t(void) func(return_t(void) (*fp)(void)) {
578*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:42: warning: redundant void argument list in variable declaration
579*89a1d03eSRichard // CHECK-FIXES: return_t(void) func(return_t(void) (*fp)()) {
580*89a1d03eSRichard int a;
581*89a1d03eSRichard (void)a;
582*89a1d03eSRichard }
583*89a1d03eSRichard
584*89a1d03eSRichard extern return_t(return_t(void)) func2(return_t(return_t(void)) (*fp)(void));
585*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:70: warning: redundant void argument list in variable declaration
586*89a1d03eSRichard // CHECK-FIXES: extern return_t(return_t(void)) func2(return_t(return_t(void)) (*fp)());
587*89a1d03eSRichard
func2(return_t (return_t (void))(* fp)(void))588*89a1d03eSRichard return_t(return_t(void)) func2(return_t(return_t(void)) (*fp)(void)) {
589*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:63: warning: redundant void argument list in variable declaration
590*89a1d03eSRichard // CHECK-FIXES: return_t(return_t(void)) func2(return_t(return_t(void)) (*fp)()) {
591*89a1d03eSRichard int a;
592*89a1d03eSRichard (void)a;
593*89a1d03eSRichard }
594*89a1d03eSRichard #undef return_t
595