1 //===- unittest/Format/BracesRemoverTest.cpp ------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "clang/Format/Format.h" 10 11 #include "../Tooling/ReplacementTest.h" 12 #include "FormatTestUtils.h" 13 14 #define DEBUG_TYPE "braces-remover-test" 15 16 namespace clang { 17 namespace format { 18 namespace { 19 20 // TODO: 21 // Refactor the class declaration, which is copied from BracesInserterTest.cpp. 22 class BracesRemoverTest : public ::testing::Test { 23 protected: 24 std::string format(llvm::StringRef Code, const FormatStyle &Style, 25 const std::vector<tooling::Range> &Ranges) { 26 LLVM_DEBUG(llvm::errs() << "---\n"); 27 LLVM_DEBUG(llvm::errs() << Code << "\n\n"); 28 auto NonEmptyRanges = Ranges; 29 if (Ranges.empty()) 30 NonEmptyRanges = {1, tooling::Range(0, Code.size())}; 31 FormattingAttemptStatus Status; 32 tooling::Replacements Replaces = 33 reformat(Style, Code, NonEmptyRanges, "<stdin>", &Status); 34 EXPECT_EQ(true, Status.FormatComplete) << Code << "\n\n"; 35 ReplacementCount = Replaces.size(); 36 auto Result = applyAllReplacements(Code, Replaces); 37 EXPECT_TRUE(static_cast<bool>(Result)); 38 LLVM_DEBUG(llvm::errs() << "\n" << *Result << "\n\n"); 39 return *Result; 40 } 41 42 void _verifyFormat(const char *File, int Line, llvm::StringRef Expected, 43 llvm::StringRef Code, 44 const FormatStyle &Style = getLLVMStyle(), 45 const std::vector<tooling::Range> &Ranges = {}) { 46 testing::ScopedTrace t(File, Line, ::testing::Message() << Code.str()); 47 EXPECT_EQ(Expected.str(), format(Expected, Style, Ranges)) 48 << "Expected code is not stable"; 49 EXPECT_EQ(Expected.str(), format(Code, Style, Ranges)); 50 if (Style.Language == FormatStyle::LK_Cpp && Ranges.empty()) { 51 // Objective-C++ is a superset of C++, so everything checked for C++ 52 // needs to be checked for Objective-C++ as well. 53 FormatStyle ObjCStyle = Style; 54 ObjCStyle.Language = FormatStyle::LK_ObjC; 55 EXPECT_EQ(Expected.str(), format(test::messUp(Code), ObjCStyle, Ranges)); 56 } 57 } 58 59 void _verifyFormat(const char *File, int Line, llvm::StringRef Code, 60 const FormatStyle &Style = getLLVMStyle(), 61 const std::vector<tooling::Range> &Ranges = {}) { 62 _verifyFormat(File, Line, Code, Code, Style, Ranges); 63 } 64 65 int ReplacementCount; 66 }; 67 68 #define verifyFormat(...) _verifyFormat(__FILE__, __LINE__, __VA_ARGS__) 69 70 TEST_F(BracesRemoverTest, RemoveBraces) { 71 FormatStyle Style = getLLVMStyle(); 72 Style.RemoveBracesLLVM = true; 73 74 // The following test cases are fully-braced versions of the examples at 75 // "llvm.org/docs/CodingStandards.html#don-t-use-braces-on-simple-single- 76 // statement-bodies-of-if-else-loop-statements". 77 78 // Omit the braces since the body is simple and clearly associated with the 79 // `if`. 80 verifyFormat("if (isa<FunctionDecl>(D))\n" 81 " handleFunctionDecl(D);\n" 82 "else if (isa<VarDecl>(D))\n" 83 " handleVarDecl(D);", 84 "if (isa<FunctionDecl>(D)) {\n" 85 " handleFunctionDecl(D);\n" 86 "} else if (isa<VarDecl>(D)) {\n" 87 " handleVarDecl(D);\n" 88 "}", 89 Style); 90 91 // Here we document the condition itself and not the body. 92 verifyFormat("if (isa<VarDecl>(D)) {\n" 93 " // It is necessary that we explain the situation with this\n" 94 " // surprisingly long comment, so it would be unclear\n" 95 " // without the braces whether the following statement is in\n" 96 " // the scope of the `if`.\n" 97 " // Because the condition is documented, we can't really\n" 98 " // hoist this comment that applies to the body above the\n" 99 " // `if`.\n" 100 " handleOtherDecl(D);\n" 101 "}", 102 Style); 103 104 // Use braces on the outer `if` to avoid a potential dangling `else` 105 // situation. 106 verifyFormat("if (isa<VarDecl>(D)) {\n" 107 " if (shouldProcessAttr(A))\n" 108 " handleAttr(A);\n" 109 "}", 110 "if (isa<VarDecl>(D)) {\n" 111 " if (shouldProcessAttr(A)) {\n" 112 " handleAttr(A);\n" 113 " }\n" 114 "}", 115 Style); 116 117 // Use braces for the `if` block to keep it uniform with the `else` block. 118 verifyFormat("if (isa<FunctionDecl>(D)) {\n" 119 " handleFunctionDecl(D);\n" 120 "} else {\n" 121 " // In this `else` case, it is necessary that we explain the\n" 122 " // situation with this surprisingly long comment, so it\n" 123 " // would be unclear without the braces whether the\n" 124 " // following statement is in the scope of the `if`.\n" 125 " handleOtherDecl(D);\n" 126 "}", 127 Style); 128 129 // This should also omit braces. The `for` loop contains only a single 130 // statement, so it shouldn't have braces. The `if` also only contains a 131 // single simple statement (the `for` loop), so it also should omit braces. 132 verifyFormat("if (isa<FunctionDecl>(D))\n" 133 " for (auto *A : D.attrs())\n" 134 " handleAttr(A);", 135 "if (isa<FunctionDecl>(D)) {\n" 136 " for (auto *A : D.attrs()) {\n" 137 " handleAttr(A);\n" 138 " }\n" 139 "}", 140 Style); 141 142 // Use braces for a `do-while` loop and its enclosing statement. 143 verifyFormat("if (Tok->is(tok::l_brace)) {\n" 144 " do {\n" 145 " Tok = Tok->Next;\n" 146 " } while (Tok);\n" 147 "}", 148 Style); 149 150 // Use braces for the outer `if` since the nested `for` is braced. 151 verifyFormat("if (isa<FunctionDecl>(D)) {\n" 152 " for (auto *A : D.attrs()) {\n" 153 " // In this `for` loop body, it is necessary that we\n" 154 " // explain the situation with this surprisingly long\n" 155 " // comment, forcing braces on the `for` block.\n" 156 " handleAttr(A);\n" 157 " }\n" 158 "}", 159 Style); 160 161 // Use braces on the outer block because there are more than two levels of 162 // nesting. 163 verifyFormat("if (isa<FunctionDecl>(D)) {\n" 164 " for (auto *A : D.attrs())\n" 165 " for (ssize_t i : llvm::seq<ssize_t>(count))\n" 166 " handleAttrOnDecl(D, A, i);\n" 167 "}", 168 "if (isa<FunctionDecl>(D)) {\n" 169 " for (auto *A : D.attrs()) {\n" 170 " for (ssize_t i : llvm::seq<ssize_t>(count)) {\n" 171 " handleAttrOnDecl(D, A, i);\n" 172 " }\n" 173 " }\n" 174 "}", 175 Style); 176 177 // Use braces on the outer block because of a nested `if`; otherwise the 178 // compiler would warn: `add explicit braces to avoid dangling else` 179 verifyFormat("if (auto *D = dyn_cast<FunctionDecl>(D)) {\n" 180 " if (shouldProcess(D))\n" 181 " handleVarDecl(D);\n" 182 " else\n" 183 " markAsIgnored(D);\n" 184 "}", 185 "if (auto *D = dyn_cast<FunctionDecl>(D)) {\n" 186 " if (shouldProcess(D)) {\n" 187 " handleVarDecl(D);\n" 188 " } else {\n" 189 " markAsIgnored(D);\n" 190 " }\n" 191 "}", 192 Style); 193 194 verifyFormat("// clang-format off\n" 195 "// comment\n" 196 "while (i > 0) { --i; }\n" 197 "// clang-format on\n" 198 "while (j < 0)\n" 199 " ++j;", 200 "// clang-format off\n" 201 "// comment\n" 202 "while (i > 0) { --i; }\n" 203 "// clang-format on\n" 204 "while (j < 0) { ++j; }", 205 Style); 206 207 verifyFormat("for (;;) {\n" 208 " for (;;)\n" 209 " for (;;)\n" 210 " a;\n" 211 "}", 212 "for (;;) {\n" 213 " for (;;) {\n" 214 " for (;;) {\n" 215 " a;\n" 216 " }\n" 217 " }\n" 218 "}", 219 Style); 220 221 verifyFormat("if (a)\n" 222 " b; // comment\n" 223 "else if (c)\n" 224 " d; /* comment */\n" 225 "else\n" 226 " e;", 227 "if (a) {\n" 228 " b; // comment\n" 229 "} else if (c) {\n" 230 " d; /* comment */\n" 231 "} else {\n" 232 " e;\n" 233 "}", 234 Style); 235 236 verifyFormat("if (a) {\n" 237 " b;\n" 238 " c;\n" 239 "} else if (d) {\n" 240 " e;\n" 241 "}", 242 Style); 243 244 verifyFormat("if (a) {\n" 245 "#undef NDEBUG\n" 246 " b;\n" 247 "} else {\n" 248 " c;\n" 249 "}", 250 Style); 251 252 verifyFormat("if (a) {\n" 253 " // comment\n" 254 "} else if (b) {\n" 255 " c;\n" 256 "}", 257 Style); 258 259 verifyFormat("if (a) {\n" 260 " b;\n" 261 "} else {\n" 262 " { c; }\n" 263 "}", 264 Style); 265 266 verifyFormat("if (a) {\n" 267 " if (b) // comment\n" 268 " c;\n" 269 "} else if (d) {\n" 270 " e;\n" 271 "}", 272 "if (a) {\n" 273 " if (b) { // comment\n" 274 " c;\n" 275 " }\n" 276 "} else if (d) {\n" 277 " e;\n" 278 "}", 279 Style); 280 281 verifyFormat("if (a) {\n" 282 " if (b) {\n" 283 " c;\n" 284 " // comment\n" 285 " } else if (d) {\n" 286 " e;\n" 287 " }\n" 288 "}", 289 Style); 290 291 verifyFormat("if (a) {\n" 292 " if (b)\n" 293 " c;\n" 294 "}", 295 "if (a) {\n" 296 " if (b) {\n" 297 " c;\n" 298 " }\n" 299 "}", 300 Style); 301 302 verifyFormat("if (a)\n" 303 " if (b)\n" 304 " c;\n" 305 " else\n" 306 " d;\n" 307 "else\n" 308 " e;", 309 "if (a) {\n" 310 " if (b) {\n" 311 " c;\n" 312 " } else {\n" 313 " d;\n" 314 " }\n" 315 "} else {\n" 316 " e;\n" 317 "}", 318 Style); 319 320 verifyFormat("if (a) {\n" 321 " // comment\n" 322 " if (b)\n" 323 " c;\n" 324 " else if (d)\n" 325 " e;\n" 326 "} else {\n" 327 " g;\n" 328 "}", 329 "if (a) {\n" 330 " // comment\n" 331 " if (b) {\n" 332 " c;\n" 333 " } else if (d) {\n" 334 " e;\n" 335 " }\n" 336 "} else {\n" 337 " g;\n" 338 "}", 339 Style); 340 341 verifyFormat("if (a)\n" 342 " b;\n" 343 "else if (c)\n" 344 " d;\n" 345 "else\n" 346 " e;", 347 "if (a) {\n" 348 " b;\n" 349 "} else {\n" 350 " if (c) {\n" 351 " d;\n" 352 " } else {\n" 353 " e;\n" 354 " }\n" 355 "}", 356 Style); 357 358 verifyFormat("if (a) {\n" 359 " if (b)\n" 360 " c;\n" 361 " else if (d)\n" 362 " e;\n" 363 "} else {\n" 364 " g;\n" 365 "}", 366 "if (a) {\n" 367 " if (b)\n" 368 " c;\n" 369 " else {\n" 370 " if (d)\n" 371 " e;\n" 372 " }\n" 373 "} else {\n" 374 " g;\n" 375 "}", 376 Style); 377 378 verifyFormat("if (isa<VarDecl>(D)) {\n" 379 " for (auto *A : D.attrs())\n" 380 " if (shouldProcessAttr(A))\n" 381 " handleAttr(A);\n" 382 "}", 383 "if (isa<VarDecl>(D)) {\n" 384 " for (auto *A : D.attrs()) {\n" 385 " if (shouldProcessAttr(A)) {\n" 386 " handleAttr(A);\n" 387 " }\n" 388 " }\n" 389 "}", 390 Style); 391 392 verifyFormat("do {\n" 393 " ++I;\n" 394 "} while (hasMore() && Filter(*I));", 395 "do { ++I; } while (hasMore() && Filter(*I));", Style); 396 397 verifyFormat("if (a)\n" 398 " if (b)\n" 399 " c;\n" 400 " else {\n" 401 " if (d)\n" 402 " e;\n" 403 " }\n" 404 "else\n" 405 " f;", 406 Style); 407 408 verifyFormat("if (a)\n" 409 " if (b)\n" 410 " c;\n" 411 " else {\n" 412 " if (d)\n" 413 " e;\n" 414 " else if (f)\n" 415 " g;\n" 416 " }\n" 417 "else\n" 418 " h;", 419 Style); 420 421 verifyFormat("if (a) {\n" 422 " b;\n" 423 "} else if (c) {\n" 424 " d;\n" 425 " e;\n" 426 "}", 427 "if (a) {\n" 428 " b;\n" 429 "} else {\n" 430 " if (c) {\n" 431 " d;\n" 432 " e;\n" 433 " }\n" 434 "}", 435 Style); 436 437 verifyFormat("if (a) {\n" 438 " b;\n" 439 " c;\n" 440 "} else if (d) {\n" 441 " e;\n" 442 " f;\n" 443 "}", 444 "if (a) {\n" 445 " b;\n" 446 " c;\n" 447 "} else {\n" 448 " if (d) {\n" 449 " e;\n" 450 " f;\n" 451 " }\n" 452 "}", 453 Style); 454 455 verifyFormat("if (a) {\n" 456 " b;\n" 457 "} else if (c) {\n" 458 " d;\n" 459 "} else {\n" 460 " e;\n" 461 " f;\n" 462 "}", 463 "if (a) {\n" 464 " b;\n" 465 "} else {\n" 466 " if (c) {\n" 467 " d;\n" 468 " } else {\n" 469 " e;\n" 470 " f;\n" 471 " }\n" 472 "}", 473 Style); 474 475 verifyFormat("if (a) {\n" 476 " b;\n" 477 "} else if (c) {\n" 478 " d;\n" 479 "} else if (e) {\n" 480 " f;\n" 481 " g;\n" 482 "}", 483 "if (a) {\n" 484 " b;\n" 485 "} else {\n" 486 " if (c) {\n" 487 " d;\n" 488 " } else if (e) {\n" 489 " f;\n" 490 " g;\n" 491 " }\n" 492 "}", 493 Style); 494 495 verifyFormat("if (a) {\n" 496 " if (b)\n" 497 " c;\n" 498 " else if (d) {\n" 499 " e;\n" 500 " f;\n" 501 " }\n" 502 "} else {\n" 503 " g;\n" 504 "}", 505 "if (a) {\n" 506 " if (b)\n" 507 " c;\n" 508 " else {\n" 509 " if (d) {\n" 510 " e;\n" 511 " f;\n" 512 " }\n" 513 " }\n" 514 "} else {\n" 515 " g;\n" 516 "}", 517 Style); 518 519 verifyFormat("if (a)\n" 520 " if (b)\n" 521 " c;\n" 522 " else {\n" 523 " if (d) {\n" 524 " e;\n" 525 " f;\n" 526 " }\n" 527 " }\n" 528 "else\n" 529 " g;", 530 Style); 531 532 verifyFormat("if (a) {\n" 533 " b;\n" 534 " c;\n" 535 "} else { // comment\n" 536 " if (d) {\n" 537 " e;\n" 538 " f;\n" 539 " }\n" 540 "}", 541 Style); 542 543 verifyFormat("if (a)\n" 544 " b;\n" 545 "else if (c)\n" 546 " while (d)\n" 547 " e;\n" 548 "// comment", 549 "if (a)\n" 550 "{\n" 551 " b;\n" 552 "} else if (c) {\n" 553 " while (d) {\n" 554 " e;\n" 555 " }\n" 556 "}\n" 557 "// comment", 558 Style); 559 560 verifyFormat("if (a) {\n" 561 " b;\n" 562 "} else if (c) {\n" 563 " d;\n" 564 "} else {\n" 565 " e;\n" 566 " g;\n" 567 "}", 568 Style); 569 570 verifyFormat("if (a) {\n" 571 " b;\n" 572 "} else if (c) {\n" 573 " d;\n" 574 "} else {\n" 575 " e;\n" 576 "} // comment", 577 Style); 578 579 verifyFormat("int abs = [](int i) {\n" 580 " if (i >= 0)\n" 581 " return i;\n" 582 " return -i;\n" 583 "};", 584 "int abs = [](int i) {\n" 585 " if (i >= 0) {\n" 586 " return i;\n" 587 " }\n" 588 " return -i;\n" 589 "};", 590 Style); 591 592 verifyFormat("if (a)\n" 593 " foo();\n" 594 "else\n" 595 " bar();", 596 "if (a)\n" 597 "{\n" 598 " foo();\n" 599 "}\n" 600 "else\n" 601 "{\n" 602 " bar();\n" 603 "}", 604 Style); 605 606 verifyFormat("if (a)\n" 607 " foo();\n" 608 "// comment\n" 609 "else\n" 610 " bar();", 611 "if (a) {\n" 612 " foo();\n" 613 "}\n" 614 "// comment\n" 615 "else {\n" 616 " bar();\n" 617 "}", 618 Style); 619 620 verifyFormat("if (a) {\n" 621 " if (b)\n" 622 " c = 1; // comment\n" 623 "}", 624 "if (a) {\n" 625 " if (b) {\n" 626 " c = 1; // comment\n" 627 " }\n" 628 "}", 629 Style); 630 631 verifyFormat("if (a) // comment\n" 632 " b = 1;", 633 "if (a) // comment\n" 634 "{\n" 635 " b = 1;\n" 636 "}", 637 Style); 638 639 verifyFormat("if (a) {\n" 640 "Label:\n" 641 "}", 642 Style); 643 644 verifyFormat("if (a) {\n" 645 "Label:\n" 646 " f();\n" 647 "}", 648 Style); 649 650 verifyFormat("if (a) {\n" 651 " f();\n" 652 "Label:\n" 653 "}", 654 Style); 655 656 verifyFormat("if consteval {\n" 657 " f();\n" 658 "} else {\n" 659 " g();\n" 660 "}", 661 Style); 662 663 verifyFormat("if not consteval {\n" 664 " f();\n" 665 "} else if (a) {\n" 666 " g();\n" 667 "}", 668 Style); 669 670 verifyFormat("if !consteval {\n" 671 " g();\n" 672 "}", 673 Style); 674 675 verifyFormat("while (0)\n" 676 " if (a)\n" 677 " return b;\n" 678 "return a;", 679 "while (0) {\n" 680 " if (a) {\n" 681 " return b;\n" 682 "}}\n" 683 "return a;", 684 Style); 685 686 verifyFormat("if (a)\n" 687 "#ifdef FOO\n" 688 " if (b)\n" 689 " bar = c;\n" 690 " else\n" 691 "#endif\n" 692 " {\n" 693 " foo = d;\n" 694 "#ifdef FOO\n" 695 " bar = e;\n" 696 "#else\n" 697 " bar = f;\n" // FIXME: should be indented 1 more level. 698 "#endif\n" 699 " }\n" 700 "else\n" 701 " bar = g;", 702 "if (a)\n" 703 "#ifdef FOO\n" 704 " if (b)\n" 705 " bar = c;\n" 706 " else\n" 707 "#endif\n" 708 " {\n" 709 " foo = d;\n" 710 "#ifdef FOO\n" 711 " bar = e;\n" 712 "#else\n" 713 " bar = f;\n" 714 "#endif\n" 715 " }\n" 716 "else {\n" 717 " bar = g;\n" 718 "}", 719 Style); 720 721 Style.ColumnLimit = 65; 722 verifyFormat("if (condition) {\n" 723 " ff(Indices,\n" 724 " [&](unsigned LHSI, unsigned RHSI) { return true; });\n" 725 "} else {\n" 726 " ff(Indices,\n" 727 " [&](unsigned LHSI, unsigned RHSI) { return true; });\n" 728 "}", 729 Style); 730 731 Style.ColumnLimit = 20; 732 733 verifyFormat("int i;\n" 734 "#define FOO(a, b) \\\n" 735 " while (a) { \\\n" 736 " b; \\\n" 737 " }", 738 Style); 739 740 verifyFormat("int ab = [](int i) {\n" 741 " if (i > 0) {\n" 742 " i = 12345678 -\n" 743 " i;\n" 744 " }\n" 745 " return i;\n" 746 "};", 747 Style); 748 749 verifyFormat("if (a) {\n" 750 " b = c + // 1 -\n" 751 " d;\n" 752 "}", 753 Style); 754 755 verifyFormat("if (a) {\n" 756 " b = c >= 0 ? d\n" 757 " : e;\n" 758 "}", 759 "if (a) {\n" 760 " b = c >= 0 ? d : e;\n" 761 "}", 762 Style); 763 764 verifyFormat("if (a)\n" 765 " b = c > 0 ? d : e;", 766 "if (a) {\n" 767 " b = c > 0 ? d : e;\n" 768 "}", 769 Style); 770 771 verifyFormat("if (-b >=\n" 772 " c) { // Keep.\n" 773 " foo();\n" 774 "} else {\n" 775 " bar();\n" 776 "}", 777 "if (-b >= c) { // Keep.\n" 778 " foo();\n" 779 "} else {\n" 780 " bar();\n" 781 "}", 782 Style); 783 784 verifyFormat("if (a) /* Remove. */\n" 785 " f();\n" 786 "else\n" 787 " g();", 788 "if (a) <% /* Remove. */\n" 789 " f();\n" 790 "%> else <%\n" 791 " g();\n" 792 "%>", 793 Style); 794 795 verifyFormat("while (\n" 796 " !i--) <% // Keep.\n" 797 " foo();\n" 798 "%>", 799 "while (!i--) <% // Keep.\n" 800 " foo();\n" 801 "%>", 802 Style); 803 804 verifyFormat("for (int &i : chars)\n" 805 " ++i;", 806 "for (int &i :\n" 807 " chars) {\n" 808 " ++i;\n" 809 "}", 810 Style); 811 812 verifyFormat("if (a)\n" 813 " b;\n" 814 "else if (c) {\n" 815 " d;\n" 816 " e;\n" 817 "} else\n" 818 " f = g(foo, bar,\n" 819 " baz);", 820 "if (a)\n" 821 " b;\n" 822 "else {\n" 823 " if (c) {\n" 824 " d;\n" 825 " e;\n" 826 " } else\n" 827 " f = g(foo, bar, baz);\n" 828 "}", 829 Style); 830 831 verifyFormat("if (foo)\n" 832 " f();\n" 833 "else if (bar || baz)\n" 834 " g();", 835 "if (foo) {\n" 836 " f();\n" 837 "} else if (bar || baz) {\n" 838 " g();\n" 839 "}", 840 Style); 841 842 Style.ColumnLimit = 0; 843 verifyFormat("if (a)\n" 844 " b234567890223456789032345678904234567890 = " 845 "c234567890223456789032345678904234567890;", 846 "if (a) {\n" 847 " b234567890223456789032345678904234567890 = " 848 "c234567890223456789032345678904234567890;\n" 849 "}", 850 Style); 851 852 Style.BreakBeforeBraces = FormatStyle::BS_Custom; 853 Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Always; 854 Style.BraceWrapping.BeforeElse = true; 855 856 Style.ColumnLimit = 65; 857 858 verifyFormat("if (condition)\n" 859 "{\n" 860 " ff(Indices,\n" 861 " [&](unsigned LHSI, unsigned RHSI) { return true; });\n" 862 "}\n" 863 "else\n" 864 "{\n" 865 " ff(Indices,\n" 866 " [&](unsigned LHSI, unsigned RHSI) { return true; });\n" 867 "}", 868 "if (condition) {\n" 869 " ff(Indices,\n" 870 " [&](unsigned LHSI, unsigned RHSI) { return true; });\n" 871 "} else {\n" 872 " ff(Indices,\n" 873 " [&](unsigned LHSI, unsigned RHSI) { return true; });\n" 874 "}", 875 Style); 876 877 verifyFormat("if (a)\n" 878 "{ //\n" 879 " foo();\n" 880 "}", 881 "if (a) { //\n" 882 " foo();\n" 883 "}", 884 Style); 885 886 verifyFormat("if (a) // comment\n" 887 " b = 1;", 888 "if (a) // comment\n" 889 "{\n" 890 " b = 1;\n" 891 "}", 892 Style); 893 894 Style.ColumnLimit = 20; 895 896 verifyFormat("int ab = [](int i) {\n" 897 " if (i > 0)\n" 898 " {\n" 899 " i = 12345678 -\n" 900 " i;\n" 901 " }\n" 902 " return i;\n" 903 "};", 904 "int ab = [](int i) {\n" 905 " if (i > 0) {\n" 906 " i = 12345678 -\n" 907 " i;\n" 908 " }\n" 909 " return i;\n" 910 "};", 911 Style); 912 913 verifyFormat("if (a)\n" 914 "{\n" 915 " b = c + // 1 -\n" 916 " d;\n" 917 "}", 918 "if (a) {\n" 919 " b = c + // 1 -\n" 920 " d;\n" 921 "}", 922 Style); 923 924 verifyFormat("if (a)\n" 925 "{\n" 926 " b = c >= 0 ? d\n" 927 " : e;\n" 928 "}", 929 "if (a) {\n" 930 " b = c >= 0 ? d : e;\n" 931 "}", 932 Style); 933 934 verifyFormat("if (a)\n" 935 " b = c > 0 ? d : e;", 936 "if (a)\n" 937 "{\n" 938 " b = c > 0 ? d : e;\n" 939 "}", 940 Style); 941 942 verifyFormat("if (foo + bar <=\n" 943 " baz)\n" 944 "{\n" 945 " func(arg1, arg2);\n" 946 "}", 947 "if (foo + bar <= baz) {\n" 948 " func(arg1, arg2);\n" 949 "}", 950 Style); 951 952 verifyFormat("if (foo + bar < baz)\n" 953 " func(arg1, arg2);\n" 954 "else\n" 955 " func();", 956 "if (foo + bar < baz)\n" 957 "<%\n" 958 " func(arg1, arg2);\n" 959 "%>\n" 960 "else\n" 961 "<%\n" 962 " func();\n" 963 "%>", 964 Style); 965 966 verifyFormat("while (i--)\n" 967 "<% // Keep.\n" 968 " foo();\n" 969 "%>", 970 "while (i--) <% // Keep.\n" 971 " foo();\n" 972 "%>", 973 Style); 974 975 verifyFormat("for (int &i : chars)\n" 976 " ++i;", 977 "for (int &i : chars)\n" 978 "{\n" 979 " ++i;\n" 980 "}", 981 Style); 982 } 983 984 } // namespace 985 } // namespace format 986 } // namespace clang 987