130ea3fccSowenca //===- unittest/Format/BracesRemoverTest.cpp ------------------------------===//
230ea3fccSowenca //
330ea3fccSowenca // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
430ea3fccSowenca // See https://llvm.org/LICENSE.txt for license information.
530ea3fccSowenca // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
630ea3fccSowenca //
730ea3fccSowenca //===----------------------------------------------------------------------===//
830ea3fccSowenca
9f8d10d5aSManuel Klimek #include "FormatTestBase.h"
1030ea3fccSowenca
1130ea3fccSowenca #define DEBUG_TYPE "braces-remover-test"
1230ea3fccSowenca
1330ea3fccSowenca namespace clang {
1430ea3fccSowenca namespace format {
15f8d10d5aSManuel Klimek namespace test {
1630ea3fccSowenca namespace {
1730ea3fccSowenca
18f8d10d5aSManuel Klimek class BracesRemoverTest : public FormatTestBase {};
1930ea3fccSowenca
TEST_F(BracesRemoverTest,RemoveBraces)2030ea3fccSowenca TEST_F(BracesRemoverTest, RemoveBraces) {
2130ea3fccSowenca FormatStyle Style = getLLVMStyle();
2230ea3fccSowenca Style.RemoveBracesLLVM = true;
2330ea3fccSowenca
2430ea3fccSowenca // The following test cases are fully-braced versions of the examples at
2530ea3fccSowenca // "llvm.org/docs/CodingStandards.html#don-t-use-braces-on-simple-single-
2630ea3fccSowenca // statement-bodies-of-if-else-loop-statements".
2730ea3fccSowenca
2830ea3fccSowenca // Omit the braces since the body is simple and clearly associated with the
2930ea3fccSowenca // `if`.
3030ea3fccSowenca verifyFormat("if (isa<FunctionDecl>(D))\n"
3130ea3fccSowenca " handleFunctionDecl(D);\n"
3230ea3fccSowenca "else if (isa<VarDecl>(D))\n"
3330ea3fccSowenca " handleVarDecl(D);",
3430ea3fccSowenca "if (isa<FunctionDecl>(D)) {\n"
3530ea3fccSowenca " handleFunctionDecl(D);\n"
3630ea3fccSowenca "} else if (isa<VarDecl>(D)) {\n"
3730ea3fccSowenca " handleVarDecl(D);\n"
3830ea3fccSowenca "}",
3930ea3fccSowenca Style);
4030ea3fccSowenca
4130ea3fccSowenca // Here we document the condition itself and not the body.
4230ea3fccSowenca verifyFormat("if (isa<VarDecl>(D)) {\n"
4330ea3fccSowenca " // It is necessary that we explain the situation with this\n"
4430ea3fccSowenca " // surprisingly long comment, so it would be unclear\n"
4530ea3fccSowenca " // without the braces whether the following statement is in\n"
4630ea3fccSowenca " // the scope of the `if`.\n"
4730ea3fccSowenca " // Because the condition is documented, we can't really\n"
4830ea3fccSowenca " // hoist this comment that applies to the body above the\n"
4930ea3fccSowenca " // `if`.\n"
5030ea3fccSowenca " handleOtherDecl(D);\n"
5130ea3fccSowenca "}",
5230ea3fccSowenca Style);
5330ea3fccSowenca
5430ea3fccSowenca // Use braces on the outer `if` to avoid a potential dangling `else`
5530ea3fccSowenca // situation.
5630ea3fccSowenca verifyFormat("if (isa<VarDecl>(D)) {\n"
5730ea3fccSowenca " if (shouldProcessAttr(A))\n"
5830ea3fccSowenca " handleAttr(A);\n"
5930ea3fccSowenca "}",
6030ea3fccSowenca "if (isa<VarDecl>(D)) {\n"
6130ea3fccSowenca " if (shouldProcessAttr(A)) {\n"
6230ea3fccSowenca " handleAttr(A);\n"
6330ea3fccSowenca " }\n"
6430ea3fccSowenca "}",
6530ea3fccSowenca Style);
6630ea3fccSowenca
6730ea3fccSowenca // Use braces for the `if` block to keep it uniform with the `else` block.
6830ea3fccSowenca verifyFormat("if (isa<FunctionDecl>(D)) {\n"
6930ea3fccSowenca " handleFunctionDecl(D);\n"
7030ea3fccSowenca "} else {\n"
7130ea3fccSowenca " // In this `else` case, it is necessary that we explain the\n"
7230ea3fccSowenca " // situation with this surprisingly long comment, so it\n"
7330ea3fccSowenca " // would be unclear without the braces whether the\n"
7430ea3fccSowenca " // following statement is in the scope of the `if`.\n"
7530ea3fccSowenca " handleOtherDecl(D);\n"
7630ea3fccSowenca "}",
7730ea3fccSowenca Style);
7830ea3fccSowenca
7930ea3fccSowenca // This should also omit braces. The `for` loop contains only a single
8030ea3fccSowenca // statement, so it shouldn't have braces. The `if` also only contains a
8130ea3fccSowenca // single simple statement (the `for` loop), so it also should omit braces.
8230ea3fccSowenca verifyFormat("if (isa<FunctionDecl>(D))\n"
8330ea3fccSowenca " for (auto *A : D.attrs())\n"
8430ea3fccSowenca " handleAttr(A);",
8530ea3fccSowenca "if (isa<FunctionDecl>(D)) {\n"
8630ea3fccSowenca " for (auto *A : D.attrs()) {\n"
8730ea3fccSowenca " handleAttr(A);\n"
8830ea3fccSowenca " }\n"
8930ea3fccSowenca "}",
9030ea3fccSowenca Style);
9130ea3fccSowenca
9230ea3fccSowenca // Use braces for a `do-while` loop and its enclosing statement.
9330ea3fccSowenca verifyFormat("if (Tok->is(tok::l_brace)) {\n"
9430ea3fccSowenca " do {\n"
9530ea3fccSowenca " Tok = Tok->Next;\n"
9630ea3fccSowenca " } while (Tok);\n"
9730ea3fccSowenca "}",
9830ea3fccSowenca Style);
9930ea3fccSowenca
10030ea3fccSowenca // Use braces for the outer `if` since the nested `for` is braced.
10130ea3fccSowenca verifyFormat("if (isa<FunctionDecl>(D)) {\n"
10230ea3fccSowenca " for (auto *A : D.attrs()) {\n"
10330ea3fccSowenca " // In this `for` loop body, it is necessary that we\n"
10430ea3fccSowenca " // explain the situation with this surprisingly long\n"
10530ea3fccSowenca " // comment, forcing braces on the `for` block.\n"
10630ea3fccSowenca " handleAttr(A);\n"
10730ea3fccSowenca " }\n"
10830ea3fccSowenca "}",
10930ea3fccSowenca Style);
11030ea3fccSowenca
11130ea3fccSowenca // Use braces on the outer block because there are more than two levels of
11230ea3fccSowenca // nesting.
11330ea3fccSowenca verifyFormat("if (isa<FunctionDecl>(D)) {\n"
11430ea3fccSowenca " for (auto *A : D.attrs())\n"
11530ea3fccSowenca " for (ssize_t i : llvm::seq<ssize_t>(count))\n"
11630ea3fccSowenca " handleAttrOnDecl(D, A, i);\n"
11730ea3fccSowenca "}",
11830ea3fccSowenca "if (isa<FunctionDecl>(D)) {\n"
11930ea3fccSowenca " for (auto *A : D.attrs()) {\n"
12030ea3fccSowenca " for (ssize_t i : llvm::seq<ssize_t>(count)) {\n"
12130ea3fccSowenca " handleAttrOnDecl(D, A, i);\n"
12230ea3fccSowenca " }\n"
12330ea3fccSowenca " }\n"
12430ea3fccSowenca "}",
12530ea3fccSowenca Style);
12630ea3fccSowenca
12730ea3fccSowenca // Use braces on the outer block because of a nested `if`; otherwise the
12830ea3fccSowenca // compiler would warn: `add explicit braces to avoid dangling else`
12930ea3fccSowenca verifyFormat("if (auto *D = dyn_cast<FunctionDecl>(D)) {\n"
13030ea3fccSowenca " if (shouldProcess(D))\n"
13130ea3fccSowenca " handleVarDecl(D);\n"
13230ea3fccSowenca " else\n"
13330ea3fccSowenca " markAsIgnored(D);\n"
13430ea3fccSowenca "}",
13530ea3fccSowenca "if (auto *D = dyn_cast<FunctionDecl>(D)) {\n"
13630ea3fccSowenca " if (shouldProcess(D)) {\n"
13730ea3fccSowenca " handleVarDecl(D);\n"
13830ea3fccSowenca " } else {\n"
13930ea3fccSowenca " markAsIgnored(D);\n"
14030ea3fccSowenca " }\n"
14130ea3fccSowenca "}",
14230ea3fccSowenca Style);
14330ea3fccSowenca
14430ea3fccSowenca verifyFormat("// clang-format off\n"
14530ea3fccSowenca "// comment\n"
14630ea3fccSowenca "while (i > 0) { --i; }\n"
14730ea3fccSowenca "// clang-format on\n"
14830ea3fccSowenca "while (j < 0)\n"
14930ea3fccSowenca " ++j;",
15030ea3fccSowenca "// clang-format off\n"
15130ea3fccSowenca "// comment\n"
15230ea3fccSowenca "while (i > 0) { --i; }\n"
15330ea3fccSowenca "// clang-format on\n"
15430ea3fccSowenca "while (j < 0) { ++j; }",
15530ea3fccSowenca Style);
15630ea3fccSowenca
157e33243c9SOwen Pan verifyFormat("for (;;) {\n"
158e33243c9SOwen Pan " for (;;)\n"
159e33243c9SOwen Pan " for (;;)\n"
160e33243c9SOwen Pan " a;\n"
161e33243c9SOwen Pan "}",
162e33243c9SOwen Pan "for (;;) {\n"
163e33243c9SOwen Pan " for (;;) {\n"
164e33243c9SOwen Pan " for (;;) {\n"
165e33243c9SOwen Pan " a;\n"
166e33243c9SOwen Pan " }\n"
167e33243c9SOwen Pan " }\n"
168e33243c9SOwen Pan "}",
169e33243c9SOwen Pan Style);
170e33243c9SOwen Pan
17130ea3fccSowenca verifyFormat("if (a)\n"
17230ea3fccSowenca " b; // comment\n"
17330ea3fccSowenca "else if (c)\n"
17430ea3fccSowenca " d; /* comment */\n"
17530ea3fccSowenca "else\n"
17630ea3fccSowenca " e;",
17730ea3fccSowenca "if (a) {\n"
17830ea3fccSowenca " b; // comment\n"
17930ea3fccSowenca "} else if (c) {\n"
18030ea3fccSowenca " d; /* comment */\n"
18130ea3fccSowenca "} else {\n"
18230ea3fccSowenca " e;\n"
18330ea3fccSowenca "}",
18430ea3fccSowenca Style);
18530ea3fccSowenca
18630ea3fccSowenca verifyFormat("if (a) {\n"
18730ea3fccSowenca " b;\n"
18830ea3fccSowenca " c;\n"
18930ea3fccSowenca "} else if (d) {\n"
19030ea3fccSowenca " e;\n"
19130ea3fccSowenca "}",
19230ea3fccSowenca Style);
19330ea3fccSowenca
19430ea3fccSowenca verifyFormat("if (a) {\n"
19530ea3fccSowenca "#undef NDEBUG\n"
19630ea3fccSowenca " b;\n"
19730ea3fccSowenca "} else {\n"
19830ea3fccSowenca " c;\n"
19930ea3fccSowenca "}",
20030ea3fccSowenca Style);
20130ea3fccSowenca
20230ea3fccSowenca verifyFormat("if (a) {\n"
20330ea3fccSowenca " // comment\n"
20430ea3fccSowenca "} else if (b) {\n"
20530ea3fccSowenca " c;\n"
20630ea3fccSowenca "}",
20730ea3fccSowenca Style);
20830ea3fccSowenca
20930ea3fccSowenca verifyFormat("if (a) {\n"
21030ea3fccSowenca " b;\n"
21130ea3fccSowenca "} else {\n"
212*51f16814SOwen Pan " {\n"
213*51f16814SOwen Pan " c;\n"
214*51f16814SOwen Pan " }\n"
21530ea3fccSowenca "}",
21630ea3fccSowenca Style);
21730ea3fccSowenca
21830ea3fccSowenca verifyFormat("if (a) {\n"
21930ea3fccSowenca " if (b) // comment\n"
22030ea3fccSowenca " c;\n"
22130ea3fccSowenca "} else if (d) {\n"
22230ea3fccSowenca " e;\n"
22330ea3fccSowenca "}",
22430ea3fccSowenca "if (a) {\n"
22530ea3fccSowenca " if (b) { // comment\n"
22630ea3fccSowenca " c;\n"
22730ea3fccSowenca " }\n"
22830ea3fccSowenca "} else if (d) {\n"
22930ea3fccSowenca " e;\n"
23030ea3fccSowenca "}",
23130ea3fccSowenca Style);
23230ea3fccSowenca
23330ea3fccSowenca verifyFormat("if (a) {\n"
23430ea3fccSowenca " if (b) {\n"
23530ea3fccSowenca " c;\n"
23630ea3fccSowenca " // comment\n"
23730ea3fccSowenca " } else if (d) {\n"
23830ea3fccSowenca " e;\n"
23930ea3fccSowenca " }\n"
24030ea3fccSowenca "}",
24130ea3fccSowenca Style);
24230ea3fccSowenca
24330ea3fccSowenca verifyFormat("if (a) {\n"
24430ea3fccSowenca " if (b)\n"
24530ea3fccSowenca " c;\n"
24630ea3fccSowenca "}",
24730ea3fccSowenca "if (a) {\n"
24830ea3fccSowenca " if (b) {\n"
24930ea3fccSowenca " c;\n"
25030ea3fccSowenca " }\n"
25130ea3fccSowenca "}",
25230ea3fccSowenca Style);
25330ea3fccSowenca
25430ea3fccSowenca verifyFormat("if (a)\n"
25530ea3fccSowenca " if (b)\n"
25630ea3fccSowenca " c;\n"
25730ea3fccSowenca " else\n"
25830ea3fccSowenca " d;\n"
25930ea3fccSowenca "else\n"
26030ea3fccSowenca " e;",
26130ea3fccSowenca "if (a) {\n"
26230ea3fccSowenca " if (b) {\n"
26330ea3fccSowenca " c;\n"
26430ea3fccSowenca " } else {\n"
26530ea3fccSowenca " d;\n"
26630ea3fccSowenca " }\n"
26730ea3fccSowenca "} else {\n"
26830ea3fccSowenca " e;\n"
26930ea3fccSowenca "}",
27030ea3fccSowenca Style);
27130ea3fccSowenca
27230ea3fccSowenca verifyFormat("if (a) {\n"
27330ea3fccSowenca " // comment\n"
27430ea3fccSowenca " if (b)\n"
27530ea3fccSowenca " c;\n"
27630ea3fccSowenca " else if (d)\n"
27730ea3fccSowenca " e;\n"
27830ea3fccSowenca "} else {\n"
27930ea3fccSowenca " g;\n"
28030ea3fccSowenca "}",
28130ea3fccSowenca "if (a) {\n"
28230ea3fccSowenca " // comment\n"
28330ea3fccSowenca " if (b) {\n"
28430ea3fccSowenca " c;\n"
28530ea3fccSowenca " } else if (d) {\n"
28630ea3fccSowenca " e;\n"
28730ea3fccSowenca " }\n"
28830ea3fccSowenca "} else {\n"
28930ea3fccSowenca " g;\n"
29030ea3fccSowenca "}",
29130ea3fccSowenca Style);
29230ea3fccSowenca
29330ea3fccSowenca verifyFormat("if (a)\n"
29430ea3fccSowenca " b;\n"
29530ea3fccSowenca "else if (c)\n"
29630ea3fccSowenca " d;\n"
29730ea3fccSowenca "else\n"
29830ea3fccSowenca " e;",
29930ea3fccSowenca "if (a) {\n"
30030ea3fccSowenca " b;\n"
30130ea3fccSowenca "} else {\n"
30230ea3fccSowenca " if (c) {\n"
30330ea3fccSowenca " d;\n"
30430ea3fccSowenca " } else {\n"
30530ea3fccSowenca " e;\n"
30630ea3fccSowenca " }\n"
30730ea3fccSowenca "}",
30830ea3fccSowenca Style);
30930ea3fccSowenca
31030ea3fccSowenca verifyFormat("if (a) {\n"
31130ea3fccSowenca " if (b)\n"
31230ea3fccSowenca " c;\n"
31330ea3fccSowenca " else if (d)\n"
31430ea3fccSowenca " e;\n"
31530ea3fccSowenca "} else {\n"
31630ea3fccSowenca " g;\n"
31730ea3fccSowenca "}",
31830ea3fccSowenca "if (a) {\n"
31930ea3fccSowenca " if (b)\n"
32030ea3fccSowenca " c;\n"
32130ea3fccSowenca " else {\n"
32230ea3fccSowenca " if (d)\n"
32330ea3fccSowenca " e;\n"
32430ea3fccSowenca " }\n"
32530ea3fccSowenca "} else {\n"
32630ea3fccSowenca " g;\n"
32730ea3fccSowenca "}",
32830ea3fccSowenca Style);
32930ea3fccSowenca
33030ea3fccSowenca verifyFormat("if (isa<VarDecl>(D)) {\n"
33130ea3fccSowenca " for (auto *A : D.attrs())\n"
33230ea3fccSowenca " if (shouldProcessAttr(A))\n"
33330ea3fccSowenca " handleAttr(A);\n"
33430ea3fccSowenca "}",
33530ea3fccSowenca "if (isa<VarDecl>(D)) {\n"
33630ea3fccSowenca " for (auto *A : D.attrs()) {\n"
33730ea3fccSowenca " if (shouldProcessAttr(A)) {\n"
33830ea3fccSowenca " handleAttr(A);\n"
33930ea3fccSowenca " }\n"
34030ea3fccSowenca " }\n"
34130ea3fccSowenca "}",
34230ea3fccSowenca Style);
34330ea3fccSowenca
34430ea3fccSowenca verifyFormat("do {\n"
34530ea3fccSowenca " ++I;\n"
34630ea3fccSowenca "} while (hasMore() && Filter(*I));",
34730ea3fccSowenca "do { ++I; } while (hasMore() && Filter(*I));", Style);
34830ea3fccSowenca
34930ea3fccSowenca verifyFormat("if (a)\n"
35030ea3fccSowenca " if (b)\n"
35130ea3fccSowenca " c;\n"
35230ea3fccSowenca " else {\n"
35330ea3fccSowenca " if (d)\n"
35430ea3fccSowenca " e;\n"
35530ea3fccSowenca " }\n"
35630ea3fccSowenca "else\n"
35730ea3fccSowenca " f;",
35830ea3fccSowenca Style);
35930ea3fccSowenca
36030ea3fccSowenca verifyFormat("if (a)\n"
36130ea3fccSowenca " if (b)\n"
36230ea3fccSowenca " c;\n"
36330ea3fccSowenca " else {\n"
36430ea3fccSowenca " if (d)\n"
36530ea3fccSowenca " e;\n"
36630ea3fccSowenca " else if (f)\n"
36730ea3fccSowenca " g;\n"
36830ea3fccSowenca " }\n"
36930ea3fccSowenca "else\n"
37030ea3fccSowenca " h;",
37130ea3fccSowenca Style);
37230ea3fccSowenca
37330ea3fccSowenca verifyFormat("if (a) {\n"
37430ea3fccSowenca " b;\n"
37530ea3fccSowenca "} else if (c) {\n"
37630ea3fccSowenca " d;\n"
37730ea3fccSowenca " e;\n"
37830ea3fccSowenca "}",
37930ea3fccSowenca "if (a) {\n"
38030ea3fccSowenca " b;\n"
38130ea3fccSowenca "} else {\n"
38230ea3fccSowenca " if (c) {\n"
38330ea3fccSowenca " d;\n"
38430ea3fccSowenca " e;\n"
38530ea3fccSowenca " }\n"
38630ea3fccSowenca "}",
38730ea3fccSowenca Style);
38830ea3fccSowenca
38930ea3fccSowenca verifyFormat("if (a) {\n"
39030ea3fccSowenca " b;\n"
39130ea3fccSowenca " c;\n"
39230ea3fccSowenca "} else if (d) {\n"
39330ea3fccSowenca " e;\n"
39430ea3fccSowenca " f;\n"
39530ea3fccSowenca "}",
39630ea3fccSowenca "if (a) {\n"
39730ea3fccSowenca " b;\n"
39830ea3fccSowenca " c;\n"
39930ea3fccSowenca "} else {\n"
40030ea3fccSowenca " if (d) {\n"
40130ea3fccSowenca " e;\n"
40230ea3fccSowenca " f;\n"
40330ea3fccSowenca " }\n"
40430ea3fccSowenca "}",
40530ea3fccSowenca Style);
40630ea3fccSowenca
40730ea3fccSowenca verifyFormat("if (a) {\n"
40830ea3fccSowenca " b;\n"
40930ea3fccSowenca "} else if (c) {\n"
41030ea3fccSowenca " d;\n"
41130ea3fccSowenca "} else {\n"
41230ea3fccSowenca " e;\n"
41330ea3fccSowenca " f;\n"
41430ea3fccSowenca "}",
41530ea3fccSowenca "if (a) {\n"
41630ea3fccSowenca " b;\n"
41730ea3fccSowenca "} else {\n"
41830ea3fccSowenca " if (c) {\n"
41930ea3fccSowenca " d;\n"
42030ea3fccSowenca " } else {\n"
42130ea3fccSowenca " e;\n"
42230ea3fccSowenca " f;\n"
42330ea3fccSowenca " }\n"
42430ea3fccSowenca "}",
42530ea3fccSowenca Style);
42630ea3fccSowenca
42730ea3fccSowenca verifyFormat("if (a) {\n"
42830ea3fccSowenca " b;\n"
42930ea3fccSowenca "} else if (c) {\n"
43030ea3fccSowenca " d;\n"
43130ea3fccSowenca "} else if (e) {\n"
43230ea3fccSowenca " f;\n"
43330ea3fccSowenca " g;\n"
43430ea3fccSowenca "}",
43530ea3fccSowenca "if (a) {\n"
43630ea3fccSowenca " b;\n"
43730ea3fccSowenca "} else {\n"
43830ea3fccSowenca " if (c) {\n"
43930ea3fccSowenca " d;\n"
44030ea3fccSowenca " } else if (e) {\n"
44130ea3fccSowenca " f;\n"
44230ea3fccSowenca " g;\n"
44330ea3fccSowenca " }\n"
44430ea3fccSowenca "}",
44530ea3fccSowenca Style);
44630ea3fccSowenca
44730ea3fccSowenca verifyFormat("if (a) {\n"
44830ea3fccSowenca " if (b)\n"
44930ea3fccSowenca " c;\n"
45030ea3fccSowenca " else if (d) {\n"
45130ea3fccSowenca " e;\n"
45230ea3fccSowenca " f;\n"
45330ea3fccSowenca " }\n"
45430ea3fccSowenca "} else {\n"
45530ea3fccSowenca " g;\n"
45630ea3fccSowenca "}",
45730ea3fccSowenca "if (a) {\n"
45830ea3fccSowenca " if (b)\n"
45930ea3fccSowenca " c;\n"
46030ea3fccSowenca " else {\n"
46130ea3fccSowenca " if (d) {\n"
46230ea3fccSowenca " e;\n"
46330ea3fccSowenca " f;\n"
46430ea3fccSowenca " }\n"
46530ea3fccSowenca " }\n"
46630ea3fccSowenca "} else {\n"
46730ea3fccSowenca " g;\n"
46830ea3fccSowenca "}",
46930ea3fccSowenca Style);
47030ea3fccSowenca
47130ea3fccSowenca verifyFormat("if (a)\n"
47230ea3fccSowenca " if (b)\n"
47330ea3fccSowenca " c;\n"
47430ea3fccSowenca " else {\n"
47530ea3fccSowenca " if (d) {\n"
47630ea3fccSowenca " e;\n"
47730ea3fccSowenca " f;\n"
47830ea3fccSowenca " }\n"
47930ea3fccSowenca " }\n"
48030ea3fccSowenca "else\n"
48130ea3fccSowenca " g;",
48230ea3fccSowenca Style);
48330ea3fccSowenca
48430ea3fccSowenca verifyFormat("if (a) {\n"
48530ea3fccSowenca " b;\n"
48630ea3fccSowenca " c;\n"
48730ea3fccSowenca "} else { // comment\n"
48830ea3fccSowenca " if (d) {\n"
48930ea3fccSowenca " e;\n"
49030ea3fccSowenca " f;\n"
49130ea3fccSowenca " }\n"
49230ea3fccSowenca "}",
49330ea3fccSowenca Style);
49430ea3fccSowenca
49530ea3fccSowenca verifyFormat("if (a)\n"
49630ea3fccSowenca " b;\n"
49730ea3fccSowenca "else if (c)\n"
49830ea3fccSowenca " while (d)\n"
49930ea3fccSowenca " e;\n"
50030ea3fccSowenca "// comment",
50130ea3fccSowenca "if (a)\n"
50230ea3fccSowenca "{\n"
50330ea3fccSowenca " b;\n"
50430ea3fccSowenca "} else if (c) {\n"
50530ea3fccSowenca " while (d) {\n"
50630ea3fccSowenca " e;\n"
50730ea3fccSowenca " }\n"
50830ea3fccSowenca "}\n"
50930ea3fccSowenca "// comment",
51030ea3fccSowenca Style);
51130ea3fccSowenca
51230ea3fccSowenca verifyFormat("if (a) {\n"
51330ea3fccSowenca " b;\n"
51430ea3fccSowenca "} else if (c) {\n"
51530ea3fccSowenca " d;\n"
51630ea3fccSowenca "} else {\n"
51730ea3fccSowenca " e;\n"
51830ea3fccSowenca " g;\n"
51930ea3fccSowenca "}",
52030ea3fccSowenca Style);
52130ea3fccSowenca
52230ea3fccSowenca verifyFormat("if (a) {\n"
52330ea3fccSowenca " b;\n"
52430ea3fccSowenca "} else if (c) {\n"
52530ea3fccSowenca " d;\n"
52630ea3fccSowenca "} else {\n"
52730ea3fccSowenca " e;\n"
52830ea3fccSowenca "} // comment",
52930ea3fccSowenca Style);
53030ea3fccSowenca
53130ea3fccSowenca verifyFormat("int abs = [](int i) {\n"
53230ea3fccSowenca " if (i >= 0)\n"
53330ea3fccSowenca " return i;\n"
53430ea3fccSowenca " return -i;\n"
53530ea3fccSowenca "};",
53630ea3fccSowenca "int abs = [](int i) {\n"
53730ea3fccSowenca " if (i >= 0) {\n"
53830ea3fccSowenca " return i;\n"
53930ea3fccSowenca " }\n"
54030ea3fccSowenca " return -i;\n"
54130ea3fccSowenca "};",
54230ea3fccSowenca Style);
54330ea3fccSowenca
54430ea3fccSowenca verifyFormat("if (a)\n"
54530ea3fccSowenca " foo();\n"
54630ea3fccSowenca "else\n"
54730ea3fccSowenca " bar();",
54830ea3fccSowenca "if (a)\n"
54930ea3fccSowenca "{\n"
55030ea3fccSowenca " foo();\n"
55130ea3fccSowenca "}\n"
55230ea3fccSowenca "else\n"
55330ea3fccSowenca "{\n"
55430ea3fccSowenca " bar();\n"
55530ea3fccSowenca "}",
55630ea3fccSowenca Style);
55730ea3fccSowenca
55830ea3fccSowenca verifyFormat("if (a)\n"
55930ea3fccSowenca " foo();\n"
56030ea3fccSowenca "// comment\n"
56130ea3fccSowenca "else\n"
56230ea3fccSowenca " bar();",
56330ea3fccSowenca "if (a) {\n"
56430ea3fccSowenca " foo();\n"
56530ea3fccSowenca "}\n"
56630ea3fccSowenca "// comment\n"
56730ea3fccSowenca "else {\n"
56830ea3fccSowenca " bar();\n"
56930ea3fccSowenca "}",
57030ea3fccSowenca Style);
57130ea3fccSowenca
57230ea3fccSowenca verifyFormat("if (a) {\n"
57330ea3fccSowenca " if (b)\n"
57430ea3fccSowenca " c = 1; // comment\n"
57530ea3fccSowenca "}",
57630ea3fccSowenca "if (a) {\n"
57730ea3fccSowenca " if (b) {\n"
57830ea3fccSowenca " c = 1; // comment\n"
57930ea3fccSowenca " }\n"
58030ea3fccSowenca "}",
58130ea3fccSowenca Style);
58230ea3fccSowenca
58330ea3fccSowenca verifyFormat("if (a) // comment\n"
58430ea3fccSowenca " b = 1;",
58530ea3fccSowenca "if (a) // comment\n"
58630ea3fccSowenca "{\n"
58730ea3fccSowenca " b = 1;\n"
58830ea3fccSowenca "}",
58930ea3fccSowenca Style);
59030ea3fccSowenca
59130ea3fccSowenca verifyFormat("if (a) {\n"
59230ea3fccSowenca "Label:\n"
59330ea3fccSowenca "}",
59430ea3fccSowenca Style);
59530ea3fccSowenca
59630ea3fccSowenca verifyFormat("if (a) {\n"
59730ea3fccSowenca "Label:\n"
59830ea3fccSowenca " f();\n"
59930ea3fccSowenca "}",
60030ea3fccSowenca Style);
60130ea3fccSowenca
60230ea3fccSowenca verifyFormat("if (a) {\n"
60330ea3fccSowenca " f();\n"
60430ea3fccSowenca "Label:\n"
60530ea3fccSowenca "}",
60630ea3fccSowenca Style);
60730ea3fccSowenca
60830ea3fccSowenca verifyFormat("if consteval {\n"
60930ea3fccSowenca " f();\n"
61030ea3fccSowenca "} else {\n"
61130ea3fccSowenca " g();\n"
61230ea3fccSowenca "}",
61330ea3fccSowenca Style);
61430ea3fccSowenca
61530ea3fccSowenca verifyFormat("if not consteval {\n"
61630ea3fccSowenca " f();\n"
61730ea3fccSowenca "} else if (a) {\n"
61830ea3fccSowenca " g();\n"
61930ea3fccSowenca "}",
62030ea3fccSowenca Style);
62130ea3fccSowenca
62230ea3fccSowenca verifyFormat("if !consteval {\n"
62330ea3fccSowenca " g();\n"
62430ea3fccSowenca "}",
62530ea3fccSowenca Style);
62630ea3fccSowenca
62730ea3fccSowenca verifyFormat("while (0)\n"
62830ea3fccSowenca " if (a)\n"
62930ea3fccSowenca " return b;\n"
63030ea3fccSowenca "return a;",
63130ea3fccSowenca "while (0) {\n"
63230ea3fccSowenca " if (a) {\n"
63330ea3fccSowenca " return b;\n"
63430ea3fccSowenca "}}\n"
63530ea3fccSowenca "return a;",
63630ea3fccSowenca Style);
63730ea3fccSowenca
63891b5d508SOwen Pan verifyFormat("if (a)\n"
63991b5d508SOwen Pan "#ifdef FOO\n"
64091b5d508SOwen Pan " if (b)\n"
64191b5d508SOwen Pan " bar = c;\n"
64291b5d508SOwen Pan " else\n"
64391b5d508SOwen Pan "#endif\n"
64491b5d508SOwen Pan " {\n"
64591b5d508SOwen Pan " foo = d;\n"
64691b5d508SOwen Pan "#ifdef FOO\n"
64791b5d508SOwen Pan " bar = e;\n"
64891b5d508SOwen Pan "#else\n"
64991b5d508SOwen Pan " bar = f;\n" // FIXME: should be indented 1 more level.
65091b5d508SOwen Pan "#endif\n"
65191b5d508SOwen Pan " }\n"
65291b5d508SOwen Pan "else\n"
65391b5d508SOwen Pan " bar = g;",
65491b5d508SOwen Pan "if (a)\n"
65591b5d508SOwen Pan "#ifdef FOO\n"
65691b5d508SOwen Pan " if (b)\n"
65791b5d508SOwen Pan " bar = c;\n"
65891b5d508SOwen Pan " else\n"
65991b5d508SOwen Pan "#endif\n"
66091b5d508SOwen Pan " {\n"
66191b5d508SOwen Pan " foo = d;\n"
66291b5d508SOwen Pan "#ifdef FOO\n"
66391b5d508SOwen Pan " bar = e;\n"
66491b5d508SOwen Pan "#else\n"
66591b5d508SOwen Pan " bar = f;\n"
66691b5d508SOwen Pan "#endif\n"
66791b5d508SOwen Pan " }\n"
66891b5d508SOwen Pan "else {\n"
66991b5d508SOwen Pan " bar = g;\n"
67091b5d508SOwen Pan "}",
67191b5d508SOwen Pan Style);
67291b5d508SOwen Pan
67330ea3fccSowenca Style.ColumnLimit = 65;
67430ea3fccSowenca verifyFormat("if (condition) {\n"
67530ea3fccSowenca " ff(Indices,\n"
67630ea3fccSowenca " [&](unsigned LHSI, unsigned RHSI) { return true; });\n"
67730ea3fccSowenca "} else {\n"
67830ea3fccSowenca " ff(Indices,\n"
67930ea3fccSowenca " [&](unsigned LHSI, unsigned RHSI) { return true; });\n"
68030ea3fccSowenca "}",
68130ea3fccSowenca Style);
68230ea3fccSowenca
68330ea3fccSowenca Style.ColumnLimit = 20;
68430ea3fccSowenca
68530ea3fccSowenca verifyFormat("int i;\n"
68630ea3fccSowenca "#define FOO(a, b) \\\n"
68730ea3fccSowenca " while (a) { \\\n"
68830ea3fccSowenca " b; \\\n"
68930ea3fccSowenca " }",
69030ea3fccSowenca Style);
69130ea3fccSowenca
69230ea3fccSowenca verifyFormat("int ab = [](int i) {\n"
69330ea3fccSowenca " if (i > 0) {\n"
69430ea3fccSowenca " i = 12345678 -\n"
69530ea3fccSowenca " i;\n"
69630ea3fccSowenca " }\n"
69730ea3fccSowenca " return i;\n"
69830ea3fccSowenca "};",
69930ea3fccSowenca Style);
70030ea3fccSowenca
70130ea3fccSowenca verifyFormat("if (a) {\n"
70230ea3fccSowenca " b = c + // 1 -\n"
70330ea3fccSowenca " d;\n"
70430ea3fccSowenca "}",
70530ea3fccSowenca Style);
70630ea3fccSowenca
70730ea3fccSowenca verifyFormat("if (a) {\n"
70830ea3fccSowenca " b = c >= 0 ? d\n"
70930ea3fccSowenca " : e;\n"
71030ea3fccSowenca "}",
71130ea3fccSowenca "if (a) {\n"
71230ea3fccSowenca " b = c >= 0 ? d : e;\n"
71330ea3fccSowenca "}",
71430ea3fccSowenca Style);
71530ea3fccSowenca
71630ea3fccSowenca verifyFormat("if (a)\n"
71730ea3fccSowenca " b = c > 0 ? d : e;",
71830ea3fccSowenca "if (a) {\n"
71930ea3fccSowenca " b = c > 0 ? d : e;\n"
72030ea3fccSowenca "}",
72130ea3fccSowenca Style);
72230ea3fccSowenca
72330ea3fccSowenca verifyFormat("if (-b >=\n"
72430ea3fccSowenca " c) { // Keep.\n"
72530ea3fccSowenca " foo();\n"
72630ea3fccSowenca "} else {\n"
72730ea3fccSowenca " bar();\n"
72830ea3fccSowenca "}",
72930ea3fccSowenca "if (-b >= c) { // Keep.\n"
73030ea3fccSowenca " foo();\n"
73130ea3fccSowenca "} else {\n"
73230ea3fccSowenca " bar();\n"
73330ea3fccSowenca "}",
73430ea3fccSowenca Style);
73530ea3fccSowenca
73630ea3fccSowenca verifyFormat("if (a) /* Remove. */\n"
73730ea3fccSowenca " f();\n"
73830ea3fccSowenca "else\n"
73930ea3fccSowenca " g();",
74030ea3fccSowenca "if (a) <% /* Remove. */\n"
74130ea3fccSowenca " f();\n"
74230ea3fccSowenca "%> else <%\n"
74330ea3fccSowenca " g();\n"
74430ea3fccSowenca "%>",
74530ea3fccSowenca Style);
74630ea3fccSowenca
74730ea3fccSowenca verifyFormat("while (\n"
74830ea3fccSowenca " !i--) <% // Keep.\n"
74930ea3fccSowenca " foo();\n"
75030ea3fccSowenca "%>",
75130ea3fccSowenca "while (!i--) <% // Keep.\n"
75230ea3fccSowenca " foo();\n"
75330ea3fccSowenca "%>",
75430ea3fccSowenca Style);
75530ea3fccSowenca
75630ea3fccSowenca verifyFormat("for (int &i : chars)\n"
75730ea3fccSowenca " ++i;",
75830ea3fccSowenca "for (int &i :\n"
75930ea3fccSowenca " chars) {\n"
76030ea3fccSowenca " ++i;\n"
76130ea3fccSowenca "}",
76230ea3fccSowenca Style);
76330ea3fccSowenca
76430ea3fccSowenca verifyFormat("if (a)\n"
76530ea3fccSowenca " b;\n"
76630ea3fccSowenca "else if (c) {\n"
76730ea3fccSowenca " d;\n"
76830ea3fccSowenca " e;\n"
76930ea3fccSowenca "} else\n"
77030ea3fccSowenca " f = g(foo, bar,\n"
77130ea3fccSowenca " baz);",
77230ea3fccSowenca "if (a)\n"
77330ea3fccSowenca " b;\n"
77430ea3fccSowenca "else {\n"
77530ea3fccSowenca " if (c) {\n"
77630ea3fccSowenca " d;\n"
77730ea3fccSowenca " e;\n"
77830ea3fccSowenca " } else\n"
77930ea3fccSowenca " f = g(foo, bar, baz);\n"
78030ea3fccSowenca "}",
78130ea3fccSowenca Style);
78230ea3fccSowenca
7835751c439SOwen Pan verifyFormat("if (foo)\n"
7845751c439SOwen Pan " f();\n"
7855751c439SOwen Pan "else if (bar || baz)\n"
7865751c439SOwen Pan " g();",
7875751c439SOwen Pan "if (foo) {\n"
7885751c439SOwen Pan " f();\n"
7895751c439SOwen Pan "} else if (bar || baz) {\n"
7905751c439SOwen Pan " g();\n"
7915751c439SOwen Pan "}",
7925751c439SOwen Pan Style);
7935751c439SOwen Pan
79430ea3fccSowenca Style.ColumnLimit = 0;
79530ea3fccSowenca verifyFormat("if (a)\n"
79630ea3fccSowenca " b234567890223456789032345678904234567890 = "
79730ea3fccSowenca "c234567890223456789032345678904234567890;",
79830ea3fccSowenca "if (a) {\n"
79930ea3fccSowenca " b234567890223456789032345678904234567890 = "
80030ea3fccSowenca "c234567890223456789032345678904234567890;\n"
80130ea3fccSowenca "}",
80230ea3fccSowenca Style);
80330ea3fccSowenca
80430ea3fccSowenca Style.BreakBeforeBraces = FormatStyle::BS_Custom;
80530ea3fccSowenca Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Always;
80630ea3fccSowenca Style.BraceWrapping.BeforeElse = true;
80730ea3fccSowenca
80830ea3fccSowenca Style.ColumnLimit = 65;
80930ea3fccSowenca
81030ea3fccSowenca verifyFormat("if (condition)\n"
81130ea3fccSowenca "{\n"
81230ea3fccSowenca " ff(Indices,\n"
81330ea3fccSowenca " [&](unsigned LHSI, unsigned RHSI) { return true; });\n"
81430ea3fccSowenca "}\n"
81530ea3fccSowenca "else\n"
81630ea3fccSowenca "{\n"
81730ea3fccSowenca " ff(Indices,\n"
81830ea3fccSowenca " [&](unsigned LHSI, unsigned RHSI) { return true; });\n"
81930ea3fccSowenca "}",
82030ea3fccSowenca "if (condition) {\n"
82130ea3fccSowenca " ff(Indices,\n"
82230ea3fccSowenca " [&](unsigned LHSI, unsigned RHSI) { return true; });\n"
82330ea3fccSowenca "} else {\n"
82430ea3fccSowenca " ff(Indices,\n"
82530ea3fccSowenca " [&](unsigned LHSI, unsigned RHSI) { return true; });\n"
82630ea3fccSowenca "}",
82730ea3fccSowenca Style);
82830ea3fccSowenca
82930ea3fccSowenca verifyFormat("if (a)\n"
83030ea3fccSowenca "{ //\n"
83130ea3fccSowenca " foo();\n"
83230ea3fccSowenca "}",
83330ea3fccSowenca "if (a) { //\n"
83430ea3fccSowenca " foo();\n"
83530ea3fccSowenca "}",
83630ea3fccSowenca Style);
83730ea3fccSowenca
83830ea3fccSowenca verifyFormat("if (a) // comment\n"
83930ea3fccSowenca " b = 1;",
84030ea3fccSowenca "if (a) // comment\n"
84130ea3fccSowenca "{\n"
84230ea3fccSowenca " b = 1;\n"
84330ea3fccSowenca "}",
84430ea3fccSowenca Style);
84530ea3fccSowenca
84630ea3fccSowenca Style.ColumnLimit = 20;
84730ea3fccSowenca
84830ea3fccSowenca verifyFormat("int ab = [](int i) {\n"
84930ea3fccSowenca " if (i > 0)\n"
85030ea3fccSowenca " {\n"
85130ea3fccSowenca " i = 12345678 -\n"
85230ea3fccSowenca " i;\n"
85330ea3fccSowenca " }\n"
85430ea3fccSowenca " return i;\n"
85530ea3fccSowenca "};",
85630ea3fccSowenca "int ab = [](int i) {\n"
85730ea3fccSowenca " if (i > 0) {\n"
85830ea3fccSowenca " i = 12345678 -\n"
85930ea3fccSowenca " i;\n"
86030ea3fccSowenca " }\n"
86130ea3fccSowenca " return i;\n"
86230ea3fccSowenca "};",
86330ea3fccSowenca Style);
86430ea3fccSowenca
86530ea3fccSowenca verifyFormat("if (a)\n"
86630ea3fccSowenca "{\n"
86730ea3fccSowenca " b = c + // 1 -\n"
86830ea3fccSowenca " d;\n"
86930ea3fccSowenca "}",
87030ea3fccSowenca "if (a) {\n"
87130ea3fccSowenca " b = c + // 1 -\n"
87230ea3fccSowenca " d;\n"
87330ea3fccSowenca "}",
87430ea3fccSowenca Style);
87530ea3fccSowenca
87630ea3fccSowenca verifyFormat("if (a)\n"
87730ea3fccSowenca "{\n"
87830ea3fccSowenca " b = c >= 0 ? d\n"
87930ea3fccSowenca " : e;\n"
88030ea3fccSowenca "}",
88130ea3fccSowenca "if (a) {\n"
88230ea3fccSowenca " b = c >= 0 ? d : e;\n"
88330ea3fccSowenca "}",
88430ea3fccSowenca Style);
88530ea3fccSowenca
88630ea3fccSowenca verifyFormat("if (a)\n"
88730ea3fccSowenca " b = c > 0 ? d : e;",
88830ea3fccSowenca "if (a)\n"
88930ea3fccSowenca "{\n"
89030ea3fccSowenca " b = c > 0 ? d : e;\n"
89130ea3fccSowenca "}",
89230ea3fccSowenca Style);
89330ea3fccSowenca
89430ea3fccSowenca verifyFormat("if (foo + bar <=\n"
89530ea3fccSowenca " baz)\n"
89630ea3fccSowenca "{\n"
89730ea3fccSowenca " func(arg1, arg2);\n"
89830ea3fccSowenca "}",
89930ea3fccSowenca "if (foo + bar <= baz) {\n"
90030ea3fccSowenca " func(arg1, arg2);\n"
90130ea3fccSowenca "}",
90230ea3fccSowenca Style);
90330ea3fccSowenca
90430ea3fccSowenca verifyFormat("if (foo + bar < baz)\n"
90530ea3fccSowenca " func(arg1, arg2);\n"
90630ea3fccSowenca "else\n"
90730ea3fccSowenca " func();",
90830ea3fccSowenca "if (foo + bar < baz)\n"
90930ea3fccSowenca "<%\n"
91030ea3fccSowenca " func(arg1, arg2);\n"
91130ea3fccSowenca "%>\n"
91230ea3fccSowenca "else\n"
91330ea3fccSowenca "<%\n"
91430ea3fccSowenca " func();\n"
91530ea3fccSowenca "%>",
91630ea3fccSowenca Style);
91730ea3fccSowenca
91830ea3fccSowenca verifyFormat("while (i--)\n"
91930ea3fccSowenca "<% // Keep.\n"
92030ea3fccSowenca " foo();\n"
92130ea3fccSowenca "%>",
92230ea3fccSowenca "while (i--) <% // Keep.\n"
92330ea3fccSowenca " foo();\n"
92430ea3fccSowenca "%>",
92530ea3fccSowenca Style);
92630ea3fccSowenca
92730ea3fccSowenca verifyFormat("for (int &i : chars)\n"
92830ea3fccSowenca " ++i;",
92930ea3fccSowenca "for (int &i : chars)\n"
93030ea3fccSowenca "{\n"
93130ea3fccSowenca " ++i;\n"
93230ea3fccSowenca "}",
93330ea3fccSowenca Style);
93430ea3fccSowenca }
93530ea3fccSowenca
93630ea3fccSowenca } // namespace
937f8d10d5aSManuel Klimek } // namespace test
93830ea3fccSowenca } // namespace format
93930ea3fccSowenca } // namespace clang
940