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