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*89a1d03eSRichardvoid 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*89a1d03eSRichardvoid 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*89a1d03eSRichardvoid 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*89a1d03eSRichardint h() { 31*89a1d03eSRichard return 1; 32*89a1d03eSRichard } 33*89a1d03eSRichard j()34*89a1d03eSRichardvoid j() { 35*89a1d03eSRichard } 36*89a1d03eSRichard k()37*89a1d03eSRichardvoid 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*89a1d03eSRichardvoid 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*89a1d03eSRichardvoid 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*89a1d03eSRichardvoid 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*89a1d03eSRichardvoid 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*89a1d03eSRichardvoid 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*89a1d03eSRichardvoid 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*89a1d03eSRichardvoid 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*89a1d03eSRichardvoid void_return() { 115*89a1d03eSRichard return g(); 116*89a1d03eSRichard } 117*89a1d03eSRichard nested_return_unmolested()118*89a1d03eSRichardvoid nested_return_unmolested() { 119*89a1d03eSRichard g(); 120*89a1d03eSRichard { 121*89a1d03eSRichard g(); 122*89a1d03eSRichard return; 123*89a1d03eSRichard } 124*89a1d03eSRichard } 125*89a1d03eSRichard nested_continue_unmolested()126*89a1d03eSRichardvoid 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*89a1d03eSRichardvoid macro_return() { 146*89a1d03eSRichard MACRO_RETURN_UNMOLESTED(g); 147*89a1d03eSRichard } 148*89a1d03eSRichard macro_continue()149*89a1d03eSRichardvoid 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*89a1d03eSRichardvoid macro_arg_return() { 164*89a1d03eSRichard MACRO_RETURN_ARG(return); 165*89a1d03eSRichard } 166*89a1d03eSRichard macro_arg_continue()167*89a1d03eSRichardvoid macro_arg_continue() { 168*89a1d03eSRichard MACRO_CONTINUE_ARG(continue); 169*89a1d03eSRichard } 170*89a1d03eSRichard 171*89a1d03eSRichard template <typename T> template_return(T check)172*89a1d03eSRichardvoid 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*89a1d03eSRichardvoid 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*89a1d03eSRichardvoid 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*89a1d03eSRichardvoid 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*89a1d03eSRichardvoid 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