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