brintos

brintos / llvm-project-archived public Read only

0
0
Text · 14.7 KiB · f1bb4ed Raw
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