xref: /llvm-project/clang-tools-extra/test/clang-tidy/checkers/readability/redundant-control-flow.cpp (revision 89a1d03e2b379e325daa5249411e414bbd995b5e)
1*89a1d03eSRichard // RUN: %check_clang_tidy %s readability-redundant-control-flow %t
2*89a1d03eSRichard 
3*89a1d03eSRichard void g(int i);
4*89a1d03eSRichard void j();
5*89a1d03eSRichard 
f()6*89a1d03eSRichard void f() {
7*89a1d03eSRichard   return;
8*89a1d03eSRichard }
9*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-2]]:3: warning: redundant return statement at the end of a function with a void return type [readability-redundant-control-flow]
10*89a1d03eSRichard // CHECK-FIXES: {{^}}void f() {{{$}}
11*89a1d03eSRichard // CHECK-FIXES-NEXT: {{^ *}$}}
12*89a1d03eSRichard 
g()13*89a1d03eSRichard void g() {
14*89a1d03eSRichard   f();
15*89a1d03eSRichard   return;
16*89a1d03eSRichard }
17*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-2]]:3: warning: redundant return statement
18*89a1d03eSRichard // CHECK-FIXES: {{^  }}f();{{$}}
19*89a1d03eSRichard // CHECK-FIXES-NEXT: {{^ *}$}}
20*89a1d03eSRichard 
g(int i)21*89a1d03eSRichard void g(int i) {
22*89a1d03eSRichard   if (i < 0) {
23*89a1d03eSRichard     return;
24*89a1d03eSRichard   }
25*89a1d03eSRichard   if (i < 10) {
26*89a1d03eSRichard     f();
27*89a1d03eSRichard   }
28*89a1d03eSRichard }
29*89a1d03eSRichard 
h()30*89a1d03eSRichard int h() {
31*89a1d03eSRichard   return 1;
32*89a1d03eSRichard }
33*89a1d03eSRichard 
j()34*89a1d03eSRichard void j() {
35*89a1d03eSRichard }
36*89a1d03eSRichard 
k()37*89a1d03eSRichard void k() {
38*89a1d03eSRichard   for (int i = 0; i < 10; ++i) {
39*89a1d03eSRichard     continue;
40*89a1d03eSRichard   }
41*89a1d03eSRichard }
42*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-3]]:5: warning: redundant continue statement at the end of loop statement
43*89a1d03eSRichard // CHECK-FIXES: {{^}}  for (int i = 0; i < 10; ++i) {{{$}}
44*89a1d03eSRichard // CHECK-FIXES-NEXT: {{^ *}$}}
45*89a1d03eSRichard 
k2()46*89a1d03eSRichard void k2() {
47*89a1d03eSRichard   int v[10] = { 0 };
48*89a1d03eSRichard   for (auto i : v) {
49*89a1d03eSRichard     continue;
50*89a1d03eSRichard   }
51*89a1d03eSRichard }
52*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-3]]:5: warning: redundant continue statement
53*89a1d03eSRichard // CHECK-FIXES: {{^}}  for (auto i : v) {{{$}}
54*89a1d03eSRichard // CHECK-FIXES-NEXT: {{^ *}$}}
55*89a1d03eSRichard 
m()56*89a1d03eSRichard void m() {
57*89a1d03eSRichard   int i = 0;
58*89a1d03eSRichard   do {
59*89a1d03eSRichard     ++i;
60*89a1d03eSRichard     continue;
61*89a1d03eSRichard   } while (i < 10);
62*89a1d03eSRichard }
63*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-3]]:5: warning: redundant continue statement
64*89a1d03eSRichard // CHECK-FIXES: {{^  do {$}}
65*89a1d03eSRichard // CHECK-FIXES-NEXT: {{^}}    ++i;{{$}}
66*89a1d03eSRichard // CHECK-FIXES-NEXT: {{^ *}}} while (i < 10);{{$}}
67*89a1d03eSRichard 
p()68*89a1d03eSRichard void p() {
69*89a1d03eSRichard   int i = 0;
70*89a1d03eSRichard   while (i < 10) {
71*89a1d03eSRichard     ++i;
72*89a1d03eSRichard     continue;
73*89a1d03eSRichard   }
74*89a1d03eSRichard }
75*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-3]]:5: warning: redundant continue statement
76*89a1d03eSRichard // CHECK-FIXES: {{^}}  while (i < 10) {{{$}}
77*89a1d03eSRichard // CHECK-FIXES-NEXT: {{^}}    ++i;{{$}}
78*89a1d03eSRichard // CHECK-FIXES-NEXT: {{^ *}$}}
79*89a1d03eSRichard 
im_not_dead(int i)80*89a1d03eSRichard void im_not_dead(int i) {
81*89a1d03eSRichard   if (i > 0) {
82*89a1d03eSRichard     return;
83*89a1d03eSRichard   }
84*89a1d03eSRichard   g();
85*89a1d03eSRichard }
86*89a1d03eSRichard 
im_still_not_dead(int i)87*89a1d03eSRichard void im_still_not_dead(int i) {
88*89a1d03eSRichard   for (int j = 0; j < 10; ++j) {
89*89a1d03eSRichard     if (i < 10) {
90*89a1d03eSRichard       continue;
91*89a1d03eSRichard     }
92*89a1d03eSRichard     g();
93*89a1d03eSRichard   }
94*89a1d03eSRichard }
95*89a1d03eSRichard 
im_dead(int i)96*89a1d03eSRichard void im_dead(int i) {
97*89a1d03eSRichard   if (i > 0) {
98*89a1d03eSRichard     return;
99*89a1d03eSRichard     g();
100*89a1d03eSRichard   }
101*89a1d03eSRichard   g();
102*89a1d03eSRichard }
103*89a1d03eSRichard 
im_still_dead(int i)104*89a1d03eSRichard void im_still_dead(int i) {
105*89a1d03eSRichard   for (int j = 0; j < 10; ++j) {
106*89a1d03eSRichard     if (i < 10) {
107*89a1d03eSRichard       continue;
108*89a1d03eSRichard       g();
109*89a1d03eSRichard     }
110*89a1d03eSRichard     g();
111*89a1d03eSRichard   }
112*89a1d03eSRichard }
113*89a1d03eSRichard 
void_return()114*89a1d03eSRichard void void_return() {
115*89a1d03eSRichard   return g();
116*89a1d03eSRichard }
117*89a1d03eSRichard 
nested_return_unmolested()118*89a1d03eSRichard void nested_return_unmolested() {
119*89a1d03eSRichard   g();
120*89a1d03eSRichard   {
121*89a1d03eSRichard     g();
122*89a1d03eSRichard     return;
123*89a1d03eSRichard   }
124*89a1d03eSRichard }
125*89a1d03eSRichard 
nested_continue_unmolested()126*89a1d03eSRichard void nested_continue_unmolested() {
127*89a1d03eSRichard   for (int i = 0; i < 10; ++i) {
128*89a1d03eSRichard     if (i < 5) {
129*89a1d03eSRichard       continue;
130*89a1d03eSRichard     }
131*89a1d03eSRichard   }
132*89a1d03eSRichard }
133*89a1d03eSRichard 
134*89a1d03eSRichard #define MACRO_RETURN_UNMOLESTED(fn_)  \
135*89a1d03eSRichard   (fn_)();                            \
136*89a1d03eSRichard   return
137*89a1d03eSRichard 
138*89a1d03eSRichard #define MACRO_CONTINUE_UNMOLESTED(x_) \
139*89a1d03eSRichard   do {                                \
140*89a1d03eSRichard     for (int i = 0; i < (x_); ++i) {  \
141*89a1d03eSRichard       continue;                       \
142*89a1d03eSRichard     }                                 \
143*89a1d03eSRichard   } while (false)
144*89a1d03eSRichard 
macro_return()145*89a1d03eSRichard void macro_return() {
146*89a1d03eSRichard   MACRO_RETURN_UNMOLESTED(g);
147*89a1d03eSRichard }
148*89a1d03eSRichard 
macro_continue()149*89a1d03eSRichard void macro_continue() {
150*89a1d03eSRichard   MACRO_CONTINUE_UNMOLESTED(10);
151*89a1d03eSRichard }
152*89a1d03eSRichard 
153*89a1d03eSRichard #define MACRO_RETURN_ARG(stmt_) \
154*89a1d03eSRichard   stmt_
155*89a1d03eSRichard 
156*89a1d03eSRichard #define MACRO_CONTINUE_ARG(stmt_)   \
157*89a1d03eSRichard   do {                              \
158*89a1d03eSRichard     for (int i = 0; i < 10; ++i) {  \
159*89a1d03eSRichard       stmt_;                        \
160*89a1d03eSRichard     }                               \
161*89a1d03eSRichard   } while (false)
162*89a1d03eSRichard 
macro_arg_return()163*89a1d03eSRichard void macro_arg_return() {
164*89a1d03eSRichard   MACRO_RETURN_ARG(return);
165*89a1d03eSRichard }
166*89a1d03eSRichard 
macro_arg_continue()167*89a1d03eSRichard void macro_arg_continue() {
168*89a1d03eSRichard   MACRO_CONTINUE_ARG(continue);
169*89a1d03eSRichard }
170*89a1d03eSRichard 
171*89a1d03eSRichard template <typename T>
template_return(T check)172*89a1d03eSRichard void template_return(T check) {
173*89a1d03eSRichard   if (check < T(0)) {
174*89a1d03eSRichard     return;
175*89a1d03eSRichard   }
176*89a1d03eSRichard   return;
177*89a1d03eSRichard }
178*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-2]]:3: warning: redundant return statement
179*89a1d03eSRichard // CHECK-FIXES: {{^}}  if (check < T(0)) {{{$}}
180*89a1d03eSRichard // CHECK-FIXES-NEXT: {{^    return;$}}
181*89a1d03eSRichard // CHECK-FIXES-NEXT: {{^ *}$}}
182*89a1d03eSRichard // CHECK-FIXES-NEXT: {{^ *}$}}
183*89a1d03eSRichard 
184*89a1d03eSRichard template <>
template_return(int check)185*89a1d03eSRichard void template_return(int check) {
186*89a1d03eSRichard   if (check < 0) {
187*89a1d03eSRichard     return;
188*89a1d03eSRichard   }
189*89a1d03eSRichard   return;
190*89a1d03eSRichard }
191*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-2]]:3: warning: redundant return statement
192*89a1d03eSRichard // CHECK-FIXES: {{^}}  if (check < 0) {{{$}}
193*89a1d03eSRichard // CHECK-FIXES-NEXT: {{^    return;$}}
194*89a1d03eSRichard // CHECK-FIXES-NEXT: {{^ *}$}}
195*89a1d03eSRichard // CHECK-FIXES-NEXT: {{^ *}$}}
196*89a1d03eSRichard 
197*89a1d03eSRichard template <typename T>
template_loop(T end)198*89a1d03eSRichard void template_loop(T end) {
199*89a1d03eSRichard   for (T i = 0; i < end; ++i) {
200*89a1d03eSRichard     continue;
201*89a1d03eSRichard   }
202*89a1d03eSRichard }
203*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-3]]:5: warning: redundant continue statement
204*89a1d03eSRichard // CHECK-FIXES: {{^}}  for (T i = 0; i < end; ++i) {{{$}}
205*89a1d03eSRichard // CHECK-FIXES-NEXT: {{^ *}$}}
206*89a1d03eSRichard 
207*89a1d03eSRichard template <>
template_loop(int end)208*89a1d03eSRichard void template_loop(int end) {
209*89a1d03eSRichard   for (int i = 0; i < end; ++i) {
210*89a1d03eSRichard     continue;
211*89a1d03eSRichard   }
212*89a1d03eSRichard }
213*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-3]]:5: warning: redundant continue statement
214*89a1d03eSRichard // CHECK-FIXES: {{^}}  for (int i = 0; i < end; ++i) {{{$}}
215*89a1d03eSRichard // CHECK-FIXES-NEXT: {{^ *}$}}
216*89a1d03eSRichard 
call_templates()217*89a1d03eSRichard void call_templates() {
218*89a1d03eSRichard   template_return(10);
219*89a1d03eSRichard   template_return(10.0f);
220*89a1d03eSRichard   template_return(10.0);
221*89a1d03eSRichard   template_loop(10);
222*89a1d03eSRichard   template_loop(10L);
223*89a1d03eSRichard   template_loop(10U);
224*89a1d03eSRichard }
225