|  | //===- unittest/Format/BracesRemoverTest.cpp ------------------------------===// | 
|  | // | 
|  | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | 
|  | // See https://llvm.org/LICENSE.txt for license information. | 
|  | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #include "FormatTestBase.h" | 
|  |  | 
|  | #define DEBUG_TYPE "braces-remover-test" | 
|  |  | 
|  | namespace clang { | 
|  | namespace format { | 
|  | namespace test { | 
|  | namespace { | 
|  |  | 
|  | class BracesRemoverTest : public FormatTestBase {}; | 
|  |  | 
|  | TEST_F(BracesRemoverTest, RemoveBraces) { | 
|  | FormatStyle Style = getLLVMStyle(); | 
|  | Style.RemoveBracesLLVM = true; | 
|  |  | 
|  | // The following test cases are fully-braced versions of the examples at | 
|  | // "llvm.org/docs/CodingStandards.html#don-t-use-braces-on-simple-single- | 
|  | // statement-bodies-of-if-else-loop-statements". | 
|  |  | 
|  | // Omit the braces since the body is simple and clearly associated with the | 
|  | // `if`. | 
|  | verifyFormat("if (isa<FunctionDecl>(D))\n" | 
|  | "  handleFunctionDecl(D);\n" | 
|  | "else if (isa<VarDecl>(D))\n" | 
|  | "  handleVarDecl(D);", | 
|  | "if (isa<FunctionDecl>(D)) {\n" | 
|  | "  handleFunctionDecl(D);\n" | 
|  | "} else if (isa<VarDecl>(D)) {\n" | 
|  | "  handleVarDecl(D);\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | // Here we document the condition itself and not the body. | 
|  | verifyFormat("if (isa<VarDecl>(D)) {\n" | 
|  | "  // It is necessary that we explain the situation with this\n" | 
|  | "  // surprisingly long comment, so it would be unclear\n" | 
|  | "  // without the braces whether the following statement is in\n" | 
|  | "  // the scope of the `if`.\n" | 
|  | "  // Because the condition is documented, we can't really\n" | 
|  | "  // hoist this comment that applies to the body above the\n" | 
|  | "  // `if`.\n" | 
|  | "  handleOtherDecl(D);\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | // Use braces on the outer `if` to avoid a potential dangling `else` | 
|  | // situation. | 
|  | verifyFormat("if (isa<VarDecl>(D)) {\n" | 
|  | "  if (shouldProcessAttr(A))\n" | 
|  | "    handleAttr(A);\n" | 
|  | "}", | 
|  | "if (isa<VarDecl>(D)) {\n" | 
|  | "  if (shouldProcessAttr(A)) {\n" | 
|  | "    handleAttr(A);\n" | 
|  | "  }\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | // Use braces for the `if` block to keep it uniform with the `else` block. | 
|  | verifyFormat("if (isa<FunctionDecl>(D)) {\n" | 
|  | "  handleFunctionDecl(D);\n" | 
|  | "} else {\n" | 
|  | "  // In this `else` case, it is necessary that we explain the\n" | 
|  | "  // situation with this surprisingly long comment, so it\n" | 
|  | "  // would be unclear without the braces whether the\n" | 
|  | "  // following statement is in the scope of the `if`.\n" | 
|  | "  handleOtherDecl(D);\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | // This should also omit braces. The `for` loop contains only a single | 
|  | // statement, so it shouldn't have braces.  The `if` also only contains a | 
|  | // single simple statement (the `for` loop), so it also should omit braces. | 
|  | verifyFormat("if (isa<FunctionDecl>(D))\n" | 
|  | "  for (auto *A : D.attrs())\n" | 
|  | "    handleAttr(A);", | 
|  | "if (isa<FunctionDecl>(D)) {\n" | 
|  | "  for (auto *A : D.attrs()) {\n" | 
|  | "    handleAttr(A);\n" | 
|  | "  }\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | // Use braces for a `do-while` loop and its enclosing statement. | 
|  | verifyFormat("if (Tok->is(tok::l_brace)) {\n" | 
|  | "  do {\n" | 
|  | "    Tok = Tok->Next;\n" | 
|  | "  } while (Tok);\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | // Use braces for the outer `if` since the nested `for` is braced. | 
|  | verifyFormat("if (isa<FunctionDecl>(D)) {\n" | 
|  | "  for (auto *A : D.attrs()) {\n" | 
|  | "    // In this `for` loop body, it is necessary that we\n" | 
|  | "    // explain the situation with this surprisingly long\n" | 
|  | "    // comment, forcing braces on the `for` block.\n" | 
|  | "    handleAttr(A);\n" | 
|  | "  }\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | // Use braces on the outer block because there are more than two levels of | 
|  | // nesting. | 
|  | verifyFormat("if (isa<FunctionDecl>(D)) {\n" | 
|  | "  for (auto *A : D.attrs())\n" | 
|  | "    for (ssize_t i : llvm::seq<ssize_t>(count))\n" | 
|  | "      handleAttrOnDecl(D, A, i);\n" | 
|  | "}", | 
|  | "if (isa<FunctionDecl>(D)) {\n" | 
|  | "  for (auto *A : D.attrs()) {\n" | 
|  | "    for (ssize_t i : llvm::seq<ssize_t>(count)) {\n" | 
|  | "      handleAttrOnDecl(D, A, i);\n" | 
|  | "    }\n" | 
|  | "  }\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | // Use braces on the outer block because of a nested `if`; otherwise the | 
|  | // compiler would warn: `add explicit braces to avoid dangling else` | 
|  | verifyFormat("if (auto *D = dyn_cast<FunctionDecl>(D)) {\n" | 
|  | "  if (shouldProcess(D))\n" | 
|  | "    handleVarDecl(D);\n" | 
|  | "  else\n" | 
|  | "    markAsIgnored(D);\n" | 
|  | "}", | 
|  | "if (auto *D = dyn_cast<FunctionDecl>(D)) {\n" | 
|  | "  if (shouldProcess(D)) {\n" | 
|  | "    handleVarDecl(D);\n" | 
|  | "  } else {\n" | 
|  | "    markAsIgnored(D);\n" | 
|  | "  }\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("// clang-format off\n" | 
|  | "// comment\n" | 
|  | "while (i > 0) { --i; }\n" | 
|  | "// clang-format on\n" | 
|  | "while (j < 0)\n" | 
|  | "  ++j;", | 
|  | "// clang-format off\n" | 
|  | "// comment\n" | 
|  | "while (i > 0) { --i; }\n" | 
|  | "// clang-format on\n" | 
|  | "while (j < 0) { ++j; }", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("for (;;) {\n" | 
|  | "  for (;;)\n" | 
|  | "    for (;;)\n" | 
|  | "      a;\n" | 
|  | "}", | 
|  | "for (;;) {\n" | 
|  | "  for (;;) {\n" | 
|  | "    for (;;) {\n" | 
|  | "      a;\n" | 
|  | "    }\n" | 
|  | "  }\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (a)\n" | 
|  | "  b; // comment\n" | 
|  | "else if (c)\n" | 
|  | "  d; /* comment */\n" | 
|  | "else\n" | 
|  | "  e;", | 
|  | "if (a) {\n" | 
|  | "  b; // comment\n" | 
|  | "} else if (c) {\n" | 
|  | "  d; /* comment */\n" | 
|  | "} else {\n" | 
|  | "  e;\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (a) {\n" | 
|  | "  b;\n" | 
|  | "  c;\n" | 
|  | "} else if (d) {\n" | 
|  | "  e;\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (a) {\n" | 
|  | "#undef NDEBUG\n" | 
|  | "  b;\n" | 
|  | "} else {\n" | 
|  | "  c;\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (a) {\n" | 
|  | "  // comment\n" | 
|  | "} else if (b) {\n" | 
|  | "  c;\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (a) {\n" | 
|  | "  b;\n" | 
|  | "} else {\n" | 
|  | "  {\n" | 
|  | "    c;\n" | 
|  | "  }\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (a) {\n" | 
|  | "  if (b) // comment\n" | 
|  | "    c;\n" | 
|  | "} else if (d) {\n" | 
|  | "  e;\n" | 
|  | "}", | 
|  | "if (a) {\n" | 
|  | "  if (b) { // comment\n" | 
|  | "    c;\n" | 
|  | "  }\n" | 
|  | "} else if (d) {\n" | 
|  | "  e;\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (a) {\n" | 
|  | "  if (b) {\n" | 
|  | "    c;\n" | 
|  | "    // comment\n" | 
|  | "  } else if (d) {\n" | 
|  | "    e;\n" | 
|  | "  }\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (a) {\n" | 
|  | "  if (b)\n" | 
|  | "    c;\n" | 
|  | "}", | 
|  | "if (a) {\n" | 
|  | "  if (b) {\n" | 
|  | "    c;\n" | 
|  | "  }\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (a)\n" | 
|  | "  if (b)\n" | 
|  | "    c;\n" | 
|  | "  else\n" | 
|  | "    d;\n" | 
|  | "else\n" | 
|  | "  e;", | 
|  | "if (a) {\n" | 
|  | "  if (b) {\n" | 
|  | "    c;\n" | 
|  | "  } else {\n" | 
|  | "    d;\n" | 
|  | "  }\n" | 
|  | "} else {\n" | 
|  | "  e;\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (a) {\n" | 
|  | "  // comment\n" | 
|  | "  if (b)\n" | 
|  | "    c;\n" | 
|  | "  else if (d)\n" | 
|  | "    e;\n" | 
|  | "} else {\n" | 
|  | "  g;\n" | 
|  | "}", | 
|  | "if (a) {\n" | 
|  | "  // comment\n" | 
|  | "  if (b) {\n" | 
|  | "    c;\n" | 
|  | "  } else if (d) {\n" | 
|  | "    e;\n" | 
|  | "  }\n" | 
|  | "} else {\n" | 
|  | "  g;\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (a)\n" | 
|  | "  b;\n" | 
|  | "else if (c)\n" | 
|  | "  d;\n" | 
|  | "else\n" | 
|  | "  e;", | 
|  | "if (a) {\n" | 
|  | "  b;\n" | 
|  | "} else {\n" | 
|  | "  if (c) {\n" | 
|  | "    d;\n" | 
|  | "  } else {\n" | 
|  | "    e;\n" | 
|  | "  }\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (a) {\n" | 
|  | "  if (b)\n" | 
|  | "    c;\n" | 
|  | "  else if (d)\n" | 
|  | "    e;\n" | 
|  | "} else {\n" | 
|  | "  g;\n" | 
|  | "}", | 
|  | "if (a) {\n" | 
|  | "  if (b)\n" | 
|  | "    c;\n" | 
|  | "  else {\n" | 
|  | "    if (d)\n" | 
|  | "      e;\n" | 
|  | "  }\n" | 
|  | "} else {\n" | 
|  | "  g;\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (isa<VarDecl>(D)) {\n" | 
|  | "  for (auto *A : D.attrs())\n" | 
|  | "    if (shouldProcessAttr(A))\n" | 
|  | "      handleAttr(A);\n" | 
|  | "}", | 
|  | "if (isa<VarDecl>(D)) {\n" | 
|  | "  for (auto *A : D.attrs()) {\n" | 
|  | "    if (shouldProcessAttr(A)) {\n" | 
|  | "      handleAttr(A);\n" | 
|  | "    }\n" | 
|  | "  }\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("do {\n" | 
|  | "  ++I;\n" | 
|  | "} while (hasMore() && Filter(*I));", | 
|  | "do { ++I; } while (hasMore() && Filter(*I));", Style); | 
|  |  | 
|  | verifyFormat("if (a)\n" | 
|  | "  if (b)\n" | 
|  | "    c;\n" | 
|  | "  else {\n" | 
|  | "    if (d)\n" | 
|  | "      e;\n" | 
|  | "  }\n" | 
|  | "else\n" | 
|  | "  f;", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (a)\n" | 
|  | "  if (b)\n" | 
|  | "    c;\n" | 
|  | "  else {\n" | 
|  | "    if (d)\n" | 
|  | "      e;\n" | 
|  | "    else if (f)\n" | 
|  | "      g;\n" | 
|  | "  }\n" | 
|  | "else\n" | 
|  | "  h;", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (a) {\n" | 
|  | "  b;\n" | 
|  | "} else if (c) {\n" | 
|  | "  d;\n" | 
|  | "  e;\n" | 
|  | "}", | 
|  | "if (a) {\n" | 
|  | "  b;\n" | 
|  | "} else {\n" | 
|  | "  if (c) {\n" | 
|  | "    d;\n" | 
|  | "    e;\n" | 
|  | "  }\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (a) {\n" | 
|  | "  b;\n" | 
|  | "  c;\n" | 
|  | "} else if (d) {\n" | 
|  | "  e;\n" | 
|  | "  f;\n" | 
|  | "}", | 
|  | "if (a) {\n" | 
|  | "  b;\n" | 
|  | "  c;\n" | 
|  | "} else {\n" | 
|  | "  if (d) {\n" | 
|  | "    e;\n" | 
|  | "    f;\n" | 
|  | "  }\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (a) {\n" | 
|  | "  b;\n" | 
|  | "} else if (c) {\n" | 
|  | "  d;\n" | 
|  | "} else {\n" | 
|  | "  e;\n" | 
|  | "  f;\n" | 
|  | "}", | 
|  | "if (a) {\n" | 
|  | "  b;\n" | 
|  | "} else {\n" | 
|  | "  if (c) {\n" | 
|  | "    d;\n" | 
|  | "  } else {\n" | 
|  | "    e;\n" | 
|  | "    f;\n" | 
|  | "  }\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (a) {\n" | 
|  | "  b;\n" | 
|  | "} else if (c) {\n" | 
|  | "  d;\n" | 
|  | "} else if (e) {\n" | 
|  | "  f;\n" | 
|  | "  g;\n" | 
|  | "}", | 
|  | "if (a) {\n" | 
|  | "  b;\n" | 
|  | "} else {\n" | 
|  | "  if (c) {\n" | 
|  | "    d;\n" | 
|  | "  } else if (e) {\n" | 
|  | "    f;\n" | 
|  | "    g;\n" | 
|  | "  }\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (a) {\n" | 
|  | "  if (b)\n" | 
|  | "    c;\n" | 
|  | "  else if (d) {\n" | 
|  | "    e;\n" | 
|  | "    f;\n" | 
|  | "  }\n" | 
|  | "} else {\n" | 
|  | "  g;\n" | 
|  | "}", | 
|  | "if (a) {\n" | 
|  | "  if (b)\n" | 
|  | "    c;\n" | 
|  | "  else {\n" | 
|  | "    if (d) {\n" | 
|  | "      e;\n" | 
|  | "      f;\n" | 
|  | "    }\n" | 
|  | "  }\n" | 
|  | "} else {\n" | 
|  | "  g;\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (a)\n" | 
|  | "  if (b)\n" | 
|  | "    c;\n" | 
|  | "  else {\n" | 
|  | "    if (d) {\n" | 
|  | "      e;\n" | 
|  | "      f;\n" | 
|  | "    }\n" | 
|  | "  }\n" | 
|  | "else\n" | 
|  | "  g;", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (a) {\n" | 
|  | "  b;\n" | 
|  | "  c;\n" | 
|  | "} else { // comment\n" | 
|  | "  if (d) {\n" | 
|  | "    e;\n" | 
|  | "    f;\n" | 
|  | "  }\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (a)\n" | 
|  | "  b;\n" | 
|  | "else if (c)\n" | 
|  | "  while (d)\n" | 
|  | "    e;\n" | 
|  | "// comment", | 
|  | "if (a)\n" | 
|  | "{\n" | 
|  | "  b;\n" | 
|  | "} else if (c) {\n" | 
|  | "  while (d) {\n" | 
|  | "    e;\n" | 
|  | "  }\n" | 
|  | "}\n" | 
|  | "// comment", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (a) {\n" | 
|  | "  b;\n" | 
|  | "} else if (c) {\n" | 
|  | "  d;\n" | 
|  | "} else {\n" | 
|  | "  e;\n" | 
|  | "  g;\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (a) {\n" | 
|  | "  b;\n" | 
|  | "} else if (c) {\n" | 
|  | "  d;\n" | 
|  | "} else {\n" | 
|  | "  e;\n" | 
|  | "} // comment", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("int abs = [](int i) {\n" | 
|  | "  if (i >= 0)\n" | 
|  | "    return i;\n" | 
|  | "  return -i;\n" | 
|  | "};", | 
|  | "int abs = [](int i) {\n" | 
|  | "  if (i >= 0) {\n" | 
|  | "    return i;\n" | 
|  | "  }\n" | 
|  | "  return -i;\n" | 
|  | "};", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (a)\n" | 
|  | "  foo();\n" | 
|  | "else\n" | 
|  | "  bar();", | 
|  | "if (a)\n" | 
|  | "{\n" | 
|  | "  foo();\n" | 
|  | "}\n" | 
|  | "else\n" | 
|  | "{\n" | 
|  | "  bar();\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (a)\n" | 
|  | "  foo();\n" | 
|  | "// comment\n" | 
|  | "else\n" | 
|  | "  bar();", | 
|  | "if (a) {\n" | 
|  | "  foo();\n" | 
|  | "}\n" | 
|  | "// comment\n" | 
|  | "else {\n" | 
|  | "  bar();\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (a) {\n" | 
|  | "  if (b)\n" | 
|  | "    c = 1; // comment\n" | 
|  | "}", | 
|  | "if (a) {\n" | 
|  | "  if (b) {\n" | 
|  | "    c = 1; // comment\n" | 
|  | "  }\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (a) // comment\n" | 
|  | "  b = 1;", | 
|  | "if (a) // comment\n" | 
|  | "{\n" | 
|  | "  b = 1;\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (a) {\n" | 
|  | "Label:\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (a) {\n" | 
|  | "Label:\n" | 
|  | "  f();\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (a) {\n" | 
|  | "  f();\n" | 
|  | "Label:\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if consteval {\n" | 
|  | "  f();\n" | 
|  | "} else {\n" | 
|  | "  g();\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if not consteval {\n" | 
|  | "  f();\n" | 
|  | "} else if (a) {\n" | 
|  | "  g();\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if !consteval {\n" | 
|  | "  g();\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("while (0)\n" | 
|  | "  if (a)\n" | 
|  | "    return b;\n" | 
|  | "return a;", | 
|  | "while (0) {\n" | 
|  | "  if (a) {\n" | 
|  | "    return b;\n" | 
|  | "}}\n" | 
|  | "return a;", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (a)\n" | 
|  | "#ifdef FOO\n" | 
|  | "  if (b)\n" | 
|  | "    bar = c;\n" | 
|  | "  else\n" | 
|  | "#endif\n" | 
|  | "  {\n" | 
|  | "    foo = d;\n" | 
|  | "#ifdef FOO\n" | 
|  | "    bar = e;\n" | 
|  | "#else\n" | 
|  | "  bar = f;\n" // FIXME: should be indented 1 more level. | 
|  | "#endif\n" | 
|  | "  }\n" | 
|  | "else\n" | 
|  | "  bar = g;", | 
|  | "if (a)\n" | 
|  | "#ifdef FOO\n" | 
|  | "  if (b)\n" | 
|  | "    bar = c;\n" | 
|  | "  else\n" | 
|  | "#endif\n" | 
|  | "  {\n" | 
|  | "    foo = d;\n" | 
|  | "#ifdef FOO\n" | 
|  | "    bar = e;\n" | 
|  | "#else\n" | 
|  | "    bar = f;\n" | 
|  | "#endif\n" | 
|  | "  }\n" | 
|  | "else {\n" | 
|  | "  bar = g;\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | Style.ColumnLimit = 65; | 
|  | verifyFormat("if (condition) {\n" | 
|  | "  ff(Indices,\n" | 
|  | "     [&](unsigned LHSI, unsigned RHSI) { return true; });\n" | 
|  | "} else {\n" | 
|  | "  ff(Indices,\n" | 
|  | "     [&](unsigned LHSI, unsigned RHSI) { return true; });\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | Style.ColumnLimit = 20; | 
|  |  | 
|  | verifyFormat("int i;\n" | 
|  | "#define FOO(a, b)  \\\n" | 
|  | "  while (a) {      \\\n" | 
|  | "    b;             \\\n" | 
|  | "  }", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("int ab = [](int i) {\n" | 
|  | "  if (i > 0) {\n" | 
|  | "    i = 12345678 -\n" | 
|  | "        i;\n" | 
|  | "  }\n" | 
|  | "  return i;\n" | 
|  | "};", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (a) {\n" | 
|  | "  b = c + // 1 -\n" | 
|  | "      d;\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (a) {\n" | 
|  | "  b = c >= 0 ? d\n" | 
|  | "             : e;\n" | 
|  | "}", | 
|  | "if (a) {\n" | 
|  | "  b = c >= 0 ? d : e;\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (a)\n" | 
|  | "  b = c > 0 ? d : e;", | 
|  | "if (a) {\n" | 
|  | "  b = c > 0 ? d : e;\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (-b >=\n" | 
|  | "    c) { // Keep.\n" | 
|  | "  foo();\n" | 
|  | "} else {\n" | 
|  | "  bar();\n" | 
|  | "}", | 
|  | "if (-b >= c) { // Keep.\n" | 
|  | "  foo();\n" | 
|  | "} else {\n" | 
|  | "  bar();\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (a) /* Remove. */\n" | 
|  | "  f();\n" | 
|  | "else\n" | 
|  | "  g();", | 
|  | "if (a) <% /* Remove. */\n" | 
|  | "  f();\n" | 
|  | "%> else <%\n" | 
|  | "  g();\n" | 
|  | "%>", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("while (\n" | 
|  | "    !i--) <% // Keep.\n" | 
|  | "  foo();\n" | 
|  | "%>", | 
|  | "while (!i--) <% // Keep.\n" | 
|  | "  foo();\n" | 
|  | "%>", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("for (int &i : chars)\n" | 
|  | "  ++i;", | 
|  | "for (int &i :\n" | 
|  | "     chars) {\n" | 
|  | "  ++i;\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (a)\n" | 
|  | "  b;\n" | 
|  | "else if (c) {\n" | 
|  | "  d;\n" | 
|  | "  e;\n" | 
|  | "} else\n" | 
|  | "  f = g(foo, bar,\n" | 
|  | "        baz);", | 
|  | "if (a)\n" | 
|  | "  b;\n" | 
|  | "else {\n" | 
|  | "  if (c) {\n" | 
|  | "    d;\n" | 
|  | "    e;\n" | 
|  | "  } else\n" | 
|  | "    f = g(foo, bar, baz);\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (foo)\n" | 
|  | "  f();\n" | 
|  | "else if (bar || baz)\n" | 
|  | "  g();", | 
|  | "if (foo) {\n" | 
|  | "  f();\n" | 
|  | "} else if (bar || baz) {\n" | 
|  | "  g();\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | Style.ColumnLimit = 0; | 
|  | verifyFormat("if (a)\n" | 
|  | "  b234567890223456789032345678904234567890 = " | 
|  | "c234567890223456789032345678904234567890;", | 
|  | "if (a) {\n" | 
|  | "  b234567890223456789032345678904234567890 = " | 
|  | "c234567890223456789032345678904234567890;\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | Style.BreakBeforeBraces = FormatStyle::BS_Custom; | 
|  | Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Always; | 
|  | Style.BraceWrapping.BeforeElse = true; | 
|  |  | 
|  | Style.ColumnLimit = 65; | 
|  |  | 
|  | verifyFormat("if (condition)\n" | 
|  | "{\n" | 
|  | "  ff(Indices,\n" | 
|  | "     [&](unsigned LHSI, unsigned RHSI) { return true; });\n" | 
|  | "}\n" | 
|  | "else\n" | 
|  | "{\n" | 
|  | "  ff(Indices,\n" | 
|  | "     [&](unsigned LHSI, unsigned RHSI) { return true; });\n" | 
|  | "}", | 
|  | "if (condition) {\n" | 
|  | "  ff(Indices,\n" | 
|  | "     [&](unsigned LHSI, unsigned RHSI) { return true; });\n" | 
|  | "} else {\n" | 
|  | "  ff(Indices,\n" | 
|  | "     [&](unsigned LHSI, unsigned RHSI) { return true; });\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (a)\n" | 
|  | "{ //\n" | 
|  | "  foo();\n" | 
|  | "}", | 
|  | "if (a) { //\n" | 
|  | "  foo();\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (a) // comment\n" | 
|  | "  b = 1;", | 
|  | "if (a) // comment\n" | 
|  | "{\n" | 
|  | "  b = 1;\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | Style.ColumnLimit = 20; | 
|  |  | 
|  | verifyFormat("int ab = [](int i) {\n" | 
|  | "  if (i > 0)\n" | 
|  | "  {\n" | 
|  | "    i = 12345678 -\n" | 
|  | "        i;\n" | 
|  | "  }\n" | 
|  | "  return i;\n" | 
|  | "};", | 
|  | "int ab = [](int i) {\n" | 
|  | "  if (i > 0) {\n" | 
|  | "    i = 12345678 -\n" | 
|  | "        i;\n" | 
|  | "  }\n" | 
|  | "  return i;\n" | 
|  | "};", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (a)\n" | 
|  | "{\n" | 
|  | "  b = c + // 1 -\n" | 
|  | "      d;\n" | 
|  | "}", | 
|  | "if (a) {\n" | 
|  | "  b = c + // 1 -\n" | 
|  | "      d;\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (a)\n" | 
|  | "{\n" | 
|  | "  b = c >= 0 ? d\n" | 
|  | "             : e;\n" | 
|  | "}", | 
|  | "if (a) {\n" | 
|  | "  b = c >= 0 ? d : e;\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (a)\n" | 
|  | "  b = c > 0 ? d : e;", | 
|  | "if (a)\n" | 
|  | "{\n" | 
|  | "  b = c > 0 ? d : e;\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (foo + bar <=\n" | 
|  | "    baz)\n" | 
|  | "{\n" | 
|  | "  func(arg1, arg2);\n" | 
|  | "}", | 
|  | "if (foo + bar <= baz) {\n" | 
|  | "  func(arg1, arg2);\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (foo + bar < baz)\n" | 
|  | "  func(arg1, arg2);\n" | 
|  | "else\n" | 
|  | "  func();", | 
|  | "if (foo + bar < baz)\n" | 
|  | "<%\n" | 
|  | "  func(arg1, arg2);\n" | 
|  | "%>\n" | 
|  | "else\n" | 
|  | "<%\n" | 
|  | "  func();\n" | 
|  | "%>", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("while (i--)\n" | 
|  | "<% // Keep.\n" | 
|  | "  foo();\n" | 
|  | "%>", | 
|  | "while (i--) <% // Keep.\n" | 
|  | "  foo();\n" | 
|  | "%>", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("for (int &i : chars)\n" | 
|  | "  ++i;", | 
|  | "for (int &i : chars)\n" | 
|  | "{\n" | 
|  | "  ++i;\n" | 
|  | "}", | 
|  | Style); | 
|  | } | 
|  |  | 
|  | } // namespace | 
|  | } // namespace test | 
|  | } // namespace format | 
|  | } // namespace clang |