483 lines · cpp
1// RUN: %check_clang_tidy %s readability-braces-around-statements %t2 3void do_something(const char *) {}4 5bool cond(const char *) {6 return false;7}8 9#define EMPTY_MACRO10#define EMPTY_MACRO_FUN()11 12void test() {13 if (cond("if0") /*comment*/) do_something("same-line");14 // CHECK-MESSAGES: :[[@LINE-1]]:31: warning: statement should be inside braces15 // CHECK-FIXES: if (cond("if0") /*comment*/) { do_something("same-line");16 // CHECK-FIXES: }17 18 if (cond("if0.1"))19 do_something("single-line");20 // CHECK-MESSAGES: :[[@LINE-2]]:21: warning: statement should be inside braces21 // CHECK-FIXES: if (cond("if0.1")) {22 // CHECK-FIXES: }23 24 if (cond("if1") /*comment*/)25 // some comment26 do_something("if1");27 // CHECK-MESSAGES: :[[@LINE-3]]:31: warning: statement should be inside braces28 // CHECK-FIXES: if (cond("if1") /*comment*/) {29 // CHECK-FIXES: }30 if (cond("if2")) {31 do_something("if2");32 }33 if (cond("if3"))34 ;35 // CHECK-MESSAGES: :[[@LINE-2]]:19: warning: statement should be inside braces36 // CHECK-FIXES: if (cond("if3")) {37 // CHECK-FIXES: }38 39 if (cond("if-else1"))40 do_something("if-else1");41 // CHECK-MESSAGES: :[[@LINE-2]]:24: warning: statement should be inside braces42 // CHECK-FIXES: if (cond("if-else1")) {43 // CHECK-FIXES: } else {44 else45 do_something("if-else1 else");46 // CHECK-MESSAGES: :[[@LINE-2]]:7: warning: statement should be inside braces47 // CHECK-FIXES: }48 if (cond("if-else2")) {49 do_something("if-else2");50 } else {51 do_something("if-else2 else");52 }53 54 if (cond("if-else if-else1"))55 do_something("if");56 // CHECK-MESSAGES: :[[@LINE-2]]:32: warning: statement should be inside braces57 // CHECK-FIXES: } else if (cond("else if1")) {58 else if (cond("else if1"))59 do_something("else if");60 // CHECK-MESSAGES: :[[@LINE-2]]:29: warning: statement should be inside braces61 else62 do_something("else");63 // CHECK-MESSAGES: :[[@LINE-2]]:7: warning: statement should be inside braces64 // CHECK-FIXES: }65 if (cond("if-else if-else2")) {66 do_something("if");67 } else if (cond("else if2")) {68 do_something("else if");69 } else {70 do_something("else");71 }72 73 for (;;)74 do_something("for");75 // CHECK-MESSAGES: :[[@LINE-2]]:11: warning: statement should be inside braces76 // CHECK-FIXES: for (;;) {77 // CHECK-FIXES-NEXT: do_something("for");78 // CHECK-FIXES-NEXT: }79 80 for (;;)81 ;82 // CHECK-MESSAGES: :[[@LINE-2]]:11: warning: statement should be inside braces83 // CHECK-FIXES: for (;;) {84 // CHECK-FIXES-NEXT: ;85 // CHECK-FIXES-NEXT: }86 87 for (;;) {88 do_something("for-ok");89 }90 91 int arr[4] = {1, 2, 3, 4};92 for (int a : arr)93 do_something("for-range");94 // CHECK-MESSAGES: :[[@LINE-2]]:20: warning: statement should be inside braces95 // CHECK-FIXES: for (int a : arr) {96 // CHECK-FIXES-NEXT: do_something("for-range");97 // CHECK-FIXES-NEXT: }98 for (int &assign : arr)99 assign = 7;100 // CHECK-MESSAGES: :[[@LINE-2]]:26: warning: statement should be inside braces101 // CHECK-FIXES: for (int &assign : arr) {102 // CHECK-FIXES-NEXT: assign = 7;103 // CHECK-FIXES-NEXT: }104 for (int ok : arr) {105 do_something("for-range");106 }107 for (int NullStmt : arr)108 ;109 // CHECK-MESSAGES: :[[@LINE-2]]:27: warning: statement should be inside braces110 // CHECK-FIXES: for (int NullStmt : arr) {111 // CHECK-FIXES-NEXT: ;112 // CHECK-FIXES-NEXT: }113 114 while (cond("while1"))115 do_something("while");116 // CHECK-MESSAGES: :[[@LINE-2]]:25: warning: statement should be inside braces117 // CHECK-FIXES: while (cond("while1")) {118 // CHECK-FIXES: }119 while (cond("while2")) {120 do_something("while");121 }122 while (false)123 ;124 // CHECK-MESSAGES: :[[@LINE-2]]:16: warning: statement should be inside braces125 // CHECK-FIXES: while (false) {126 // CHECK-FIXES: }127 128 do129 do_something("do1");130 while (cond("do1"));131 // CHECK-MESSAGES: :[[@LINE-3]]:5: warning: statement should be inside braces132 // CHECK-FIXES: do {133 // CHECK-FIXES: } while (cond("do1"));134 do {135 do_something("do2");136 } while (cond("do2"));137 138 do139 ;140 while (false);141 // CHECK-MESSAGES: :[[@LINE-3]]:5: warning: statement should be inside braces142 // CHECK-FIXES: do {143 // CHECK-FIXES: } while (false);144 145 if (cond("ifif1"))146 // comment147 if (cond("ifif2"))148 // comment149 /*comment*/ ; // comment150 // CHECK-MESSAGES: :[[@LINE-5]]:21: warning: statement should be inside braces151 // CHECK-MESSAGES: :[[@LINE-4]]:23: warning: statement should be inside braces152 // CHECK-FIXES: if (cond("ifif1")) {153 // CHECK-FIXES: if (cond("ifif2")) {154 // CHECK-FIXES: }155 // CHECK-FIXES-NEXT: }156 157 if (cond("ifif3"))158 // comment1159 if (cond("ifif4")) {160 // comment2161 /*comment3*/; // comment4162 }163 // CHECK-MESSAGES: :[[@LINE-6]]:21: warning: statement should be inside braces164 // CHECK-FIXES: if (cond("ifif3")) {165 // CHECK-FIXES-NEXT: // comment1166 // CHECK-FIXES-NEXT: if (cond("ifif4")) {167 // CHECK-FIXES-NEXT: // comment2168 // CHECK-FIXES-NEXT: /*comment3*/; // comment4169 // CHECK-FIXES-NEXT: }170 // CHECK-FIXES-NEXT: }171 172 if (cond("ifif5"))173 ; /* multi-line174 comment */175 // CHECK-MESSAGES: :[[@LINE-3]]:21: warning: statement should be inside braces176 // CHECK-FIXES: if (cond("ifif5")) {177 // CHECK-FIXES: }/* multi-line178 179 if (1) while (2) if (3) for (;;) do ; while(false) /**/;/**/180 // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: statement should be inside braces181 // CHECK-MESSAGES: :[[@LINE-2]]:19: warning: statement should be inside braces182 // CHECK-MESSAGES: :[[@LINE-3]]:26: warning: statement should be inside braces183 // CHECK-MESSAGES: :[[@LINE-4]]:35: warning: statement should be inside braces184 // CHECK-MESSAGES: :[[@LINE-5]]:38: warning: statement should be inside braces185 // CHECK-FIXES: if (1) { while (2) { if (3) { for (;;) { do { ; } while(false) /**/;/**/186 // CHECK-FIXES-NEXT: }187 // CHECK-FIXES-NEXT: }188 // CHECK-FIXES-NEXT: }189 // CHECK-FIXES-NEXT: }190 191 int S;192 if (cond("assign with brackets"))193 S = {5};194 // CHECK-MESSAGES: :[[@LINE-2]]:36: warning: statement should be inside braces195 // CHECK-FIXES: if (cond("assign with brackets")) {196 // CHECK-FIXES-NEXT: S = {5};197 // CHECK-FIXES-NEXT: }198 199 if (cond("assign with brackets 2"))200 S = { 5 } /* comment1 */ ; /* comment2 */201 // CHECK-MESSAGES: :[[@LINE-2]]:38: warning: statement should be inside braces202 // CHECK-FIXES: if (cond("assign with brackets 2")) {203 // CHECK-FIXES-NEXT: S = { 5 } /* comment1 */ ; /* comment2 */204 // CHECK-FIXES-NEXT: }205 206 if (cond("return"))207 return;208 // CHECK-MESSAGES: :[[@LINE-2]]:22: warning: statement should be inside braces209 // CHECK-FIXES: if (cond("return")) {210 // CHECK-FIXES-NEXT: return;211 // CHECK-FIXES-NEXT: }212 213 while (cond("break and continue")) {214 // CHECK-FIXES: while (cond("break and continue")) {215 if (true)216 break;217 // CHECK-MESSAGES: :[[@LINE-2]]:14: warning: statement should be inside braces218 // CHECK-FIXES: {{^}} if (true) {{{$}}219 // CHECK-FIXES-NEXT: {{^}} break;{{$}}220 // CHECK-FIXES-NEXT: {{^ *}}}{{$}}221 if (false)222 continue;223 // CHECK-MESSAGES: :[[@LINE-2]]:15: warning: statement should be inside braces224 // CHECK-FIXES: {{^}} if (false) {{{$}}225 // CHECK-FIXES-NEXT: {{^}} continue;{{$}}226 // CHECK-FIXES-NEXT: {{^ *}}}{{$}}227 } //end228 // CHECK-FIXES: } //end229 230 if (cond("decl 1"))231 int s;232 else233 int t;234 // CHECK-MESSAGES: :[[@LINE-4]]:22: warning: statement should be inside braces235 // CHECK-MESSAGES: :[[@LINE-3]]:7: warning: statement should be inside braces236 // CHECK-FIXES: if (cond("decl 1")) {237 // CHECK-FIXES-NEXT: int s;238 // CHECK-FIXES-NEXT: } else {239 // CHECK-FIXES-NEXT: int t;240 // CHECK-FIXES-NEXT: }241 242 if (cond("decl 2"))243 int s = (5);244 else245 int t = (5);246 // CHECK-MESSAGES: :[[@LINE-4]]:22: warning: statement should be inside braces247 // CHECK-MESSAGES: :[[@LINE-3]]:7: warning: statement should be inside braces248 // CHECK-FIXES: if (cond("decl 2")) {249 // CHECK-FIXES-NEXT: int s = (5);250 // CHECK-FIXES-NEXT: } else {251 // CHECK-FIXES-NEXT: int t = (5);252 // CHECK-FIXES-NEXT: }253 254 if (cond("decl 3"))255 int s = {6};256 else257 int t = {6};258 // CHECK-MESSAGES: :[[@LINE-4]]:22: warning: statement should be inside braces259 // CHECK-MESSAGES: :[[@LINE-3]]:7: warning: statement should be inside braces260 // CHECK-FIXES: if (cond("decl 3")) {261 // CHECK-FIXES-NEXT: int s = {6};262 // CHECK-FIXES-NEXT: } else {263 // CHECK-FIXES-NEXT: int t = {6};264 // CHECK-FIXES-NEXT: }265}266 267void test_whitespace() {268 while(cond("preserve empty lines"))269 if(cond("using continue within if"))270 continue;271 272 273 test();274 275 // CHECK-MESSAGES: :[[@LINE-7]]:{{[0-9]+}}: warning: statement should be inside braces276 // CHECK-MESSAGES: :[[@LINE-7]]:{{[0-9]+}}: warning: statement should be inside braces277 // CHECK-FIXES: {{^}} while(cond("preserve empty lines")) {{{$}}278 // CHECK-FIXES-NEXT: {{^}} if(cond("using continue within if")) {{{$}}279 // CHECK-FIXES-NEXT: {{^ continue;$}}280 // The closing brace is added at beginning of line, clang-format can be281 // applied afterwards.282 // CHECK-FIXES-NEXT: {{^}$}}283 // CHECK-FIXES-NEXT: {{^}$}}284 // Following whitespace is assumed to not to belong to the else branch.285 // However the check is not possible with CHECK-FIXES-NEXT.286 // CHECK-FIXES: {{^}} test();{{$}}287 288 if (cond("preserve empty lines"))289 290 291 int s;292 293 294 else295 296 297 int t;298 299 300 test();301 302 // CHECK-MESSAGES: :[[@LINE-14]]:{{[0-9]+}}: warning: statement should be inside braces303 // CHECK-MESSAGES: :[[@LINE-9]]:{{[0-9]+}}: warning: statement should be inside braces304 // CHECK-FIXES: {{^}} if (cond("preserve empty lines")) {{{$}}305 // CHECK-FIXES-NEXT: {{^ $}}306 // CHECK-FIXES-NEXT: {{^ $}}307 // CHECK-FIXES-NEXT: {{^ int s;$}}308 // CHECK-FIXES-NEXT: {{^ $}}309 // CHECK-FIXES-NEXT: {{^ $}}310 // CHECK-FIXES-NEXT: {{^ } else {$}}311 // CHECK-FIXES-NEXT: {{^ $}}312 // CHECK-FIXES-NEXT: {{^ $}}313 // CHECK-FIXES-NEXT: {{^ int t;$}}314 // The closing brace is added at beginning of line, clang-format can be315 // applied afterwards.316 // CHECK-FIXES-NEXT: {{^}$}}317 // Following whitespace is assumed to not to belong to the else branch.318 // CHECK-FIXES-NEXT: {{^ $}}319 // CHECK-FIXES-NEXT: {{^ $}}320 // CHECK-FIXES-NEXT: {{^}} test();{{$}}321}322 323int test_return_int() {324 if (cond("return5"))325 return 5;326 // CHECK-MESSAGES: :[[@LINE-2]]:23: warning: statement should be inside braces327 // CHECK-FIXES: if (cond("return5")) {328 // CHECK-FIXES-NEXT: return 5;329 // CHECK-FIXES-NEXT: }330 331 if (cond("return{6}"))332 return {6};333 // CHECK-MESSAGES: :[[@LINE-2]]:25: warning: statement should be inside braces334 // CHECK-FIXES: if (cond("return{6}")) {335 // CHECK-FIXES-NEXT: return {6};336 // CHECK-FIXES-NEXT: }337 338 // From https://bugs.llvm.org/show_bug.cgi?id=25970339 if (cond("25970")) return {25970};340 return {!25970};341 // CHECK-MESSAGES: :[[@LINE-2]]:21: warning: statement should be inside braces342 // CHECK-FIXES: if (cond("25970")) { return {25970};343 // CHECK-FIXES-NEXT: }344 // CHECK-FIXES-NEXT: return {!25970};345}346 347void f(const char *p) {348 if (!p)349 f("\350");351} // end of f352// CHECK-MESSAGES: :[[@LINE-4]]:10: warning: statement should be inside braces353// CHECK-FIXES: {{^}} if (!p) {{{$}}354// CHECK-FIXES-NEXT: {{^}} f("\{{$}}355// CHECK-FIXES-NEXT: {{^}}");{{$}}356// CHECK-FIXES-NEXT: {{^}}}{{$}}357// CHECK-FIXES-NEXT: {{^}}} // end of f{{$}}358 359#define M(x) x360 361int test_macros(bool b) {362 if (b) {363 return 1;364 } else365 M(return 2);366 // CHECK-MESSAGES: :[[@LINE-2]]:9: warning: statement should be inside braces367 // CHECK-FIXES: } else {368 // CHECK-FIXES-NEXT: M(return 2);369 // CHECK-FIXES-NEXT: }370 M(371 for (;;)372 ;373 );374 // CHECK-MESSAGES: :[[@LINE-3]]:13: warning: statement should be inside braces375 // CHECK-FIXES: {{^}} for (;;) {{{$}}376 // CHECK-FIXES-NEXT: {{^ ;$}}377 // CHECK-FIXES-NEXT: {{^}$}}378 379 380 #define WRAP(X) { X; }381 // This is to ensure no other CHECK-FIXES matches the macro definition:382 // CHECK-FIXES: #define WRAP(X) { X; }383 384 // Use-case: LLVM_DEBUG({ for(...) do_something(); });385 WRAP({386 for (;;)387 do_something("for in wrapping macro 1");388 });389 // CHECK-MESSAGES: :[[@LINE-3]]:13: warning: statement should be inside braces390 // CHECK-FIXES: for (;;) {391 // CHECK-FIXES-NEXT: do_something("for in wrapping macro 1");392 // CHECK-FIXES-NEXT: }393 394 // Use-case: LLVM_DEBUG( for(...) do_something(); );395 WRAP(396 for (;;)397 do_something("for in wrapping macro 2");398 );399 // CHECK-MESSAGES: :[[@LINE-3]]:13: warning: statement should be inside braces400 // CHECK-FIXES: for (;;) {401 // CHECK-FIXES-NEXT: do_something("for in wrapping macro 2");402 // CHECK-FIXES-NEXT: }403 404 // Use-case: LLVM_DEBUG( for(...) do_something() );405 // This is not supported and this test ensure it's correctly not changed.406 // We don't want to add the `}` into the Macro and there is no other way407 // to add it except for introduction of a NullStmt.408 WRAP(409 for (;;)410 do_something("for in wrapping macro 3")411 );412 // CHECK-MESSAGES: :[[@LINE-3]]:13: warning: statement should be inside braces413 // CHECK-FIXES: WRAP(414 // CHECK-FIXES-NEXT: for (;;)415 // CHECK-FIXES-NEXT: do_something("for in wrapping macro 3")416 // CHECK-FIXES-NEXT: );417 418 // Taken from https://bugs.llvm.org/show_bug.cgi?id=22785419 int i;420 #define MACRO_1 i++421 #define MACRO_2422 if( i % 3) i--;423 else if( i % 2) MACRO_1;424 else MACRO_2;425 // CHECK-MESSAGES: :[[@LINE-3]]:13: warning: statement should be inside braces426 // CHECK-MESSAGES: :[[@LINE-3]]:18: warning: statement should be inside braces427 // CHECK-MESSAGES: :[[@LINE-3]]:7: warning: statement should be inside braces428 // CHECK-FIXES: if( i % 3) { i--;429 // CHECK-FIXES-NEXT: } else if( i % 2) { MACRO_1;430 // CHECK-FIXES-NEXT: } else { MACRO_2;431 // CHECK-FIXES-NEXT: }432 433 // Taken from https://bugs.llvm.org/show_bug.cgi?id=22785434 #define M(x) x435 436 if (b)437 return 1;438 else439 return 2;440 // CHECK-MESSAGES: :[[@LINE-4]]:9: warning: statement should be inside braces441 // CHECK-MESSAGES: :[[@LINE-3]]:7: warning: statement should be inside braces442 // CHECK-FIXES: if (b) {443 // CHECK-FIXES-NEXT: return 1;444 // CHECK-FIXES-NEXT: } else {445 // CHECK-FIXES-NEXT: return 2;446 // CHECK-FIXES-NEXT: }447 448 if (b)449 return 1;450 else451 M(return 2);452 // CHECK-MESSAGES: :[[@LINE-4]]:9: warning: statement should be inside braces453 // CHECK-MESSAGES: :[[@LINE-3]]:7: warning: statement should be inside braces454 // CHECK-FIXES: if (b) {455 // CHECK-FIXES-NEXT: return 1;456 // CHECK-FIXES-NEXT: } else {457 // CHECK-FIXES-NEXT: M(return 2);458 // CHECK-FIXES-NEXT: }459 460}461 462template <bool A>463auto constexpr_lambda_1 = [] {464 if constexpr (A) {465 1;466 }467};468 469template <bool A>470auto constexpr_lambda_2 = [] {471 // CHECK-MESSAGES: :[[@LINE+1]]:19: warning: statement should be inside braces472 if constexpr (A)473 1;474 // CHECK-FIXES:if constexpr (A) {475 // CHECK-FIXES-NEXT:1;476 // CHECK-FIXES-NEXT:}477};478 479void test_constexpr() {480 constexpr_lambda_1<false>();481 constexpr_lambda_2<false>();482}483