1 //===- unittest/Format/FormatTest.cpp - Formatting unit tests -------------===//
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 #include "clang/Frontend/TextDiagnosticPrinter.h"
15 #include "llvm/Support/Debug.h"
16 #include "llvm/Support/MemoryBuffer.h"
17 #include "gtest/gtest.h"
18 
19 #define DEBUG_TYPE "format-test"
20 
21 using clang::tooling::ReplacementTest;
22 using clang::tooling::toReplacements;
23 
24 namespace clang {
25 namespace format {
26 namespace {
27 
28 FormatStyle getGoogleStyle() { return getGoogleStyle(FormatStyle::LK_Cpp); }
29 
30 class FormatTest : public ::testing::Test {
31 protected:
32   enum StatusCheck { SC_ExpectComplete, SC_ExpectIncomplete, SC_DoNotCheck };
33 
34   std::string format(llvm::StringRef Code,
35                      const FormatStyle &Style = getLLVMStyle(),
36                      StatusCheck CheckComplete = SC_ExpectComplete) {
37     LLVM_DEBUG(llvm::errs() << "---\n");
38     LLVM_DEBUG(llvm::errs() << Code << "\n\n");
39     std::vector<tooling::Range> Ranges(1, tooling::Range(0, Code.size()));
40     FormattingAttemptStatus Status;
41     tooling::Replacements Replaces =
42         reformat(Style, Code, Ranges, "<stdin>", &Status);
43     if (CheckComplete != SC_DoNotCheck) {
44       bool ExpectedCompleteFormat = CheckComplete == SC_ExpectComplete;
45       EXPECT_EQ(ExpectedCompleteFormat, Status.FormatComplete)
46           << Code << "\n\n";
47     }
48     ReplacementCount = Replaces.size();
49     auto Result = applyAllReplacements(Code, Replaces);
50     EXPECT_TRUE(static_cast<bool>(Result));
51     LLVM_DEBUG(llvm::errs() << "\n" << *Result << "\n\n");
52     return *Result;
53   }
54 
55   FormatStyle getStyleWithColumns(FormatStyle Style, unsigned ColumnLimit) {
56     Style.ColumnLimit = ColumnLimit;
57     return Style;
58   }
59 
60   FormatStyle getLLVMStyleWithColumns(unsigned ColumnLimit) {
61     return getStyleWithColumns(getLLVMStyle(), ColumnLimit);
62   }
63 
64   FormatStyle getGoogleStyleWithColumns(unsigned ColumnLimit) {
65     return getStyleWithColumns(getGoogleStyle(), ColumnLimit);
66   }
67 
68   void verifyFormat(llvm::StringRef Expected, llvm::StringRef Code,
69                     const FormatStyle &Style = getLLVMStyle()) {
70     EXPECT_EQ(Expected.str(), format(Expected, Style))
71         << "Expected code is not stable";
72     EXPECT_EQ(Expected.str(), format(Code, Style));
73     if (Style.Language == FormatStyle::LK_Cpp) {
74       // Objective-C++ is a superset of C++, so everything checked for C++
75       // needs to be checked for Objective-C++ as well.
76       FormatStyle ObjCStyle = Style;
77       ObjCStyle.Language = FormatStyle::LK_ObjC;
78       EXPECT_EQ(Expected.str(), format(test::messUp(Code), ObjCStyle));
79     }
80   }
81 
82   void verifyFormat(llvm::StringRef Code,
83                     const FormatStyle &Style = getLLVMStyle()) {
84     verifyFormat(Code, test::messUp(Code), Style);
85   }
86 
87   void verifyIncompleteFormat(llvm::StringRef Code,
88                               const FormatStyle &Style = getLLVMStyle()) {
89     EXPECT_EQ(Code.str(),
90               format(test::messUp(Code), Style, SC_ExpectIncomplete));
91   }
92 
93   void verifyGoogleFormat(llvm::StringRef Code) {
94     verifyFormat(Code, getGoogleStyle());
95   }
96 
97   void verifyIndependentOfContext(llvm::StringRef text) {
98     verifyFormat(text);
99     verifyFormat(llvm::Twine("void f() { " + text + " }").str());
100   }
101 
102   /// \brief Verify that clang-format does not crash on the given input.
103   void verifyNoCrash(llvm::StringRef Code,
104                      const FormatStyle &Style = getLLVMStyle()) {
105     format(Code, Style, SC_DoNotCheck);
106   }
107 
108   int ReplacementCount;
109 };
110 
111 TEST_F(FormatTest, MessUp) {
112   EXPECT_EQ("1 2 3", test::messUp("1 2 3"));
113   EXPECT_EQ("1 2 3\n", test::messUp("1\n2\n3\n"));
114   EXPECT_EQ("a\n//b\nc", test::messUp("a\n//b\nc"));
115   EXPECT_EQ("a\n#b\nc", test::messUp("a\n#b\nc"));
116   EXPECT_EQ("a\n#b c d\ne", test::messUp("a\n#b\\\nc\\\nd\ne"));
117 }
118 
119 TEST_F(FormatTest, DefaultLLVMStyleIsCpp) {
120   EXPECT_EQ(FormatStyle::LK_Cpp, getLLVMStyle().Language);
121 }
122 
123 TEST_F(FormatTest, LLVMStyleOverride) {
124   EXPECT_EQ(FormatStyle::LK_Proto,
125             getLLVMStyle(FormatStyle::LK_Proto).Language);
126 }
127 
128 //===----------------------------------------------------------------------===//
129 // Basic function tests.
130 //===----------------------------------------------------------------------===//
131 
132 TEST_F(FormatTest, DoesNotChangeCorrectlyFormattedCode) {
133   EXPECT_EQ(";", format(";"));
134 }
135 
136 TEST_F(FormatTest, FormatsGlobalStatementsAt0) {
137   EXPECT_EQ("int i;", format("  int i;"));
138   EXPECT_EQ("\nint i;", format(" \n\t \v \f  int i;"));
139   EXPECT_EQ("int i;\nint j;", format("    int i; int j;"));
140   EXPECT_EQ("int i;\nint j;", format("    int i;\n  int j;"));
141 }
142 
143 TEST_F(FormatTest, FormatsUnwrappedLinesAtFirstFormat) {
144   EXPECT_EQ("int i;", format("int\ni;"));
145 }
146 
147 TEST_F(FormatTest, FormatsNestedBlockStatements) {
148   EXPECT_EQ("{\n  {\n    {}\n  }\n}", format("{{{}}}"));
149 }
150 
151 TEST_F(FormatTest, FormatsNestedCall) {
152   verifyFormat("Method(f1, f2(f3));");
153   verifyFormat("Method(f1(f2, f3()));");
154   verifyFormat("Method(f1(f2, (f3())));");
155 }
156 
157 TEST_F(FormatTest, NestedNameSpecifiers) {
158   verifyFormat("vector<::Type> v;");
159   verifyFormat("::ns::SomeFunction(::ns::SomeOtherFunction())");
160   verifyFormat("static constexpr bool Bar = decltype(bar())::value;");
161   verifyFormat("bool a = 2 < ::SomeFunction();");
162   verifyFormat("ALWAYS_INLINE ::std::string getName();");
163   verifyFormat("some::string getName();");
164 }
165 
166 TEST_F(FormatTest, OnlyGeneratesNecessaryReplacements) {
167   EXPECT_EQ("if (a) {\n"
168             "  f();\n"
169             "}",
170             format("if(a){f();}"));
171   EXPECT_EQ(4, ReplacementCount);
172   EXPECT_EQ("if (a) {\n"
173             "  f();\n"
174             "}",
175             format("if (a) {\n"
176                    "  f();\n"
177                    "}"));
178   EXPECT_EQ(0, ReplacementCount);
179   EXPECT_EQ("/*\r\n"
180             "\r\n"
181             "*/\r\n",
182             format("/*\r\n"
183                    "\r\n"
184                    "*/\r\n"));
185   EXPECT_EQ(0, ReplacementCount);
186 }
187 
188 TEST_F(FormatTest, RemovesEmptyLines) {
189   EXPECT_EQ("class C {\n"
190             "  int i;\n"
191             "};",
192             format("class C {\n"
193                    " int i;\n"
194                    "\n"
195                    "};"));
196 
197   // Don't remove empty lines at the start of namespaces or extern "C" blocks.
198   EXPECT_EQ("namespace N {\n"
199             "\n"
200             "int i;\n"
201             "}",
202             format("namespace N {\n"
203                    "\n"
204                    "int    i;\n"
205                    "}",
206                    getGoogleStyle()));
207   EXPECT_EQ("/* something */ namespace N {\n"
208             "\n"
209             "int i;\n"
210             "}",
211             format("/* something */ namespace N {\n"
212                    "\n"
213                    "int    i;\n"
214                    "}",
215                    getGoogleStyle()));
216   EXPECT_EQ("inline namespace N {\n"
217             "\n"
218             "int i;\n"
219             "}",
220             format("inline namespace N {\n"
221                    "\n"
222                    "int    i;\n"
223                    "}",
224                    getGoogleStyle()));
225   EXPECT_EQ("/* something */ inline namespace N {\n"
226             "\n"
227             "int i;\n"
228             "}",
229             format("/* something */ inline namespace N {\n"
230                    "\n"
231                    "int    i;\n"
232                    "}",
233                    getGoogleStyle()));
234   EXPECT_EQ("export namespace N {\n"
235             "\n"
236             "int i;\n"
237             "}",
238             format("export namespace N {\n"
239                    "\n"
240                    "int    i;\n"
241                    "}",
242                    getGoogleStyle()));
243   EXPECT_EQ("extern /**/ \"C\" /**/ {\n"
244             "\n"
245             "int i;\n"
246             "}",
247             format("extern /**/ \"C\" /**/ {\n"
248                    "\n"
249                    "int    i;\n"
250                    "}",
251                    getGoogleStyle()));
252 
253   // ...but do keep inlining and removing empty lines for non-block extern "C"
254   // functions.
255   verifyFormat("extern \"C\" int f() { return 42; }", getGoogleStyle());
256   EXPECT_EQ("extern \"C\" int f() {\n"
257             "  int i = 42;\n"
258             "  return i;\n"
259             "}",
260             format("extern \"C\" int f() {\n"
261                    "\n"
262                    "  int i = 42;\n"
263                    "  return i;\n"
264                    "}",
265                    getGoogleStyle()));
266 
267   // Remove empty lines at the beginning and end of blocks.
268   EXPECT_EQ("void f() {\n"
269             "\n"
270             "  if (a) {\n"
271             "\n"
272             "    f();\n"
273             "  }\n"
274             "}",
275             format("void f() {\n"
276                    "\n"
277                    "  if (a) {\n"
278                    "\n"
279                    "    f();\n"
280                    "\n"
281                    "  }\n"
282                    "\n"
283                    "}",
284                    getLLVMStyle()));
285   EXPECT_EQ("void f() {\n"
286             "  if (a) {\n"
287             "    f();\n"
288             "  }\n"
289             "}",
290             format("void f() {\n"
291                    "\n"
292                    "  if (a) {\n"
293                    "\n"
294                    "    f();\n"
295                    "\n"
296                    "  }\n"
297                    "\n"
298                    "}",
299                    getGoogleStyle()));
300 
301   // Don't remove empty lines in more complex control statements.
302   EXPECT_EQ("void f() {\n"
303             "  if (a) {\n"
304             "    f();\n"
305             "\n"
306             "  } else if (b) {\n"
307             "    f();\n"
308             "  }\n"
309             "}",
310             format("void f() {\n"
311                    "  if (a) {\n"
312                    "    f();\n"
313                    "\n"
314                    "  } else if (b) {\n"
315                    "    f();\n"
316                    "\n"
317                    "  }\n"
318                    "\n"
319                    "}"));
320 
321   // Don't remove empty lines before namespace endings.
322   FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle();
323   LLVMWithNoNamespaceFix.FixNamespaceComments = false;
324   EXPECT_EQ("namespace {\n"
325             "int i;\n"
326             "\n"
327             "}",
328             format("namespace {\n"
329                    "int i;\n"
330                    "\n"
331                    "}",
332                    LLVMWithNoNamespaceFix));
333   EXPECT_EQ("namespace {\n"
334             "int i;\n"
335             "}",
336             format("namespace {\n"
337                    "int i;\n"
338                    "}",
339                    LLVMWithNoNamespaceFix));
340   EXPECT_EQ("namespace {\n"
341             "int i;\n"
342             "\n"
343             "};",
344             format("namespace {\n"
345                    "int i;\n"
346                    "\n"
347                    "};",
348                    LLVMWithNoNamespaceFix));
349   EXPECT_EQ("namespace {\n"
350             "int i;\n"
351             "};",
352             format("namespace {\n"
353                    "int i;\n"
354                    "};",
355                    LLVMWithNoNamespaceFix));
356   EXPECT_EQ("namespace {\n"
357             "int i;\n"
358             "\n"
359             "}",
360             format("namespace {\n"
361                    "int i;\n"
362                    "\n"
363                    "}"));
364   EXPECT_EQ("namespace {\n"
365             "int i;\n"
366             "\n"
367             "} // namespace",
368             format("namespace {\n"
369                    "int i;\n"
370                    "\n"
371                    "}  // namespace"));
372 
373   FormatStyle Style = getLLVMStyle();
374   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
375   Style.MaxEmptyLinesToKeep = 2;
376   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
377   Style.BraceWrapping.AfterClass = true;
378   Style.BraceWrapping.AfterFunction = true;
379   Style.KeepEmptyLinesAtTheStartOfBlocks = false;
380 
381   EXPECT_EQ("class Foo\n"
382             "{\n"
383             "  Foo() {}\n"
384             "\n"
385             "  void funk() {}\n"
386             "};",
387             format("class Foo\n"
388                    "{\n"
389                    "  Foo()\n"
390                    "  {\n"
391                    "  }\n"
392                    "\n"
393                    "  void funk() {}\n"
394                    "};",
395                    Style));
396 }
397 
398 TEST_F(FormatTest, RecognizesBinaryOperatorKeywords) {
399   verifyFormat("x = (a) and (b);");
400   verifyFormat("x = (a) or (b);");
401   verifyFormat("x = (a) bitand (b);");
402   verifyFormat("x = (a) bitor (b);");
403   verifyFormat("x = (a) not_eq (b);");
404   verifyFormat("x = (a) and_eq (b);");
405   verifyFormat("x = (a) or_eq (b);");
406   verifyFormat("x = (a) xor (b);");
407 }
408 
409 TEST_F(FormatTest, RecognizesUnaryOperatorKeywords) {
410   verifyFormat("x = compl(a);");
411   verifyFormat("x = not(a);");
412   verifyFormat("x = bitand(a);");
413   // Unary operator must not be merged with the next identifier
414   verifyFormat("x = compl a;");
415   verifyFormat("x = not a;");
416   verifyFormat("x = bitand a;");
417 }
418 
419 //===----------------------------------------------------------------------===//
420 // Tests for control statements.
421 //===----------------------------------------------------------------------===//
422 
423 TEST_F(FormatTest, FormatIfWithoutCompoundStatement) {
424   verifyFormat("if (true)\n  f();\ng();");
425   verifyFormat("if (a)\n  if (b)\n    if (c)\n      g();\nh();");
426   verifyFormat("if (a)\n  if (b) {\n    f();\n  }\ng();");
427   verifyFormat("if constexpr (true)\n"
428                "  f();\ng();");
429   verifyFormat("if CONSTEXPR (true)\n"
430                "  f();\ng();");
431   verifyFormat("if constexpr (a)\n"
432                "  if constexpr (b)\n"
433                "    if constexpr (c)\n"
434                "      g();\n"
435                "h();");
436   verifyFormat("if CONSTEXPR (a)\n"
437                "  if CONSTEXPR (b)\n"
438                "    if CONSTEXPR (c)\n"
439                "      g();\n"
440                "h();");
441   verifyFormat("if constexpr (a)\n"
442                "  if constexpr (b) {\n"
443                "    f();\n"
444                "  }\n"
445                "g();");
446   verifyFormat("if CONSTEXPR (a)\n"
447                "  if CONSTEXPR (b) {\n"
448                "    f();\n"
449                "  }\n"
450                "g();");
451 
452   FormatStyle AllowsMergedIf = getLLVMStyle();
453   AllowsMergedIf.AlignEscapedNewlines = FormatStyle::ENAS_Left;
454   AllowsMergedIf.AllowShortIfStatementsOnASingleLine =
455       FormatStyle::SIS_WithoutElse;
456   verifyFormat("if (a)\n"
457                "  // comment\n"
458                "  f();",
459                AllowsMergedIf);
460   verifyFormat("{\n"
461                "  if (a)\n"
462                "  label:\n"
463                "    f();\n"
464                "}",
465                AllowsMergedIf);
466   verifyFormat("#define A \\\n"
467                "  if (a)  \\\n"
468                "  label:  \\\n"
469                "    f()",
470                AllowsMergedIf);
471   verifyFormat("if (a)\n"
472                "  ;",
473                AllowsMergedIf);
474   verifyFormat("if (a)\n"
475                "  if (b) return;",
476                AllowsMergedIf);
477 
478   verifyFormat("if (a) // Can't merge this\n"
479                "  f();\n",
480                AllowsMergedIf);
481   verifyFormat("if (a) /* still don't merge */\n"
482                "  f();",
483                AllowsMergedIf);
484   verifyFormat("if (a) { // Never merge this\n"
485                "  f();\n"
486                "}",
487                AllowsMergedIf);
488   verifyFormat("if (a) { /* Never merge this */\n"
489                "  f();\n"
490                "}",
491                AllowsMergedIf);
492 
493   AllowsMergedIf.ColumnLimit = 14;
494   verifyFormat("if (a) return;", AllowsMergedIf);
495   verifyFormat("if (aaaaaaaaa)\n"
496                "  return;",
497                AllowsMergedIf);
498 
499   AllowsMergedIf.ColumnLimit = 13;
500   verifyFormat("if (a)\n  return;", AllowsMergedIf);
501 }
502 
503 TEST_F(FormatTest, FormatIfWithoutCompoundStatementButElseWith) {
504   FormatStyle AllowsMergedIf = getLLVMStyle();
505   AllowsMergedIf.AlignEscapedNewlines = FormatStyle::ENAS_Left;
506   AllowsMergedIf.AllowShortIfStatementsOnASingleLine =
507       FormatStyle::SIS_WithoutElse;
508   verifyFormat("if (a)\n"
509                "  f();\n"
510                "else {\n"
511                "  g();\n"
512                "}",
513                AllowsMergedIf);
514   verifyFormat("if (a)\n"
515                "  f();\n"
516                "else\n"
517                "  g();\n",
518                AllowsMergedIf);
519 
520   AllowsMergedIf.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_Always;
521 
522   verifyFormat("if (a) f();\n"
523                "else {\n"
524                "  g();\n"
525                "}",
526                AllowsMergedIf);
527   verifyFormat("if (a) f();\n"
528                "else {\n"
529                "  if (a) f();\n"
530                "  else {\n"
531                "    g();\n"
532                "  }\n"
533                "  g();\n"
534                "}",
535                AllowsMergedIf);
536 }
537 
538 TEST_F(FormatTest, FormatLoopsWithoutCompoundStatement) {
539   FormatStyle AllowsMergedLoops = getLLVMStyle();
540   AllowsMergedLoops.AllowShortLoopsOnASingleLine = true;
541   verifyFormat("while (true) continue;", AllowsMergedLoops);
542   verifyFormat("for (;;) continue;", AllowsMergedLoops);
543   verifyFormat("for (int &v : vec) v *= 2;", AllowsMergedLoops);
544   verifyFormat("while (true)\n"
545                "  ;",
546                AllowsMergedLoops);
547   verifyFormat("for (;;)\n"
548                "  ;",
549                AllowsMergedLoops);
550   verifyFormat("for (;;)\n"
551                "  for (;;) continue;",
552                AllowsMergedLoops);
553   verifyFormat("for (;;) // Can't merge this\n"
554                "  continue;",
555                AllowsMergedLoops);
556   verifyFormat("for (;;) /* still don't merge */\n"
557                "  continue;",
558                AllowsMergedLoops);
559   verifyFormat("do a++;\n"
560                "while (true);",
561                AllowsMergedLoops);
562   verifyFormat("do /* Don't merge */\n"
563                "  a++;\n"
564                "while (true);",
565                AllowsMergedLoops);
566   verifyFormat("do // Don't merge\n"
567                "  a++;\n"
568                "while (true);",
569                AllowsMergedLoops);
570   verifyFormat("do\n"
571                "  // Don't merge\n"
572                "  a++;\n"
573                "while (true);",
574                AllowsMergedLoops);
575   // Without braces labels are interpreted differently.
576   verifyFormat("{\n"
577                "  do\n"
578                "  label:\n"
579                "    a++;\n"
580                "  while (true);\n"
581                "}",
582                AllowsMergedLoops);
583 }
584 
585 TEST_F(FormatTest, FormatShortBracedStatements) {
586   FormatStyle AllowSimpleBracedStatements = getLLVMStyle();
587   AllowSimpleBracedStatements.ColumnLimit = 40;
588   AllowSimpleBracedStatements.AllowShortBlocksOnASingleLine =
589       FormatStyle::SBS_Always;
590 
591   AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine =
592       FormatStyle::SIS_WithoutElse;
593   AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true;
594 
595   AllowSimpleBracedStatements.BreakBeforeBraces = FormatStyle::BS_Custom;
596   AllowSimpleBracedStatements.BraceWrapping.AfterFunction = true;
597   AllowSimpleBracedStatements.BraceWrapping.SplitEmptyRecord = false;
598 
599   verifyFormat("if (true) {}", AllowSimpleBracedStatements);
600   verifyFormat("if constexpr (true) {}", AllowSimpleBracedStatements);
601   verifyFormat("if CONSTEXPR (true) {}", AllowSimpleBracedStatements);
602   verifyFormat("while (true) {}", AllowSimpleBracedStatements);
603   verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
604   verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements);
605   verifyFormat("if constexpr (true) { f(); }", AllowSimpleBracedStatements);
606   verifyFormat("if CONSTEXPR (true) { f(); }", AllowSimpleBracedStatements);
607   verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements);
608   verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements);
609   verifyFormat("if (true) {\n"
610                "  ffffffffffffffffffffffffffffffffffffffffffffffffffffff();\n"
611                "}",
612                AllowSimpleBracedStatements);
613   verifyFormat("if (true) { //\n"
614                "  f();\n"
615                "}",
616                AllowSimpleBracedStatements);
617   verifyFormat("if (true) {\n"
618                "  f();\n"
619                "  f();\n"
620                "}",
621                AllowSimpleBracedStatements);
622   verifyFormat("if (true) {\n"
623                "  f();\n"
624                "} else {\n"
625                "  f();\n"
626                "}",
627                AllowSimpleBracedStatements);
628 
629   verifyFormat("struct A2 {\n"
630                "  int X;\n"
631                "};",
632                AllowSimpleBracedStatements);
633   verifyFormat("typedef struct A2 {\n"
634                "  int X;\n"
635                "} A2_t;",
636                AllowSimpleBracedStatements);
637   verifyFormat("template <int> struct A2 {\n"
638                "  struct B {};\n"
639                "};",
640                AllowSimpleBracedStatements);
641 
642   AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine =
643       FormatStyle::SIS_Never;
644   verifyFormat("if (true) {}", AllowSimpleBracedStatements);
645   verifyFormat("if (true) {\n"
646                "  f();\n"
647                "}",
648                AllowSimpleBracedStatements);
649   verifyFormat("if (true) {\n"
650                "  f();\n"
651                "} else {\n"
652                "  f();\n"
653                "}",
654                AllowSimpleBracedStatements);
655 
656   AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false;
657   verifyFormat("while (true) {}", AllowSimpleBracedStatements);
658   verifyFormat("while (true) {\n"
659                "  f();\n"
660                "}",
661                AllowSimpleBracedStatements);
662   verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
663   verifyFormat("for (;;) {\n"
664                "  f();\n"
665                "}",
666                AllowSimpleBracedStatements);
667 
668   AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine =
669       FormatStyle::SIS_WithoutElse;
670   AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true;
671   AllowSimpleBracedStatements.BraceWrapping.AfterControlStatement =
672       FormatStyle::BWACS_Always;
673 
674   verifyFormat("if (true) {}", AllowSimpleBracedStatements);
675   verifyFormat("if constexpr (true) {}", AllowSimpleBracedStatements);
676   verifyFormat("if CONSTEXPR (true) {}", AllowSimpleBracedStatements);
677   verifyFormat("while (true) {}", AllowSimpleBracedStatements);
678   verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
679   verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements);
680   verifyFormat("if constexpr (true) { f(); }", AllowSimpleBracedStatements);
681   verifyFormat("if CONSTEXPR (true) { f(); }", AllowSimpleBracedStatements);
682   verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements);
683   verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements);
684   verifyFormat("if (true)\n"
685                "{\n"
686                "  ffffffffffffffffffffffffffffffffffffffffffffffffffffff();\n"
687                "}",
688                AllowSimpleBracedStatements);
689   verifyFormat("if (true)\n"
690                "{ //\n"
691                "  f();\n"
692                "}",
693                AllowSimpleBracedStatements);
694   verifyFormat("if (true)\n"
695                "{\n"
696                "  f();\n"
697                "  f();\n"
698                "}",
699                AllowSimpleBracedStatements);
700   verifyFormat("if (true)\n"
701                "{\n"
702                "  f();\n"
703                "} else\n"
704                "{\n"
705                "  f();\n"
706                "}",
707                AllowSimpleBracedStatements);
708 
709   AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine =
710       FormatStyle::SIS_Never;
711   verifyFormat("if (true) {}", AllowSimpleBracedStatements);
712   verifyFormat("if (true)\n"
713                "{\n"
714                "  f();\n"
715                "}",
716                AllowSimpleBracedStatements);
717   verifyFormat("if (true)\n"
718                "{\n"
719                "  f();\n"
720                "} else\n"
721                "{\n"
722                "  f();\n"
723                "}",
724                AllowSimpleBracedStatements);
725 
726   AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false;
727   verifyFormat("while (true) {}", AllowSimpleBracedStatements);
728   verifyFormat("while (true)\n"
729                "{\n"
730                "  f();\n"
731                "}",
732                AllowSimpleBracedStatements);
733   verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
734   verifyFormat("for (;;)\n"
735                "{\n"
736                "  f();\n"
737                "}",
738                AllowSimpleBracedStatements);
739 }
740 
741 TEST_F(FormatTest, ShortBlocksInMacrosDontMergeWithCodeAfterMacro) {
742   FormatStyle Style = getLLVMStyleWithColumns(60);
743   Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always;
744   Style.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_WithoutElse;
745   Style.BreakBeforeBraces = FormatStyle::BS_Allman;
746   EXPECT_EQ("#define A                                                  \\\n"
747             "  if (HANDLEwernufrnuLwrmviferuvnierv)                     \\\n"
748             "  { RET_ERR1_ANUIREUINERUIFNIOAerwfwrvnuier; }\n"
749             "X;",
750             format("#define A \\\n"
751                    "   if (HANDLEwernufrnuLwrmviferuvnierv) { \\\n"
752                    "      RET_ERR1_ANUIREUINERUIFNIOAerwfwrvnuier; \\\n"
753                    "   }\n"
754                    "X;",
755                    Style));
756 }
757 
758 TEST_F(FormatTest, ParseIfElse) {
759   verifyFormat("if (true)\n"
760                "  if (true)\n"
761                "    if (true)\n"
762                "      f();\n"
763                "    else\n"
764                "      g();\n"
765                "  else\n"
766                "    h();\n"
767                "else\n"
768                "  i();");
769   verifyFormat("if (true)\n"
770                "  if (true)\n"
771                "    if (true) {\n"
772                "      if (true)\n"
773                "        f();\n"
774                "    } else {\n"
775                "      g();\n"
776                "    }\n"
777                "  else\n"
778                "    h();\n"
779                "else {\n"
780                "  i();\n"
781                "}");
782   verifyFormat("if (true)\n"
783                "  if constexpr (true)\n"
784                "    if (true) {\n"
785                "      if constexpr (true)\n"
786                "        f();\n"
787                "    } else {\n"
788                "      g();\n"
789                "    }\n"
790                "  else\n"
791                "    h();\n"
792                "else {\n"
793                "  i();\n"
794                "}");
795   verifyFormat("if (true)\n"
796                "  if CONSTEXPR (true)\n"
797                "    if (true) {\n"
798                "      if CONSTEXPR (true)\n"
799                "        f();\n"
800                "    } else {\n"
801                "      g();\n"
802                "    }\n"
803                "  else\n"
804                "    h();\n"
805                "else {\n"
806                "  i();\n"
807                "}");
808   verifyFormat("void f() {\n"
809                "  if (a) {\n"
810                "  } else {\n"
811                "  }\n"
812                "}");
813 }
814 
815 TEST_F(FormatTest, ElseIf) {
816   verifyFormat("if (a) {\n} else if (b) {\n}");
817   verifyFormat("if (a)\n"
818                "  f();\n"
819                "else if (b)\n"
820                "  g();\n"
821                "else\n"
822                "  h();");
823   verifyFormat("if constexpr (a)\n"
824                "  f();\n"
825                "else if constexpr (b)\n"
826                "  g();\n"
827                "else\n"
828                "  h();");
829   verifyFormat("if CONSTEXPR (a)\n"
830                "  f();\n"
831                "else if CONSTEXPR (b)\n"
832                "  g();\n"
833                "else\n"
834                "  h();");
835   verifyFormat("if (a) {\n"
836                "  f();\n"
837                "}\n"
838                "// or else ..\n"
839                "else {\n"
840                "  g()\n"
841                "}");
842 
843   verifyFormat("if (a) {\n"
844                "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
845                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
846                "}");
847   verifyFormat("if (a) {\n"
848                "} else if constexpr (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
849                "                         aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
850                "}");
851   verifyFormat("if (a) {\n"
852                "} else if CONSTEXPR (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
853                "                         aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
854                "}");
855   verifyFormat("if (a) {\n"
856                "} else if (\n"
857                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
858                "}",
859                getLLVMStyleWithColumns(62));
860   verifyFormat("if (a) {\n"
861                "} else if constexpr (\n"
862                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
863                "}",
864                getLLVMStyleWithColumns(62));
865   verifyFormat("if (a) {\n"
866                "} else if CONSTEXPR (\n"
867                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
868                "}",
869                getLLVMStyleWithColumns(62));
870 }
871 
872 TEST_F(FormatTest, FormatsForLoop) {
873   verifyFormat(
874       "for (int VeryVeryLongLoopVariable = 0; VeryVeryLongLoopVariable < 10;\n"
875       "     ++VeryVeryLongLoopVariable)\n"
876       "  ;");
877   verifyFormat("for (;;)\n"
878                "  f();");
879   verifyFormat("for (;;) {\n}");
880   verifyFormat("for (;;) {\n"
881                "  f();\n"
882                "}");
883   verifyFormat("for (int i = 0; (i < 10); ++i) {\n}");
884 
885   verifyFormat(
886       "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
887       "                                          E = UnwrappedLines.end();\n"
888       "     I != E; ++I) {\n}");
889 
890   verifyFormat(
891       "for (MachineFun::iterator IIII = PrevIt, EEEE = F.end(); IIII != EEEE;\n"
892       "     ++IIIII) {\n}");
893   verifyFormat("for (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaa =\n"
894                "         aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa;\n"
895                "     aaaaaaaaaaa != aaaaaaaaaaaaaaaaaaa; ++aaaaaaaaaaa) {\n}");
896   verifyFormat("for (llvm::ArrayRef<NamedDecl *>::iterator\n"
897                "         I = FD->getDeclsInPrototypeScope().begin(),\n"
898                "         E = FD->getDeclsInPrototypeScope().end();\n"
899                "     I != E; ++I) {\n}");
900   verifyFormat("for (SmallVectorImpl<TemplateIdAnnotationn *>::iterator\n"
901                "         I = Container.begin(),\n"
902                "         E = Container.end();\n"
903                "     I != E; ++I) {\n}",
904                getLLVMStyleWithColumns(76));
905 
906   verifyFormat(
907       "for (aaaaaaaaaaaaaaaaa aaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
908       "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa !=\n"
909       "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
910       "         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
911       "     ++aaaaaaaaaaa) {\n}");
912   verifyFormat("for (int i = 0; i < aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
913                "                bbbbbbbbbbbbbbbbbbbb < ccccccccccccccc;\n"
914                "     ++i) {\n}");
915   verifyFormat("for (int aaaaaaaaaaa = 1; aaaaaaaaaaa <= bbbbbbbbbbbbbbb;\n"
916                "     aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
917                "}");
918   verifyFormat("for (some_namespace::SomeIterator iter( // force break\n"
919                "         aaaaaaaaaa);\n"
920                "     iter; ++iter) {\n"
921                "}");
922   verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
923                "         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
924                "     aaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbbbbbbb;\n"
925                "     ++aaaaaaaaaaaaaaaaaaaaaaaaaaa) {");
926 
927   // These should not be formatted as Objective-C for-in loops.
928   verifyFormat("for (Foo *x = 0; x != in; x++) {\n}");
929   verifyFormat("Foo *x;\nfor (x = 0; x != in; x++) {\n}");
930   verifyFormat("Foo *x;\nfor (x in y) {\n}");
931   verifyFormat(
932       "for (const Foo<Bar> &baz = in.value(); !baz.at_end(); ++baz) {\n}");
933 
934   FormatStyle NoBinPacking = getLLVMStyle();
935   NoBinPacking.BinPackParameters = false;
936   verifyFormat("for (int aaaaaaaaaaa = 1;\n"
937                "     aaaaaaaaaaa <= aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa,\n"
938                "                                           aaaaaaaaaaaaaaaa,\n"
939                "                                           aaaaaaaaaaaaaaaa,\n"
940                "                                           aaaaaaaaaaaaaaaa);\n"
941                "     aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
942                "}",
943                NoBinPacking);
944   verifyFormat(
945       "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
946       "                                          E = UnwrappedLines.end();\n"
947       "     I != E;\n"
948       "     ++I) {\n}",
949       NoBinPacking);
950 
951   FormatStyle AlignLeft = getLLVMStyle();
952   AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
953   verifyFormat("for (A* a = start; a < end; ++a, ++value) {\n}", AlignLeft);
954 }
955 
956 TEST_F(FormatTest, RangeBasedForLoops) {
957   verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
958                "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
959   verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaa :\n"
960                "     aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa, aaaaaaaaaaaaa)) {\n}");
961   verifyFormat("for (const aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaa :\n"
962                "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
963   verifyFormat("for (aaaaaaaaa aaaaaaaaaaaaaaaaaaaaa :\n"
964                "     aaaaaaaaaaaa.aaaaaaaaaaaa().aaaaaaaaa().a()) {\n}");
965 }
966 
967 TEST_F(FormatTest, ForEachLoops) {
968   verifyFormat("void f() {\n"
969                "  foreach (Item *item, itemlist) {}\n"
970                "  Q_FOREACH (Item *item, itemlist) {}\n"
971                "  BOOST_FOREACH (Item *item, itemlist) {}\n"
972                "  UNKNOWN_FORACH(Item * item, itemlist) {}\n"
973                "}");
974 
975   FormatStyle Style = getLLVMStyle();
976   Style.SpaceBeforeParens =
977       FormatStyle::SBPO_ControlStatementsExceptForEachMacros;
978   verifyFormat("void f() {\n"
979                "  foreach(Item *item, itemlist) {}\n"
980                "  Q_FOREACH(Item *item, itemlist) {}\n"
981                "  BOOST_FOREACH(Item *item, itemlist) {}\n"
982                "  UNKNOWN_FORACH(Item * item, itemlist) {}\n"
983                "}",
984                Style);
985 
986   // As function-like macros.
987   verifyFormat("#define foreach(x, y)\n"
988                "#define Q_FOREACH(x, y)\n"
989                "#define BOOST_FOREACH(x, y)\n"
990                "#define UNKNOWN_FOREACH(x, y)\n");
991 
992   // Not as function-like macros.
993   verifyFormat("#define foreach (x, y)\n"
994                "#define Q_FOREACH (x, y)\n"
995                "#define BOOST_FOREACH (x, y)\n"
996                "#define UNKNOWN_FOREACH (x, y)\n");
997 }
998 
999 TEST_F(FormatTest, FormatsWhileLoop) {
1000   verifyFormat("while (true) {\n}");
1001   verifyFormat("while (true)\n"
1002                "  f();");
1003   verifyFormat("while () {\n}");
1004   verifyFormat("while () {\n"
1005                "  f();\n"
1006                "}");
1007 }
1008 
1009 TEST_F(FormatTest, FormatsDoWhile) {
1010   verifyFormat("do {\n"
1011                "  do_something();\n"
1012                "} while (something());");
1013   verifyFormat("do\n"
1014                "  do_something();\n"
1015                "while (something());");
1016 }
1017 
1018 TEST_F(FormatTest, FormatsSwitchStatement) {
1019   verifyFormat("switch (x) {\n"
1020                "case 1:\n"
1021                "  f();\n"
1022                "  break;\n"
1023                "case kFoo:\n"
1024                "case ns::kBar:\n"
1025                "case kBaz:\n"
1026                "  break;\n"
1027                "default:\n"
1028                "  g();\n"
1029                "  break;\n"
1030                "}");
1031   verifyFormat("switch (x) {\n"
1032                "case 1: {\n"
1033                "  f();\n"
1034                "  break;\n"
1035                "}\n"
1036                "case 2: {\n"
1037                "  break;\n"
1038                "}\n"
1039                "}");
1040   verifyFormat("switch (x) {\n"
1041                "case 1: {\n"
1042                "  f();\n"
1043                "  {\n"
1044                "    g();\n"
1045                "    h();\n"
1046                "  }\n"
1047                "  break;\n"
1048                "}\n"
1049                "}");
1050   verifyFormat("switch (x) {\n"
1051                "case 1: {\n"
1052                "  f();\n"
1053                "  if (foo) {\n"
1054                "    g();\n"
1055                "    h();\n"
1056                "  }\n"
1057                "  break;\n"
1058                "}\n"
1059                "}");
1060   verifyFormat("switch (x) {\n"
1061                "case 1: {\n"
1062                "  f();\n"
1063                "  g();\n"
1064                "} break;\n"
1065                "}");
1066   verifyFormat("switch (test)\n"
1067                "  ;");
1068   verifyFormat("switch (x) {\n"
1069                "default: {\n"
1070                "  // Do nothing.\n"
1071                "}\n"
1072                "}");
1073   verifyFormat("switch (x) {\n"
1074                "// comment\n"
1075                "// if 1, do f()\n"
1076                "case 1:\n"
1077                "  f();\n"
1078                "}");
1079   verifyFormat("switch (x) {\n"
1080                "case 1:\n"
1081                "  // Do amazing stuff\n"
1082                "  {\n"
1083                "    f();\n"
1084                "    g();\n"
1085                "  }\n"
1086                "  break;\n"
1087                "}");
1088   verifyFormat("#define A          \\\n"
1089                "  switch (x) {     \\\n"
1090                "  case a:          \\\n"
1091                "    foo = b;       \\\n"
1092                "  }",
1093                getLLVMStyleWithColumns(20));
1094   verifyFormat("#define OPERATION_CASE(name)           \\\n"
1095                "  case OP_name:                        \\\n"
1096                "    return operations::Operation##name\n",
1097                getLLVMStyleWithColumns(40));
1098   verifyFormat("switch (x) {\n"
1099                "case 1:;\n"
1100                "default:;\n"
1101                "  int i;\n"
1102                "}");
1103 
1104   verifyGoogleFormat("switch (x) {\n"
1105                      "  case 1:\n"
1106                      "    f();\n"
1107                      "    break;\n"
1108                      "  case kFoo:\n"
1109                      "  case ns::kBar:\n"
1110                      "  case kBaz:\n"
1111                      "    break;\n"
1112                      "  default:\n"
1113                      "    g();\n"
1114                      "    break;\n"
1115                      "}");
1116   verifyGoogleFormat("switch (x) {\n"
1117                      "  case 1: {\n"
1118                      "    f();\n"
1119                      "    break;\n"
1120                      "  }\n"
1121                      "}");
1122   verifyGoogleFormat("switch (test)\n"
1123                      "  ;");
1124 
1125   verifyGoogleFormat("#define OPERATION_CASE(name) \\\n"
1126                      "  case OP_name:              \\\n"
1127                      "    return operations::Operation##name\n");
1128   verifyGoogleFormat("Operation codeToOperation(OperationCode OpCode) {\n"
1129                      "  // Get the correction operation class.\n"
1130                      "  switch (OpCode) {\n"
1131                      "    CASE(Add);\n"
1132                      "    CASE(Subtract);\n"
1133                      "    default:\n"
1134                      "      return operations::Unknown;\n"
1135                      "  }\n"
1136                      "#undef OPERATION_CASE\n"
1137                      "}");
1138   verifyFormat("DEBUG({\n"
1139                "  switch (x) {\n"
1140                "  case A:\n"
1141                "    f();\n"
1142                "    break;\n"
1143                "    // fallthrough\n"
1144                "  case B:\n"
1145                "    g();\n"
1146                "    break;\n"
1147                "  }\n"
1148                "});");
1149   EXPECT_EQ("DEBUG({\n"
1150             "  switch (x) {\n"
1151             "  case A:\n"
1152             "    f();\n"
1153             "    break;\n"
1154             "  // On B:\n"
1155             "  case B:\n"
1156             "    g();\n"
1157             "    break;\n"
1158             "  }\n"
1159             "});",
1160             format("DEBUG({\n"
1161                    "  switch (x) {\n"
1162                    "  case A:\n"
1163                    "    f();\n"
1164                    "    break;\n"
1165                    "  // On B:\n"
1166                    "  case B:\n"
1167                    "    g();\n"
1168                    "    break;\n"
1169                    "  }\n"
1170                    "});",
1171                    getLLVMStyle()));
1172   EXPECT_EQ("switch (n) {\n"
1173             "case 0: {\n"
1174             "  return false;\n"
1175             "}\n"
1176             "default: {\n"
1177             "  return true;\n"
1178             "}\n"
1179             "}",
1180             format("switch (n)\n"
1181                    "{\n"
1182                    "case 0: {\n"
1183                    "  return false;\n"
1184                    "}\n"
1185                    "default: {\n"
1186                    "  return true;\n"
1187                    "}\n"
1188                    "}",
1189                    getLLVMStyle()));
1190   verifyFormat("switch (a) {\n"
1191                "case (b):\n"
1192                "  return;\n"
1193                "}");
1194 
1195   verifyFormat("switch (a) {\n"
1196                "case some_namespace::\n"
1197                "    some_constant:\n"
1198                "  return;\n"
1199                "}",
1200                getLLVMStyleWithColumns(34));
1201 
1202   FormatStyle Style = getLLVMStyle();
1203   Style.IndentCaseLabels = true;
1204   Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Never;
1205   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1206   Style.BraceWrapping.AfterCaseLabel = true;
1207   Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Always;
1208   EXPECT_EQ("switch (n)\n"
1209             "{\n"
1210             "  case 0:\n"
1211             "  {\n"
1212             "    return false;\n"
1213             "  }\n"
1214             "  default:\n"
1215             "  {\n"
1216             "    return true;\n"
1217             "  }\n"
1218             "}",
1219             format("switch (n) {\n"
1220                    "  case 0: {\n"
1221                    "    return false;\n"
1222                    "  }\n"
1223                    "  default: {\n"
1224                    "    return true;\n"
1225                    "  }\n"
1226                    "}",
1227                    Style));
1228   Style.BraceWrapping.AfterCaseLabel = false;
1229   EXPECT_EQ("switch (n)\n"
1230             "{\n"
1231             "  case 0: {\n"
1232             "    return false;\n"
1233             "  }\n"
1234             "  default: {\n"
1235             "    return true;\n"
1236             "  }\n"
1237             "}",
1238             format("switch (n) {\n"
1239                    "  case 0:\n"
1240                    "  {\n"
1241                    "    return false;\n"
1242                    "  }\n"
1243                    "  default:\n"
1244                    "  {\n"
1245                    "    return true;\n"
1246                    "  }\n"
1247                    "}",
1248                    Style));
1249   Style.IndentCaseLabels = false;
1250   Style.IndentCaseBlocks = true;
1251   EXPECT_EQ("switch (n)\n"
1252             "{\n"
1253             "case 0:\n"
1254             "  {\n"
1255             "    return false;\n"
1256             "  }\n"
1257             "case 1:\n"
1258             "  break;\n"
1259             "default:\n"
1260             "  {\n"
1261             "    return true;\n"
1262             "  }\n"
1263             "}",
1264             format("switch (n) {\n"
1265                    "case 0: {\n"
1266                    "  return false;\n"
1267                    "}\n"
1268                    "case 1:\n"
1269                    "  break;\n"
1270                    "default: {\n"
1271                    "  return true;\n"
1272                    "}\n"
1273                    "}",
1274                    Style));
1275   Style.IndentCaseLabels = true;
1276   Style.IndentCaseBlocks = true;
1277   EXPECT_EQ("switch (n)\n"
1278             "{\n"
1279             "  case 0:\n"
1280             "    {\n"
1281             "      return false;\n"
1282             "    }\n"
1283             "  case 1:\n"
1284             "    break;\n"
1285             "  default:\n"
1286             "    {\n"
1287             "      return true;\n"
1288             "    }\n"
1289             "}",
1290             format("switch (n) {\n"
1291                    "case 0: {\n"
1292                    "  return false;\n"
1293                    "}\n"
1294                    "case 1:\n"
1295                    "  break;\n"
1296                    "default: {\n"
1297                    "  return true;\n"
1298                    "}\n"
1299                    "}",
1300                    Style));
1301 }
1302 
1303 TEST_F(FormatTest, CaseRanges) {
1304   verifyFormat("switch (x) {\n"
1305                "case 'A' ... 'Z':\n"
1306                "case 1 ... 5:\n"
1307                "case a ... b:\n"
1308                "  break;\n"
1309                "}");
1310 }
1311 
1312 TEST_F(FormatTest, ShortEnums) {
1313   FormatStyle Style = getLLVMStyle();
1314   Style.AllowShortEnumsOnASingleLine = true;
1315   verifyFormat("enum { A, B, C } ShortEnum1, ShortEnum2;", Style);
1316   Style.AllowShortEnumsOnASingleLine = false;
1317   verifyFormat("enum\n"
1318                "{\n"
1319                "  A,\n"
1320                "  B,\n"
1321                "  C\n"
1322                "} ShortEnum1, ShortEnum2;",
1323                Style);
1324 }
1325 
1326 TEST_F(FormatTest, ShortCaseLabels) {
1327   FormatStyle Style = getLLVMStyle();
1328   Style.AllowShortCaseLabelsOnASingleLine = true;
1329   verifyFormat("switch (a) {\n"
1330                "case 1: x = 1; break;\n"
1331                "case 2: return;\n"
1332                "case 3:\n"
1333                "case 4:\n"
1334                "case 5: return;\n"
1335                "case 6: // comment\n"
1336                "  return;\n"
1337                "case 7:\n"
1338                "  // comment\n"
1339                "  return;\n"
1340                "case 8:\n"
1341                "  x = 8; // comment\n"
1342                "  break;\n"
1343                "default: y = 1; break;\n"
1344                "}",
1345                Style);
1346   verifyFormat("switch (a) {\n"
1347                "case 0: return; // comment\n"
1348                "case 1: break;  // comment\n"
1349                "case 2: return;\n"
1350                "// comment\n"
1351                "case 3: return;\n"
1352                "// comment 1\n"
1353                "// comment 2\n"
1354                "// comment 3\n"
1355                "case 4: break; /* comment */\n"
1356                "case 5:\n"
1357                "  // comment\n"
1358                "  break;\n"
1359                "case 6: /* comment */ x = 1; break;\n"
1360                "case 7: x = /* comment */ 1; break;\n"
1361                "case 8:\n"
1362                "  x = 1; /* comment */\n"
1363                "  break;\n"
1364                "case 9:\n"
1365                "  break; // comment line 1\n"
1366                "         // comment line 2\n"
1367                "}",
1368                Style);
1369   EXPECT_EQ("switch (a) {\n"
1370             "case 1:\n"
1371             "  x = 8;\n"
1372             "  // fall through\n"
1373             "case 2: x = 8;\n"
1374             "// comment\n"
1375             "case 3:\n"
1376             "  return; /* comment line 1\n"
1377             "           * comment line 2 */\n"
1378             "case 4: i = 8;\n"
1379             "// something else\n"
1380             "#if FOO\n"
1381             "case 5: break;\n"
1382             "#endif\n"
1383             "}",
1384             format("switch (a) {\n"
1385                    "case 1: x = 8;\n"
1386                    "  // fall through\n"
1387                    "case 2:\n"
1388                    "  x = 8;\n"
1389                    "// comment\n"
1390                    "case 3:\n"
1391                    "  return; /* comment line 1\n"
1392                    "           * comment line 2 */\n"
1393                    "case 4:\n"
1394                    "  i = 8;\n"
1395                    "// something else\n"
1396                    "#if FOO\n"
1397                    "case 5: break;\n"
1398                    "#endif\n"
1399                    "}",
1400                    Style));
1401   EXPECT_EQ("switch (a) {\n"
1402             "case 0:\n"
1403             "  return; // long long long long long long long long long long "
1404             "long long comment\n"
1405             "          // line\n"
1406             "}",
1407             format("switch (a) {\n"
1408                    "case 0: return; // long long long long long long long long "
1409                    "long long long long comment line\n"
1410                    "}",
1411                    Style));
1412   EXPECT_EQ("switch (a) {\n"
1413             "case 0:\n"
1414             "  return; /* long long long long long long long long long long "
1415             "long long comment\n"
1416             "             line */\n"
1417             "}",
1418             format("switch (a) {\n"
1419                    "case 0: return; /* long long long long long long long long "
1420                    "long long long long comment line */\n"
1421                    "}",
1422                    Style));
1423   verifyFormat("switch (a) {\n"
1424                "#if FOO\n"
1425                "case 0: return 0;\n"
1426                "#endif\n"
1427                "}",
1428                Style);
1429   verifyFormat("switch (a) {\n"
1430                "case 1: {\n"
1431                "}\n"
1432                "case 2: {\n"
1433                "  return;\n"
1434                "}\n"
1435                "case 3: {\n"
1436                "  x = 1;\n"
1437                "  return;\n"
1438                "}\n"
1439                "case 4:\n"
1440                "  if (x)\n"
1441                "    return;\n"
1442                "}",
1443                Style);
1444   Style.ColumnLimit = 21;
1445   verifyFormat("switch (a) {\n"
1446                "case 1: x = 1; break;\n"
1447                "case 2: return;\n"
1448                "case 3:\n"
1449                "case 4:\n"
1450                "case 5: return;\n"
1451                "default:\n"
1452                "  y = 1;\n"
1453                "  break;\n"
1454                "}",
1455                Style);
1456   Style.ColumnLimit = 80;
1457   Style.AllowShortCaseLabelsOnASingleLine = false;
1458   Style.IndentCaseLabels = true;
1459   EXPECT_EQ("switch (n) {\n"
1460             "  default /*comments*/:\n"
1461             "    return true;\n"
1462             "  case 0:\n"
1463             "    return false;\n"
1464             "}",
1465             format("switch (n) {\n"
1466                    "default/*comments*/:\n"
1467                    "  return true;\n"
1468                    "case 0:\n"
1469                    "  return false;\n"
1470                    "}",
1471                    Style));
1472   Style.AllowShortCaseLabelsOnASingleLine = true;
1473   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1474   Style.BraceWrapping.AfterCaseLabel = true;
1475   Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Always;
1476   EXPECT_EQ("switch (n)\n"
1477             "{\n"
1478             "  case 0:\n"
1479             "  {\n"
1480             "    return false;\n"
1481             "  }\n"
1482             "  default:\n"
1483             "  {\n"
1484             "    return true;\n"
1485             "  }\n"
1486             "}",
1487             format("switch (n) {\n"
1488                    "  case 0: {\n"
1489                    "    return false;\n"
1490                    "  }\n"
1491                    "  default:\n"
1492                    "  {\n"
1493                    "    return true;\n"
1494                    "  }\n"
1495                    "}",
1496                    Style));
1497 }
1498 
1499 TEST_F(FormatTest, FormatsLabels) {
1500   verifyFormat("void f() {\n"
1501                "  some_code();\n"
1502                "test_label:\n"
1503                "  some_other_code();\n"
1504                "  {\n"
1505                "    some_more_code();\n"
1506                "  another_label:\n"
1507                "    some_more_code();\n"
1508                "  }\n"
1509                "}");
1510   verifyFormat("{\n"
1511                "  some_code();\n"
1512                "test_label:\n"
1513                "  some_other_code();\n"
1514                "}");
1515   verifyFormat("{\n"
1516                "  some_code();\n"
1517                "test_label:;\n"
1518                "  int i = 0;\n"
1519                "}");
1520   FormatStyle Style = getLLVMStyle();
1521   Style.IndentGotoLabels = false;
1522   verifyFormat("void f() {\n"
1523                "  some_code();\n"
1524                "test_label:\n"
1525                "  some_other_code();\n"
1526                "  {\n"
1527                "    some_more_code();\n"
1528                "another_label:\n"
1529                "    some_more_code();\n"
1530                "  }\n"
1531                "}",
1532                Style);
1533   verifyFormat("{\n"
1534                "  some_code();\n"
1535                "test_label:\n"
1536                "  some_other_code();\n"
1537                "}",
1538                Style);
1539   verifyFormat("{\n"
1540                "  some_code();\n"
1541                "test_label:;\n"
1542                "  int i = 0;\n"
1543                "}");
1544 }
1545 
1546 TEST_F(FormatTest, MultiLineControlStatements) {
1547   FormatStyle Style = getLLVMStyle();
1548   Style.BreakBeforeBraces = FormatStyle::BraceBreakingStyle::BS_Custom;
1549   Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_MultiLine;
1550   Style.ColumnLimit = 20;
1551   // Short lines should keep opening brace on same line.
1552   EXPECT_EQ("if (foo) {\n"
1553             "  bar();\n"
1554             "}",
1555             format("if(foo){bar();}", Style));
1556   EXPECT_EQ("if (foo) {\n"
1557             "  bar();\n"
1558             "} else {\n"
1559             "  baz();\n"
1560             "}",
1561             format("if(foo){bar();}else{baz();}", Style));
1562   EXPECT_EQ("if (foo && bar) {\n"
1563             "  baz();\n"
1564             "}",
1565             format("if(foo&&bar){baz();}", Style));
1566   EXPECT_EQ("if (foo) {\n"
1567             "  bar();\n"
1568             "} else if (baz) {\n"
1569             "  quux();\n"
1570             "}",
1571             format("if(foo){bar();}else if(baz){quux();}", Style));
1572   EXPECT_EQ(
1573       "if (foo) {\n"
1574       "  bar();\n"
1575       "} else if (baz) {\n"
1576       "  quux();\n"
1577       "} else {\n"
1578       "  foobar();\n"
1579       "}",
1580       format("if(foo){bar();}else if(baz){quux();}else{foobar();}", Style));
1581   EXPECT_EQ("for (;;) {\n"
1582             "  foo();\n"
1583             "}",
1584             format("for(;;){foo();}"));
1585   EXPECT_EQ("while (1) {\n"
1586             "  foo();\n"
1587             "}",
1588             format("while(1){foo();}", Style));
1589   EXPECT_EQ("switch (foo) {\n"
1590             "case bar:\n"
1591             "  return;\n"
1592             "}",
1593             format("switch(foo){case bar:return;}", Style));
1594   EXPECT_EQ("try {\n"
1595             "  foo();\n"
1596             "} catch (...) {\n"
1597             "  bar();\n"
1598             "}",
1599             format("try{foo();}catch(...){bar();}", Style));
1600   EXPECT_EQ("do {\n"
1601             "  foo();\n"
1602             "} while (bar &&\n"
1603             "         baz);",
1604             format("do{foo();}while(bar&&baz);", Style));
1605   // Long lines should put opening brace on new line.
1606   EXPECT_EQ("if (foo && bar &&\n"
1607             "    baz)\n"
1608             "{\n"
1609             "  quux();\n"
1610             "}",
1611             format("if(foo&&bar&&baz){quux();}", Style));
1612   EXPECT_EQ("if (foo && bar &&\n"
1613             "    baz)\n"
1614             "{\n"
1615             "  quux();\n"
1616             "}",
1617             format("if (foo && bar &&\n"
1618                    "    baz) {\n"
1619                    "  quux();\n"
1620                    "}",
1621                    Style));
1622   EXPECT_EQ("if (foo) {\n"
1623             "  bar();\n"
1624             "} else if (baz ||\n"
1625             "           quux)\n"
1626             "{\n"
1627             "  foobar();\n"
1628             "}",
1629             format("if(foo){bar();}else if(baz||quux){foobar();}", Style));
1630   EXPECT_EQ(
1631       "if (foo) {\n"
1632       "  bar();\n"
1633       "} else if (baz ||\n"
1634       "           quux)\n"
1635       "{\n"
1636       "  foobar();\n"
1637       "} else {\n"
1638       "  barbaz();\n"
1639       "}",
1640       format("if(foo){bar();}else if(baz||quux){foobar();}else{barbaz();}",
1641              Style));
1642   EXPECT_EQ("for (int i = 0;\n"
1643             "     i < 10; ++i)\n"
1644             "{\n"
1645             "  foo();\n"
1646             "}",
1647             format("for(int i=0;i<10;++i){foo();}", Style));
1648   EXPECT_EQ("while (foo || bar ||\n"
1649             "       baz)\n"
1650             "{\n"
1651             "  quux();\n"
1652             "}",
1653             format("while(foo||bar||baz){quux();}", Style));
1654   EXPECT_EQ("switch (\n"
1655             "    foo = barbaz)\n"
1656             "{\n"
1657             "case quux:\n"
1658             "  return;\n"
1659             "}",
1660             format("switch(foo=barbaz){case quux:return;}", Style));
1661   EXPECT_EQ("try {\n"
1662             "  foo();\n"
1663             "} catch (\n"
1664             "    Exception &bar)\n"
1665             "{\n"
1666             "  baz();\n"
1667             "}",
1668             format("try{foo();}catch(Exception&bar){baz();}", Style));
1669   Style.ColumnLimit =
1670       40; // to concentrate at brace wrapping, not line wrap due to column limit
1671   EXPECT_EQ("try {\n"
1672             "  foo();\n"
1673             "} catch (Exception &bar) {\n"
1674             "  baz();\n"
1675             "}",
1676             format("try{foo();}catch(Exception&bar){baz();}", Style));
1677   Style.ColumnLimit =
1678       20; // to concentrate at brace wrapping, not line wrap due to column limit
1679 
1680   Style.BraceWrapping.BeforeElse = true;
1681   EXPECT_EQ(
1682       "if (foo) {\n"
1683       "  bar();\n"
1684       "}\n"
1685       "else if (baz ||\n"
1686       "         quux)\n"
1687       "{\n"
1688       "  foobar();\n"
1689       "}\n"
1690       "else {\n"
1691       "  barbaz();\n"
1692       "}",
1693       format("if(foo){bar();}else if(baz||quux){foobar();}else{barbaz();}",
1694              Style));
1695 
1696   Style.BraceWrapping.BeforeCatch = true;
1697   EXPECT_EQ("try {\n"
1698             "  foo();\n"
1699             "}\n"
1700             "catch (...) {\n"
1701             "  baz();\n"
1702             "}",
1703             format("try{foo();}catch(...){baz();}", Style));
1704 }
1705 
1706 //===----------------------------------------------------------------------===//
1707 // Tests for classes, namespaces, etc.
1708 //===----------------------------------------------------------------------===//
1709 
1710 TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) {
1711   verifyFormat("class A {};");
1712 }
1713 
1714 TEST_F(FormatTest, UnderstandsAccessSpecifiers) {
1715   verifyFormat("class A {\n"
1716                "public:\n"
1717                "public: // comment\n"
1718                "protected:\n"
1719                "private:\n"
1720                "  void f() {}\n"
1721                "};");
1722   verifyFormat("export class A {\n"
1723                "public:\n"
1724                "public: // comment\n"
1725                "protected:\n"
1726                "private:\n"
1727                "  void f() {}\n"
1728                "};");
1729   verifyGoogleFormat("class A {\n"
1730                      " public:\n"
1731                      " protected:\n"
1732                      " private:\n"
1733                      "  void f() {}\n"
1734                      "};");
1735   verifyGoogleFormat("export class A {\n"
1736                      " public:\n"
1737                      " protected:\n"
1738                      " private:\n"
1739                      "  void f() {}\n"
1740                      "};");
1741   verifyFormat("class A {\n"
1742                "public slots:\n"
1743                "  void f1() {}\n"
1744                "public Q_SLOTS:\n"
1745                "  void f2() {}\n"
1746                "protected slots:\n"
1747                "  void f3() {}\n"
1748                "protected Q_SLOTS:\n"
1749                "  void f4() {}\n"
1750                "private slots:\n"
1751                "  void f5() {}\n"
1752                "private Q_SLOTS:\n"
1753                "  void f6() {}\n"
1754                "signals:\n"
1755                "  void g1();\n"
1756                "Q_SIGNALS:\n"
1757                "  void g2();\n"
1758                "};");
1759 
1760   // Don't interpret 'signals' the wrong way.
1761   verifyFormat("signals.set();");
1762   verifyFormat("for (Signals signals : f()) {\n}");
1763   verifyFormat("{\n"
1764                "  signals.set(); // This needs indentation.\n"
1765                "}");
1766   verifyFormat("void f() {\n"
1767                "label:\n"
1768                "  signals.baz();\n"
1769                "}");
1770 }
1771 
1772 TEST_F(FormatTest, SeparatesLogicalBlocks) {
1773   EXPECT_EQ("class A {\n"
1774             "public:\n"
1775             "  void f();\n"
1776             "\n"
1777             "private:\n"
1778             "  void g() {}\n"
1779             "  // test\n"
1780             "protected:\n"
1781             "  int h;\n"
1782             "};",
1783             format("class A {\n"
1784                    "public:\n"
1785                    "void f();\n"
1786                    "private:\n"
1787                    "void g() {}\n"
1788                    "// test\n"
1789                    "protected:\n"
1790                    "int h;\n"
1791                    "};"));
1792   EXPECT_EQ("class A {\n"
1793             "protected:\n"
1794             "public:\n"
1795             "  void f();\n"
1796             "};",
1797             format("class A {\n"
1798                    "protected:\n"
1799                    "\n"
1800                    "public:\n"
1801                    "\n"
1802                    "  void f();\n"
1803                    "};"));
1804 
1805   // Even ensure proper spacing inside macros.
1806   EXPECT_EQ("#define B     \\\n"
1807             "  class A {   \\\n"
1808             "   protected: \\\n"
1809             "   public:    \\\n"
1810             "    void f(); \\\n"
1811             "  };",
1812             format("#define B     \\\n"
1813                    "  class A {   \\\n"
1814                    "   protected: \\\n"
1815                    "              \\\n"
1816                    "   public:    \\\n"
1817                    "              \\\n"
1818                    "    void f(); \\\n"
1819                    "  };",
1820                    getGoogleStyle()));
1821   // But don't remove empty lines after macros ending in access specifiers.
1822   EXPECT_EQ("#define A private:\n"
1823             "\n"
1824             "int i;",
1825             format("#define A         private:\n"
1826                    "\n"
1827                    "int              i;"));
1828 }
1829 
1830 TEST_F(FormatTest, FormatsClasses) {
1831   verifyFormat("class A : public B {};");
1832   verifyFormat("class A : public ::B {};");
1833 
1834   verifyFormat(
1835       "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
1836       "                             public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
1837   verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n"
1838                "    : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
1839                "      public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
1840   verifyFormat(
1841       "class A : public B, public C, public D, public E, public F {};");
1842   verifyFormat("class AAAAAAAAAAAA : public B,\n"
1843                "                     public C,\n"
1844                "                     public D,\n"
1845                "                     public E,\n"
1846                "                     public F,\n"
1847                "                     public G {};");
1848 
1849   verifyFormat("class\n"
1850                "    ReallyReallyLongClassName {\n"
1851                "  int i;\n"
1852                "};",
1853                getLLVMStyleWithColumns(32));
1854   verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n"
1855                "                           aaaaaaaaaaaaaaaa> {};");
1856   verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n"
1857                "    : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n"
1858                "                                 aaaaaaaaaaaaaaaaaaaaaa> {};");
1859   verifyFormat("template <class R, class C>\n"
1860                "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n"
1861                "    : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};");
1862   verifyFormat("class ::A::B {};");
1863 }
1864 
1865 TEST_F(FormatTest, BreakInheritanceStyle) {
1866   FormatStyle StyleWithInheritanceBreakBeforeComma = getLLVMStyle();
1867   StyleWithInheritanceBreakBeforeComma.BreakInheritanceList =
1868       FormatStyle::BILS_BeforeComma;
1869   verifyFormat("class MyClass : public X {};",
1870                StyleWithInheritanceBreakBeforeComma);
1871   verifyFormat("class MyClass\n"
1872                "    : public X\n"
1873                "    , public Y {};",
1874                StyleWithInheritanceBreakBeforeComma);
1875   verifyFormat("class AAAAAAAAAAAAAAAAAAAAAA\n"
1876                "    : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n"
1877                "    , public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};",
1878                StyleWithInheritanceBreakBeforeComma);
1879   verifyFormat("struct aaaaaaaaaaaaa\n"
1880                "    : public aaaaaaaaaaaaaaaaaaa< // break\n"
1881                "          aaaaaaaaaaaaaaaa> {};",
1882                StyleWithInheritanceBreakBeforeComma);
1883 
1884   FormatStyle StyleWithInheritanceBreakAfterColon = getLLVMStyle();
1885   StyleWithInheritanceBreakAfterColon.BreakInheritanceList =
1886       FormatStyle::BILS_AfterColon;
1887   verifyFormat("class MyClass : public X {};",
1888                StyleWithInheritanceBreakAfterColon);
1889   verifyFormat("class MyClass : public X, public Y {};",
1890                StyleWithInheritanceBreakAfterColon);
1891   verifyFormat("class AAAAAAAAAAAAAAAAAAAAAA :\n"
1892                "    public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
1893                "    public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};",
1894                StyleWithInheritanceBreakAfterColon);
1895   verifyFormat("struct aaaaaaaaaaaaa :\n"
1896                "    public aaaaaaaaaaaaaaaaaaa< // break\n"
1897                "        aaaaaaaaaaaaaaaa> {};",
1898                StyleWithInheritanceBreakAfterColon);
1899 }
1900 
1901 TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) {
1902   verifyFormat("class A {\n} a, b;");
1903   verifyFormat("struct A {\n} a, b;");
1904   verifyFormat("union A {\n} a;");
1905 }
1906 
1907 TEST_F(FormatTest, FormatsEnum) {
1908   verifyFormat("enum {\n"
1909                "  Zero,\n"
1910                "  One = 1,\n"
1911                "  Two = One + 1,\n"
1912                "  Three = (One + Two),\n"
1913                "  Four = (Zero && (One ^ Two)) | (One << Two),\n"
1914                "  Five = (One, Two, Three, Four, 5)\n"
1915                "};");
1916   verifyGoogleFormat("enum {\n"
1917                      "  Zero,\n"
1918                      "  One = 1,\n"
1919                      "  Two = One + 1,\n"
1920                      "  Three = (One + Two),\n"
1921                      "  Four = (Zero && (One ^ Two)) | (One << Two),\n"
1922                      "  Five = (One, Two, Three, Four, 5)\n"
1923                      "};");
1924   verifyFormat("enum Enum {};");
1925   verifyFormat("enum {};");
1926   verifyFormat("enum X E {} d;");
1927   verifyFormat("enum __attribute__((...)) E {} d;");
1928   verifyFormat("enum __declspec__((...)) E {} d;");
1929   verifyFormat("enum {\n"
1930                "  Bar = Foo<int, int>::value\n"
1931                "};",
1932                getLLVMStyleWithColumns(30));
1933 
1934   verifyFormat("enum ShortEnum { A, B, C };");
1935   verifyGoogleFormat("enum ShortEnum { A, B, C };");
1936 
1937   EXPECT_EQ("enum KeepEmptyLines {\n"
1938             "  ONE,\n"
1939             "\n"
1940             "  TWO,\n"
1941             "\n"
1942             "  THREE\n"
1943             "}",
1944             format("enum KeepEmptyLines {\n"
1945                    "  ONE,\n"
1946                    "\n"
1947                    "  TWO,\n"
1948                    "\n"
1949                    "\n"
1950                    "  THREE\n"
1951                    "}"));
1952   verifyFormat("enum E { // comment\n"
1953                "  ONE,\n"
1954                "  TWO\n"
1955                "};\n"
1956                "int i;");
1957 
1958   FormatStyle EightIndent = getLLVMStyle();
1959   EightIndent.IndentWidth = 8;
1960   verifyFormat("enum {\n"
1961                "        VOID,\n"
1962                "        CHAR,\n"
1963                "        SHORT,\n"
1964                "        INT,\n"
1965                "        LONG,\n"
1966                "        SIGNED,\n"
1967                "        UNSIGNED,\n"
1968                "        BOOL,\n"
1969                "        FLOAT,\n"
1970                "        DOUBLE,\n"
1971                "        COMPLEX\n"
1972                "};",
1973                EightIndent);
1974 
1975   // Not enums.
1976   verifyFormat("enum X f() {\n"
1977                "  a();\n"
1978                "  return 42;\n"
1979                "}");
1980   verifyFormat("enum X Type::f() {\n"
1981                "  a();\n"
1982                "  return 42;\n"
1983                "}");
1984   verifyFormat("enum ::X f() {\n"
1985                "  a();\n"
1986                "  return 42;\n"
1987                "}");
1988   verifyFormat("enum ns::X f() {\n"
1989                "  a();\n"
1990                "  return 42;\n"
1991                "}");
1992 }
1993 
1994 TEST_F(FormatTest, FormatsEnumsWithErrors) {
1995   verifyFormat("enum Type {\n"
1996                "  One = 0; // These semicolons should be commas.\n"
1997                "  Two = 1;\n"
1998                "};");
1999   verifyFormat("namespace n {\n"
2000                "enum Type {\n"
2001                "  One,\n"
2002                "  Two, // missing };\n"
2003                "  int i;\n"
2004                "}\n"
2005                "void g() {}");
2006 }
2007 
2008 TEST_F(FormatTest, FormatsEnumStruct) {
2009   verifyFormat("enum struct {\n"
2010                "  Zero,\n"
2011                "  One = 1,\n"
2012                "  Two = One + 1,\n"
2013                "  Three = (One + Two),\n"
2014                "  Four = (Zero && (One ^ Two)) | (One << Two),\n"
2015                "  Five = (One, Two, Three, Four, 5)\n"
2016                "};");
2017   verifyFormat("enum struct Enum {};");
2018   verifyFormat("enum struct {};");
2019   verifyFormat("enum struct X E {} d;");
2020   verifyFormat("enum struct __attribute__((...)) E {} d;");
2021   verifyFormat("enum struct __declspec__((...)) E {} d;");
2022   verifyFormat("enum struct X f() {\n  a();\n  return 42;\n}");
2023 }
2024 
2025 TEST_F(FormatTest, FormatsEnumClass) {
2026   verifyFormat("enum class {\n"
2027                "  Zero,\n"
2028                "  One = 1,\n"
2029                "  Two = One + 1,\n"
2030                "  Three = (One + Two),\n"
2031                "  Four = (Zero && (One ^ Two)) | (One << Two),\n"
2032                "  Five = (One, Two, Three, Four, 5)\n"
2033                "};");
2034   verifyFormat("enum class Enum {};");
2035   verifyFormat("enum class {};");
2036   verifyFormat("enum class X E {} d;");
2037   verifyFormat("enum class __attribute__((...)) E {} d;");
2038   verifyFormat("enum class __declspec__((...)) E {} d;");
2039   verifyFormat("enum class X f() {\n  a();\n  return 42;\n}");
2040 }
2041 
2042 TEST_F(FormatTest, FormatsEnumTypes) {
2043   verifyFormat("enum X : int {\n"
2044                "  A, // Force multiple lines.\n"
2045                "  B\n"
2046                "};");
2047   verifyFormat("enum X : int { A, B };");
2048   verifyFormat("enum X : std::uint32_t { A, B };");
2049 }
2050 
2051 TEST_F(FormatTest, FormatsTypedefEnum) {
2052   FormatStyle Style = getLLVMStyle();
2053   Style.ColumnLimit = 40;
2054   verifyFormat("typedef enum {} EmptyEnum;");
2055   verifyFormat("typedef enum { A, B, C } ShortEnum;");
2056   verifyFormat("typedef enum {\n"
2057                "  ZERO = 0,\n"
2058                "  ONE = 1,\n"
2059                "  TWO = 2,\n"
2060                "  THREE = 3\n"
2061                "} LongEnum;",
2062                Style);
2063   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
2064   Style.BraceWrapping.AfterEnum = true;
2065   verifyFormat("typedef enum {} EmptyEnum;");
2066   verifyFormat("typedef enum { A, B, C } ShortEnum;");
2067   verifyFormat("typedef enum\n"
2068                "{\n"
2069                "  ZERO = 0,\n"
2070                "  ONE = 1,\n"
2071                "  TWO = 2,\n"
2072                "  THREE = 3\n"
2073                "} LongEnum;",
2074                Style);
2075 }
2076 
2077 TEST_F(FormatTest, FormatsNSEnums) {
2078   verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }");
2079   verifyGoogleFormat(
2080       "typedef NS_CLOSED_ENUM(NSInteger, SomeName) { AAA, BBB }");
2081   verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n"
2082                      "  // Information about someDecentlyLongValue.\n"
2083                      "  someDecentlyLongValue,\n"
2084                      "  // Information about anotherDecentlyLongValue.\n"
2085                      "  anotherDecentlyLongValue,\n"
2086                      "  // Information about aThirdDecentlyLongValue.\n"
2087                      "  aThirdDecentlyLongValue\n"
2088                      "};");
2089   verifyGoogleFormat("typedef NS_CLOSED_ENUM(NSInteger, MyType) {\n"
2090                      "  // Information about someDecentlyLongValue.\n"
2091                      "  someDecentlyLongValue,\n"
2092                      "  // Information about anotherDecentlyLongValue.\n"
2093                      "  anotherDecentlyLongValue,\n"
2094                      "  // Information about aThirdDecentlyLongValue.\n"
2095                      "  aThirdDecentlyLongValue\n"
2096                      "};");
2097   verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n"
2098                      "  a = 1,\n"
2099                      "  b = 2,\n"
2100                      "  c = 3,\n"
2101                      "};");
2102   verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n"
2103                      "  a = 1,\n"
2104                      "  b = 2,\n"
2105                      "  c = 3,\n"
2106                      "};");
2107   verifyGoogleFormat("typedef CF_CLOSED_ENUM(NSInteger, MyType) {\n"
2108                      "  a = 1,\n"
2109                      "  b = 2,\n"
2110                      "  c = 3,\n"
2111                      "};");
2112   verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n"
2113                      "  a = 1,\n"
2114                      "  b = 2,\n"
2115                      "  c = 3,\n"
2116                      "};");
2117 }
2118 
2119 TEST_F(FormatTest, FormatsBitfields) {
2120   verifyFormat("struct Bitfields {\n"
2121                "  unsigned sClass : 8;\n"
2122                "  unsigned ValueKind : 2;\n"
2123                "};");
2124   verifyFormat("struct A {\n"
2125                "  int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n"
2126                "      bbbbbbbbbbbbbbbbbbbbbbbbb;\n"
2127                "};");
2128   verifyFormat("struct MyStruct {\n"
2129                "  uchar data;\n"
2130                "  uchar : 8;\n"
2131                "  uchar : 8;\n"
2132                "  uchar other;\n"
2133                "};");
2134 }
2135 
2136 TEST_F(FormatTest, FormatsNamespaces) {
2137   FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle();
2138   LLVMWithNoNamespaceFix.FixNamespaceComments = false;
2139 
2140   verifyFormat("namespace some_namespace {\n"
2141                "class A {};\n"
2142                "void f() { f(); }\n"
2143                "}",
2144                LLVMWithNoNamespaceFix);
2145   verifyFormat("namespace N::inline D {\n"
2146                "class A {};\n"
2147                "void f() { f(); }\n"
2148                "}",
2149                LLVMWithNoNamespaceFix);
2150   verifyFormat("namespace N::inline D::E {\n"
2151                "class A {};\n"
2152                "void f() { f(); }\n"
2153                "}",
2154                LLVMWithNoNamespaceFix);
2155   verifyFormat("namespace [[deprecated(\"foo[bar\")]] some_namespace {\n"
2156                "class A {};\n"
2157                "void f() { f(); }\n"
2158                "}",
2159                LLVMWithNoNamespaceFix);
2160   verifyFormat("/* something */ namespace some_namespace {\n"
2161                "class A {};\n"
2162                "void f() { f(); }\n"
2163                "}",
2164                LLVMWithNoNamespaceFix);
2165   verifyFormat("namespace {\n"
2166                "class A {};\n"
2167                "void f() { f(); }\n"
2168                "}",
2169                LLVMWithNoNamespaceFix);
2170   verifyFormat("/* something */ namespace {\n"
2171                "class A {};\n"
2172                "void f() { f(); }\n"
2173                "}",
2174                LLVMWithNoNamespaceFix);
2175   verifyFormat("inline namespace X {\n"
2176                "class A {};\n"
2177                "void f() { f(); }\n"
2178                "}",
2179                LLVMWithNoNamespaceFix);
2180   verifyFormat("/* something */ inline namespace X {\n"
2181                "class A {};\n"
2182                "void f() { f(); }\n"
2183                "}",
2184                LLVMWithNoNamespaceFix);
2185   verifyFormat("export namespace X {\n"
2186                "class A {};\n"
2187                "void f() { f(); }\n"
2188                "}",
2189                LLVMWithNoNamespaceFix);
2190   verifyFormat("using namespace some_namespace;\n"
2191                "class A {};\n"
2192                "void f() { f(); }",
2193                LLVMWithNoNamespaceFix);
2194 
2195   // This code is more common than we thought; if we
2196   // layout this correctly the semicolon will go into
2197   // its own line, which is undesirable.
2198   verifyFormat("namespace {};", LLVMWithNoNamespaceFix);
2199   verifyFormat("namespace {\n"
2200                "class A {};\n"
2201                "};",
2202                LLVMWithNoNamespaceFix);
2203 
2204   verifyFormat("namespace {\n"
2205                "int SomeVariable = 0; // comment\n"
2206                "} // namespace",
2207                LLVMWithNoNamespaceFix);
2208   EXPECT_EQ("#ifndef HEADER_GUARD\n"
2209             "#define HEADER_GUARD\n"
2210             "namespace my_namespace {\n"
2211             "int i;\n"
2212             "} // my_namespace\n"
2213             "#endif // HEADER_GUARD",
2214             format("#ifndef HEADER_GUARD\n"
2215                    " #define HEADER_GUARD\n"
2216                    "   namespace my_namespace {\n"
2217                    "int i;\n"
2218                    "}    // my_namespace\n"
2219                    "#endif    // HEADER_GUARD",
2220                    LLVMWithNoNamespaceFix));
2221 
2222   EXPECT_EQ("namespace A::B {\n"
2223             "class C {};\n"
2224             "}",
2225             format("namespace A::B {\n"
2226                    "class C {};\n"
2227                    "}",
2228                    LLVMWithNoNamespaceFix));
2229 
2230   FormatStyle Style = getLLVMStyle();
2231   Style.NamespaceIndentation = FormatStyle::NI_All;
2232   EXPECT_EQ("namespace out {\n"
2233             "  int i;\n"
2234             "  namespace in {\n"
2235             "    int i;\n"
2236             "  } // namespace in\n"
2237             "} // namespace out",
2238             format("namespace out {\n"
2239                    "int i;\n"
2240                    "namespace in {\n"
2241                    "int i;\n"
2242                    "} // namespace in\n"
2243                    "} // namespace out",
2244                    Style));
2245 
2246   Style.NamespaceIndentation = FormatStyle::NI_Inner;
2247   EXPECT_EQ("namespace out {\n"
2248             "int i;\n"
2249             "namespace in {\n"
2250             "  int i;\n"
2251             "} // namespace in\n"
2252             "} // namespace out",
2253             format("namespace out {\n"
2254                    "int i;\n"
2255                    "namespace in {\n"
2256                    "int i;\n"
2257                    "} // namespace in\n"
2258                    "} // namespace out",
2259                    Style));
2260 }
2261 
2262 TEST_F(FormatTest, NamespaceMacros) {
2263   FormatStyle Style = getLLVMStyle();
2264   Style.NamespaceMacros.push_back("TESTSUITE");
2265 
2266   verifyFormat("TESTSUITE(A) {\n"
2267                "int foo();\n"
2268                "} // TESTSUITE(A)",
2269                Style);
2270 
2271   verifyFormat("TESTSUITE(A, B) {\n"
2272                "int foo();\n"
2273                "} // TESTSUITE(A)",
2274                Style);
2275 
2276   // Properly indent according to NamespaceIndentation style
2277   Style.NamespaceIndentation = FormatStyle::NI_All;
2278   verifyFormat("TESTSUITE(A) {\n"
2279                "  int foo();\n"
2280                "} // TESTSUITE(A)",
2281                Style);
2282   verifyFormat("TESTSUITE(A) {\n"
2283                "  namespace B {\n"
2284                "    int foo();\n"
2285                "  } // namespace B\n"
2286                "} // TESTSUITE(A)",
2287                Style);
2288   verifyFormat("namespace A {\n"
2289                "  TESTSUITE(B) {\n"
2290                "    int foo();\n"
2291                "  } // TESTSUITE(B)\n"
2292                "} // namespace A",
2293                Style);
2294 
2295   Style.NamespaceIndentation = FormatStyle::NI_Inner;
2296   verifyFormat("TESTSUITE(A) {\n"
2297                "TESTSUITE(B) {\n"
2298                "  int foo();\n"
2299                "} // TESTSUITE(B)\n"
2300                "} // TESTSUITE(A)",
2301                Style);
2302   verifyFormat("TESTSUITE(A) {\n"
2303                "namespace B {\n"
2304                "  int foo();\n"
2305                "} // namespace B\n"
2306                "} // TESTSUITE(A)",
2307                Style);
2308   verifyFormat("namespace A {\n"
2309                "TESTSUITE(B) {\n"
2310                "  int foo();\n"
2311                "} // TESTSUITE(B)\n"
2312                "} // namespace A",
2313                Style);
2314 
2315   // Properly merge namespace-macros blocks in CompactNamespaces mode
2316   Style.NamespaceIndentation = FormatStyle::NI_None;
2317   Style.CompactNamespaces = true;
2318   verifyFormat("TESTSUITE(A) { TESTSUITE(B) {\n"
2319                "}} // TESTSUITE(A::B)",
2320                Style);
2321 
2322   EXPECT_EQ("TESTSUITE(out) { TESTSUITE(in) {\n"
2323             "}} // TESTSUITE(out::in)",
2324             format("TESTSUITE(out) {\n"
2325                    "TESTSUITE(in) {\n"
2326                    "} // TESTSUITE(in)\n"
2327                    "} // TESTSUITE(out)",
2328                    Style));
2329 
2330   EXPECT_EQ("TESTSUITE(out) { TESTSUITE(in) {\n"
2331             "}} // TESTSUITE(out::in)",
2332             format("TESTSUITE(out) {\n"
2333                    "TESTSUITE(in) {\n"
2334                    "} // TESTSUITE(in)\n"
2335                    "} // TESTSUITE(out)",
2336                    Style));
2337 
2338   // Do not merge different namespaces/macros
2339   EXPECT_EQ("namespace out {\n"
2340             "TESTSUITE(in) {\n"
2341             "} // TESTSUITE(in)\n"
2342             "} // namespace out",
2343             format("namespace out {\n"
2344                    "TESTSUITE(in) {\n"
2345                    "} // TESTSUITE(in)\n"
2346                    "} // namespace out",
2347                    Style));
2348   EXPECT_EQ("TESTSUITE(out) {\n"
2349             "namespace in {\n"
2350             "} // namespace in\n"
2351             "} // TESTSUITE(out)",
2352             format("TESTSUITE(out) {\n"
2353                    "namespace in {\n"
2354                    "} // namespace in\n"
2355                    "} // TESTSUITE(out)",
2356                    Style));
2357   Style.NamespaceMacros.push_back("FOOBAR");
2358   EXPECT_EQ("TESTSUITE(out) {\n"
2359             "FOOBAR(in) {\n"
2360             "} // FOOBAR(in)\n"
2361             "} // TESTSUITE(out)",
2362             format("TESTSUITE(out) {\n"
2363                    "FOOBAR(in) {\n"
2364                    "} // FOOBAR(in)\n"
2365                    "} // TESTSUITE(out)",
2366                    Style));
2367 }
2368 
2369 TEST_F(FormatTest, FormatsCompactNamespaces) {
2370   FormatStyle Style = getLLVMStyle();
2371   Style.CompactNamespaces = true;
2372   Style.NamespaceMacros.push_back("TESTSUITE");
2373 
2374   verifyFormat("namespace A { namespace B {\n"
2375                "}} // namespace A::B",
2376                Style);
2377 
2378   EXPECT_EQ("namespace out { namespace in {\n"
2379             "}} // namespace out::in",
2380             format("namespace out {\n"
2381                    "namespace in {\n"
2382                    "} // namespace in\n"
2383                    "} // namespace out",
2384                    Style));
2385 
2386   // Only namespaces which have both consecutive opening and end get compacted
2387   EXPECT_EQ("namespace out {\n"
2388             "namespace in1 {\n"
2389             "} // namespace in1\n"
2390             "namespace in2 {\n"
2391             "} // namespace in2\n"
2392             "} // namespace out",
2393             format("namespace out {\n"
2394                    "namespace in1 {\n"
2395                    "} // namespace in1\n"
2396                    "namespace in2 {\n"
2397                    "} // namespace in2\n"
2398                    "} // namespace out",
2399                    Style));
2400 
2401   EXPECT_EQ("namespace out {\n"
2402             "int i;\n"
2403             "namespace in {\n"
2404             "int j;\n"
2405             "} // namespace in\n"
2406             "int k;\n"
2407             "} // namespace out",
2408             format("namespace out { int i;\n"
2409                    "namespace in { int j; } // namespace in\n"
2410                    "int k; } // namespace out",
2411                    Style));
2412 
2413   EXPECT_EQ("namespace A { namespace B { namespace C {\n"
2414             "}}} // namespace A::B::C\n",
2415             format("namespace A { namespace B {\n"
2416                    "namespace C {\n"
2417                    "}} // namespace B::C\n"
2418                    "} // namespace A\n",
2419                    Style));
2420 
2421   Style.ColumnLimit = 40;
2422   EXPECT_EQ("namespace aaaaaaaaaa {\n"
2423             "namespace bbbbbbbbbb {\n"
2424             "}} // namespace aaaaaaaaaa::bbbbbbbbbb",
2425             format("namespace aaaaaaaaaa {\n"
2426                    "namespace bbbbbbbbbb {\n"
2427                    "} // namespace bbbbbbbbbb\n"
2428                    "} // namespace aaaaaaaaaa",
2429                    Style));
2430 
2431   EXPECT_EQ("namespace aaaaaa { namespace bbbbbb {\n"
2432             "namespace cccccc {\n"
2433             "}}} // namespace aaaaaa::bbbbbb::cccccc",
2434             format("namespace aaaaaa {\n"
2435                    "namespace bbbbbb {\n"
2436                    "namespace cccccc {\n"
2437                    "} // namespace cccccc\n"
2438                    "} // namespace bbbbbb\n"
2439                    "} // namespace aaaaaa",
2440                    Style));
2441   Style.ColumnLimit = 80;
2442 
2443   // Extra semicolon after 'inner' closing brace prevents merging
2444   EXPECT_EQ("namespace out { namespace in {\n"
2445             "}; } // namespace out::in",
2446             format("namespace out {\n"
2447                    "namespace in {\n"
2448                    "}; // namespace in\n"
2449                    "} // namespace out",
2450                    Style));
2451 
2452   // Extra semicolon after 'outer' closing brace is conserved
2453   EXPECT_EQ("namespace out { namespace in {\n"
2454             "}}; // namespace out::in",
2455             format("namespace out {\n"
2456                    "namespace in {\n"
2457                    "} // namespace in\n"
2458                    "}; // namespace out",
2459                    Style));
2460 
2461   Style.NamespaceIndentation = FormatStyle::NI_All;
2462   EXPECT_EQ("namespace out { namespace in {\n"
2463             "  int i;\n"
2464             "}} // namespace out::in",
2465             format("namespace out {\n"
2466                    "namespace in {\n"
2467                    "int i;\n"
2468                    "} // namespace in\n"
2469                    "} // namespace out",
2470                    Style));
2471   EXPECT_EQ("namespace out { namespace mid {\n"
2472             "  namespace in {\n"
2473             "    int j;\n"
2474             "  } // namespace in\n"
2475             "  int k;\n"
2476             "}} // namespace out::mid",
2477             format("namespace out { namespace mid {\n"
2478                    "namespace in { int j; } // namespace in\n"
2479                    "int k; }} // namespace out::mid",
2480                    Style));
2481 
2482   Style.NamespaceIndentation = FormatStyle::NI_Inner;
2483   EXPECT_EQ("namespace out { namespace in {\n"
2484             "  int i;\n"
2485             "}} // namespace out::in",
2486             format("namespace out {\n"
2487                    "namespace in {\n"
2488                    "int i;\n"
2489                    "} // namespace in\n"
2490                    "} // namespace out",
2491                    Style));
2492   EXPECT_EQ("namespace out { namespace mid { namespace in {\n"
2493             "  int i;\n"
2494             "}}} // namespace out::mid::in",
2495             format("namespace out {\n"
2496                    "namespace mid {\n"
2497                    "namespace in {\n"
2498                    "int i;\n"
2499                    "} // namespace in\n"
2500                    "} // namespace mid\n"
2501                    "} // namespace out",
2502                    Style));
2503 }
2504 
2505 TEST_F(FormatTest, FormatsExternC) {
2506   verifyFormat("extern \"C\" {\nint a;");
2507   verifyFormat("extern \"C\" {}");
2508   verifyFormat("extern \"C\" {\n"
2509                "int foo();\n"
2510                "}");
2511   verifyFormat("extern \"C\" int foo() {}");
2512   verifyFormat("extern \"C\" int foo();");
2513   verifyFormat("extern \"C\" int foo() {\n"
2514                "  int i = 42;\n"
2515                "  return i;\n"
2516                "}");
2517 
2518   FormatStyle Style = getLLVMStyle();
2519   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
2520   Style.BraceWrapping.AfterFunction = true;
2521   verifyFormat("extern \"C\" int foo() {}", Style);
2522   verifyFormat("extern \"C\" int foo();", Style);
2523   verifyFormat("extern \"C\" int foo()\n"
2524                "{\n"
2525                "  int i = 42;\n"
2526                "  return i;\n"
2527                "}",
2528                Style);
2529 
2530   Style.BraceWrapping.AfterExternBlock = true;
2531   Style.BraceWrapping.SplitEmptyRecord = false;
2532   verifyFormat("extern \"C\"\n"
2533                "{}",
2534                Style);
2535   verifyFormat("extern \"C\"\n"
2536                "{\n"
2537                "  int foo();\n"
2538                "}",
2539                Style);
2540 }
2541 
2542 TEST_F(FormatTest, FormatsInlineASM) {
2543   verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));");
2544   verifyFormat("asm(\"nop\" ::: \"memory\");");
2545   verifyFormat(
2546       "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n"
2547       "    \"cpuid\\n\\t\"\n"
2548       "    \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n"
2549       "    : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n"
2550       "    : \"a\"(value));");
2551   EXPECT_EQ(
2552       "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
2553       "  __asm {\n"
2554       "        mov     edx,[that] // vtable in edx\n"
2555       "        mov     eax,methodIndex\n"
2556       "        call    [edx][eax*4] // stdcall\n"
2557       "  }\n"
2558       "}",
2559       format("void NS_InvokeByIndex(void *that,   unsigned int methodIndex) {\n"
2560              "    __asm {\n"
2561              "        mov     edx,[that] // vtable in edx\n"
2562              "        mov     eax,methodIndex\n"
2563              "        call    [edx][eax*4] // stdcall\n"
2564              "    }\n"
2565              "}"));
2566   EXPECT_EQ("_asm {\n"
2567             "  xor eax, eax;\n"
2568             "  cpuid;\n"
2569             "}",
2570             format("_asm {\n"
2571                    "  xor eax, eax;\n"
2572                    "  cpuid;\n"
2573                    "}"));
2574   verifyFormat("void function() {\n"
2575                "  // comment\n"
2576                "  asm(\"\");\n"
2577                "}");
2578   EXPECT_EQ("__asm {\n"
2579             "}\n"
2580             "int i;",
2581             format("__asm   {\n"
2582                    "}\n"
2583                    "int   i;"));
2584 }
2585 
2586 TEST_F(FormatTest, FormatTryCatch) {
2587   verifyFormat("try {\n"
2588                "  throw a * b;\n"
2589                "} catch (int a) {\n"
2590                "  // Do nothing.\n"
2591                "} catch (...) {\n"
2592                "  exit(42);\n"
2593                "}");
2594 
2595   // Function-level try statements.
2596   verifyFormat("int f() try { return 4; } catch (...) {\n"
2597                "  return 5;\n"
2598                "}");
2599   verifyFormat("class A {\n"
2600                "  int a;\n"
2601                "  A() try : a(0) {\n"
2602                "  } catch (...) {\n"
2603                "    throw;\n"
2604                "  }\n"
2605                "};\n");
2606 
2607   // Incomplete try-catch blocks.
2608   verifyIncompleteFormat("try {} catch (");
2609 }
2610 
2611 TEST_F(FormatTest, FormatSEHTryCatch) {
2612   verifyFormat("__try {\n"
2613                "  int a = b * c;\n"
2614                "} __except (EXCEPTION_EXECUTE_HANDLER) {\n"
2615                "  // Do nothing.\n"
2616                "}");
2617 
2618   verifyFormat("__try {\n"
2619                "  int a = b * c;\n"
2620                "} __finally {\n"
2621                "  // Do nothing.\n"
2622                "}");
2623 
2624   verifyFormat("DEBUG({\n"
2625                "  __try {\n"
2626                "  } __finally {\n"
2627                "  }\n"
2628                "});\n");
2629 }
2630 
2631 TEST_F(FormatTest, IncompleteTryCatchBlocks) {
2632   verifyFormat("try {\n"
2633                "  f();\n"
2634                "} catch {\n"
2635                "  g();\n"
2636                "}");
2637   verifyFormat("try {\n"
2638                "  f();\n"
2639                "} catch (A a) MACRO(x) {\n"
2640                "  g();\n"
2641                "} catch (B b) MACRO(x) {\n"
2642                "  g();\n"
2643                "}");
2644 }
2645 
2646 TEST_F(FormatTest, FormatTryCatchBraceStyles) {
2647   FormatStyle Style = getLLVMStyle();
2648   for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla,
2649                           FormatStyle::BS_WebKit}) {
2650     Style.BreakBeforeBraces = BraceStyle;
2651     verifyFormat("try {\n"
2652                  "  // something\n"
2653                  "} catch (...) {\n"
2654                  "  // something\n"
2655                  "}",
2656                  Style);
2657   }
2658   Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
2659   verifyFormat("try {\n"
2660                "  // something\n"
2661                "}\n"
2662                "catch (...) {\n"
2663                "  // something\n"
2664                "}",
2665                Style);
2666   verifyFormat("__try {\n"
2667                "  // something\n"
2668                "}\n"
2669                "__finally {\n"
2670                "  // something\n"
2671                "}",
2672                Style);
2673   verifyFormat("@try {\n"
2674                "  // something\n"
2675                "}\n"
2676                "@finally {\n"
2677                "  // something\n"
2678                "}",
2679                Style);
2680   Style.BreakBeforeBraces = FormatStyle::BS_Allman;
2681   verifyFormat("try\n"
2682                "{\n"
2683                "  // something\n"
2684                "}\n"
2685                "catch (...)\n"
2686                "{\n"
2687                "  // something\n"
2688                "}",
2689                Style);
2690   Style.BreakBeforeBraces = FormatStyle::BS_Whitesmiths;
2691   verifyFormat("try\n"
2692                "  {\n"
2693                "  // something white\n"
2694                "  }\n"
2695                "catch (...)\n"
2696                "  {\n"
2697                "  // something white\n"
2698                "  }",
2699                Style);
2700   Style.BreakBeforeBraces = FormatStyle::BS_GNU;
2701   verifyFormat("try\n"
2702                "  {\n"
2703                "    // something\n"
2704                "  }\n"
2705                "catch (...)\n"
2706                "  {\n"
2707                "    // something\n"
2708                "  }",
2709                Style);
2710   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
2711   Style.BraceWrapping.BeforeCatch = true;
2712   verifyFormat("try {\n"
2713                "  // something\n"
2714                "}\n"
2715                "catch (...) {\n"
2716                "  // something\n"
2717                "}",
2718                Style);
2719 }
2720 
2721 TEST_F(FormatTest, StaticInitializers) {
2722   verifyFormat("static SomeClass SC = {1, 'a'};");
2723 
2724   verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n"
2725                "    100000000, "
2726                "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};");
2727 
2728   // Here, everything other than the "}" would fit on a line.
2729   verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n"
2730                "    10000000000000000000000000};");
2731   EXPECT_EQ("S s = {a,\n"
2732             "\n"
2733             "       b};",
2734             format("S s = {\n"
2735                    "  a,\n"
2736                    "\n"
2737                    "  b\n"
2738                    "};"));
2739 
2740   // FIXME: This would fit into the column limit if we'd fit "{ {" on the first
2741   // line. However, the formatting looks a bit off and this probably doesn't
2742   // happen often in practice.
2743   verifyFormat("static int Variable[1] = {\n"
2744                "    {1000000000000000000000000000000000000}};",
2745                getLLVMStyleWithColumns(40));
2746 }
2747 
2748 TEST_F(FormatTest, DesignatedInitializers) {
2749   verifyFormat("const struct A a = {.a = 1, .b = 2};");
2750   verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n"
2751                "                    .bbbbbbbbbb = 2,\n"
2752                "                    .cccccccccc = 3,\n"
2753                "                    .dddddddddd = 4,\n"
2754                "                    .eeeeeeeeee = 5};");
2755   verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
2756                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n"
2757                "    .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n"
2758                "    .ccccccccccccccccccccccccccc = 3,\n"
2759                "    .ddddddddddddddddddddddddddd = 4,\n"
2760                "    .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};");
2761 
2762   verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};");
2763 
2764   verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
2765   verifyFormat("const struct A a = {[1] = aaaaaaaaaa,\n"
2766                "                    [2] = bbbbbbbbbb,\n"
2767                "                    [3] = cccccccccc,\n"
2768                "                    [4] = dddddddddd,\n"
2769                "                    [5] = eeeeeeeeee};");
2770   verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
2771                "    [1] = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2772                "    [2] = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
2773                "    [3] = cccccccccccccccccccccccccccccccccccccc,\n"
2774                "    [4] = dddddddddddddddddddddddddddddddddddddd,\n"
2775                "    [5] = eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee};");
2776 }
2777 
2778 TEST_F(FormatTest, NestedStaticInitializers) {
2779   verifyFormat("static A x = {{{}}};\n");
2780   verifyFormat("static A x = {{{init1, init2, init3, init4},\n"
2781                "               {init1, init2, init3, init4}}};",
2782                getLLVMStyleWithColumns(50));
2783 
2784   verifyFormat("somes Status::global_reps[3] = {\n"
2785                "    {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
2786                "    {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
2787                "    {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};",
2788                getLLVMStyleWithColumns(60));
2789   verifyGoogleFormat("SomeType Status::global_reps[3] = {\n"
2790                      "    {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
2791                      "    {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
2792                      "    {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};");
2793   verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n"
2794                "                  {rect.fRight - rect.fLeft, rect.fBottom - "
2795                "rect.fTop}};");
2796 
2797   verifyFormat(
2798       "SomeArrayOfSomeType a = {\n"
2799       "    {{1, 2, 3},\n"
2800       "     {1, 2, 3},\n"
2801       "     {111111111111111111111111111111, 222222222222222222222222222222,\n"
2802       "      333333333333333333333333333333},\n"
2803       "     {1, 2, 3},\n"
2804       "     {1, 2, 3}}};");
2805   verifyFormat(
2806       "SomeArrayOfSomeType a = {\n"
2807       "    {{1, 2, 3}},\n"
2808       "    {{1, 2, 3}},\n"
2809       "    {{111111111111111111111111111111, 222222222222222222222222222222,\n"
2810       "      333333333333333333333333333333}},\n"
2811       "    {{1, 2, 3}},\n"
2812       "    {{1, 2, 3}}};");
2813 
2814   verifyFormat("struct {\n"
2815                "  unsigned bit;\n"
2816                "  const char *const name;\n"
2817                "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n"
2818                "                 {kOsWin, \"Windows\"},\n"
2819                "                 {kOsLinux, \"Linux\"},\n"
2820                "                 {kOsCrOS, \"Chrome OS\"}};");
2821   verifyFormat("struct {\n"
2822                "  unsigned bit;\n"
2823                "  const char *const name;\n"
2824                "} kBitsToOs[] = {\n"
2825                "    {kOsMac, \"Mac\"},\n"
2826                "    {kOsWin, \"Windows\"},\n"
2827                "    {kOsLinux, \"Linux\"},\n"
2828                "    {kOsCrOS, \"Chrome OS\"},\n"
2829                "};");
2830 }
2831 
2832 TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) {
2833   verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro("
2834                "                      \\\n"
2835                "    aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)");
2836 }
2837 
2838 TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) {
2839   verifyFormat("virtual void write(ELFWriter *writerrr,\n"
2840                "                   OwningPtr<FileOutputBuffer> &buffer) = 0;");
2841 
2842   // Do break defaulted and deleted functions.
2843   verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
2844                "    default;",
2845                getLLVMStyleWithColumns(40));
2846   verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
2847                "    delete;",
2848                getLLVMStyleWithColumns(40));
2849 }
2850 
2851 TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) {
2852   verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3",
2853                getLLVMStyleWithColumns(40));
2854   verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
2855                getLLVMStyleWithColumns(40));
2856   EXPECT_EQ("#define Q                              \\\n"
2857             "  \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\"    \\\n"
2858             "  \"aaaaaaaa.cpp\"",
2859             format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
2860                    getLLVMStyleWithColumns(40)));
2861 }
2862 
2863 TEST_F(FormatTest, UnderstandsLinePPDirective) {
2864   EXPECT_EQ("# 123 \"A string literal\"",
2865             format("   #     123    \"A string literal\""));
2866 }
2867 
2868 TEST_F(FormatTest, LayoutUnknownPPDirective) {
2869   EXPECT_EQ("#;", format("#;"));
2870   verifyFormat("#\n;\n;\n;");
2871 }
2872 
2873 TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) {
2874   EXPECT_EQ("#line 42 \"test\"\n",
2875             format("#  \\\n  line  \\\n  42  \\\n  \"test\"\n"));
2876   EXPECT_EQ("#define A B\n", format("#  \\\n define  \\\n    A  \\\n       B\n",
2877                                     getLLVMStyleWithColumns(12)));
2878 }
2879 
2880 TEST_F(FormatTest, EndOfFileEndsPPDirective) {
2881   EXPECT_EQ("#line 42 \"test\"",
2882             format("#  \\\n  line  \\\n  42  \\\n  \"test\""));
2883   EXPECT_EQ("#define A B", format("#  \\\n define  \\\n    A  \\\n       B"));
2884 }
2885 
2886 TEST_F(FormatTest, DoesntRemoveUnknownTokens) {
2887   verifyFormat("#define A \\x20");
2888   verifyFormat("#define A \\ x20");
2889   EXPECT_EQ("#define A \\ x20", format("#define A \\   x20"));
2890   verifyFormat("#define A ''");
2891   verifyFormat("#define A ''qqq");
2892   verifyFormat("#define A `qqq");
2893   verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");");
2894   EXPECT_EQ("const char *c = STRINGIFY(\n"
2895             "\\na : b);",
2896             format("const char * c = STRINGIFY(\n"
2897                    "\\na : b);"));
2898 
2899   verifyFormat("a\r\\");
2900   verifyFormat("a\v\\");
2901   verifyFormat("a\f\\");
2902 }
2903 
2904 TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) {
2905   verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13));
2906   verifyFormat("#define A( \\\n    BB)", getLLVMStyleWithColumns(12));
2907   verifyFormat("#define A( \\\n    A, B)", getLLVMStyleWithColumns(12));
2908   // FIXME: We never break before the macro name.
2909   verifyFormat("#define AA( \\\n    B)", getLLVMStyleWithColumns(12));
2910 
2911   verifyFormat("#define A A\n#define A A");
2912   verifyFormat("#define A(X) A\n#define A A");
2913 
2914   verifyFormat("#define Something Other", getLLVMStyleWithColumns(23));
2915   verifyFormat("#define Something    \\\n  Other", getLLVMStyleWithColumns(22));
2916 }
2917 
2918 TEST_F(FormatTest, HandlePreprocessorDirectiveContext) {
2919   EXPECT_EQ("// somecomment\n"
2920             "#include \"a.h\"\n"
2921             "#define A(  \\\n"
2922             "    A, B)\n"
2923             "#include \"b.h\"\n"
2924             "// somecomment\n",
2925             format("  // somecomment\n"
2926                    "  #include \"a.h\"\n"
2927                    "#define A(A,\\\n"
2928                    "    B)\n"
2929                    "    #include \"b.h\"\n"
2930                    " // somecomment\n",
2931                    getLLVMStyleWithColumns(13)));
2932 }
2933 
2934 TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); }
2935 
2936 TEST_F(FormatTest, LayoutCodeInMacroDefinitions) {
2937   EXPECT_EQ("#define A    \\\n"
2938             "  c;         \\\n"
2939             "  e;\n"
2940             "f;",
2941             format("#define A c; e;\n"
2942                    "f;",
2943                    getLLVMStyleWithColumns(14)));
2944 }
2945 
2946 TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); }
2947 
2948 TEST_F(FormatTest, MacroDefinitionInsideStatement) {
2949   EXPECT_EQ("int x,\n"
2950             "#define A\n"
2951             "    y;",
2952             format("int x,\n#define A\ny;"));
2953 }
2954 
2955 TEST_F(FormatTest, HashInMacroDefinition) {
2956   EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle()));
2957   verifyFormat("#define A \\\n  b #c;", getLLVMStyleWithColumns(11));
2958   verifyFormat("#define A  \\\n"
2959                "  {        \\\n"
2960                "    f(#c); \\\n"
2961                "  }",
2962                getLLVMStyleWithColumns(11));
2963 
2964   verifyFormat("#define A(X)         \\\n"
2965                "  void function##X()",
2966                getLLVMStyleWithColumns(22));
2967 
2968   verifyFormat("#define A(a, b, c)   \\\n"
2969                "  void a##b##c()",
2970                getLLVMStyleWithColumns(22));
2971 
2972   verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22));
2973 }
2974 
2975 TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) {
2976   EXPECT_EQ("#define A (x)", format("#define A (x)"));
2977   EXPECT_EQ("#define A(x)", format("#define A(x)"));
2978 
2979   FormatStyle Style = getLLVMStyle();
2980   Style.SpaceBeforeParens = FormatStyle::SBPO_Never;
2981   verifyFormat("#define true ((foo)1)", Style);
2982   Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
2983   verifyFormat("#define false((foo)0)", Style);
2984 }
2985 
2986 TEST_F(FormatTest, EmptyLinesInMacroDefinitions) {
2987   EXPECT_EQ("#define A b;", format("#define A \\\n"
2988                                    "          \\\n"
2989                                    "  b;",
2990                                    getLLVMStyleWithColumns(25)));
2991   EXPECT_EQ("#define A \\\n"
2992             "          \\\n"
2993             "  a;      \\\n"
2994             "  b;",
2995             format("#define A \\\n"
2996                    "          \\\n"
2997                    "  a;      \\\n"
2998                    "  b;",
2999                    getLLVMStyleWithColumns(11)));
3000   EXPECT_EQ("#define A \\\n"
3001             "  a;      \\\n"
3002             "          \\\n"
3003             "  b;",
3004             format("#define A \\\n"
3005                    "  a;      \\\n"
3006                    "          \\\n"
3007                    "  b;",
3008                    getLLVMStyleWithColumns(11)));
3009 }
3010 
3011 TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) {
3012   verifyIncompleteFormat("#define A :");
3013   verifyFormat("#define SOMECASES  \\\n"
3014                "  case 1:          \\\n"
3015                "  case 2\n",
3016                getLLVMStyleWithColumns(20));
3017   verifyFormat("#define MACRO(a) \\\n"
3018                "  if (a)         \\\n"
3019                "    f();         \\\n"
3020                "  else           \\\n"
3021                "    g()",
3022                getLLVMStyleWithColumns(18));
3023   verifyFormat("#define A template <typename T>");
3024   verifyIncompleteFormat("#define STR(x) #x\n"
3025                          "f(STR(this_is_a_string_literal{));");
3026   verifyFormat("#pragma omp threadprivate( \\\n"
3027                "    y)), // expected-warning",
3028                getLLVMStyleWithColumns(28));
3029   verifyFormat("#d, = };");
3030   verifyFormat("#if \"a");
3031   verifyIncompleteFormat("({\n"
3032                          "#define b     \\\n"
3033                          "  }           \\\n"
3034                          "  a\n"
3035                          "a",
3036                          getLLVMStyleWithColumns(15));
3037   verifyFormat("#define A     \\\n"
3038                "  {           \\\n"
3039                "    {\n"
3040                "#define B     \\\n"
3041                "  }           \\\n"
3042                "  }",
3043                getLLVMStyleWithColumns(15));
3044   verifyNoCrash("#if a\na(\n#else\n#endif\n{a");
3045   verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}");
3046   verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};");
3047   verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() {      \n)}");
3048 }
3049 
3050 TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) {
3051   verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline.
3052   EXPECT_EQ("class A : public QObject {\n"
3053             "  Q_OBJECT\n"
3054             "\n"
3055             "  A() {}\n"
3056             "};",
3057             format("class A  :  public QObject {\n"
3058                    "     Q_OBJECT\n"
3059                    "\n"
3060                    "  A() {\n}\n"
3061                    "}  ;"));
3062   EXPECT_EQ("MACRO\n"
3063             "/*static*/ int i;",
3064             format("MACRO\n"
3065                    " /*static*/ int   i;"));
3066   EXPECT_EQ("SOME_MACRO\n"
3067             "namespace {\n"
3068             "void f();\n"
3069             "} // namespace",
3070             format("SOME_MACRO\n"
3071                    "  namespace    {\n"
3072                    "void   f(  );\n"
3073                    "} // namespace"));
3074   // Only if the identifier contains at least 5 characters.
3075   EXPECT_EQ("HTTP f();", format("HTTP\nf();"));
3076   EXPECT_EQ("MACRO\nf();", format("MACRO\nf();"));
3077   // Only if everything is upper case.
3078   EXPECT_EQ("class A : public QObject {\n"
3079             "  Q_Object A() {}\n"
3080             "};",
3081             format("class A  :  public QObject {\n"
3082                    "     Q_Object\n"
3083                    "  A() {\n}\n"
3084                    "}  ;"));
3085 
3086   // Only if the next line can actually start an unwrapped line.
3087   EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;",
3088             format("SOME_WEIRD_LOG_MACRO\n"
3089                    "<< SomeThing;"));
3090 
3091   verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), "
3092                "(n, buffers))\n",
3093                getChromiumStyle(FormatStyle::LK_Cpp));
3094 
3095   // See PR41483
3096   EXPECT_EQ("/**/ FOO(a)\n"
3097             "FOO(b)",
3098             format("/**/ FOO(a)\n"
3099                    "FOO(b)"));
3100 }
3101 
3102 TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) {
3103   EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
3104             "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
3105             "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
3106             "class X {};\n"
3107             "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
3108             "int *createScopDetectionPass() { return 0; }",
3109             format("  INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
3110                    "  INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
3111                    "  INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
3112                    "  class X {};\n"
3113                    "  INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
3114                    "  int *createScopDetectionPass() { return 0; }"));
3115   // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as
3116   // braces, so that inner block is indented one level more.
3117   EXPECT_EQ("int q() {\n"
3118             "  IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
3119             "  IPC_MESSAGE_HANDLER(xxx, qqq)\n"
3120             "  IPC_END_MESSAGE_MAP()\n"
3121             "}",
3122             format("int q() {\n"
3123                    "  IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
3124                    "    IPC_MESSAGE_HANDLER(xxx, qqq)\n"
3125                    "  IPC_END_MESSAGE_MAP()\n"
3126                    "}"));
3127 
3128   // Same inside macros.
3129   EXPECT_EQ("#define LIST(L) \\\n"
3130             "  L(A)          \\\n"
3131             "  L(B)          \\\n"
3132             "  L(C)",
3133             format("#define LIST(L) \\\n"
3134                    "  L(A) \\\n"
3135                    "  L(B) \\\n"
3136                    "  L(C)",
3137                    getGoogleStyle()));
3138 
3139   // These must not be recognized as macros.
3140   EXPECT_EQ("int q() {\n"
3141             "  f(x);\n"
3142             "  f(x) {}\n"
3143             "  f(x)->g();\n"
3144             "  f(x)->*g();\n"
3145             "  f(x).g();\n"
3146             "  f(x) = x;\n"
3147             "  f(x) += x;\n"
3148             "  f(x) -= x;\n"
3149             "  f(x) *= x;\n"
3150             "  f(x) /= x;\n"
3151             "  f(x) %= x;\n"
3152             "  f(x) &= x;\n"
3153             "  f(x) |= x;\n"
3154             "  f(x) ^= x;\n"
3155             "  f(x) >>= x;\n"
3156             "  f(x) <<= x;\n"
3157             "  f(x)[y].z();\n"
3158             "  LOG(INFO) << x;\n"
3159             "  ifstream(x) >> x;\n"
3160             "}\n",
3161             format("int q() {\n"
3162                    "  f(x)\n;\n"
3163                    "  f(x)\n {}\n"
3164                    "  f(x)\n->g();\n"
3165                    "  f(x)\n->*g();\n"
3166                    "  f(x)\n.g();\n"
3167                    "  f(x)\n = x;\n"
3168                    "  f(x)\n += x;\n"
3169                    "  f(x)\n -= x;\n"
3170                    "  f(x)\n *= x;\n"
3171                    "  f(x)\n /= x;\n"
3172                    "  f(x)\n %= x;\n"
3173                    "  f(x)\n &= x;\n"
3174                    "  f(x)\n |= x;\n"
3175                    "  f(x)\n ^= x;\n"
3176                    "  f(x)\n >>= x;\n"
3177                    "  f(x)\n <<= x;\n"
3178                    "  f(x)\n[y].z();\n"
3179                    "  LOG(INFO)\n << x;\n"
3180                    "  ifstream(x)\n >> x;\n"
3181                    "}\n"));
3182   EXPECT_EQ("int q() {\n"
3183             "  F(x)\n"
3184             "  if (1) {\n"
3185             "  }\n"
3186             "  F(x)\n"
3187             "  while (1) {\n"
3188             "  }\n"
3189             "  F(x)\n"
3190             "  G(x);\n"
3191             "  F(x)\n"
3192             "  try {\n"
3193             "    Q();\n"
3194             "  } catch (...) {\n"
3195             "  }\n"
3196             "}\n",
3197             format("int q() {\n"
3198                    "F(x)\n"
3199                    "if (1) {}\n"
3200                    "F(x)\n"
3201                    "while (1) {}\n"
3202                    "F(x)\n"
3203                    "G(x);\n"
3204                    "F(x)\n"
3205                    "try { Q(); } catch (...) {}\n"
3206                    "}\n"));
3207   EXPECT_EQ("class A {\n"
3208             "  A() : t(0) {}\n"
3209             "  A(int i) noexcept() : {}\n"
3210             "  A(X x)\n" // FIXME: function-level try blocks are broken.
3211             "  try : t(0) {\n"
3212             "  } catch (...) {\n"
3213             "  }\n"
3214             "};",
3215             format("class A {\n"
3216                    "  A()\n : t(0) {}\n"
3217                    "  A(int i)\n noexcept() : {}\n"
3218                    "  A(X x)\n"
3219                    "  try : t(0) {} catch (...) {}\n"
3220                    "};"));
3221   FormatStyle Style = getLLVMStyle();
3222   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
3223   Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Always;
3224   Style.BraceWrapping.AfterFunction = true;
3225   EXPECT_EQ("void f()\n"
3226             "try\n"
3227             "{\n"
3228             "}",
3229             format("void f() try {\n"
3230                    "}",
3231                    Style));
3232   EXPECT_EQ("class SomeClass {\n"
3233             "public:\n"
3234             "  SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3235             "};",
3236             format("class SomeClass {\n"
3237                    "public:\n"
3238                    "  SomeClass()\n"
3239                    "  EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3240                    "};"));
3241   EXPECT_EQ("class SomeClass {\n"
3242             "public:\n"
3243             "  SomeClass()\n"
3244             "      EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3245             "};",
3246             format("class SomeClass {\n"
3247                    "public:\n"
3248                    "  SomeClass()\n"
3249                    "  EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3250                    "};",
3251                    getLLVMStyleWithColumns(40)));
3252 
3253   verifyFormat("MACRO(>)");
3254 
3255   // Some macros contain an implicit semicolon.
3256   Style = getLLVMStyle();
3257   Style.StatementMacros.push_back("FOO");
3258   verifyFormat("FOO(a) int b = 0;");
3259   verifyFormat("FOO(a)\n"
3260                "int b = 0;",
3261                Style);
3262   verifyFormat("FOO(a);\n"
3263                "int b = 0;",
3264                Style);
3265   verifyFormat("FOO(argc, argv, \"4.0.2\")\n"
3266                "int b = 0;",
3267                Style);
3268   verifyFormat("FOO()\n"
3269                "int b = 0;",
3270                Style);
3271   verifyFormat("FOO\n"
3272                "int b = 0;",
3273                Style);
3274   verifyFormat("void f() {\n"
3275                "  FOO(a)\n"
3276                "  return a;\n"
3277                "}",
3278                Style);
3279   verifyFormat("FOO(a)\n"
3280                "FOO(b)",
3281                Style);
3282   verifyFormat("int a = 0;\n"
3283                "FOO(b)\n"
3284                "int c = 0;",
3285                Style);
3286   verifyFormat("int a = 0;\n"
3287                "int x = FOO(a)\n"
3288                "int b = 0;",
3289                Style);
3290   verifyFormat("void foo(int a) { FOO(a) }\n"
3291                "uint32_t bar() {}",
3292                Style);
3293 }
3294 
3295 TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) {
3296   verifyFormat("#define A \\\n"
3297                "  f({     \\\n"
3298                "    g();  \\\n"
3299                "  });",
3300                getLLVMStyleWithColumns(11));
3301 }
3302 
3303 TEST_F(FormatTest, IndentPreprocessorDirectives) {
3304   FormatStyle Style = getLLVMStyle();
3305   Style.IndentPPDirectives = FormatStyle::PPDIS_None;
3306   Style.ColumnLimit = 40;
3307   verifyFormat("#ifdef _WIN32\n"
3308                "#define A 0\n"
3309                "#ifdef VAR2\n"
3310                "#define B 1\n"
3311                "#include <someheader.h>\n"
3312                "#define MACRO                          \\\n"
3313                "  some_very_long_func_aaaaaaaaaa();\n"
3314                "#endif\n"
3315                "#else\n"
3316                "#define A 1\n"
3317                "#endif",
3318                Style);
3319   Style.IndentPPDirectives = FormatStyle::PPDIS_AfterHash;
3320   verifyFormat("#ifdef _WIN32\n"
3321                "#  define A 0\n"
3322                "#  ifdef VAR2\n"
3323                "#    define B 1\n"
3324                "#    include <someheader.h>\n"
3325                "#    define MACRO                      \\\n"
3326                "      some_very_long_func_aaaaaaaaaa();\n"
3327                "#  endif\n"
3328                "#else\n"
3329                "#  define A 1\n"
3330                "#endif",
3331                Style);
3332   verifyFormat("#if A\n"
3333                "#  define MACRO                        \\\n"
3334                "    void a(int x) {                    \\\n"
3335                "      b();                             \\\n"
3336                "      c();                             \\\n"
3337                "      d();                             \\\n"
3338                "      e();                             \\\n"
3339                "      f();                             \\\n"
3340                "    }\n"
3341                "#endif",
3342                Style);
3343   // Comments before include guard.
3344   verifyFormat("// file comment\n"
3345                "// file comment\n"
3346                "#ifndef HEADER_H\n"
3347                "#define HEADER_H\n"
3348                "code();\n"
3349                "#endif",
3350                Style);
3351   // Test with include guards.
3352   verifyFormat("#ifndef HEADER_H\n"
3353                "#define HEADER_H\n"
3354                "code();\n"
3355                "#endif",
3356                Style);
3357   // Include guards must have a #define with the same variable immediately
3358   // after #ifndef.
3359   verifyFormat("#ifndef NOT_GUARD\n"
3360                "#  define FOO\n"
3361                "code();\n"
3362                "#endif",
3363                Style);
3364 
3365   // Include guards must cover the entire file.
3366   verifyFormat("code();\n"
3367                "code();\n"
3368                "#ifndef NOT_GUARD\n"
3369                "#  define NOT_GUARD\n"
3370                "code();\n"
3371                "#endif",
3372                Style);
3373   verifyFormat("#ifndef NOT_GUARD\n"
3374                "#  define NOT_GUARD\n"
3375                "code();\n"
3376                "#endif\n"
3377                "code();",
3378                Style);
3379   // Test with trailing blank lines.
3380   verifyFormat("#ifndef HEADER_H\n"
3381                "#define HEADER_H\n"
3382                "code();\n"
3383                "#endif\n",
3384                Style);
3385   // Include guards don't have #else.
3386   verifyFormat("#ifndef NOT_GUARD\n"
3387                "#  define NOT_GUARD\n"
3388                "code();\n"
3389                "#else\n"
3390                "#endif",
3391                Style);
3392   verifyFormat("#ifndef NOT_GUARD\n"
3393                "#  define NOT_GUARD\n"
3394                "code();\n"
3395                "#elif FOO\n"
3396                "#endif",
3397                Style);
3398   // Non-identifier #define after potential include guard.
3399   verifyFormat("#ifndef FOO\n"
3400                "#  define 1\n"
3401                "#endif\n",
3402                Style);
3403   // #if closes past last non-preprocessor line.
3404   verifyFormat("#ifndef FOO\n"
3405                "#define FOO\n"
3406                "#if 1\n"
3407                "int i;\n"
3408                "#  define A 0\n"
3409                "#endif\n"
3410                "#endif\n",
3411                Style);
3412   // Don't crash if there is an #elif directive without a condition.
3413   verifyFormat("#if 1\n"
3414                "int x;\n"
3415                "#elif\n"
3416                "int y;\n"
3417                "#else\n"
3418                "int z;\n"
3419                "#endif",
3420                Style);
3421   // FIXME: This doesn't handle the case where there's code between the
3422   // #ifndef and #define but all other conditions hold. This is because when
3423   // the #define line is parsed, UnwrappedLineParser::Lines doesn't hold the
3424   // previous code line yet, so we can't detect it.
3425   EXPECT_EQ("#ifndef NOT_GUARD\n"
3426             "code();\n"
3427             "#define NOT_GUARD\n"
3428             "code();\n"
3429             "#endif",
3430             format("#ifndef NOT_GUARD\n"
3431                    "code();\n"
3432                    "#  define NOT_GUARD\n"
3433                    "code();\n"
3434                    "#endif",
3435                    Style));
3436   // FIXME: This doesn't handle cases where legitimate preprocessor lines may
3437   // be outside an include guard. Examples are #pragma once and
3438   // #pragma GCC diagnostic, or anything else that does not change the meaning
3439   // of the file if it's included multiple times.
3440   EXPECT_EQ("#ifdef WIN32\n"
3441             "#  pragma once\n"
3442             "#endif\n"
3443             "#ifndef HEADER_H\n"
3444             "#  define HEADER_H\n"
3445             "code();\n"
3446             "#endif",
3447             format("#ifdef WIN32\n"
3448                    "#  pragma once\n"
3449                    "#endif\n"
3450                    "#ifndef HEADER_H\n"
3451                    "#define HEADER_H\n"
3452                    "code();\n"
3453                    "#endif",
3454                    Style));
3455   // FIXME: This does not detect when there is a single non-preprocessor line
3456   // in front of an include-guard-like structure where other conditions hold
3457   // because ScopedLineState hides the line.
3458   EXPECT_EQ("code();\n"
3459             "#ifndef HEADER_H\n"
3460             "#define HEADER_H\n"
3461             "code();\n"
3462             "#endif",
3463             format("code();\n"
3464                    "#ifndef HEADER_H\n"
3465                    "#  define HEADER_H\n"
3466                    "code();\n"
3467                    "#endif",
3468                    Style));
3469   // Keep comments aligned with #, otherwise indent comments normally. These
3470   // tests cannot use verifyFormat because messUp manipulates leading
3471   // whitespace.
3472   {
3473     const char *Expected = ""
3474                            "void f() {\n"
3475                            "#if 1\n"
3476                            "// Preprocessor aligned.\n"
3477                            "#  define A 0\n"
3478                            "  // Code. Separated by blank line.\n"
3479                            "\n"
3480                            "#  define B 0\n"
3481                            "  // Code. Not aligned with #\n"
3482                            "#  define C 0\n"
3483                            "#endif";
3484     const char *ToFormat = ""
3485                            "void f() {\n"
3486                            "#if 1\n"
3487                            "// Preprocessor aligned.\n"
3488                            "#  define A 0\n"
3489                            "// Code. Separated by blank line.\n"
3490                            "\n"
3491                            "#  define B 0\n"
3492                            "   // Code. Not aligned with #\n"
3493                            "#  define C 0\n"
3494                            "#endif";
3495     EXPECT_EQ(Expected, format(ToFormat, Style));
3496     EXPECT_EQ(Expected, format(Expected, Style));
3497   }
3498   // Keep block quotes aligned.
3499   {
3500     const char *Expected = ""
3501                            "void f() {\n"
3502                            "#if 1\n"
3503                            "/* Preprocessor aligned. */\n"
3504                            "#  define A 0\n"
3505                            "  /* Code. Separated by blank line. */\n"
3506                            "\n"
3507                            "#  define B 0\n"
3508                            "  /* Code. Not aligned with # */\n"
3509                            "#  define C 0\n"
3510                            "#endif";
3511     const char *ToFormat = ""
3512                            "void f() {\n"
3513                            "#if 1\n"
3514                            "/* Preprocessor aligned. */\n"
3515                            "#  define A 0\n"
3516                            "/* Code. Separated by blank line. */\n"
3517                            "\n"
3518                            "#  define B 0\n"
3519                            "   /* Code. Not aligned with # */\n"
3520                            "#  define C 0\n"
3521                            "#endif";
3522     EXPECT_EQ(Expected, format(ToFormat, Style));
3523     EXPECT_EQ(Expected, format(Expected, Style));
3524   }
3525   // Keep comments aligned with un-indented directives.
3526   {
3527     const char *Expected = ""
3528                            "void f() {\n"
3529                            "// Preprocessor aligned.\n"
3530                            "#define A 0\n"
3531                            "  // Code. Separated by blank line.\n"
3532                            "\n"
3533                            "#define B 0\n"
3534                            "  // Code. Not aligned with #\n"
3535                            "#define C 0\n";
3536     const char *ToFormat = ""
3537                            "void f() {\n"
3538                            "// Preprocessor aligned.\n"
3539                            "#define A 0\n"
3540                            "// Code. Separated by blank line.\n"
3541                            "\n"
3542                            "#define B 0\n"
3543                            "   // Code. Not aligned with #\n"
3544                            "#define C 0\n";
3545     EXPECT_EQ(Expected, format(ToFormat, Style));
3546     EXPECT_EQ(Expected, format(Expected, Style));
3547   }
3548   // Test AfterHash with tabs.
3549   {
3550     FormatStyle Tabbed = Style;
3551     Tabbed.UseTab = FormatStyle::UT_Always;
3552     Tabbed.IndentWidth = 8;
3553     Tabbed.TabWidth = 8;
3554     verifyFormat("#ifdef _WIN32\n"
3555                  "#\tdefine A 0\n"
3556                  "#\tifdef VAR2\n"
3557                  "#\t\tdefine B 1\n"
3558                  "#\t\tinclude <someheader.h>\n"
3559                  "#\t\tdefine MACRO          \\\n"
3560                  "\t\t\tsome_very_long_func_aaaaaaaaaa();\n"
3561                  "#\tendif\n"
3562                  "#else\n"
3563                  "#\tdefine A 1\n"
3564                  "#endif",
3565                  Tabbed);
3566   }
3567 
3568   // Regression test: Multiline-macro inside include guards.
3569   verifyFormat("#ifndef HEADER_H\n"
3570                "#define HEADER_H\n"
3571                "#define A()        \\\n"
3572                "  int i;           \\\n"
3573                "  int j;\n"
3574                "#endif // HEADER_H",
3575                getLLVMStyleWithColumns(20));
3576 
3577   Style.IndentPPDirectives = FormatStyle::PPDIS_BeforeHash;
3578   // Basic before hash indent tests
3579   verifyFormat("#ifdef _WIN32\n"
3580                "  #define A 0\n"
3581                "  #ifdef VAR2\n"
3582                "    #define B 1\n"
3583                "    #include <someheader.h>\n"
3584                "    #define MACRO                      \\\n"
3585                "      some_very_long_func_aaaaaaaaaa();\n"
3586                "  #endif\n"
3587                "#else\n"
3588                "  #define A 1\n"
3589                "#endif",
3590                Style);
3591   verifyFormat("#if A\n"
3592                "  #define MACRO                        \\\n"
3593                "    void a(int x) {                    \\\n"
3594                "      b();                             \\\n"
3595                "      c();                             \\\n"
3596                "      d();                             \\\n"
3597                "      e();                             \\\n"
3598                "      f();                             \\\n"
3599                "    }\n"
3600                "#endif",
3601                Style);
3602   // Keep comments aligned with indented directives. These
3603   // tests cannot use verifyFormat because messUp manipulates leading
3604   // whitespace.
3605   {
3606     const char *Expected = "void f() {\n"
3607                            "// Aligned to preprocessor.\n"
3608                            "#if 1\n"
3609                            "  // Aligned to code.\n"
3610                            "  int a;\n"
3611                            "  #if 1\n"
3612                            "    // Aligned to preprocessor.\n"
3613                            "    #define A 0\n"
3614                            "  // Aligned to code.\n"
3615                            "  int b;\n"
3616                            "  #endif\n"
3617                            "#endif\n"
3618                            "}";
3619     const char *ToFormat = "void f() {\n"
3620                            "// Aligned to preprocessor.\n"
3621                            "#if 1\n"
3622                            "// Aligned to code.\n"
3623                            "int a;\n"
3624                            "#if 1\n"
3625                            "// Aligned to preprocessor.\n"
3626                            "#define A 0\n"
3627                            "// Aligned to code.\n"
3628                            "int b;\n"
3629                            "#endif\n"
3630                            "#endif\n"
3631                            "}";
3632     EXPECT_EQ(Expected, format(ToFormat, Style));
3633     EXPECT_EQ(Expected, format(Expected, Style));
3634   }
3635   {
3636     const char *Expected = "void f() {\n"
3637                            "/* Aligned to preprocessor. */\n"
3638                            "#if 1\n"
3639                            "  /* Aligned to code. */\n"
3640                            "  int a;\n"
3641                            "  #if 1\n"
3642                            "    /* Aligned to preprocessor. */\n"
3643                            "    #define A 0\n"
3644                            "  /* Aligned to code. */\n"
3645                            "  int b;\n"
3646                            "  #endif\n"
3647                            "#endif\n"
3648                            "}";
3649     const char *ToFormat = "void f() {\n"
3650                            "/* Aligned to preprocessor. */\n"
3651                            "#if 1\n"
3652                            "/* Aligned to code. */\n"
3653                            "int a;\n"
3654                            "#if 1\n"
3655                            "/* Aligned to preprocessor. */\n"
3656                            "#define A 0\n"
3657                            "/* Aligned to code. */\n"
3658                            "int b;\n"
3659                            "#endif\n"
3660                            "#endif\n"
3661                            "}";
3662     EXPECT_EQ(Expected, format(ToFormat, Style));
3663     EXPECT_EQ(Expected, format(Expected, Style));
3664   }
3665 
3666   // Test single comment before preprocessor
3667   verifyFormat("// Comment\n"
3668                "\n"
3669                "#if 1\n"
3670                "#endif",
3671                Style);
3672 }
3673 
3674 TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) {
3675   verifyFormat("{\n  { a #c; }\n}");
3676 }
3677 
3678 TEST_F(FormatTest, FormatUnbalancedStructuralElements) {
3679   EXPECT_EQ("#define A \\\n  {       \\\n    {\nint i;",
3680             format("#define A { {\nint i;", getLLVMStyleWithColumns(11)));
3681   EXPECT_EQ("#define A \\\n  }       \\\n  }\nint i;",
3682             format("#define A } }\nint i;", getLLVMStyleWithColumns(11)));
3683 }
3684 
3685 TEST_F(FormatTest, EscapedNewlines) {
3686   FormatStyle Narrow = getLLVMStyleWithColumns(11);
3687   EXPECT_EQ("#define A \\\n  int i;  \\\n  int j;",
3688             format("#define A \\\nint i;\\\n  int j;", Narrow));
3689   EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;"));
3690   EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
3691   EXPECT_EQ("/* \\  \\  \\\n */", format("\\\n/* \\  \\  \\\n */"));
3692   EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>"));
3693 
3694   FormatStyle AlignLeft = getLLVMStyle();
3695   AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
3696   EXPECT_EQ("#define MACRO(x) \\\n"
3697             "private:         \\\n"
3698             "  int x(int a);\n",
3699             format("#define MACRO(x) \\\n"
3700                    "private:         \\\n"
3701                    "  int x(int a);\n",
3702                    AlignLeft));
3703 
3704   // CRLF line endings
3705   EXPECT_EQ("#define A \\\r\n  int i;  \\\r\n  int j;",
3706             format("#define A \\\r\nint i;\\\r\n  int j;", Narrow));
3707   EXPECT_EQ("#define A\r\n\r\nint i;", format("#define A \\\r\n\r\n int i;"));
3708   EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
3709   EXPECT_EQ("/* \\  \\  \\\r\n */", format("\\\r\n/* \\  \\  \\\r\n */"));
3710   EXPECT_EQ("<a\r\n\\\\\r\n>", format("<a\r\n\\\\\r\n>"));
3711   EXPECT_EQ("#define MACRO(x) \\\r\n"
3712             "private:         \\\r\n"
3713             "  int x(int a);\r\n",
3714             format("#define MACRO(x) \\\r\n"
3715                    "private:         \\\r\n"
3716                    "  int x(int a);\r\n",
3717                    AlignLeft));
3718 
3719   FormatStyle DontAlign = getLLVMStyle();
3720   DontAlign.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
3721   DontAlign.MaxEmptyLinesToKeep = 3;
3722   // FIXME: can't use verifyFormat here because the newline before
3723   // "public:" is not inserted the first time it's reformatted
3724   EXPECT_EQ("#define A \\\n"
3725             "  class Foo { \\\n"
3726             "    void bar(); \\\n"
3727             "\\\n"
3728             "\\\n"
3729             "\\\n"
3730             "  public: \\\n"
3731             "    void baz(); \\\n"
3732             "  };",
3733             format("#define A \\\n"
3734                    "  class Foo { \\\n"
3735                    "    void bar(); \\\n"
3736                    "\\\n"
3737                    "\\\n"
3738                    "\\\n"
3739                    "  public: \\\n"
3740                    "    void baz(); \\\n"
3741                    "  };",
3742                    DontAlign));
3743 }
3744 
3745 TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) {
3746   verifyFormat("#define A \\\n"
3747                "  int v(  \\\n"
3748                "      a); \\\n"
3749                "  int i;",
3750                getLLVMStyleWithColumns(11));
3751 }
3752 
3753 TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) {
3754   EXPECT_EQ(
3755       "#define ALooooooooooooooooooooooooooooooooooooooongMacro("
3756       "                      \\\n"
3757       "    aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
3758       "\n"
3759       "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
3760       "    aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n",
3761       format("  #define   ALooooooooooooooooooooooooooooooooooooooongMacro("
3762              "\\\n"
3763              "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
3764              "  \n"
3765              "   AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
3766              "  aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n"));
3767 }
3768 
3769 TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) {
3770   EXPECT_EQ("int\n"
3771             "#define A\n"
3772             "    a;",
3773             format("int\n#define A\na;"));
3774   verifyFormat("functionCallTo(\n"
3775                "    someOtherFunction(\n"
3776                "        withSomeParameters, whichInSequence,\n"
3777                "        areLongerThanALine(andAnotherCall,\n"
3778                "#define A B\n"
3779                "                           withMoreParamters,\n"
3780                "                           whichStronglyInfluenceTheLayout),\n"
3781                "        andMoreParameters),\n"
3782                "    trailing);",
3783                getLLVMStyleWithColumns(69));
3784   verifyFormat("Foo::Foo()\n"
3785                "#ifdef BAR\n"
3786                "    : baz(0)\n"
3787                "#endif\n"
3788                "{\n"
3789                "}");
3790   verifyFormat("void f() {\n"
3791                "  if (true)\n"
3792                "#ifdef A\n"
3793                "    f(42);\n"
3794                "  x();\n"
3795                "#else\n"
3796                "    g();\n"
3797                "  x();\n"
3798                "#endif\n"
3799                "}");
3800   verifyFormat("void f(param1, param2,\n"
3801                "       param3,\n"
3802                "#ifdef A\n"
3803                "       param4(param5,\n"
3804                "#ifdef A1\n"
3805                "              param6,\n"
3806                "#ifdef A2\n"
3807                "              param7),\n"
3808                "#else\n"
3809                "              param8),\n"
3810                "       param9,\n"
3811                "#endif\n"
3812                "       param10,\n"
3813                "#endif\n"
3814                "       param11)\n"
3815                "#else\n"
3816                "       param12)\n"
3817                "#endif\n"
3818                "{\n"
3819                "  x();\n"
3820                "}",
3821                getLLVMStyleWithColumns(28));
3822   verifyFormat("#if 1\n"
3823                "int i;");
3824   verifyFormat("#if 1\n"
3825                "#endif\n"
3826                "#if 1\n"
3827                "#else\n"
3828                "#endif\n");
3829   verifyFormat("DEBUG({\n"
3830                "  return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3831                "         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
3832                "});\n"
3833                "#if a\n"
3834                "#else\n"
3835                "#endif");
3836 
3837   verifyIncompleteFormat("void f(\n"
3838                          "#if A\n"
3839                          ");\n"
3840                          "#else\n"
3841                          "#endif");
3842 }
3843 
3844 TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) {
3845   verifyFormat("#endif\n"
3846                "#if B");
3847 }
3848 
3849 TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) {
3850   FormatStyle SingleLine = getLLVMStyle();
3851   SingleLine.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_WithoutElse;
3852   verifyFormat("#if 0\n"
3853                "#elif 1\n"
3854                "#endif\n"
3855                "void foo() {\n"
3856                "  if (test) foo2();\n"
3857                "}",
3858                SingleLine);
3859 }
3860 
3861 TEST_F(FormatTest, LayoutBlockInsideParens) {
3862   verifyFormat("functionCall({ int i; });");
3863   verifyFormat("functionCall({\n"
3864                "  int i;\n"
3865                "  int j;\n"
3866                "});");
3867   verifyFormat("functionCall(\n"
3868                "    {\n"
3869                "      int i;\n"
3870                "      int j;\n"
3871                "    },\n"
3872                "    aaaa, bbbb, cccc);");
3873   verifyFormat("functionA(functionB({\n"
3874                "            int i;\n"
3875                "            int j;\n"
3876                "          }),\n"
3877                "          aaaa, bbbb, cccc);");
3878   verifyFormat("functionCall(\n"
3879                "    {\n"
3880                "      int i;\n"
3881                "      int j;\n"
3882                "    },\n"
3883                "    aaaa, bbbb, // comment\n"
3884                "    cccc);");
3885   verifyFormat("functionA(functionB({\n"
3886                "            int i;\n"
3887                "            int j;\n"
3888                "          }),\n"
3889                "          aaaa, bbbb, // comment\n"
3890                "          cccc);");
3891   verifyFormat("functionCall(aaaa, bbbb, { int i; });");
3892   verifyFormat("functionCall(aaaa, bbbb, {\n"
3893                "  int i;\n"
3894                "  int j;\n"
3895                "});");
3896   verifyFormat(
3897       "Aaa(\n" // FIXME: There shouldn't be a linebreak here.
3898       "    {\n"
3899       "      int i; // break\n"
3900       "    },\n"
3901       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
3902       "                                     ccccccccccccccccc));");
3903   verifyFormat("DEBUG({\n"
3904                "  if (a)\n"
3905                "    f();\n"
3906                "});");
3907 }
3908 
3909 TEST_F(FormatTest, LayoutBlockInsideStatement) {
3910   EXPECT_EQ("SOME_MACRO { int i; }\n"
3911             "int i;",
3912             format("  SOME_MACRO  {int i;}  int i;"));
3913 }
3914 
3915 TEST_F(FormatTest, LayoutNestedBlocks) {
3916   verifyFormat("void AddOsStrings(unsigned bitmask) {\n"
3917                "  struct s {\n"
3918                "    int i;\n"
3919                "  };\n"
3920                "  s kBitsToOs[] = {{10}};\n"
3921                "  for (int i = 0; i < 10; ++i)\n"
3922                "    return;\n"
3923                "}");
3924   verifyFormat("call(parameter, {\n"
3925                "  something();\n"
3926                "  // Comment using all columns.\n"
3927                "  somethingelse();\n"
3928                "});",
3929                getLLVMStyleWithColumns(40));
3930   verifyFormat("DEBUG( //\n"
3931                "    { f(); }, a);");
3932   verifyFormat("DEBUG( //\n"
3933                "    {\n"
3934                "      f(); //\n"
3935                "    },\n"
3936                "    a);");
3937 
3938   EXPECT_EQ("call(parameter, {\n"
3939             "  something();\n"
3940             "  // Comment too\n"
3941             "  // looooooooooong.\n"
3942             "  somethingElse();\n"
3943             "});",
3944             format("call(parameter, {\n"
3945                    "  something();\n"
3946                    "  // Comment too looooooooooong.\n"
3947                    "  somethingElse();\n"
3948                    "});",
3949                    getLLVMStyleWithColumns(29)));
3950   EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int   i; });"));
3951   EXPECT_EQ("DEBUG({ // comment\n"
3952             "  int i;\n"
3953             "});",
3954             format("DEBUG({ // comment\n"
3955                    "int  i;\n"
3956                    "});"));
3957   EXPECT_EQ("DEBUG({\n"
3958             "  int i;\n"
3959             "\n"
3960             "  // comment\n"
3961             "  int j;\n"
3962             "});",
3963             format("DEBUG({\n"
3964                    "  int  i;\n"
3965                    "\n"
3966                    "  // comment\n"
3967                    "  int  j;\n"
3968                    "});"));
3969 
3970   verifyFormat("DEBUG({\n"
3971                "  if (a)\n"
3972                "    return;\n"
3973                "});");
3974   verifyGoogleFormat("DEBUG({\n"
3975                      "  if (a) return;\n"
3976                      "});");
3977   FormatStyle Style = getGoogleStyle();
3978   Style.ColumnLimit = 45;
3979   verifyFormat("Debug(\n"
3980                "    aaaaa,\n"
3981                "    {\n"
3982                "      if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n"
3983                "    },\n"
3984                "    a);",
3985                Style);
3986 
3987   verifyFormat("SomeFunction({MACRO({ return output; }), b});");
3988 
3989   verifyNoCrash("^{v^{a}}");
3990 }
3991 
3992 TEST_F(FormatTest, FormatNestedBlocksInMacros) {
3993   EXPECT_EQ("#define MACRO()                     \\\n"
3994             "  Debug(aaa, /* force line break */ \\\n"
3995             "        {                           \\\n"
3996             "          int i;                    \\\n"
3997             "          int j;                    \\\n"
3998             "        })",
3999             format("#define   MACRO()   Debug(aaa,  /* force line break */ \\\n"
4000                    "          {  int   i;  int  j;   })",
4001                    getGoogleStyle()));
4002 
4003   EXPECT_EQ("#define A                                       \\\n"
4004             "  [] {                                          \\\n"
4005             "    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx(        \\\n"
4006             "        xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n"
4007             "  }",
4008             format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
4009                    "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }",
4010                    getGoogleStyle()));
4011 }
4012 
4013 TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) {
4014   EXPECT_EQ("{}", format("{}"));
4015   verifyFormat("enum E {};");
4016   verifyFormat("enum E {}");
4017   FormatStyle Style = getLLVMStyle();
4018   Style.SpaceInEmptyBlock = true;
4019   EXPECT_EQ("void f() { }", format("void f() {}", Style));
4020   Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Empty;
4021   EXPECT_EQ("while (true) { }", format("while (true) {}", Style));
4022 }
4023 
4024 TEST_F(FormatTest, FormatBeginBlockEndMacros) {
4025   FormatStyle Style = getLLVMStyle();
4026   Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$";
4027   Style.MacroBlockEnd = "^[A-Z_]+_END$";
4028   verifyFormat("FOO_BEGIN\n"
4029                "  FOO_ENTRY\n"
4030                "FOO_END",
4031                Style);
4032   verifyFormat("FOO_BEGIN\n"
4033                "  NESTED_FOO_BEGIN\n"
4034                "    NESTED_FOO_ENTRY\n"
4035                "  NESTED_FOO_END\n"
4036                "FOO_END",
4037                Style);
4038   verifyFormat("FOO_BEGIN(Foo, Bar)\n"
4039                "  int x;\n"
4040                "  x = 1;\n"
4041                "FOO_END(Baz)",
4042                Style);
4043 }
4044 
4045 //===----------------------------------------------------------------------===//
4046 // Line break tests.
4047 //===----------------------------------------------------------------------===//
4048 
4049 TEST_F(FormatTest, PreventConfusingIndents) {
4050   verifyFormat(
4051       "void f() {\n"
4052       "  SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
4053       "                         parameter, parameter, parameter)),\n"
4054       "                     SecondLongCall(parameter));\n"
4055       "}");
4056   verifyFormat(
4057       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4058       "    aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4059       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4060       "    aaaaaaaaaaaaaaaaaaaaaaaa);");
4061   verifyFormat(
4062       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4063       "    [aaaaaaaaaaaaaaaaaaaaaaaa\n"
4064       "         [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
4065       "         [aaaaaaaaaaaaaaaaaaaaaaaa]];");
4066   verifyFormat(
4067       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
4068       "    aaaaaaaaaaaaaaaaaaaaaaaa<\n"
4069       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n"
4070       "    aaaaaaaaaaaaaaaaaaaaaaaa>;");
4071   verifyFormat("int a = bbbb && ccc &&\n"
4072                "        fffff(\n"
4073                "#define A Just forcing a new line\n"
4074                "            ddd);");
4075 }
4076 
4077 TEST_F(FormatTest, LineBreakingInBinaryExpressions) {
4078   verifyFormat(
4079       "bool aaaaaaa =\n"
4080       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n"
4081       "    bbbbbbbb();");
4082   verifyFormat(
4083       "bool aaaaaaa =\n"
4084       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n"
4085       "    bbbbbbbb();");
4086 
4087   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
4088                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n"
4089                "    ccccccccc == ddddddddddd;");
4090   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
4091                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n"
4092                "    ccccccccc == ddddddddddd;");
4093   verifyFormat(
4094       "bool aaaaaaaaaaaaaaaaaaaaa =\n"
4095       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n"
4096       "    ccccccccc == ddddddddddd;");
4097 
4098   verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
4099                "                 aaaaaa) &&\n"
4100                "         bbbbbb && cccccc;");
4101   verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
4102                "                 aaaaaa) >>\n"
4103                "         bbbbbb;");
4104   verifyFormat("aa = Whitespaces.addUntouchableComment(\n"
4105                "    SourceMgr.getSpellingColumnNumber(\n"
4106                "        TheLine.Last->FormatTok.Tok.getLocation()) -\n"
4107                "    1);");
4108 
4109   verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4110                "     bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n"
4111                "    cccccc) {\n}");
4112   verifyFormat("if constexpr ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4113                "               bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n"
4114                "              cccccc) {\n}");
4115   verifyFormat("if CONSTEXPR ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4116                "               bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n"
4117                "              cccccc) {\n}");
4118   verifyFormat("b = a &&\n"
4119                "    // Comment\n"
4120                "    b.c && d;");
4121 
4122   // If the LHS of a comparison is not a binary expression itself, the
4123   // additional linebreak confuses many people.
4124   verifyFormat(
4125       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4126       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n"
4127       "}");
4128   verifyFormat(
4129       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4130       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
4131       "}");
4132   verifyFormat(
4133       "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n"
4134       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
4135       "}");
4136   verifyFormat(
4137       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4138       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) <=> 5) {\n"
4139       "}");
4140   // Even explicit parentheses stress the precedence enough to make the
4141   // additional break unnecessary.
4142   verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4143                "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
4144                "}");
4145   // This cases is borderline, but with the indentation it is still readable.
4146   verifyFormat(
4147       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4148       "        aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4149       "                               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
4150       "}",
4151       getLLVMStyleWithColumns(75));
4152 
4153   // If the LHS is a binary expression, we should still use the additional break
4154   // as otherwise the formatting hides the operator precedence.
4155   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4156                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4157                "    5) {\n"
4158                "}");
4159   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4160                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa <=>\n"
4161                "    5) {\n"
4162                "}");
4163 
4164   FormatStyle OnePerLine = getLLVMStyle();
4165   OnePerLine.BinPackParameters = false;
4166   verifyFormat(
4167       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4168       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4169       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}",
4170       OnePerLine);
4171 
4172   verifyFormat("int i = someFunction(aaaaaaa, 0)\n"
4173                "                .aaa(aaaaaaaaaaaaa) *\n"
4174                "            aaaaaaa +\n"
4175                "        aaaaaaa;",
4176                getLLVMStyleWithColumns(40));
4177 }
4178 
4179 TEST_F(FormatTest, ExpressionIndentation) {
4180   verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4181                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4182                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4183                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4184                "                         bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
4185                "                     bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n"
4186                "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4187                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n"
4188                "                 ccccccccccccccccccccccccccccccccccccccccc;");
4189   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4190                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4191                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4192                "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
4193   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4194                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4195                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4196                "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
4197   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4198                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4199                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4200                "        bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
4201   verifyFormat("if () {\n"
4202                "} else if (aaaaa && bbbbb > // break\n"
4203                "                        ccccc) {\n"
4204                "}");
4205   verifyFormat("if () {\n"
4206                "} else if constexpr (aaaaa && bbbbb > // break\n"
4207                "                                  ccccc) {\n"
4208                "}");
4209   verifyFormat("if () {\n"
4210                "} else if CONSTEXPR (aaaaa && bbbbb > // break\n"
4211                "                                  ccccc) {\n"
4212                "}");
4213   verifyFormat("if () {\n"
4214                "} else if (aaaaa &&\n"
4215                "           bbbbb > // break\n"
4216                "               ccccc &&\n"
4217                "           ddddd) {\n"
4218                "}");
4219 
4220   // Presence of a trailing comment used to change indentation of b.
4221   verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n"
4222                "       b;\n"
4223                "return aaaaaaaaaaaaaaaaaaa +\n"
4224                "       b; //",
4225                getLLVMStyleWithColumns(30));
4226 }
4227 
4228 TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) {
4229   // Not sure what the best system is here. Like this, the LHS can be found
4230   // immediately above an operator (everything with the same or a higher
4231   // indent). The RHS is aligned right of the operator and so compasses
4232   // everything until something with the same indent as the operator is found.
4233   // FIXME: Is this a good system?
4234   FormatStyle Style = getLLVMStyle();
4235   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
4236   verifyFormat(
4237       "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4238       "                     + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4239       "                     + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4240       "                 == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4241       "                            * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4242       "                        + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4243       "             && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4244       "                        * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4245       "                    > ccccccccccccccccccccccccccccccccccccccccc;",
4246       Style);
4247   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4248                "            * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4249                "        + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4250                "    == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
4251                Style);
4252   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4253                "        + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4254                "              * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4255                "    == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
4256                Style);
4257   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4258                "    == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4259                "               * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4260                "           + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
4261                Style);
4262   verifyFormat("if () {\n"
4263                "} else if (aaaaa\n"
4264                "           && bbbbb // break\n"
4265                "                  > ccccc) {\n"
4266                "}",
4267                Style);
4268   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4269                "       && bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
4270                Style);
4271   verifyFormat("return (a)\n"
4272                "       // comment\n"
4273                "       + b;",
4274                Style);
4275   verifyFormat(
4276       "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4277       "                 * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4278       "             + cc;",
4279       Style);
4280 
4281   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4282                "    = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4283                Style);
4284 
4285   // Forced by comments.
4286   verifyFormat(
4287       "unsigned ContentSize =\n"
4288       "    sizeof(int16_t)   // DWARF ARange version number\n"
4289       "    + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
4290       "    + sizeof(int8_t)  // Pointer Size (in bytes)\n"
4291       "    + sizeof(int8_t); // Segment Size (in bytes)");
4292 
4293   verifyFormat("return boost::fusion::at_c<0>(iiii).second\n"
4294                "       == boost::fusion::at_c<1>(iiii).second;",
4295                Style);
4296 
4297   Style.ColumnLimit = 60;
4298   verifyFormat("zzzzzzzzzz\n"
4299                "    = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4300                "      >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);",
4301                Style);
4302 
4303   Style.ColumnLimit = 80;
4304   Style.IndentWidth = 4;
4305   Style.TabWidth = 4;
4306   Style.UseTab = FormatStyle::UT_Always;
4307   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
4308   Style.AlignOperands = FormatStyle::OAS_DontAlign;
4309   EXPECT_EQ("return someVeryVeryLongConditionThatBarelyFitsOnALine\n"
4310             "\t&& (someOtherLongishConditionPart1\n"
4311             "\t\t|| someOtherEvenLongerNestedConditionPart2);",
4312             format("return someVeryVeryLongConditionThatBarelyFitsOnALine && "
4313                    "(someOtherLongishConditionPart1 || "
4314                    "someOtherEvenLongerNestedConditionPart2);",
4315                    Style));
4316 }
4317 
4318 TEST_F(FormatTest, ExpressionIndentationStrictAlign) {
4319   FormatStyle Style = getLLVMStyle();
4320   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
4321   Style.AlignOperands = FormatStyle::OAS_AlignAfterOperator;
4322 
4323   verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4324                "                   + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4325                "                   + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4326                "              == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4327                "                         * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4328                "                     + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4329                "          && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4330                "                     * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4331                "                 > ccccccccccccccccccccccccccccccccccccccccc;",
4332                Style);
4333   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4334                "            * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4335                "        + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4336                "    == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
4337                Style);
4338   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4339                "        + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4340                "              * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4341                "    == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
4342                Style);
4343   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4344                "    == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4345                "               * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4346                "           + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
4347                Style);
4348   verifyFormat("if () {\n"
4349                "} else if (aaaaa\n"
4350                "           && bbbbb // break\n"
4351                "                  > ccccc) {\n"
4352                "}",
4353                Style);
4354   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4355                "    && bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
4356                Style);
4357   verifyFormat("return (a)\n"
4358                "     // comment\n"
4359                "     + b;",
4360                Style);
4361   verifyFormat(
4362       "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4363       "               * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4364       "           + cc;",
4365       Style);
4366   verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111\n"
4367                "     : bbbbbbbbbbbbbbbb ? 2222222222222222\n"
4368                "                        : 3333333333333333;",
4369                Style);
4370   verifyFormat(
4371       "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaa    ? bbbbbbbbbbbbbbbbbb\n"
4372       "                           : ccccccccccccccc ? dddddddddddddddddd\n"
4373       "                                             : eeeeeeeeeeeeeeeeee)\n"
4374       "     : bbbbbbbbbbbbbbbb ? 2222222222222222\n"
4375       "                        : 3333333333333333;",
4376       Style);
4377   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4378                "    = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4379                Style);
4380 
4381   verifyFormat("return boost::fusion::at_c<0>(iiii).second\n"
4382                "    == boost::fusion::at_c<1>(iiii).second;",
4383                Style);
4384 
4385   Style.ColumnLimit = 60;
4386   verifyFormat("zzzzzzzzzzzzz\n"
4387                "    = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4388                "   >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);",
4389                Style);
4390 
4391   // Forced by comments.
4392   Style.ColumnLimit = 80;
4393   verifyFormat(
4394       "unsigned ContentSize\n"
4395       "    = sizeof(int16_t) // DWARF ARange version number\n"
4396       "    + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
4397       "    + sizeof(int8_t)  // Pointer Size (in bytes)\n"
4398       "    + sizeof(int8_t); // Segment Size (in bytes)",
4399       Style);
4400 
4401   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
4402   verifyFormat(
4403       "unsigned ContentSize =\n"
4404       "    sizeof(int16_t)   // DWARF ARange version number\n"
4405       "    + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
4406       "    + sizeof(int8_t)  // Pointer Size (in bytes)\n"
4407       "    + sizeof(int8_t); // Segment Size (in bytes)",
4408       Style);
4409 
4410   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
4411   verifyFormat(
4412       "unsigned ContentSize =\n"
4413       "    sizeof(int16_t)   // DWARF ARange version number\n"
4414       "    + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
4415       "    + sizeof(int8_t)  // Pointer Size (in bytes)\n"
4416       "    + sizeof(int8_t); // Segment Size (in bytes)",
4417       Style);
4418 }
4419 
4420 TEST_F(FormatTest, EnforcedOperatorWraps) {
4421   // Here we'd like to wrap after the || operators, but a comment is forcing an
4422   // earlier wrap.
4423   verifyFormat("bool x = aaaaa //\n"
4424                "         || bbbbb\n"
4425                "         //\n"
4426                "         || cccc;");
4427 }
4428 
4429 TEST_F(FormatTest, NoOperandAlignment) {
4430   FormatStyle Style = getLLVMStyle();
4431   Style.AlignOperands = FormatStyle::OAS_DontAlign;
4432   verifyFormat("aaaaaaaaaaaaaa(aaaaaaaaaaaa,\n"
4433                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4434                "                   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4435                Style);
4436   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
4437   verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4438                "            + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4439                "            + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4440                "        == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4441                "                * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4442                "            + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4443                "    && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4444                "            * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4445                "        > ccccccccccccccccccccccccccccccccccccccccc;",
4446                Style);
4447 
4448   verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4449                "        * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4450                "    + cc;",
4451                Style);
4452   verifyFormat("int a = aa\n"
4453                "    + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4454                "        * cccccccccccccccccccccccccccccccccccc;\n",
4455                Style);
4456 
4457   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
4458   verifyFormat("return (a > b\n"
4459                "    // comment1\n"
4460                "    // comment2\n"
4461                "    || c);",
4462                Style);
4463 }
4464 
4465 TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) {
4466   FormatStyle Style = getLLVMStyle();
4467   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
4468   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4469                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4470                "    + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
4471                Style);
4472 }
4473 
4474 TEST_F(FormatTest, AllowBinPackingInsideArguments) {
4475   FormatStyle Style = getLLVMStyle();
4476   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
4477   Style.BinPackArguments = false;
4478   Style.ColumnLimit = 40;
4479   verifyFormat("void test() {\n"
4480                "  someFunction(\n"
4481                "      this + argument + is + quite\n"
4482                "      + long + so + it + gets + wrapped\n"
4483                "      + but + remains + bin - packed);\n"
4484                "}",
4485                Style);
4486   verifyFormat("void test() {\n"
4487                "  someFunction(arg1,\n"
4488                "               this + argument + is\n"
4489                "                   + quite + long + so\n"
4490                "                   + it + gets + wrapped\n"
4491                "                   + but + remains + bin\n"
4492                "                   - packed,\n"
4493                "               arg3);\n"
4494                "}",
4495                Style);
4496   verifyFormat("void test() {\n"
4497                "  someFunction(\n"
4498                "      arg1,\n"
4499                "      this + argument + has\n"
4500                "          + anotherFunc(nested,\n"
4501                "                        calls + whose\n"
4502                "                            + arguments\n"
4503                "                            + are + also\n"
4504                "                            + wrapped,\n"
4505                "                        in + addition)\n"
4506                "          + to + being + bin - packed,\n"
4507                "      arg3);\n"
4508                "}",
4509                Style);
4510 
4511   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
4512   verifyFormat("void test() {\n"
4513                "  someFunction(\n"
4514                "      arg1,\n"
4515                "      this + argument + has +\n"
4516                "          anotherFunc(nested,\n"
4517                "                      calls + whose +\n"
4518                "                          arguments +\n"
4519                "                          are + also +\n"
4520                "                          wrapped,\n"
4521                "                      in + addition) +\n"
4522                "          to + being + bin - packed,\n"
4523                "      arg3);\n"
4524                "}",
4525                Style);
4526 }
4527 
4528 TEST_F(FormatTest, ConstructorInitializers) {
4529   verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
4530   verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}",
4531                getLLVMStyleWithColumns(45));
4532   verifyFormat("Constructor()\n"
4533                "    : Inttializer(FitsOnTheLine) {}",
4534                getLLVMStyleWithColumns(44));
4535   verifyFormat("Constructor()\n"
4536                "    : Inttializer(FitsOnTheLine) {}",
4537                getLLVMStyleWithColumns(43));
4538 
4539   verifyFormat("template <typename T>\n"
4540                "Constructor() : Initializer(FitsOnTheLine) {}",
4541                getLLVMStyleWithColumns(45));
4542 
4543   verifyFormat(
4544       "SomeClass::Constructor()\n"
4545       "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
4546 
4547   verifyFormat(
4548       "SomeClass::Constructor()\n"
4549       "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4550       "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}");
4551   verifyFormat(
4552       "SomeClass::Constructor()\n"
4553       "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4554       "      aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
4555   verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4556                "            aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4557                "    : aaaaaaaaaa(aaaaaa) {}");
4558 
4559   verifyFormat("Constructor()\n"
4560                "    : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4561                "      aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4562                "                               aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4563                "      aaaaaaaaaaaaaaaaaaaaaaa() {}");
4564 
4565   verifyFormat("Constructor()\n"
4566                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4567                "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
4568 
4569   verifyFormat("Constructor(int Parameter = 0)\n"
4570                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
4571                "      aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}");
4572   verifyFormat("Constructor()\n"
4573                "    : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
4574                "}",
4575                getLLVMStyleWithColumns(60));
4576   verifyFormat("Constructor()\n"
4577                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4578                "          aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}");
4579 
4580   // Here a line could be saved by splitting the second initializer onto two
4581   // lines, but that is not desirable.
4582   verifyFormat("Constructor()\n"
4583                "    : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
4584                "      aaaaaaaaaaa(aaaaaaaaaaa),\n"
4585                "      aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
4586 
4587   FormatStyle OnePerLine = getLLVMStyle();
4588   OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
4589   OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
4590   verifyFormat("SomeClass::Constructor()\n"
4591                "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4592                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4593                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
4594                OnePerLine);
4595   verifyFormat("SomeClass::Constructor()\n"
4596                "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
4597                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4598                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
4599                OnePerLine);
4600   verifyFormat("MyClass::MyClass(int var)\n"
4601                "    : some_var_(var),            // 4 space indent\n"
4602                "      some_other_var_(var + 1) { // lined up\n"
4603                "}",
4604                OnePerLine);
4605   verifyFormat("Constructor()\n"
4606                "    : aaaaa(aaaaaa),\n"
4607                "      aaaaa(aaaaaa),\n"
4608                "      aaaaa(aaaaaa),\n"
4609                "      aaaaa(aaaaaa),\n"
4610                "      aaaaa(aaaaaa) {}",
4611                OnePerLine);
4612   verifyFormat("Constructor()\n"
4613                "    : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
4614                "            aaaaaaaaaaaaaaaaaaaaaa) {}",
4615                OnePerLine);
4616   OnePerLine.BinPackParameters = false;
4617   verifyFormat(
4618       "Constructor()\n"
4619       "    : aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4620       "          aaaaaaaaaaa().aaa(),\n"
4621       "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4622       OnePerLine);
4623   OnePerLine.ColumnLimit = 60;
4624   verifyFormat("Constructor()\n"
4625                "    : aaaaaaaaaaaaaaaaaaaa(a),\n"
4626                "      bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
4627                OnePerLine);
4628 
4629   EXPECT_EQ("Constructor()\n"
4630             "    : // Comment forcing unwanted break.\n"
4631             "      aaaa(aaaa) {}",
4632             format("Constructor() :\n"
4633                    "    // Comment forcing unwanted break.\n"
4634                    "    aaaa(aaaa) {}"));
4635 }
4636 
4637 TEST_F(FormatTest, AllowAllConstructorInitializersOnNextLine) {
4638   FormatStyle Style = getLLVMStyle();
4639   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
4640   Style.ColumnLimit = 60;
4641   Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
4642   Style.AllowAllConstructorInitializersOnNextLine = true;
4643   Style.BinPackParameters = false;
4644 
4645   for (int i = 0; i < 4; ++i) {
4646     // Test all combinations of parameters that should not have an effect.
4647     Style.AllowAllParametersOfDeclarationOnNextLine = i & 1;
4648     Style.AllowAllArgumentsOnNextLine = i & 2;
4649 
4650     Style.AllowAllConstructorInitializersOnNextLine = true;
4651     Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
4652     verifyFormat("Constructor()\n"
4653                  "    : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4654                  Style);
4655     verifyFormat("Constructor() : a(a), b(b) {}", Style);
4656 
4657     Style.AllowAllConstructorInitializersOnNextLine = false;
4658     verifyFormat("Constructor()\n"
4659                  "    : aaaaaaaaaaaaaaaaaaaa(a)\n"
4660                  "    , bbbbbbbbbbbbbbbbbbbbb(b) {}",
4661                  Style);
4662     verifyFormat("Constructor() : a(a), b(b) {}", Style);
4663 
4664     Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
4665     Style.AllowAllConstructorInitializersOnNextLine = true;
4666     verifyFormat("Constructor()\n"
4667                  "    : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4668                  Style);
4669 
4670     Style.AllowAllConstructorInitializersOnNextLine = false;
4671     verifyFormat("Constructor()\n"
4672                  "    : aaaaaaaaaaaaaaaaaaaa(a),\n"
4673                  "      bbbbbbbbbbbbbbbbbbbbb(b) {}",
4674                  Style);
4675 
4676     Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
4677     Style.AllowAllConstructorInitializersOnNextLine = true;
4678     verifyFormat("Constructor() :\n"
4679                  "    aaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4680                  Style);
4681 
4682     Style.AllowAllConstructorInitializersOnNextLine = false;
4683     verifyFormat("Constructor() :\n"
4684                  "    aaaaaaaaaaaaaaaaaa(a),\n"
4685                  "    bbbbbbbbbbbbbbbbbbbbb(b) {}",
4686                  Style);
4687   }
4688 
4689   // Test interactions between AllowAllParametersOfDeclarationOnNextLine and
4690   // AllowAllConstructorInitializersOnNextLine in all
4691   // BreakConstructorInitializers modes
4692   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
4693   Style.AllowAllParametersOfDeclarationOnNextLine = true;
4694   Style.AllowAllConstructorInitializersOnNextLine = false;
4695   verifyFormat("SomeClassWithALongName::Constructor(\n"
4696                "    int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb)\n"
4697                "    : aaaaaaaaaaaaaaaaaaaa(a)\n"
4698                "    , bbbbbbbbbbbbbbbbbbbbb(b) {}",
4699                Style);
4700 
4701   Style.AllowAllConstructorInitializersOnNextLine = true;
4702   verifyFormat("SomeClassWithALongName::Constructor(\n"
4703                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4704                "    int bbbbbbbbbbbbb,\n"
4705                "    int cccccccccccccccc)\n"
4706                "    : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4707                Style);
4708 
4709   Style.AllowAllParametersOfDeclarationOnNextLine = false;
4710   Style.AllowAllConstructorInitializersOnNextLine = false;
4711   verifyFormat("SomeClassWithALongName::Constructor(\n"
4712                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4713                "    int bbbbbbbbbbbbb)\n"
4714                "    : aaaaaaaaaaaaaaaaaaaa(a)\n"
4715                "    , bbbbbbbbbbbbbbbbbbbbb(b) {}",
4716                Style);
4717 
4718   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
4719 
4720   Style.AllowAllParametersOfDeclarationOnNextLine = true;
4721   verifyFormat("SomeClassWithALongName::Constructor(\n"
4722                "    int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb)\n"
4723                "    : aaaaaaaaaaaaaaaaaaaa(a),\n"
4724                "      bbbbbbbbbbbbbbbbbbbbb(b) {}",
4725                Style);
4726 
4727   Style.AllowAllConstructorInitializersOnNextLine = true;
4728   verifyFormat("SomeClassWithALongName::Constructor(\n"
4729                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4730                "    int bbbbbbbbbbbbb,\n"
4731                "    int cccccccccccccccc)\n"
4732                "    : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4733                Style);
4734 
4735   Style.AllowAllParametersOfDeclarationOnNextLine = false;
4736   Style.AllowAllConstructorInitializersOnNextLine = false;
4737   verifyFormat("SomeClassWithALongName::Constructor(\n"
4738                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4739                "    int bbbbbbbbbbbbb)\n"
4740                "    : aaaaaaaaaaaaaaaaaaaa(a),\n"
4741                "      bbbbbbbbbbbbbbbbbbbbb(b) {}",
4742                Style);
4743 
4744   Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
4745   Style.AllowAllParametersOfDeclarationOnNextLine = true;
4746   verifyFormat("SomeClassWithALongName::Constructor(\n"
4747                "    int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb) :\n"
4748                "    aaaaaaaaaaaaaaaaaaaa(a),\n"
4749                "    bbbbbbbbbbbbbbbbbbbbb(b) {}",
4750                Style);
4751 
4752   Style.AllowAllConstructorInitializersOnNextLine = true;
4753   verifyFormat("SomeClassWithALongName::Constructor(\n"
4754                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4755                "    int bbbbbbbbbbbbb,\n"
4756                "    int cccccccccccccccc) :\n"
4757                "    aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4758                Style);
4759 
4760   Style.AllowAllParametersOfDeclarationOnNextLine = false;
4761   Style.AllowAllConstructorInitializersOnNextLine = false;
4762   verifyFormat("SomeClassWithALongName::Constructor(\n"
4763                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4764                "    int bbbbbbbbbbbbb) :\n"
4765                "    aaaaaaaaaaaaaaaaaaaa(a),\n"
4766                "    bbbbbbbbbbbbbbbbbbbbb(b) {}",
4767                Style);
4768 }
4769 
4770 TEST_F(FormatTest, AllowAllArgumentsOnNextLine) {
4771   FormatStyle Style = getLLVMStyle();
4772   Style.ColumnLimit = 60;
4773   Style.BinPackArguments = false;
4774   for (int i = 0; i < 4; ++i) {
4775     // Test all combinations of parameters that should not have an effect.
4776     Style.AllowAllParametersOfDeclarationOnNextLine = i & 1;
4777     Style.AllowAllConstructorInitializersOnNextLine = i & 2;
4778 
4779     Style.AllowAllArgumentsOnNextLine = true;
4780     verifyFormat("void foo() {\n"
4781                  "  FunctionCallWithReallyLongName(\n"
4782                  "      aaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbb);\n"
4783                  "}",
4784                  Style);
4785     Style.AllowAllArgumentsOnNextLine = false;
4786     verifyFormat("void foo() {\n"
4787                  "  FunctionCallWithReallyLongName(\n"
4788                  "      aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4789                  "      bbbbbbbbbbbb);\n"
4790                  "}",
4791                  Style);
4792 
4793     Style.AllowAllArgumentsOnNextLine = true;
4794     verifyFormat("void foo() {\n"
4795                  "  auto VariableWithReallyLongName = {\n"
4796                  "      aaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbb};\n"
4797                  "}",
4798                  Style);
4799     Style.AllowAllArgumentsOnNextLine = false;
4800     verifyFormat("void foo() {\n"
4801                  "  auto VariableWithReallyLongName = {\n"
4802                  "      aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4803                  "      bbbbbbbbbbbb};\n"
4804                  "}",
4805                  Style);
4806   }
4807 
4808   // This parameter should not affect declarations.
4809   Style.BinPackParameters = false;
4810   Style.AllowAllArgumentsOnNextLine = false;
4811   Style.AllowAllParametersOfDeclarationOnNextLine = true;
4812   verifyFormat("void FunctionCallWithReallyLongName(\n"
4813                "    int aaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbb);",
4814                Style);
4815   Style.AllowAllParametersOfDeclarationOnNextLine = false;
4816   verifyFormat("void FunctionCallWithReallyLongName(\n"
4817                "    int aaaaaaaaaaaaaaaaaaaaaaa,\n"
4818                "    int bbbbbbbbbbbb);",
4819                Style);
4820 }
4821 
4822 TEST_F(FormatTest, BreakConstructorInitializersAfterColon) {
4823   FormatStyle Style = getLLVMStyle();
4824   Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
4825 
4826   verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
4827   verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}",
4828                getStyleWithColumns(Style, 45));
4829   verifyFormat("Constructor() :\n"
4830                "    Initializer(FitsOnTheLine) {}",
4831                getStyleWithColumns(Style, 44));
4832   verifyFormat("Constructor() :\n"
4833                "    Initializer(FitsOnTheLine) {}",
4834                getStyleWithColumns(Style, 43));
4835 
4836   verifyFormat("template <typename T>\n"
4837                "Constructor() : Initializer(FitsOnTheLine) {}",
4838                getStyleWithColumns(Style, 50));
4839   Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
4840   verifyFormat(
4841       "SomeClass::Constructor() :\n"
4842       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
4843       Style);
4844 
4845   Style.ConstructorInitializerAllOnOneLineOrOnePerLine = false;
4846   verifyFormat(
4847       "SomeClass::Constructor() :\n"
4848       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
4849       Style);
4850 
4851   verifyFormat(
4852       "SomeClass::Constructor() :\n"
4853       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4854       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
4855       Style);
4856   verifyFormat(
4857       "SomeClass::Constructor() :\n"
4858       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4859       "    aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
4860       Style);
4861   verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4862                "            aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4863                "    aaaaaaaaaa(aaaaaa) {}",
4864                Style);
4865 
4866   verifyFormat("Constructor() :\n"
4867                "    aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4868                "    aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4869                "                             aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4870                "    aaaaaaaaaaaaaaaaaaaaaaa() {}",
4871                Style);
4872 
4873   verifyFormat("Constructor() :\n"
4874                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4875                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4876                Style);
4877 
4878   verifyFormat("Constructor(int Parameter = 0) :\n"
4879                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
4880                "    aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}",
4881                Style);
4882   verifyFormat("Constructor() :\n"
4883                "    aaaaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
4884                "}",
4885                getStyleWithColumns(Style, 60));
4886   verifyFormat("Constructor() :\n"
4887                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4888                "        aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}",
4889                Style);
4890 
4891   // Here a line could be saved by splitting the second initializer onto two
4892   // lines, but that is not desirable.
4893   verifyFormat("Constructor() :\n"
4894                "    aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
4895                "    aaaaaaaaaaa(aaaaaaaaaaa),\n"
4896                "    aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4897                Style);
4898 
4899   FormatStyle OnePerLine = Style;
4900   OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
4901   OnePerLine.AllowAllConstructorInitializersOnNextLine = false;
4902   verifyFormat("SomeClass::Constructor() :\n"
4903                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4904                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4905                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
4906                OnePerLine);
4907   verifyFormat("SomeClass::Constructor() :\n"
4908                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
4909                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4910                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
4911                OnePerLine);
4912   verifyFormat("MyClass::MyClass(int var) :\n"
4913                "    some_var_(var),            // 4 space indent\n"
4914                "    some_other_var_(var + 1) { // lined up\n"
4915                "}",
4916                OnePerLine);
4917   verifyFormat("Constructor() :\n"
4918                "    aaaaa(aaaaaa),\n"
4919                "    aaaaa(aaaaaa),\n"
4920                "    aaaaa(aaaaaa),\n"
4921                "    aaaaa(aaaaaa),\n"
4922                "    aaaaa(aaaaaa) {}",
4923                OnePerLine);
4924   verifyFormat("Constructor() :\n"
4925                "    aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
4926                "          aaaaaaaaaaaaaaaaaaaaaa) {}",
4927                OnePerLine);
4928   OnePerLine.BinPackParameters = false;
4929   verifyFormat("Constructor() :\n"
4930                "    aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4931                "        aaaaaaaaaaa().aaa(),\n"
4932                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4933                OnePerLine);
4934   OnePerLine.ColumnLimit = 60;
4935   verifyFormat("Constructor() :\n"
4936                "    aaaaaaaaaaaaaaaaaaaa(a),\n"
4937                "    bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
4938                OnePerLine);
4939 
4940   EXPECT_EQ("Constructor() :\n"
4941             "    // Comment forcing unwanted break.\n"
4942             "    aaaa(aaaa) {}",
4943             format("Constructor() :\n"
4944                    "    // Comment forcing unwanted break.\n"
4945                    "    aaaa(aaaa) {}",
4946                    Style));
4947 
4948   Style.ColumnLimit = 0;
4949   verifyFormat("SomeClass::Constructor() :\n"
4950                "    a(a) {}",
4951                Style);
4952   verifyFormat("SomeClass::Constructor() noexcept :\n"
4953                "    a(a) {}",
4954                Style);
4955   verifyFormat("SomeClass::Constructor() :\n"
4956                "    a(a), b(b), c(c) {}",
4957                Style);
4958   verifyFormat("SomeClass::Constructor() :\n"
4959                "    a(a) {\n"
4960                "  foo();\n"
4961                "  bar();\n"
4962                "}",
4963                Style);
4964 
4965   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
4966   verifyFormat("SomeClass::Constructor() :\n"
4967                "    a(a), b(b), c(c) {\n"
4968                "}",
4969                Style);
4970   verifyFormat("SomeClass::Constructor() :\n"
4971                "    a(a) {\n"
4972                "}",
4973                Style);
4974 
4975   Style.ColumnLimit = 80;
4976   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
4977   Style.ConstructorInitializerIndentWidth = 2;
4978   verifyFormat("SomeClass::Constructor() : a(a), b(b), c(c) {}", Style);
4979   verifyFormat("SomeClass::Constructor() :\n"
4980                "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4981                "  bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {}",
4982                Style);
4983 
4984   // `ConstructorInitializerIndentWidth` actually applies to InheritanceList as
4985   // well
4986   Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
4987   verifyFormat(
4988       "class SomeClass\n"
4989       "  : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4990       "    public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};",
4991       Style);
4992   Style.BreakInheritanceList = FormatStyle::BILS_BeforeComma;
4993   verifyFormat(
4994       "class SomeClass\n"
4995       "  : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4996       "  , public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};",
4997       Style);
4998   Style.BreakInheritanceList = FormatStyle::BILS_AfterColon;
4999   verifyFormat(
5000       "class SomeClass :\n"
5001       "  public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5002       "  public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};",
5003       Style);
5004 }
5005 
5006 #ifndef EXPENSIVE_CHECKS
5007 // Expensive checks enables libstdc++ checking which includes validating the
5008 // state of ranges used in std::priority_queue - this blows out the
5009 // runtime/scalability of the function and makes this test unacceptably slow.
5010 TEST_F(FormatTest, MemoizationTests) {
5011   // This breaks if the memoization lookup does not take \c Indent and
5012   // \c LastSpace into account.
5013   verifyFormat(
5014       "extern CFRunLoopTimerRef\n"
5015       "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n"
5016       "                     CFTimeInterval interval, CFOptionFlags flags,\n"
5017       "                     CFIndex order, CFRunLoopTimerCallBack callout,\n"
5018       "                     CFRunLoopTimerContext *context) {}");
5019 
5020   // Deep nesting somewhat works around our memoization.
5021   verifyFormat(
5022       "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
5023       "    aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
5024       "        aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
5025       "            aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
5026       "                aaaaa())))))))))))))))))))))))))))))))))))))));",
5027       getLLVMStyleWithColumns(65));
5028   verifyFormat(
5029       "aaaaa(\n"
5030       "    aaaaa,\n"
5031       "    aaaaa(\n"
5032       "        aaaaa,\n"
5033       "        aaaaa(\n"
5034       "            aaaaa,\n"
5035       "            aaaaa(\n"
5036       "                aaaaa,\n"
5037       "                aaaaa(\n"
5038       "                    aaaaa,\n"
5039       "                    aaaaa(\n"
5040       "                        aaaaa,\n"
5041       "                        aaaaa(\n"
5042       "                            aaaaa,\n"
5043       "                            aaaaa(\n"
5044       "                                aaaaa,\n"
5045       "                                aaaaa(\n"
5046       "                                    aaaaa,\n"
5047       "                                    aaaaa(\n"
5048       "                                        aaaaa,\n"
5049       "                                        aaaaa(\n"
5050       "                                            aaaaa,\n"
5051       "                                            aaaaa(\n"
5052       "                                                aaaaa,\n"
5053       "                                                aaaaa))))))))))));",
5054       getLLVMStyleWithColumns(65));
5055   verifyFormat(
5056       "a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(), a), a), a), a),\n"
5057       "                                  a),\n"
5058       "                                a),\n"
5059       "                              a),\n"
5060       "                            a),\n"
5061       "                          a),\n"
5062       "                        a),\n"
5063       "                      a),\n"
5064       "                    a),\n"
5065       "                  a),\n"
5066       "                a),\n"
5067       "              a),\n"
5068       "            a),\n"
5069       "          a),\n"
5070       "        a),\n"
5071       "      a),\n"
5072       "    a),\n"
5073       "  a)",
5074       getLLVMStyleWithColumns(65));
5075 
5076   // This test takes VERY long when memoization is broken.
5077   FormatStyle OnePerLine = getLLVMStyle();
5078   OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
5079   OnePerLine.BinPackParameters = false;
5080   std::string input = "Constructor()\n"
5081                       "    : aaaa(a,\n";
5082   for (unsigned i = 0, e = 80; i != e; ++i) {
5083     input += "           a,\n";
5084   }
5085   input += "           a) {}";
5086   verifyFormat(input, OnePerLine);
5087 }
5088 #endif
5089 
5090 TEST_F(FormatTest, BreaksAsHighAsPossible) {
5091   verifyFormat(
5092       "void f() {\n"
5093       "  if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
5094       "      (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
5095       "    f();\n"
5096       "}");
5097   verifyFormat("if (Intervals[i].getRange().getFirst() <\n"
5098                "    Intervals[i - 1].getRange().getLast()) {\n}");
5099 }
5100 
5101 TEST_F(FormatTest, BreaksFunctionDeclarations) {
5102   // Principially, we break function declarations in a certain order:
5103   // 1) break amongst arguments.
5104   verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n"
5105                "                              Cccccccccccccc cccccccccccccc);");
5106   verifyFormat("template <class TemplateIt>\n"
5107                "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n"
5108                "                            TemplateIt *stop) {}");
5109 
5110   // 2) break after return type.
5111   verifyFormat(
5112       "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5113       "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);",
5114       getGoogleStyle());
5115 
5116   // 3) break after (.
5117   verifyFormat(
5118       "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n"
5119       "    Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);",
5120       getGoogleStyle());
5121 
5122   // 4) break before after nested name specifiers.
5123   verifyFormat(
5124       "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5125       "SomeClasssssssssssssssssssssssssssssssssssssss::\n"
5126       "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);",
5127       getGoogleStyle());
5128 
5129   // However, there are exceptions, if a sufficient amount of lines can be
5130   // saved.
5131   // FIXME: The precise cut-offs wrt. the number of saved lines might need some
5132   // more adjusting.
5133   verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
5134                "                                  Cccccccccccccc cccccccccc,\n"
5135                "                                  Cccccccccccccc cccccccccc,\n"
5136                "                                  Cccccccccccccc cccccccccc,\n"
5137                "                                  Cccccccccccccc cccccccccc);");
5138   verifyFormat(
5139       "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5140       "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
5141       "            Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
5142       "            Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);",
5143       getGoogleStyle());
5144   verifyFormat(
5145       "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
5146       "                                          Cccccccccccccc cccccccccc,\n"
5147       "                                          Cccccccccccccc cccccccccc,\n"
5148       "                                          Cccccccccccccc cccccccccc,\n"
5149       "                                          Cccccccccccccc cccccccccc,\n"
5150       "                                          Cccccccccccccc cccccccccc,\n"
5151       "                                          Cccccccccccccc cccccccccc);");
5152   verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
5153                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
5154                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
5155                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
5156                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
5157 
5158   // Break after multi-line parameters.
5159   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5160                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5161                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5162                "    bbbb bbbb);");
5163   verifyFormat("void SomeLoooooooooooongFunction(\n"
5164                "    std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
5165                "        aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5166                "    int bbbbbbbbbbbbb);");
5167 
5168   // Treat overloaded operators like other functions.
5169   verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
5170                "operator>(const SomeLoooooooooooooooooooooooooogType &other);");
5171   verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
5172                "operator>>(const SomeLooooooooooooooooooooooooogType &other);");
5173   verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
5174                "operator<<(const SomeLooooooooooooooooooooooooogType &other);");
5175   verifyGoogleFormat(
5176       "SomeLoooooooooooooooooooooooooooooogType operator>>(\n"
5177       "    const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
5178   verifyGoogleFormat(
5179       "SomeLoooooooooooooooooooooooooooooogType operator<<(\n"
5180       "    const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
5181   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5182                "    int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);");
5183   verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n"
5184                "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);");
5185   verifyGoogleFormat(
5186       "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n"
5187       "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5188       "    bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}");
5189   verifyGoogleFormat("template <typename T>\n"
5190                      "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5191                      "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n"
5192                      "    aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);");
5193 
5194   FormatStyle Style = getLLVMStyle();
5195   Style.PointerAlignment = FormatStyle::PAS_Left;
5196   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5197                "    aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}",
5198                Style);
5199   verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n"
5200                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
5201                Style);
5202 }
5203 
5204 TEST_F(FormatTest, DontBreakBeforeQualifiedOperator) {
5205   // Regression test for https://bugs.llvm.org/show_bug.cgi?id=40516:
5206   // Prefer keeping `::` followed by `operator` together.
5207   EXPECT_EQ("const aaaa::bbbbbbb &\n"
5208             "ccccccccc::operator++() {\n"
5209             "  stuff();\n"
5210             "}",
5211             format("const aaaa::bbbbbbb\n"
5212                    "&ccccccccc::operator++() { stuff(); }",
5213                    getLLVMStyleWithColumns(40)));
5214 }
5215 
5216 TEST_F(FormatTest, TrailingReturnType) {
5217   verifyFormat("auto foo() -> int;\n");
5218   // correct trailing return type spacing
5219   verifyFormat("auto operator->() -> int;\n");
5220   verifyFormat("auto operator++(int) -> int;\n");
5221 
5222   verifyFormat("struct S {\n"
5223                "  auto bar() const -> int;\n"
5224                "};");
5225   verifyFormat("template <size_t Order, typename T>\n"
5226                "auto load_img(const std::string &filename)\n"
5227                "    -> alias::tensor<Order, T, mem::tag::cpu> {}");
5228   verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n"
5229                "    -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}");
5230   verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}");
5231   verifyFormat("template <typename T>\n"
5232                "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n"
5233                "    -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());");
5234 
5235   // Not trailing return types.
5236   verifyFormat("void f() { auto a = b->c(); }");
5237 }
5238 
5239 TEST_F(FormatTest, DeductionGuides) {
5240   verifyFormat("template <class T> A(const T &, const T &) -> A<T &>;");
5241   verifyFormat("template <class T> explicit A(T &, T &&) -> A<T>;");
5242   verifyFormat("template <class... Ts> S(Ts...) -> S<Ts...>;");
5243   verifyFormat(
5244       "template <class... T>\n"
5245       "array(T &&... t) -> array<std::common_type_t<T...>, sizeof...(T)>;");
5246   verifyFormat("template <class T> A() -> A<decltype(p->foo<3>())>;");
5247   verifyFormat("template <class T> A() -> A<decltype(foo<traits<1>>)>;");
5248   verifyFormat("template <class T> A() -> A<sizeof(p->foo<1>)>;");
5249   verifyFormat("template <class T> A() -> A<(3 < 2)>;");
5250   verifyFormat("template <class T> A() -> A<((3) < (2))>;");
5251   verifyFormat("template <class T> x() -> x<1>;");
5252   verifyFormat("template <class T> explicit x(T &) -> x<1>;");
5253 
5254   // Ensure not deduction guides.
5255   verifyFormat("c()->f<int>();");
5256   verifyFormat("x()->foo<1>;");
5257   verifyFormat("x = p->foo<3>();");
5258   verifyFormat("x()->x<1>();");
5259   verifyFormat("x()->x<1>;");
5260 }
5261 
5262 TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) {
5263   // Avoid breaking before trailing 'const' or other trailing annotations, if
5264   // they are not function-like.
5265   FormatStyle Style = getGoogleStyle();
5266   Style.ColumnLimit = 47;
5267   verifyFormat("void someLongFunction(\n"
5268                "    int someLoooooooooooooongParameter) const {\n}",
5269                getLLVMStyleWithColumns(47));
5270   verifyFormat("LoooooongReturnType\n"
5271                "someLoooooooongFunction() const {}",
5272                getLLVMStyleWithColumns(47));
5273   verifyFormat("LoooooongReturnType someLoooooooongFunction()\n"
5274                "    const {}",
5275                Style);
5276   verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
5277                "                  aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;");
5278   verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
5279                "                  aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;");
5280   verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
5281                "                  aaaaa aaaaaaaaaaaaaaaaaaaa) override final;");
5282   verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n"
5283                "                   aaaaaaaaaaa aaaaa) const override;");
5284   verifyGoogleFormat(
5285       "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5286       "    const override;");
5287 
5288   // Even if the first parameter has to be wrapped.
5289   verifyFormat("void someLongFunction(\n"
5290                "    int someLongParameter) const {}",
5291                getLLVMStyleWithColumns(46));
5292   verifyFormat("void someLongFunction(\n"
5293                "    int someLongParameter) const {}",
5294                Style);
5295   verifyFormat("void someLongFunction(\n"
5296                "    int someLongParameter) override {}",
5297                Style);
5298   verifyFormat("void someLongFunction(\n"
5299                "    int someLongParameter) OVERRIDE {}",
5300                Style);
5301   verifyFormat("void someLongFunction(\n"
5302                "    int someLongParameter) final {}",
5303                Style);
5304   verifyFormat("void someLongFunction(\n"
5305                "    int someLongParameter) FINAL {}",
5306                Style);
5307   verifyFormat("void someLongFunction(\n"
5308                "    int parameter) const override {}",
5309                Style);
5310 
5311   Style.BreakBeforeBraces = FormatStyle::BS_Allman;
5312   verifyFormat("void someLongFunction(\n"
5313                "    int someLongParameter) const\n"
5314                "{\n"
5315                "}",
5316                Style);
5317 
5318   Style.BreakBeforeBraces = FormatStyle::BS_Whitesmiths;
5319   verifyFormat("void someLongFunction(\n"
5320                "    int someLongParameter) const\n"
5321                "  {\n"
5322                "  }",
5323                Style);
5324 
5325   // Unless these are unknown annotations.
5326   verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n"
5327                "                  aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5328                "    LONG_AND_UGLY_ANNOTATION;");
5329 
5330   // Breaking before function-like trailing annotations is fine to keep them
5331   // close to their arguments.
5332   verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5333                "    LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
5334   verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
5335                "    LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
5336   verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
5337                "    LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}");
5338   verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n"
5339                      "    AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);");
5340   verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});");
5341 
5342   verifyFormat(
5343       "void aaaaaaaaaaaaaaaaaa()\n"
5344       "    __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n"
5345       "                   aaaaaaaaaaaaaaaaaaaaaaaaa));");
5346   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5347                "    __attribute__((unused));");
5348   verifyGoogleFormat(
5349       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5350       "    GUARDED_BY(aaaaaaaaaaaa);");
5351   verifyGoogleFormat(
5352       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5353       "    GUARDED_BY(aaaaaaaaaaaa);");
5354   verifyGoogleFormat(
5355       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
5356       "    aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5357   verifyGoogleFormat(
5358       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
5359       "    aaaaaaaaaaaaaaaaaaaaaaaaa;");
5360 }
5361 
5362 TEST_F(FormatTest, FunctionAnnotations) {
5363   verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
5364                "int OldFunction(const string &parameter) {}");
5365   verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
5366                "string OldFunction(const string &parameter) {}");
5367   verifyFormat("template <typename T>\n"
5368                "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
5369                "string OldFunction(const string &parameter) {}");
5370 
5371   // Not function annotations.
5372   verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5373                "                << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
5374   verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n"
5375                "       ThisIsATestWithAReallyReallyReallyReallyLongName) {}");
5376   verifyFormat("MACRO(abc).function() // wrap\n"
5377                "    << abc;");
5378   verifyFormat("MACRO(abc)->function() // wrap\n"
5379                "    << abc;");
5380   verifyFormat("MACRO(abc)::function() // wrap\n"
5381                "    << abc;");
5382 }
5383 
5384 TEST_F(FormatTest, BreaksDesireably) {
5385   verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
5386                "    aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
5387                "    aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
5388   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5389                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
5390                "}");
5391 
5392   verifyFormat(
5393       "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5394       "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
5395 
5396   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5397                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5398                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
5399 
5400   verifyFormat(
5401       "aaaaaaaa(aaaaaaaaaaaaa,\n"
5402       "         aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5403       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
5404       "         aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5405       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
5406 
5407   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
5408                "    (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5409 
5410   verifyFormat(
5411       "void f() {\n"
5412       "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
5413       "                                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
5414       "}");
5415   verifyFormat(
5416       "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5417       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
5418   verifyFormat(
5419       "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5420       "                aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
5421   verifyFormat(
5422       "aaaaaa(aaa,\n"
5423       "       new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5424       "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5425       "       aaaa);");
5426   verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5427                "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5428                "                  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5429 
5430   // Indent consistently independent of call expression and unary operator.
5431   verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
5432                "    dddddddddddddddddddddddddddddd));");
5433   verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
5434                "    dddddddddddddddddddddddddddddd));");
5435   verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n"
5436                "    dddddddddddddddddddddddddddddd));");
5437 
5438   // This test case breaks on an incorrect memoization, i.e. an optimization not
5439   // taking into account the StopAt value.
5440   verifyFormat(
5441       "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
5442       "       aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
5443       "       aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
5444       "       (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5445 
5446   verifyFormat("{\n  {\n    {\n"
5447                "      Annotation.SpaceRequiredBefore =\n"
5448                "          Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
5449                "          Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
5450                "    }\n  }\n}");
5451 
5452   // Break on an outer level if there was a break on an inner level.
5453   EXPECT_EQ("f(g(h(a, // comment\n"
5454             "      b, c),\n"
5455             "    d, e),\n"
5456             "  x, y);",
5457             format("f(g(h(a, // comment\n"
5458                    "    b, c), d, e), x, y);"));
5459 
5460   // Prefer breaking similar line breaks.
5461   verifyFormat(
5462       "const int kTrackingOptions = NSTrackingMouseMoved |\n"
5463       "                             NSTrackingMouseEnteredAndExited |\n"
5464       "                             NSTrackingActiveAlways;");
5465 }
5466 
5467 TEST_F(FormatTest, FormatsDeclarationsOnePerLine) {
5468   FormatStyle NoBinPacking = getGoogleStyle();
5469   NoBinPacking.BinPackParameters = false;
5470   NoBinPacking.BinPackArguments = true;
5471   verifyFormat("void f() {\n"
5472                "  f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n"
5473                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
5474                "}",
5475                NoBinPacking);
5476   verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n"
5477                "       int aaaaaaaaaaaaaaaaaaaa,\n"
5478                "       int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
5479                NoBinPacking);
5480 
5481   NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
5482   verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5483                "                        vector<int> bbbbbbbbbbbbbbb);",
5484                NoBinPacking);
5485   // FIXME: This behavior difference is probably not wanted. However, currently
5486   // we cannot distinguish BreakBeforeParameter being set because of the wrapped
5487   // template arguments from BreakBeforeParameter being set because of the
5488   // one-per-line formatting.
5489   verifyFormat(
5490       "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n"
5491       "                                             aaaaaaaaaa> aaaaaaaaaa);",
5492       NoBinPacking);
5493   verifyFormat(
5494       "void fffffffffff(\n"
5495       "    aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n"
5496       "        aaaaaaaaaa);");
5497 }
5498 
5499 TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) {
5500   FormatStyle NoBinPacking = getGoogleStyle();
5501   NoBinPacking.BinPackParameters = false;
5502   NoBinPacking.BinPackArguments = false;
5503   verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n"
5504                "  aaaaaaaaaaaaaaaaaaaa,\n"
5505                "  aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);",
5506                NoBinPacking);
5507   verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n"
5508                "        aaaaaaaaaaaaa,\n"
5509                "        aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));",
5510                NoBinPacking);
5511   verifyFormat(
5512       "aaaaaaaa(aaaaaaaaaaaaa,\n"
5513       "         aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5514       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
5515       "         aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5516       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));",
5517       NoBinPacking);
5518   verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
5519                "    .aaaaaaaaaaaaaaaaaa();",
5520                NoBinPacking);
5521   verifyFormat("void f() {\n"
5522                "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5523                "      aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n"
5524                "}",
5525                NoBinPacking);
5526 
5527   verifyFormat(
5528       "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5529       "             aaaaaaaaaaaa,\n"
5530       "             aaaaaaaaaaaa);",
5531       NoBinPacking);
5532   verifyFormat(
5533       "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n"
5534       "                               ddddddddddddddddddddddddddddd),\n"
5535       "             test);",
5536       NoBinPacking);
5537 
5538   verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n"
5539                "            aaaaaaaaaaaaaaaaaaaaaaa,\n"
5540                "            aaaaaaaaaaaaaaaaaaaaaaa>\n"
5541                "    aaaaaaaaaaaaaaaaaa;",
5542                NoBinPacking);
5543   verifyFormat("a(\"a\"\n"
5544                "  \"a\",\n"
5545                "  a);");
5546 
5547   NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
5548   verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n"
5549                "                aaaaaaaaa,\n"
5550                "                aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5551                NoBinPacking);
5552   verifyFormat(
5553       "void f() {\n"
5554       "  aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
5555       "      .aaaaaaa();\n"
5556       "}",
5557       NoBinPacking);
5558   verifyFormat(
5559       "template <class SomeType, class SomeOtherType>\n"
5560       "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}",
5561       NoBinPacking);
5562 }
5563 
5564 TEST_F(FormatTest, AdaptiveOnePerLineFormatting) {
5565   FormatStyle Style = getLLVMStyleWithColumns(15);
5566   Style.ExperimentalAutoDetectBinPacking = true;
5567   EXPECT_EQ("aaa(aaaa,\n"
5568             "    aaaa,\n"
5569             "    aaaa);\n"
5570             "aaa(aaaa,\n"
5571             "    aaaa,\n"
5572             "    aaaa);",
5573             format("aaa(aaaa,\n" // one-per-line
5574                    "  aaaa,\n"
5575                    "    aaaa  );\n"
5576                    "aaa(aaaa,  aaaa,  aaaa);", // inconclusive
5577                    Style));
5578   EXPECT_EQ("aaa(aaaa, aaaa,\n"
5579             "    aaaa);\n"
5580             "aaa(aaaa, aaaa,\n"
5581             "    aaaa);",
5582             format("aaa(aaaa,  aaaa,\n" // bin-packed
5583                    "    aaaa  );\n"
5584                    "aaa(aaaa,  aaaa,  aaaa);", // inconclusive
5585                    Style));
5586 }
5587 
5588 TEST_F(FormatTest, FormatsBuilderPattern) {
5589   verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n"
5590                "    .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n"
5591                "    .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n"
5592                "    .StartsWith(\".init\", ORDER_INIT)\n"
5593                "    .StartsWith(\".fini\", ORDER_FINI)\n"
5594                "    .StartsWith(\".hash\", ORDER_HASH)\n"
5595                "    .Default(ORDER_TEXT);\n");
5596 
5597   verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n"
5598                "       aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();");
5599   verifyFormat("aaaaaaa->aaaaaaa\n"
5600                "    ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5601                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5602                "    ->aaaaaaaa(aaaaaaaaaaaaaaa);");
5603   verifyFormat(
5604       "aaaaaaa->aaaaaaa\n"
5605       "    ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5606       "    ->aaaaaaaa(aaaaaaaaaaaaaaa);");
5607   verifyFormat(
5608       "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"
5609       "    aaaaaaaaaaaaaa);");
5610   verifyFormat(
5611       "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n"
5612       "    aaaaaa->aaaaaaaaaaaa()\n"
5613       "        ->aaaaaaaaaaaaaaaa(\n"
5614       "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5615       "        ->aaaaaaaaaaaaaaaaa();");
5616   verifyGoogleFormat(
5617       "void f() {\n"
5618       "  someo->Add((new util::filetools::Handler(dir))\n"
5619       "                 ->OnEvent1(NewPermanentCallback(\n"
5620       "                     this, &HandlerHolderClass::EventHandlerCBA))\n"
5621       "                 ->OnEvent2(NewPermanentCallback(\n"
5622       "                     this, &HandlerHolderClass::EventHandlerCBB))\n"
5623       "                 ->OnEvent3(NewPermanentCallback(\n"
5624       "                     this, &HandlerHolderClass::EventHandlerCBC))\n"
5625       "                 ->OnEvent5(NewPermanentCallback(\n"
5626       "                     this, &HandlerHolderClass::EventHandlerCBD))\n"
5627       "                 ->OnEvent6(NewPermanentCallback(\n"
5628       "                     this, &HandlerHolderClass::EventHandlerCBE)));\n"
5629       "}");
5630 
5631   verifyFormat(
5632       "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();");
5633   verifyFormat("aaaaaaaaaaaaaaa()\n"
5634                "    .aaaaaaaaaaaaaaa()\n"
5635                "    .aaaaaaaaaaaaaaa()\n"
5636                "    .aaaaaaaaaaaaaaa()\n"
5637                "    .aaaaaaaaaaaaaaa();");
5638   verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
5639                "    .aaaaaaaaaaaaaaa()\n"
5640                "    .aaaaaaaaaaaaaaa()\n"
5641                "    .aaaaaaaaaaaaaaa();");
5642   verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
5643                "    .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
5644                "    .aaaaaaaaaaaaaaa();");
5645   verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n"
5646                "    ->aaaaaaaaaaaaaae(0)\n"
5647                "    ->aaaaaaaaaaaaaaa();");
5648 
5649   // Don't linewrap after very short segments.
5650   verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5651                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5652                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5653   verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5654                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5655                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5656   verifyFormat("aaa()\n"
5657                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5658                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5659                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5660 
5661   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
5662                "    .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5663                "    .has<bbbbbbbbbbbbbbbbbbbbb>();");
5664   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
5665                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
5666                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();");
5667 
5668   // Prefer not to break after empty parentheses.
5669   verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n"
5670                "    First->LastNewlineOffset);");
5671 
5672   // Prefer not to create "hanging" indents.
5673   verifyFormat(
5674       "return !soooooooooooooome_map\n"
5675       "            .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5676       "            .second;");
5677   verifyFormat(
5678       "return aaaaaaaaaaaaaaaa\n"
5679       "    .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n"
5680       "    .aaaa(aaaaaaaaaaaaaa);");
5681   // No hanging indent here.
5682   verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n"
5683                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5684   verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n"
5685                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5686   verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
5687                "    .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5688                getLLVMStyleWithColumns(60));
5689   verifyFormat("aaaaaaaaaaaaaaaaaa\n"
5690                "    .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
5691                "    .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5692                getLLVMStyleWithColumns(59));
5693   verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5694                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5695                "    .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5696 
5697   // Dont break if only closing statements before member call
5698   verifyFormat("test() {\n"
5699                "  ([]() -> {\n"
5700                "    int b = 32;\n"
5701                "    return 3;\n"
5702                "  }).foo();\n"
5703                "}");
5704   verifyFormat("test() {\n"
5705                "  (\n"
5706                "      []() -> {\n"
5707                "        int b = 32;\n"
5708                "        return 3;\n"
5709                "      },\n"
5710                "      foo, bar)\n"
5711                "      .foo();\n"
5712                "}");
5713   verifyFormat("test() {\n"
5714                "  ([]() -> {\n"
5715                "    int b = 32;\n"
5716                "    return 3;\n"
5717                "  })\n"
5718                "      .foo()\n"
5719                "      .bar();\n"
5720                "}");
5721   verifyFormat("test() {\n"
5722                "  ([]() -> {\n"
5723                "    int b = 32;\n"
5724                "    return 3;\n"
5725                "  })\n"
5726                "      .foo(\"aaaaaaaaaaaaaaaaa\"\n"
5727                "           \"bbbb\");\n"
5728                "}",
5729                getLLVMStyleWithColumns(30));
5730 }
5731 
5732 TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
5733   verifyFormat(
5734       "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
5735       "    bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
5736   verifyFormat(
5737       "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n"
5738       "    bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}");
5739 
5740   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
5741                "    ccccccccccccccccccccccccc) {\n}");
5742   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n"
5743                "    ccccccccccccccccccccccccc) {\n}");
5744 
5745   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
5746                "    ccccccccccccccccccccccccc) {\n}");
5747   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n"
5748                "    ccccccccccccccccccccccccc) {\n}");
5749 
5750   verifyFormat(
5751       "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
5752       "    ccccccccccccccccccccccccc) {\n}");
5753   verifyFormat(
5754       "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n"
5755       "    ccccccccccccccccccccccccc) {\n}");
5756 
5757   verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
5758                "       bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
5759                "       cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
5760                "       dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
5761   verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n"
5762                "       bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n"
5763                "       cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n"
5764                "       dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
5765 
5766   verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
5767                "     aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
5768                "    aaaaaaaaaaaaaaa != aa) {\n}");
5769   verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n"
5770                "     aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n"
5771                "    aaaaaaaaaaaaaaa != aa) {\n}");
5772 }
5773 
5774 TEST_F(FormatTest, BreaksAfterAssignments) {
5775   verifyFormat(
5776       "unsigned Cost =\n"
5777       "    TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
5778       "                        SI->getPointerAddressSpaceee());\n");
5779   verifyFormat(
5780       "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
5781       "    Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
5782 
5783   verifyFormat(
5784       "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n"
5785       "    aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
5786   verifyFormat("unsigned OriginalStartColumn =\n"
5787                "    SourceMgr.getSpellingColumnNumber(\n"
5788                "        Current.FormatTok.getStartOfNonWhitespace()) -\n"
5789                "    1;");
5790 }
5791 
5792 TEST_F(FormatTest, ConfigurableBreakAssignmentPenalty) {
5793   FormatStyle Style = getLLVMStyle();
5794   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5795                "    bbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccccccccccccc;",
5796                Style);
5797 
5798   Style.PenaltyBreakAssignment = 20;
5799   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
5800                "                                 cccccccccccccccccccccccccc;",
5801                Style);
5802 }
5803 
5804 TEST_F(FormatTest, AlignsAfterAssignments) {
5805   verifyFormat(
5806       "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5807       "             aaaaaaaaaaaaaaaaaaaaaaaaa;");
5808   verifyFormat(
5809       "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5810       "          aaaaaaaaaaaaaaaaaaaaaaaaa;");
5811   verifyFormat(
5812       "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5813       "           aaaaaaaaaaaaaaaaaaaaaaaaa;");
5814   verifyFormat(
5815       "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5816       "              aaaaaaaaaaaaaaaaaaaaaaaaa);");
5817   verifyFormat(
5818       "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n"
5819       "                                            aaaaaaaaaaaaaaaaaaaaaaaa +\n"
5820       "                                            aaaaaaaaaaaaaaaaaaaaaaaa;");
5821 }
5822 
5823 TEST_F(FormatTest, AlignsAfterReturn) {
5824   verifyFormat(
5825       "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5826       "       aaaaaaaaaaaaaaaaaaaaaaaaa;");
5827   verifyFormat(
5828       "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5829       "        aaaaaaaaaaaaaaaaaaaaaaaaa);");
5830   verifyFormat(
5831       "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
5832       "       aaaaaaaaaaaaaaaaaaaaaa();");
5833   verifyFormat(
5834       "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
5835       "        aaaaaaaaaaaaaaaaaaaaaa());");
5836   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5837                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5838   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5839                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
5840                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5841   verifyFormat("return\n"
5842                "    // true if code is one of a or b.\n"
5843                "    code == a || code == b;");
5844 }
5845 
5846 TEST_F(FormatTest, AlignsAfterOpenBracket) {
5847   verifyFormat(
5848       "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
5849       "                                                aaaaaaaaa aaaaaaa) {}");
5850   verifyFormat(
5851       "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
5852       "                                               aaaaaaaaaaa aaaaaaaaa);");
5853   verifyFormat(
5854       "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
5855       "                                             aaaaaaaaaaaaaaaaaaaaa));");
5856   FormatStyle Style = getLLVMStyle();
5857   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5858   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5859                "    aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",
5860                Style);
5861   verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
5862                "    aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);",
5863                Style);
5864   verifyFormat("SomeLongVariableName->someFunction(\n"
5865                "    foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));",
5866                Style);
5867   verifyFormat(
5868       "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
5869       "    aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
5870       Style);
5871   verifyFormat(
5872       "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
5873       "    aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5874       Style);
5875   verifyFormat(
5876       "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
5877       "    aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
5878       Style);
5879 
5880   verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n"
5881                "    ccccccc(aaaaaaaaaaaaaaaaa,         //\n"
5882                "        b));",
5883                Style);
5884 
5885   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5886   Style.BinPackArguments = false;
5887   Style.BinPackParameters = false;
5888   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5889                "    aaaaaaaaaaa aaaaaaaa,\n"
5890                "    aaaaaaaaa aaaaaaa,\n"
5891                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
5892                Style);
5893   verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
5894                "    aaaaaaaaaaa aaaaaaaaa,\n"
5895                "    aaaaaaaaaaa aaaaaaaaa,\n"
5896                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5897                Style);
5898   verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n"
5899                "    aaaaaaaaaaaaaaa,\n"
5900                "    aaaaaaaaaaaaaaaaaaaaa,\n"
5901                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
5902                Style);
5903   verifyFormat(
5904       "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n"
5905       "    aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
5906       Style);
5907   verifyFormat(
5908       "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n"
5909       "    aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
5910       Style);
5911   verifyFormat(
5912       "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
5913       "    aaaaaaaaaaaaaaaaaaaaa(\n"
5914       "        aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n"
5915       "    aaaaaaaaaaaaaaaa);",
5916       Style);
5917   verifyFormat(
5918       "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
5919       "    aaaaaaaaaaaaaaaaaaaaa(\n"
5920       "        aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
5921       "    aaaaaaaaaaaaaaaa);",
5922       Style);
5923 }
5924 
5925 TEST_F(FormatTest, ParenthesesAndOperandAlignment) {
5926   FormatStyle Style = getLLVMStyleWithColumns(40);
5927   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5928                "          bbbbbbbbbbbbbbbbbbbbbb);",
5929                Style);
5930   Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
5931   Style.AlignOperands = FormatStyle::OAS_DontAlign;
5932   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5933                "          bbbbbbbbbbbbbbbbbbbbbb);",
5934                Style);
5935   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5936   Style.AlignOperands = FormatStyle::OAS_Align;
5937   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5938                "          bbbbbbbbbbbbbbbbbbbbbb);",
5939                Style);
5940   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5941   Style.AlignOperands = FormatStyle::OAS_DontAlign;
5942   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5943                "    bbbbbbbbbbbbbbbbbbbbbb);",
5944                Style);
5945 }
5946 
5947 TEST_F(FormatTest, BreaksConditionalExpressions) {
5948   verifyFormat(
5949       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5950       "                               ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5951       "                               : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5952   verifyFormat(
5953       "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
5954       "     aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5955       "                                : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5956   verifyFormat(
5957       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5958       "                                   : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5959   verifyFormat("aaaa(aaaaaaaaa, aaaaaaaaa,\n"
5960                "     aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5961                "             : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5962   verifyFormat(
5963       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
5964       "                                                    : aaaaaaaaaaaaa);");
5965   verifyFormat(
5966       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5967       "                   aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5968       "                                    : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5969       "                   aaaaaaaaaaaaa);");
5970   verifyFormat(
5971       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5972       "                   aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5973       "                   aaaaaaaaaaaaa);");
5974   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5975                "    ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5976                "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5977                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5978                "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5979   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5980                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5981                "           ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5982                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5983                "           : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5984                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5985                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5986   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5987                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5988                "           ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5989                "                  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5990                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5991   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5992                "    ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5993                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5994   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
5995                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5996                "        ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5997                "        : aaaaaaaaaaaaaaaa;");
5998   verifyFormat(
5999       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6000       "    ? aaaaaaaaaaaaaaa\n"
6001       "    : aaaaaaaaaaaaaaa;");
6002   verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
6003                "          aaaaaaaaa\n"
6004                "      ? b\n"
6005                "      : c);");
6006   verifyFormat("return aaaa == bbbb\n"
6007                "           // comment\n"
6008                "           ? aaaa\n"
6009                "           : bbbb;");
6010   verifyFormat("unsigned Indent =\n"
6011                "    format(TheLine.First,\n"
6012                "           IndentForLevel[TheLine.Level] >= 0\n"
6013                "               ? IndentForLevel[TheLine.Level]\n"
6014                "               : TheLine * 2,\n"
6015                "           TheLine.InPPDirective, PreviousEndOfLineColumn);",
6016                getLLVMStyleWithColumns(60));
6017   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
6018                "                  ? aaaaaaaaaaaaaaa\n"
6019                "                  : bbbbbbbbbbbbbbb //\n"
6020                "                        ? ccccccccccccccc\n"
6021                "                        : ddddddddddddddd;");
6022   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
6023                "                  ? aaaaaaaaaaaaaaa\n"
6024                "                  : (bbbbbbbbbbbbbbb //\n"
6025                "                         ? ccccccccccccccc\n"
6026                "                         : ddddddddddddddd);");
6027   verifyFormat(
6028       "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6029       "                                      ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
6030       "                                            aaaaaaaaaaaaaaaaaaaaa +\n"
6031       "                                            aaaaaaaaaaaaaaaaaaaaa\n"
6032       "                                      : aaaaaaaaaa;");
6033   verifyFormat(
6034       "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6035       "                                   : aaaaaaaaaaaaaaaaaaaaaa\n"
6036       "                      : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
6037 
6038   FormatStyle NoBinPacking = getLLVMStyle();
6039   NoBinPacking.BinPackArguments = false;
6040   verifyFormat(
6041       "void f() {\n"
6042       "  g(aaa,\n"
6043       "    aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
6044       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6045       "        ? aaaaaaaaaaaaaaa\n"
6046       "        : aaaaaaaaaaaaaaa);\n"
6047       "}",
6048       NoBinPacking);
6049   verifyFormat(
6050       "void f() {\n"
6051       "  g(aaa,\n"
6052       "    aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
6053       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6054       "        ?: aaaaaaaaaaaaaaa);\n"
6055       "}",
6056       NoBinPacking);
6057 
6058   verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n"
6059                "             // comment.\n"
6060                "             ccccccccccccccccccccccccccccccccccccccc\n"
6061                "                 ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6062                "                 : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);");
6063 
6064   // Assignments in conditional expressions. Apparently not uncommon :-(.
6065   verifyFormat("return a != b\n"
6066                "           // comment\n"
6067                "           ? a = b\n"
6068                "           : a = b;");
6069   verifyFormat("return a != b\n"
6070                "           // comment\n"
6071                "           ? a = a != b\n"
6072                "                     // comment\n"
6073                "                     ? a = b\n"
6074                "                     : a\n"
6075                "           : a;\n");
6076   verifyFormat("return a != b\n"
6077                "           // comment\n"
6078                "           ? a\n"
6079                "           : a = a != b\n"
6080                "                     // comment\n"
6081                "                     ? a = b\n"
6082                "                     : a;");
6083 
6084   // Chained conditionals
6085   FormatStyle Style = getLLVMStyle();
6086   Style.ColumnLimit = 70;
6087   Style.AlignOperands = FormatStyle::OAS_Align;
6088   verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111\n"
6089                "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6090                "                        : 3333333333333333;",
6091                Style);
6092   verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111\n"
6093                "       : bbbbbbbbbb     ? 2222222222222222\n"
6094                "                        : 3333333333333333;",
6095                Style);
6096   verifyFormat("return aaaaaaaaaa         ? 1111111111111111\n"
6097                "       : bbbbbbbbbbbbbbbb ? 2222222222222222\n"
6098                "                          : 3333333333333333;",
6099                Style);
6100   verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111\n"
6101                "       : bbbbbbbbbbbbbb ? 222222\n"
6102                "                        : 333333;",
6103                Style);
6104   verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111\n"
6105                "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6106                "       : cccccccccccccc ? 3333333333333333\n"
6107                "                        : 4444444444444444;",
6108                Style);
6109   verifyFormat("return aaaaaaaaaaaaaaaa ? (aaa ? bbb : ccc)\n"
6110                "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6111                "                        : 3333333333333333;",
6112                Style);
6113   verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111\n"
6114                "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6115                "                        : (aaa ? bbb : ccc);",
6116                Style);
6117   verifyFormat(
6118       "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n"
6119       "                                             : cccccccccccccccccc)\n"
6120       "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6121       "                        : 3333333333333333;",
6122       Style);
6123   verifyFormat(
6124       "return aaaaaaaaa        ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n"
6125       "                                             : cccccccccccccccccc)\n"
6126       "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6127       "                        : 3333333333333333;",
6128       Style);
6129   verifyFormat(
6130       "return aaaaaaaaa        ? a = (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n"
6131       "                                             : dddddddddddddddddd)\n"
6132       "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6133       "                        : 3333333333333333;",
6134       Style);
6135   verifyFormat(
6136       "return aaaaaaaaa        ? a + (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n"
6137       "                                             : dddddddddddddddddd)\n"
6138       "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6139       "                        : 3333333333333333;",
6140       Style);
6141   verifyFormat(
6142       "return aaaaaaaaa        ? 1111111111111111\n"
6143       "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6144       "                        : a + (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n"
6145       "                                             : dddddddddddddddddd)\n",
6146       Style);
6147   verifyFormat(
6148       "return aaaaaaaaaaaaaaaa ? 1111111111111111\n"
6149       "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6150       "                        : (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n"
6151       "                                             : cccccccccccccccccc);",
6152       Style);
6153   verifyFormat(
6154       "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n"
6155       "                           : ccccccccccccccc ? dddddddddddddddddd\n"
6156       "                                             : eeeeeeeeeeeeeeeeee)\n"
6157       "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6158       "                        : 3333333333333333;",
6159       Style);
6160   verifyFormat(
6161       "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaa    ? bbbbbbbbbbbbbbbbbb\n"
6162       "                           : ccccccccccccccc ? dddddddddddddddddd\n"
6163       "                                             : eeeeeeeeeeeeeeeeee)\n"
6164       "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6165       "                        : 3333333333333333;",
6166       Style);
6167   verifyFormat(
6168       "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n"
6169       "                           : cccccccccccc    ? dddddddddddddddddd\n"
6170       "                                             : eeeeeeeeeeeeeeeeee)\n"
6171       "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6172       "                        : 3333333333333333;",
6173       Style);
6174   verifyFormat(
6175       "return aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n"
6176       "                                             : cccccccccccccccccc\n"
6177       "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6178       "                        : 3333333333333333;",
6179       Style);
6180   verifyFormat(
6181       "return aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n"
6182       "                          : cccccccccccccccc ? dddddddddddddddddd\n"
6183       "                                             : eeeeeeeeeeeeeeeeee\n"
6184       "       : bbbbbbbbbbbbbb ? 2222222222222222\n"
6185       "                        : 3333333333333333;",
6186       Style);
6187   verifyFormat("return aaaaaaaaaaaaaaaaaaaaa\n"
6188                "           ? (aaaaaaaaaaaaaaaaaa   ? bbbbbbbbbbbbbbbbbb\n"
6189                "              : cccccccccccccccccc ? dddddddddddddddddd\n"
6190                "                                   : eeeeeeeeeeeeeeeeee)\n"
6191                "       : bbbbbbbbbbbbbbbbbbb ? 2222222222222222\n"
6192                "                             : 3333333333333333;",
6193                Style);
6194   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaa\n"
6195                "           ? aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb\n"
6196                "             : cccccccccccccccc ? dddddddddddddddddd\n"
6197                "                                : eeeeeeeeeeeeeeeeee\n"
6198                "       : bbbbbbbbbbbbbbbbbbbbbbb ? 2222222222222222\n"
6199                "                                 : 3333333333333333;",
6200                Style);
6201 }
6202 
6203 TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {
6204   FormatStyle Style = getLLVMStyle();
6205   Style.BreakBeforeTernaryOperators = false;
6206   Style.ColumnLimit = 70;
6207   verifyFormat(
6208       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
6209       "                               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
6210       "                               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
6211       Style);
6212   verifyFormat(
6213       "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
6214       "     aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
6215       "                                  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
6216       Style);
6217   verifyFormat(
6218       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
6219       "                                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
6220       Style);
6221   verifyFormat("aaaa(aaaaaaaa, aaaaaaaaaa,\n"
6222                "     aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
6223                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
6224                Style);
6225   verifyFormat(
6226       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n"
6227       "                                                      aaaaaaaaaaaaa);",
6228       Style);
6229   verifyFormat(
6230       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6231       "                   aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
6232       "                                      aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6233       "                   aaaaaaaaaaaaa);",
6234       Style);
6235   verifyFormat(
6236       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6237       "                   aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6238       "                   aaaaaaaaaaaaa);",
6239       Style);
6240   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
6241                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6242                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
6243                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6244                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
6245                Style);
6246   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6247                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
6248                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6249                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
6250                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6251                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
6252                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
6253                Style);
6254   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6255                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n"
6256                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6257                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
6258                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
6259                Style);
6260   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
6261                "    aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
6262                "    aaaaaaaaaaaaaaaaaaaaaaaaaaa;",
6263                Style);
6264   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
6265                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
6266                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
6267                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
6268                Style);
6269   verifyFormat(
6270       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
6271       "    aaaaaaaaaaaaaaa :\n"
6272       "    aaaaaaaaaaaaaaa;",
6273       Style);
6274   verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
6275                "          aaaaaaaaa ?\n"
6276                "      b :\n"
6277                "      c);",
6278                Style);
6279   verifyFormat("unsigned Indent =\n"
6280                "    format(TheLine.First,\n"
6281                "           IndentForLevel[TheLine.Level] >= 0 ?\n"
6282                "               IndentForLevel[TheLine.Level] :\n"
6283                "               TheLine * 2,\n"
6284                "           TheLine.InPPDirective, PreviousEndOfLineColumn);",
6285                Style);
6286   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
6287                "                  aaaaaaaaaaaaaaa :\n"
6288                "                  bbbbbbbbbbbbbbb ? //\n"
6289                "                      ccccccccccccccc :\n"
6290                "                      ddddddddddddddd;",
6291                Style);
6292   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
6293                "                  aaaaaaaaaaaaaaa :\n"
6294                "                  (bbbbbbbbbbbbbbb ? //\n"
6295                "                       ccccccccccccccc :\n"
6296                "                       ddddddddddddddd);",
6297                Style);
6298   verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
6299                "            /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n"
6300                "            ccccccccccccccccccccccccccc;",
6301                Style);
6302   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
6303                "           aaaaa :\n"
6304                "           bbbbbbbbbbbbbbb + cccccccccccccccc;",
6305                Style);
6306 
6307   // Chained conditionals
6308   verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111 :\n"
6309                "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6310                "                          3333333333333333;",
6311                Style);
6312   verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111 :\n"
6313                "       bbbbbbbbbb       ? 2222222222222222 :\n"
6314                "                          3333333333333333;",
6315                Style);
6316   verifyFormat("return aaaaaaaaaa       ? 1111111111111111 :\n"
6317                "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6318                "                          3333333333333333;",
6319                Style);
6320   verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111 :\n"
6321                "       bbbbbbbbbbbbbbbb ? 222222 :\n"
6322                "                          333333;",
6323                Style);
6324   verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111 :\n"
6325                "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6326                "       cccccccccccccccc ? 3333333333333333 :\n"
6327                "                          4444444444444444;",
6328                Style);
6329   verifyFormat("return aaaaaaaaaaaaaaaa ? (aaa ? bbb : ccc) :\n"
6330                "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6331                "                          3333333333333333;",
6332                Style);
6333   verifyFormat("return aaaaaaaaaaaaaaaa ? 1111111111111111 :\n"
6334                "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6335                "                          (aaa ? bbb : ccc);",
6336                Style);
6337   verifyFormat(
6338       "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n"
6339       "                                               cccccccccccccccccc) :\n"
6340       "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6341       "                          3333333333333333;",
6342       Style);
6343   verifyFormat(
6344       "return aaaaaaaaa        ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n"
6345       "                                               cccccccccccccccccc) :\n"
6346       "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6347       "                          3333333333333333;",
6348       Style);
6349   verifyFormat(
6350       "return aaaaaaaaa        ? a = (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n"
6351       "                                               dddddddddddddddddd) :\n"
6352       "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6353       "                          3333333333333333;",
6354       Style);
6355   verifyFormat(
6356       "return aaaaaaaaa        ? a + (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n"
6357       "                                               dddddddddddddddddd) :\n"
6358       "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6359       "                          3333333333333333;",
6360       Style);
6361   verifyFormat(
6362       "return aaaaaaaaa        ? 1111111111111111 :\n"
6363       "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6364       "                          a + (aaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n"
6365       "                                               dddddddddddddddddd)\n",
6366       Style);
6367   verifyFormat(
6368       "return aaaaaaaaaaaaaaaa ? 1111111111111111 :\n"
6369       "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6370       "                          (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n"
6371       "                                               cccccccccccccccccc);",
6372       Style);
6373   verifyFormat(
6374       "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n"
6375       "                           ccccccccccccccccc ? dddddddddddddddddd :\n"
6376       "                                               eeeeeeeeeeeeeeeeee) :\n"
6377       "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6378       "                          3333333333333333;",
6379       Style);
6380   verifyFormat(
6381       "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n"
6382       "                           ccccccccccccc     ? dddddddddddddddddd :\n"
6383       "                                               eeeeeeeeeeeeeeeeee) :\n"
6384       "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6385       "                          3333333333333333;",
6386       Style);
6387   verifyFormat(
6388       "return aaaaaaaaaaaaaaaa ? (aaaaaaaaaaaaa     ? bbbbbbbbbbbbbbbbbb :\n"
6389       "                           ccccccccccccccccc ? dddddddddddddddddd :\n"
6390       "                                               eeeeeeeeeeeeeeeeee) :\n"
6391       "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6392       "                          3333333333333333;",
6393       Style);
6394   verifyFormat(
6395       "return aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n"
6396       "                                               cccccccccccccccccc :\n"
6397       "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6398       "                          3333333333333333;",
6399       Style);
6400   verifyFormat(
6401       "return aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n"
6402       "                          cccccccccccccccccc ? dddddddddddddddddd :\n"
6403       "                                               eeeeeeeeeeeeeeeeee :\n"
6404       "       bbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6405       "                          3333333333333333;",
6406       Style);
6407   verifyFormat("return aaaaaaaaaaaaaaaaaaaaa ?\n"
6408                "           (aaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n"
6409                "            cccccccccccccccccc ? dddddddddddddddddd :\n"
6410                "                                 eeeeeeeeeeeeeeeeee) :\n"
6411                "       bbbbbbbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6412                "                               3333333333333333;",
6413                Style);
6414   verifyFormat("return aaaaaaaaaaaaaaaaaaaaa ?\n"
6415                "           aaaaaaaaaaaaaaaaaaaa ? bbbbbbbbbbbbbbbbbb :\n"
6416                "           cccccccccccccccccccc ? dddddddddddddddddd :\n"
6417                "                                  eeeeeeeeeeeeeeeeee :\n"
6418                "       bbbbbbbbbbbbbbbbbbbbb ? 2222222222222222 :\n"
6419                "                               3333333333333333;",
6420                Style);
6421 }
6422 
6423 TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
6424   verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
6425                "     aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
6426   verifyFormat("bool a = true, b = false;");
6427 
6428   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6429                "         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
6430                "     bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
6431                "         bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
6432   verifyFormat(
6433       "bool aaaaaaaaaaaaaaaaaaaaa =\n"
6434       "         bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
6435       "     d = e && f;");
6436   verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
6437                "          c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
6438   verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
6439                "          *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
6440   verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
6441                "          ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
6442 
6443   FormatStyle Style = getGoogleStyle();
6444   Style.PointerAlignment = FormatStyle::PAS_Left;
6445   Style.DerivePointerAlignment = false;
6446   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6447                "    *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
6448                "    *b = bbbbbbbbbbbbbbbbbbb;",
6449                Style);
6450   verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
6451                "          *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;",
6452                Style);
6453   verifyFormat("vector<int*> a, b;", Style);
6454   verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style);
6455 }
6456 
6457 TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
6458   verifyFormat("arr[foo ? bar : baz];");
6459   verifyFormat("f()[foo ? bar : baz];");
6460   verifyFormat("(a + b)[foo ? bar : baz];");
6461   verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
6462 }
6463 
6464 TEST_F(FormatTest, AlignsStringLiterals) {
6465   verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
6466                "                                      \"short literal\");");
6467   verifyFormat(
6468       "looooooooooooooooooooooooongFunction(\n"
6469       "    \"short literal\"\n"
6470       "    \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
6471   verifyFormat("someFunction(\"Always break between multi-line\"\n"
6472                "             \" string literals\",\n"
6473                "             and, other, parameters);");
6474   EXPECT_EQ("fun + \"1243\" /* comment */\n"
6475             "      \"5678\";",
6476             format("fun + \"1243\" /* comment */\n"
6477                    "    \"5678\";",
6478                    getLLVMStyleWithColumns(28)));
6479   EXPECT_EQ(
6480       "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
6481       "         \"aaaaaaaaaaaaaaaaaaaaa\"\n"
6482       "         \"aaaaaaaaaaaaaaaa\";",
6483       format("aaaaaa ="
6484              "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
6485              "aaaaaaaaaaaaaaaaaaaaa\" "
6486              "\"aaaaaaaaaaaaaaaa\";"));
6487   verifyFormat("a = a + \"a\"\n"
6488                "        \"a\"\n"
6489                "        \"a\";");
6490   verifyFormat("f(\"a\", \"b\"\n"
6491                "       \"c\");");
6492 
6493   verifyFormat(
6494       "#define LL_FORMAT \"ll\"\n"
6495       "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
6496       "       \"d, ddddddddd: %\" LL_FORMAT \"d\");");
6497 
6498   verifyFormat("#define A(X)          \\\n"
6499                "  \"aaaaa\" #X \"bbbbbb\" \\\n"
6500                "  \"ccccc\"",
6501                getLLVMStyleWithColumns(23));
6502   verifyFormat("#define A \"def\"\n"
6503                "f(\"abc\" A \"ghi\"\n"
6504                "  \"jkl\");");
6505 
6506   verifyFormat("f(L\"a\"\n"
6507                "  L\"b\");");
6508   verifyFormat("#define A(X)            \\\n"
6509                "  L\"aaaaa\" #X L\"bbbbbb\" \\\n"
6510                "  L\"ccccc\"",
6511                getLLVMStyleWithColumns(25));
6512 
6513   verifyFormat("f(@\"a\"\n"
6514                "  @\"b\");");
6515   verifyFormat("NSString s = @\"a\"\n"
6516                "             @\"b\"\n"
6517                "             @\"c\";");
6518   verifyFormat("NSString s = @\"a\"\n"
6519                "              \"b\"\n"
6520                "              \"c\";");
6521 }
6522 
6523 TEST_F(FormatTest, ReturnTypeBreakingStyle) {
6524   FormatStyle Style = getLLVMStyle();
6525   // No declarations or definitions should be moved to own line.
6526   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;
6527   verifyFormat("class A {\n"
6528                "  int f() { return 1; }\n"
6529                "  int g();\n"
6530                "};\n"
6531                "int f() { return 1; }\n"
6532                "int g();\n",
6533                Style);
6534 
6535   // All declarations and definitions should have the return type moved to its
6536   // own
6537   // line.
6538   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
6539   verifyFormat("class E {\n"
6540                "  int\n"
6541                "  f() {\n"
6542                "    return 1;\n"
6543                "  }\n"
6544                "  int\n"
6545                "  g();\n"
6546                "};\n"
6547                "int\n"
6548                "f() {\n"
6549                "  return 1;\n"
6550                "}\n"
6551                "int\n"
6552                "g();\n",
6553                Style);
6554 
6555   // Top-level definitions, and no kinds of declarations should have the
6556   // return type moved to its own line.
6557   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions;
6558   verifyFormat("class B {\n"
6559                "  int f() { return 1; }\n"
6560                "  int g();\n"
6561                "};\n"
6562                "int\n"
6563                "f() {\n"
6564                "  return 1;\n"
6565                "}\n"
6566                "int g();\n",
6567                Style);
6568 
6569   // Top-level definitions and declarations should have the return type moved
6570   // to its own line.
6571   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;
6572   verifyFormat("class C {\n"
6573                "  int f() { return 1; }\n"
6574                "  int g();\n"
6575                "};\n"
6576                "int\n"
6577                "f() {\n"
6578                "  return 1;\n"
6579                "}\n"
6580                "int\n"
6581                "g();\n",
6582                Style);
6583 
6584   // All definitions should have the return type moved to its own line, but no
6585   // kinds of declarations.
6586   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
6587   verifyFormat("class D {\n"
6588                "  int\n"
6589                "  f() {\n"
6590                "    return 1;\n"
6591                "  }\n"
6592                "  int g();\n"
6593                "};\n"
6594                "int\n"
6595                "f() {\n"
6596                "  return 1;\n"
6597                "}\n"
6598                "int g();\n",
6599                Style);
6600   verifyFormat("const char *\n"
6601                "f(void) {\n" // Break here.
6602                "  return \"\";\n"
6603                "}\n"
6604                "const char *bar(void);\n", // No break here.
6605                Style);
6606   verifyFormat("template <class T>\n"
6607                "T *\n"
6608                "f(T &c) {\n" // Break here.
6609                "  return NULL;\n"
6610                "}\n"
6611                "template <class T> T *f(T &c);\n", // No break here.
6612                Style);
6613   verifyFormat("class C {\n"
6614                "  int\n"
6615                "  operator+() {\n"
6616                "    return 1;\n"
6617                "  }\n"
6618                "  int\n"
6619                "  operator()() {\n"
6620                "    return 1;\n"
6621                "  }\n"
6622                "};\n",
6623                Style);
6624   verifyFormat("void\n"
6625                "A::operator()() {}\n"
6626                "void\n"
6627                "A::operator>>() {}\n"
6628                "void\n"
6629                "A::operator+() {}\n"
6630                "void\n"
6631                "A::operator*() {}\n"
6632                "void\n"
6633                "A::operator->() {}\n"
6634                "void\n"
6635                "A::operator void *() {}\n"
6636                "void\n"
6637                "A::operator void &() {}\n"
6638                "void\n"
6639                "A::operator void &&() {}\n"
6640                "void\n"
6641                "A::operator char *() {}\n"
6642                "void\n"
6643                "A::operator[]() {}\n"
6644                "void\n"
6645                "A::operator!() {}\n"
6646                "void\n"
6647                "A::operator**() {}\n"
6648                "void\n"
6649                "A::operator<Foo> *() {}\n"
6650                "void\n"
6651                "A::operator<Foo> **() {}\n"
6652                "void\n"
6653                "A::operator<Foo> &() {}\n"
6654                "void\n"
6655                "A::operator void **() {}\n",
6656                Style);
6657   verifyFormat("constexpr auto\n"
6658                "operator()() const -> reference {}\n"
6659                "constexpr auto\n"
6660                "operator>>() const -> reference {}\n"
6661                "constexpr auto\n"
6662                "operator+() const -> reference {}\n"
6663                "constexpr auto\n"
6664                "operator*() const -> reference {}\n"
6665                "constexpr auto\n"
6666                "operator->() const -> reference {}\n"
6667                "constexpr auto\n"
6668                "operator++() const -> reference {}\n"
6669                "constexpr auto\n"
6670                "operator void *() const -> reference {}\n"
6671                "constexpr auto\n"
6672                "operator void **() const -> reference {}\n"
6673                "constexpr auto\n"
6674                "operator void *() const -> reference {}\n"
6675                "constexpr auto\n"
6676                "operator void &() const -> reference {}\n"
6677                "constexpr auto\n"
6678                "operator void &&() const -> reference {}\n"
6679                "constexpr auto\n"
6680                "operator char *() const -> reference {}\n"
6681                "constexpr auto\n"
6682                "operator!() const -> reference {}\n"
6683                "constexpr auto\n"
6684                "operator[]() const -> reference {}\n",
6685                Style);
6686   verifyFormat("void *operator new(std::size_t s);", // No break here.
6687                Style);
6688   verifyFormat("void *\n"
6689                "operator new(std::size_t s) {}",
6690                Style);
6691   verifyFormat("void *\n"
6692                "operator delete[](void *ptr) {}",
6693                Style);
6694   Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
6695   verifyFormat("const char *\n"
6696                "f(void)\n" // Break here.
6697                "{\n"
6698                "  return \"\";\n"
6699                "}\n"
6700                "const char *bar(void);\n", // No break here.
6701                Style);
6702   verifyFormat("template <class T>\n"
6703                "T *\n"     // Problem here: no line break
6704                "f(T &c)\n" // Break here.
6705                "{\n"
6706                "  return NULL;\n"
6707                "}\n"
6708                "template <class T> T *f(T &c);\n", // No break here.
6709                Style);
6710   verifyFormat("int\n"
6711                "foo(A<bool> a)\n"
6712                "{\n"
6713                "  return a;\n"
6714                "}\n",
6715                Style);
6716   verifyFormat("int\n"
6717                "foo(A<8> a)\n"
6718                "{\n"
6719                "  return a;\n"
6720                "}\n",
6721                Style);
6722   verifyFormat("int\n"
6723                "foo(A<B<bool>, 8> a)\n"
6724                "{\n"
6725                "  return a;\n"
6726                "}\n",
6727                Style);
6728   verifyFormat("int\n"
6729                "foo(A<B<8>, bool> a)\n"
6730                "{\n"
6731                "  return a;\n"
6732                "}\n",
6733                Style);
6734   verifyFormat("int\n"
6735                "foo(A<B<bool>, bool> a)\n"
6736                "{\n"
6737                "  return a;\n"
6738                "}\n",
6739                Style);
6740   verifyFormat("int\n"
6741                "foo(A<B<8>, 8> a)\n"
6742                "{\n"
6743                "  return a;\n"
6744                "}\n",
6745                Style);
6746 
6747   Style = getGNUStyle();
6748 
6749   // Test for comments at the end of function declarations.
6750   verifyFormat("void\n"
6751                "foo (int a, /*abc*/ int b) // def\n"
6752                "{\n"
6753                "}\n",
6754                Style);
6755 
6756   verifyFormat("void\n"
6757                "foo (int a, /* abc */ int b) /* def */\n"
6758                "{\n"
6759                "}\n",
6760                Style);
6761 
6762   // Definitions that should not break after return type
6763   verifyFormat("void foo (int a, int b); // def\n", Style);
6764   verifyFormat("void foo (int a, int b); /* def */\n", Style);
6765   verifyFormat("void foo (int a, int b);\n", Style);
6766 }
6767 
6768 TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
6769   FormatStyle NoBreak = getLLVMStyle();
6770   NoBreak.AlwaysBreakBeforeMultilineStrings = false;
6771   FormatStyle Break = getLLVMStyle();
6772   Break.AlwaysBreakBeforeMultilineStrings = true;
6773   verifyFormat("aaaa = \"bbbb\"\n"
6774                "       \"cccc\";",
6775                NoBreak);
6776   verifyFormat("aaaa =\n"
6777                "    \"bbbb\"\n"
6778                "    \"cccc\";",
6779                Break);
6780   verifyFormat("aaaa(\"bbbb\"\n"
6781                "     \"cccc\");",
6782                NoBreak);
6783   verifyFormat("aaaa(\n"
6784                "    \"bbbb\"\n"
6785                "    \"cccc\");",
6786                Break);
6787   verifyFormat("aaaa(qqq, \"bbbb\"\n"
6788                "          \"cccc\");",
6789                NoBreak);
6790   verifyFormat("aaaa(qqq,\n"
6791                "     \"bbbb\"\n"
6792                "     \"cccc\");",
6793                Break);
6794   verifyFormat("aaaa(qqq,\n"
6795                "     L\"bbbb\"\n"
6796                "     L\"cccc\");",
6797                Break);
6798   verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n"
6799                "                      \"bbbb\"));",
6800                Break);
6801   verifyFormat("string s = someFunction(\n"
6802                "    \"abc\"\n"
6803                "    \"abc\");",
6804                Break);
6805 
6806   // As we break before unary operators, breaking right after them is bad.
6807   verifyFormat("string foo = abc ? \"x\"\n"
6808                "                   \"blah blah blah blah blah blah\"\n"
6809                "                 : \"y\";",
6810                Break);
6811 
6812   // Don't break if there is no column gain.
6813   verifyFormat("f(\"aaaa\"\n"
6814                "  \"bbbb\");",
6815                Break);
6816 
6817   // Treat literals with escaped newlines like multi-line string literals.
6818   EXPECT_EQ("x = \"a\\\n"
6819             "b\\\n"
6820             "c\";",
6821             format("x = \"a\\\n"
6822                    "b\\\n"
6823                    "c\";",
6824                    NoBreak));
6825   EXPECT_EQ("xxxx =\n"
6826             "    \"a\\\n"
6827             "b\\\n"
6828             "c\";",
6829             format("xxxx = \"a\\\n"
6830                    "b\\\n"
6831                    "c\";",
6832                    Break));
6833 
6834   EXPECT_EQ("NSString *const kString =\n"
6835             "    @\"aaaa\"\n"
6836             "    @\"bbbb\";",
6837             format("NSString *const kString = @\"aaaa\"\n"
6838                    "@\"bbbb\";",
6839                    Break));
6840 
6841   Break.ColumnLimit = 0;
6842   verifyFormat("const char *hello = \"hello llvm\";", Break);
6843 }
6844 
6845 TEST_F(FormatTest, AlignsPipes) {
6846   verifyFormat(
6847       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6848       "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6849       "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
6850   verifyFormat(
6851       "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
6852       "                     << aaaaaaaaaaaaaaaaaaaa;");
6853   verifyFormat(
6854       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6855       "                                 << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
6856   verifyFormat(
6857       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
6858       "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
6859   verifyFormat(
6860       "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
6861       "                \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
6862       "             << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
6863   verifyFormat(
6864       "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6865       "                                 << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6866       "         << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
6867   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6868                "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6869                "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6870                "             << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
6871   verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n"
6872                "             << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);");
6873   verifyFormat(
6874       "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6875       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6876   verifyFormat(
6877       "auto Diag = diag() << aaaaaaaaaaaaaaaa(aaaaaaaaaaaa, aaaaaaaaaaaaa,\n"
6878       "                                       aaaaaaaaaaaaaaaaaaaaaaaaaa);");
6879 
6880   verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n"
6881                "             << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();");
6882   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6883                "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6884                "                    aaaaaaaaaaaaaaaaaaaaa)\n"
6885                "             << aaaaaaaaaaaaaaaaaaaaaaaaaa;");
6886   verifyFormat("LOG_IF(aaa == //\n"
6887                "       bbb)\n"
6888                "    << a << b;");
6889 
6890   // But sometimes, breaking before the first "<<" is desirable.
6891   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
6892                "    << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);");
6893   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n"
6894                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6895                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
6896   verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n"
6897                "    << BEF << IsTemplate << Description << E->getType();");
6898   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
6899                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6900                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6901   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
6902                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6903                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6904                "    << aaa;");
6905 
6906   verifyFormat(
6907       "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6908       "                    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
6909 
6910   // Incomplete string literal.
6911   EXPECT_EQ("llvm::errs() << \"\n"
6912             "             << a;",
6913             format("llvm::errs() << \"\n<<a;"));
6914 
6915   verifyFormat("void f() {\n"
6916                "  CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n"
6917                "      << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n"
6918                "}");
6919 
6920   // Handle 'endl'.
6921   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n"
6922                "             << bbbbbbbbbbbbbbbbbbbbbb << endl;");
6923   verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;");
6924 
6925   // Handle '\n'.
6926   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n"
6927                "             << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
6928   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n"
6929                "             << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';");
6930   verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n"
6931                "             << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";");
6932   verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
6933 }
6934 
6935 TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) {
6936   verifyFormat("return out << \"somepacket = {\\n\"\n"
6937                "           << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
6938                "           << \" bbbb = \" << pkt.bbbb << \"\\n\"\n"
6939                "           << \" cccccc = \" << pkt.cccccc << \"\\n\"\n"
6940                "           << \" ddd = [\" << pkt.ddd << \"]\\n\"\n"
6941                "           << \"}\";");
6942 
6943   verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
6944                "             << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
6945                "             << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;");
6946   verifyFormat(
6947       "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
6948       "             << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
6949       "             << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
6950       "             << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
6951       "             << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
6952   verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
6953                "             << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
6954   verifyFormat(
6955       "void f() {\n"
6956       "  llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n"
6957       "               << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
6958       "}");
6959 
6960   // Breaking before the first "<<" is generally not desirable.
6961   verifyFormat(
6962       "llvm::errs()\n"
6963       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6964       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6965       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6966       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
6967       getLLVMStyleWithColumns(70));
6968   verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n"
6969                "             << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6970                "             << \"aaaaaaaaaaaaaaaaaaa: \"\n"
6971                "             << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6972                "             << \"aaaaaaaaaaaaaaaaaaa: \"\n"
6973                "             << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
6974                getLLVMStyleWithColumns(70));
6975 
6976   verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
6977                "           \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
6978                "           \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;");
6979   verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
6980                "                  \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
6981                "                  \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);");
6982   verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n"
6983                "           (aaaa + aaaa);",
6984                getLLVMStyleWithColumns(40));
6985   verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n"
6986                "                  (aaaaaaa + aaaaa));",
6987                getLLVMStyleWithColumns(40));
6988   verifyFormat(
6989       "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n"
6990       "                  SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n"
6991       "                  bbbbbbbbbbbbbbbbbbbbbbb);");
6992 }
6993 
6994 TEST_F(FormatTest, UnderstandsEquals) {
6995   verifyFormat(
6996       "aaaaaaaaaaaaaaaaa =\n"
6997       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
6998   verifyFormat(
6999       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7000       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
7001   verifyFormat(
7002       "if (a) {\n"
7003       "  f();\n"
7004       "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7005       "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
7006       "}");
7007 
7008   verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7009                "        100000000 + 10000000) {\n}");
7010 }
7011 
7012 TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
7013   verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
7014                "    .looooooooooooooooooooooooooooooooooooooongFunction();");
7015 
7016   verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
7017                "    ->looooooooooooooooooooooooooooooooooooooongFunction();");
7018 
7019   verifyFormat(
7020       "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
7021       "                                                          Parameter2);");
7022 
7023   verifyFormat(
7024       "ShortObject->shortFunction(\n"
7025       "    LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
7026       "    LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
7027 
7028   verifyFormat("loooooooooooooongFunction(\n"
7029                "    LoooooooooooooongObject->looooooooooooooooongFunction());");
7030 
7031   verifyFormat(
7032       "function(LoooooooooooooooooooooooooooooooooooongObject\n"
7033       "             ->loooooooooooooooooooooooooooooooooooooooongFunction());");
7034 
7035   verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
7036                "    .WillRepeatedly(Return(SomeValue));");
7037   verifyFormat("void f() {\n"
7038                "  EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
7039                "      .Times(2)\n"
7040                "      .WillRepeatedly(Return(SomeValue));\n"
7041                "}");
7042   verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n"
7043                "    ccccccccccccccccccccccc);");
7044   verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7045                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
7046                "          .aaaaa(aaaaa),\n"
7047                "      aaaaaaaaaaaaaaaaaaaaa);");
7048   verifyFormat("void f() {\n"
7049                "  aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7050                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n"
7051                "}");
7052   verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7053                "      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
7054                "    .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7055                "                        aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7056                "                        aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
7057   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7058                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7059                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7060                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
7061                "}");
7062 
7063   // Here, it is not necessary to wrap at "." or "->".
7064   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
7065                "    aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
7066   verifyFormat(
7067       "aaaaaaaaaaa->aaaaaaaaa(\n"
7068       "    aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7069       "    aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
7070 
7071   verifyFormat(
7072       "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7073       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
7074   verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
7075                "                         aaaaaaaaa()->aaaaaa()->aaaaa());");
7076   verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
7077                "                         aaaaaaaaa()->aaaaaa()->aaaaa());");
7078 
7079   verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7080                "      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
7081                "    .a();");
7082 
7083   FormatStyle NoBinPacking = getLLVMStyle();
7084   NoBinPacking.BinPackParameters = false;
7085   verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
7086                "    .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
7087                "    .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
7088                "                         aaaaaaaaaaaaaaaaaaa,\n"
7089                "                         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
7090                NoBinPacking);
7091 
7092   // If there is a subsequent call, change to hanging indentation.
7093   verifyFormat(
7094       "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7095       "                         aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n"
7096       "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
7097   verifyFormat(
7098       "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7099       "    aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));");
7100   verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7101                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
7102                "                 .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
7103   verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7104                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
7105                "               .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
7106 }
7107 
7108 TEST_F(FormatTest, WrapsTemplateDeclarations) {
7109   verifyFormat("template <typename T>\n"
7110                "virtual void loooooooooooongFunction(int Param1, int Param2);");
7111   verifyFormat("template <typename T>\n"
7112                "// T should be one of {A, B}.\n"
7113                "virtual void loooooooooooongFunction(int Param1, int Param2);");
7114   verifyFormat(
7115       "template <typename T>\n"
7116       "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
7117   verifyFormat("template <typename T>\n"
7118                "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
7119                "       int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
7120   verifyFormat(
7121       "template <typename T>\n"
7122       "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
7123       "                                      int Paaaaaaaaaaaaaaaaaaaaram2);");
7124   verifyFormat(
7125       "template <typename T>\n"
7126       "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
7127       "                    aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
7128       "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
7129   verifyFormat("template <typename T>\n"
7130                "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7131                "    int aaaaaaaaaaaaaaaaaaaaaa);");
7132   verifyFormat(
7133       "template <typename T1, typename T2 = char, typename T3 = char,\n"
7134       "          typename T4 = char>\n"
7135       "void f();");
7136   verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n"
7137                "          template <typename> class cccccccccccccccccccccc,\n"
7138                "          typename ddddddddddddd>\n"
7139                "class C {};");
7140   verifyFormat(
7141       "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
7142       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
7143 
7144   verifyFormat("void f() {\n"
7145                "  a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
7146                "      a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n"
7147                "}");
7148 
7149   verifyFormat("template <typename T> class C {};");
7150   verifyFormat("template <typename T> void f();");
7151   verifyFormat("template <typename T> void f() {}");
7152   verifyFormat(
7153       "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
7154       "              aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7155       "              aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n"
7156       "    new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
7157       "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7158       "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
7159       "        bbbbbbbbbbbbbbbbbbbbbbbb);",
7160       getLLVMStyleWithColumns(72));
7161   EXPECT_EQ("static_cast<A< //\n"
7162             "    B> *>(\n"
7163             "\n"
7164             ");",
7165             format("static_cast<A<//\n"
7166                    "    B>*>(\n"
7167                    "\n"
7168                    "    );"));
7169   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7170                "    const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);");
7171 
7172   FormatStyle AlwaysBreak = getLLVMStyle();
7173   AlwaysBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes;
7174   verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);
7175   verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);
7176   verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);
7177   verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7178                "                         bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
7179                "    ccccccccccccccccccccccccccccccccccccccccccccccc);");
7180   verifyFormat("template <template <typename> class Fooooooo,\n"
7181                "          template <typename> class Baaaaaaar>\n"
7182                "struct C {};",
7183                AlwaysBreak);
7184   verifyFormat("template <typename T> // T can be A, B or C.\n"
7185                "struct C {};",
7186                AlwaysBreak);
7187   verifyFormat("template <enum E> class A {\n"
7188                "public:\n"
7189                "  E *f();\n"
7190                "};");
7191 
7192   FormatStyle NeverBreak = getLLVMStyle();
7193   NeverBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_No;
7194   verifyFormat("template <typename T> class C {};", NeverBreak);
7195   verifyFormat("template <typename T> void f();", NeverBreak);
7196   verifyFormat("template <typename T> void f() {}", NeverBreak);
7197   verifyFormat("template <typename T>\nvoid foo(aaaaaaaaaaaaaaaaaaaaaaaaaa "
7198                "bbbbbbbbbbbbbbbbbbbb) {}",
7199                NeverBreak);
7200   verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7201                "                         bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
7202                "    ccccccccccccccccccccccccccccccccccccccccccccccc);",
7203                NeverBreak);
7204   verifyFormat("template <template <typename> class Fooooooo,\n"
7205                "          template <typename> class Baaaaaaar>\n"
7206                "struct C {};",
7207                NeverBreak);
7208   verifyFormat("template <typename T> // T can be A, B or C.\n"
7209                "struct C {};",
7210                NeverBreak);
7211   verifyFormat("template <enum E> class A {\n"
7212                "public:\n"
7213                "  E *f();\n"
7214                "};",
7215                NeverBreak);
7216   NeverBreak.PenaltyBreakTemplateDeclaration = 100;
7217   verifyFormat("template <typename T> void\nfoo(aaaaaaaaaaaaaaaaaaaaaaaaaa "
7218                "bbbbbbbbbbbbbbbbbbbb) {}",
7219                NeverBreak);
7220 }
7221 
7222 TEST_F(FormatTest, WrapsTemplateDeclarationsWithComments) {
7223   FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp);
7224   Style.ColumnLimit = 60;
7225   EXPECT_EQ("// Baseline - no comments.\n"
7226             "template <\n"
7227             "    typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n"
7228             "void f() {}",
7229             format("// Baseline - no comments.\n"
7230                    "template <\n"
7231                    "    typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n"
7232                    "void f() {}",
7233                    Style));
7234 
7235   EXPECT_EQ("template <\n"
7236             "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value>  // trailing\n"
7237             "void f() {}",
7238             format("template <\n"
7239                    "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n"
7240                    "void f() {}",
7241                    Style));
7242 
7243   EXPECT_EQ(
7244       "template <\n"
7245       "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value> /* line */\n"
7246       "void f() {}",
7247       format("template <typename aaaaaaaaaa<bbbbbbbbbbbb>::value>  /* line */\n"
7248              "void f() {}",
7249              Style));
7250 
7251   EXPECT_EQ(
7252       "template <\n"
7253       "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value>  // trailing\n"
7254       "                                               // multiline\n"
7255       "void f() {}",
7256       format("template <\n"
7257              "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n"
7258              "                                              // multiline\n"
7259              "void f() {}",
7260              Style));
7261 
7262   EXPECT_EQ(
7263       "template <typename aaaaaaaaaa<\n"
7264       "    bbbbbbbbbbbb>::value>  // trailing loooong\n"
7265       "void f() {}",
7266       format(
7267           "template <\n"
7268           "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing loooong\n"
7269           "void f() {}",
7270           Style));
7271 }
7272 
7273 TEST_F(FormatTest, WrapsTemplateParameters) {
7274   FormatStyle Style = getLLVMStyle();
7275   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
7276   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
7277   verifyFormat(
7278       "template <typename... a> struct q {};\n"
7279       "extern q<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
7280       "    aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
7281       "    y;",
7282       Style);
7283   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
7284   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
7285   verifyFormat(
7286       "template <typename... a> struct r {};\n"
7287       "extern r<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
7288       "    aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
7289       "    y;",
7290       Style);
7291   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
7292   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
7293   verifyFormat("template <typename... a> struct s {};\n"
7294                "extern s<\n"
7295                "    aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, "
7296                "aaaaaaaaaaaaaaaaaaaaaa,\n"
7297                "    aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, "
7298                "aaaaaaaaaaaaaaaaaaaaaa>\n"
7299                "    y;",
7300                Style);
7301   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
7302   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
7303   verifyFormat("template <typename... a> struct t {};\n"
7304                "extern t<\n"
7305                "    aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, "
7306                "aaaaaaaaaaaaaaaaaaaaaa,\n"
7307                "    aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, "
7308                "aaaaaaaaaaaaaaaaaaaaaa>\n"
7309                "    y;",
7310                Style);
7311 }
7312 
7313 TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
7314   verifyFormat(
7315       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
7316       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
7317   verifyFormat(
7318       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
7319       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7320       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
7321 
7322   // FIXME: Should we have the extra indent after the second break?
7323   verifyFormat(
7324       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
7325       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
7326       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
7327 
7328   verifyFormat(
7329       "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
7330       "                    cccccccccccccccccccccccccccccccccccccccccccccc());");
7331 
7332   // Breaking at nested name specifiers is generally not desirable.
7333   verifyFormat(
7334       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7335       "    aaaaaaaaaaaaaaaaaaaaaaa);");
7336 
7337   verifyFormat("aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n"
7338                "                   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
7339                "                       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7340                "                   aaaaaaaaaaaaaaaaaaaaa);",
7341                getLLVMStyleWithColumns(74));
7342 
7343   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
7344                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7345                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
7346 }
7347 
7348 TEST_F(FormatTest, UnderstandsTemplateParameters) {
7349   verifyFormat("A<int> a;");
7350   verifyFormat("A<A<A<int>>> a;");
7351   verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
7352   verifyFormat("bool x = a < 1 || 2 > a;");
7353   verifyFormat("bool x = 5 < f<int>();");
7354   verifyFormat("bool x = f<int>() > 5;");
7355   verifyFormat("bool x = 5 < a<int>::x;");
7356   verifyFormat("bool x = a < 4 ? a > 2 : false;");
7357   verifyFormat("bool x = f() ? a < 2 : a > 2;");
7358 
7359   verifyGoogleFormat("A<A<int>> a;");
7360   verifyGoogleFormat("A<A<A<int>>> a;");
7361   verifyGoogleFormat("A<A<A<A<int>>>> a;");
7362   verifyGoogleFormat("A<A<int> > a;");
7363   verifyGoogleFormat("A<A<A<int> > > a;");
7364   verifyGoogleFormat("A<A<A<A<int> > > > a;");
7365   verifyGoogleFormat("A<::A<int>> a;");
7366   verifyGoogleFormat("A<::A> a;");
7367   verifyGoogleFormat("A< ::A> a;");
7368   verifyGoogleFormat("A< ::A<int> > a;");
7369   EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
7370   EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
7371   EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle()));
7372   EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle()));
7373   EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };",
7374             format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle()));
7375 
7376   verifyFormat("A<A<int>> a;", getChromiumStyle(FormatStyle::LK_Cpp));
7377 
7378   // template closer followed by a token that starts with > or =
7379   verifyFormat("bool b = a<1> > 1;");
7380   verifyFormat("bool b = a<1> >= 1;");
7381   verifyFormat("int i = a<1> >> 1;");
7382   FormatStyle Style = getLLVMStyle();
7383   Style.SpaceBeforeAssignmentOperators = false;
7384   verifyFormat("bool b= a<1> == 1;", Style);
7385   verifyFormat("a<int> = 1;", Style);
7386   verifyFormat("a<int> >>= 1;", Style);
7387 
7388   verifyFormat("test >> a >> b;");
7389   verifyFormat("test << a >> b;");
7390 
7391   verifyFormat("f<int>();");
7392   verifyFormat("template <typename T> void f() {}");
7393   verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;");
7394   verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : "
7395                "sizeof(char)>::type>;");
7396   verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};");
7397   verifyFormat("f(a.operator()<A>());");
7398   verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7399                "      .template operator()<A>());",
7400                getLLVMStyleWithColumns(35));
7401 
7402   // Not template parameters.
7403   verifyFormat("return a < b && c > d;");
7404   verifyFormat("void f() {\n"
7405                "  while (a < b && c > d) {\n"
7406                "  }\n"
7407                "}");
7408   verifyFormat("template <typename... Types>\n"
7409                "typename enable_if<0 < sizeof...(Types)>::type Foo() {}");
7410 
7411   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7412                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);",
7413                getLLVMStyleWithColumns(60));
7414   verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");");
7415   verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}");
7416   verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <");
7417 }
7418 
7419 TEST_F(FormatTest, BitshiftOperatorWidth) {
7420   EXPECT_EQ("int a = 1 << 2; /* foo\n"
7421             "                   bar */",
7422             format("int    a=1<<2;  /* foo\n"
7423                    "                   bar */"));
7424 
7425   EXPECT_EQ("int b = 256 >> 1; /* foo\n"
7426             "                     bar */",
7427             format("int  b  =256>>1 ;  /* foo\n"
7428                    "                      bar */"));
7429 }
7430 
7431 TEST_F(FormatTest, UnderstandsBinaryOperators) {
7432   verifyFormat("COMPARE(a, ==, b);");
7433   verifyFormat("auto s = sizeof...(Ts) - 1;");
7434 }
7435 
7436 TEST_F(FormatTest, UnderstandsPointersToMembers) {
7437   verifyFormat("int A::*x;");
7438   verifyFormat("int (S::*func)(void *);");
7439   verifyFormat("void f() { int (S::*func)(void *); }");
7440   verifyFormat("typedef bool *(Class::*Member)() const;");
7441   verifyFormat("void f() {\n"
7442                "  (a->*f)();\n"
7443                "  a->*x;\n"
7444                "  (a.*f)();\n"
7445                "  ((*a).*f)();\n"
7446                "  a.*x;\n"
7447                "}");
7448   verifyFormat("void f() {\n"
7449                "  (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
7450                "      aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
7451                "}");
7452   verifyFormat(
7453       "(aaaaaaaaaa->*bbbbbbb)(\n"
7454       "    aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
7455   FormatStyle Style = getLLVMStyle();
7456   Style.PointerAlignment = FormatStyle::PAS_Left;
7457   verifyFormat("typedef bool* (Class::*Member)() const;", Style);
7458 }
7459 
7460 TEST_F(FormatTest, UnderstandsUnaryOperators) {
7461   verifyFormat("int a = -2;");
7462   verifyFormat("f(-1, -2, -3);");
7463   verifyFormat("a[-1] = 5;");
7464   verifyFormat("int a = 5 + -2;");
7465   verifyFormat("if (i == -1) {\n}");
7466   verifyFormat("if (i != -1) {\n}");
7467   verifyFormat("if (i > -1) {\n}");
7468   verifyFormat("if (i < -1) {\n}");
7469   verifyFormat("++(a->f());");
7470   verifyFormat("--(a->f());");
7471   verifyFormat("(a->f())++;");
7472   verifyFormat("a[42]++;");
7473   verifyFormat("if (!(a->f())) {\n}");
7474   verifyFormat("if (!+i) {\n}");
7475   verifyFormat("~&a;");
7476 
7477   verifyFormat("a-- > b;");
7478   verifyFormat("b ? -a : c;");
7479   verifyFormat("n * sizeof char16;");
7480   verifyFormat("n * alignof char16;", getGoogleStyle());
7481   verifyFormat("sizeof(char);");
7482   verifyFormat("alignof(char);", getGoogleStyle());
7483 
7484   verifyFormat("return -1;");
7485   verifyFormat("throw -1;");
7486   verifyFormat("switch (a) {\n"
7487                "case -1:\n"
7488                "  break;\n"
7489                "}");
7490   verifyFormat("#define X -1");
7491   verifyFormat("#define X -kConstant");
7492 
7493   verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};");
7494   verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};");
7495 
7496   verifyFormat("int a = /* confusing comment */ -1;");
7497   // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
7498   verifyFormat("int a = i /* confusing comment */++;");
7499 
7500   verifyFormat("co_yield -1;");
7501   verifyFormat("co_return -1;");
7502 }
7503 
7504 TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) {
7505   verifyFormat("if (!aaaaaaaaaa( // break\n"
7506                "        aaaaa)) {\n"
7507                "}");
7508   verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
7509                "    aaaaa));");
7510   verifyFormat("*aaa = aaaaaaa( // break\n"
7511                "    bbbbbb);");
7512 }
7513 
7514 TEST_F(FormatTest, UnderstandsOverloadedOperators) {
7515   verifyFormat("bool operator<();");
7516   verifyFormat("bool operator>();");
7517   verifyFormat("bool operator=();");
7518   verifyFormat("bool operator==();");
7519   verifyFormat("bool operator!=();");
7520   verifyFormat("int operator+();");
7521   verifyFormat("int operator++();");
7522   verifyFormat("int operator++(int) volatile noexcept;");
7523   verifyFormat("bool operator,();");
7524   verifyFormat("bool operator();");
7525   verifyFormat("bool operator()();");
7526   verifyFormat("bool operator[]();");
7527   verifyFormat("operator bool();");
7528   verifyFormat("operator int();");
7529   verifyFormat("operator void *();");
7530   verifyFormat("operator SomeType<int>();");
7531   verifyFormat("operator SomeType<int, int>();");
7532   verifyFormat("operator SomeType<SomeType<int>>();");
7533   verifyFormat("void *operator new(std::size_t size);");
7534   verifyFormat("void *operator new[](std::size_t size);");
7535   verifyFormat("void operator delete(void *ptr);");
7536   verifyFormat("void operator delete[](void *ptr);");
7537   verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
7538                "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
7539   verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n"
7540                "    aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;");
7541 
7542   verifyFormat(
7543       "ostream &operator<<(ostream &OutputStream,\n"
7544       "                    SomeReallyLongType WithSomeReallyLongValue);");
7545   verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
7546                "               const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
7547                "  return left.group < right.group;\n"
7548                "}");
7549   verifyFormat("SomeType &operator=(const SomeType &S);");
7550   verifyFormat("f.template operator()<int>();");
7551 
7552   verifyGoogleFormat("operator void*();");
7553   verifyGoogleFormat("operator SomeType<SomeType<int>>();");
7554   verifyGoogleFormat("operator ::A();");
7555 
7556   verifyFormat("using A::operator+;");
7557   verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n"
7558                "int i;");
7559 }
7560 
7561 TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
7562   verifyFormat("Deleted &operator=(const Deleted &) & = default;");
7563   verifyFormat("Deleted &operator=(const Deleted &) && = delete;");
7564   verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;");
7565   verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;");
7566   verifyFormat("Deleted &operator=(const Deleted &) &;");
7567   verifyFormat("Deleted &operator=(const Deleted &) &&;");
7568   verifyFormat("SomeType MemberFunction(const Deleted &) &;");
7569   verifyFormat("SomeType MemberFunction(const Deleted &) &&;");
7570   verifyFormat("SomeType MemberFunction(const Deleted &) && {}");
7571   verifyFormat("SomeType MemberFunction(const Deleted &) && final {}");
7572   verifyFormat("SomeType MemberFunction(const Deleted &) && override {}");
7573   verifyFormat("void Fn(T const &) const &;");
7574   verifyFormat("void Fn(T const volatile &&) const volatile &&;");
7575   verifyFormat("template <typename T>\n"
7576                "void F(T) && = delete;",
7577                getGoogleStyle());
7578 
7579   FormatStyle AlignLeft = getLLVMStyle();
7580   AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
7581   verifyFormat("void A::b() && {}", AlignLeft);
7582   verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
7583   verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
7584                AlignLeft);
7585   verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
7586   verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
7587   verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
7588   verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
7589   verifyFormat("auto Function(T) & -> void {}", AlignLeft);
7590   verifyFormat("auto Function(T) & -> void;", AlignLeft);
7591   verifyFormat("void Fn(T const&) const&;", AlignLeft);
7592   verifyFormat("void Fn(T const volatile&&) const volatile&&;", AlignLeft);
7593 
7594   FormatStyle Spaces = getLLVMStyle();
7595   Spaces.SpacesInCStyleCastParentheses = true;
7596   verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
7597   verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
7598   verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
7599   verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
7600 
7601   Spaces.SpacesInCStyleCastParentheses = false;
7602   Spaces.SpacesInParentheses = true;
7603   verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
7604   verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;",
7605                Spaces);
7606   verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
7607   verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
7608 
7609   FormatStyle BreakTemplate = getLLVMStyle();
7610   BreakTemplate.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes;
7611 
7612   verifyFormat("struct f {\n"
7613                "  template <class T>\n"
7614                "  int &foo(const std::string &str) &noexcept {}\n"
7615                "};",
7616                BreakTemplate);
7617 
7618   verifyFormat("struct f {\n"
7619                "  template <class T>\n"
7620                "  int &foo(const std::string &str) &&noexcept {}\n"
7621                "};",
7622                BreakTemplate);
7623 
7624   verifyFormat("struct f {\n"
7625                "  template <class T>\n"
7626                "  int &foo(const std::string &str) const &noexcept {}\n"
7627                "};",
7628                BreakTemplate);
7629 
7630   verifyFormat("struct f {\n"
7631                "  template <class T>\n"
7632                "  int &foo(const std::string &str) const &noexcept {}\n"
7633                "};",
7634                BreakTemplate);
7635 
7636   verifyFormat("struct f {\n"
7637                "  template <class T>\n"
7638                "  auto foo(const std::string &str) &&noexcept -> int & {}\n"
7639                "};",
7640                BreakTemplate);
7641 
7642   FormatStyle AlignLeftBreakTemplate = getLLVMStyle();
7643   AlignLeftBreakTemplate.AlwaysBreakTemplateDeclarations =
7644       FormatStyle::BTDS_Yes;
7645   AlignLeftBreakTemplate.PointerAlignment = FormatStyle::PAS_Left;
7646 
7647   verifyFormat("struct f {\n"
7648                "  template <class T>\n"
7649                "  int& foo(const std::string& str) & noexcept {}\n"
7650                "};",
7651                AlignLeftBreakTemplate);
7652 
7653   verifyFormat("struct f {\n"
7654                "  template <class T>\n"
7655                "  int& foo(const std::string& str) && noexcept {}\n"
7656                "};",
7657                AlignLeftBreakTemplate);
7658 
7659   verifyFormat("struct f {\n"
7660                "  template <class T>\n"
7661                "  int& foo(const std::string& str) const& noexcept {}\n"
7662                "};",
7663                AlignLeftBreakTemplate);
7664 
7665   verifyFormat("struct f {\n"
7666                "  template <class T>\n"
7667                "  int& foo(const std::string& str) const&& noexcept {}\n"
7668                "};",
7669                AlignLeftBreakTemplate);
7670 
7671   verifyFormat("struct f {\n"
7672                "  template <class T>\n"
7673                "  auto foo(const std::string& str) && noexcept -> int& {}\n"
7674                "};",
7675                AlignLeftBreakTemplate);
7676 
7677   // The `&` in `Type&` should not be confused with a trailing `&` of
7678   // DEPRECATED(reason) member function.
7679   verifyFormat("struct f {\n"
7680                "  template <class T>\n"
7681                "  DEPRECATED(reason)\n"
7682                "  Type &foo(arguments) {}\n"
7683                "};",
7684                BreakTemplate);
7685 
7686   verifyFormat("struct f {\n"
7687                "  template <class T>\n"
7688                "  DEPRECATED(reason)\n"
7689                "  Type& foo(arguments) {}\n"
7690                "};",
7691                AlignLeftBreakTemplate);
7692 
7693   verifyFormat("void (*foopt)(int) = &func;");
7694 }
7695 
7696 TEST_F(FormatTest, UnderstandsNewAndDelete) {
7697   verifyFormat("void f() {\n"
7698                "  A *a = new A;\n"
7699                "  A *a = new (placement) A;\n"
7700                "  delete a;\n"
7701                "  delete (A *)a;\n"
7702                "}");
7703   verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
7704                "    typename aaaaaaaaaaaaaaaaaaaaaaaa();");
7705   verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7706                "    new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
7707                "        typename aaaaaaaaaaaaaaaaaaaaaaaa();");
7708   verifyFormat("delete[] h->p;");
7709 }
7710 
7711 TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
7712   verifyFormat("int *f(int *a) {}");
7713   verifyFormat("int main(int argc, char **argv) {}");
7714   verifyFormat("Test::Test(int b) : a(b * b) {}");
7715   verifyIndependentOfContext("f(a, *a);");
7716   verifyFormat("void g() { f(*a); }");
7717   verifyIndependentOfContext("int a = b * 10;");
7718   verifyIndependentOfContext("int a = 10 * b;");
7719   verifyIndependentOfContext("int a = b * c;");
7720   verifyIndependentOfContext("int a += b * c;");
7721   verifyIndependentOfContext("int a -= b * c;");
7722   verifyIndependentOfContext("int a *= b * c;");
7723   verifyIndependentOfContext("int a /= b * c;");
7724   verifyIndependentOfContext("int a = *b;");
7725   verifyIndependentOfContext("int a = *b * c;");
7726   verifyIndependentOfContext("int a = b * *c;");
7727   verifyIndependentOfContext("int a = b * (10);");
7728   verifyIndependentOfContext("S << b * (10);");
7729   verifyIndependentOfContext("return 10 * b;");
7730   verifyIndependentOfContext("return *b * *c;");
7731   verifyIndependentOfContext("return a & ~b;");
7732   verifyIndependentOfContext("f(b ? *c : *d);");
7733   verifyIndependentOfContext("int a = b ? *c : *d;");
7734   verifyIndependentOfContext("*b = a;");
7735   verifyIndependentOfContext("a * ~b;");
7736   verifyIndependentOfContext("a * !b;");
7737   verifyIndependentOfContext("a * +b;");
7738   verifyIndependentOfContext("a * -b;");
7739   verifyIndependentOfContext("a * ++b;");
7740   verifyIndependentOfContext("a * --b;");
7741   verifyIndependentOfContext("a[4] * b;");
7742   verifyIndependentOfContext("a[a * a] = 1;");
7743   verifyIndependentOfContext("f() * b;");
7744   verifyIndependentOfContext("a * [self dostuff];");
7745   verifyIndependentOfContext("int x = a * (a + b);");
7746   verifyIndependentOfContext("(a *)(a + b);");
7747   verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
7748   verifyIndependentOfContext("int *pa = (int *)&a;");
7749   verifyIndependentOfContext("return sizeof(int **);");
7750   verifyIndependentOfContext("return sizeof(int ******);");
7751   verifyIndependentOfContext("return (int **&)a;");
7752   verifyIndependentOfContext("f((*PointerToArray)[10]);");
7753   verifyFormat("void f(Type (*parameter)[10]) {}");
7754   verifyFormat("void f(Type (&parameter)[10]) {}");
7755   verifyGoogleFormat("return sizeof(int**);");
7756   verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
7757   verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
7758   verifyFormat("auto a = [](int **&, int ***) {};");
7759   verifyFormat("auto PointerBinding = [](const char *S) {};");
7760   verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
7761   verifyFormat("[](const decltype(*a) &value) {}");
7762   verifyFormat("decltype(a * b) F();");
7763   verifyFormat("#define MACRO() [](A *a) { return 1; }");
7764   verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
7765   verifyIndependentOfContext("typedef void (*f)(int *a);");
7766   verifyIndependentOfContext("int i{a * b};");
7767   verifyIndependentOfContext("aaa && aaa->f();");
7768   verifyIndependentOfContext("int x = ~*p;");
7769   verifyFormat("Constructor() : a(a), area(width * height) {}");
7770   verifyFormat("Constructor() : a(a), area(a, width * height) {}");
7771   verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
7772   verifyFormat("void f() { f(a, c * d); }");
7773   verifyFormat("void f() { f(new a(), c * d); }");
7774   verifyFormat("void f(const MyOverride &override);");
7775   verifyFormat("void f(const MyFinal &final);");
7776   verifyIndependentOfContext("bool a = f() && override.f();");
7777   verifyIndependentOfContext("bool a = f() && final.f();");
7778 
7779   verifyIndependentOfContext("InvalidRegions[*R] = 0;");
7780 
7781   verifyIndependentOfContext("A<int *> a;");
7782   verifyIndependentOfContext("A<int **> a;");
7783   verifyIndependentOfContext("A<int *, int *> a;");
7784   verifyIndependentOfContext("A<int *[]> a;");
7785   verifyIndependentOfContext(
7786       "const char *const p = reinterpret_cast<const char *const>(q);");
7787   verifyIndependentOfContext("A<int **, int **> a;");
7788   verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
7789   verifyFormat("for (char **a = b; *a; ++a) {\n}");
7790   verifyFormat("for (; a && b;) {\n}");
7791   verifyFormat("bool foo = true && [] { return false; }();");
7792 
7793   verifyFormat(
7794       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7795       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
7796 
7797   verifyGoogleFormat("int const* a = &b;");
7798   verifyGoogleFormat("**outparam = 1;");
7799   verifyGoogleFormat("*outparam = a * b;");
7800   verifyGoogleFormat("int main(int argc, char** argv) {}");
7801   verifyGoogleFormat("A<int*> a;");
7802   verifyGoogleFormat("A<int**> a;");
7803   verifyGoogleFormat("A<int*, int*> a;");
7804   verifyGoogleFormat("A<int**, int**> a;");
7805   verifyGoogleFormat("f(b ? *c : *d);");
7806   verifyGoogleFormat("int a = b ? *c : *d;");
7807   verifyGoogleFormat("Type* t = **x;");
7808   verifyGoogleFormat("Type* t = *++*x;");
7809   verifyGoogleFormat("*++*x;");
7810   verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
7811   verifyGoogleFormat("Type* t = x++ * y;");
7812   verifyGoogleFormat(
7813       "const char* const p = reinterpret_cast<const char* const>(q);");
7814   verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
7815   verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
7816   verifyGoogleFormat("template <typename T>\n"
7817                      "void f(int i = 0, SomeType** temps = NULL);");
7818 
7819   FormatStyle Left = getLLVMStyle();
7820   Left.PointerAlignment = FormatStyle::PAS_Left;
7821   verifyFormat("x = *a(x) = *a(y);", Left);
7822   verifyFormat("for (;; *a = b) {\n}", Left);
7823   verifyFormat("return *this += 1;", Left);
7824   verifyFormat("throw *x;", Left);
7825   verifyFormat("delete *x;", Left);
7826   verifyFormat("typedef typeof(int(int, int))* MyFuncPtr;", Left);
7827   verifyFormat("[](const decltype(*a)* ptr) {}", Left);
7828   verifyFormat("typedef typeof /*comment*/ (int(int, int))* MyFuncPtr;", Left);
7829   verifyFormat("auto x(A&&, B&&, C&&) -> D;", Left);
7830   verifyFormat("auto x = [](A&&, B&&, C&&) -> D {};", Left);
7831   verifyFormat("template <class T> X(T&&, T&&, T&&) -> X<T>;", Left);
7832 
7833   verifyIndependentOfContext("a = *(x + y);");
7834   verifyIndependentOfContext("a = &(x + y);");
7835   verifyIndependentOfContext("*(x + y).call();");
7836   verifyIndependentOfContext("&(x + y)->call();");
7837   verifyFormat("void f() { &(*I).first; }");
7838 
7839   verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
7840   verifyFormat(
7841       "int *MyValues = {\n"
7842       "    *A, // Operator detection might be confused by the '{'\n"
7843       "    *BB // Operator detection might be confused by previous comment\n"
7844       "};");
7845 
7846   verifyIndependentOfContext("if (int *a = &b)");
7847   verifyIndependentOfContext("if (int &a = *b)");
7848   verifyIndependentOfContext("if (a & b[i])");
7849   verifyIndependentOfContext("if constexpr (a & b[i])");
7850   verifyIndependentOfContext("if CONSTEXPR (a & b[i])");
7851   verifyIndependentOfContext("if (a * (b * c))");
7852   verifyIndependentOfContext("if constexpr (a * (b * c))");
7853   verifyIndependentOfContext("if CONSTEXPR (a * (b * c))");
7854   verifyIndependentOfContext("if (a::b::c::d & b[i])");
7855   verifyIndependentOfContext("if (*b[i])");
7856   verifyIndependentOfContext("if (int *a = (&b))");
7857   verifyIndependentOfContext("while (int *a = &b)");
7858   verifyIndependentOfContext("while (a * (b * c))");
7859   verifyIndependentOfContext("size = sizeof *a;");
7860   verifyIndependentOfContext("if (a && (b = c))");
7861   verifyFormat("void f() {\n"
7862                "  for (const int &v : Values) {\n"
7863                "  }\n"
7864                "}");
7865   verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
7866   verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
7867   verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
7868 
7869   verifyFormat("#define A (!a * b)");
7870   verifyFormat("#define MACRO     \\\n"
7871                "  int *i = a * b; \\\n"
7872                "  void f(a *b);",
7873                getLLVMStyleWithColumns(19));
7874 
7875   verifyIndependentOfContext("A = new SomeType *[Length];");
7876   verifyIndependentOfContext("A = new SomeType *[Length]();");
7877   verifyIndependentOfContext("T **t = new T *;");
7878   verifyIndependentOfContext("T **t = new T *();");
7879   verifyGoogleFormat("A = new SomeType*[Length]();");
7880   verifyGoogleFormat("A = new SomeType*[Length];");
7881   verifyGoogleFormat("T** t = new T*;");
7882   verifyGoogleFormat("T** t = new T*();");
7883 
7884   verifyFormat("STATIC_ASSERT((a & b) == 0);");
7885   verifyFormat("STATIC_ASSERT(0 == (a & b));");
7886   verifyFormat("template <bool a, bool b> "
7887                "typename t::if<x && y>::type f() {}");
7888   verifyFormat("template <int *y> f() {}");
7889   verifyFormat("vector<int *> v;");
7890   verifyFormat("vector<int *const> v;");
7891   verifyFormat("vector<int *const **const *> v;");
7892   verifyFormat("vector<int *volatile> v;");
7893   verifyFormat("vector<a * b> v;");
7894   verifyFormat("foo<b && false>();");
7895   verifyFormat("foo<b & 1>();");
7896   verifyFormat("decltype(*::std::declval<const T &>()) void F();");
7897   verifyFormat(
7898       "template <class T, class = typename std::enable_if<\n"
7899       "                       std::is_integral<T>::value &&\n"
7900       "                       (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
7901       "void F();",
7902       getLLVMStyleWithColumns(70));
7903   verifyFormat("template <class T,\n"
7904                "          class = typename std::enable_if<\n"
7905                "              std::is_integral<T>::value &&\n"
7906                "              (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n"
7907                "          class U>\n"
7908                "void F();",
7909                getLLVMStyleWithColumns(70));
7910   verifyFormat(
7911       "template <class T,\n"
7912       "          class = typename ::std::enable_if<\n"
7913       "              ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
7914       "void F();",
7915       getGoogleStyleWithColumns(68));
7916 
7917   verifyIndependentOfContext("MACRO(int *i);");
7918   verifyIndependentOfContext("MACRO(auto *a);");
7919   verifyIndependentOfContext("MACRO(const A *a);");
7920   verifyIndependentOfContext("MACRO(A *const a);");
7921   verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
7922   verifyFormat("void f() { f(float{1}, a * a); }");
7923   // FIXME: Is there a way to make this work?
7924   // verifyIndependentOfContext("MACRO(A *a);");
7925 
7926   verifyFormat("DatumHandle const *operator->() const { return input_; }");
7927   verifyFormat("return options != nullptr && operator==(*options);");
7928 
7929   EXPECT_EQ("#define OP(x)                                    \\\n"
7930             "  ostream &operator<<(ostream &s, const A &a) {  \\\n"
7931             "    return s << a.DebugString();                 \\\n"
7932             "  }",
7933             format("#define OP(x) \\\n"
7934                    "  ostream &operator<<(ostream &s, const A &a) { \\\n"
7935                    "    return s << a.DebugString(); \\\n"
7936                    "  }",
7937                    getLLVMStyleWithColumns(50)));
7938 
7939   // FIXME: We cannot handle this case yet; we might be able to figure out that
7940   // foo<x> d > v; doesn't make sense.
7941   verifyFormat("foo<a<b && c> d> v;");
7942 
7943   FormatStyle PointerMiddle = getLLVMStyle();
7944   PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
7945   verifyFormat("delete *x;", PointerMiddle);
7946   verifyFormat("int * x;", PointerMiddle);
7947   verifyFormat("int *[] x;", PointerMiddle);
7948   verifyFormat("template <int * y> f() {}", PointerMiddle);
7949   verifyFormat("int * f(int * a) {}", PointerMiddle);
7950   verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
7951   verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
7952   verifyFormat("A<int *> a;", PointerMiddle);
7953   verifyFormat("A<int **> a;", PointerMiddle);
7954   verifyFormat("A<int *, int *> a;", PointerMiddle);
7955   verifyFormat("A<int *[]> a;", PointerMiddle);
7956   verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
7957   verifyFormat("A = new SomeType *[Length];", PointerMiddle);
7958   verifyFormat("T ** t = new T *;", PointerMiddle);
7959 
7960   // Member function reference qualifiers aren't binary operators.
7961   verifyFormat("string // break\n"
7962                "operator()() & {}");
7963   verifyFormat("string // break\n"
7964                "operator()() && {}");
7965   verifyGoogleFormat("template <typename T>\n"
7966                      "auto x() & -> int {}");
7967 }
7968 
7969 TEST_F(FormatTest, UnderstandsAttributes) {
7970   verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
7971   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
7972                "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
7973   FormatStyle AfterType = getLLVMStyle();
7974   AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
7975   verifyFormat("__attribute__((nodebug)) void\n"
7976                "foo() {}\n",
7977                AfterType);
7978 }
7979 
7980 TEST_F(FormatTest, UnderstandsSquareAttributes) {
7981   verifyFormat("SomeType s [[unused]] (InitValue);");
7982   verifyFormat("SomeType s [[gnu::unused]] (InitValue);");
7983   verifyFormat("SomeType s [[using gnu: unused]] (InitValue);");
7984   verifyFormat("[[gsl::suppress(\"clang-tidy-check-name\")]] void f() {}");
7985   verifyFormat("void f() [[deprecated(\"so sorry\")]];");
7986   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7987                "    [[unused]] aaaaaaaaaaaaaaaaaaaaaaa(int i);");
7988   verifyFormat("[[nodiscard]] bool f() { return false; }");
7989   verifyFormat("class [[nodiscard]] f {\npublic:\n  f() {}\n}");
7990   verifyFormat("class [[deprecated(\"so sorry\")]] f {\npublic:\n  f() {}\n}");
7991   verifyFormat("class [[gnu::unused]] f {\npublic:\n  f() {}\n}");
7992 
7993   // Make sure we do not mistake attributes for array subscripts.
7994   verifyFormat("int a() {}\n"
7995                "[[unused]] int b() {}\n");
7996   verifyFormat("NSArray *arr;\n"
7997                "arr[[Foo() bar]];");
7998 
7999   // On the other hand, we still need to correctly find array subscripts.
8000   verifyFormat("int a = std::vector<int>{1, 2, 3}[0];");
8001 
8002   // Make sure that we do not mistake Objective-C method inside array literals
8003   // as attributes, even if those method names are also keywords.
8004   verifyFormat("@[ [foo bar] ];");
8005   verifyFormat("@[ [NSArray class] ];");
8006   verifyFormat("@[ [foo enum] ];");
8007 
8008   // Make sure we do not parse attributes as lambda introducers.
8009   FormatStyle MultiLineFunctions = getLLVMStyle();
8010   MultiLineFunctions.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
8011   verifyFormat("[[unused]] int b() {\n"
8012                "  return 42;\n"
8013                "}\n",
8014                MultiLineFunctions);
8015 }
8016 
8017 TEST_F(FormatTest, AttributePenaltyBreaking) {
8018   FormatStyle Style = getLLVMStyle();
8019   verifyFormat("void ABCDEFGH::ABCDEFGHIJKLMN(\n"
8020                "    [[maybe_unused]] const shared_ptr<ALongTypeName> &C d) {}",
8021                Style);
8022   verifyFormat("void ABCDEFGH::ABCDEFGHIJK(\n"
8023                "    [[maybe_unused]] const shared_ptr<ALongTypeName> &C d) {}",
8024                Style);
8025   verifyFormat("void ABCDEFGH::ABCDEFGH([[maybe_unused]] const "
8026                "shared_ptr<ALongTypeName> &C d) {\n}",
8027                Style);
8028 }
8029 
8030 TEST_F(FormatTest, UnderstandsEllipsis) {
8031   verifyFormat("int printf(const char *fmt, ...);");
8032   verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
8033   verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
8034 
8035   FormatStyle PointersLeft = getLLVMStyle();
8036   PointersLeft.PointerAlignment = FormatStyle::PAS_Left;
8037   verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
8038 }
8039 
8040 TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
8041   EXPECT_EQ("int *a;\n"
8042             "int *a;\n"
8043             "int *a;",
8044             format("int *a;\n"
8045                    "int* a;\n"
8046                    "int *a;",
8047                    getGoogleStyle()));
8048   EXPECT_EQ("int* a;\n"
8049             "int* a;\n"
8050             "int* a;",
8051             format("int* a;\n"
8052                    "int* a;\n"
8053                    "int *a;",
8054                    getGoogleStyle()));
8055   EXPECT_EQ("int *a;\n"
8056             "int *a;\n"
8057             "int *a;",
8058             format("int *a;\n"
8059                    "int * a;\n"
8060                    "int *  a;",
8061                    getGoogleStyle()));
8062   EXPECT_EQ("auto x = [] {\n"
8063             "  int *a;\n"
8064             "  int *a;\n"
8065             "  int *a;\n"
8066             "};",
8067             format("auto x=[]{int *a;\n"
8068                    "int * a;\n"
8069                    "int *  a;};",
8070                    getGoogleStyle()));
8071 }
8072 
8073 TEST_F(FormatTest, UnderstandsRvalueReferences) {
8074   verifyFormat("int f(int &&a) {}");
8075   verifyFormat("int f(int a, char &&b) {}");
8076   verifyFormat("void f() { int &&a = b; }");
8077   verifyGoogleFormat("int f(int a, char&& b) {}");
8078   verifyGoogleFormat("void f() { int&& a = b; }");
8079 
8080   verifyIndependentOfContext("A<int &&> a;");
8081   verifyIndependentOfContext("A<int &&, int &&> a;");
8082   verifyGoogleFormat("A<int&&> a;");
8083   verifyGoogleFormat("A<int&&, int&&> a;");
8084 
8085   // Not rvalue references:
8086   verifyFormat("template <bool B, bool C> class A {\n"
8087                "  static_assert(B && C, \"Something is wrong\");\n"
8088                "};");
8089   verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
8090   verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
8091   verifyFormat("#define A(a, b) (a && b)");
8092 }
8093 
8094 TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
8095   verifyFormat("void f() {\n"
8096                "  x[aaaaaaaaa -\n"
8097                "    b] = 23;\n"
8098                "}",
8099                getLLVMStyleWithColumns(15));
8100 }
8101 
8102 TEST_F(FormatTest, FormatsCasts) {
8103   verifyFormat("Type *A = static_cast<Type *>(P);");
8104   verifyFormat("Type *A = (Type *)P;");
8105   verifyFormat("Type *A = (vector<Type *, int *>)P;");
8106   verifyFormat("int a = (int)(2.0f);");
8107   verifyFormat("int a = (int)2.0f;");
8108   verifyFormat("x[(int32)y];");
8109   verifyFormat("x = (int32)y;");
8110   verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
8111   verifyFormat("int a = (int)*b;");
8112   verifyFormat("int a = (int)2.0f;");
8113   verifyFormat("int a = (int)~0;");
8114   verifyFormat("int a = (int)++a;");
8115   verifyFormat("int a = (int)sizeof(int);");
8116   verifyFormat("int a = (int)+2;");
8117   verifyFormat("my_int a = (my_int)2.0f;");
8118   verifyFormat("my_int a = (my_int)sizeof(int);");
8119   verifyFormat("return (my_int)aaa;");
8120   verifyFormat("#define x ((int)-1)");
8121   verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
8122   verifyFormat("#define p(q) ((int *)&q)");
8123   verifyFormat("fn(a)(b) + 1;");
8124 
8125   verifyFormat("void f() { my_int a = (my_int)*b; }");
8126   verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
8127   verifyFormat("my_int a = (my_int)~0;");
8128   verifyFormat("my_int a = (my_int)++a;");
8129   verifyFormat("my_int a = (my_int)-2;");
8130   verifyFormat("my_int a = (my_int)1;");
8131   verifyFormat("my_int a = (my_int *)1;");
8132   verifyFormat("my_int a = (const my_int)-1;");
8133   verifyFormat("my_int a = (const my_int *)-1;");
8134   verifyFormat("my_int a = (my_int)(my_int)-1;");
8135   verifyFormat("my_int a = (ns::my_int)-2;");
8136   verifyFormat("case (my_int)ONE:");
8137   verifyFormat("auto x = (X)this;");
8138   // Casts in Obj-C style calls used to not be recognized as such.
8139   verifyFormat("int a = [(type*)[((type*)val) arg] arg];", getGoogleStyle());
8140 
8141   // FIXME: single value wrapped with paren will be treated as cast.
8142   verifyFormat("void f(int i = (kValue)*kMask) {}");
8143 
8144   verifyFormat("{ (void)F; }");
8145 
8146   // Don't break after a cast's
8147   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
8148                "    (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
8149                "                                   bbbbbbbbbbbbbbbbbbbbbb);");
8150 
8151   // These are not casts.
8152   verifyFormat("void f(int *) {}");
8153   verifyFormat("f(foo)->b;");
8154   verifyFormat("f(foo).b;");
8155   verifyFormat("f(foo)(b);");
8156   verifyFormat("f(foo)[b];");
8157   verifyFormat("[](foo) { return 4; }(bar);");
8158   verifyFormat("(*funptr)(foo)[4];");
8159   verifyFormat("funptrs[4](foo)[4];");
8160   verifyFormat("void f(int *);");
8161   verifyFormat("void f(int *) = 0;");
8162   verifyFormat("void f(SmallVector<int>) {}");
8163   verifyFormat("void f(SmallVector<int>);");
8164   verifyFormat("void f(SmallVector<int>) = 0;");
8165   verifyFormat("void f(int i = (kA * kB) & kMask) {}");
8166   verifyFormat("int a = sizeof(int) * b;");
8167   verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
8168   verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
8169   verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
8170   verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
8171 
8172   // These are not casts, but at some point were confused with casts.
8173   verifyFormat("virtual void foo(int *) override;");
8174   verifyFormat("virtual void foo(char &) const;");
8175   verifyFormat("virtual void foo(int *a, char *) const;");
8176   verifyFormat("int a = sizeof(int *) + b;");
8177   verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
8178   verifyFormat("bool b = f(g<int>) && c;");
8179   verifyFormat("typedef void (*f)(int i) func;");
8180   verifyFormat("void operator++(int) noexcept;");
8181   verifyFormat("void operator++(int &) noexcept;");
8182   verifyFormat("void operator delete(void *, std::size_t, const std::nothrow_t "
8183                "&) noexcept;");
8184   verifyFormat(
8185       "void operator delete(std::size_t, const std::nothrow_t &) noexcept;");
8186   verifyFormat("void operator delete(const std::nothrow_t &) noexcept;");
8187   verifyFormat("void operator delete(std::nothrow_t &) noexcept;");
8188   verifyFormat("void operator delete(nothrow_t &) noexcept;");
8189   verifyFormat("void operator delete(foo &) noexcept;");
8190   verifyFormat("void operator delete(foo) noexcept;");
8191   verifyFormat("void operator delete(int) noexcept;");
8192   verifyFormat("void operator delete(int &) noexcept;");
8193   verifyFormat("void operator delete(int &) volatile noexcept;");
8194   verifyFormat("void operator delete(int &) const");
8195   verifyFormat("void operator delete(int &) = default");
8196   verifyFormat("void operator delete(int &) = delete");
8197   verifyFormat("void operator delete(int &) [[noreturn]]");
8198   verifyFormat("void operator delete(int &) throw();");
8199   verifyFormat("void operator delete(int &) throw(int);");
8200   verifyFormat("auto operator delete(int &) -> int;");
8201   verifyFormat("auto operator delete(int &) override");
8202   verifyFormat("auto operator delete(int &) final");
8203 
8204   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
8205                "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
8206   // FIXME: The indentation here is not ideal.
8207   verifyFormat(
8208       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8209       "    [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
8210       "        [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
8211 }
8212 
8213 TEST_F(FormatTest, FormatsFunctionTypes) {
8214   verifyFormat("A<bool()> a;");
8215   verifyFormat("A<SomeType()> a;");
8216   verifyFormat("A<void (*)(int, std::string)> a;");
8217   verifyFormat("A<void *(int)>;");
8218   verifyFormat("void *(*a)(int *, SomeType *);");
8219   verifyFormat("int (*func)(void *);");
8220   verifyFormat("void f() { int (*func)(void *); }");
8221   verifyFormat("template <class CallbackClass>\n"
8222                "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
8223 
8224   verifyGoogleFormat("A<void*(int*, SomeType*)>;");
8225   verifyGoogleFormat("void* (*a)(int);");
8226   verifyGoogleFormat(
8227       "template <class CallbackClass>\n"
8228       "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
8229 
8230   // Other constructs can look somewhat like function types:
8231   verifyFormat("A<sizeof(*x)> a;");
8232   verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
8233   verifyFormat("some_var = function(*some_pointer_var)[0];");
8234   verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
8235   verifyFormat("int x = f(&h)();");
8236   verifyFormat("returnsFunction(&param1, &param2)(param);");
8237   verifyFormat("std::function<\n"
8238                "    LooooooooooongTemplatedType<\n"
8239                "        SomeType>*(\n"
8240                "        LooooooooooooooooongType type)>\n"
8241                "    function;",
8242                getGoogleStyleWithColumns(40));
8243 }
8244 
8245 TEST_F(FormatTest, FormatsPointersToArrayTypes) {
8246   verifyFormat("A (*foo_)[6];");
8247   verifyFormat("vector<int> (*foo_)[6];");
8248 }
8249 
8250 TEST_F(FormatTest, BreaksLongVariableDeclarations) {
8251   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
8252                "    LoooooooooooooooooooooooooooooooooooooooongVariable;");
8253   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
8254                "    LoooooooooooooooooooooooooooooooooooooooongVariable;");
8255   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
8256                "    *LoooooooooooooooooooooooooooooooooooooooongVariable;");
8257 
8258   // Different ways of ()-initializiation.
8259   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
8260                "    LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
8261   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
8262                "    LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
8263   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
8264                "    LoooooooooooooooooooooooooooooooooooooooongVariable({});");
8265   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
8266                "    LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
8267 
8268   // Lambdas should not confuse the variable declaration heuristic.
8269   verifyFormat("LooooooooooooooooongType\n"
8270                "    variable(nullptr, [](A *a) {});",
8271                getLLVMStyleWithColumns(40));
8272 }
8273 
8274 TEST_F(FormatTest, BreaksLongDeclarations) {
8275   verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
8276                "    AnotherNameForTheLongType;");
8277   verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
8278                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
8279   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
8280                "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
8281   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
8282                "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
8283   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
8284                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
8285   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
8286                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
8287   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
8288                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
8289   verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
8290                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
8291   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
8292                "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
8293   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
8294                "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
8295   FormatStyle Indented = getLLVMStyle();
8296   Indented.IndentWrappedFunctionNames = true;
8297   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
8298                "    LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
8299                Indented);
8300   verifyFormat(
8301       "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
8302       "    LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
8303       Indented);
8304   verifyFormat(
8305       "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
8306       "    LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
8307       Indented);
8308   verifyFormat(
8309       "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
8310       "    LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
8311       Indented);
8312 
8313   // FIXME: Without the comment, this breaks after "(".
8314   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType  // break\n"
8315                "    (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
8316                getGoogleStyle());
8317 
8318   verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
8319                "                  int LoooooooooooooooooooongParam2) {}");
8320   verifyFormat(
8321       "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
8322       "                                   SourceLocation L, IdentifierIn *II,\n"
8323       "                                   Type *T) {}");
8324   verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
8325                "ReallyReaaallyLongFunctionName(\n"
8326                "    const std::string &SomeParameter,\n"
8327                "    const SomeType<string, SomeOtherTemplateParameter>\n"
8328                "        &ReallyReallyLongParameterName,\n"
8329                "    const SomeType<string, SomeOtherTemplateParameter>\n"
8330                "        &AnotherLongParameterName) {}");
8331   verifyFormat("template <typename A>\n"
8332                "SomeLoooooooooooooooooooooongType<\n"
8333                "    typename some_namespace::SomeOtherType<A>::Type>\n"
8334                "Function() {}");
8335 
8336   verifyGoogleFormat(
8337       "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
8338       "    aaaaaaaaaaaaaaaaaaaaaaa;");
8339   verifyGoogleFormat(
8340       "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
8341       "                                   SourceLocation L) {}");
8342   verifyGoogleFormat(
8343       "some_namespace::LongReturnType\n"
8344       "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
8345       "    int first_long_parameter, int second_parameter) {}");
8346 
8347   verifyGoogleFormat("template <typename T>\n"
8348                      "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
8349                      "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
8350   verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
8351                      "                   int aaaaaaaaaaaaaaaaaaaaaaa);");
8352 
8353   verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
8354                "    const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8355                "        *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
8356   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
8357                "    vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
8358                "        aaaaaaaaaaaaaaaaaaaaaaaa);");
8359   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
8360                "    vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
8361                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
8362                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
8363 
8364   verifyFormat("template <typename T> // Templates on own line.\n"
8365                "static int            // Some comment.\n"
8366                "MyFunction(int a);",
8367                getLLVMStyle());
8368 }
8369 
8370 TEST_F(FormatTest, FormatsArrays) {
8371   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
8372                "                         [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
8373   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
8374                "                         [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
8375   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
8376                "    aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
8377   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8378                "    [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
8379   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8380                "    [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
8381   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8382                "    [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
8383                "    [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
8384   verifyFormat(
8385       "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
8386       "             << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
8387       "                                  [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
8388   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
8389                "    .aaaaaaaaaaaaaaaaaaaaaa();");
8390 
8391   verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
8392                      "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
8393   verifyFormat(
8394       "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
8395       "                                  .aaaaaaa[0]\n"
8396       "                                  .aaaaaaaaaaaaaaaaaaaaaa();");
8397   verifyFormat("a[::b::c];");
8398 
8399   verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
8400 
8401   FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
8402   verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
8403 }
8404 
8405 TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
8406   verifyFormat("(a)->b();");
8407   verifyFormat("--a;");
8408 }
8409 
8410 TEST_F(FormatTest, HandlesIncludeDirectives) {
8411   verifyFormat("#include <string>\n"
8412                "#include <a/b/c.h>\n"
8413                "#include \"a/b/string\"\n"
8414                "#include \"string.h\"\n"
8415                "#include \"string.h\"\n"
8416                "#include <a-a>\n"
8417                "#include < path with space >\n"
8418                "#include_next <test.h>"
8419                "#include \"abc.h\" // this is included for ABC\n"
8420                "#include \"some long include\" // with a comment\n"
8421                "#include \"some very long include path\"\n"
8422                "#include <some/very/long/include/path>\n",
8423                getLLVMStyleWithColumns(35));
8424   EXPECT_EQ("#include \"a.h\"", format("#include  \"a.h\""));
8425   EXPECT_EQ("#include <a>", format("#include<a>"));
8426 
8427   verifyFormat("#import <string>");
8428   verifyFormat("#import <a/b/c.h>");
8429   verifyFormat("#import \"a/b/string\"");
8430   verifyFormat("#import \"string.h\"");
8431   verifyFormat("#import \"string.h\"");
8432   verifyFormat("#if __has_include(<strstream>)\n"
8433                "#include <strstream>\n"
8434                "#endif");
8435 
8436   verifyFormat("#define MY_IMPORT <a/b>");
8437 
8438   verifyFormat("#if __has_include(<a/b>)");
8439   verifyFormat("#if __has_include_next(<a/b>)");
8440   verifyFormat("#define F __has_include(<a/b>)");
8441   verifyFormat("#define F __has_include_next(<a/b>)");
8442 
8443   // Protocol buffer definition or missing "#".
8444   verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
8445                getLLVMStyleWithColumns(30));
8446 
8447   FormatStyle Style = getLLVMStyle();
8448   Style.AlwaysBreakBeforeMultilineStrings = true;
8449   Style.ColumnLimit = 0;
8450   verifyFormat("#import \"abc.h\"", Style);
8451 
8452   // But 'import' might also be a regular C++ namespace.
8453   verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
8454                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
8455 }
8456 
8457 //===----------------------------------------------------------------------===//
8458 // Error recovery tests.
8459 //===----------------------------------------------------------------------===//
8460 
8461 TEST_F(FormatTest, IncompleteParameterLists) {
8462   FormatStyle NoBinPacking = getLLVMStyle();
8463   NoBinPacking.BinPackParameters = false;
8464   verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
8465                "                        double *min_x,\n"
8466                "                        double *max_x,\n"
8467                "                        double *min_y,\n"
8468                "                        double *max_y,\n"
8469                "                        double *min_z,\n"
8470                "                        double *max_z, ) {}",
8471                NoBinPacking);
8472 }
8473 
8474 TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
8475   verifyFormat("void f() { return; }\n42");
8476   verifyFormat("void f() {\n"
8477                "  if (0)\n"
8478                "    return;\n"
8479                "}\n"
8480                "42");
8481   verifyFormat("void f() { return }\n42");
8482   verifyFormat("void f() {\n"
8483                "  if (0)\n"
8484                "    return\n"
8485                "}\n"
8486                "42");
8487 }
8488 
8489 TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
8490   EXPECT_EQ("void f() { return }", format("void  f ( )  {  return  }"));
8491   EXPECT_EQ("void f() {\n"
8492             "  if (a)\n"
8493             "    return\n"
8494             "}",
8495             format("void  f  (  )  {  if  ( a )  return  }"));
8496   EXPECT_EQ("namespace N {\n"
8497             "void f()\n"
8498             "}",
8499             format("namespace  N  {  void f()  }"));
8500   EXPECT_EQ("namespace N {\n"
8501             "void f() {}\n"
8502             "void g()\n"
8503             "} // namespace N",
8504             format("namespace N  { void f( ) { } void g( ) }"));
8505 }
8506 
8507 TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
8508   verifyFormat("int aaaaaaaa =\n"
8509                "    // Overlylongcomment\n"
8510                "    b;",
8511                getLLVMStyleWithColumns(20));
8512   verifyFormat("function(\n"
8513                "    ShortArgument,\n"
8514                "    LoooooooooooongArgument);\n",
8515                getLLVMStyleWithColumns(20));
8516 }
8517 
8518 TEST_F(FormatTest, IncorrectAccessSpecifier) {
8519   verifyFormat("public:");
8520   verifyFormat("class A {\n"
8521                "public\n"
8522                "  void f() {}\n"
8523                "};");
8524   verifyFormat("public\n"
8525                "int qwerty;");
8526   verifyFormat("public\n"
8527                "B {}");
8528   verifyFormat("public\n"
8529                "{}");
8530   verifyFormat("public\n"
8531                "B { int x; }");
8532 }
8533 
8534 TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
8535   verifyFormat("{");
8536   verifyFormat("#})");
8537   verifyNoCrash("(/**/[:!] ?[).");
8538 }
8539 
8540 TEST_F(FormatTest, IncorrectUnbalancedBracesInMacrosWithUnicode) {
8541   // Found by oss-fuzz:
8542   // https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=8212
8543   FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp);
8544   Style.ColumnLimit = 60;
8545   verifyNoCrash(
8546       "\x23\x47\xff\x20\x28\xff\x3c\xff\x3f\xff\x20\x2f\x7b\x7a\xff\x20"
8547       "\xff\xff\xff\xca\xb5\xff\xff\xff\xff\x3a\x7b\x7d\xff\x20\xff\x20"
8548       "\xff\x74\xff\x20\x7d\x7d\xff\x7b\x3a\xff\x20\x71\xff\x20\xff\x0a",
8549       Style);
8550 }
8551 
8552 TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
8553   verifyFormat("do {\n}");
8554   verifyFormat("do {\n}\n"
8555                "f();");
8556   verifyFormat("do {\n}\n"
8557                "wheeee(fun);");
8558   verifyFormat("do {\n"
8559                "  f();\n"
8560                "}");
8561 }
8562 
8563 TEST_F(FormatTest, IncorrectCodeMissingParens) {
8564   verifyFormat("if {\n  foo;\n  foo();\n}");
8565   verifyFormat("switch {\n  foo;\n  foo();\n}");
8566   verifyIncompleteFormat("for {\n  foo;\n  foo();\n}");
8567   verifyFormat("while {\n  foo;\n  foo();\n}");
8568   verifyFormat("do {\n  foo;\n  foo();\n} while;");
8569 }
8570 
8571 TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
8572   verifyIncompleteFormat("namespace {\n"
8573                          "class Foo { Foo (\n"
8574                          "};\n"
8575                          "} // namespace");
8576 }
8577 
8578 TEST_F(FormatTest, IncorrectCodeErrorDetection) {
8579   EXPECT_EQ("{\n  {}\n", format("{\n{\n}\n"));
8580   EXPECT_EQ("{\n  {}\n", format("{\n  {\n}\n"));
8581   EXPECT_EQ("{\n  {}\n", format("{\n  {\n  }\n"));
8582   EXPECT_EQ("{\n  {}\n}\n}\n", format("{\n  {\n    }\n  }\n}\n"));
8583 
8584   EXPECT_EQ("{\n"
8585             "  {\n"
8586             "    breakme(\n"
8587             "        qwe);\n"
8588             "  }\n",
8589             format("{\n"
8590                    "    {\n"
8591                    " breakme(qwe);\n"
8592                    "}\n",
8593                    getLLVMStyleWithColumns(10)));
8594 }
8595 
8596 TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
8597   verifyFormat("int x = {\n"
8598                "    avariable,\n"
8599                "    b(alongervariable)};",
8600                getLLVMStyleWithColumns(25));
8601 }
8602 
8603 TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
8604   verifyFormat("return (a)(b){1, 2, 3};");
8605 }
8606 
8607 TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
8608   verifyFormat("vector<int> x{1, 2, 3, 4};");
8609   verifyFormat("vector<int> x{\n"
8610                "    1,\n"
8611                "    2,\n"
8612                "    3,\n"
8613                "    4,\n"
8614                "};");
8615   verifyFormat("vector<T> x{{}, {}, {}, {}};");
8616   verifyFormat("f({1, 2});");
8617   verifyFormat("auto v = Foo{-1};");
8618   verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
8619   verifyFormat("Class::Class : member{1, 2, 3} {}");
8620   verifyFormat("new vector<int>{1, 2, 3};");
8621   verifyFormat("new int[3]{1, 2, 3};");
8622   verifyFormat("new int{1};");
8623   verifyFormat("return {arg1, arg2};");
8624   verifyFormat("return {arg1, SomeType{parameter}};");
8625   verifyFormat("int count = set<int>{f(), g(), h()}.size();");
8626   verifyFormat("new T{arg1, arg2};");
8627   verifyFormat("f(MyMap[{composite, key}]);");
8628   verifyFormat("class Class {\n"
8629                "  T member = {arg1, arg2};\n"
8630                "};");
8631   verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
8632   verifyFormat("const struct A a = {.a = 1, .b = 2};");
8633   verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
8634   verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
8635   verifyFormat("int a = std::is_integral<int>{} + 0;");
8636 
8637   verifyFormat("int foo(int i) { return fo1{}(i); }");
8638   verifyFormat("int foo(int i) { return fo1{}(i); }");
8639   verifyFormat("auto i = decltype(x){};");
8640   verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
8641   verifyFormat("Node n{1, Node{1000}, //\n"
8642                "       2};");
8643   verifyFormat("Aaaa aaaaaaa{\n"
8644                "    {\n"
8645                "        aaaa,\n"
8646                "    },\n"
8647                "};");
8648   verifyFormat("class C : public D {\n"
8649                "  SomeClass SC{2};\n"
8650                "};");
8651   verifyFormat("class C : public A {\n"
8652                "  class D : public B {\n"
8653                "    void f() { int i{2}; }\n"
8654                "  };\n"
8655                "};");
8656   verifyFormat("#define A {a, a},");
8657 
8658   // Avoid breaking between equal sign and opening brace
8659   FormatStyle AvoidBreakingFirstArgument = getLLVMStyle();
8660   AvoidBreakingFirstArgument.PenaltyBreakBeforeFirstCallParameter = 200;
8661   verifyFormat("const std::unordered_map<std::string, int> MyHashTable =\n"
8662                "    {{\"aaaaaaaaaaaaaaaaaaaaa\", 0},\n"
8663                "     {\"bbbbbbbbbbbbbbbbbbbbb\", 1},\n"
8664                "     {\"ccccccccccccccccccccc\", 2}};",
8665                AvoidBreakingFirstArgument);
8666 
8667   // Binpacking only if there is no trailing comma
8668   verifyFormat("const Aaaaaa aaaaa = {aaaaaaaaaa, bbbbbbbbbb,\n"
8669                "                      cccccccccc, dddddddddd};",
8670                getLLVMStyleWithColumns(50));
8671   verifyFormat("const Aaaaaa aaaaa = {\n"
8672                "    aaaaaaaaaaa,\n"
8673                "    bbbbbbbbbbb,\n"
8674                "    ccccccccccc,\n"
8675                "    ddddddddddd,\n"
8676                "};",
8677                getLLVMStyleWithColumns(50));
8678 
8679   // Cases where distinguising braced lists and blocks is hard.
8680   verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
8681   verifyFormat("void f() {\n"
8682                "  return; // comment\n"
8683                "}\n"
8684                "SomeType t;");
8685   verifyFormat("void f() {\n"
8686                "  if (a) {\n"
8687                "    f();\n"
8688                "  }\n"
8689                "}\n"
8690                "SomeType t;");
8691 
8692   // In combination with BinPackArguments = false.
8693   FormatStyle NoBinPacking = getLLVMStyle();
8694   NoBinPacking.BinPackArguments = false;
8695   verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
8696                "                      bbbbb,\n"
8697                "                      ccccc,\n"
8698                "                      ddddd,\n"
8699                "                      eeeee,\n"
8700                "                      ffffff,\n"
8701                "                      ggggg,\n"
8702                "                      hhhhhh,\n"
8703                "                      iiiiii,\n"
8704                "                      jjjjjj,\n"
8705                "                      kkkkkk};",
8706                NoBinPacking);
8707   verifyFormat("const Aaaaaa aaaaa = {\n"
8708                "    aaaaa,\n"
8709                "    bbbbb,\n"
8710                "    ccccc,\n"
8711                "    ddddd,\n"
8712                "    eeeee,\n"
8713                "    ffffff,\n"
8714                "    ggggg,\n"
8715                "    hhhhhh,\n"
8716                "    iiiiii,\n"
8717                "    jjjjjj,\n"
8718                "    kkkkkk,\n"
8719                "};",
8720                NoBinPacking);
8721   verifyFormat(
8722       "const Aaaaaa aaaaa = {\n"
8723       "    aaaaa,  bbbbb,  ccccc,  ddddd,  eeeee,  ffffff, ggggg, hhhhhh,\n"
8724       "    iiiiii, jjjjjj, kkkkkk, aaaaa,  bbbbb,  ccccc,  ddddd, eeeee,\n"
8725       "    ffffff, ggggg,  hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
8726       "};",
8727       NoBinPacking);
8728 
8729   NoBinPacking.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
8730   EXPECT_EQ("static uint8 CddDp83848Reg[] = {\n"
8731             "    CDDDP83848_BMCR_REGISTER,\n"
8732             "    CDDDP83848_BMSR_REGISTER,\n"
8733             "    CDDDP83848_RBR_REGISTER};",
8734             format("static uint8 CddDp83848Reg[] = {CDDDP83848_BMCR_REGISTER,\n"
8735                    "                                CDDDP83848_BMSR_REGISTER,\n"
8736                    "                                CDDDP83848_RBR_REGISTER};",
8737                    NoBinPacking));
8738 
8739   // FIXME: The alignment of these trailing comments might be bad. Then again,
8740   // this might be utterly useless in real code.
8741   verifyFormat("Constructor::Constructor()\n"
8742                "    : some_value{         //\n"
8743                "                 aaaaaaa, //\n"
8744                "                 bbbbbbb} {}");
8745 
8746   // In braced lists, the first comment is always assumed to belong to the
8747   // first element. Thus, it can be moved to the next or previous line as
8748   // appropriate.
8749   EXPECT_EQ("function({// First element:\n"
8750             "          1,\n"
8751             "          // Second element:\n"
8752             "          2});",
8753             format("function({\n"
8754                    "    // First element:\n"
8755                    "    1,\n"
8756                    "    // Second element:\n"
8757                    "    2});"));
8758   EXPECT_EQ("std::vector<int> MyNumbers{\n"
8759             "    // First element:\n"
8760             "    1,\n"
8761             "    // Second element:\n"
8762             "    2};",
8763             format("std::vector<int> MyNumbers{// First element:\n"
8764                    "                           1,\n"
8765                    "                           // Second element:\n"
8766                    "                           2};",
8767                    getLLVMStyleWithColumns(30)));
8768   // A trailing comma should still lead to an enforced line break and no
8769   // binpacking.
8770   EXPECT_EQ("vector<int> SomeVector = {\n"
8771             "    // aaa\n"
8772             "    1,\n"
8773             "    2,\n"
8774             "};",
8775             format("vector<int> SomeVector = { // aaa\n"
8776                    "    1, 2, };"));
8777 
8778   // C++11 brace initializer list l-braces should not be treated any differently
8779   // when breaking before lambda bodies is enabled
8780   FormatStyle BreakBeforeLambdaBody = getLLVMStyle();
8781   BreakBeforeLambdaBody.BreakBeforeBraces = FormatStyle::BS_Custom;
8782   BreakBeforeLambdaBody.BraceWrapping.BeforeLambdaBody = true;
8783   BreakBeforeLambdaBody.AlwaysBreakBeforeMultilineStrings = true;
8784   verifyFormat(
8785       "std::runtime_error{\n"
8786       "    \"Long string which will force a break onto the next line...\"};",
8787       BreakBeforeLambdaBody);
8788 
8789   FormatStyle ExtraSpaces = getLLVMStyle();
8790   ExtraSpaces.Cpp11BracedListStyle = false;
8791   ExtraSpaces.ColumnLimit = 75;
8792   verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
8793   verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
8794   verifyFormat("f({ 1, 2 });", ExtraSpaces);
8795   verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
8796   verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
8797   verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
8798   verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
8799   verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
8800   verifyFormat("return { arg1, arg2 };", ExtraSpaces);
8801   verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
8802   verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
8803   verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
8804   verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
8805   verifyFormat("class Class {\n"
8806                "  T member = { arg1, arg2 };\n"
8807                "};",
8808                ExtraSpaces);
8809   verifyFormat(
8810       "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
8811       "                                 aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
8812       "                  : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
8813       "                                 bbbbbbbbbbbbbbbbbbbb, bbbbb };",
8814       ExtraSpaces);
8815   verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
8816   verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
8817                ExtraSpaces);
8818   verifyFormat(
8819       "someFunction(OtherParam,\n"
8820       "             BracedList{ // comment 1 (Forcing interesting break)\n"
8821       "                         param1, param2,\n"
8822       "                         // comment 2\n"
8823       "                         param3, param4 });",
8824       ExtraSpaces);
8825   verifyFormat(
8826       "std::this_thread::sleep_for(\n"
8827       "    std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
8828       ExtraSpaces);
8829   verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n"
8830                "    aaaaaaa,\n"
8831                "    aaaaaaaaaa,\n"
8832                "    aaaaa,\n"
8833                "    aaaaaaaaaaaaaaa,\n"
8834                "    aaa,\n"
8835                "    aaaaaaaaaa,\n"
8836                "    a,\n"
8837                "    aaaaaaaaaaaaaaaaaaaaa,\n"
8838                "    aaaaaaaaaaaa,\n"
8839                "    aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
8840                "    aaaaaaa,\n"
8841                "    a};");
8842   verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
8843   verifyFormat("const struct A a = { .a = 1, .b = 2 };", ExtraSpaces);
8844   verifyFormat("const struct A a = { [0] = 1, [1] = 2 };", ExtraSpaces);
8845 
8846   // Avoid breaking between initializer/equal sign and opening brace
8847   ExtraSpaces.PenaltyBreakBeforeFirstCallParameter = 200;
8848   verifyFormat("const std::unordered_map<std::string, int> MyHashTable = {\n"
8849                "  { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n"
8850                "  { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n"
8851                "  { \"ccccccccccccccccccccc\", 2 }\n"
8852                "};",
8853                ExtraSpaces);
8854   verifyFormat("const std::unordered_map<std::string, int> MyHashTable{\n"
8855                "  { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n"
8856                "  { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n"
8857                "  { \"ccccccccccccccccccccc\", 2 }\n"
8858                "};",
8859                ExtraSpaces);
8860 
8861   FormatStyle SpaceBeforeBrace = getLLVMStyle();
8862   SpaceBeforeBrace.SpaceBeforeCpp11BracedList = true;
8863   verifyFormat("vector<int> x {1, 2, 3, 4};", SpaceBeforeBrace);
8864   verifyFormat("f({}, {{}, {}}, MyMap[{k, v}]);", SpaceBeforeBrace);
8865 
8866   FormatStyle SpaceBetweenBraces = getLLVMStyle();
8867   SpaceBetweenBraces.SpacesInAngles = true;
8868   SpaceBetweenBraces.SpacesInParentheses = true;
8869   SpaceBetweenBraces.SpacesInSquareBrackets = true;
8870   verifyFormat("vector< int > x{ 1, 2, 3, 4 };", SpaceBetweenBraces);
8871   verifyFormat("f( {}, { {}, {} }, MyMap[ { k, v } ] );", SpaceBetweenBraces);
8872   verifyFormat("vector< int > x{ // comment 1\n"
8873                "                 1, 2, 3, 4 };",
8874                SpaceBetweenBraces);
8875   SpaceBetweenBraces.ColumnLimit = 20;
8876   EXPECT_EQ("vector< int > x{\n"
8877             "    1, 2, 3, 4 };",
8878             format("vector<int>x{1,2,3,4};", SpaceBetweenBraces));
8879   SpaceBetweenBraces.ColumnLimit = 24;
8880   EXPECT_EQ("vector< int > x{ 1, 2,\n"
8881             "                 3, 4 };",
8882             format("vector<int>x{1,2,3,4};", SpaceBetweenBraces));
8883   EXPECT_EQ("vector< int > x{\n"
8884             "    1,\n"
8885             "    2,\n"
8886             "    3,\n"
8887             "    4,\n"
8888             "};",
8889             format("vector<int>x{1,2,3,4,};", SpaceBetweenBraces));
8890   verifyFormat("vector< int > x{};", SpaceBetweenBraces);
8891   SpaceBetweenBraces.SpaceInEmptyParentheses = true;
8892   verifyFormat("vector< int > x{ };", SpaceBetweenBraces);
8893 }
8894 
8895 TEST_F(FormatTest, FormatSpacesInAngles) {
8896   FormatStyle SpaceInAngles = getLLVMStyle();
8897   SpaceInAngles.SpacesInAngles = true;
8898   verifyFormat("vector< ::std::string > x1;", SpaceInAngles);
8899   verifyFormat("Foo< int, Bar > x2;", SpaceInAngles);
8900   verifyFormat("Foo< ::int, ::Bar > x3;", SpaceInAngles);
8901 
8902   SpaceInAngles.SpacesInAngles = false;
8903   verifyFormat("vector<::std::string> x4;", SpaceInAngles);
8904   verifyFormat("vector<int> x5;", SpaceInAngles);
8905   verifyFormat("Foo<int, Bar> x6;", SpaceInAngles);
8906   verifyFormat("Foo<::int, ::Bar> x7;", SpaceInAngles);
8907 }
8908 
8909 TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
8910   verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8911                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8912                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8913                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8914                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8915                "                 1, 22, 333, 4444, 55555, 666666, 7777777};");
8916   verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
8917                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8918                "                 1, 22, 333, 4444, 55555, //\n"
8919                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8920                "                 1, 22, 333, 4444, 55555, 666666, 7777777};");
8921   verifyFormat(
8922       "vector<int> x = {1,       22, 333, 4444, 55555, 666666, 7777777,\n"
8923       "                 1,       22, 333, 4444, 55555, 666666, 7777777,\n"
8924       "                 1,       22, 333, 4444, 55555, 666666, // comment\n"
8925       "                 7777777, 1,  22,  333,  4444,  55555,  666666,\n"
8926       "                 7777777, 1,  22,  333,  4444,  55555,  666666,\n"
8927       "                 7777777, 1,  22,  333,  4444,  55555,  666666,\n"
8928       "                 7777777};");
8929   verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
8930                "    X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
8931                "    X86::R8,  X86::R9,  X86::R10, X86::R11, 0};");
8932   verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
8933                "    X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
8934                "    // Separating comment.\n"
8935                "    X86::R8, X86::R9, X86::R10, X86::R11, 0};");
8936   verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
8937                "    // Leading comment\n"
8938                "    X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
8939                "    X86::R8,  X86::R9,  X86::R10, X86::R11, 0};");
8940   verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
8941                "                 1, 1, 1, 1};",
8942                getLLVMStyleWithColumns(39));
8943   verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
8944                "                 1, 1, 1, 1};",
8945                getLLVMStyleWithColumns(38));
8946   verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
8947                "    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
8948                getLLVMStyleWithColumns(43));
8949   verifyFormat(
8950       "static unsigned SomeValues[10][3] = {\n"
8951       "    {1, 4, 0},  {4, 9, 0},  {4, 5, 9},  {8, 5, 4}, {1, 8, 4},\n"
8952       "    {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
8953   verifyFormat("static auto fields = new vector<string>{\n"
8954                "    \"aaaaaaaaaaaaa\",\n"
8955                "    \"aaaaaaaaaaaaa\",\n"
8956                "    \"aaaaaaaaaaaa\",\n"
8957                "    \"aaaaaaaaaaaaaa\",\n"
8958                "    \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
8959                "    \"aaaaaaaaaaaa\",\n"
8960                "    \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
8961                "};");
8962   verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
8963   verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
8964                "                 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
8965                "                 3, cccccccccccccccccccccc};",
8966                getLLVMStyleWithColumns(60));
8967 
8968   // Trailing commas.
8969   verifyFormat("vector<int> x = {\n"
8970                "    1, 1, 1, 1, 1, 1, 1, 1,\n"
8971                "};",
8972                getLLVMStyleWithColumns(39));
8973   verifyFormat("vector<int> x = {\n"
8974                "    1, 1, 1, 1, 1, 1, 1, 1, //\n"
8975                "};",
8976                getLLVMStyleWithColumns(39));
8977   verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
8978                "                 1, 1, 1, 1,\n"
8979                "                 /**/ /**/};",
8980                getLLVMStyleWithColumns(39));
8981 
8982   // Trailing comment in the first line.
8983   verifyFormat("vector<int> iiiiiiiiiiiiiii = {                      //\n"
8984                "    1111111111, 2222222222, 33333333333, 4444444444, //\n"
8985                "    111111111,  222222222,  3333333333,  444444444,  //\n"
8986                "    11111111,   22222222,   333333333,   44444444};");
8987   // Trailing comment in the last line.
8988   verifyFormat("int aaaaa[] = {\n"
8989                "    1, 2, 3, // comment\n"
8990                "    4, 5, 6  // comment\n"
8991                "};");
8992 
8993   // With nested lists, we should either format one item per line or all nested
8994   // lists one on line.
8995   // FIXME: For some nested lists, we can do better.
8996   verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
8997                "        {aaaaaaaaaaaaaaaaaaa},\n"
8998                "        {aaaaaaaaaaaaaaaaaaaaa},\n"
8999                "        {aaaaaaaaaaaaaaaaa}};",
9000                getLLVMStyleWithColumns(60));
9001   verifyFormat(
9002       "SomeStruct my_struct_array = {\n"
9003       "    {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
9004       "     aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
9005       "    {aaa, aaa},\n"
9006       "    {aaa, aaa},\n"
9007       "    {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
9008       "    {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
9009       "     aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
9010 
9011   // No column layout should be used here.
9012   verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
9013                "                   bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
9014 
9015   verifyNoCrash("a<,");
9016 
9017   // No braced initializer here.
9018   verifyFormat("void f() {\n"
9019                "  struct Dummy {};\n"
9020                "  f(v);\n"
9021                "}");
9022 
9023   // Long lists should be formatted in columns even if they are nested.
9024   verifyFormat(
9025       "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
9026       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
9027       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
9028       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
9029       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
9030       "                          1, 22, 333, 4444, 55555, 666666, 7777777});");
9031 
9032   // Allow "single-column" layout even if that violates the column limit. There
9033   // isn't going to be a better way.
9034   verifyFormat("std::vector<int> a = {\n"
9035                "    aaaaaaaa,\n"
9036                "    aaaaaaaa,\n"
9037                "    aaaaaaaa,\n"
9038                "    aaaaaaaa,\n"
9039                "    aaaaaaaaaa,\n"
9040                "    aaaaaaaa,\n"
9041                "    aaaaaaaaaaaaaaaaaaaaaaaaaaa};",
9042                getLLVMStyleWithColumns(30));
9043   verifyFormat("vector<int> aaaa = {\n"
9044                "    aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
9045                "    aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
9046                "    aaaaaa.aaaaaaa,\n"
9047                "    aaaaaa.aaaaaaa,\n"
9048                "    aaaaaa.aaaaaaa,\n"
9049                "    aaaaaa.aaaaaaa,\n"
9050                "};");
9051 
9052   // Don't create hanging lists.
9053   verifyFormat("someFunction(Param, {List1, List2,\n"
9054                "                     List3});",
9055                getLLVMStyleWithColumns(35));
9056   verifyFormat("someFunction(Param, Param,\n"
9057                "             {List1, List2,\n"
9058                "              List3});",
9059                getLLVMStyleWithColumns(35));
9060   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n"
9061                "                               aaaaaaaaaaaaaaaaaaaaaaa);");
9062 }
9063 
9064 TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
9065   FormatStyle DoNotMerge = getLLVMStyle();
9066   DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
9067 
9068   verifyFormat("void f() { return 42; }");
9069   verifyFormat("void f() {\n"
9070                "  return 42;\n"
9071                "}",
9072                DoNotMerge);
9073   verifyFormat("void f() {\n"
9074                "  // Comment\n"
9075                "}");
9076   verifyFormat("{\n"
9077                "#error {\n"
9078                "  int a;\n"
9079                "}");
9080   verifyFormat("{\n"
9081                "  int a;\n"
9082                "#error {\n"
9083                "}");
9084   verifyFormat("void f() {} // comment");
9085   verifyFormat("void f() { int a; } // comment");
9086   verifyFormat("void f() {\n"
9087                "} // comment",
9088                DoNotMerge);
9089   verifyFormat("void f() {\n"
9090                "  int a;\n"
9091                "} // comment",
9092                DoNotMerge);
9093   verifyFormat("void f() {\n"
9094                "} // comment",
9095                getLLVMStyleWithColumns(15));
9096 
9097   verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
9098   verifyFormat("void f() {\n  return 42;\n}", getLLVMStyleWithColumns(22));
9099 
9100   verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
9101   verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
9102   verifyFormat("class C {\n"
9103                "  C()\n"
9104                "      : iiiiiiii(nullptr),\n"
9105                "        kkkkkkk(nullptr),\n"
9106                "        mmmmmmm(nullptr),\n"
9107                "        nnnnnnn(nullptr) {}\n"
9108                "};",
9109                getGoogleStyle());
9110 
9111   FormatStyle NoColumnLimit = getLLVMStyle();
9112   NoColumnLimit.ColumnLimit = 0;
9113   EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
9114   EXPECT_EQ("class C {\n"
9115             "  A() : b(0) {}\n"
9116             "};",
9117             format("class C{A():b(0){}};", NoColumnLimit));
9118   EXPECT_EQ("A()\n"
9119             "    : b(0) {\n"
9120             "}",
9121             format("A()\n:b(0)\n{\n}", NoColumnLimit));
9122 
9123   FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
9124   DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
9125       FormatStyle::SFS_None;
9126   EXPECT_EQ("A()\n"
9127             "    : b(0) {\n"
9128             "}",
9129             format("A():b(0){}", DoNotMergeNoColumnLimit));
9130   EXPECT_EQ("A()\n"
9131             "    : b(0) {\n"
9132             "}",
9133             format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
9134 
9135   verifyFormat("#define A          \\\n"
9136                "  void f() {       \\\n"
9137                "    int i;         \\\n"
9138                "  }",
9139                getLLVMStyleWithColumns(20));
9140   verifyFormat("#define A           \\\n"
9141                "  void f() { int i; }",
9142                getLLVMStyleWithColumns(21));
9143   verifyFormat("#define A            \\\n"
9144                "  void f() {         \\\n"
9145                "    int i;           \\\n"
9146                "  }                  \\\n"
9147                "  int j;",
9148                getLLVMStyleWithColumns(22));
9149   verifyFormat("#define A             \\\n"
9150                "  void f() { int i; } \\\n"
9151                "  int j;",
9152                getLLVMStyleWithColumns(23));
9153 }
9154 
9155 TEST_F(FormatTest, PullEmptyFunctionDefinitionsIntoSingleLine) {
9156   FormatStyle MergeEmptyOnly = getLLVMStyle();
9157   MergeEmptyOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
9158   verifyFormat("class C {\n"
9159                "  int f() {}\n"
9160                "};",
9161                MergeEmptyOnly);
9162   verifyFormat("class C {\n"
9163                "  int f() {\n"
9164                "    return 42;\n"
9165                "  }\n"
9166                "};",
9167                MergeEmptyOnly);
9168   verifyFormat("int f() {}", MergeEmptyOnly);
9169   verifyFormat("int f() {\n"
9170                "  return 42;\n"
9171                "}",
9172                MergeEmptyOnly);
9173 
9174   // Also verify behavior when BraceWrapping.AfterFunction = true
9175   MergeEmptyOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
9176   MergeEmptyOnly.BraceWrapping.AfterFunction = true;
9177   verifyFormat("int f() {}", MergeEmptyOnly);
9178   verifyFormat("class C {\n"
9179                "  int f() {}\n"
9180                "};",
9181                MergeEmptyOnly);
9182 }
9183 
9184 TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
9185   FormatStyle MergeInlineOnly = getLLVMStyle();
9186   MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
9187   verifyFormat("class C {\n"
9188                "  int f() { return 42; }\n"
9189                "};",
9190                MergeInlineOnly);
9191   verifyFormat("int f() {\n"
9192                "  return 42;\n"
9193                "}",
9194                MergeInlineOnly);
9195 
9196   // SFS_Inline implies SFS_Empty
9197   verifyFormat("class C {\n"
9198                "  int f() {}\n"
9199                "};",
9200                MergeInlineOnly);
9201   verifyFormat("int f() {}", MergeInlineOnly);
9202 
9203   // Also verify behavior when BraceWrapping.AfterFunction = true
9204   MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
9205   MergeInlineOnly.BraceWrapping.AfterFunction = true;
9206   verifyFormat("class C {\n"
9207                "  int f() { return 42; }\n"
9208                "};",
9209                MergeInlineOnly);
9210   verifyFormat("int f()\n"
9211                "{\n"
9212                "  return 42;\n"
9213                "}",
9214                MergeInlineOnly);
9215 
9216   // SFS_Inline implies SFS_Empty
9217   verifyFormat("int f() {}", MergeInlineOnly);
9218   verifyFormat("class C {\n"
9219                "  int f() {}\n"
9220                "};",
9221                MergeInlineOnly);
9222 }
9223 
9224 TEST_F(FormatTest, PullInlineOnlyFunctionDefinitionsIntoSingleLine) {
9225   FormatStyle MergeInlineOnly = getLLVMStyle();
9226   MergeInlineOnly.AllowShortFunctionsOnASingleLine =
9227       FormatStyle::SFS_InlineOnly;
9228   verifyFormat("class C {\n"
9229                "  int f() { return 42; }\n"
9230                "};",
9231                MergeInlineOnly);
9232   verifyFormat("int f() {\n"
9233                "  return 42;\n"
9234                "}",
9235                MergeInlineOnly);
9236 
9237   // SFS_InlineOnly does not imply SFS_Empty
9238   verifyFormat("class C {\n"
9239                "  int f() {}\n"
9240                "};",
9241                MergeInlineOnly);
9242   verifyFormat("int f() {\n"
9243                "}",
9244                MergeInlineOnly);
9245 
9246   // Also verify behavior when BraceWrapping.AfterFunction = true
9247   MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
9248   MergeInlineOnly.BraceWrapping.AfterFunction = true;
9249   verifyFormat("class C {\n"
9250                "  int f() { return 42; }\n"
9251                "};",
9252                MergeInlineOnly);
9253   verifyFormat("int f()\n"
9254                "{\n"
9255                "  return 42;\n"
9256                "}",
9257                MergeInlineOnly);
9258 
9259   // SFS_InlineOnly does not imply SFS_Empty
9260   verifyFormat("int f()\n"
9261                "{\n"
9262                "}",
9263                MergeInlineOnly);
9264   verifyFormat("class C {\n"
9265                "  int f() {}\n"
9266                "};",
9267                MergeInlineOnly);
9268 }
9269 
9270 TEST_F(FormatTest, SplitEmptyFunction) {
9271   FormatStyle Style = getLLVMStyle();
9272   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
9273   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
9274   Style.BraceWrapping.AfterFunction = true;
9275   Style.BraceWrapping.SplitEmptyFunction = false;
9276   Style.ColumnLimit = 40;
9277 
9278   verifyFormat("int f()\n"
9279                "{}",
9280                Style);
9281   verifyFormat("int f()\n"
9282                "{\n"
9283                "  return 42;\n"
9284                "}",
9285                Style);
9286   verifyFormat("int f()\n"
9287                "{\n"
9288                "  // some comment\n"
9289                "}",
9290                Style);
9291 
9292   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
9293   verifyFormat("int f() {}", Style);
9294   verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
9295                "{}",
9296                Style);
9297   verifyFormat("int f()\n"
9298                "{\n"
9299                "  return 0;\n"
9300                "}",
9301                Style);
9302 
9303   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
9304   verifyFormat("class Foo {\n"
9305                "  int f() {}\n"
9306                "};\n",
9307                Style);
9308   verifyFormat("class Foo {\n"
9309                "  int f() { return 0; }\n"
9310                "};\n",
9311                Style);
9312   verifyFormat("class Foo {\n"
9313                "  int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
9314                "  {}\n"
9315                "};\n",
9316                Style);
9317   verifyFormat("class Foo {\n"
9318                "  int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
9319                "  {\n"
9320                "    return 0;\n"
9321                "  }\n"
9322                "};\n",
9323                Style);
9324 
9325   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
9326   verifyFormat("int f() {}", Style);
9327   verifyFormat("int f() { return 0; }", Style);
9328   verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
9329                "{}",
9330                Style);
9331   verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
9332                "{\n"
9333                "  return 0;\n"
9334                "}",
9335                Style);
9336 }
9337 TEST_F(FormatTest, KeepShortFunctionAfterPPElse) {
9338   FormatStyle Style = getLLVMStyle();
9339   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
9340   verifyFormat("#ifdef A\n"
9341                "int f() {}\n"
9342                "#else\n"
9343                "int g() {}\n"
9344                "#endif",
9345                Style);
9346 }
9347 
9348 TEST_F(FormatTest, SplitEmptyClass) {
9349   FormatStyle Style = getLLVMStyle();
9350   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
9351   Style.BraceWrapping.AfterClass = true;
9352   Style.BraceWrapping.SplitEmptyRecord = false;
9353 
9354   verifyFormat("class Foo\n"
9355                "{};",
9356                Style);
9357   verifyFormat("/* something */ class Foo\n"
9358                "{};",
9359                Style);
9360   verifyFormat("template <typename X> class Foo\n"
9361                "{};",
9362                Style);
9363   verifyFormat("class Foo\n"
9364                "{\n"
9365                "  Foo();\n"
9366                "};",
9367                Style);
9368   verifyFormat("typedef class Foo\n"
9369                "{\n"
9370                "} Foo_t;",
9371                Style);
9372 }
9373 
9374 TEST_F(FormatTest, SplitEmptyStruct) {
9375   FormatStyle Style = getLLVMStyle();
9376   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
9377   Style.BraceWrapping.AfterStruct = true;
9378   Style.BraceWrapping.SplitEmptyRecord = false;
9379 
9380   verifyFormat("struct Foo\n"
9381                "{};",
9382                Style);
9383   verifyFormat("/* something */ struct Foo\n"
9384                "{};",
9385                Style);
9386   verifyFormat("template <typename X> struct Foo\n"
9387                "{};",
9388                Style);
9389   verifyFormat("struct Foo\n"
9390                "{\n"
9391                "  Foo();\n"
9392                "};",
9393                Style);
9394   verifyFormat("typedef struct Foo\n"
9395                "{\n"
9396                "} Foo_t;",
9397                Style);
9398   // typedef struct Bar {} Bar_t;
9399 }
9400 
9401 TEST_F(FormatTest, SplitEmptyUnion) {
9402   FormatStyle Style = getLLVMStyle();
9403   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
9404   Style.BraceWrapping.AfterUnion = true;
9405   Style.BraceWrapping.SplitEmptyRecord = false;
9406 
9407   verifyFormat("union Foo\n"
9408                "{};",
9409                Style);
9410   verifyFormat("/* something */ union Foo\n"
9411                "{};",
9412                Style);
9413   verifyFormat("union Foo\n"
9414                "{\n"
9415                "  A,\n"
9416                "};",
9417                Style);
9418   verifyFormat("typedef union Foo\n"
9419                "{\n"
9420                "} Foo_t;",
9421                Style);
9422 }
9423 
9424 TEST_F(FormatTest, SplitEmptyNamespace) {
9425   FormatStyle Style = getLLVMStyle();
9426   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
9427   Style.BraceWrapping.AfterNamespace = true;
9428   Style.BraceWrapping.SplitEmptyNamespace = false;
9429 
9430   verifyFormat("namespace Foo\n"
9431                "{};",
9432                Style);
9433   verifyFormat("/* something */ namespace Foo\n"
9434                "{};",
9435                Style);
9436   verifyFormat("inline namespace Foo\n"
9437                "{};",
9438                Style);
9439   verifyFormat("/* something */ inline namespace Foo\n"
9440                "{};",
9441                Style);
9442   verifyFormat("export namespace Foo\n"
9443                "{};",
9444                Style);
9445   verifyFormat("namespace Foo\n"
9446                "{\n"
9447                "void Bar();\n"
9448                "};",
9449                Style);
9450 }
9451 
9452 TEST_F(FormatTest, NeverMergeShortRecords) {
9453   FormatStyle Style = getLLVMStyle();
9454 
9455   verifyFormat("class Foo {\n"
9456                "  Foo();\n"
9457                "};",
9458                Style);
9459   verifyFormat("typedef class Foo {\n"
9460                "  Foo();\n"
9461                "} Foo_t;",
9462                Style);
9463   verifyFormat("struct Foo {\n"
9464                "  Foo();\n"
9465                "};",
9466                Style);
9467   verifyFormat("typedef struct Foo {\n"
9468                "  Foo();\n"
9469                "} Foo_t;",
9470                Style);
9471   verifyFormat("union Foo {\n"
9472                "  A,\n"
9473                "};",
9474                Style);
9475   verifyFormat("typedef union Foo {\n"
9476                "  A,\n"
9477                "} Foo_t;",
9478                Style);
9479   verifyFormat("namespace Foo {\n"
9480                "void Bar();\n"
9481                "};",
9482                Style);
9483 
9484   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
9485   Style.BraceWrapping.AfterClass = true;
9486   Style.BraceWrapping.AfterStruct = true;
9487   Style.BraceWrapping.AfterUnion = true;
9488   Style.BraceWrapping.AfterNamespace = true;
9489   verifyFormat("class Foo\n"
9490                "{\n"
9491                "  Foo();\n"
9492                "};",
9493                Style);
9494   verifyFormat("typedef class Foo\n"
9495                "{\n"
9496                "  Foo();\n"
9497                "} Foo_t;",
9498                Style);
9499   verifyFormat("struct Foo\n"
9500                "{\n"
9501                "  Foo();\n"
9502                "};",
9503                Style);
9504   verifyFormat("typedef struct Foo\n"
9505                "{\n"
9506                "  Foo();\n"
9507                "} Foo_t;",
9508                Style);
9509   verifyFormat("union Foo\n"
9510                "{\n"
9511                "  A,\n"
9512                "};",
9513                Style);
9514   verifyFormat("typedef union Foo\n"
9515                "{\n"
9516                "  A,\n"
9517                "} Foo_t;",
9518                Style);
9519   verifyFormat("namespace Foo\n"
9520                "{\n"
9521                "void Bar();\n"
9522                "};",
9523                Style);
9524 }
9525 
9526 TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
9527   // Elaborate type variable declarations.
9528   verifyFormat("struct foo a = {bar};\nint n;");
9529   verifyFormat("class foo a = {bar};\nint n;");
9530   verifyFormat("union foo a = {bar};\nint n;");
9531 
9532   // Elaborate types inside function definitions.
9533   verifyFormat("struct foo f() {}\nint n;");
9534   verifyFormat("class foo f() {}\nint n;");
9535   verifyFormat("union foo f() {}\nint n;");
9536 
9537   // Templates.
9538   verifyFormat("template <class X> void f() {}\nint n;");
9539   verifyFormat("template <struct X> void f() {}\nint n;");
9540   verifyFormat("template <union X> void f() {}\nint n;");
9541 
9542   // Actual definitions...
9543   verifyFormat("struct {\n} n;");
9544   verifyFormat(
9545       "template <template <class T, class Y>, class Z> class X {\n} n;");
9546   verifyFormat("union Z {\n  int n;\n} x;");
9547   verifyFormat("class MACRO Z {\n} n;");
9548   verifyFormat("class MACRO(X) Z {\n} n;");
9549   verifyFormat("class __attribute__(X) Z {\n} n;");
9550   verifyFormat("class __declspec(X) Z {\n} n;");
9551   verifyFormat("class A##B##C {\n} n;");
9552   verifyFormat("class alignas(16) Z {\n} n;");
9553   verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
9554   verifyFormat("class MACROA MACRO(X) Z {\n} n;");
9555 
9556   // Redefinition from nested context:
9557   verifyFormat("class A::B::C {\n} n;");
9558 
9559   // Template definitions.
9560   verifyFormat(
9561       "template <typename F>\n"
9562       "Matcher(const Matcher<F> &Other,\n"
9563       "        typename enable_if_c<is_base_of<F, T>::value &&\n"
9564       "                             !is_same<F, T>::value>::type * = 0)\n"
9565       "    : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
9566 
9567   // FIXME: This is still incorrectly handled at the formatter side.
9568   verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
9569   verifyFormat("int i = SomeFunction(a<b, a> b);");
9570 
9571   // FIXME:
9572   // This now gets parsed incorrectly as class definition.
9573   // verifyFormat("class A<int> f() {\n}\nint n;");
9574 
9575   // Elaborate types where incorrectly parsing the structural element would
9576   // break the indent.
9577   verifyFormat("if (true)\n"
9578                "  class X x;\n"
9579                "else\n"
9580                "  f();\n");
9581 
9582   // This is simply incomplete. Formatting is not important, but must not crash.
9583   verifyFormat("class A:");
9584 }
9585 
9586 TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
9587   EXPECT_EQ("#error Leave     all         white!!!!! space* alone!\n",
9588             format("#error Leave     all         white!!!!! space* alone!\n"));
9589   EXPECT_EQ(
9590       "#warning Leave     all         white!!!!! space* alone!\n",
9591       format("#warning Leave     all         white!!!!! space* alone!\n"));
9592   EXPECT_EQ("#error 1", format("  #  error   1"));
9593   EXPECT_EQ("#warning 1", format("  #  warning 1"));
9594 }
9595 
9596 TEST_F(FormatTest, FormatHashIfExpressions) {
9597   verifyFormat("#if AAAA && BBBB");
9598   verifyFormat("#if (AAAA && BBBB)");
9599   verifyFormat("#elif (AAAA && BBBB)");
9600   // FIXME: Come up with a better indentation for #elif.
9601   verifyFormat(
9602       "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) &&  \\\n"
9603       "    defined(BBBBBBBB)\n"
9604       "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) &&  \\\n"
9605       "    defined(BBBBBBBB)\n"
9606       "#endif",
9607       getLLVMStyleWithColumns(65));
9608 }
9609 
9610 TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
9611   FormatStyle AllowsMergedIf = getGoogleStyle();
9612   AllowsMergedIf.AllowShortIfStatementsOnASingleLine =
9613       FormatStyle::SIS_WithoutElse;
9614   verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
9615   verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
9616   verifyFormat("if (true)\n#error E\n  return 42;", AllowsMergedIf);
9617   EXPECT_EQ("if (true) return 42;",
9618             format("if (true)\nreturn 42;", AllowsMergedIf));
9619   FormatStyle ShortMergedIf = AllowsMergedIf;
9620   ShortMergedIf.ColumnLimit = 25;
9621   verifyFormat("#define A \\\n"
9622                "  if (true) return 42;",
9623                ShortMergedIf);
9624   verifyFormat("#define A \\\n"
9625                "  f();    \\\n"
9626                "  if (true)\n"
9627                "#define B",
9628                ShortMergedIf);
9629   verifyFormat("#define A \\\n"
9630                "  f();    \\\n"
9631                "  if (true)\n"
9632                "g();",
9633                ShortMergedIf);
9634   verifyFormat("{\n"
9635                "#ifdef A\n"
9636                "  // Comment\n"
9637                "  if (true) continue;\n"
9638                "#endif\n"
9639                "  // Comment\n"
9640                "  if (true) continue;\n"
9641                "}",
9642                ShortMergedIf);
9643   ShortMergedIf.ColumnLimit = 33;
9644   verifyFormat("#define A \\\n"
9645                "  if constexpr (true) return 42;",
9646                ShortMergedIf);
9647   verifyFormat("#define A \\\n"
9648                "  if CONSTEXPR (true) return 42;",
9649                ShortMergedIf);
9650   ShortMergedIf.ColumnLimit = 29;
9651   verifyFormat("#define A                   \\\n"
9652                "  if (aaaaaaaaaa) return 1; \\\n"
9653                "  return 2;",
9654                ShortMergedIf);
9655   ShortMergedIf.ColumnLimit = 28;
9656   verifyFormat("#define A         \\\n"
9657                "  if (aaaaaaaaaa) \\\n"
9658                "    return 1;     \\\n"
9659                "  return 2;",
9660                ShortMergedIf);
9661   verifyFormat("#define A                \\\n"
9662                "  if constexpr (aaaaaaa) \\\n"
9663                "    return 1;            \\\n"
9664                "  return 2;",
9665                ShortMergedIf);
9666   verifyFormat("#define A                \\\n"
9667                "  if CONSTEXPR (aaaaaaa) \\\n"
9668                "    return 1;            \\\n"
9669                "  return 2;",
9670                ShortMergedIf);
9671 }
9672 
9673 TEST_F(FormatTest, FormatStarDependingOnContext) {
9674   verifyFormat("void f(int *a);");
9675   verifyFormat("void f() { f(fint * b); }");
9676   verifyFormat("class A {\n  void f(int *a);\n};");
9677   verifyFormat("class A {\n  int *a;\n};");
9678   verifyFormat("namespace a {\n"
9679                "namespace b {\n"
9680                "class A {\n"
9681                "  void f() {}\n"
9682                "  int *a;\n"
9683                "};\n"
9684                "} // namespace b\n"
9685                "} // namespace a");
9686 }
9687 
9688 TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
9689   verifyFormat("while");
9690   verifyFormat("operator");
9691 }
9692 
9693 TEST_F(FormatTest, SkipsDeeplyNestedLines) {
9694   // This code would be painfully slow to format if we didn't skip it.
9695   std::string Code("A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n" // 20x
9696                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
9697                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
9698                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
9699                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
9700                    "A(1, 1)\n"
9701                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
9702                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
9703                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
9704                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
9705                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
9706                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
9707                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
9708                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
9709                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
9710                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n");
9711   // Deeply nested part is untouched, rest is formatted.
9712   EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
9713             format(std::string("int    i;\n") + Code + "int    j;\n",
9714                    getLLVMStyle(), SC_ExpectIncomplete));
9715 }
9716 
9717 //===----------------------------------------------------------------------===//
9718 // Objective-C tests.
9719 //===----------------------------------------------------------------------===//
9720 
9721 TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
9722   verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
9723   EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
9724             format("-(NSUInteger)indexOfObject:(id)anObject;"));
9725   EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
9726   EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
9727   EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
9728             format("-(NSInteger)Method3:(id)anObject;"));
9729   EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
9730             format("-(NSInteger)Method4:(id)anObject;"));
9731   EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
9732             format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
9733   EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
9734             format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
9735   EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
9736             "forAllCells:(BOOL)flag;",
9737             format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
9738                    "forAllCells:(BOOL)flag;"));
9739 
9740   // Very long objectiveC method declaration.
9741   verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
9742                "    (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
9743   verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
9744                "                    inRange:(NSRange)range\n"
9745                "                   outRange:(NSRange)out_range\n"
9746                "                  outRange1:(NSRange)out_range1\n"
9747                "                  outRange2:(NSRange)out_range2\n"
9748                "                  outRange3:(NSRange)out_range3\n"
9749                "                  outRange4:(NSRange)out_range4\n"
9750                "                  outRange5:(NSRange)out_range5\n"
9751                "                  outRange6:(NSRange)out_range6\n"
9752                "                  outRange7:(NSRange)out_range7\n"
9753                "                  outRange8:(NSRange)out_range8\n"
9754                "                  outRange9:(NSRange)out_range9;");
9755 
9756   // When the function name has to be wrapped.
9757   FormatStyle Style = getLLVMStyle();
9758   // ObjC ignores IndentWrappedFunctionNames when wrapping methods
9759   // and always indents instead.
9760   Style.IndentWrappedFunctionNames = false;
9761   verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
9762                "    veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
9763                "               anotherName:(NSString)bbbbbbbbbbbbbb {\n"
9764                "}",
9765                Style);
9766   Style.IndentWrappedFunctionNames = true;
9767   verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
9768                "    veryLooooooooooongName:(NSString)cccccccccccccc\n"
9769                "               anotherName:(NSString)dddddddddddddd {\n"
9770                "}",
9771                Style);
9772 
9773   verifyFormat("- (int)sum:(vector<int>)numbers;");
9774   verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
9775   // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
9776   // protocol lists (but not for template classes):
9777   // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
9778 
9779   verifyFormat("- (int (*)())foo:(int (*)())f;");
9780   verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
9781 
9782   // If there's no return type (very rare in practice!), LLVM and Google style
9783   // agree.
9784   verifyFormat("- foo;");
9785   verifyFormat("- foo:(int)f;");
9786   verifyGoogleFormat("- foo:(int)foo;");
9787 }
9788 
9789 TEST_F(FormatTest, BreaksStringLiterals) {
9790   EXPECT_EQ("\"some text \"\n"
9791             "\"other\";",
9792             format("\"some text other\";", getLLVMStyleWithColumns(12)));
9793   EXPECT_EQ("\"some text \"\n"
9794             "\"other\";",
9795             format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
9796   EXPECT_EQ(
9797       "#define A  \\\n"
9798       "  \"some \"  \\\n"
9799       "  \"text \"  \\\n"
9800       "  \"other\";",
9801       format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
9802   EXPECT_EQ(
9803       "#define A  \\\n"
9804       "  \"so \"    \\\n"
9805       "  \"text \"  \\\n"
9806       "  \"other\";",
9807       format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
9808 
9809   EXPECT_EQ("\"some text\"",
9810             format("\"some text\"", getLLVMStyleWithColumns(1)));
9811   EXPECT_EQ("\"some text\"",
9812             format("\"some text\"", getLLVMStyleWithColumns(11)));
9813   EXPECT_EQ("\"some \"\n"
9814             "\"text\"",
9815             format("\"some text\"", getLLVMStyleWithColumns(10)));
9816   EXPECT_EQ("\"some \"\n"
9817             "\"text\"",
9818             format("\"some text\"", getLLVMStyleWithColumns(7)));
9819   EXPECT_EQ("\"some\"\n"
9820             "\" tex\"\n"
9821             "\"t\"",
9822             format("\"some text\"", getLLVMStyleWithColumns(6)));
9823   EXPECT_EQ("\"some\"\n"
9824             "\" tex\"\n"
9825             "\" and\"",
9826             format("\"some tex and\"", getLLVMStyleWithColumns(6)));
9827   EXPECT_EQ("\"some\"\n"
9828             "\"/tex\"\n"
9829             "\"/and\"",
9830             format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
9831 
9832   EXPECT_EQ("variable =\n"
9833             "    \"long string \"\n"
9834             "    \"literal\";",
9835             format("variable = \"long string literal\";",
9836                    getLLVMStyleWithColumns(20)));
9837 
9838   EXPECT_EQ("variable = f(\n"
9839             "    \"long string \"\n"
9840             "    \"literal\",\n"
9841             "    short,\n"
9842             "    loooooooooooooooooooong);",
9843             format("variable = f(\"long string literal\", short, "
9844                    "loooooooooooooooooooong);",
9845                    getLLVMStyleWithColumns(20)));
9846 
9847   EXPECT_EQ(
9848       "f(g(\"long string \"\n"
9849       "    \"literal\"),\n"
9850       "  b);",
9851       format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
9852   EXPECT_EQ("f(g(\"long string \"\n"
9853             "    \"literal\",\n"
9854             "    a),\n"
9855             "  b);",
9856             format("f(g(\"long string literal\", a), b);",
9857                    getLLVMStyleWithColumns(20)));
9858   EXPECT_EQ(
9859       "f(\"one two\".split(\n"
9860       "    variable));",
9861       format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
9862   EXPECT_EQ("f(\"one two three four five six \"\n"
9863             "  \"seven\".split(\n"
9864             "      really_looooong_variable));",
9865             format("f(\"one two three four five six seven\"."
9866                    "split(really_looooong_variable));",
9867                    getLLVMStyleWithColumns(33)));
9868 
9869   EXPECT_EQ("f(\"some \"\n"
9870             "  \"text\",\n"
9871             "  other);",
9872             format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
9873 
9874   // Only break as a last resort.
9875   verifyFormat(
9876       "aaaaaaaaaaaaaaaaaaaa(\n"
9877       "    aaaaaaaaaaaaaaaaaaaa,\n"
9878       "    aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
9879 
9880   EXPECT_EQ("\"splitmea\"\n"
9881             "\"trandomp\"\n"
9882             "\"oint\"",
9883             format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
9884 
9885   EXPECT_EQ("\"split/\"\n"
9886             "\"pathat/\"\n"
9887             "\"slashes\"",
9888             format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
9889 
9890   EXPECT_EQ("\"split/\"\n"
9891             "\"pathat/\"\n"
9892             "\"slashes\"",
9893             format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
9894   EXPECT_EQ("\"split at \"\n"
9895             "\"spaces/at/\"\n"
9896             "\"slashes.at.any$\"\n"
9897             "\"non-alphanumeric%\"\n"
9898             "\"1111111111characte\"\n"
9899             "\"rs\"",
9900             format("\"split at "
9901                    "spaces/at/"
9902                    "slashes.at."
9903                    "any$non-"
9904                    "alphanumeric%"
9905                    "1111111111characte"
9906                    "rs\"",
9907                    getLLVMStyleWithColumns(20)));
9908 
9909   // Verify that splitting the strings understands
9910   // Style::AlwaysBreakBeforeMultilineStrings.
9911   EXPECT_EQ("aaaaaaaaaaaa(\n"
9912             "    \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
9913             "    \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
9914             format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
9915                    "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
9916                    "aaaaaaaaaaaaaaaaaaaaaa\");",
9917                    getGoogleStyle()));
9918   EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
9919             "       \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
9920             format("return \"aaaaaaaaaaaaaaaaaaaaaa "
9921                    "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
9922                    "aaaaaaaaaaaaaaaaaaaaaa\";",
9923                    getGoogleStyle()));
9924   EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
9925             "                \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
9926             format("llvm::outs() << "
9927                    "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
9928                    "aaaaaaaaaaaaaaaaaaa\";"));
9929   EXPECT_EQ("ffff(\n"
9930             "    {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
9931             "     \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
9932             format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
9933                    "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
9934                    getGoogleStyle()));
9935 
9936   FormatStyle Style = getLLVMStyleWithColumns(12);
9937   Style.BreakStringLiterals = false;
9938   EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
9939 
9940   FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
9941   AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
9942   EXPECT_EQ("#define A \\\n"
9943             "  \"some \" \\\n"
9944             "  \"text \" \\\n"
9945             "  \"other\";",
9946             format("#define A \"some text other\";", AlignLeft));
9947 }
9948 
9949 TEST_F(FormatTest, BreaksStringLiteralsAtColumnLimit) {
9950   EXPECT_EQ("C a = \"some more \"\n"
9951             "      \"text\";",
9952             format("C a = \"some more text\";", getLLVMStyleWithColumns(18)));
9953 }
9954 
9955 TEST_F(FormatTest, FullyRemoveEmptyLines) {
9956   FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
9957   NoEmptyLines.MaxEmptyLinesToKeep = 0;
9958   EXPECT_EQ("int i = a(b());",
9959             format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
9960 }
9961 
9962 TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
9963   EXPECT_EQ(
9964       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
9965       "(\n"
9966       "    \"x\t\");",
9967       format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
9968              "aaaaaaa("
9969              "\"x\t\");"));
9970 }
9971 
9972 TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
9973   EXPECT_EQ(
9974       "u8\"utf8 string \"\n"
9975       "u8\"literal\";",
9976       format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
9977   EXPECT_EQ(
9978       "u\"utf16 string \"\n"
9979       "u\"literal\";",
9980       format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
9981   EXPECT_EQ(
9982       "U\"utf32 string \"\n"
9983       "U\"literal\";",
9984       format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
9985   EXPECT_EQ("L\"wide string \"\n"
9986             "L\"literal\";",
9987             format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
9988   EXPECT_EQ("@\"NSString \"\n"
9989             "@\"literal\";",
9990             format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
9991   verifyFormat(R"(NSString *s = @"那那那那";)", getLLVMStyleWithColumns(26));
9992 
9993   // This input makes clang-format try to split the incomplete unicode escape
9994   // sequence, which used to lead to a crasher.
9995   verifyNoCrash(
9996       "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
9997       getLLVMStyleWithColumns(60));
9998 }
9999 
10000 TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
10001   FormatStyle Style = getGoogleStyleWithColumns(15);
10002   EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
10003   EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
10004   EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
10005   EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
10006   EXPECT_EQ("u8R\"x(raw literal)x\";",
10007             format("u8R\"x(raw literal)x\";", Style));
10008 }
10009 
10010 TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
10011   FormatStyle Style = getLLVMStyleWithColumns(20);
10012   EXPECT_EQ(
10013       "_T(\"aaaaaaaaaaaaaa\")\n"
10014       "_T(\"aaaaaaaaaaaaaa\")\n"
10015       "_T(\"aaaaaaaaaaaa\")",
10016       format("  _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
10017   EXPECT_EQ("f(x,\n"
10018             "  _T(\"aaaaaaaaaaaa\")\n"
10019             "  _T(\"aaa\"),\n"
10020             "  z);",
10021             format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
10022 
10023   // FIXME: Handle embedded spaces in one iteration.
10024   //  EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
10025   //            "_T(\"aaaaaaaaaaaaa\")\n"
10026   //            "_T(\"aaaaaaaaaaaaa\")\n"
10027   //            "_T(\"a\")",
10028   //            format("  _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
10029   //                   getLLVMStyleWithColumns(20)));
10030   EXPECT_EQ(
10031       "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
10032       format("  _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
10033   EXPECT_EQ("f(\n"
10034             "#if !TEST\n"
10035             "    _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
10036             "#endif\n"
10037             ");",
10038             format("f(\n"
10039                    "#if !TEST\n"
10040                    "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
10041                    "#endif\n"
10042                    ");"));
10043   EXPECT_EQ("f(\n"
10044             "\n"
10045             "    _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
10046             format("f(\n"
10047                    "\n"
10048                    "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
10049 }
10050 
10051 TEST_F(FormatTest, BreaksStringLiteralOperands) {
10052   // In a function call with two operands, the second can be broken with no line
10053   // break before it.
10054   EXPECT_EQ(
10055       "func(a, \"long long \"\n"
10056       "        \"long long\");",
10057       format("func(a, \"long long long long\");", getLLVMStyleWithColumns(24)));
10058   // In a function call with three operands, the second must be broken with a
10059   // line break before it.
10060   EXPECT_EQ("func(a,\n"
10061             "     \"long long long \"\n"
10062             "     \"long\",\n"
10063             "     c);",
10064             format("func(a, \"long long long long\", c);",
10065                    getLLVMStyleWithColumns(24)));
10066   // In a function call with three operands, the third must be broken with a
10067   // line break before it.
10068   EXPECT_EQ("func(a, b,\n"
10069             "     \"long long long \"\n"
10070             "     \"long\");",
10071             format("func(a, b, \"long long long long\");",
10072                    getLLVMStyleWithColumns(24)));
10073   // In a function call with three operands, both the second and the third must
10074   // be broken with a line break before them.
10075   EXPECT_EQ("func(a,\n"
10076             "     \"long long long \"\n"
10077             "     \"long\",\n"
10078             "     \"long long long \"\n"
10079             "     \"long\");",
10080             format("func(a, \"long long long long\", \"long long long long\");",
10081                    getLLVMStyleWithColumns(24)));
10082   // In a chain of << with two operands, the second can be broken with no line
10083   // break before it.
10084   EXPECT_EQ("a << \"line line \"\n"
10085             "     \"line\";",
10086             format("a << \"line line line\";", getLLVMStyleWithColumns(20)));
10087   // In a chain of << with three operands, the second can be broken with no line
10088   // break before it.
10089   EXPECT_EQ(
10090       "abcde << \"line \"\n"
10091       "         \"line line\"\n"
10092       "      << c;",
10093       format("abcde << \"line line line\" << c;", getLLVMStyleWithColumns(20)));
10094   // In a chain of << with three operands, the third must be broken with a line
10095   // break before it.
10096   EXPECT_EQ(
10097       "a << b\n"
10098       "  << \"line line \"\n"
10099       "     \"line\";",
10100       format("a << b << \"line line line\";", getLLVMStyleWithColumns(20)));
10101   // In a chain of << with three operands, the second can be broken with no line
10102   // break before it and the third must be broken with a line break before it.
10103   EXPECT_EQ("abcd << \"line line \"\n"
10104             "        \"line\"\n"
10105             "     << \"line line \"\n"
10106             "        \"line\";",
10107             format("abcd << \"line line line\" << \"line line line\";",
10108                    getLLVMStyleWithColumns(20)));
10109   // In a chain of binary operators with two operands, the second can be broken
10110   // with no line break before it.
10111   EXPECT_EQ(
10112       "abcd + \"line line \"\n"
10113       "       \"line line\";",
10114       format("abcd + \"line line line line\";", getLLVMStyleWithColumns(20)));
10115   // In a chain of binary operators with three operands, the second must be
10116   // broken with a line break before it.
10117   EXPECT_EQ("abcd +\n"
10118             "    \"line line \"\n"
10119             "    \"line line\" +\n"
10120             "    e;",
10121             format("abcd + \"line line line line\" + e;",
10122                    getLLVMStyleWithColumns(20)));
10123   // In a function call with two operands, with AlignAfterOpenBracket enabled,
10124   // the first must be broken with a line break before it.
10125   FormatStyle Style = getLLVMStyleWithColumns(25);
10126   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10127   EXPECT_EQ("someFunction(\n"
10128             "    \"long long long \"\n"
10129             "    \"long\",\n"
10130             "    a);",
10131             format("someFunction(\"long long long long\", a);", Style));
10132 }
10133 
10134 TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
10135   EXPECT_EQ(
10136       "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
10137       "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
10138       "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
10139       format("aaaaaaaaaaa  =  \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
10140              "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
10141              "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
10142 }
10143 
10144 TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
10145   EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
10146             format("f(g(R\"x(raw literal)x\",   a), b);", getGoogleStyle()));
10147   EXPECT_EQ("fffffffffff(g(R\"x(\n"
10148             "multiline raw string literal xxxxxxxxxxxxxx\n"
10149             ")x\",\n"
10150             "              a),\n"
10151             "            b);",
10152             format("fffffffffff(g(R\"x(\n"
10153                    "multiline raw string literal xxxxxxxxxxxxxx\n"
10154                    ")x\", a), b);",
10155                    getGoogleStyleWithColumns(20)));
10156   EXPECT_EQ("fffffffffff(\n"
10157             "    g(R\"x(qqq\n"
10158             "multiline raw string literal xxxxxxxxxxxxxx\n"
10159             ")x\",\n"
10160             "      a),\n"
10161             "    b);",
10162             format("fffffffffff(g(R\"x(qqq\n"
10163                    "multiline raw string literal xxxxxxxxxxxxxx\n"
10164                    ")x\", a), b);",
10165                    getGoogleStyleWithColumns(20)));
10166 
10167   EXPECT_EQ("fffffffffff(R\"x(\n"
10168             "multiline raw string literal xxxxxxxxxxxxxx\n"
10169             ")x\");",
10170             format("fffffffffff(R\"x(\n"
10171                    "multiline raw string literal xxxxxxxxxxxxxx\n"
10172                    ")x\");",
10173                    getGoogleStyleWithColumns(20)));
10174   EXPECT_EQ("fffffffffff(R\"x(\n"
10175             "multiline raw string literal xxxxxxxxxxxxxx\n"
10176             ")x\" + bbbbbb);",
10177             format("fffffffffff(R\"x(\n"
10178                    "multiline raw string literal xxxxxxxxxxxxxx\n"
10179                    ")x\" +   bbbbbb);",
10180                    getGoogleStyleWithColumns(20)));
10181   EXPECT_EQ("fffffffffff(\n"
10182             "    R\"x(\n"
10183             "multiline raw string literal xxxxxxxxxxxxxx\n"
10184             ")x\" +\n"
10185             "    bbbbbb);",
10186             format("fffffffffff(\n"
10187                    " R\"x(\n"
10188                    "multiline raw string literal xxxxxxxxxxxxxx\n"
10189                    ")x\" + bbbbbb);",
10190                    getGoogleStyleWithColumns(20)));
10191   EXPECT_EQ("fffffffffff(R\"(single line raw string)\" + bbbbbb);",
10192             format("fffffffffff(\n"
10193                    " R\"(single line raw string)\" + bbbbbb);"));
10194 }
10195 
10196 TEST_F(FormatTest, SkipsUnknownStringLiterals) {
10197   verifyFormat("string a = \"unterminated;");
10198   EXPECT_EQ("function(\"unterminated,\n"
10199             "         OtherParameter);",
10200             format("function(  \"unterminated,\n"
10201                    "    OtherParameter);"));
10202 }
10203 
10204 TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
10205   FormatStyle Style = getLLVMStyle();
10206   Style.Standard = FormatStyle::LS_Cpp03;
10207   EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
10208             format("#define x(_a) printf(\"foo\"_a);", Style));
10209 }
10210 
10211 TEST_F(FormatTest, CppLexVersion) {
10212   FormatStyle Style = getLLVMStyle();
10213   // Formatting of x * y differs if x is a type.
10214   verifyFormat("void foo() { MACRO(a * b); }", Style);
10215   verifyFormat("void foo() { MACRO(int *b); }", Style);
10216 
10217   // LLVM style uses latest lexer.
10218   verifyFormat("void foo() { MACRO(char8_t *b); }", Style);
10219   Style.Standard = FormatStyle::LS_Cpp17;
10220   // But in c++17, char8_t isn't a keyword.
10221   verifyFormat("void foo() { MACRO(char8_t * b); }", Style);
10222 }
10223 
10224 TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
10225 
10226 TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
10227   EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
10228             "             \"ddeeefff\");",
10229             format("someFunction(\"aaabbbcccdddeeefff\");",
10230                    getLLVMStyleWithColumns(25)));
10231   EXPECT_EQ("someFunction1234567890(\n"
10232             "    \"aaabbbcccdddeeefff\");",
10233             format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
10234                    getLLVMStyleWithColumns(26)));
10235   EXPECT_EQ("someFunction1234567890(\n"
10236             "    \"aaabbbcccdddeeeff\"\n"
10237             "    \"f\");",
10238             format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
10239                    getLLVMStyleWithColumns(25)));
10240   EXPECT_EQ("someFunction1234567890(\n"
10241             "    \"aaabbbcccdddeeeff\"\n"
10242             "    \"f\");",
10243             format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
10244                    getLLVMStyleWithColumns(24)));
10245   EXPECT_EQ("someFunction(\n"
10246             "    \"aaabbbcc ddde \"\n"
10247             "    \"efff\");",
10248             format("someFunction(\"aaabbbcc ddde efff\");",
10249                    getLLVMStyleWithColumns(25)));
10250   EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
10251             "             \"ddeeefff\");",
10252             format("someFunction(\"aaabbbccc ddeeefff\");",
10253                    getLLVMStyleWithColumns(25)));
10254   EXPECT_EQ("someFunction1234567890(\n"
10255             "    \"aaabb \"\n"
10256             "    \"cccdddeeefff\");",
10257             format("someFunction1234567890(\"aaabb cccdddeeefff\");",
10258                    getLLVMStyleWithColumns(25)));
10259   EXPECT_EQ("#define A          \\\n"
10260             "  string s =       \\\n"
10261             "      \"123456789\"  \\\n"
10262             "      \"0\";         \\\n"
10263             "  int i;",
10264             format("#define A string s = \"1234567890\"; int i;",
10265                    getLLVMStyleWithColumns(20)));
10266   EXPECT_EQ("someFunction(\n"
10267             "    \"aaabbbcc \"\n"
10268             "    \"dddeeefff\");",
10269             format("someFunction(\"aaabbbcc dddeeefff\");",
10270                    getLLVMStyleWithColumns(25)));
10271 }
10272 
10273 TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
10274   EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
10275   EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
10276   EXPECT_EQ("\"test\"\n"
10277             "\"\\n\"",
10278             format("\"test\\n\"", getLLVMStyleWithColumns(7)));
10279   EXPECT_EQ("\"tes\\\\\"\n"
10280             "\"n\"",
10281             format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
10282   EXPECT_EQ("\"\\\\\\\\\"\n"
10283             "\"\\n\"",
10284             format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
10285   EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
10286   EXPECT_EQ("\"\\uff01\"\n"
10287             "\"test\"",
10288             format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
10289   EXPECT_EQ("\"\\Uff01ff02\"",
10290             format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
10291   EXPECT_EQ("\"\\x000000000001\"\n"
10292             "\"next\"",
10293             format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
10294   EXPECT_EQ("\"\\x000000000001next\"",
10295             format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
10296   EXPECT_EQ("\"\\x000000000001\"",
10297             format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
10298   EXPECT_EQ("\"test\"\n"
10299             "\"\\000000\"\n"
10300             "\"000001\"",
10301             format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
10302   EXPECT_EQ("\"test\\000\"\n"
10303             "\"00000000\"\n"
10304             "\"1\"",
10305             format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
10306 }
10307 
10308 TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
10309   verifyFormat("void f() {\n"
10310                "  return g() {}\n"
10311                "  void h() {}");
10312   verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
10313                "g();\n"
10314                "}");
10315 }
10316 
10317 TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
10318   verifyFormat(
10319       "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
10320 }
10321 
10322 TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
10323   verifyFormat("class X {\n"
10324                "  void f() {\n"
10325                "  }\n"
10326                "};",
10327                getLLVMStyleWithColumns(12));
10328 }
10329 
10330 TEST_F(FormatTest, ConfigurableIndentWidth) {
10331   FormatStyle EightIndent = getLLVMStyleWithColumns(18);
10332   EightIndent.IndentWidth = 8;
10333   EightIndent.ContinuationIndentWidth = 8;
10334   verifyFormat("void f() {\n"
10335                "        someFunction();\n"
10336                "        if (true) {\n"
10337                "                f();\n"
10338                "        }\n"
10339                "}",
10340                EightIndent);
10341   verifyFormat("class X {\n"
10342                "        void f() {\n"
10343                "        }\n"
10344                "};",
10345                EightIndent);
10346   verifyFormat("int x[] = {\n"
10347                "        call(),\n"
10348                "        call()};",
10349                EightIndent);
10350 }
10351 
10352 TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
10353   verifyFormat("double\n"
10354                "f();",
10355                getLLVMStyleWithColumns(8));
10356 }
10357 
10358 TEST_F(FormatTest, ConfigurableUseOfTab) {
10359   FormatStyle Tab = getLLVMStyleWithColumns(42);
10360   Tab.IndentWidth = 8;
10361   Tab.UseTab = FormatStyle::UT_Always;
10362   Tab.AlignEscapedNewlines = FormatStyle::ENAS_Left;
10363 
10364   EXPECT_EQ("if (aaaaaaaa && // q\n"
10365             "    bb)\t\t// w\n"
10366             "\t;",
10367             format("if (aaaaaaaa &&// q\n"
10368                    "bb)// w\n"
10369                    ";",
10370                    Tab));
10371   EXPECT_EQ("if (aaa && bbb) // w\n"
10372             "\t;",
10373             format("if(aaa&&bbb)// w\n"
10374                    ";",
10375                    Tab));
10376 
10377   verifyFormat("class X {\n"
10378                "\tvoid f() {\n"
10379                "\t\tsomeFunction(parameter1,\n"
10380                "\t\t\t     parameter2);\n"
10381                "\t}\n"
10382                "};",
10383                Tab);
10384   verifyFormat("#define A                        \\\n"
10385                "\tvoid f() {               \\\n"
10386                "\t\tsomeFunction(    \\\n"
10387                "\t\t    parameter1,  \\\n"
10388                "\t\t    parameter2); \\\n"
10389                "\t}",
10390                Tab);
10391   verifyFormat("int a;\t      // x\n"
10392                "int bbbbbbbb; // x\n",
10393                Tab);
10394 
10395   Tab.TabWidth = 4;
10396   Tab.IndentWidth = 8;
10397   verifyFormat("class TabWidth4Indent8 {\n"
10398                "\t\tvoid f() {\n"
10399                "\t\t\t\tsomeFunction(parameter1,\n"
10400                "\t\t\t\t\t\t\t parameter2);\n"
10401                "\t\t}\n"
10402                "};",
10403                Tab);
10404 
10405   Tab.TabWidth = 4;
10406   Tab.IndentWidth = 4;
10407   verifyFormat("class TabWidth4Indent4 {\n"
10408                "\tvoid f() {\n"
10409                "\t\tsomeFunction(parameter1,\n"
10410                "\t\t\t\t\t parameter2);\n"
10411                "\t}\n"
10412                "};",
10413                Tab);
10414 
10415   Tab.TabWidth = 8;
10416   Tab.IndentWidth = 4;
10417   verifyFormat("class TabWidth8Indent4 {\n"
10418                "    void f() {\n"
10419                "\tsomeFunction(parameter1,\n"
10420                "\t\t     parameter2);\n"
10421                "    }\n"
10422                "};",
10423                Tab);
10424 
10425   Tab.TabWidth = 8;
10426   Tab.IndentWidth = 8;
10427   EXPECT_EQ("/*\n"
10428             "\t      a\t\tcomment\n"
10429             "\t      in multiple lines\n"
10430             "       */",
10431             format("   /*\t \t \n"
10432                    " \t \t a\t\tcomment\t \t\n"
10433                    " \t \t in multiple lines\t\n"
10434                    " \t  */",
10435                    Tab));
10436 
10437   Tab.UseTab = FormatStyle::UT_ForIndentation;
10438   verifyFormat("{\n"
10439                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10440                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10441                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10442                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10443                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10444                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10445                "};",
10446                Tab);
10447   verifyFormat("enum AA {\n"
10448                "\ta1, // Force multiple lines\n"
10449                "\ta2,\n"
10450                "\ta3\n"
10451                "};",
10452                Tab);
10453   EXPECT_EQ("if (aaaaaaaa && // q\n"
10454             "    bb)         // w\n"
10455             "\t;",
10456             format("if (aaaaaaaa &&// q\n"
10457                    "bb)// w\n"
10458                    ";",
10459                    Tab));
10460   verifyFormat("class X {\n"
10461                "\tvoid f() {\n"
10462                "\t\tsomeFunction(parameter1,\n"
10463                "\t\t             parameter2);\n"
10464                "\t}\n"
10465                "};",
10466                Tab);
10467   verifyFormat("{\n"
10468                "\tQ(\n"
10469                "\t    {\n"
10470                "\t\t    int a;\n"
10471                "\t\t    someFunction(aaaaaaaa,\n"
10472                "\t\t                 bbbbbbb);\n"
10473                "\t    },\n"
10474                "\t    p);\n"
10475                "}",
10476                Tab);
10477   EXPECT_EQ("{\n"
10478             "\t/* aaaa\n"
10479             "\t   bbbb */\n"
10480             "}",
10481             format("{\n"
10482                    "/* aaaa\n"
10483                    "   bbbb */\n"
10484                    "}",
10485                    Tab));
10486   EXPECT_EQ("{\n"
10487             "\t/*\n"
10488             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
10489             "\t  bbbbbbbbbbbbb\n"
10490             "\t*/\n"
10491             "}",
10492             format("{\n"
10493                    "/*\n"
10494                    "  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
10495                    "*/\n"
10496                    "}",
10497                    Tab));
10498   EXPECT_EQ("{\n"
10499             "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
10500             "\t// bbbbbbbbbbbbb\n"
10501             "}",
10502             format("{\n"
10503                    "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
10504                    "}",
10505                    Tab));
10506   EXPECT_EQ("{\n"
10507             "\t/*\n"
10508             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
10509             "\t  bbbbbbbbbbbbb\n"
10510             "\t*/\n"
10511             "}",
10512             format("{\n"
10513                    "\t/*\n"
10514                    "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
10515                    "\t*/\n"
10516                    "}",
10517                    Tab));
10518   EXPECT_EQ("{\n"
10519             "\t/*\n"
10520             "\n"
10521             "\t*/\n"
10522             "}",
10523             format("{\n"
10524                    "\t/*\n"
10525                    "\n"
10526                    "\t*/\n"
10527                    "}",
10528                    Tab));
10529   EXPECT_EQ("{\n"
10530             "\t/*\n"
10531             " asdf\n"
10532             "\t*/\n"
10533             "}",
10534             format("{\n"
10535                    "\t/*\n"
10536                    " asdf\n"
10537                    "\t*/\n"
10538                    "}",
10539                    Tab));
10540 
10541   Tab.UseTab = FormatStyle::UT_Never;
10542   EXPECT_EQ("/*\n"
10543             "              a\t\tcomment\n"
10544             "              in multiple lines\n"
10545             "       */",
10546             format("   /*\t \t \n"
10547                    " \t \t a\t\tcomment\t \t\n"
10548                    " \t \t in multiple lines\t\n"
10549                    " \t  */",
10550                    Tab));
10551   EXPECT_EQ("/* some\n"
10552             "   comment */",
10553             format(" \t \t /* some\n"
10554                    " \t \t    comment */",
10555                    Tab));
10556   EXPECT_EQ("int a; /* some\n"
10557             "   comment */",
10558             format(" \t \t int a; /* some\n"
10559                    " \t \t    comment */",
10560                    Tab));
10561 
10562   EXPECT_EQ("int a; /* some\n"
10563             "comment */",
10564             format(" \t \t int\ta; /* some\n"
10565                    " \t \t    comment */",
10566                    Tab));
10567   EXPECT_EQ("f(\"\t\t\"); /* some\n"
10568             "    comment */",
10569             format(" \t \t f(\"\t\t\"); /* some\n"
10570                    " \t \t    comment */",
10571                    Tab));
10572   EXPECT_EQ("{\n"
10573             "        /*\n"
10574             "         * Comment\n"
10575             "         */\n"
10576             "        int i;\n"
10577             "}",
10578             format("{\n"
10579                    "\t/*\n"
10580                    "\t * Comment\n"
10581                    "\t */\n"
10582                    "\t int i;\n"
10583                    "}",
10584                    Tab));
10585 
10586   Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
10587   Tab.TabWidth = 8;
10588   Tab.IndentWidth = 8;
10589   EXPECT_EQ("if (aaaaaaaa && // q\n"
10590             "    bb)         // w\n"
10591             "\t;",
10592             format("if (aaaaaaaa &&// q\n"
10593                    "bb)// w\n"
10594                    ";",
10595                    Tab));
10596   EXPECT_EQ("if (aaa && bbb) // w\n"
10597             "\t;",
10598             format("if(aaa&&bbb)// w\n"
10599                    ";",
10600                    Tab));
10601   verifyFormat("class X {\n"
10602                "\tvoid f() {\n"
10603                "\t\tsomeFunction(parameter1,\n"
10604                "\t\t\t     parameter2);\n"
10605                "\t}\n"
10606                "};",
10607                Tab);
10608   verifyFormat("#define A                        \\\n"
10609                "\tvoid f() {               \\\n"
10610                "\t\tsomeFunction(    \\\n"
10611                "\t\t    parameter1,  \\\n"
10612                "\t\t    parameter2); \\\n"
10613                "\t}",
10614                Tab);
10615   Tab.TabWidth = 4;
10616   Tab.IndentWidth = 8;
10617   verifyFormat("class TabWidth4Indent8 {\n"
10618                "\t\tvoid f() {\n"
10619                "\t\t\t\tsomeFunction(parameter1,\n"
10620                "\t\t\t\t\t\t\t parameter2);\n"
10621                "\t\t}\n"
10622                "};",
10623                Tab);
10624   Tab.TabWidth = 4;
10625   Tab.IndentWidth = 4;
10626   verifyFormat("class TabWidth4Indent4 {\n"
10627                "\tvoid f() {\n"
10628                "\t\tsomeFunction(parameter1,\n"
10629                "\t\t\t\t\t parameter2);\n"
10630                "\t}\n"
10631                "};",
10632                Tab);
10633   Tab.TabWidth = 8;
10634   Tab.IndentWidth = 4;
10635   verifyFormat("class TabWidth8Indent4 {\n"
10636                "    void f() {\n"
10637                "\tsomeFunction(parameter1,\n"
10638                "\t\t     parameter2);\n"
10639                "    }\n"
10640                "};",
10641                Tab);
10642   Tab.TabWidth = 8;
10643   Tab.IndentWidth = 8;
10644   EXPECT_EQ("/*\n"
10645             "\t      a\t\tcomment\n"
10646             "\t      in multiple lines\n"
10647             "       */",
10648             format("   /*\t \t \n"
10649                    " \t \t a\t\tcomment\t \t\n"
10650                    " \t \t in multiple lines\t\n"
10651                    " \t  */",
10652                    Tab));
10653   verifyFormat("{\n"
10654                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10655                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10656                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10657                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10658                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10659                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10660                "};",
10661                Tab);
10662   verifyFormat("enum AA {\n"
10663                "\ta1, // Force multiple lines\n"
10664                "\ta2,\n"
10665                "\ta3\n"
10666                "};",
10667                Tab);
10668   EXPECT_EQ("if (aaaaaaaa && // q\n"
10669             "    bb)         // w\n"
10670             "\t;",
10671             format("if (aaaaaaaa &&// q\n"
10672                    "bb)// w\n"
10673                    ";",
10674                    Tab));
10675   verifyFormat("class X {\n"
10676                "\tvoid f() {\n"
10677                "\t\tsomeFunction(parameter1,\n"
10678                "\t\t\t     parameter2);\n"
10679                "\t}\n"
10680                "};",
10681                Tab);
10682   verifyFormat("{\n"
10683                "\tQ(\n"
10684                "\t    {\n"
10685                "\t\t    int a;\n"
10686                "\t\t    someFunction(aaaaaaaa,\n"
10687                "\t\t\t\t bbbbbbb);\n"
10688                "\t    },\n"
10689                "\t    p);\n"
10690                "}",
10691                Tab);
10692   EXPECT_EQ("{\n"
10693             "\t/* aaaa\n"
10694             "\t   bbbb */\n"
10695             "}",
10696             format("{\n"
10697                    "/* aaaa\n"
10698                    "   bbbb */\n"
10699                    "}",
10700                    Tab));
10701   EXPECT_EQ("{\n"
10702             "\t/*\n"
10703             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
10704             "\t  bbbbbbbbbbbbb\n"
10705             "\t*/\n"
10706             "}",
10707             format("{\n"
10708                    "/*\n"
10709                    "  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
10710                    "*/\n"
10711                    "}",
10712                    Tab));
10713   EXPECT_EQ("{\n"
10714             "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
10715             "\t// bbbbbbbbbbbbb\n"
10716             "}",
10717             format("{\n"
10718                    "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
10719                    "}",
10720                    Tab));
10721   EXPECT_EQ("{\n"
10722             "\t/*\n"
10723             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
10724             "\t  bbbbbbbbbbbbb\n"
10725             "\t*/\n"
10726             "}",
10727             format("{\n"
10728                    "\t/*\n"
10729                    "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
10730                    "\t*/\n"
10731                    "}",
10732                    Tab));
10733   EXPECT_EQ("{\n"
10734             "\t/*\n"
10735             "\n"
10736             "\t*/\n"
10737             "}",
10738             format("{\n"
10739                    "\t/*\n"
10740                    "\n"
10741                    "\t*/\n"
10742                    "}",
10743                    Tab));
10744   EXPECT_EQ("{\n"
10745             "\t/*\n"
10746             " asdf\n"
10747             "\t*/\n"
10748             "}",
10749             format("{\n"
10750                    "\t/*\n"
10751                    " asdf\n"
10752                    "\t*/\n"
10753                    "}",
10754                    Tab));
10755   EXPECT_EQ("/* some\n"
10756             "   comment */",
10757             format(" \t \t /* some\n"
10758                    " \t \t    comment */",
10759                    Tab));
10760   EXPECT_EQ("int a; /* some\n"
10761             "   comment */",
10762             format(" \t \t int a; /* some\n"
10763                    " \t \t    comment */",
10764                    Tab));
10765   EXPECT_EQ("int a; /* some\n"
10766             "comment */",
10767             format(" \t \t int\ta; /* some\n"
10768                    " \t \t    comment */",
10769                    Tab));
10770   EXPECT_EQ("f(\"\t\t\"); /* some\n"
10771             "    comment */",
10772             format(" \t \t f(\"\t\t\"); /* some\n"
10773                    " \t \t    comment */",
10774                    Tab));
10775   EXPECT_EQ("{\n"
10776             "\t/*\n"
10777             "\t * Comment\n"
10778             "\t */\n"
10779             "\tint i;\n"
10780             "}",
10781             format("{\n"
10782                    "\t/*\n"
10783                    "\t * Comment\n"
10784                    "\t */\n"
10785                    "\t int i;\n"
10786                    "}",
10787                    Tab));
10788   Tab.TabWidth = 2;
10789   Tab.IndentWidth = 2;
10790   EXPECT_EQ("{\n"
10791             "\t/* aaaa\n"
10792             "\t\t bbbb */\n"
10793             "}",
10794             format("{\n"
10795                    "/* aaaa\n"
10796                    "\t bbbb */\n"
10797                    "}",
10798                    Tab));
10799   EXPECT_EQ("{\n"
10800             "\t/*\n"
10801             "\t\taaaaaaaaaaaaaaaaaaaaaaaaaa\n"
10802             "\t\tbbbbbbbbbbbbb\n"
10803             "\t*/\n"
10804             "}",
10805             format("{\n"
10806                    "/*\n"
10807                    "\taaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
10808                    "*/\n"
10809                    "}",
10810                    Tab));
10811   Tab.AlignConsecutiveAssignments = true;
10812   Tab.AlignConsecutiveDeclarations = true;
10813   Tab.TabWidth = 4;
10814   Tab.IndentWidth = 4;
10815   verifyFormat("class Assign {\n"
10816                "\tvoid f() {\n"
10817                "\t\tint         x      = 123;\n"
10818                "\t\tint         random = 4;\n"
10819                "\t\tstd::string alphabet =\n"
10820                "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
10821                "\t}\n"
10822                "};",
10823                Tab);
10824 
10825   Tab.UseTab = FormatStyle::UT_AlignWithSpaces;
10826   Tab.TabWidth = 8;
10827   Tab.IndentWidth = 8;
10828   EXPECT_EQ("if (aaaaaaaa && // q\n"
10829             "    bb)         // w\n"
10830             "\t;",
10831             format("if (aaaaaaaa &&// q\n"
10832                    "bb)// w\n"
10833                    ";",
10834                    Tab));
10835   EXPECT_EQ("if (aaa && bbb) // w\n"
10836             "\t;",
10837             format("if(aaa&&bbb)// w\n"
10838                    ";",
10839                    Tab));
10840   verifyFormat("class X {\n"
10841                "\tvoid f() {\n"
10842                "\t\tsomeFunction(parameter1,\n"
10843                "\t\t             parameter2);\n"
10844                "\t}\n"
10845                "};",
10846                Tab);
10847   verifyFormat("#define A                        \\\n"
10848                "\tvoid f() {               \\\n"
10849                "\t\tsomeFunction(    \\\n"
10850                "\t\t    parameter1,  \\\n"
10851                "\t\t    parameter2); \\\n"
10852                "\t}",
10853                Tab);
10854   Tab.TabWidth = 4;
10855   Tab.IndentWidth = 8;
10856   verifyFormat("class TabWidth4Indent8 {\n"
10857                "\t\tvoid f() {\n"
10858                "\t\t\t\tsomeFunction(parameter1,\n"
10859                "\t\t\t\t             parameter2);\n"
10860                "\t\t}\n"
10861                "};",
10862                Tab);
10863   Tab.TabWidth = 4;
10864   Tab.IndentWidth = 4;
10865   verifyFormat("class TabWidth4Indent4 {\n"
10866                "\tvoid f() {\n"
10867                "\t\tsomeFunction(parameter1,\n"
10868                "\t\t             parameter2);\n"
10869                "\t}\n"
10870                "};",
10871                Tab);
10872   Tab.TabWidth = 8;
10873   Tab.IndentWidth = 4;
10874   verifyFormat("class TabWidth8Indent4 {\n"
10875                "    void f() {\n"
10876                "\tsomeFunction(parameter1,\n"
10877                "\t             parameter2);\n"
10878                "    }\n"
10879                "};",
10880                Tab);
10881   Tab.TabWidth = 8;
10882   Tab.IndentWidth = 8;
10883   EXPECT_EQ("/*\n"
10884             "              a\t\tcomment\n"
10885             "              in multiple lines\n"
10886             "       */",
10887             format("   /*\t \t \n"
10888                    " \t \t a\t\tcomment\t \t\n"
10889                    " \t \t in multiple lines\t\n"
10890                    " \t  */",
10891                    Tab));
10892   verifyFormat("{\n"
10893                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10894                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10895                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10896                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10897                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10898                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10899                "};",
10900                Tab);
10901   verifyFormat("enum AA {\n"
10902                "\ta1, // Force multiple lines\n"
10903                "\ta2,\n"
10904                "\ta3\n"
10905                "};",
10906                Tab);
10907   EXPECT_EQ("if (aaaaaaaa && // q\n"
10908             "    bb)         // w\n"
10909             "\t;",
10910             format("if (aaaaaaaa &&// q\n"
10911                    "bb)// w\n"
10912                    ";",
10913                    Tab));
10914   verifyFormat("class X {\n"
10915                "\tvoid f() {\n"
10916                "\t\tsomeFunction(parameter1,\n"
10917                "\t\t             parameter2);\n"
10918                "\t}\n"
10919                "};",
10920                Tab);
10921   verifyFormat("{\n"
10922                "\tQ(\n"
10923                "\t    {\n"
10924                "\t\t    int a;\n"
10925                "\t\t    someFunction(aaaaaaaa,\n"
10926                "\t\t                 bbbbbbb);\n"
10927                "\t    },\n"
10928                "\t    p);\n"
10929                "}",
10930                Tab);
10931   EXPECT_EQ("{\n"
10932             "\t/* aaaa\n"
10933             "\t   bbbb */\n"
10934             "}",
10935             format("{\n"
10936                    "/* aaaa\n"
10937                    "   bbbb */\n"
10938                    "}",
10939                    Tab));
10940   EXPECT_EQ("{\n"
10941             "\t/*\n"
10942             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
10943             "\t  bbbbbbbbbbbbb\n"
10944             "\t*/\n"
10945             "}",
10946             format("{\n"
10947                    "/*\n"
10948                    "  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
10949                    "*/\n"
10950                    "}",
10951                    Tab));
10952   EXPECT_EQ("{\n"
10953             "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
10954             "\t// bbbbbbbbbbbbb\n"
10955             "}",
10956             format("{\n"
10957                    "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
10958                    "}",
10959                    Tab));
10960   EXPECT_EQ("{\n"
10961             "\t/*\n"
10962             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
10963             "\t  bbbbbbbbbbbbb\n"
10964             "\t*/\n"
10965             "}",
10966             format("{\n"
10967                    "\t/*\n"
10968                    "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
10969                    "\t*/\n"
10970                    "}",
10971                    Tab));
10972   EXPECT_EQ("{\n"
10973             "\t/*\n"
10974             "\n"
10975             "\t*/\n"
10976             "}",
10977             format("{\n"
10978                    "\t/*\n"
10979                    "\n"
10980                    "\t*/\n"
10981                    "}",
10982                    Tab));
10983   EXPECT_EQ("{\n"
10984             "\t/*\n"
10985             " asdf\n"
10986             "\t*/\n"
10987             "}",
10988             format("{\n"
10989                    "\t/*\n"
10990                    " asdf\n"
10991                    "\t*/\n"
10992                    "}",
10993                    Tab));
10994   EXPECT_EQ("/* some\n"
10995             "   comment */",
10996             format(" \t \t /* some\n"
10997                    " \t \t    comment */",
10998                    Tab));
10999   EXPECT_EQ("int a; /* some\n"
11000             "   comment */",
11001             format(" \t \t int a; /* some\n"
11002                    " \t \t    comment */",
11003                    Tab));
11004   EXPECT_EQ("int a; /* some\n"
11005             "comment */",
11006             format(" \t \t int\ta; /* some\n"
11007                    " \t \t    comment */",
11008                    Tab));
11009   EXPECT_EQ("f(\"\t\t\"); /* some\n"
11010             "    comment */",
11011             format(" \t \t f(\"\t\t\"); /* some\n"
11012                    " \t \t    comment */",
11013                    Tab));
11014   EXPECT_EQ("{\n"
11015             "\t/*\n"
11016             "\t * Comment\n"
11017             "\t */\n"
11018             "\tint i;\n"
11019             "}",
11020             format("{\n"
11021                    "\t/*\n"
11022                    "\t * Comment\n"
11023                    "\t */\n"
11024                    "\t int i;\n"
11025                    "}",
11026                    Tab));
11027   Tab.TabWidth = 2;
11028   Tab.IndentWidth = 2;
11029   EXPECT_EQ("{\n"
11030             "\t/* aaaa\n"
11031             "\t   bbbb */\n"
11032             "}",
11033             format("{\n"
11034                    "/* aaaa\n"
11035                    "   bbbb */\n"
11036                    "}",
11037                    Tab));
11038   EXPECT_EQ("{\n"
11039             "\t/*\n"
11040             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
11041             "\t  bbbbbbbbbbbbb\n"
11042             "\t*/\n"
11043             "}",
11044             format("{\n"
11045                    "/*\n"
11046                    "  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
11047                    "*/\n"
11048                    "}",
11049                    Tab));
11050   Tab.AlignConsecutiveAssignments = true;
11051   Tab.AlignConsecutiveDeclarations = true;
11052   Tab.TabWidth = 4;
11053   Tab.IndentWidth = 4;
11054   verifyFormat("class Assign {\n"
11055                "\tvoid f() {\n"
11056                "\t\tint         x      = 123;\n"
11057                "\t\tint         random = 4;\n"
11058                "\t\tstd::string alphabet =\n"
11059                "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
11060                "\t}\n"
11061                "};",
11062                Tab);
11063 }
11064 
11065 TEST_F(FormatTest, ZeroTabWidth) {
11066   FormatStyle Tab = getLLVMStyleWithColumns(42);
11067   Tab.IndentWidth = 8;
11068   Tab.UseTab = FormatStyle::UT_Never;
11069   Tab.TabWidth = 0;
11070   EXPECT_EQ("void a(){\n"
11071             "    // line starts with '\t'\n"
11072             "};",
11073             format("void a(){\n"
11074                    "\t// line starts with '\t'\n"
11075                    "};",
11076                    Tab));
11077 
11078   EXPECT_EQ("void a(){\n"
11079             "    // line starts with '\t'\n"
11080             "};",
11081             format("void a(){\n"
11082                    "\t\t// line starts with '\t'\n"
11083                    "};",
11084                    Tab));
11085 
11086   Tab.UseTab = FormatStyle::UT_ForIndentation;
11087   EXPECT_EQ("void a(){\n"
11088             "    // line starts with '\t'\n"
11089             "};",
11090             format("void a(){\n"
11091                    "\t// line starts with '\t'\n"
11092                    "};",
11093                    Tab));
11094 
11095   EXPECT_EQ("void a(){\n"
11096             "    // line starts with '\t'\n"
11097             "};",
11098             format("void a(){\n"
11099                    "\t\t// line starts with '\t'\n"
11100                    "};",
11101                    Tab));
11102 
11103   Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
11104   EXPECT_EQ("void a(){\n"
11105             "    // line starts with '\t'\n"
11106             "};",
11107             format("void a(){\n"
11108                    "\t// line starts with '\t'\n"
11109                    "};",
11110                    Tab));
11111 
11112   EXPECT_EQ("void a(){\n"
11113             "    // line starts with '\t'\n"
11114             "};",
11115             format("void a(){\n"
11116                    "\t\t// line starts with '\t'\n"
11117                    "};",
11118                    Tab));
11119 
11120   Tab.UseTab = FormatStyle::UT_AlignWithSpaces;
11121   EXPECT_EQ("void a(){\n"
11122             "    // line starts with '\t'\n"
11123             "};",
11124             format("void a(){\n"
11125                    "\t// line starts with '\t'\n"
11126                    "};",
11127                    Tab));
11128 
11129   EXPECT_EQ("void a(){\n"
11130             "    // line starts with '\t'\n"
11131             "};",
11132             format("void a(){\n"
11133                    "\t\t// line starts with '\t'\n"
11134                    "};",
11135                    Tab));
11136 
11137   Tab.UseTab = FormatStyle::UT_Always;
11138   EXPECT_EQ("void a(){\n"
11139             "// line starts with '\t'\n"
11140             "};",
11141             format("void a(){\n"
11142                    "\t// line starts with '\t'\n"
11143                    "};",
11144                    Tab));
11145 
11146   EXPECT_EQ("void a(){\n"
11147             "// line starts with '\t'\n"
11148             "};",
11149             format("void a(){\n"
11150                    "\t\t// line starts with '\t'\n"
11151                    "};",
11152                    Tab));
11153 }
11154 
11155 TEST_F(FormatTest, CalculatesOriginalColumn) {
11156   EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
11157             "q\"; /* some\n"
11158             "       comment */",
11159             format("  \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
11160                    "q\"; /* some\n"
11161                    "       comment */",
11162                    getLLVMStyle()));
11163   EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
11164             "/* some\n"
11165             "   comment */",
11166             format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
11167                    " /* some\n"
11168                    "    comment */",
11169                    getLLVMStyle()));
11170   EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
11171             "qqq\n"
11172             "/* some\n"
11173             "   comment */",
11174             format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
11175                    "qqq\n"
11176                    " /* some\n"
11177                    "    comment */",
11178                    getLLVMStyle()));
11179   EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
11180             "wwww; /* some\n"
11181             "         comment */",
11182             format("  inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
11183                    "wwww; /* some\n"
11184                    "         comment */",
11185                    getLLVMStyle()));
11186 }
11187 
11188 TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
11189   FormatStyle NoSpace = getLLVMStyle();
11190   NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
11191 
11192   verifyFormat("while(true)\n"
11193                "  continue;",
11194                NoSpace);
11195   verifyFormat("for(;;)\n"
11196                "  continue;",
11197                NoSpace);
11198   verifyFormat("if(true)\n"
11199                "  f();\n"
11200                "else if(true)\n"
11201                "  f();",
11202                NoSpace);
11203   verifyFormat("do {\n"
11204                "  do_something();\n"
11205                "} while(something());",
11206                NoSpace);
11207   verifyFormat("switch(x) {\n"
11208                "default:\n"
11209                "  break;\n"
11210                "}",
11211                NoSpace);
11212   verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
11213   verifyFormat("size_t x = sizeof(x);", NoSpace);
11214   verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
11215   verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
11216   verifyFormat("alignas(128) char a[128];", NoSpace);
11217   verifyFormat("size_t x = alignof(MyType);", NoSpace);
11218   verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
11219   verifyFormat("int f() throw(Deprecated);", NoSpace);
11220   verifyFormat("typedef void (*cb)(int);", NoSpace);
11221   verifyFormat("T A::operator()();", NoSpace);
11222   verifyFormat("X A::operator++(T);", NoSpace);
11223   verifyFormat("auto lambda = []() { return 0; };", NoSpace);
11224 
11225   FormatStyle Space = getLLVMStyle();
11226   Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
11227 
11228   verifyFormat("int f ();", Space);
11229   verifyFormat("void f (int a, T b) {\n"
11230                "  while (true)\n"
11231                "    continue;\n"
11232                "}",
11233                Space);
11234   verifyFormat("if (true)\n"
11235                "  f ();\n"
11236                "else if (true)\n"
11237                "  f ();",
11238                Space);
11239   verifyFormat("do {\n"
11240                "  do_something ();\n"
11241                "} while (something ());",
11242                Space);
11243   verifyFormat("switch (x) {\n"
11244                "default:\n"
11245                "  break;\n"
11246                "}",
11247                Space);
11248   verifyFormat("A::A () : a (1) {}", Space);
11249   verifyFormat("void f () __attribute__ ((asdf));", Space);
11250   verifyFormat("*(&a + 1);\n"
11251                "&((&a)[1]);\n"
11252                "a[(b + c) * d];\n"
11253                "(((a + 1) * 2) + 3) * 4;",
11254                Space);
11255   verifyFormat("#define A(x) x", Space);
11256   verifyFormat("#define A (x) x", Space);
11257   verifyFormat("#if defined(x)\n"
11258                "#endif",
11259                Space);
11260   verifyFormat("auto i = std::make_unique<int> (5);", Space);
11261   verifyFormat("size_t x = sizeof (x);", Space);
11262   verifyFormat("auto f (int x) -> decltype (x);", Space);
11263   verifyFormat("int f (T x) noexcept (x.create ());", Space);
11264   verifyFormat("alignas (128) char a[128];", Space);
11265   verifyFormat("size_t x = alignof (MyType);", Space);
11266   verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
11267   verifyFormat("int f () throw (Deprecated);", Space);
11268   verifyFormat("typedef void (*cb) (int);", Space);
11269   verifyFormat("T A::operator() ();", Space);
11270   verifyFormat("X A::operator++ (T);", Space);
11271   verifyFormat("auto lambda = [] () { return 0; };", Space);
11272   verifyFormat("int x = int (y);", Space);
11273 
11274   FormatStyle SomeSpace = getLLVMStyle();
11275   SomeSpace.SpaceBeforeParens = FormatStyle::SBPO_NonEmptyParentheses;
11276 
11277   verifyFormat("[]() -> float {}", SomeSpace);
11278   verifyFormat("[] (auto foo) {}", SomeSpace);
11279   verifyFormat("[foo]() -> int {}", SomeSpace);
11280   verifyFormat("int f();", SomeSpace);
11281   verifyFormat("void f (int a, T b) {\n"
11282                "  while (true)\n"
11283                "    continue;\n"
11284                "}",
11285                SomeSpace);
11286   verifyFormat("if (true)\n"
11287                "  f();\n"
11288                "else if (true)\n"
11289                "  f();",
11290                SomeSpace);
11291   verifyFormat("do {\n"
11292                "  do_something();\n"
11293                "} while (something());",
11294                SomeSpace);
11295   verifyFormat("switch (x) {\n"
11296                "default:\n"
11297                "  break;\n"
11298                "}",
11299                SomeSpace);
11300   verifyFormat("A::A() : a (1) {}", SomeSpace);
11301   verifyFormat("void f() __attribute__ ((asdf));", SomeSpace);
11302   verifyFormat("*(&a + 1);\n"
11303                "&((&a)[1]);\n"
11304                "a[(b + c) * d];\n"
11305                "(((a + 1) * 2) + 3) * 4;",
11306                SomeSpace);
11307   verifyFormat("#define A(x) x", SomeSpace);
11308   verifyFormat("#define A (x) x", SomeSpace);
11309   verifyFormat("#if defined(x)\n"
11310                "#endif",
11311                SomeSpace);
11312   verifyFormat("auto i = std::make_unique<int> (5);", SomeSpace);
11313   verifyFormat("size_t x = sizeof (x);", SomeSpace);
11314   verifyFormat("auto f (int x) -> decltype (x);", SomeSpace);
11315   verifyFormat("int f (T x) noexcept (x.create());", SomeSpace);
11316   verifyFormat("alignas (128) char a[128];", SomeSpace);
11317   verifyFormat("size_t x = alignof (MyType);", SomeSpace);
11318   verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");",
11319                SomeSpace);
11320   verifyFormat("int f() throw (Deprecated);", SomeSpace);
11321   verifyFormat("typedef void (*cb) (int);", SomeSpace);
11322   verifyFormat("T A::operator()();", SomeSpace);
11323   verifyFormat("X A::operator++ (T);", SomeSpace);
11324   verifyFormat("int x = int (y);", SomeSpace);
11325   verifyFormat("auto lambda = []() { return 0; };", SomeSpace);
11326 }
11327 
11328 TEST_F(FormatTest, SpaceAfterLogicalNot) {
11329   FormatStyle Spaces = getLLVMStyle();
11330   Spaces.SpaceAfterLogicalNot = true;
11331 
11332   verifyFormat("bool x = ! y", Spaces);
11333   verifyFormat("if (! isFailure())", Spaces);
11334   verifyFormat("if (! (a && b))", Spaces);
11335   verifyFormat("\"Error!\"", Spaces);
11336   verifyFormat("! ! x", Spaces);
11337 }
11338 
11339 TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
11340   FormatStyle Spaces = getLLVMStyle();
11341 
11342   Spaces.SpacesInParentheses = true;
11343   verifyFormat("do_something( ::globalVar );", Spaces);
11344   verifyFormat("call( x, y, z );", Spaces);
11345   verifyFormat("call();", Spaces);
11346   verifyFormat("std::function<void( int, int )> callback;", Spaces);
11347   verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
11348                Spaces);
11349   verifyFormat("while ( (bool)1 )\n"
11350                "  continue;",
11351                Spaces);
11352   verifyFormat("for ( ;; )\n"
11353                "  continue;",
11354                Spaces);
11355   verifyFormat("if ( true )\n"
11356                "  f();\n"
11357                "else if ( true )\n"
11358                "  f();",
11359                Spaces);
11360   verifyFormat("do {\n"
11361                "  do_something( (int)i );\n"
11362                "} while ( something() );",
11363                Spaces);
11364   verifyFormat("switch ( x ) {\n"
11365                "default:\n"
11366                "  break;\n"
11367                "}",
11368                Spaces);
11369 
11370   Spaces.SpacesInParentheses = false;
11371   Spaces.SpacesInCStyleCastParentheses = true;
11372   verifyFormat("Type *A = ( Type * )P;", Spaces);
11373   verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
11374   verifyFormat("x = ( int32 )y;", Spaces);
11375   verifyFormat("int a = ( int )(2.0f);", Spaces);
11376   verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
11377   verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
11378   verifyFormat("#define x (( int )-1)", Spaces);
11379 
11380   // Run the first set of tests again with:
11381   Spaces.SpacesInParentheses = false;
11382   Spaces.SpaceInEmptyParentheses = true;
11383   Spaces.SpacesInCStyleCastParentheses = true;
11384   verifyFormat("call(x, y, z);", Spaces);
11385   verifyFormat("call( );", Spaces);
11386   verifyFormat("std::function<void(int, int)> callback;", Spaces);
11387   verifyFormat("while (( bool )1)\n"
11388                "  continue;",
11389                Spaces);
11390   verifyFormat("for (;;)\n"
11391                "  continue;",
11392                Spaces);
11393   verifyFormat("if (true)\n"
11394                "  f( );\n"
11395                "else if (true)\n"
11396                "  f( );",
11397                Spaces);
11398   verifyFormat("do {\n"
11399                "  do_something(( int )i);\n"
11400                "} while (something( ));",
11401                Spaces);
11402   verifyFormat("switch (x) {\n"
11403                "default:\n"
11404                "  break;\n"
11405                "}",
11406                Spaces);
11407 
11408   // Run the first set of tests again with:
11409   Spaces.SpaceAfterCStyleCast = true;
11410   verifyFormat("call(x, y, z);", Spaces);
11411   verifyFormat("call( );", Spaces);
11412   verifyFormat("std::function<void(int, int)> callback;", Spaces);
11413   verifyFormat("while (( bool ) 1)\n"
11414                "  continue;",
11415                Spaces);
11416   verifyFormat("for (;;)\n"
11417                "  continue;",
11418                Spaces);
11419   verifyFormat("if (true)\n"
11420                "  f( );\n"
11421                "else if (true)\n"
11422                "  f( );",
11423                Spaces);
11424   verifyFormat("do {\n"
11425                "  do_something(( int ) i);\n"
11426                "} while (something( ));",
11427                Spaces);
11428   verifyFormat("switch (x) {\n"
11429                "default:\n"
11430                "  break;\n"
11431                "}",
11432                Spaces);
11433 
11434   // Run subset of tests again with:
11435   Spaces.SpacesInCStyleCastParentheses = false;
11436   Spaces.SpaceAfterCStyleCast = true;
11437   verifyFormat("while ((bool) 1)\n"
11438                "  continue;",
11439                Spaces);
11440   verifyFormat("do {\n"
11441                "  do_something((int) i);\n"
11442                "} while (something( ));",
11443                Spaces);
11444 }
11445 
11446 TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
11447   verifyFormat("int a[5];");
11448   verifyFormat("a[3] += 42;");
11449 
11450   FormatStyle Spaces = getLLVMStyle();
11451   Spaces.SpacesInSquareBrackets = true;
11452   // Not lambdas.
11453   verifyFormat("int a[ 5 ];", Spaces);
11454   verifyFormat("a[ 3 ] += 42;", Spaces);
11455   verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
11456   verifyFormat("double &operator[](int i) { return 0; }\n"
11457                "int i;",
11458                Spaces);
11459   verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
11460   verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
11461   verifyFormat("int i = (*b)[ a ]->f();", Spaces);
11462   // Lambdas.
11463   verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
11464   verifyFormat("return [ i, args... ] {};", Spaces);
11465   verifyFormat("int foo = [ &bar ]() {};", Spaces);
11466   verifyFormat("int foo = [ = ]() {};", Spaces);
11467   verifyFormat("int foo = [ & ]() {};", Spaces);
11468   verifyFormat("int foo = [ =, &bar ]() {};", Spaces);
11469   verifyFormat("int foo = [ &bar, = ]() {};", Spaces);
11470 }
11471 
11472 TEST_F(FormatTest, ConfigurableSpaceBeforeBrackets) {
11473   FormatStyle NoSpaceStyle = getLLVMStyle();
11474   verifyFormat("int a[5];", NoSpaceStyle);
11475   verifyFormat("a[3] += 42;", NoSpaceStyle);
11476 
11477   verifyFormat("int a[1];", NoSpaceStyle);
11478   verifyFormat("int 1 [a];", NoSpaceStyle);
11479   verifyFormat("int a[1][2];", NoSpaceStyle);
11480   verifyFormat("a[7] = 5;", NoSpaceStyle);
11481   verifyFormat("int a = (f())[23];", NoSpaceStyle);
11482   verifyFormat("f([] {})", NoSpaceStyle);
11483 
11484   FormatStyle Space = getLLVMStyle();
11485   Space.SpaceBeforeSquareBrackets = true;
11486   verifyFormat("int c = []() -> int { return 2; }();\n", Space);
11487   verifyFormat("return [i, args...] {};", Space);
11488 
11489   verifyFormat("int a [5];", Space);
11490   verifyFormat("a [3] += 42;", Space);
11491   verifyFormat("constexpr char hello []{\"hello\"};", Space);
11492   verifyFormat("double &operator[](int i) { return 0; }\n"
11493                "int i;",
11494                Space);
11495   verifyFormat("std::unique_ptr<int []> foo() {}", Space);
11496   verifyFormat("int i = a [a][a]->f();", Space);
11497   verifyFormat("int i = (*b) [a]->f();", Space);
11498 
11499   verifyFormat("int a [1];", Space);
11500   verifyFormat("int 1 [a];", Space);
11501   verifyFormat("int a [1][2];", Space);
11502   verifyFormat("a [7] = 5;", Space);
11503   verifyFormat("int a = (f()) [23];", Space);
11504   verifyFormat("f([] {})", Space);
11505 }
11506 
11507 TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
11508   verifyFormat("int a = 5;");
11509   verifyFormat("a += 42;");
11510   verifyFormat("a or_eq 8;");
11511 
11512   FormatStyle Spaces = getLLVMStyle();
11513   Spaces.SpaceBeforeAssignmentOperators = false;
11514   verifyFormat("int a= 5;", Spaces);
11515   verifyFormat("a+= 42;", Spaces);
11516   verifyFormat("a or_eq 8;", Spaces);
11517 }
11518 
11519 TEST_F(FormatTest, ConfigurableSpaceBeforeColon) {
11520   verifyFormat("class Foo : public Bar {};");
11521   verifyFormat("Foo::Foo() : foo(1) {}");
11522   verifyFormat("for (auto a : b) {\n}");
11523   verifyFormat("int x = a ? b : c;");
11524   verifyFormat("{\n"
11525                "label0:\n"
11526                "  int x = 0;\n"
11527                "}");
11528   verifyFormat("switch (x) {\n"
11529                "case 1:\n"
11530                "default:\n"
11531                "}");
11532 
11533   FormatStyle CtorInitializerStyle = getLLVMStyleWithColumns(30);
11534   CtorInitializerStyle.SpaceBeforeCtorInitializerColon = false;
11535   verifyFormat("class Foo : public Bar {};", CtorInitializerStyle);
11536   verifyFormat("Foo::Foo(): foo(1) {}", CtorInitializerStyle);
11537   verifyFormat("for (auto a : b) {\n}", CtorInitializerStyle);
11538   verifyFormat("int x = a ? b : c;", CtorInitializerStyle);
11539   verifyFormat("{\n"
11540                "label1:\n"
11541                "  int x = 0;\n"
11542                "}",
11543                CtorInitializerStyle);
11544   verifyFormat("switch (x) {\n"
11545                "case 1:\n"
11546                "default:\n"
11547                "}",
11548                CtorInitializerStyle);
11549   CtorInitializerStyle.BreakConstructorInitializers =
11550       FormatStyle::BCIS_AfterColon;
11551   verifyFormat("Fooooooooooo::Fooooooooooo():\n"
11552                "    aaaaaaaaaaaaaaaa(1),\n"
11553                "    bbbbbbbbbbbbbbbb(2) {}",
11554                CtorInitializerStyle);
11555   CtorInitializerStyle.BreakConstructorInitializers =
11556       FormatStyle::BCIS_BeforeComma;
11557   verifyFormat("Fooooooooooo::Fooooooooooo()\n"
11558                "    : aaaaaaaaaaaaaaaa(1)\n"
11559                "    , bbbbbbbbbbbbbbbb(2) {}",
11560                CtorInitializerStyle);
11561   CtorInitializerStyle.BreakConstructorInitializers =
11562       FormatStyle::BCIS_BeforeColon;
11563   verifyFormat("Fooooooooooo::Fooooooooooo()\n"
11564                "    : aaaaaaaaaaaaaaaa(1),\n"
11565                "      bbbbbbbbbbbbbbbb(2) {}",
11566                CtorInitializerStyle);
11567   CtorInitializerStyle.ConstructorInitializerIndentWidth = 0;
11568   verifyFormat("Fooooooooooo::Fooooooooooo()\n"
11569                ": aaaaaaaaaaaaaaaa(1),\n"
11570                "  bbbbbbbbbbbbbbbb(2) {}",
11571                CtorInitializerStyle);
11572 
11573   FormatStyle InheritanceStyle = getLLVMStyleWithColumns(30);
11574   InheritanceStyle.SpaceBeforeInheritanceColon = false;
11575   verifyFormat("class Foo: public Bar {};", InheritanceStyle);
11576   verifyFormat("Foo::Foo() : foo(1) {}", InheritanceStyle);
11577   verifyFormat("for (auto a : b) {\n}", InheritanceStyle);
11578   verifyFormat("int x = a ? b : c;", InheritanceStyle);
11579   verifyFormat("{\n"
11580                "label2:\n"
11581                "  int x = 0;\n"
11582                "}",
11583                InheritanceStyle);
11584   verifyFormat("switch (x) {\n"
11585                "case 1:\n"
11586                "default:\n"
11587                "}",
11588                InheritanceStyle);
11589   InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_AfterColon;
11590   verifyFormat("class Foooooooooooooooooooooo:\n"
11591                "    public aaaaaaaaaaaaaaaaaa,\n"
11592                "    public bbbbbbbbbbbbbbbbbb {\n"
11593                "}",
11594                InheritanceStyle);
11595   InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeComma;
11596   verifyFormat("class Foooooooooooooooooooooo\n"
11597                "    : public aaaaaaaaaaaaaaaaaa\n"
11598                "    , public bbbbbbbbbbbbbbbbbb {\n"
11599                "}",
11600                InheritanceStyle);
11601   InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
11602   verifyFormat("class Foooooooooooooooooooooo\n"
11603                "    : public aaaaaaaaaaaaaaaaaa,\n"
11604                "      public bbbbbbbbbbbbbbbbbb {\n"
11605                "}",
11606                InheritanceStyle);
11607   InheritanceStyle.ConstructorInitializerIndentWidth = 0;
11608   verifyFormat("class Foooooooooooooooooooooo\n"
11609                ": public aaaaaaaaaaaaaaaaaa,\n"
11610                "  public bbbbbbbbbbbbbbbbbb {}",
11611                InheritanceStyle);
11612 
11613   FormatStyle ForLoopStyle = getLLVMStyle();
11614   ForLoopStyle.SpaceBeforeRangeBasedForLoopColon = false;
11615   verifyFormat("class Foo : public Bar {};", ForLoopStyle);
11616   verifyFormat("Foo::Foo() : foo(1) {}", ForLoopStyle);
11617   verifyFormat("for (auto a: b) {\n}", ForLoopStyle);
11618   verifyFormat("int x = a ? b : c;", ForLoopStyle);
11619   verifyFormat("{\n"
11620                "label2:\n"
11621                "  int x = 0;\n"
11622                "}",
11623                ForLoopStyle);
11624   verifyFormat("switch (x) {\n"
11625                "case 1:\n"
11626                "default:\n"
11627                "}",
11628                ForLoopStyle);
11629 
11630   FormatStyle NoSpaceStyle = getLLVMStyle();
11631   NoSpaceStyle.SpaceBeforeCtorInitializerColon = false;
11632   NoSpaceStyle.SpaceBeforeInheritanceColon = false;
11633   NoSpaceStyle.SpaceBeforeRangeBasedForLoopColon = false;
11634   verifyFormat("class Foo: public Bar {};", NoSpaceStyle);
11635   verifyFormat("Foo::Foo(): foo(1) {}", NoSpaceStyle);
11636   verifyFormat("for (auto a: b) {\n}", NoSpaceStyle);
11637   verifyFormat("int x = a ? b : c;", NoSpaceStyle);
11638   verifyFormat("{\n"
11639                "label3:\n"
11640                "  int x = 0;\n"
11641                "}",
11642                NoSpaceStyle);
11643   verifyFormat("switch (x) {\n"
11644                "case 1:\n"
11645                "default:\n"
11646                "}",
11647                NoSpaceStyle);
11648 }
11649 
11650 TEST_F(FormatTest, AlignConsecutiveMacros) {
11651   FormatStyle Style = getLLVMStyle();
11652   Style.AlignConsecutiveAssignments = true;
11653   Style.AlignConsecutiveDeclarations = true;
11654   Style.AlignConsecutiveMacros = false;
11655 
11656   verifyFormat("#define a 3\n"
11657                "#define bbbb 4\n"
11658                "#define ccc (5)",
11659                Style);
11660 
11661   verifyFormat("#define f(x) (x * x)\n"
11662                "#define fff(x, y, z) (x * y + z)\n"
11663                "#define ffff(x, y) (x - y)",
11664                Style);
11665 
11666   verifyFormat("#define foo(x, y) (x + y)\n"
11667                "#define bar (5, 6)(2 + 2)",
11668                Style);
11669 
11670   verifyFormat("#define a 3\n"
11671                "#define bbbb 4\n"
11672                "#define ccc (5)\n"
11673                "#define f(x) (x * x)\n"
11674                "#define fff(x, y, z) (x * y + z)\n"
11675                "#define ffff(x, y) (x - y)",
11676                Style);
11677 
11678   Style.AlignConsecutiveMacros = true;
11679   verifyFormat("#define a    3\n"
11680                "#define bbbb 4\n"
11681                "#define ccc  (5)",
11682                Style);
11683 
11684   verifyFormat("#define f(x)         (x * x)\n"
11685                "#define fff(x, y, z) (x * y + z)\n"
11686                "#define ffff(x, y)   (x - y)",
11687                Style);
11688 
11689   verifyFormat("#define foo(x, y) (x + y)\n"
11690                "#define bar       (5, 6)(2 + 2)",
11691                Style);
11692 
11693   verifyFormat("#define a            3\n"
11694                "#define bbbb         4\n"
11695                "#define ccc          (5)\n"
11696                "#define f(x)         (x * x)\n"
11697                "#define fff(x, y, z) (x * y + z)\n"
11698                "#define ffff(x, y)   (x - y)",
11699                Style);
11700 
11701   verifyFormat("#define a         5\n"
11702                "#define foo(x, y) (x + y)\n"
11703                "#define CCC       (6)\n"
11704                "auto lambda = []() {\n"
11705                "  auto  ii = 0;\n"
11706                "  float j  = 0;\n"
11707                "  return 0;\n"
11708                "};\n"
11709                "int   i  = 0;\n"
11710                "float i2 = 0;\n"
11711                "auto  v  = type{\n"
11712                "    i = 1,   //\n"
11713                "    (i = 2), //\n"
11714                "    i = 3    //\n"
11715                "};",
11716                Style);
11717 
11718   Style.AlignConsecutiveMacros = false;
11719   Style.ColumnLimit = 20;
11720 
11721   verifyFormat("#define a          \\\n"
11722                "  \"aabbbbbbbbbbbb\"\n"
11723                "#define D          \\\n"
11724                "  \"aabbbbbbbbbbbb\" \\\n"
11725                "  \"ccddeeeeeeeee\"\n"
11726                "#define B          \\\n"
11727                "  \"QQQQQQQQQQQQQ\"  \\\n"
11728                "  \"FFFFFFFFFFFFF\"  \\\n"
11729                "  \"LLLLLLLL\"\n",
11730                Style);
11731 
11732   Style.AlignConsecutiveMacros = true;
11733   verifyFormat("#define a          \\\n"
11734                "  \"aabbbbbbbbbbbb\"\n"
11735                "#define D          \\\n"
11736                "  \"aabbbbbbbbbbbb\" \\\n"
11737                "  \"ccddeeeeeeeee\"\n"
11738                "#define B          \\\n"
11739                "  \"QQQQQQQQQQQQQ\"  \\\n"
11740                "  \"FFFFFFFFFFFFF\"  \\\n"
11741                "  \"LLLLLLLL\"\n",
11742                Style);
11743 }
11744 
11745 TEST_F(FormatTest, AlignConsecutiveAssignments) {
11746   FormatStyle Alignment = getLLVMStyle();
11747   Alignment.AlignConsecutiveMacros = true;
11748   Alignment.AlignConsecutiveAssignments = false;
11749   verifyFormat("int a = 5;\n"
11750                "int oneTwoThree = 123;",
11751                Alignment);
11752   verifyFormat("int a = 5;\n"
11753                "int oneTwoThree = 123;",
11754                Alignment);
11755 
11756   Alignment.AlignConsecutiveAssignments = true;
11757   verifyFormat("int a           = 5;\n"
11758                "int oneTwoThree = 123;",
11759                Alignment);
11760   verifyFormat("int a           = method();\n"
11761                "int oneTwoThree = 133;",
11762                Alignment);
11763   verifyFormat("a &= 5;\n"
11764                "bcd *= 5;\n"
11765                "ghtyf += 5;\n"
11766                "dvfvdb -= 5;\n"
11767                "a /= 5;\n"
11768                "vdsvsv %= 5;\n"
11769                "sfdbddfbdfbb ^= 5;\n"
11770                "dvsdsv |= 5;\n"
11771                "int dsvvdvsdvvv = 123;",
11772                Alignment);
11773   verifyFormat("int i = 1, j = 10;\n"
11774                "something = 2000;",
11775                Alignment);
11776   verifyFormat("something = 2000;\n"
11777                "int i = 1, j = 10;\n",
11778                Alignment);
11779   verifyFormat("something = 2000;\n"
11780                "another   = 911;\n"
11781                "int i = 1, j = 10;\n"
11782                "oneMore = 1;\n"
11783                "i       = 2;",
11784                Alignment);
11785   verifyFormat("int a   = 5;\n"
11786                "int one = 1;\n"
11787                "method();\n"
11788                "int oneTwoThree = 123;\n"
11789                "int oneTwo      = 12;",
11790                Alignment);
11791   verifyFormat("int oneTwoThree = 123;\n"
11792                "int oneTwo      = 12;\n"
11793                "method();\n",
11794                Alignment);
11795   verifyFormat("int oneTwoThree = 123; // comment\n"
11796                "int oneTwo      = 12;  // comment",
11797                Alignment);
11798 
11799   // Bug 25167
11800   verifyFormat("#if A\n"
11801                "#else\n"
11802                "int aaaaaaaa = 12;\n"
11803                "#endif\n"
11804                "#if B\n"
11805                "#else\n"
11806                "int a = 12;\n"
11807                "#endif\n",
11808                Alignment);
11809   verifyFormat("enum foo {\n"
11810                "#if A\n"
11811                "#else\n"
11812                "  aaaaaaaa = 12;\n"
11813                "#endif\n"
11814                "#if B\n"
11815                "#else\n"
11816                "  a = 12;\n"
11817                "#endif\n"
11818                "};\n",
11819                Alignment);
11820 
11821   EXPECT_EQ("int a = 5;\n"
11822             "\n"
11823             "int oneTwoThree = 123;",
11824             format("int a       = 5;\n"
11825                    "\n"
11826                    "int oneTwoThree= 123;",
11827                    Alignment));
11828   EXPECT_EQ("int a   = 5;\n"
11829             "int one = 1;\n"
11830             "\n"
11831             "int oneTwoThree = 123;",
11832             format("int a = 5;\n"
11833                    "int one = 1;\n"
11834                    "\n"
11835                    "int oneTwoThree = 123;",
11836                    Alignment));
11837   EXPECT_EQ("int a   = 5;\n"
11838             "int one = 1;\n"
11839             "\n"
11840             "int oneTwoThree = 123;\n"
11841             "int oneTwo      = 12;",
11842             format("int a = 5;\n"
11843                    "int one = 1;\n"
11844                    "\n"
11845                    "int oneTwoThree = 123;\n"
11846                    "int oneTwo = 12;",
11847                    Alignment));
11848   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
11849   verifyFormat("#define A \\\n"
11850                "  int aaaa       = 12; \\\n"
11851                "  int b          = 23; \\\n"
11852                "  int ccc        = 234; \\\n"
11853                "  int dddddddddd = 2345;",
11854                Alignment);
11855   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
11856   verifyFormat("#define A               \\\n"
11857                "  int aaaa       = 12;  \\\n"
11858                "  int b          = 23;  \\\n"
11859                "  int ccc        = 234; \\\n"
11860                "  int dddddddddd = 2345;",
11861                Alignment);
11862   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
11863   verifyFormat("#define A                                                      "
11864                "                \\\n"
11865                "  int aaaa       = 12;                                         "
11866                "                \\\n"
11867                "  int b          = 23;                                         "
11868                "                \\\n"
11869                "  int ccc        = 234;                                        "
11870                "                \\\n"
11871                "  int dddddddddd = 2345;",
11872                Alignment);
11873   verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
11874                "k = 4, int l = 5,\n"
11875                "                  int m = 6) {\n"
11876                "  int j      = 10;\n"
11877                "  otherThing = 1;\n"
11878                "}",
11879                Alignment);
11880   verifyFormat("void SomeFunction(int parameter = 0) {\n"
11881                "  int i   = 1;\n"
11882                "  int j   = 2;\n"
11883                "  int big = 10000;\n"
11884                "}",
11885                Alignment);
11886   verifyFormat("class C {\n"
11887                "public:\n"
11888                "  int i            = 1;\n"
11889                "  virtual void f() = 0;\n"
11890                "};",
11891                Alignment);
11892   verifyFormat("int i = 1;\n"
11893                "if (SomeType t = getSomething()) {\n"
11894                "}\n"
11895                "int j   = 2;\n"
11896                "int big = 10000;",
11897                Alignment);
11898   verifyFormat("int j = 7;\n"
11899                "for (int k = 0; k < N; ++k) {\n"
11900                "}\n"
11901                "int j   = 2;\n"
11902                "int big = 10000;\n"
11903                "}",
11904                Alignment);
11905   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
11906   verifyFormat("int i = 1;\n"
11907                "LooooooooooongType loooooooooooooooooooooongVariable\n"
11908                "    = someLooooooooooooooooongFunction();\n"
11909                "int j = 2;",
11910                Alignment);
11911   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
11912   verifyFormat("int i = 1;\n"
11913                "LooooooooooongType loooooooooooooooooooooongVariable =\n"
11914                "    someLooooooooooooooooongFunction();\n"
11915                "int j = 2;",
11916                Alignment);
11917 
11918   verifyFormat("auto lambda = []() {\n"
11919                "  auto i = 0;\n"
11920                "  return 0;\n"
11921                "};\n"
11922                "int i  = 0;\n"
11923                "auto v = type{\n"
11924                "    i = 1,   //\n"
11925                "    (i = 2), //\n"
11926                "    i = 3    //\n"
11927                "};",
11928                Alignment);
11929 
11930   verifyFormat(
11931       "int i      = 1;\n"
11932       "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
11933       "                          loooooooooooooooooooooongParameterB);\n"
11934       "int j      = 2;",
11935       Alignment);
11936 
11937   verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
11938                "          typename B   = very_long_type_name_1,\n"
11939                "          typename T_2 = very_long_type_name_2>\n"
11940                "auto foo() {}\n",
11941                Alignment);
11942   verifyFormat("int a, b = 1;\n"
11943                "int c  = 2;\n"
11944                "int dd = 3;\n",
11945                Alignment);
11946   verifyFormat("int aa       = ((1 > 2) ? 3 : 4);\n"
11947                "float b[1][] = {{3.f}};\n",
11948                Alignment);
11949   verifyFormat("for (int i = 0; i < 1; i++)\n"
11950                "  int x = 1;\n",
11951                Alignment);
11952   verifyFormat("for (i = 0; i < 1; i++)\n"
11953                "  x = 1;\n"
11954                "y = 1;\n",
11955                Alignment);
11956 }
11957 
11958 TEST_F(FormatTest, AlignConsecutiveDeclarations) {
11959   FormatStyle Alignment = getLLVMStyle();
11960   Alignment.AlignConsecutiveMacros = true;
11961   Alignment.AlignConsecutiveDeclarations = false;
11962   verifyFormat("float const a = 5;\n"
11963                "int oneTwoThree = 123;",
11964                Alignment);
11965   verifyFormat("int a = 5;\n"
11966                "float const oneTwoThree = 123;",
11967                Alignment);
11968 
11969   Alignment.AlignConsecutiveDeclarations = true;
11970   verifyFormat("float const a = 5;\n"
11971                "int         oneTwoThree = 123;",
11972                Alignment);
11973   verifyFormat("int         a = method();\n"
11974                "float const oneTwoThree = 133;",
11975                Alignment);
11976   verifyFormat("int i = 1, j = 10;\n"
11977                "something = 2000;",
11978                Alignment);
11979   verifyFormat("something = 2000;\n"
11980                "int i = 1, j = 10;\n",
11981                Alignment);
11982   verifyFormat("float      something = 2000;\n"
11983                "double     another = 911;\n"
11984                "int        i = 1, j = 10;\n"
11985                "const int *oneMore = 1;\n"
11986                "unsigned   i = 2;",
11987                Alignment);
11988   verifyFormat("float a = 5;\n"
11989                "int   one = 1;\n"
11990                "method();\n"
11991                "const double       oneTwoThree = 123;\n"
11992                "const unsigned int oneTwo = 12;",
11993                Alignment);
11994   verifyFormat("int      oneTwoThree{0}; // comment\n"
11995                "unsigned oneTwo;         // comment",
11996                Alignment);
11997   EXPECT_EQ("float const a = 5;\n"
11998             "\n"
11999             "int oneTwoThree = 123;",
12000             format("float const   a = 5;\n"
12001                    "\n"
12002                    "int           oneTwoThree= 123;",
12003                    Alignment));
12004   EXPECT_EQ("float a = 5;\n"
12005             "int   one = 1;\n"
12006             "\n"
12007             "unsigned oneTwoThree = 123;",
12008             format("float    a = 5;\n"
12009                    "int      one = 1;\n"
12010                    "\n"
12011                    "unsigned oneTwoThree = 123;",
12012                    Alignment));
12013   EXPECT_EQ("float a = 5;\n"
12014             "int   one = 1;\n"
12015             "\n"
12016             "unsigned oneTwoThree = 123;\n"
12017             "int      oneTwo = 12;",
12018             format("float    a = 5;\n"
12019                    "int one = 1;\n"
12020                    "\n"
12021                    "unsigned oneTwoThree = 123;\n"
12022                    "int oneTwo = 12;",
12023                    Alignment));
12024   // Function prototype alignment
12025   verifyFormat("int    a();\n"
12026                "double b();",
12027                Alignment);
12028   verifyFormat("int    a(int x);\n"
12029                "double b();",
12030                Alignment);
12031   unsigned OldColumnLimit = Alignment.ColumnLimit;
12032   // We need to set ColumnLimit to zero, in order to stress nested alignments,
12033   // otherwise the function parameters will be re-flowed onto a single line.
12034   Alignment.ColumnLimit = 0;
12035   EXPECT_EQ("int    a(int   x,\n"
12036             "         float y);\n"
12037             "double b(int    x,\n"
12038             "         double y);",
12039             format("int a(int x,\n"
12040                    " float y);\n"
12041                    "double b(int x,\n"
12042                    " double y);",
12043                    Alignment));
12044   // This ensures that function parameters of function declarations are
12045   // correctly indented when their owning functions are indented.
12046   // The failure case here is for 'double y' to not be indented enough.
12047   EXPECT_EQ("double a(int x);\n"
12048             "int    b(int    y,\n"
12049             "         double z);",
12050             format("double a(int x);\n"
12051                    "int b(int y,\n"
12052                    " double z);",
12053                    Alignment));
12054   // Set ColumnLimit low so that we induce wrapping immediately after
12055   // the function name and opening paren.
12056   Alignment.ColumnLimit = 13;
12057   verifyFormat("int function(\n"
12058                "    int  x,\n"
12059                "    bool y);",
12060                Alignment);
12061   Alignment.ColumnLimit = OldColumnLimit;
12062   // Ensure function pointers don't screw up recursive alignment
12063   verifyFormat("int    a(int x, void (*fp)(int y));\n"
12064                "double b();",
12065                Alignment);
12066   Alignment.AlignConsecutiveAssignments = true;
12067   // Ensure recursive alignment is broken by function braces, so that the
12068   // "a = 1" does not align with subsequent assignments inside the function
12069   // body.
12070   verifyFormat("int func(int a = 1) {\n"
12071                "  int b  = 2;\n"
12072                "  int cc = 3;\n"
12073                "}",
12074                Alignment);
12075   verifyFormat("float      something = 2000;\n"
12076                "double     another   = 911;\n"
12077                "int        i = 1, j = 10;\n"
12078                "const int *oneMore = 1;\n"
12079                "unsigned   i       = 2;",
12080                Alignment);
12081   verifyFormat("int      oneTwoThree = {0}; // comment\n"
12082                "unsigned oneTwo      = 0;   // comment",
12083                Alignment);
12084   // Make sure that scope is correctly tracked, in the absence of braces
12085   verifyFormat("for (int i = 0; i < n; i++)\n"
12086                "  j = i;\n"
12087                "double x = 1;\n",
12088                Alignment);
12089   verifyFormat("if (int i = 0)\n"
12090                "  j = i;\n"
12091                "double x = 1;\n",
12092                Alignment);
12093   // Ensure operator[] and operator() are comprehended
12094   verifyFormat("struct test {\n"
12095                "  long long int foo();\n"
12096                "  int           operator[](int a);\n"
12097                "  double        bar();\n"
12098                "};\n",
12099                Alignment);
12100   verifyFormat("struct test {\n"
12101                "  long long int foo();\n"
12102                "  int           operator()(int a);\n"
12103                "  double        bar();\n"
12104                "};\n",
12105                Alignment);
12106   EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
12107             "  int const i   = 1;\n"
12108             "  int *     j   = 2;\n"
12109             "  int       big = 10000;\n"
12110             "\n"
12111             "  unsigned oneTwoThree = 123;\n"
12112             "  int      oneTwo      = 12;\n"
12113             "  method();\n"
12114             "  float k  = 2;\n"
12115             "  int   ll = 10000;\n"
12116             "}",
12117             format("void SomeFunction(int parameter= 0) {\n"
12118                    " int const  i= 1;\n"
12119                    "  int *j=2;\n"
12120                    " int big  =  10000;\n"
12121                    "\n"
12122                    "unsigned oneTwoThree  =123;\n"
12123                    "int oneTwo = 12;\n"
12124                    "  method();\n"
12125                    "float k= 2;\n"
12126                    "int ll=10000;\n"
12127                    "}",
12128                    Alignment));
12129   Alignment.AlignConsecutiveAssignments = false;
12130   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
12131   verifyFormat("#define A \\\n"
12132                "  int       aaaa = 12; \\\n"
12133                "  float     b = 23; \\\n"
12134                "  const int ccc = 234; \\\n"
12135                "  unsigned  dddddddddd = 2345;",
12136                Alignment);
12137   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
12138   verifyFormat("#define A              \\\n"
12139                "  int       aaaa = 12; \\\n"
12140                "  float     b = 23;    \\\n"
12141                "  const int ccc = 234; \\\n"
12142                "  unsigned  dddddddddd = 2345;",
12143                Alignment);
12144   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
12145   Alignment.ColumnLimit = 30;
12146   verifyFormat("#define A                    \\\n"
12147                "  int       aaaa = 12;       \\\n"
12148                "  float     b = 23;          \\\n"
12149                "  const int ccc = 234;       \\\n"
12150                "  int       dddddddddd = 2345;",
12151                Alignment);
12152   Alignment.ColumnLimit = 80;
12153   verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
12154                "k = 4, int l = 5,\n"
12155                "                  int m = 6) {\n"
12156                "  const int j = 10;\n"
12157                "  otherThing = 1;\n"
12158                "}",
12159                Alignment);
12160   verifyFormat("void SomeFunction(int parameter = 0) {\n"
12161                "  int const i = 1;\n"
12162                "  int *     j = 2;\n"
12163                "  int       big = 10000;\n"
12164                "}",
12165                Alignment);
12166   verifyFormat("class C {\n"
12167                "public:\n"
12168                "  int          i = 1;\n"
12169                "  virtual void f() = 0;\n"
12170                "};",
12171                Alignment);
12172   verifyFormat("float i = 1;\n"
12173                "if (SomeType t = getSomething()) {\n"
12174                "}\n"
12175                "const unsigned j = 2;\n"
12176                "int            big = 10000;",
12177                Alignment);
12178   verifyFormat("float j = 7;\n"
12179                "for (int k = 0; k < N; ++k) {\n"
12180                "}\n"
12181                "unsigned j = 2;\n"
12182                "int      big = 10000;\n"
12183                "}",
12184                Alignment);
12185   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
12186   verifyFormat("float              i = 1;\n"
12187                "LooooooooooongType loooooooooooooooooooooongVariable\n"
12188                "    = someLooooooooooooooooongFunction();\n"
12189                "int j = 2;",
12190                Alignment);
12191   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
12192   verifyFormat("int                i = 1;\n"
12193                "LooooooooooongType loooooooooooooooooooooongVariable =\n"
12194                "    someLooooooooooooooooongFunction();\n"
12195                "int j = 2;",
12196                Alignment);
12197 
12198   Alignment.AlignConsecutiveAssignments = true;
12199   verifyFormat("auto lambda = []() {\n"
12200                "  auto  ii = 0;\n"
12201                "  float j  = 0;\n"
12202                "  return 0;\n"
12203                "};\n"
12204                "int   i  = 0;\n"
12205                "float i2 = 0;\n"
12206                "auto  v  = type{\n"
12207                "    i = 1,   //\n"
12208                "    (i = 2), //\n"
12209                "    i = 3    //\n"
12210                "};",
12211                Alignment);
12212   Alignment.AlignConsecutiveAssignments = false;
12213 
12214   verifyFormat(
12215       "int      i = 1;\n"
12216       "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
12217       "                          loooooooooooooooooooooongParameterB);\n"
12218       "int      j = 2;",
12219       Alignment);
12220 
12221   // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
12222   // We expect declarations and assignments to align, as long as it doesn't
12223   // exceed the column limit, starting a new alignment sequence whenever it
12224   // happens.
12225   Alignment.AlignConsecutiveAssignments = true;
12226   Alignment.ColumnLimit = 30;
12227   verifyFormat("float    ii              = 1;\n"
12228                "unsigned j               = 2;\n"
12229                "int someVerylongVariable = 1;\n"
12230                "AnotherLongType  ll = 123456;\n"
12231                "VeryVeryLongType k  = 2;\n"
12232                "int              myvar = 1;",
12233                Alignment);
12234   Alignment.ColumnLimit = 80;
12235   Alignment.AlignConsecutiveAssignments = false;
12236 
12237   verifyFormat(
12238       "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
12239       "          typename LongType, typename B>\n"
12240       "auto foo() {}\n",
12241       Alignment);
12242   verifyFormat("float a, b = 1;\n"
12243                "int   c = 2;\n"
12244                "int   dd = 3;\n",
12245                Alignment);
12246   verifyFormat("int   aa = ((1 > 2) ? 3 : 4);\n"
12247                "float b[1][] = {{3.f}};\n",
12248                Alignment);
12249   Alignment.AlignConsecutiveAssignments = true;
12250   verifyFormat("float a, b = 1;\n"
12251                "int   c  = 2;\n"
12252                "int   dd = 3;\n",
12253                Alignment);
12254   verifyFormat("int   aa     = ((1 > 2) ? 3 : 4);\n"
12255                "float b[1][] = {{3.f}};\n",
12256                Alignment);
12257   Alignment.AlignConsecutiveAssignments = false;
12258 
12259   Alignment.ColumnLimit = 30;
12260   Alignment.BinPackParameters = false;
12261   verifyFormat("void foo(float     a,\n"
12262                "         float     b,\n"
12263                "         int       c,\n"
12264                "         uint32_t *d) {\n"
12265                "  int *  e = 0;\n"
12266                "  float  f = 0;\n"
12267                "  double g = 0;\n"
12268                "}\n"
12269                "void bar(ino_t     a,\n"
12270                "         int       b,\n"
12271                "         uint32_t *c,\n"
12272                "         bool      d) {}\n",
12273                Alignment);
12274   Alignment.BinPackParameters = true;
12275   Alignment.ColumnLimit = 80;
12276 
12277   // Bug 33507
12278   Alignment.PointerAlignment = FormatStyle::PAS_Middle;
12279   verifyFormat(
12280       "auto found = range::find_if(vsProducts, [&](auto * aProduct) {\n"
12281       "  static const Version verVs2017;\n"
12282       "  return true;\n"
12283       "});\n",
12284       Alignment);
12285   Alignment.PointerAlignment = FormatStyle::PAS_Right;
12286 
12287   // See llvm.org/PR35641
12288   Alignment.AlignConsecutiveDeclarations = true;
12289   verifyFormat("int func() { //\n"
12290                "  int      b;\n"
12291                "  unsigned c;\n"
12292                "}",
12293                Alignment);
12294 
12295   // See PR37175
12296   FormatStyle Style = getMozillaStyle();
12297   Style.AlignConsecutiveDeclarations = true;
12298   EXPECT_EQ("DECOR1 /**/ int8_t /**/ DECOR2 /**/\n"
12299             "foo(int a);",
12300             format("DECOR1 /**/ int8_t /**/ DECOR2 /**/ foo (int a);", Style));
12301 }
12302 
12303 TEST_F(FormatTest, LinuxBraceBreaking) {
12304   FormatStyle LinuxBraceStyle = getLLVMStyle();
12305   LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
12306   verifyFormat("namespace a\n"
12307                "{\n"
12308                "class A\n"
12309                "{\n"
12310                "  void f()\n"
12311                "  {\n"
12312                "    if (true) {\n"
12313                "      a();\n"
12314                "      b();\n"
12315                "    } else {\n"
12316                "      a();\n"
12317                "    }\n"
12318                "  }\n"
12319                "  void g() { return; }\n"
12320                "};\n"
12321                "struct B {\n"
12322                "  int x;\n"
12323                "};\n"
12324                "} // namespace a\n",
12325                LinuxBraceStyle);
12326   verifyFormat("enum X {\n"
12327                "  Y = 0,\n"
12328                "}\n",
12329                LinuxBraceStyle);
12330   verifyFormat("struct S {\n"
12331                "  int Type;\n"
12332                "  union {\n"
12333                "    int x;\n"
12334                "    double y;\n"
12335                "  } Value;\n"
12336                "  class C\n"
12337                "  {\n"
12338                "    MyFavoriteType Value;\n"
12339                "  } Class;\n"
12340                "}\n",
12341                LinuxBraceStyle);
12342 }
12343 
12344 TEST_F(FormatTest, MozillaBraceBreaking) {
12345   FormatStyle MozillaBraceStyle = getLLVMStyle();
12346   MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
12347   MozillaBraceStyle.FixNamespaceComments = false;
12348   verifyFormat("namespace a {\n"
12349                "class A\n"
12350                "{\n"
12351                "  void f()\n"
12352                "  {\n"
12353                "    if (true) {\n"
12354                "      a();\n"
12355                "      b();\n"
12356                "    }\n"
12357                "  }\n"
12358                "  void g() { return; }\n"
12359                "};\n"
12360                "enum E\n"
12361                "{\n"
12362                "  A,\n"
12363                "  // foo\n"
12364                "  B,\n"
12365                "  C\n"
12366                "};\n"
12367                "struct B\n"
12368                "{\n"
12369                "  int x;\n"
12370                "};\n"
12371                "}\n",
12372                MozillaBraceStyle);
12373   verifyFormat("struct S\n"
12374                "{\n"
12375                "  int Type;\n"
12376                "  union\n"
12377                "  {\n"
12378                "    int x;\n"
12379                "    double y;\n"
12380                "  } Value;\n"
12381                "  class C\n"
12382                "  {\n"
12383                "    MyFavoriteType Value;\n"
12384                "  } Class;\n"
12385                "}\n",
12386                MozillaBraceStyle);
12387 }
12388 
12389 TEST_F(FormatTest, StroustrupBraceBreaking) {
12390   FormatStyle StroustrupBraceStyle = getLLVMStyle();
12391   StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
12392   verifyFormat("namespace a {\n"
12393                "class A {\n"
12394                "  void f()\n"
12395                "  {\n"
12396                "    if (true) {\n"
12397                "      a();\n"
12398                "      b();\n"
12399                "    }\n"
12400                "  }\n"
12401                "  void g() { return; }\n"
12402                "};\n"
12403                "struct B {\n"
12404                "  int x;\n"
12405                "};\n"
12406                "} // namespace a\n",
12407                StroustrupBraceStyle);
12408 
12409   verifyFormat("void foo()\n"
12410                "{\n"
12411                "  if (a) {\n"
12412                "    a();\n"
12413                "  }\n"
12414                "  else {\n"
12415                "    b();\n"
12416                "  }\n"
12417                "}\n",
12418                StroustrupBraceStyle);
12419 
12420   verifyFormat("#ifdef _DEBUG\n"
12421                "int foo(int i = 0)\n"
12422                "#else\n"
12423                "int foo(int i = 5)\n"
12424                "#endif\n"
12425                "{\n"
12426                "  return i;\n"
12427                "}",
12428                StroustrupBraceStyle);
12429 
12430   verifyFormat("void foo() {}\n"
12431                "void bar()\n"
12432                "#ifdef _DEBUG\n"
12433                "{\n"
12434                "  foo();\n"
12435                "}\n"
12436                "#else\n"
12437                "{\n"
12438                "}\n"
12439                "#endif",
12440                StroustrupBraceStyle);
12441 
12442   verifyFormat("void foobar() { int i = 5; }\n"
12443                "#ifdef _DEBUG\n"
12444                "void bar() {}\n"
12445                "#else\n"
12446                "void bar() { foobar(); }\n"
12447                "#endif",
12448                StroustrupBraceStyle);
12449 }
12450 
12451 TEST_F(FormatTest, AllmanBraceBreaking) {
12452   FormatStyle AllmanBraceStyle = getLLVMStyle();
12453   AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
12454 
12455   EXPECT_EQ("namespace a\n"
12456             "{\n"
12457             "void f();\n"
12458             "void g();\n"
12459             "} // namespace a\n",
12460             format("namespace a\n"
12461                    "{\n"
12462                    "void f();\n"
12463                    "void g();\n"
12464                    "}\n",
12465                    AllmanBraceStyle));
12466 
12467   verifyFormat("namespace a\n"
12468                "{\n"
12469                "class A\n"
12470                "{\n"
12471                "  void f()\n"
12472                "  {\n"
12473                "    if (true)\n"
12474                "    {\n"
12475                "      a();\n"
12476                "      b();\n"
12477                "    }\n"
12478                "  }\n"
12479                "  void g() { return; }\n"
12480                "};\n"
12481                "struct B\n"
12482                "{\n"
12483                "  int x;\n"
12484                "};\n"
12485                "union C\n"
12486                "{\n"
12487                "};\n"
12488                "} // namespace a",
12489                AllmanBraceStyle);
12490 
12491   verifyFormat("void f()\n"
12492                "{\n"
12493                "  if (true)\n"
12494                "  {\n"
12495                "    a();\n"
12496                "  }\n"
12497                "  else if (false)\n"
12498                "  {\n"
12499                "    b();\n"
12500                "  }\n"
12501                "  else\n"
12502                "  {\n"
12503                "    c();\n"
12504                "  }\n"
12505                "}\n",
12506                AllmanBraceStyle);
12507 
12508   verifyFormat("void f()\n"
12509                "{\n"
12510                "  for (int i = 0; i < 10; ++i)\n"
12511                "  {\n"
12512                "    a();\n"
12513                "  }\n"
12514                "  while (false)\n"
12515                "  {\n"
12516                "    b();\n"
12517                "  }\n"
12518                "  do\n"
12519                "  {\n"
12520                "    c();\n"
12521                "  } while (false)\n"
12522                "}\n",
12523                AllmanBraceStyle);
12524 
12525   verifyFormat("void f(int a)\n"
12526                "{\n"
12527                "  switch (a)\n"
12528                "  {\n"
12529                "  case 0:\n"
12530                "    break;\n"
12531                "  case 1:\n"
12532                "  {\n"
12533                "    break;\n"
12534                "  }\n"
12535                "  case 2:\n"
12536                "  {\n"
12537                "  }\n"
12538                "  break;\n"
12539                "  default:\n"
12540                "    break;\n"
12541                "  }\n"
12542                "}\n",
12543                AllmanBraceStyle);
12544 
12545   verifyFormat("enum X\n"
12546                "{\n"
12547                "  Y = 0,\n"
12548                "}\n",
12549                AllmanBraceStyle);
12550   verifyFormat("enum X\n"
12551                "{\n"
12552                "  Y = 0\n"
12553                "}\n",
12554                AllmanBraceStyle);
12555 
12556   verifyFormat("@interface BSApplicationController ()\n"
12557                "{\n"
12558                "@private\n"
12559                "  id _extraIvar;\n"
12560                "}\n"
12561                "@end\n",
12562                AllmanBraceStyle);
12563 
12564   verifyFormat("#ifdef _DEBUG\n"
12565                "int foo(int i = 0)\n"
12566                "#else\n"
12567                "int foo(int i = 5)\n"
12568                "#endif\n"
12569                "{\n"
12570                "  return i;\n"
12571                "}",
12572                AllmanBraceStyle);
12573 
12574   verifyFormat("void foo() {}\n"
12575                "void bar()\n"
12576                "#ifdef _DEBUG\n"
12577                "{\n"
12578                "  foo();\n"
12579                "}\n"
12580                "#else\n"
12581                "{\n"
12582                "}\n"
12583                "#endif",
12584                AllmanBraceStyle);
12585 
12586   verifyFormat("void foobar() { int i = 5; }\n"
12587                "#ifdef _DEBUG\n"
12588                "void bar() {}\n"
12589                "#else\n"
12590                "void bar() { foobar(); }\n"
12591                "#endif",
12592                AllmanBraceStyle);
12593 
12594   // This shouldn't affect ObjC blocks..
12595   verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
12596                "  // ...\n"
12597                "  int i;\n"
12598                "}];",
12599                AllmanBraceStyle);
12600   verifyFormat("void (^block)(void) = ^{\n"
12601                "  // ...\n"
12602                "  int i;\n"
12603                "};",
12604                AllmanBraceStyle);
12605   // .. or dict literals.
12606   verifyFormat("void f()\n"
12607                "{\n"
12608                "  // ...\n"
12609                "  [object someMethod:@{@\"a\" : @\"b\"}];\n"
12610                "}",
12611                AllmanBraceStyle);
12612   verifyFormat("void f()\n"
12613                "{\n"
12614                "  // ...\n"
12615                "  [object someMethod:@{a : @\"b\"}];\n"
12616                "}",
12617                AllmanBraceStyle);
12618   verifyFormat("int f()\n"
12619                "{ // comment\n"
12620                "  return 42;\n"
12621                "}",
12622                AllmanBraceStyle);
12623 
12624   AllmanBraceStyle.ColumnLimit = 19;
12625   verifyFormat("void f() { int i; }", AllmanBraceStyle);
12626   AllmanBraceStyle.ColumnLimit = 18;
12627   verifyFormat("void f()\n"
12628                "{\n"
12629                "  int i;\n"
12630                "}",
12631                AllmanBraceStyle);
12632   AllmanBraceStyle.ColumnLimit = 80;
12633 
12634   FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
12635   BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine =
12636       FormatStyle::SIS_WithoutElse;
12637   BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
12638   verifyFormat("void f(bool b)\n"
12639                "{\n"
12640                "  if (b)\n"
12641                "  {\n"
12642                "    return;\n"
12643                "  }\n"
12644                "}\n",
12645                BreakBeforeBraceShortIfs);
12646   verifyFormat("void f(bool b)\n"
12647                "{\n"
12648                "  if constexpr (b)\n"
12649                "  {\n"
12650                "    return;\n"
12651                "  }\n"
12652                "}\n",
12653                BreakBeforeBraceShortIfs);
12654   verifyFormat("void f(bool b)\n"
12655                "{\n"
12656                "  if CONSTEXPR (b)\n"
12657                "  {\n"
12658                "    return;\n"
12659                "  }\n"
12660                "}\n",
12661                BreakBeforeBraceShortIfs);
12662   verifyFormat("void f(bool b)\n"
12663                "{\n"
12664                "  if (b) return;\n"
12665                "}\n",
12666                BreakBeforeBraceShortIfs);
12667   verifyFormat("void f(bool b)\n"
12668                "{\n"
12669                "  if constexpr (b) return;\n"
12670                "}\n",
12671                BreakBeforeBraceShortIfs);
12672   verifyFormat("void f(bool b)\n"
12673                "{\n"
12674                "  if CONSTEXPR (b) return;\n"
12675                "}\n",
12676                BreakBeforeBraceShortIfs);
12677   verifyFormat("void f(bool b)\n"
12678                "{\n"
12679                "  while (b)\n"
12680                "  {\n"
12681                "    return;\n"
12682                "  }\n"
12683                "}\n",
12684                BreakBeforeBraceShortIfs);
12685 }
12686 
12687 TEST_F(FormatTest, WhitesmithsBraceBreaking) {
12688   FormatStyle WhitesmithsBraceStyle = getLLVMStyle();
12689   WhitesmithsBraceStyle.BreakBeforeBraces = FormatStyle::BS_Whitesmiths;
12690 
12691   // Make a few changes to the style for testing purposes
12692   WhitesmithsBraceStyle.AllowShortFunctionsOnASingleLine =
12693       FormatStyle::SFS_Empty;
12694   WhitesmithsBraceStyle.AllowShortLambdasOnASingleLine = FormatStyle::SLS_None;
12695   WhitesmithsBraceStyle.ColumnLimit = 0;
12696 
12697   // FIXME: this test case can't decide whether there should be a blank line
12698   // after the ~D() line or not. It adds one if one doesn't exist in the test
12699   // and it removes the line if one exists.
12700   /*
12701   verifyFormat("class A;\n"
12702                "namespace B\n"
12703                "  {\n"
12704                "class C;\n"
12705                "// Comment\n"
12706                "class D\n"
12707                "  {\n"
12708                "public:\n"
12709                "  D();\n"
12710                "  ~D() {}\n"
12711                "private:\n"
12712                "  enum E\n"
12713                "    {\n"
12714                "    F\n"
12715                "    }\n"
12716                "  };\n"
12717                "  } // namespace B\n",
12718                WhitesmithsBraceStyle);
12719   */
12720 
12721   verifyFormat("namespace a\n"
12722                "  {\n"
12723                "class A\n"
12724                "  {\n"
12725                "  void f()\n"
12726                "    {\n"
12727                "    if (true)\n"
12728                "      {\n"
12729                "      a();\n"
12730                "      b();\n"
12731                "      }\n"
12732                "    }\n"
12733                "  void g()\n"
12734                "    {\n"
12735                "    return;\n"
12736                "    }\n"
12737                "  };\n"
12738                "struct B\n"
12739                "  {\n"
12740                "  int x;\n"
12741                "  };\n"
12742                "  } // namespace a",
12743                WhitesmithsBraceStyle);
12744 
12745   verifyFormat("void f()\n"
12746                "  {\n"
12747                "  if (true)\n"
12748                "    {\n"
12749                "    a();\n"
12750                "    }\n"
12751                "  else if (false)\n"
12752                "    {\n"
12753                "    b();\n"
12754                "    }\n"
12755                "  else\n"
12756                "    {\n"
12757                "    c();\n"
12758                "    }\n"
12759                "  }\n",
12760                WhitesmithsBraceStyle);
12761 
12762   verifyFormat("void f()\n"
12763                "  {\n"
12764                "  for (int i = 0; i < 10; ++i)\n"
12765                "    {\n"
12766                "    a();\n"
12767                "    }\n"
12768                "  while (false)\n"
12769                "    {\n"
12770                "    b();\n"
12771                "    }\n"
12772                "  do\n"
12773                "    {\n"
12774                "    c();\n"
12775                "    } while (false)\n"
12776                "  }\n",
12777                WhitesmithsBraceStyle);
12778 
12779   // FIXME: the block and the break under case 2 in this test don't get indented
12780   // correctly
12781   /*
12782   verifyFormat("void switchTest1(int a)\n"
12783                "  {\n"
12784                "  switch (a)\n"
12785                "    {\n"
12786                "    case 2:\n"
12787                "      {\n"
12788                "      }\n"
12789                "      break;\n"
12790                "    }\n"
12791                "  }\n",
12792                WhitesmithsBraceStyle);
12793   */
12794 
12795   // FIXME: the block and the break under case 2 in this test don't get indented
12796   // correctly
12797   /*
12798   verifyFormat("void switchTest2(int a)\n"
12799                "  {\n"
12800                "  switch (a)\n"
12801                "    {\n"
12802                "  case 0:\n"
12803                "    break;\n"
12804                "  case 1:\n"
12805                "    {\n"
12806                "    break;\n"
12807                "    }\n"
12808                "  case 2:\n"
12809                "    {\n"
12810                "    }\n"
12811                "    break;\n"
12812                "  default:\n"
12813                "    break;\n"
12814                "    }\n"
12815                "  }\n",
12816                WhitesmithsBraceStyle);
12817   */
12818 
12819   verifyFormat("enum X\n"
12820                "  {\n"
12821                "  Y = 0, // testing\n"
12822                "  }\n",
12823                WhitesmithsBraceStyle);
12824 
12825   verifyFormat("enum X\n"
12826                "  {\n"
12827                "  Y = 0\n"
12828                "  }\n",
12829                WhitesmithsBraceStyle);
12830   verifyFormat("enum X\n"
12831                "  {\n"
12832                "  Y = 0,\n"
12833                "  Z = 1\n"
12834                "  };\n",
12835                WhitesmithsBraceStyle);
12836 
12837   verifyFormat("@interface BSApplicationController ()\n"
12838                "  {\n"
12839                "@private\n"
12840                "  id _extraIvar;\n"
12841                "  }\n"
12842                "@end\n",
12843                WhitesmithsBraceStyle);
12844 
12845   verifyFormat("#ifdef _DEBUG\n"
12846                "int foo(int i = 0)\n"
12847                "#else\n"
12848                "int foo(int i = 5)\n"
12849                "#endif\n"
12850                "  {\n"
12851                "  return i;\n"
12852                "  }",
12853                WhitesmithsBraceStyle);
12854 
12855   verifyFormat("void foo() {}\n"
12856                "void bar()\n"
12857                "#ifdef _DEBUG\n"
12858                "  {\n"
12859                "  foo();\n"
12860                "  }\n"
12861                "#else\n"
12862                "  {\n"
12863                "  }\n"
12864                "#endif",
12865                WhitesmithsBraceStyle);
12866 
12867   verifyFormat("void foobar()\n"
12868                "  {\n"
12869                "  int i = 5;\n"
12870                "  }\n"
12871                "#ifdef _DEBUG\n"
12872                "void bar()\n"
12873                "  {\n"
12874                "  }\n"
12875                "#else\n"
12876                "void bar()\n"
12877                "  {\n"
12878                "  foobar();\n"
12879                "  }\n"
12880                "#endif",
12881                WhitesmithsBraceStyle);
12882 
12883   // This shouldn't affect ObjC blocks..
12884   verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
12885                "  // ...\n"
12886                "  int i;\n"
12887                "}];",
12888                WhitesmithsBraceStyle);
12889   verifyFormat("void (^block)(void) = ^{\n"
12890                "  // ...\n"
12891                "  int i;\n"
12892                "};",
12893                WhitesmithsBraceStyle);
12894   // .. or dict literals.
12895   verifyFormat("void f()\n"
12896                "  {\n"
12897                "  [object someMethod:@{@\"a\" : @\"b\"}];\n"
12898                "  }",
12899                WhitesmithsBraceStyle);
12900 
12901   verifyFormat("int f()\n"
12902                "  { // comment\n"
12903                "  return 42;\n"
12904                "  }",
12905                WhitesmithsBraceStyle);
12906 
12907   FormatStyle BreakBeforeBraceShortIfs = WhitesmithsBraceStyle;
12908   BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine =
12909       FormatStyle::SIS_Always;
12910   BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
12911   verifyFormat("void f(bool b)\n"
12912                "  {\n"
12913                "  if (b)\n"
12914                "    {\n"
12915                "    return;\n"
12916                "    }\n"
12917                "  }\n",
12918                BreakBeforeBraceShortIfs);
12919   verifyFormat("void f(bool b)\n"
12920                "  {\n"
12921                "  if (b) return;\n"
12922                "  }\n",
12923                BreakBeforeBraceShortIfs);
12924   verifyFormat("void f(bool b)\n"
12925                "  {\n"
12926                "  while (b)\n"
12927                "    {\n"
12928                "    return;\n"
12929                "    }\n"
12930                "  }\n",
12931                BreakBeforeBraceShortIfs);
12932 }
12933 
12934 TEST_F(FormatTest, GNUBraceBreaking) {
12935   FormatStyle GNUBraceStyle = getLLVMStyle();
12936   GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
12937   verifyFormat("namespace a\n"
12938                "{\n"
12939                "class A\n"
12940                "{\n"
12941                "  void f()\n"
12942                "  {\n"
12943                "    int a;\n"
12944                "    {\n"
12945                "      int b;\n"
12946                "    }\n"
12947                "    if (true)\n"
12948                "      {\n"
12949                "        a();\n"
12950                "        b();\n"
12951                "      }\n"
12952                "  }\n"
12953                "  void g() { return; }\n"
12954                "}\n"
12955                "} // namespace a",
12956                GNUBraceStyle);
12957 
12958   verifyFormat("void f()\n"
12959                "{\n"
12960                "  if (true)\n"
12961                "    {\n"
12962                "      a();\n"
12963                "    }\n"
12964                "  else if (false)\n"
12965                "    {\n"
12966                "      b();\n"
12967                "    }\n"
12968                "  else\n"
12969                "    {\n"
12970                "      c();\n"
12971                "    }\n"
12972                "}\n",
12973                GNUBraceStyle);
12974 
12975   verifyFormat("void f()\n"
12976                "{\n"
12977                "  for (int i = 0; i < 10; ++i)\n"
12978                "    {\n"
12979                "      a();\n"
12980                "    }\n"
12981                "  while (false)\n"
12982                "    {\n"
12983                "      b();\n"
12984                "    }\n"
12985                "  do\n"
12986                "    {\n"
12987                "      c();\n"
12988                "    }\n"
12989                "  while (false);\n"
12990                "}\n",
12991                GNUBraceStyle);
12992 
12993   verifyFormat("void f(int a)\n"
12994                "{\n"
12995                "  switch (a)\n"
12996                "    {\n"
12997                "    case 0:\n"
12998                "      break;\n"
12999                "    case 1:\n"
13000                "      {\n"
13001                "        break;\n"
13002                "      }\n"
13003                "    case 2:\n"
13004                "      {\n"
13005                "      }\n"
13006                "      break;\n"
13007                "    default:\n"
13008                "      break;\n"
13009                "    }\n"
13010                "}\n",
13011                GNUBraceStyle);
13012 
13013   verifyFormat("enum X\n"
13014                "{\n"
13015                "  Y = 0,\n"
13016                "}\n",
13017                GNUBraceStyle);
13018 
13019   verifyFormat("@interface BSApplicationController ()\n"
13020                "{\n"
13021                "@private\n"
13022                "  id _extraIvar;\n"
13023                "}\n"
13024                "@end\n",
13025                GNUBraceStyle);
13026 
13027   verifyFormat("#ifdef _DEBUG\n"
13028                "int foo(int i = 0)\n"
13029                "#else\n"
13030                "int foo(int i = 5)\n"
13031                "#endif\n"
13032                "{\n"
13033                "  return i;\n"
13034                "}",
13035                GNUBraceStyle);
13036 
13037   verifyFormat("void foo() {}\n"
13038                "void bar()\n"
13039                "#ifdef _DEBUG\n"
13040                "{\n"
13041                "  foo();\n"
13042                "}\n"
13043                "#else\n"
13044                "{\n"
13045                "}\n"
13046                "#endif",
13047                GNUBraceStyle);
13048 
13049   verifyFormat("void foobar() { int i = 5; }\n"
13050                "#ifdef _DEBUG\n"
13051                "void bar() {}\n"
13052                "#else\n"
13053                "void bar() { foobar(); }\n"
13054                "#endif",
13055                GNUBraceStyle);
13056 }
13057 
13058 TEST_F(FormatTest, WebKitBraceBreaking) {
13059   FormatStyle WebKitBraceStyle = getLLVMStyle();
13060   WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
13061   WebKitBraceStyle.FixNamespaceComments = false;
13062   verifyFormat("namespace a {\n"
13063                "class A {\n"
13064                "  void f()\n"
13065                "  {\n"
13066                "    if (true) {\n"
13067                "      a();\n"
13068                "      b();\n"
13069                "    }\n"
13070                "  }\n"
13071                "  void g() { return; }\n"
13072                "};\n"
13073                "enum E {\n"
13074                "  A,\n"
13075                "  // foo\n"
13076                "  B,\n"
13077                "  C\n"
13078                "};\n"
13079                "struct B {\n"
13080                "  int x;\n"
13081                "};\n"
13082                "}\n",
13083                WebKitBraceStyle);
13084   verifyFormat("struct S {\n"
13085                "  int Type;\n"
13086                "  union {\n"
13087                "    int x;\n"
13088                "    double y;\n"
13089                "  } Value;\n"
13090                "  class C {\n"
13091                "    MyFavoriteType Value;\n"
13092                "  } Class;\n"
13093                "};\n",
13094                WebKitBraceStyle);
13095 }
13096 
13097 TEST_F(FormatTest, CatchExceptionReferenceBinding) {
13098   verifyFormat("void f() {\n"
13099                "  try {\n"
13100                "  } catch (const Exception &e) {\n"
13101                "  }\n"
13102                "}\n",
13103                getLLVMStyle());
13104 }
13105 
13106 TEST_F(FormatTest, UnderstandsPragmas) {
13107   verifyFormat("#pragma omp reduction(| : var)");
13108   verifyFormat("#pragma omp reduction(+ : var)");
13109 
13110   EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
13111             "(including parentheses).",
13112             format("#pragma    mark   Any non-hyphenated or hyphenated string "
13113                    "(including parentheses)."));
13114 }
13115 
13116 TEST_F(FormatTest, UnderstandPragmaOption) {
13117   verifyFormat("#pragma option -C -A");
13118 
13119   EXPECT_EQ("#pragma option -C -A", format("#pragma    option   -C   -A"));
13120 }
13121 
13122 TEST_F(FormatTest, OptimizeBreakPenaltyVsExcess) {
13123   FormatStyle Style = getLLVMStyle();
13124   Style.ColumnLimit = 20;
13125 
13126   // See PR41213
13127   EXPECT_EQ("/*\n"
13128             " *\t9012345\n"
13129             " * /8901\n"
13130             " */",
13131             format("/*\n"
13132                    " *\t9012345 /8901\n"
13133                    " */",
13134                    Style));
13135   EXPECT_EQ("/*\n"
13136             " *345678\n"
13137             " *\t/8901\n"
13138             " */",
13139             format("/*\n"
13140                    " *345678\t/8901\n"
13141                    " */",
13142                    Style));
13143 
13144   verifyFormat("int a; // the\n"
13145                "       // comment",
13146                Style);
13147   EXPECT_EQ("int a; /* first line\n"
13148             "        * second\n"
13149             "        * line third\n"
13150             "        * line\n"
13151             "        */",
13152             format("int a; /* first line\n"
13153                    "        * second\n"
13154                    "        * line third\n"
13155                    "        * line\n"
13156                    "        */",
13157                    Style));
13158   EXPECT_EQ("int a; // first line\n"
13159             "       // second\n"
13160             "       // line third\n"
13161             "       // line",
13162             format("int a; // first line\n"
13163                    "       // second line\n"
13164                    "       // third line",
13165                    Style));
13166 
13167   Style.PenaltyExcessCharacter = 90;
13168   verifyFormat("int a; // the comment", Style);
13169   EXPECT_EQ("int a; // the comment\n"
13170             "       // aaa",
13171             format("int a; // the comment aaa", Style));
13172   EXPECT_EQ("int a; /* first line\n"
13173             "        * second line\n"
13174             "        * third line\n"
13175             "        */",
13176             format("int a; /* first line\n"
13177                    "        * second line\n"
13178                    "        * third line\n"
13179                    "        */",
13180                    Style));
13181   EXPECT_EQ("int a; // first line\n"
13182             "       // second line\n"
13183             "       // third line",
13184             format("int a; // first line\n"
13185                    "       // second line\n"
13186                    "       // third line",
13187                    Style));
13188   // FIXME: Investigate why this is not getting the same layout as the test
13189   // above.
13190   EXPECT_EQ("int a; /* first line\n"
13191             "        * second line\n"
13192             "        * third line\n"
13193             "        */",
13194             format("int a; /* first line second line third line"
13195                    "\n*/",
13196                    Style));
13197 
13198   EXPECT_EQ("// foo bar baz bazfoo\n"
13199             "// foo bar foo bar\n",
13200             format("// foo bar baz bazfoo\n"
13201                    "// foo bar foo           bar\n",
13202                    Style));
13203   EXPECT_EQ("// foo bar baz bazfoo\n"
13204             "// foo bar foo bar\n",
13205             format("// foo bar baz      bazfoo\n"
13206                    "// foo            bar foo bar\n",
13207                    Style));
13208 
13209   // FIXME: Optimally, we'd keep bazfoo on the first line and reflow bar to the
13210   // next one.
13211   EXPECT_EQ("// foo bar baz bazfoo\n"
13212             "// bar foo bar\n",
13213             format("// foo bar baz      bazfoo bar\n"
13214                    "// foo            bar\n",
13215                    Style));
13216 
13217   EXPECT_EQ("// foo bar baz bazfoo\n"
13218             "// foo bar baz bazfoo\n"
13219             "// bar foo bar\n",
13220             format("// foo bar baz      bazfoo\n"
13221                    "// foo bar baz      bazfoo bar\n"
13222                    "// foo bar\n",
13223                    Style));
13224 
13225   EXPECT_EQ("// foo bar baz bazfoo\n"
13226             "// foo bar baz bazfoo\n"
13227             "// bar foo bar\n",
13228             format("// foo bar baz      bazfoo\n"
13229                    "// foo bar baz      bazfoo bar\n"
13230                    "// foo           bar\n",
13231                    Style));
13232 
13233   // Make sure we do not keep protruding characters if strict mode reflow is
13234   // cheaper than keeping protruding characters.
13235   Style.ColumnLimit = 21;
13236   EXPECT_EQ(
13237       "// foo foo foo foo\n"
13238       "// foo foo foo foo\n"
13239       "// foo foo foo foo\n",
13240       format("// foo foo foo foo foo foo foo foo foo foo foo foo\n", Style));
13241 
13242   EXPECT_EQ("int a = /* long block\n"
13243             "           comment */\n"
13244             "    42;",
13245             format("int a = /* long block comment */ 42;", Style));
13246 }
13247 
13248 #define EXPECT_ALL_STYLES_EQUAL(Styles)                                        \
13249   for (size_t i = 1; i < Styles.size(); ++i)                                   \
13250   EXPECT_EQ(Styles[0], Styles[i])                                              \
13251       << "Style #" << i << " of " << Styles.size() << " differs from Style #0"
13252 
13253 TEST_F(FormatTest, GetsPredefinedStyleByName) {
13254   SmallVector<FormatStyle, 3> Styles;
13255   Styles.resize(3);
13256 
13257   Styles[0] = getLLVMStyle();
13258   EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
13259   EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
13260   EXPECT_ALL_STYLES_EQUAL(Styles);
13261 
13262   Styles[0] = getGoogleStyle();
13263   EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
13264   EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
13265   EXPECT_ALL_STYLES_EQUAL(Styles);
13266 
13267   Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
13268   EXPECT_TRUE(
13269       getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
13270   EXPECT_TRUE(
13271       getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
13272   EXPECT_ALL_STYLES_EQUAL(Styles);
13273 
13274   Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
13275   EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
13276   EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
13277   EXPECT_ALL_STYLES_EQUAL(Styles);
13278 
13279   Styles[0] = getMozillaStyle();
13280   EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
13281   EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
13282   EXPECT_ALL_STYLES_EQUAL(Styles);
13283 
13284   Styles[0] = getWebKitStyle();
13285   EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
13286   EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
13287   EXPECT_ALL_STYLES_EQUAL(Styles);
13288 
13289   Styles[0] = getGNUStyle();
13290   EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
13291   EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
13292   EXPECT_ALL_STYLES_EQUAL(Styles);
13293 
13294   EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
13295 }
13296 
13297 TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
13298   SmallVector<FormatStyle, 8> Styles;
13299   Styles.resize(2);
13300 
13301   Styles[0] = getGoogleStyle();
13302   Styles[1] = getLLVMStyle();
13303   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
13304   EXPECT_ALL_STYLES_EQUAL(Styles);
13305 
13306   Styles.resize(5);
13307   Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
13308   Styles[1] = getLLVMStyle();
13309   Styles[1].Language = FormatStyle::LK_JavaScript;
13310   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
13311 
13312   Styles[2] = getLLVMStyle();
13313   Styles[2].Language = FormatStyle::LK_JavaScript;
13314   EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
13315                                   "BasedOnStyle: Google",
13316                                   &Styles[2])
13317                    .value());
13318 
13319   Styles[3] = getLLVMStyle();
13320   Styles[3].Language = FormatStyle::LK_JavaScript;
13321   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
13322                                   "Language: JavaScript",
13323                                   &Styles[3])
13324                    .value());
13325 
13326   Styles[4] = getLLVMStyle();
13327   Styles[4].Language = FormatStyle::LK_JavaScript;
13328   EXPECT_EQ(0, parseConfiguration("---\n"
13329                                   "BasedOnStyle: LLVM\n"
13330                                   "IndentWidth: 123\n"
13331                                   "---\n"
13332                                   "BasedOnStyle: Google\n"
13333                                   "Language: JavaScript",
13334                                   &Styles[4])
13335                    .value());
13336   EXPECT_ALL_STYLES_EQUAL(Styles);
13337 }
13338 
13339 #define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME)                             \
13340   Style.FIELD = false;                                                         \
13341   EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value());      \
13342   EXPECT_TRUE(Style.FIELD);                                                    \
13343   EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value());     \
13344   EXPECT_FALSE(Style.FIELD);
13345 
13346 #define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
13347 
13348 #define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME)              \
13349   Style.STRUCT.FIELD = false;                                                  \
13350   EXPECT_EQ(0,                                                                 \
13351             parseConfiguration(#STRUCT ":\n  " CONFIG_NAME ": true", &Style)   \
13352                 .value());                                                     \
13353   EXPECT_TRUE(Style.STRUCT.FIELD);                                             \
13354   EXPECT_EQ(0,                                                                 \
13355             parseConfiguration(#STRUCT ":\n  " CONFIG_NAME ": false", &Style)  \
13356                 .value());                                                     \
13357   EXPECT_FALSE(Style.STRUCT.FIELD);
13358 
13359 #define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD)                                 \
13360   CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
13361 
13362 #define CHECK_PARSE(TEXT, FIELD, VALUE)                                        \
13363   EXPECT_NE(VALUE, Style.FIELD);                                               \
13364   EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value());                      \
13365   EXPECT_EQ(VALUE, Style.FIELD)
13366 
13367 TEST_F(FormatTest, ParsesConfigurationBools) {
13368   FormatStyle Style = {};
13369   Style.Language = FormatStyle::LK_Cpp;
13370   CHECK_PARSE_BOOL(AlignTrailingComments);
13371   CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
13372   CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
13373   CHECK_PARSE_BOOL(AlignConsecutiveMacros);
13374   CHECK_PARSE_BOOL(AllowAllArgumentsOnNextLine);
13375   CHECK_PARSE_BOOL(AllowAllConstructorInitializersOnNextLine);
13376   CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
13377   CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
13378   CHECK_PARSE_BOOL(AllowShortEnumsOnASingleLine);
13379   CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
13380   CHECK_PARSE_BOOL(BinPackArguments);
13381   CHECK_PARSE_BOOL(BinPackParameters);
13382   CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
13383   CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
13384   CHECK_PARSE_BOOL(BreakStringLiterals);
13385   CHECK_PARSE_BOOL(CompactNamespaces);
13386   CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
13387   CHECK_PARSE_BOOL(DeriveLineEnding);
13388   CHECK_PARSE_BOOL(DerivePointerAlignment);
13389   CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
13390   CHECK_PARSE_BOOL(DisableFormat);
13391   CHECK_PARSE_BOOL(IndentCaseLabels);
13392   CHECK_PARSE_BOOL(IndentCaseBlocks);
13393   CHECK_PARSE_BOOL(IndentGotoLabels);
13394   CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
13395   CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
13396   CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
13397   CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
13398   CHECK_PARSE_BOOL(Cpp11BracedListStyle);
13399   CHECK_PARSE_BOOL(ReflowComments);
13400   CHECK_PARSE_BOOL(SortIncludes);
13401   CHECK_PARSE_BOOL(SortUsingDeclarations);
13402   CHECK_PARSE_BOOL(SpacesInParentheses);
13403   CHECK_PARSE_BOOL(SpacesInSquareBrackets);
13404   CHECK_PARSE_BOOL(SpacesInAngles);
13405   CHECK_PARSE_BOOL(SpacesInConditionalStatement);
13406   CHECK_PARSE_BOOL(SpaceInEmptyBlock);
13407   CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
13408   CHECK_PARSE_BOOL(SpacesInContainerLiterals);
13409   CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
13410   CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
13411   CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
13412   CHECK_PARSE_BOOL(SpaceAfterLogicalNot);
13413   CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
13414   CHECK_PARSE_BOOL(SpaceBeforeCpp11BracedList);
13415   CHECK_PARSE_BOOL(SpaceBeforeCtorInitializerColon);
13416   CHECK_PARSE_BOOL(SpaceBeforeInheritanceColon);
13417   CHECK_PARSE_BOOL(SpaceBeforeRangeBasedForLoopColon);
13418   CHECK_PARSE_BOOL(SpaceBeforeSquareBrackets);
13419   CHECK_PARSE_BOOL(UseCRLF);
13420 
13421   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterCaseLabel);
13422   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
13423   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
13424   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
13425   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
13426   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
13427   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
13428   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
13429   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterExternBlock);
13430   CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
13431   CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
13432   CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeLambdaBody);
13433   CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
13434   CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunction);
13435   CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyRecord);
13436   CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyNamespace);
13437 }
13438 
13439 #undef CHECK_PARSE_BOOL
13440 
13441 TEST_F(FormatTest, ParsesConfiguration) {
13442   FormatStyle Style = {};
13443   Style.Language = FormatStyle::LK_Cpp;
13444   CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
13445   CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
13446               ConstructorInitializerIndentWidth, 1234u);
13447   CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
13448   CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
13449   CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
13450   CHECK_PARSE("PenaltyBreakAssignment: 1234", PenaltyBreakAssignment, 1234u);
13451   CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
13452               PenaltyBreakBeforeFirstCallParameter, 1234u);
13453   CHECK_PARSE("PenaltyBreakTemplateDeclaration: 1234",
13454               PenaltyBreakTemplateDeclaration, 1234u);
13455   CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
13456   CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
13457               PenaltyReturnTypeOnItsOwnLine, 1234u);
13458   CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
13459               SpacesBeforeTrailingComments, 1234u);
13460   CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
13461   CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
13462   CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
13463 
13464   Style.PointerAlignment = FormatStyle::PAS_Middle;
13465   CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
13466               FormatStyle::PAS_Left);
13467   CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
13468               FormatStyle::PAS_Right);
13469   CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
13470               FormatStyle::PAS_Middle);
13471   // For backward compatibility:
13472   CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
13473               FormatStyle::PAS_Left);
13474   CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
13475               FormatStyle::PAS_Right);
13476   CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
13477               FormatStyle::PAS_Middle);
13478 
13479   Style.Standard = FormatStyle::LS_Auto;
13480   CHECK_PARSE("Standard: c++03", Standard, FormatStyle::LS_Cpp03);
13481   CHECK_PARSE("Standard: c++11", Standard, FormatStyle::LS_Cpp11);
13482   CHECK_PARSE("Standard: c++14", Standard, FormatStyle::LS_Cpp14);
13483   CHECK_PARSE("Standard: c++17", Standard, FormatStyle::LS_Cpp17);
13484   CHECK_PARSE("Standard: c++20", Standard, FormatStyle::LS_Cpp20);
13485   CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
13486   CHECK_PARSE("Standard: Latest", Standard, FormatStyle::LS_Latest);
13487   // Legacy aliases:
13488   CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
13489   CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Latest);
13490   CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
13491   CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
13492 
13493   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
13494   CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
13495               BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
13496   CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
13497               FormatStyle::BOS_None);
13498   CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
13499               FormatStyle::BOS_All);
13500   // For backward compatibility:
13501   CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
13502               FormatStyle::BOS_None);
13503   CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
13504               FormatStyle::BOS_All);
13505 
13506   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
13507   CHECK_PARSE("BreakConstructorInitializers: BeforeComma",
13508               BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
13509   CHECK_PARSE("BreakConstructorInitializers: AfterColon",
13510               BreakConstructorInitializers, FormatStyle::BCIS_AfterColon);
13511   CHECK_PARSE("BreakConstructorInitializers: BeforeColon",
13512               BreakConstructorInitializers, FormatStyle::BCIS_BeforeColon);
13513   // For backward compatibility:
13514   CHECK_PARSE("BreakConstructorInitializersBeforeComma: true",
13515               BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
13516 
13517   Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
13518   CHECK_PARSE("BreakInheritanceList: BeforeComma", BreakInheritanceList,
13519               FormatStyle::BILS_BeforeComma);
13520   CHECK_PARSE("BreakInheritanceList: AfterColon", BreakInheritanceList,
13521               FormatStyle::BILS_AfterColon);
13522   CHECK_PARSE("BreakInheritanceList: BeforeColon", BreakInheritanceList,
13523               FormatStyle::BILS_BeforeColon);
13524   // For backward compatibility:
13525   CHECK_PARSE("BreakBeforeInheritanceComma: true", BreakInheritanceList,
13526               FormatStyle::BILS_BeforeComma);
13527 
13528   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
13529   CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
13530               FormatStyle::BAS_Align);
13531   CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
13532               FormatStyle::BAS_DontAlign);
13533   CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
13534               FormatStyle::BAS_AlwaysBreak);
13535   // For backward compatibility:
13536   CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
13537               FormatStyle::BAS_DontAlign);
13538   CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
13539               FormatStyle::BAS_Align);
13540 
13541   Style.AlignEscapedNewlines = FormatStyle::ENAS_Left;
13542   CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines,
13543               FormatStyle::ENAS_DontAlign);
13544   CHECK_PARSE("AlignEscapedNewlines: Left", AlignEscapedNewlines,
13545               FormatStyle::ENAS_Left);
13546   CHECK_PARSE("AlignEscapedNewlines: Right", AlignEscapedNewlines,
13547               FormatStyle::ENAS_Right);
13548   // For backward compatibility:
13549   CHECK_PARSE("AlignEscapedNewlinesLeft: true", AlignEscapedNewlines,
13550               FormatStyle::ENAS_Left);
13551   CHECK_PARSE("AlignEscapedNewlinesLeft: false", AlignEscapedNewlines,
13552               FormatStyle::ENAS_Right);
13553 
13554   Style.AlignOperands = FormatStyle::OAS_Align;
13555   CHECK_PARSE("AlignOperands: DontAlign", AlignOperands,
13556               FormatStyle::OAS_DontAlign);
13557   CHECK_PARSE("AlignOperands: Align", AlignOperands, FormatStyle::OAS_Align);
13558   CHECK_PARSE("AlignOperands: AlignAfterOperator", AlignOperands,
13559               FormatStyle::OAS_AlignAfterOperator);
13560   // For backward compatibility:
13561   CHECK_PARSE("AlignOperands: false", AlignOperands,
13562               FormatStyle::OAS_DontAlign);
13563   CHECK_PARSE("AlignOperands: true", AlignOperands, FormatStyle::OAS_Align);
13564 
13565   Style.UseTab = FormatStyle::UT_ForIndentation;
13566   CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
13567   CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
13568   CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
13569   CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
13570               FormatStyle::UT_ForContinuationAndIndentation);
13571   CHECK_PARSE("UseTab: AlignWithSpaces", UseTab,
13572               FormatStyle::UT_AlignWithSpaces);
13573   // For backward compatibility:
13574   CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
13575   CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
13576 
13577   Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Empty;
13578   CHECK_PARSE("AllowShortBlocksOnASingleLine: Never",
13579               AllowShortBlocksOnASingleLine, FormatStyle::SBS_Never);
13580   CHECK_PARSE("AllowShortBlocksOnASingleLine: Empty",
13581               AllowShortBlocksOnASingleLine, FormatStyle::SBS_Empty);
13582   CHECK_PARSE("AllowShortBlocksOnASingleLine: Always",
13583               AllowShortBlocksOnASingleLine, FormatStyle::SBS_Always);
13584   // For backward compatibility:
13585   CHECK_PARSE("AllowShortBlocksOnASingleLine: false",
13586               AllowShortBlocksOnASingleLine, FormatStyle::SBS_Never);
13587   CHECK_PARSE("AllowShortBlocksOnASingleLine: true",
13588               AllowShortBlocksOnASingleLine, FormatStyle::SBS_Always);
13589 
13590   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
13591   CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
13592               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
13593   CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
13594               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
13595   CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
13596               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
13597   CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
13598               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
13599   // For backward compatibility:
13600   CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
13601               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
13602   CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
13603               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
13604 
13605   Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
13606   CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
13607               FormatStyle::SBPO_Never);
13608   CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
13609               FormatStyle::SBPO_Always);
13610   CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
13611               FormatStyle::SBPO_ControlStatements);
13612   CHECK_PARSE("SpaceBeforeParens: NonEmptyParentheses", SpaceBeforeParens,
13613               FormatStyle::SBPO_NonEmptyParentheses);
13614   // For backward compatibility:
13615   CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
13616               FormatStyle::SBPO_Never);
13617   CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
13618               FormatStyle::SBPO_ControlStatements);
13619 
13620   Style.ColumnLimit = 123;
13621   FormatStyle BaseStyle = getLLVMStyle();
13622   CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
13623   CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
13624 
13625   Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
13626   CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
13627               FormatStyle::BS_Attach);
13628   CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
13629               FormatStyle::BS_Linux);
13630   CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
13631               FormatStyle::BS_Mozilla);
13632   CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
13633               FormatStyle::BS_Stroustrup);
13634   CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
13635               FormatStyle::BS_Allman);
13636   CHECK_PARSE("BreakBeforeBraces: Whitesmiths", BreakBeforeBraces,
13637               FormatStyle::BS_Whitesmiths);
13638   CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
13639   CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
13640               FormatStyle::BS_WebKit);
13641   CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
13642               FormatStyle::BS_Custom);
13643 
13644   Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Never;
13645   CHECK_PARSE("BraceWrapping:\n"
13646               "  AfterControlStatement: MultiLine",
13647               BraceWrapping.AfterControlStatement,
13648               FormatStyle::BWACS_MultiLine);
13649   CHECK_PARSE("BraceWrapping:\n"
13650               "  AfterControlStatement: Always",
13651               BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Always);
13652   CHECK_PARSE("BraceWrapping:\n"
13653               "  AfterControlStatement: Never",
13654               BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Never);
13655   // For backward compatibility:
13656   CHECK_PARSE("BraceWrapping:\n"
13657               "  AfterControlStatement: true",
13658               BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Always);
13659   CHECK_PARSE("BraceWrapping:\n"
13660               "  AfterControlStatement: false",
13661               BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Never);
13662 
13663   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
13664   CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
13665               FormatStyle::RTBS_None);
13666   CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
13667               FormatStyle::RTBS_All);
13668   CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
13669               AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
13670   CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
13671               AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
13672   CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
13673               AlwaysBreakAfterReturnType,
13674               FormatStyle::RTBS_TopLevelDefinitions);
13675 
13676   Style.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes;
13677   CHECK_PARSE("AlwaysBreakTemplateDeclarations: No",
13678               AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_No);
13679   CHECK_PARSE("AlwaysBreakTemplateDeclarations: MultiLine",
13680               AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_MultiLine);
13681   CHECK_PARSE("AlwaysBreakTemplateDeclarations: Yes",
13682               AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_Yes);
13683   CHECK_PARSE("AlwaysBreakTemplateDeclarations: false",
13684               AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_MultiLine);
13685   CHECK_PARSE("AlwaysBreakTemplateDeclarations: true",
13686               AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_Yes);
13687 
13688   Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
13689   CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
13690               AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
13691   CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
13692               AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
13693   CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
13694               AlwaysBreakAfterDefinitionReturnType,
13695               FormatStyle::DRTBS_TopLevel);
13696 
13697   Style.NamespaceIndentation = FormatStyle::NI_All;
13698   CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
13699               FormatStyle::NI_None);
13700   CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
13701               FormatStyle::NI_Inner);
13702   CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
13703               FormatStyle::NI_All);
13704 
13705   Style.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_Always;
13706   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Never",
13707               AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never);
13708   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: WithoutElse",
13709               AllowShortIfStatementsOnASingleLine,
13710               FormatStyle::SIS_WithoutElse);
13711   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Always",
13712               AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Always);
13713   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: false",
13714               AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never);
13715   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: true",
13716               AllowShortIfStatementsOnASingleLine,
13717               FormatStyle::SIS_WithoutElse);
13718 
13719   // FIXME: This is required because parsing a configuration simply overwrites
13720   // the first N elements of the list instead of resetting it.
13721   Style.ForEachMacros.clear();
13722   std::vector<std::string> BoostForeach;
13723   BoostForeach.push_back("BOOST_FOREACH");
13724   CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
13725   std::vector<std::string> BoostAndQForeach;
13726   BoostAndQForeach.push_back("BOOST_FOREACH");
13727   BoostAndQForeach.push_back("Q_FOREACH");
13728   CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
13729               BoostAndQForeach);
13730 
13731   Style.StatementMacros.clear();
13732   CHECK_PARSE("StatementMacros: [QUNUSED]", StatementMacros,
13733               std::vector<std::string>{"QUNUSED"});
13734   CHECK_PARSE("StatementMacros: [QUNUSED, QT_REQUIRE_VERSION]", StatementMacros,
13735               std::vector<std::string>({"QUNUSED", "QT_REQUIRE_VERSION"}));
13736 
13737   Style.NamespaceMacros.clear();
13738   CHECK_PARSE("NamespaceMacros: [TESTSUITE]", NamespaceMacros,
13739               std::vector<std::string>{"TESTSUITE"});
13740   CHECK_PARSE("NamespaceMacros: [TESTSUITE, SUITE]", NamespaceMacros,
13741               std::vector<std::string>({"TESTSUITE", "SUITE"}));
13742 
13743   Style.IncludeStyle.IncludeCategories.clear();
13744   std::vector<tooling::IncludeStyle::IncludeCategory> ExpectedCategories = {
13745       {"abc/.*", 2, 0}, {".*", 1, 0}};
13746   CHECK_PARSE("IncludeCategories:\n"
13747               "  - Regex: abc/.*\n"
13748               "    Priority: 2\n"
13749               "  - Regex: .*\n"
13750               "    Priority: 1",
13751               IncludeStyle.IncludeCategories, ExpectedCategories);
13752   CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeStyle.IncludeIsMainRegex,
13753               "abc$");
13754   CHECK_PARSE("IncludeIsMainSourceRegex: 'abc$'",
13755               IncludeStyle.IncludeIsMainSourceRegex, "abc$");
13756 
13757   Style.RawStringFormats.clear();
13758   std::vector<FormatStyle::RawStringFormat> ExpectedRawStringFormats = {
13759       {
13760           FormatStyle::LK_TextProto,
13761           {"pb", "proto"},
13762           {"PARSE_TEXT_PROTO"},
13763           /*CanonicalDelimiter=*/"",
13764           "llvm",
13765       },
13766       {
13767           FormatStyle::LK_Cpp,
13768           {"cc", "cpp"},
13769           {"C_CODEBLOCK", "CPPEVAL"},
13770           /*CanonicalDelimiter=*/"cc",
13771           /*BasedOnStyle=*/"",
13772       },
13773   };
13774 
13775   CHECK_PARSE("RawStringFormats:\n"
13776               "  - Language: TextProto\n"
13777               "    Delimiters:\n"
13778               "      - 'pb'\n"
13779               "      - 'proto'\n"
13780               "    EnclosingFunctions:\n"
13781               "      - 'PARSE_TEXT_PROTO'\n"
13782               "    BasedOnStyle: llvm\n"
13783               "  - Language: Cpp\n"
13784               "    Delimiters:\n"
13785               "      - 'cc'\n"
13786               "      - 'cpp'\n"
13787               "    EnclosingFunctions:\n"
13788               "      - 'C_CODEBLOCK'\n"
13789               "      - 'CPPEVAL'\n"
13790               "    CanonicalDelimiter: 'cc'",
13791               RawStringFormats, ExpectedRawStringFormats);
13792 }
13793 
13794 TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
13795   FormatStyle Style = {};
13796   Style.Language = FormatStyle::LK_Cpp;
13797   CHECK_PARSE("Language: Cpp\n"
13798               "IndentWidth: 12",
13799               IndentWidth, 12u);
13800   EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
13801                                "IndentWidth: 34",
13802                                &Style),
13803             ParseError::Unsuitable);
13804   FormatStyle BinPackedTCS = {};
13805   BinPackedTCS.Language = FormatStyle::LK_JavaScript;
13806   EXPECT_EQ(parseConfiguration("BinPackArguments: true\n"
13807                                "InsertTrailingCommas: Wrapped",
13808                                &BinPackedTCS),
13809             ParseError::BinPackTrailingCommaConflict);
13810   EXPECT_EQ(12u, Style.IndentWidth);
13811   CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
13812   EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
13813 
13814   Style.Language = FormatStyle::LK_JavaScript;
13815   CHECK_PARSE("Language: JavaScript\n"
13816               "IndentWidth: 12",
13817               IndentWidth, 12u);
13818   CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
13819   EXPECT_EQ(parseConfiguration("Language: Cpp\n"
13820                                "IndentWidth: 34",
13821                                &Style),
13822             ParseError::Unsuitable);
13823   EXPECT_EQ(23u, Style.IndentWidth);
13824   CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
13825   EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
13826 
13827   CHECK_PARSE("BasedOnStyle: LLVM\n"
13828               "IndentWidth: 67",
13829               IndentWidth, 67u);
13830 
13831   CHECK_PARSE("---\n"
13832               "Language: JavaScript\n"
13833               "IndentWidth: 12\n"
13834               "---\n"
13835               "Language: Cpp\n"
13836               "IndentWidth: 34\n"
13837               "...\n",
13838               IndentWidth, 12u);
13839 
13840   Style.Language = FormatStyle::LK_Cpp;
13841   CHECK_PARSE("---\n"
13842               "Language: JavaScript\n"
13843               "IndentWidth: 12\n"
13844               "---\n"
13845               "Language: Cpp\n"
13846               "IndentWidth: 34\n"
13847               "...\n",
13848               IndentWidth, 34u);
13849   CHECK_PARSE("---\n"
13850               "IndentWidth: 78\n"
13851               "---\n"
13852               "Language: JavaScript\n"
13853               "IndentWidth: 56\n"
13854               "...\n",
13855               IndentWidth, 78u);
13856 
13857   Style.ColumnLimit = 123;
13858   Style.IndentWidth = 234;
13859   Style.BreakBeforeBraces = FormatStyle::BS_Linux;
13860   Style.TabWidth = 345;
13861   EXPECT_FALSE(parseConfiguration("---\n"
13862                                   "IndentWidth: 456\n"
13863                                   "BreakBeforeBraces: Allman\n"
13864                                   "---\n"
13865                                   "Language: JavaScript\n"
13866                                   "IndentWidth: 111\n"
13867                                   "TabWidth: 111\n"
13868                                   "---\n"
13869                                   "Language: Cpp\n"
13870                                   "BreakBeforeBraces: Stroustrup\n"
13871                                   "TabWidth: 789\n"
13872                                   "...\n",
13873                                   &Style));
13874   EXPECT_EQ(123u, Style.ColumnLimit);
13875   EXPECT_EQ(456u, Style.IndentWidth);
13876   EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
13877   EXPECT_EQ(789u, Style.TabWidth);
13878 
13879   EXPECT_EQ(parseConfiguration("---\n"
13880                                "Language: JavaScript\n"
13881                                "IndentWidth: 56\n"
13882                                "---\n"
13883                                "IndentWidth: 78\n"
13884                                "...\n",
13885                                &Style),
13886             ParseError::Error);
13887   EXPECT_EQ(parseConfiguration("---\n"
13888                                "Language: JavaScript\n"
13889                                "IndentWidth: 56\n"
13890                                "---\n"
13891                                "Language: JavaScript\n"
13892                                "IndentWidth: 78\n"
13893                                "...\n",
13894                                &Style),
13895             ParseError::Error);
13896 
13897   EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
13898 }
13899 
13900 #undef CHECK_PARSE
13901 
13902 TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
13903   FormatStyle Style = {};
13904   Style.Language = FormatStyle::LK_JavaScript;
13905   Style.BreakBeforeTernaryOperators = true;
13906   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
13907   EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
13908 
13909   Style.BreakBeforeTernaryOperators = true;
13910   EXPECT_EQ(0, parseConfiguration("---\n"
13911                                   "BasedOnStyle: Google\n"
13912                                   "---\n"
13913                                   "Language: JavaScript\n"
13914                                   "IndentWidth: 76\n"
13915                                   "...\n",
13916                                   &Style)
13917                    .value());
13918   EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
13919   EXPECT_EQ(76u, Style.IndentWidth);
13920   EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
13921 }
13922 
13923 TEST_F(FormatTest, ConfigurationRoundTripTest) {
13924   FormatStyle Style = getLLVMStyle();
13925   std::string YAML = configurationAsText(Style);
13926   FormatStyle ParsedStyle = {};
13927   ParsedStyle.Language = FormatStyle::LK_Cpp;
13928   EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
13929   EXPECT_EQ(Style, ParsedStyle);
13930 }
13931 
13932 TEST_F(FormatTest, WorksFor8bitEncodings) {
13933   EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
13934             "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
13935             "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
13936             "\"\xef\xee\xf0\xf3...\"",
13937             format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
13938                    "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
13939                    "\xef\xee\xf0\xf3...\"",
13940                    getLLVMStyleWithColumns(12)));
13941 }
13942 
13943 TEST_F(FormatTest, HandlesUTF8BOM) {
13944   EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
13945   EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
13946             format("\xef\xbb\xbf#include <iostream>"));
13947   EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
13948             format("\xef\xbb\xbf\n#include <iostream>"));
13949 }
13950 
13951 // FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
13952 #if !defined(_MSC_VER)
13953 
13954 TEST_F(FormatTest, CountsUTF8CharactersProperly) {
13955   verifyFormat("\"Однажды в студёную зимнюю пору...\"",
13956                getLLVMStyleWithColumns(35));
13957   verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
13958                getLLVMStyleWithColumns(31));
13959   verifyFormat("// Однажды в студёную зимнюю пору...",
13960                getLLVMStyleWithColumns(36));
13961   verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
13962   verifyFormat("/* Однажды в студёную зимнюю пору... */",
13963                getLLVMStyleWithColumns(39));
13964   verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
13965                getLLVMStyleWithColumns(35));
13966 }
13967 
13968 TEST_F(FormatTest, SplitsUTF8Strings) {
13969   // Non-printable characters' width is currently considered to be the length in
13970   // bytes in UTF8. The characters can be displayed in very different manner
13971   // (zero-width, single width with a substitution glyph, expanded to their code
13972   // (e.g. "<8d>"), so there's no single correct way to handle them.
13973   EXPECT_EQ("\"aaaaÄ\"\n"
13974             "\"\xc2\x8d\";",
13975             format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
13976   EXPECT_EQ("\"aaaaaaaÄ\"\n"
13977             "\"\xc2\x8d\";",
13978             format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
13979   EXPECT_EQ("\"Однажды, в \"\n"
13980             "\"студёную \"\n"
13981             "\"зимнюю \"\n"
13982             "\"пору,\"",
13983             format("\"Однажды, в студёную зимнюю пору,\"",
13984                    getLLVMStyleWithColumns(13)));
13985   EXPECT_EQ(
13986       "\"一 二 三 \"\n"
13987       "\"四 五六 \"\n"
13988       "\"七 八 九 \"\n"
13989       "\"十\"",
13990       format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
13991   EXPECT_EQ("\"一\t\"\n"
13992             "\"二 \t\"\n"
13993             "\"三 四 \"\n"
13994             "\"五\t\"\n"
13995             "\"六 \t\"\n"
13996             "\"七 \"\n"
13997             "\"八九十\tqq\"",
13998             format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
13999                    getLLVMStyleWithColumns(11)));
14000 
14001   // UTF8 character in an escape sequence.
14002   EXPECT_EQ("\"aaaaaa\"\n"
14003             "\"\\\xC2\x8D\"",
14004             format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
14005 }
14006 
14007 TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
14008   EXPECT_EQ("const char *sssss =\n"
14009             "    \"一二三四五六七八\\\n"
14010             " 九 十\";",
14011             format("const char *sssss = \"一二三四五六七八\\\n"
14012                    " 九 十\";",
14013                    getLLVMStyleWithColumns(30)));
14014 }
14015 
14016 TEST_F(FormatTest, SplitsUTF8LineComments) {
14017   EXPECT_EQ("// aaaaÄ\xc2\x8d",
14018             format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
14019   EXPECT_EQ("// Я из лесу\n"
14020             "// вышел; был\n"
14021             "// сильный\n"
14022             "// мороз.",
14023             format("// Я из лесу вышел; был сильный мороз.",
14024                    getLLVMStyleWithColumns(13)));
14025   EXPECT_EQ("// 一二三\n"
14026             "// 四五六七\n"
14027             "// 八  九\n"
14028             "// 十",
14029             format("// 一二三 四五六七 八  九 十", getLLVMStyleWithColumns(9)));
14030 }
14031 
14032 TEST_F(FormatTest, SplitsUTF8BlockComments) {
14033   EXPECT_EQ("/* Гляжу,\n"
14034             " * поднимается\n"
14035             " * медленно в\n"
14036             " * гору\n"
14037             " * Лошадка,\n"
14038             " * везущая\n"
14039             " * хворосту\n"
14040             " * воз. */",
14041             format("/* Гляжу, поднимается медленно в гору\n"
14042                    " * Лошадка, везущая хворосту воз. */",
14043                    getLLVMStyleWithColumns(13)));
14044   EXPECT_EQ(
14045       "/* 一二三\n"
14046       " * 四五六七\n"
14047       " * 八  九\n"
14048       " * 十  */",
14049       format("/* 一二三 四五六七 八  九 十  */", getLLVMStyleWithColumns(9)));
14050   EXPECT_EQ("/* �������� ��������\n"
14051             " * ��������\n"
14052             " * ������-�� */",
14053             format("/* �������� �������� �������� ������-�� */", getLLVMStyleWithColumns(12)));
14054 }
14055 
14056 #endif // _MSC_VER
14057 
14058 TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
14059   FormatStyle Style = getLLVMStyle();
14060 
14061   Style.ConstructorInitializerIndentWidth = 4;
14062   verifyFormat(
14063       "SomeClass::Constructor()\n"
14064       "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
14065       "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
14066       Style);
14067 
14068   Style.ConstructorInitializerIndentWidth = 2;
14069   verifyFormat(
14070       "SomeClass::Constructor()\n"
14071       "  : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
14072       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
14073       Style);
14074 
14075   Style.ConstructorInitializerIndentWidth = 0;
14076   verifyFormat(
14077       "SomeClass::Constructor()\n"
14078       ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
14079       "  aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
14080       Style);
14081   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
14082   verifyFormat(
14083       "SomeLongTemplateVariableName<\n"
14084       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
14085       Style);
14086   verifyFormat("bool smaller = 1 < "
14087                "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
14088                "                       "
14089                "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
14090                Style);
14091 
14092   Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
14093   verifyFormat("SomeClass::Constructor() :\n"
14094                "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa),\n"
14095                "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa) {}",
14096                Style);
14097 }
14098 
14099 TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
14100   FormatStyle Style = getLLVMStyle();
14101   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
14102   Style.ConstructorInitializerIndentWidth = 4;
14103   verifyFormat("SomeClass::Constructor()\n"
14104                "    : a(a)\n"
14105                "    , b(b)\n"
14106                "    , c(c) {}",
14107                Style);
14108   verifyFormat("SomeClass::Constructor()\n"
14109                "    : a(a) {}",
14110                Style);
14111 
14112   Style.ColumnLimit = 0;
14113   verifyFormat("SomeClass::Constructor()\n"
14114                "    : a(a) {}",
14115                Style);
14116   verifyFormat("SomeClass::Constructor() noexcept\n"
14117                "    : a(a) {}",
14118                Style);
14119   verifyFormat("SomeClass::Constructor()\n"
14120                "    : a(a)\n"
14121                "    , b(b)\n"
14122                "    , c(c) {}",
14123                Style);
14124   verifyFormat("SomeClass::Constructor()\n"
14125                "    : a(a) {\n"
14126                "  foo();\n"
14127                "  bar();\n"
14128                "}",
14129                Style);
14130 
14131   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
14132   verifyFormat("SomeClass::Constructor()\n"
14133                "    : a(a)\n"
14134                "    , b(b)\n"
14135                "    , c(c) {\n}",
14136                Style);
14137   verifyFormat("SomeClass::Constructor()\n"
14138                "    : a(a) {\n}",
14139                Style);
14140 
14141   Style.ColumnLimit = 80;
14142   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
14143   Style.ConstructorInitializerIndentWidth = 2;
14144   verifyFormat("SomeClass::Constructor()\n"
14145                "  : a(a)\n"
14146                "  , b(b)\n"
14147                "  , c(c) {}",
14148                Style);
14149 
14150   Style.ConstructorInitializerIndentWidth = 0;
14151   verifyFormat("SomeClass::Constructor()\n"
14152                ": a(a)\n"
14153                ", b(b)\n"
14154                ", c(c) {}",
14155                Style);
14156 
14157   Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
14158   Style.ConstructorInitializerIndentWidth = 4;
14159   verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
14160   verifyFormat(
14161       "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
14162       Style);
14163   verifyFormat(
14164       "SomeClass::Constructor()\n"
14165       "    : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
14166       Style);
14167   Style.ConstructorInitializerIndentWidth = 4;
14168   Style.ColumnLimit = 60;
14169   verifyFormat("SomeClass::Constructor()\n"
14170                "    : aaaaaaaa(aaaaaaaa)\n"
14171                "    , aaaaaaaa(aaaaaaaa)\n"
14172                "    , aaaaaaaa(aaaaaaaa) {}",
14173                Style);
14174 }
14175 
14176 TEST_F(FormatTest, Destructors) {
14177   verifyFormat("void F(int &i) { i.~int(); }");
14178   verifyFormat("void F(int &i) { i->~int(); }");
14179 }
14180 
14181 TEST_F(FormatTest, FormatsWithWebKitStyle) {
14182   FormatStyle Style = getWebKitStyle();
14183 
14184   // Don't indent in outer namespaces.
14185   verifyFormat("namespace outer {\n"
14186                "int i;\n"
14187                "namespace inner {\n"
14188                "    int i;\n"
14189                "} // namespace inner\n"
14190                "} // namespace outer\n"
14191                "namespace other_outer {\n"
14192                "int i;\n"
14193                "}",
14194                Style);
14195 
14196   // Don't indent case labels.
14197   verifyFormat("switch (variable) {\n"
14198                "case 1:\n"
14199                "case 2:\n"
14200                "    doSomething();\n"
14201                "    break;\n"
14202                "default:\n"
14203                "    ++variable;\n"
14204                "}",
14205                Style);
14206 
14207   // Wrap before binary operators.
14208   EXPECT_EQ("void f()\n"
14209             "{\n"
14210             "    if (aaaaaaaaaaaaaaaa\n"
14211             "        && bbbbbbbbbbbbbbbbbbbbbbbb\n"
14212             "        && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
14213             "        return;\n"
14214             "}",
14215             format("void f() {\n"
14216                    "if (aaaaaaaaaaaaaaaa\n"
14217                    "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
14218                    "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
14219                    "return;\n"
14220                    "}",
14221                    Style));
14222 
14223   // Allow functions on a single line.
14224   verifyFormat("void f() { return; }", Style);
14225 
14226   // Allow empty blocks on a single line and insert a space in empty blocks.
14227   EXPECT_EQ("void f() { }", format("void f() {}", Style));
14228   EXPECT_EQ("while (true) { }", format("while (true) {}", Style));
14229   // However, don't merge non-empty short loops.
14230   EXPECT_EQ("while (true) {\n"
14231             "    continue;\n"
14232             "}",
14233             format("while (true) { continue; }", Style));
14234 
14235   // Constructor initializers are formatted one per line with the "," on the
14236   // new line.
14237   verifyFormat("Constructor()\n"
14238                "    : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
14239                "    , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
14240                "          aaaaaaaaaaaaaa)\n"
14241                "    , aaaaaaaaaaaaaaaaaaaaaaa()\n"
14242                "{\n"
14243                "}",
14244                Style);
14245   verifyFormat("SomeClass::Constructor()\n"
14246                "    : a(a)\n"
14247                "{\n"
14248                "}",
14249                Style);
14250   EXPECT_EQ("SomeClass::Constructor()\n"
14251             "    : a(a)\n"
14252             "{\n"
14253             "}",
14254             format("SomeClass::Constructor():a(a){}", Style));
14255   verifyFormat("SomeClass::Constructor()\n"
14256                "    : a(a)\n"
14257                "    , b(b)\n"
14258                "    , c(c)\n"
14259                "{\n"
14260                "}",
14261                Style);
14262   verifyFormat("SomeClass::Constructor()\n"
14263                "    : a(a)\n"
14264                "{\n"
14265                "    foo();\n"
14266                "    bar();\n"
14267                "}",
14268                Style);
14269 
14270   // Access specifiers should be aligned left.
14271   verifyFormat("class C {\n"
14272                "public:\n"
14273                "    int i;\n"
14274                "};",
14275                Style);
14276 
14277   // Do not align comments.
14278   verifyFormat("int a; // Do not\n"
14279                "double b; // align comments.",
14280                Style);
14281 
14282   // Do not align operands.
14283   EXPECT_EQ("ASSERT(aaaa\n"
14284             "    || bbbb);",
14285             format("ASSERT ( aaaa\n||bbbb);", Style));
14286 
14287   // Accept input's line breaks.
14288   EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
14289             "    || bbbbbbbbbbbbbbb) {\n"
14290             "    i++;\n"
14291             "}",
14292             format("if (aaaaaaaaaaaaaaa\n"
14293                    "|| bbbbbbbbbbbbbbb) { i++; }",
14294                    Style));
14295   EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
14296             "    i++;\n"
14297             "}",
14298             format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
14299 
14300   // Don't automatically break all macro definitions (llvm.org/PR17842).
14301   verifyFormat("#define aNumber 10", Style);
14302   // However, generally keep the line breaks that the user authored.
14303   EXPECT_EQ("#define aNumber \\\n"
14304             "    10",
14305             format("#define aNumber \\\n"
14306                    " 10",
14307                    Style));
14308 
14309   // Keep empty and one-element array literals on a single line.
14310   EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
14311             "                                  copyItems:YES];",
14312             format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
14313                    "copyItems:YES];",
14314                    Style));
14315   EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
14316             "                                  copyItems:YES];",
14317             format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
14318                    "             copyItems:YES];",
14319                    Style));
14320   // FIXME: This does not seem right, there should be more indentation before
14321   // the array literal's entries. Nested blocks have the same problem.
14322   EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
14323             "    @\"a\",\n"
14324             "    @\"a\"\n"
14325             "]\n"
14326             "                                  copyItems:YES];",
14327             format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
14328                    "     @\"a\",\n"
14329                    "     @\"a\"\n"
14330                    "     ]\n"
14331                    "       copyItems:YES];",
14332                    Style));
14333   EXPECT_EQ(
14334       "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
14335       "                                  copyItems:YES];",
14336       format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
14337              "   copyItems:YES];",
14338              Style));
14339 
14340   verifyFormat("[self.a b:c c:d];", Style);
14341   EXPECT_EQ("[self.a b:c\n"
14342             "        c:d];",
14343             format("[self.a b:c\n"
14344                    "c:d];",
14345                    Style));
14346 }
14347 
14348 TEST_F(FormatTest, FormatsLambdas) {
14349   verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
14350   verifyFormat(
14351       "int c = [b]() mutable noexcept { return [&b] { return b++; }(); }();\n");
14352   verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
14353   verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
14354   verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
14355   verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
14356   verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
14357   verifyFormat("auto c = [a = [b = 42] {}] {};\n");
14358   verifyFormat("auto c = [a = &i + 10, b = [] {}] {};\n");
14359   verifyFormat("int x = f(*+[] {});");
14360   verifyFormat("void f() {\n"
14361                "  other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
14362                "}\n");
14363   verifyFormat("void f() {\n"
14364                "  other(x.begin(), //\n"
14365                "        x.end(),   //\n"
14366                "        [&](int, int) { return 1; });\n"
14367                "}\n");
14368   verifyFormat("void f() {\n"
14369                "  other.other.other.other.other(\n"
14370                "      x.begin(), x.end(),\n"
14371                "      [something, rather](int, int, int, int, int, int, int) { "
14372                "return 1; });\n"
14373                "}\n");
14374   verifyFormat(
14375       "void f() {\n"
14376       "  other.other.other.other.other(\n"
14377       "      x.begin(), x.end(),\n"
14378       "      [something, rather](int, int, int, int, int, int, int) {\n"
14379       "        //\n"
14380       "      });\n"
14381       "}\n");
14382   verifyFormat("SomeFunction([]() { // A cool function...\n"
14383                "  return 43;\n"
14384                "});");
14385   EXPECT_EQ("SomeFunction([]() {\n"
14386             "#define A a\n"
14387             "  return 43;\n"
14388             "});",
14389             format("SomeFunction([](){\n"
14390                    "#define A a\n"
14391                    "return 43;\n"
14392                    "});"));
14393   verifyFormat("void f() {\n"
14394                "  SomeFunction([](decltype(x), A *a) {});\n"
14395                "}");
14396   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
14397                "    [](const aaaaaaaaaa &a) { return a; });");
14398   verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
14399                "  SomeOtherFunctioooooooooooooooooooooooooon();\n"
14400                "});");
14401   verifyFormat("Constructor()\n"
14402                "    : Field([] { // comment\n"
14403                "        int i;\n"
14404                "      }) {}");
14405   verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
14406                "  return some_parameter.size();\n"
14407                "};");
14408   verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
14409                "    [](const string &s) { return s; };");
14410   verifyFormat("int i = aaaaaa ? 1 //\n"
14411                "               : [] {\n"
14412                "                   return 2; //\n"
14413                "                 }();");
14414   verifyFormat("llvm::errs() << \"number of twos is \"\n"
14415                "             << std::count_if(v.begin(), v.end(), [](int x) {\n"
14416                "                  return x == 2; // force break\n"
14417                "                });");
14418   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
14419                "    [=](int iiiiiiiiiiii) {\n"
14420                "      return aaaaaaaaaaaaaaaaaaaaaaa !=\n"
14421                "             aaaaaaaaaaaaaaaaaaaaaaa;\n"
14422                "    });",
14423                getLLVMStyleWithColumns(60));
14424   verifyFormat("SomeFunction({[&] {\n"
14425                "                // comment\n"
14426                "              },\n"
14427                "              [&] {\n"
14428                "                // comment\n"
14429                "              }});");
14430   verifyFormat("SomeFunction({[&] {\n"
14431                "  // comment\n"
14432                "}});");
14433   verifyFormat(
14434       "virtual aaaaaaaaaaaaaaaa(\n"
14435       "    std::function<bool()> bbbbbbbbbbbb = [&]() { return true; },\n"
14436       "    aaaaa aaaaaaaaa);");
14437 
14438   // Lambdas with return types.
14439   verifyFormat("int c = []() -> int { return 2; }();\n");
14440   verifyFormat("int c = []() -> int * { return 2; }();\n");
14441   verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
14442   verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
14443   verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
14444   verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
14445   verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
14446   verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
14447   verifyFormat("[a, a]() -> a<1> {};");
14448   verifyFormat("[]() -> foo<5 + 2> { return {}; };");
14449   verifyFormat("[]() -> foo<5 - 2> { return {}; };");
14450   verifyFormat("[]() -> foo<5 / 2> { return {}; };");
14451   verifyFormat("[]() -> foo<5 * 2> { return {}; };");
14452   verifyFormat("[]() -> foo<5 % 2> { return {}; };");
14453   verifyFormat("[]() -> foo<5 << 2> { return {}; };");
14454   verifyFormat("[]() -> foo<!5> { return {}; };");
14455   verifyFormat("[]() -> foo<~5> { return {}; };");
14456   verifyFormat("[]() -> foo<5 | 2> { return {}; };");
14457   verifyFormat("[]() -> foo<5 || 2> { return {}; };");
14458   verifyFormat("[]() -> foo<5 & 2> { return {}; };");
14459   verifyFormat("[]() -> foo<5 && 2> { return {}; };");
14460   verifyFormat("[]() -> foo<5 == 2> { return {}; };");
14461   verifyFormat("[]() -> foo<5 != 2> { return {}; };");
14462   verifyFormat("[]() -> foo<5 >= 2> { return {}; };");
14463   verifyFormat("[]() -> foo<5 <= 2> { return {}; };");
14464   verifyFormat("[]() -> foo<5 < 2> { return {}; };");
14465   verifyFormat("[]() -> foo<2 ? 1 : 0> { return {}; };");
14466   verifyFormat("namespace bar {\n"
14467                "// broken:\n"
14468                "auto foo{[]() -> foo<5 + 2> { return {}; }};\n"
14469                "} // namespace bar");
14470   verifyFormat("namespace bar {\n"
14471                "// broken:\n"
14472                "auto foo{[]() -> foo<5 - 2> { return {}; }};\n"
14473                "} // namespace bar");
14474   verifyFormat("namespace bar {\n"
14475                "// broken:\n"
14476                "auto foo{[]() -> foo<5 / 2> { return {}; }};\n"
14477                "} // namespace bar");
14478   verifyFormat("namespace bar {\n"
14479                "// broken:\n"
14480                "auto foo{[]() -> foo<5 * 2> { return {}; }};\n"
14481                "} // namespace bar");
14482   verifyFormat("namespace bar {\n"
14483                "// broken:\n"
14484                "auto foo{[]() -> foo<5 % 2> { return {}; }};\n"
14485                "} // namespace bar");
14486   verifyFormat("namespace bar {\n"
14487                "// broken:\n"
14488                "auto foo{[]() -> foo<5 << 2> { return {}; }};\n"
14489                "} // namespace bar");
14490   verifyFormat("namespace bar {\n"
14491                "// broken:\n"
14492                "auto foo{[]() -> foo<!5> { return {}; }};\n"
14493                "} // namespace bar");
14494   verifyFormat("namespace bar {\n"
14495                "// broken:\n"
14496                "auto foo{[]() -> foo<~5> { return {}; }};\n"
14497                "} // namespace bar");
14498   verifyFormat("namespace bar {\n"
14499                "// broken:\n"
14500                "auto foo{[]() -> foo<5 | 2> { return {}; }};\n"
14501                "} // namespace bar");
14502   verifyFormat("namespace bar {\n"
14503                "// broken:\n"
14504                "auto foo{[]() -> foo<5 || 2> { return {}; }};\n"
14505                "} // namespace bar");
14506   verifyFormat("namespace bar {\n"
14507                "// broken:\n"
14508                "auto foo{[]() -> foo<5 & 2> { return {}; }};\n"
14509                "} // namespace bar");
14510   verifyFormat("namespace bar {\n"
14511                "// broken:\n"
14512                "auto foo{[]() -> foo<5 && 2> { return {}; }};\n"
14513                "} // namespace bar");
14514   verifyFormat("namespace bar {\n"
14515                "// broken:\n"
14516                "auto foo{[]() -> foo<5 == 2> { return {}; }};\n"
14517                "} // namespace bar");
14518   verifyFormat("namespace bar {\n"
14519                "// broken:\n"
14520                "auto foo{[]() -> foo<5 != 2> { return {}; }};\n"
14521                "} // namespace bar");
14522   verifyFormat("namespace bar {\n"
14523                "// broken:\n"
14524                "auto foo{[]() -> foo<5 >= 2> { return {}; }};\n"
14525                "} // namespace bar");
14526   verifyFormat("namespace bar {\n"
14527                "// broken:\n"
14528                "auto foo{[]() -> foo<5 <= 2> { return {}; }};\n"
14529                "} // namespace bar");
14530   verifyFormat("namespace bar {\n"
14531                "// broken:\n"
14532                "auto foo{[]() -> foo<5 < 2> { return {}; }};\n"
14533                "} // namespace bar");
14534   verifyFormat("namespace bar {\n"
14535                "// broken:\n"
14536                "auto foo{[]() -> foo<2 ? 1 : 0> { return {}; }};\n"
14537                "} // namespace bar");
14538   verifyFormat("[]() -> a<1> {};");
14539   verifyFormat("[]() -> a<1> { ; };");
14540   verifyFormat("[]() -> a<1> { ; }();");
14541   verifyFormat("[a, a]() -> a<true> {};");
14542   verifyFormat("[]() -> a<true> {};");
14543   verifyFormat("[]() -> a<true> { ; };");
14544   verifyFormat("[]() -> a<true> { ; }();");
14545   verifyFormat("[a, a]() -> a<false> {};");
14546   verifyFormat("[]() -> a<false> {};");
14547   verifyFormat("[]() -> a<false> { ; };");
14548   verifyFormat("[]() -> a<false> { ; }();");
14549   verifyFormat("auto foo{[]() -> foo<false> { ; }};");
14550   verifyFormat("namespace bar {\n"
14551                "auto foo{[]() -> foo<false> { ; }};\n"
14552                "} // namespace bar");
14553   verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
14554                "                   int j) -> int {\n"
14555                "  return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
14556                "};");
14557   verifyFormat(
14558       "aaaaaaaaaaaaaaaaaaaaaa(\n"
14559       "    [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
14560       "      return aaaaaaaaaaaaaaaaa;\n"
14561       "    });",
14562       getLLVMStyleWithColumns(70));
14563   verifyFormat("[]() //\n"
14564                "    -> int {\n"
14565                "  return 1; //\n"
14566                "};");
14567   verifyFormat("[]() -> Void<T...> {};");
14568   verifyFormat("[a, b]() -> Tuple<T...> { return {}; };");
14569 
14570   // Lambdas with explicit template argument lists.
14571   verifyFormat(
14572       "auto L = []<template <typename> class T, class U>(T<U> &&a) {};\n");
14573 
14574   // Multiple lambdas in the same parentheses change indentation rules. These
14575   // lambdas are forced to start on new lines.
14576   verifyFormat("SomeFunction(\n"
14577                "    []() {\n"
14578                "      //\n"
14579                "    },\n"
14580                "    []() {\n"
14581                "      //\n"
14582                "    });");
14583 
14584   // A lambda passed as arg0 is always pushed to the next line.
14585   verifyFormat("SomeFunction(\n"
14586                "    [this] {\n"
14587                "      //\n"
14588                "    },\n"
14589                "    1);\n");
14590 
14591   // A multi-line lambda passed as arg1 forces arg0 to be pushed out, just like
14592   // the arg0 case above.
14593   auto Style = getGoogleStyle();
14594   Style.BinPackArguments = false;
14595   verifyFormat("SomeFunction(\n"
14596                "    a,\n"
14597                "    [this] {\n"
14598                "      //\n"
14599                "    },\n"
14600                "    b);\n",
14601                Style);
14602   verifyFormat("SomeFunction(\n"
14603                "    a,\n"
14604                "    [this] {\n"
14605                "      //\n"
14606                "    },\n"
14607                "    b);\n");
14608 
14609   // A lambda with a very long line forces arg0 to be pushed out irrespective of
14610   // the BinPackArguments value (as long as the code is wide enough).
14611   verifyFormat(
14612       "something->SomeFunction(\n"
14613       "    a,\n"
14614       "    [this] {\n"
14615       "      "
14616       "D0000000000000000000000000000000000000000000000000000000000001();\n"
14617       "    },\n"
14618       "    b);\n");
14619 
14620   // A multi-line lambda is pulled up as long as the introducer fits on the
14621   // previous line and there are no further args.
14622   verifyFormat("function(1, [this, that] {\n"
14623                "  //\n"
14624                "});\n");
14625   verifyFormat("function([this, that] {\n"
14626                "  //\n"
14627                "});\n");
14628   // FIXME: this format is not ideal and we should consider forcing the first
14629   // arg onto its own line.
14630   verifyFormat("function(a, b, c, //\n"
14631                "         d, [this, that] {\n"
14632                "           //\n"
14633                "         });\n");
14634 
14635   // Multiple lambdas are treated correctly even when there is a short arg0.
14636   verifyFormat("SomeFunction(\n"
14637                "    1,\n"
14638                "    [this] {\n"
14639                "      //\n"
14640                "    },\n"
14641                "    [this] {\n"
14642                "      //\n"
14643                "    },\n"
14644                "    1);\n");
14645 
14646   // More complex introducers.
14647   verifyFormat("return [i, args...] {};");
14648 
14649   // Not lambdas.
14650   verifyFormat("constexpr char hello[]{\"hello\"};");
14651   verifyFormat("double &operator[](int i) { return 0; }\n"
14652                "int i;");
14653   verifyFormat("std::unique_ptr<int[]> foo() {}");
14654   verifyFormat("int i = a[a][a]->f();");
14655   verifyFormat("int i = (*b)[a]->f();");
14656 
14657   // Other corner cases.
14658   verifyFormat("void f() {\n"
14659                "  bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
14660                "  );\n"
14661                "}");
14662 
14663   // Lambdas created through weird macros.
14664   verifyFormat("void f() {\n"
14665                "  MACRO((const AA &a) { return 1; });\n"
14666                "  MACRO((AA &a) { return 1; });\n"
14667                "}");
14668 
14669   verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
14670                "      doo_dah();\n"
14671                "      doo_dah();\n"
14672                "    })) {\n"
14673                "}");
14674   verifyFormat("if constexpr (blah_blah(whatever, whatever, [] {\n"
14675                "                doo_dah();\n"
14676                "                doo_dah();\n"
14677                "              })) {\n"
14678                "}");
14679   verifyFormat("if CONSTEXPR (blah_blah(whatever, whatever, [] {\n"
14680                "                doo_dah();\n"
14681                "                doo_dah();\n"
14682                "              })) {\n"
14683                "}");
14684   verifyFormat("auto lambda = []() {\n"
14685                "  int a = 2\n"
14686                "#if A\n"
14687                "          + 2\n"
14688                "#endif\n"
14689                "      ;\n"
14690                "};");
14691 
14692   // Lambdas with complex multiline introducers.
14693   verifyFormat(
14694       "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
14695       "    [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n"
14696       "        -> ::std::unordered_set<\n"
14697       "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n"
14698       "      //\n"
14699       "    });");
14700 
14701   FormatStyle DoNotMerge = getLLVMStyle();
14702   DoNotMerge.AllowShortLambdasOnASingleLine = FormatStyle::SLS_None;
14703   verifyFormat("auto c = []() {\n"
14704                "  return b;\n"
14705                "};",
14706                "auto c = []() { return b; };", DoNotMerge);
14707   verifyFormat("auto c = []() {\n"
14708                "};",
14709                " auto c = []() {};", DoNotMerge);
14710 
14711   FormatStyle MergeEmptyOnly = getLLVMStyle();
14712   MergeEmptyOnly.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Empty;
14713   verifyFormat("auto c = []() {\n"
14714                "  return b;\n"
14715                "};",
14716                "auto c = []() {\n"
14717                "  return b;\n"
14718                " };",
14719                MergeEmptyOnly);
14720   verifyFormat("auto c = []() {};",
14721                "auto c = []() {\n"
14722                "};",
14723                MergeEmptyOnly);
14724 
14725   FormatStyle MergeInline = getLLVMStyle();
14726   MergeInline.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Inline;
14727   verifyFormat("auto c = []() {\n"
14728                "  return b;\n"
14729                "};",
14730                "auto c = []() { return b; };", MergeInline);
14731   verifyFormat("function([]() { return b; })", "function([]() { return b; })",
14732                MergeInline);
14733   verifyFormat("function([]() { return b; }, a)",
14734                "function([]() { return b; }, a)", MergeInline);
14735   verifyFormat("function(a, []() { return b; })",
14736                "function(a, []() { return b; })", MergeInline);
14737 
14738   // Check option "BraceWrapping.BeforeLambdaBody" and different state of
14739   // AllowShortLambdasOnASingleLine
14740   FormatStyle LLVMWithBeforeLambdaBody = getLLVMStyle();
14741   LLVMWithBeforeLambdaBody.BreakBeforeBraces = FormatStyle::BS_Custom;
14742   LLVMWithBeforeLambdaBody.BraceWrapping.BeforeLambdaBody = true;
14743   LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine =
14744       FormatStyle::ShortLambdaStyle::SLS_None;
14745   verifyFormat("FctWithOneNestedLambdaInline_SLS_None(\n"
14746                "    []()\n"
14747                "    {\n"
14748                "      return 17;\n"
14749                "    });",
14750                LLVMWithBeforeLambdaBody);
14751   verifyFormat("FctWithOneNestedLambdaEmpty_SLS_None(\n"
14752                "    []()\n"
14753                "    {\n"
14754                "    });",
14755                LLVMWithBeforeLambdaBody);
14756   verifyFormat("auto fct_SLS_None = []()\n"
14757                "{\n"
14758                "  return 17;\n"
14759                "};",
14760                LLVMWithBeforeLambdaBody);
14761   verifyFormat("TwoNestedLambdas_SLS_None(\n"
14762                "    []()\n"
14763                "    {\n"
14764                "      return Call(\n"
14765                "          []()\n"
14766                "          {\n"
14767                "            return 17;\n"
14768                "          });\n"
14769                "    });",
14770                LLVMWithBeforeLambdaBody);
14771   verifyFormat("void Fct()\n"
14772                "{\n"
14773                "  return {[]()\n"
14774                "          {\n"
14775                "            return 17;\n"
14776                "          }};\n"
14777                "}",
14778                LLVMWithBeforeLambdaBody);
14779 
14780   LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine =
14781       FormatStyle::ShortLambdaStyle::SLS_Empty;
14782   verifyFormat("FctWithOneNestedLambdaInline_SLS_Empty(\n"
14783                "    []()\n"
14784                "    {\n"
14785                "      return 17;\n"
14786                "    });",
14787                LLVMWithBeforeLambdaBody);
14788   verifyFormat("FctWithOneNestedLambdaEmpty_SLS_Empty([]() {});",
14789                LLVMWithBeforeLambdaBody);
14790   verifyFormat("FctWithOneNestedLambdaEmptyInsideAVeryVeryVeryVeryVeryVeryVeryL"
14791                "ongFunctionName_SLS_Empty(\n"
14792                "    []() {});",
14793                LLVMWithBeforeLambdaBody);
14794   verifyFormat("FctWithMultipleParams_SLS_Empty(A, B,\n"
14795                "                                []()\n"
14796                "                                {\n"
14797                "                                  return 17;\n"
14798                "                                });",
14799                LLVMWithBeforeLambdaBody);
14800   verifyFormat("auto fct_SLS_Empty = []()\n"
14801                "{\n"
14802                "  return 17;\n"
14803                "};",
14804                LLVMWithBeforeLambdaBody);
14805   verifyFormat("TwoNestedLambdas_SLS_Empty(\n"
14806                "    []()\n"
14807                "    {\n"
14808                "      return Call([]() {});\n"
14809                "    });",
14810                LLVMWithBeforeLambdaBody);
14811   verifyFormat("TwoNestedLambdas_SLS_Empty(A,\n"
14812                "                           []()\n"
14813                "                           {\n"
14814                "                             return Call([]() {});\n"
14815                "                           });",
14816                LLVMWithBeforeLambdaBody);
14817   verifyFormat(
14818       "FctWithLongLineInLambda_SLS_Empty(\n"
14819       "    []()\n"
14820       "    {\n"
14821       "      return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n"
14822       "                               AndShouldNotBeConsiderAsInline,\n"
14823       "                               LambdaBodyMustBeBreak);\n"
14824       "    });",
14825       LLVMWithBeforeLambdaBody);
14826 
14827   LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine =
14828       FormatStyle::ShortLambdaStyle::SLS_Inline;
14829   verifyFormat("FctWithOneNestedLambdaInline_SLS_Inline([]() { return 17; });",
14830                LLVMWithBeforeLambdaBody);
14831   verifyFormat("FctWithOneNestedLambdaEmpty_SLS_Inline([]() {});",
14832                LLVMWithBeforeLambdaBody);
14833   verifyFormat("auto fct_SLS_Inline = []()\n"
14834                "{\n"
14835                "  return 17;\n"
14836                "};",
14837                LLVMWithBeforeLambdaBody);
14838   verifyFormat("TwoNestedLambdas_SLS_Inline([]() { return Call([]() { return "
14839                "17; }); });",
14840                LLVMWithBeforeLambdaBody);
14841   verifyFormat(
14842       "FctWithLongLineInLambda_SLS_Inline(\n"
14843       "    []()\n"
14844       "    {\n"
14845       "      return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n"
14846       "                               AndShouldNotBeConsiderAsInline,\n"
14847       "                               LambdaBodyMustBeBreak);\n"
14848       "    });",
14849       LLVMWithBeforeLambdaBody);
14850   verifyFormat("FctWithMultipleParams_SLS_Inline("
14851                "VeryLongParameterThatShouldAskToBeOnMultiLine,\n"
14852                "                                 []() { return 17; });",
14853                LLVMWithBeforeLambdaBody);
14854   verifyFormat(
14855       "FctWithMultipleParams_SLS_Inline(FirstParam, []() { return 17; });",
14856       LLVMWithBeforeLambdaBody);
14857 
14858   LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine =
14859       FormatStyle::ShortLambdaStyle::SLS_All;
14860   verifyFormat("FctWithOneNestedLambdaInline_SLS_All([]() { return 17; });",
14861                LLVMWithBeforeLambdaBody);
14862   verifyFormat("FctWithOneNestedLambdaEmpty_SLS_All([]() {});",
14863                LLVMWithBeforeLambdaBody);
14864   verifyFormat("auto fct_SLS_All = []() { return 17; };",
14865                LLVMWithBeforeLambdaBody);
14866   verifyFormat("FctWithOneParam_SLS_All(\n"
14867                "    []()\n"
14868                "    {\n"
14869                "      // A cool function...\n"
14870                "      return 43;\n"
14871                "    });",
14872                LLVMWithBeforeLambdaBody);
14873   verifyFormat("FctWithMultipleParams_SLS_All("
14874                "VeryLongParameterThatShouldAskToBeOnMultiLine,\n"
14875                "                              []() { return 17; });",
14876                LLVMWithBeforeLambdaBody);
14877   verifyFormat("FctWithMultipleParams_SLS_All(A, []() { return 17; });",
14878                LLVMWithBeforeLambdaBody);
14879   verifyFormat("FctWithMultipleParams_SLS_All(A, B, []() { return 17; });",
14880                LLVMWithBeforeLambdaBody);
14881   verifyFormat(
14882       "FctWithLongLineInLambda_SLS_All(\n"
14883       "    []()\n"
14884       "    {\n"
14885       "      return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n"
14886       "                               AndShouldNotBeConsiderAsInline,\n"
14887       "                               LambdaBodyMustBeBreak);\n"
14888       "    });",
14889       LLVMWithBeforeLambdaBody);
14890   verifyFormat(
14891       "auto fct_SLS_All = []()\n"
14892       "{\n"
14893       "  return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n"
14894       "                           AndShouldNotBeConsiderAsInline,\n"
14895       "                           LambdaBodyMustBeBreak);\n"
14896       "};",
14897       LLVMWithBeforeLambdaBody);
14898   LLVMWithBeforeLambdaBody.BinPackParameters = false;
14899   verifyFormat("FctAllOnSameLine_SLS_All([]() { return S; }, Fst, Second);",
14900                LLVMWithBeforeLambdaBody);
14901   verifyFormat(
14902       "FctWithLongLineInLambda_SLS_All([]() { return SomeValueNotSoLong; },\n"
14903       "                                FirstParam,\n"
14904       "                                SecondParam,\n"
14905       "                                ThirdParam,\n"
14906       "                                FourthParam);",
14907       LLVMWithBeforeLambdaBody);
14908   verifyFormat("FctWithLongLineInLambda_SLS_All(\n"
14909                "    []() { return "
14910                "SomeValueVeryVeryVeryVeryVeryVeryVeryVeryVeryLong; },\n"
14911                "    FirstParam,\n"
14912                "    SecondParam,\n"
14913                "    ThirdParam,\n"
14914                "    FourthParam);",
14915                LLVMWithBeforeLambdaBody);
14916   verifyFormat(
14917       "FctWithLongLineInLambda_SLS_All(FirstParam,\n"
14918       "                                SecondParam,\n"
14919       "                                ThirdParam,\n"
14920       "                                FourthParam,\n"
14921       "                                []() { return SomeValueNotSoLong; });",
14922       LLVMWithBeforeLambdaBody);
14923   verifyFormat("FctWithLongLineInLambda_SLS_All(\n"
14924                "    []()\n"
14925                "    {\n"
14926                "      return "
14927                "HereAVeryLongLineThatWillBeFormattedOnMultipleLineAndShouldNotB"
14928                "eConsiderAsInline;\n"
14929                "    });",
14930                LLVMWithBeforeLambdaBody);
14931   verifyFormat(
14932       "FctWithLongLineInLambda_SLS_All(\n"
14933       "    []()\n"
14934       "    {\n"
14935       "      return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n"
14936       "                               AndShouldNotBeConsiderAsInline,\n"
14937       "                               LambdaBodyMustBeBreak);\n"
14938       "    });",
14939       LLVMWithBeforeLambdaBody);
14940   verifyFormat("FctWithTwoParams_SLS_All(\n"
14941                "    []()\n"
14942                "    {\n"
14943                "      // A cool function...\n"
14944                "      return 43;\n"
14945                "    },\n"
14946                "    87);",
14947                LLVMWithBeforeLambdaBody);
14948   verifyFormat("FctWithTwoParams_SLS_All([]() { return 43; }, 87);",
14949                LLVMWithBeforeLambdaBody);
14950   verifyFormat("FctWithOneNestedLambdas_SLS_All([]() { return 17; });",
14951                LLVMWithBeforeLambdaBody);
14952   verifyFormat(
14953       "TwoNestedLambdas_SLS_All([]() { return Call([]() { return 17; }); });",
14954       LLVMWithBeforeLambdaBody);
14955   verifyFormat("TwoNestedLambdas_SLS_All([]() { return Call([]() { return 17; "
14956                "}); }, x);",
14957                LLVMWithBeforeLambdaBody);
14958   verifyFormat("TwoNestedLambdas_SLS_All(\n"
14959                "    []()\n"
14960                "    {\n"
14961                "      // A cool function...\n"
14962                "      return Call([]() { return 17; });\n"
14963                "    });",
14964                LLVMWithBeforeLambdaBody);
14965   verifyFormat("TwoNestedLambdas_SLS_All(\n"
14966                "    []()\n"
14967                "    {\n"
14968                "      return Call(\n"
14969                "          []()\n"
14970                "          {\n"
14971                "            // A cool function...\n"
14972                "            return 17;\n"
14973                "          });\n"
14974                "    });",
14975                LLVMWithBeforeLambdaBody);
14976 }
14977 
14978 TEST_F(FormatTest, LambdaWithLineComments) {
14979   FormatStyle LLVMWithBeforeLambdaBody = getLLVMStyle();
14980   LLVMWithBeforeLambdaBody.BreakBeforeBraces = FormatStyle::BS_Custom;
14981   LLVMWithBeforeLambdaBody.BraceWrapping.BeforeLambdaBody = true;
14982   LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine =
14983       FormatStyle::ShortLambdaStyle::SLS_All;
14984 
14985   verifyFormat("auto k = []() { return; }", LLVMWithBeforeLambdaBody);
14986   verifyFormat("auto k = []() // comment\n"
14987                "{ return; }",
14988                LLVMWithBeforeLambdaBody);
14989   verifyFormat("auto k = []() /* comment */ { return; }",
14990                LLVMWithBeforeLambdaBody);
14991   verifyFormat("auto k = []() /* comment */ /* comment */ { return; }",
14992                LLVMWithBeforeLambdaBody);
14993   verifyFormat("auto k = []() // X\n"
14994                "{ return; }",
14995                LLVMWithBeforeLambdaBody);
14996   verifyFormat(
14997       "auto k = []() // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"
14998       "{ return; }",
14999       LLVMWithBeforeLambdaBody);
15000 }
15001 
15002 TEST_F(FormatTest, EmptyLinesInLambdas) {
15003   verifyFormat("auto lambda = []() {\n"
15004                "  x(); //\n"
15005                "};",
15006                "auto lambda = []() {\n"
15007                "\n"
15008                "  x(); //\n"
15009                "\n"
15010                "};");
15011 }
15012 
15013 TEST_F(FormatTest, FormatsBlocks) {
15014   FormatStyle ShortBlocks = getLLVMStyle();
15015   ShortBlocks.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always;
15016   verifyFormat("int (^Block)(int, int);", ShortBlocks);
15017   verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
15018   verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
15019   verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
15020   verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
15021   verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
15022 
15023   verifyFormat("foo(^{ bar(); });", ShortBlocks);
15024   verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
15025   verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
15026 
15027   verifyFormat("[operation setCompletionBlock:^{\n"
15028                "  [self onOperationDone];\n"
15029                "}];");
15030   verifyFormat("int i = {[operation setCompletionBlock:^{\n"
15031                "  [self onOperationDone];\n"
15032                "}]};");
15033   verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
15034                "  f();\n"
15035                "}];");
15036   verifyFormat("int a = [operation block:^int(int *i) {\n"
15037                "  return 1;\n"
15038                "}];");
15039   verifyFormat("[myObject doSomethingWith:arg1\n"
15040                "                      aaa:^int(int *a) {\n"
15041                "                        return 1;\n"
15042                "                      }\n"
15043                "                      bbb:f(a * bbbbbbbb)];");
15044 
15045   verifyFormat("[operation setCompletionBlock:^{\n"
15046                "  [self.delegate newDataAvailable];\n"
15047                "}];",
15048                getLLVMStyleWithColumns(60));
15049   verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
15050                "  NSString *path = [self sessionFilePath];\n"
15051                "  if (path) {\n"
15052                "    // ...\n"
15053                "  }\n"
15054                "});");
15055   verifyFormat("[[SessionService sharedService]\n"
15056                "    loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
15057                "      if (window) {\n"
15058                "        [self windowDidLoad:window];\n"
15059                "      } else {\n"
15060                "        [self errorLoadingWindow];\n"
15061                "      }\n"
15062                "    }];");
15063   verifyFormat("void (^largeBlock)(void) = ^{\n"
15064                "  // ...\n"
15065                "};\n",
15066                getLLVMStyleWithColumns(40));
15067   verifyFormat("[[SessionService sharedService]\n"
15068                "    loadWindowWithCompletionBlock: //\n"
15069                "        ^(SessionWindow *window) {\n"
15070                "          if (window) {\n"
15071                "            [self windowDidLoad:window];\n"
15072                "          } else {\n"
15073                "            [self errorLoadingWindow];\n"
15074                "          }\n"
15075                "        }];",
15076                getLLVMStyleWithColumns(60));
15077   verifyFormat("[myObject doSomethingWith:arg1\n"
15078                "    firstBlock:^(Foo *a) {\n"
15079                "      // ...\n"
15080                "      int i;\n"
15081                "    }\n"
15082                "    secondBlock:^(Bar *b) {\n"
15083                "      // ...\n"
15084                "      int i;\n"
15085                "    }\n"
15086                "    thirdBlock:^Foo(Bar *b) {\n"
15087                "      // ...\n"
15088                "      int i;\n"
15089                "    }];");
15090   verifyFormat("[myObject doSomethingWith:arg1\n"
15091                "               firstBlock:-1\n"
15092                "              secondBlock:^(Bar *b) {\n"
15093                "                // ...\n"
15094                "                int i;\n"
15095                "              }];");
15096 
15097   verifyFormat("f(^{\n"
15098                "  @autoreleasepool {\n"
15099                "    if (a) {\n"
15100                "      g();\n"
15101                "    }\n"
15102                "  }\n"
15103                "});");
15104   verifyFormat("Block b = ^int *(A *a, B *b) {}");
15105   verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
15106                "};");
15107 
15108   FormatStyle FourIndent = getLLVMStyle();
15109   FourIndent.ObjCBlockIndentWidth = 4;
15110   verifyFormat("[operation setCompletionBlock:^{\n"
15111                "    [self onOperationDone];\n"
15112                "}];",
15113                FourIndent);
15114 }
15115 
15116 TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
15117   FormatStyle ZeroColumn = getLLVMStyle();
15118   ZeroColumn.ColumnLimit = 0;
15119 
15120   verifyFormat("[[SessionService sharedService] "
15121                "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
15122                "  if (window) {\n"
15123                "    [self windowDidLoad:window];\n"
15124                "  } else {\n"
15125                "    [self errorLoadingWindow];\n"
15126                "  }\n"
15127                "}];",
15128                ZeroColumn);
15129   EXPECT_EQ("[[SessionService sharedService]\n"
15130             "    loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
15131             "      if (window) {\n"
15132             "        [self windowDidLoad:window];\n"
15133             "      } else {\n"
15134             "        [self errorLoadingWindow];\n"
15135             "      }\n"
15136             "    }];",
15137             format("[[SessionService sharedService]\n"
15138                    "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
15139                    "                if (window) {\n"
15140                    "    [self windowDidLoad:window];\n"
15141                    "  } else {\n"
15142                    "    [self errorLoadingWindow];\n"
15143                    "  }\n"
15144                    "}];",
15145                    ZeroColumn));
15146   verifyFormat("[myObject doSomethingWith:arg1\n"
15147                "    firstBlock:^(Foo *a) {\n"
15148                "      // ...\n"
15149                "      int i;\n"
15150                "    }\n"
15151                "    secondBlock:^(Bar *b) {\n"
15152                "      // ...\n"
15153                "      int i;\n"
15154                "    }\n"
15155                "    thirdBlock:^Foo(Bar *b) {\n"
15156                "      // ...\n"
15157                "      int i;\n"
15158                "    }];",
15159                ZeroColumn);
15160   verifyFormat("f(^{\n"
15161                "  @autoreleasepool {\n"
15162                "    if (a) {\n"
15163                "      g();\n"
15164                "    }\n"
15165                "  }\n"
15166                "});",
15167                ZeroColumn);
15168   verifyFormat("void (^largeBlock)(void) = ^{\n"
15169                "  // ...\n"
15170                "};",
15171                ZeroColumn);
15172 
15173   ZeroColumn.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always;
15174   EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
15175             format("void   (^largeBlock)(void) = ^{ int   i; };", ZeroColumn));
15176   ZeroColumn.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Never;
15177   EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
15178             "  int i;\n"
15179             "};",
15180             format("void   (^largeBlock)(void) = ^{ int   i; };", ZeroColumn));
15181 }
15182 
15183 TEST_F(FormatTest, SupportsCRLF) {
15184   EXPECT_EQ("int a;\r\n"
15185             "int b;\r\n"
15186             "int c;\r\n",
15187             format("int a;\r\n"
15188                    "  int b;\r\n"
15189                    "    int c;\r\n",
15190                    getLLVMStyle()));
15191   EXPECT_EQ("int a;\r\n"
15192             "int b;\r\n"
15193             "int c;\r\n",
15194             format("int a;\r\n"
15195                    "  int b;\n"
15196                    "    int c;\r\n",
15197                    getLLVMStyle()));
15198   EXPECT_EQ("int a;\n"
15199             "int b;\n"
15200             "int c;\n",
15201             format("int a;\r\n"
15202                    "  int b;\n"
15203                    "    int c;\n",
15204                    getLLVMStyle()));
15205   EXPECT_EQ("\"aaaaaaa \"\r\n"
15206             "\"bbbbbbb\";\r\n",
15207             format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
15208   EXPECT_EQ("#define A \\\r\n"
15209             "  b;      \\\r\n"
15210             "  c;      \\\r\n"
15211             "  d;\r\n",
15212             format("#define A \\\r\n"
15213                    "  b; \\\r\n"
15214                    "  c; d; \r\n",
15215                    getGoogleStyle()));
15216 
15217   EXPECT_EQ("/*\r\n"
15218             "multi line block comments\r\n"
15219             "should not introduce\r\n"
15220             "an extra carriage return\r\n"
15221             "*/\r\n",
15222             format("/*\r\n"
15223                    "multi line block comments\r\n"
15224                    "should not introduce\r\n"
15225                    "an extra carriage return\r\n"
15226                    "*/\r\n"));
15227   EXPECT_EQ("/*\r\n"
15228             "\r\n"
15229             "*/",
15230             format("/*\r\n"
15231                    "    \r\r\r\n"
15232                    "*/"));
15233 
15234   FormatStyle style = getLLVMStyle();
15235 
15236   style.DeriveLineEnding = true;
15237   style.UseCRLF = false;
15238   EXPECT_EQ("union FooBarBazQux {\n"
15239             "  int foo;\n"
15240             "  int bar;\n"
15241             "  int baz;\n"
15242             "};",
15243             format("union FooBarBazQux {\r\n"
15244                    "  int foo;\n"
15245                    "  int bar;\r\n"
15246                    "  int baz;\n"
15247                    "};",
15248                    style));
15249   style.UseCRLF = true;
15250   EXPECT_EQ("union FooBarBazQux {\r\n"
15251             "  int foo;\r\n"
15252             "  int bar;\r\n"
15253             "  int baz;\r\n"
15254             "};",
15255             format("union FooBarBazQux {\r\n"
15256                    "  int foo;\n"
15257                    "  int bar;\r\n"
15258                    "  int baz;\n"
15259                    "};",
15260                    style));
15261 
15262   style.DeriveLineEnding = false;
15263   style.UseCRLF = false;
15264   EXPECT_EQ("union FooBarBazQux {\n"
15265             "  int foo;\n"
15266             "  int bar;\n"
15267             "  int baz;\n"
15268             "  int qux;\n"
15269             "};",
15270             format("union FooBarBazQux {\r\n"
15271                    "  int foo;\n"
15272                    "  int bar;\r\n"
15273                    "  int baz;\n"
15274                    "  int qux;\r\n"
15275                    "};",
15276                    style));
15277   style.UseCRLF = true;
15278   EXPECT_EQ("union FooBarBazQux {\r\n"
15279             "  int foo;\r\n"
15280             "  int bar;\r\n"
15281             "  int baz;\r\n"
15282             "  int qux;\r\n"
15283             "};",
15284             format("union FooBarBazQux {\r\n"
15285                    "  int foo;\n"
15286                    "  int bar;\r\n"
15287                    "  int baz;\n"
15288                    "  int qux;\n"
15289                    "};",
15290                    style));
15291 
15292   style.DeriveLineEnding = true;
15293   style.UseCRLF = false;
15294   EXPECT_EQ("union FooBarBazQux {\r\n"
15295             "  int foo;\r\n"
15296             "  int bar;\r\n"
15297             "  int baz;\r\n"
15298             "  int qux;\r\n"
15299             "};",
15300             format("union FooBarBazQux {\r\n"
15301                    "  int foo;\n"
15302                    "  int bar;\r\n"
15303                    "  int baz;\n"
15304                    "  int qux;\r\n"
15305                    "};",
15306                    style));
15307   style.UseCRLF = true;
15308   EXPECT_EQ("union FooBarBazQux {\n"
15309             "  int foo;\n"
15310             "  int bar;\n"
15311             "  int baz;\n"
15312             "  int qux;\n"
15313             "};",
15314             format("union FooBarBazQux {\r\n"
15315                    "  int foo;\n"
15316                    "  int bar;\r\n"
15317                    "  int baz;\n"
15318                    "  int qux;\n"
15319                    "};",
15320                    style));
15321 }
15322 
15323 TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
15324   verifyFormat("MY_CLASS(C) {\n"
15325                "  int i;\n"
15326                "  int j;\n"
15327                "};");
15328 }
15329 
15330 TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
15331   FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
15332   TwoIndent.ContinuationIndentWidth = 2;
15333 
15334   EXPECT_EQ("int i =\n"
15335             "  longFunction(\n"
15336             "    arg);",
15337             format("int i = longFunction(arg);", TwoIndent));
15338 
15339   FormatStyle SixIndent = getLLVMStyleWithColumns(20);
15340   SixIndent.ContinuationIndentWidth = 6;
15341 
15342   EXPECT_EQ("int i =\n"
15343             "      longFunction(\n"
15344             "            arg);",
15345             format("int i = longFunction(arg);", SixIndent));
15346 }
15347 
15348 TEST_F(FormatTest, WrappedClosingParenthesisIndent) {
15349   FormatStyle Style = getLLVMStyle();
15350   verifyFormat("int Foo::getter(\n"
15351                "    //\n"
15352                ") const {\n"
15353                "  return foo;\n"
15354                "}",
15355                Style);
15356   verifyFormat("void Foo::setter(\n"
15357                "    //\n"
15358                ") {\n"
15359                "  foo = 1;\n"
15360                "}",
15361                Style);
15362 }
15363 
15364 TEST_F(FormatTest, SpacesInAngles) {
15365   FormatStyle Spaces = getLLVMStyle();
15366   Spaces.SpacesInAngles = true;
15367 
15368   verifyFormat("static_cast< int >(arg);", Spaces);
15369   verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
15370   verifyFormat("f< int, float >();", Spaces);
15371   verifyFormat("template <> g() {}", Spaces);
15372   verifyFormat("template < std::vector< int > > f() {}", Spaces);
15373   verifyFormat("std::function< void(int, int) > fct;", Spaces);
15374   verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
15375                Spaces);
15376 
15377   Spaces.Standard = FormatStyle::LS_Cpp03;
15378   Spaces.SpacesInAngles = true;
15379   verifyFormat("A< A< int > >();", Spaces);
15380 
15381   Spaces.SpacesInAngles = false;
15382   verifyFormat("A<A<int> >();", Spaces);
15383 
15384   Spaces.Standard = FormatStyle::LS_Cpp11;
15385   Spaces.SpacesInAngles = true;
15386   verifyFormat("A< A< int > >();", Spaces);
15387 
15388   Spaces.SpacesInAngles = false;
15389   verifyFormat("A<A<int>>();", Spaces);
15390 }
15391 
15392 TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
15393   FormatStyle Style = getLLVMStyle();
15394   Style.SpaceAfterTemplateKeyword = false;
15395   verifyFormat("template<int> void foo();", Style);
15396 }
15397 
15398 TEST_F(FormatTest, TripleAngleBrackets) {
15399   verifyFormat("f<<<1, 1>>>();");
15400   verifyFormat("f<<<1, 1, 1, s>>>();");
15401   verifyFormat("f<<<a, b, c, d>>>();");
15402   EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
15403   verifyFormat("f<param><<<1, 1>>>();");
15404   verifyFormat("f<1><<<1, 1>>>();");
15405   EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
15406   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
15407                "aaaaaaaaaaa<<<\n    1, 1>>>();");
15408   verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
15409                "    <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
15410 }
15411 
15412 TEST_F(FormatTest, MergeLessLessAtEnd) {
15413   verifyFormat("<<");
15414   EXPECT_EQ("< < <", format("\\\n<<<"));
15415   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
15416                "aaallvm::outs() <<");
15417   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
15418                "aaaallvm::outs()\n    <<");
15419 }
15420 
15421 TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
15422   std::string code = "#if A\n"
15423                      "#if B\n"
15424                      "a.\n"
15425                      "#endif\n"
15426                      "    a = 1;\n"
15427                      "#else\n"
15428                      "#endif\n"
15429                      "#if C\n"
15430                      "#else\n"
15431                      "#endif\n";
15432   EXPECT_EQ(code, format(code));
15433 }
15434 
15435 TEST_F(FormatTest, HandleConflictMarkers) {
15436   // Git/SVN conflict markers.
15437   EXPECT_EQ("int a;\n"
15438             "void f() {\n"
15439             "  callme(some(parameter1,\n"
15440             "<<<<<<< text by the vcs\n"
15441             "              parameter2),\n"
15442             "||||||| text by the vcs\n"
15443             "              parameter2),\n"
15444             "         parameter3,\n"
15445             "======= text by the vcs\n"
15446             "              parameter2, parameter3),\n"
15447             ">>>>>>> text by the vcs\n"
15448             "         otherparameter);\n",
15449             format("int a;\n"
15450                    "void f() {\n"
15451                    "  callme(some(parameter1,\n"
15452                    "<<<<<<< text by the vcs\n"
15453                    "  parameter2),\n"
15454                    "||||||| text by the vcs\n"
15455                    "  parameter2),\n"
15456                    "  parameter3,\n"
15457                    "======= text by the vcs\n"
15458                    "  parameter2,\n"
15459                    "  parameter3),\n"
15460                    ">>>>>>> text by the vcs\n"
15461                    "  otherparameter);\n"));
15462 
15463   // Perforce markers.
15464   EXPECT_EQ("void f() {\n"
15465             "  function(\n"
15466             ">>>> text by the vcs\n"
15467             "      parameter,\n"
15468             "==== text by the vcs\n"
15469             "      parameter,\n"
15470             "==== text by the vcs\n"
15471             "      parameter,\n"
15472             "<<<< text by the vcs\n"
15473             "      parameter);\n",
15474             format("void f() {\n"
15475                    "  function(\n"
15476                    ">>>> text by the vcs\n"
15477                    "  parameter,\n"
15478                    "==== text by the vcs\n"
15479                    "  parameter,\n"
15480                    "==== text by the vcs\n"
15481                    "  parameter,\n"
15482                    "<<<< text by the vcs\n"
15483                    "  parameter);\n"));
15484 
15485   EXPECT_EQ("<<<<<<<\n"
15486             "|||||||\n"
15487             "=======\n"
15488             ">>>>>>>",
15489             format("<<<<<<<\n"
15490                    "|||||||\n"
15491                    "=======\n"
15492                    ">>>>>>>"));
15493 
15494   EXPECT_EQ("<<<<<<<\n"
15495             "|||||||\n"
15496             "int i;\n"
15497             "=======\n"
15498             ">>>>>>>",
15499             format("<<<<<<<\n"
15500                    "|||||||\n"
15501                    "int i;\n"
15502                    "=======\n"
15503                    ">>>>>>>"));
15504 
15505   // FIXME: Handle parsing of macros around conflict markers correctly:
15506   EXPECT_EQ("#define Macro \\\n"
15507             "<<<<<<<\n"
15508             "Something \\\n"
15509             "|||||||\n"
15510             "Else \\\n"
15511             "=======\n"
15512             "Other \\\n"
15513             ">>>>>>>\n"
15514             "    End int i;\n",
15515             format("#define Macro \\\n"
15516                    "<<<<<<<\n"
15517                    "  Something \\\n"
15518                    "|||||||\n"
15519                    "  Else \\\n"
15520                    "=======\n"
15521                    "  Other \\\n"
15522                    ">>>>>>>\n"
15523                    "  End\n"
15524                    "int i;\n"));
15525 }
15526 
15527 TEST_F(FormatTest, DisableRegions) {
15528   EXPECT_EQ("int i;\n"
15529             "// clang-format off\n"
15530             "  int j;\n"
15531             "// clang-format on\n"
15532             "int k;",
15533             format(" int  i;\n"
15534                    "   // clang-format off\n"
15535                    "  int j;\n"
15536                    " // clang-format on\n"
15537                    "   int   k;"));
15538   EXPECT_EQ("int i;\n"
15539             "/* clang-format off */\n"
15540             "  int j;\n"
15541             "/* clang-format on */\n"
15542             "int k;",
15543             format(" int  i;\n"
15544                    "   /* clang-format off */\n"
15545                    "  int j;\n"
15546                    " /* clang-format on */\n"
15547                    "   int   k;"));
15548 
15549   // Don't reflow comments within disabled regions.
15550   EXPECT_EQ("// clang-format off\n"
15551             "// long long long long long long line\n"
15552             "/* clang-format on */\n"
15553             "/* long long long\n"
15554             " * long long long\n"
15555             " * line */\n"
15556             "int i;\n"
15557             "/* clang-format off */\n"
15558             "/* long long long long long long line */\n",
15559             format("// clang-format off\n"
15560                    "// long long long long long long line\n"
15561                    "/* clang-format on */\n"
15562                    "/* long long long long long long line */\n"
15563                    "int i;\n"
15564                    "/* clang-format off */\n"
15565                    "/* long long long long long long line */\n",
15566                    getLLVMStyleWithColumns(20)));
15567 }
15568 
15569 TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
15570   format("? ) =");
15571   verifyNoCrash("#define a\\\n /**/}");
15572 }
15573 
15574 TEST_F(FormatTest, FormatsTableGenCode) {
15575   FormatStyle Style = getLLVMStyle();
15576   Style.Language = FormatStyle::LK_TableGen;
15577   verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
15578 }
15579 
15580 TEST_F(FormatTest, ArrayOfTemplates) {
15581   EXPECT_EQ("auto a = new unique_ptr<int>[10];",
15582             format("auto a = new unique_ptr<int > [ 10];"));
15583 
15584   FormatStyle Spaces = getLLVMStyle();
15585   Spaces.SpacesInSquareBrackets = true;
15586   EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
15587             format("auto a = new unique_ptr<int > [10];", Spaces));
15588 }
15589 
15590 TEST_F(FormatTest, ArrayAsTemplateType) {
15591   EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
15592             format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
15593 
15594   FormatStyle Spaces = getLLVMStyle();
15595   Spaces.SpacesInSquareBrackets = true;
15596   EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
15597             format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
15598 }
15599 
15600 TEST_F(FormatTest, NoSpaceAfterSuper) { verifyFormat("__super::FooBar();"); }
15601 
15602 TEST(FormatStyle, GetStyleWithEmptyFileName) {
15603   llvm::vfs::InMemoryFileSystem FS;
15604   auto Style1 = getStyle("file", "", "Google", "", &FS);
15605   ASSERT_TRUE((bool)Style1);
15606   ASSERT_EQ(*Style1, getGoogleStyle());
15607 }
15608 
15609 TEST(FormatStyle, GetStyleOfFile) {
15610   llvm::vfs::InMemoryFileSystem FS;
15611   // Test 1: format file in the same directory.
15612   ASSERT_TRUE(
15613       FS.addFile("/a/.clang-format", 0,
15614                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
15615   ASSERT_TRUE(
15616       FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
15617   auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
15618   ASSERT_TRUE((bool)Style1);
15619   ASSERT_EQ(*Style1, getLLVMStyle());
15620 
15621   // Test 2.1: fallback to default.
15622   ASSERT_TRUE(
15623       FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
15624   auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
15625   ASSERT_TRUE((bool)Style2);
15626   ASSERT_EQ(*Style2, getMozillaStyle());
15627 
15628   // Test 2.2: no format on 'none' fallback style.
15629   Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
15630   ASSERT_TRUE((bool)Style2);
15631   ASSERT_EQ(*Style2, getNoStyle());
15632 
15633   // Test 2.3: format if config is found with no based style while fallback is
15634   // 'none'.
15635   ASSERT_TRUE(FS.addFile("/b/.clang-format", 0,
15636                          llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2")));
15637   Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
15638   ASSERT_TRUE((bool)Style2);
15639   ASSERT_EQ(*Style2, getLLVMStyle());
15640 
15641   // Test 2.4: format if yaml with no based style, while fallback is 'none'.
15642   Style2 = getStyle("{}", "a.h", "none", "", &FS);
15643   ASSERT_TRUE((bool)Style2);
15644   ASSERT_EQ(*Style2, getLLVMStyle());
15645 
15646   // Test 3: format file in parent directory.
15647   ASSERT_TRUE(
15648       FS.addFile("/c/.clang-format", 0,
15649                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
15650   ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
15651                          llvm::MemoryBuffer::getMemBuffer("int i;")));
15652   auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
15653   ASSERT_TRUE((bool)Style3);
15654   ASSERT_EQ(*Style3, getGoogleStyle());
15655 
15656   // Test 4: error on invalid fallback style
15657   auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS);
15658   ASSERT_FALSE((bool)Style4);
15659   llvm::consumeError(Style4.takeError());
15660 
15661   // Test 5: error on invalid yaml on command line
15662   auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS);
15663   ASSERT_FALSE((bool)Style5);
15664   llvm::consumeError(Style5.takeError());
15665 
15666   // Test 6: error on invalid style
15667   auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS);
15668   ASSERT_FALSE((bool)Style6);
15669   llvm::consumeError(Style6.takeError());
15670 
15671   // Test 7: found config file, error on parsing it
15672   ASSERT_TRUE(
15673       FS.addFile("/d/.clang-format", 0,
15674                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n"
15675                                                   "InvalidKey: InvalidValue")));
15676   ASSERT_TRUE(
15677       FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
15678   auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS);
15679   ASSERT_FALSE((bool)Style7);
15680   llvm::consumeError(Style7.takeError());
15681 
15682   // Test 8: inferred per-language defaults apply.
15683   auto StyleTd = getStyle("file", "x.td", "llvm", "", &FS);
15684   ASSERT_TRUE((bool)StyleTd);
15685   ASSERT_EQ(*StyleTd, getLLVMStyle(FormatStyle::LK_TableGen));
15686 }
15687 
15688 TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
15689   // Column limit is 20.
15690   std::string Code = "Type *a =\n"
15691                      "    new Type();\n"
15692                      "g(iiiii, 0, jjjjj,\n"
15693                      "  0, kkkkk, 0, mm);\n"
15694                      "int  bad     = format   ;";
15695   std::string Expected = "auto a = new Type();\n"
15696                          "g(iiiii, nullptr,\n"
15697                          "  jjjjj, nullptr,\n"
15698                          "  kkkkk, nullptr,\n"
15699                          "  mm);\n"
15700                          "int  bad     = format   ;";
15701   FileID ID = Context.createInMemoryFile("format.cpp", Code);
15702   tooling::Replacements Replaces = toReplacements(
15703       {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
15704                             "auto "),
15705        tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
15706                             "nullptr"),
15707        tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
15708                             "nullptr"),
15709        tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
15710                             "nullptr")});
15711 
15712   format::FormatStyle Style = format::getLLVMStyle();
15713   Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
15714   auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
15715   EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
15716       << llvm::toString(FormattedReplaces.takeError()) << "\n";
15717   auto Result = applyAllReplacements(Code, *FormattedReplaces);
15718   EXPECT_TRUE(static_cast<bool>(Result));
15719   EXPECT_EQ(Expected, *Result);
15720 }
15721 
15722 TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
15723   std::string Code = "#include \"a.h\"\n"
15724                      "#include \"c.h\"\n"
15725                      "\n"
15726                      "int main() {\n"
15727                      "  return 0;\n"
15728                      "}";
15729   std::string Expected = "#include \"a.h\"\n"
15730                          "#include \"b.h\"\n"
15731                          "#include \"c.h\"\n"
15732                          "\n"
15733                          "int main() {\n"
15734                          "  return 0;\n"
15735                          "}";
15736   FileID ID = Context.createInMemoryFile("fix.cpp", Code);
15737   tooling::Replacements Replaces = toReplacements(
15738       {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
15739                             "#include \"b.h\"\n")});
15740 
15741   format::FormatStyle Style = format::getLLVMStyle();
15742   Style.SortIncludes = true;
15743   auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
15744   EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
15745       << llvm::toString(FormattedReplaces.takeError()) << "\n";
15746   auto Result = applyAllReplacements(Code, *FormattedReplaces);
15747   EXPECT_TRUE(static_cast<bool>(Result));
15748   EXPECT_EQ(Expected, *Result);
15749 }
15750 
15751 TEST_F(FormatTest, FormatSortsUsingDeclarations) {
15752   EXPECT_EQ("using std::cin;\n"
15753             "using std::cout;",
15754             format("using std::cout;\n"
15755                    "using std::cin;",
15756                    getGoogleStyle()));
15757 }
15758 
15759 TEST_F(FormatTest, UTF8CharacterLiteralCpp03) {
15760   format::FormatStyle Style = format::getLLVMStyle();
15761   Style.Standard = FormatStyle::LS_Cpp03;
15762   // cpp03 recognize this string as identifier u8 and literal character 'a'
15763   EXPECT_EQ("auto c = u8 'a';", format("auto c = u8'a';", Style));
15764 }
15765 
15766 TEST_F(FormatTest, UTF8CharacterLiteralCpp11) {
15767   // u8'a' is a C++17 feature, utf8 literal character, LS_Cpp11 covers
15768   // all modes, including C++11, C++14 and C++17
15769   EXPECT_EQ("auto c = u8'a';", format("auto c = u8'a';"));
15770 }
15771 
15772 TEST_F(FormatTest, DoNotFormatLikelyXml) {
15773   EXPECT_EQ("<!-- ;> -->", format("<!-- ;> -->", getGoogleStyle()));
15774   EXPECT_EQ(" <!-- >; -->", format(" <!-- >; -->", getGoogleStyle()));
15775 }
15776 
15777 TEST_F(FormatTest, StructuredBindings) {
15778   // Structured bindings is a C++17 feature.
15779   // all modes, including C++11, C++14 and C++17
15780   verifyFormat("auto [a, b] = f();");
15781   EXPECT_EQ("auto [a, b] = f();", format("auto[a, b] = f();"));
15782   EXPECT_EQ("const auto [a, b] = f();", format("const   auto[a, b] = f();"));
15783   EXPECT_EQ("auto const [a, b] = f();", format("auto  const[a, b] = f();"));
15784   EXPECT_EQ("auto const volatile [a, b] = f();",
15785             format("auto  const   volatile[a, b] = f();"));
15786   EXPECT_EQ("auto [a, b, c] = f();", format("auto   [  a  ,  b,c   ] = f();"));
15787   EXPECT_EQ("auto &[a, b, c] = f();",
15788             format("auto   &[  a  ,  b,c   ] = f();"));
15789   EXPECT_EQ("auto &&[a, b, c] = f();",
15790             format("auto   &&[  a  ,  b,c   ] = f();"));
15791   EXPECT_EQ("auto const &[a, b] = f();", format("auto  const&[a, b] = f();"));
15792   EXPECT_EQ("auto const volatile &&[a, b] = f();",
15793             format("auto  const  volatile  &&[a, b] = f();"));
15794   EXPECT_EQ("auto const &&[a, b] = f();",
15795             format("auto  const   &&  [a, b] = f();"));
15796   EXPECT_EQ("const auto &[a, b] = f();",
15797             format("const  auto  &  [a, b] = f();"));
15798   EXPECT_EQ("const auto volatile &&[a, b] = f();",
15799             format("const  auto   volatile  &&[a, b] = f();"));
15800   EXPECT_EQ("volatile const auto &&[a, b] = f();",
15801             format("volatile  const  auto   &&[a, b] = f();"));
15802   EXPECT_EQ("const auto &&[a, b] = f();",
15803             format("const  auto  &&  [a, b] = f();"));
15804 
15805   // Make sure we don't mistake structured bindings for lambdas.
15806   FormatStyle PointerMiddle = getLLVMStyle();
15807   PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
15808   verifyFormat("auto [a1, b]{A * i};", getGoogleStyle());
15809   verifyFormat("auto [a2, b]{A * i};", getLLVMStyle());
15810   verifyFormat("auto [a3, b]{A * i};", PointerMiddle);
15811   verifyFormat("auto const [a1, b]{A * i};", getGoogleStyle());
15812   verifyFormat("auto const [a2, b]{A * i};", getLLVMStyle());
15813   verifyFormat("auto const [a3, b]{A * i};", PointerMiddle);
15814   verifyFormat("auto const& [a1, b]{A * i};", getGoogleStyle());
15815   verifyFormat("auto const &[a2, b]{A * i};", getLLVMStyle());
15816   verifyFormat("auto const & [a3, b]{A * i};", PointerMiddle);
15817   verifyFormat("auto const&& [a1, b]{A * i};", getGoogleStyle());
15818   verifyFormat("auto const &&[a2, b]{A * i};", getLLVMStyle());
15819   verifyFormat("auto const && [a3, b]{A * i};", PointerMiddle);
15820 
15821   EXPECT_EQ("for (const auto &&[a, b] : some_range) {\n}",
15822             format("for (const auto   &&   [a, b] : some_range) {\n}"));
15823   EXPECT_EQ("for (const auto &[a, b] : some_range) {\n}",
15824             format("for (const auto   &   [a, b] : some_range) {\n}"));
15825   EXPECT_EQ("for (const auto [a, b] : some_range) {\n}",
15826             format("for (const auto[a, b] : some_range) {\n}"));
15827   EXPECT_EQ("auto [x, y](expr);", format("auto[x,y]  (expr);"));
15828   EXPECT_EQ("auto &[x, y](expr);", format("auto  &  [x,y]  (expr);"));
15829   EXPECT_EQ("auto &&[x, y](expr);", format("auto  &&  [x,y]  (expr);"));
15830   EXPECT_EQ("auto const &[x, y](expr);",
15831             format("auto  const  &  [x,y]  (expr);"));
15832   EXPECT_EQ("auto const &&[x, y](expr);",
15833             format("auto  const  &&  [x,y]  (expr);"));
15834   EXPECT_EQ("auto [x, y]{expr};", format("auto[x,y]     {expr};"));
15835   EXPECT_EQ("auto const &[x, y]{expr};",
15836             format("auto  const  &  [x,y]  {expr};"));
15837   EXPECT_EQ("auto const &&[x, y]{expr};",
15838             format("auto  const  &&  [x,y]  {expr};"));
15839 
15840   format::FormatStyle Spaces = format::getLLVMStyle();
15841   Spaces.SpacesInSquareBrackets = true;
15842   verifyFormat("auto [ a, b ] = f();", Spaces);
15843   verifyFormat("auto &&[ a, b ] = f();", Spaces);
15844   verifyFormat("auto &[ a, b ] = f();", Spaces);
15845   verifyFormat("auto const &&[ a, b ] = f();", Spaces);
15846   verifyFormat("auto const &[ a, b ] = f();", Spaces);
15847 }
15848 
15849 TEST_F(FormatTest, FileAndCode) {
15850   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.cc", ""));
15851   EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.m", ""));
15852   EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.mm", ""));
15853   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", ""));
15854   EXPECT_EQ(FormatStyle::LK_ObjC,
15855             guessLanguage("foo.h", "@interface Foo\n@end\n"));
15856   EXPECT_EQ(
15857       FormatStyle::LK_ObjC,
15858       guessLanguage("foo.h", "#define TRY(x, y) @try { x; } @finally { y; }"));
15859   EXPECT_EQ(FormatStyle::LK_ObjC,
15860             guessLanguage("foo.h", "#define AVAIL(x) @available(x, *))"));
15861   EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@class Foo;"));
15862   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo", ""));
15863   EXPECT_EQ(FormatStyle::LK_ObjC,
15864             guessLanguage("foo", "@interface Foo\n@end\n"));
15865   EXPECT_EQ(FormatStyle::LK_ObjC,
15866             guessLanguage("foo.h", "int DoStuff(CGRect rect);\n"));
15867   EXPECT_EQ(
15868       FormatStyle::LK_ObjC,
15869       guessLanguage("foo.h",
15870                     "#define MY_POINT_MAKE(x, y) CGPointMake((x), (y));\n"));
15871   EXPECT_EQ(
15872       FormatStyle::LK_Cpp,
15873       guessLanguage("foo.h", "#define FOO(...) auto bar = [] __VA_ARGS__;"));
15874 }
15875 
15876 TEST_F(FormatTest, GuessLanguageWithCpp11AttributeSpecifiers) {
15877   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[noreturn]];"));
15878   EXPECT_EQ(FormatStyle::LK_ObjC,
15879             guessLanguage("foo.h", "array[[calculator getIndex]];"));
15880   EXPECT_EQ(FormatStyle::LK_Cpp,
15881             guessLanguage("foo.h", "[[noreturn, deprecated(\"so sorry\")]];"));
15882   EXPECT_EQ(
15883       FormatStyle::LK_Cpp,
15884       guessLanguage("foo.h", "[[noreturn, deprecated(\"gone, sorry\")]];"));
15885   EXPECT_EQ(FormatStyle::LK_ObjC,
15886             guessLanguage("foo.h", "[[noreturn foo] bar];"));
15887   EXPECT_EQ(FormatStyle::LK_Cpp,
15888             guessLanguage("foo.h", "[[clang::fallthrough]];"));
15889   EXPECT_EQ(FormatStyle::LK_ObjC,
15890             guessLanguage("foo.h", "[[clang:fallthrough] foo];"));
15891   EXPECT_EQ(FormatStyle::LK_Cpp,
15892             guessLanguage("foo.h", "[[gsl::suppress(\"type\")]];"));
15893   EXPECT_EQ(FormatStyle::LK_Cpp,
15894             guessLanguage("foo.h", "[[using clang: fallthrough]];"));
15895   EXPECT_EQ(FormatStyle::LK_ObjC,
15896             guessLanguage("foo.h", "[[abusing clang:fallthrough] bar];"));
15897   EXPECT_EQ(FormatStyle::LK_Cpp,
15898             guessLanguage("foo.h", "[[using gsl: suppress(\"type\")]];"));
15899   EXPECT_EQ(
15900       FormatStyle::LK_Cpp,
15901       guessLanguage("foo.h", "for (auto &&[endpoint, stream] : streams_)"));
15902   EXPECT_EQ(
15903       FormatStyle::LK_Cpp,
15904       guessLanguage("foo.h",
15905                     "[[clang::callable_when(\"unconsumed\", \"unknown\")]]"));
15906   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[foo::bar, ...]]"));
15907 }
15908 
15909 TEST_F(FormatTest, GuessLanguageWithCaret) {
15910   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^);"));
15911   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^, Bar);"));
15912   EXPECT_EQ(FormatStyle::LK_ObjC,
15913             guessLanguage("foo.h", "int(^)(char, float);"));
15914   EXPECT_EQ(FormatStyle::LK_ObjC,
15915             guessLanguage("foo.h", "int(^foo)(char, float);"));
15916   EXPECT_EQ(FormatStyle::LK_ObjC,
15917             guessLanguage("foo.h", "int(^foo[10])(char, float);"));
15918   EXPECT_EQ(FormatStyle::LK_ObjC,
15919             guessLanguage("foo.h", "int(^foo[kNumEntries])(char, float);"));
15920   EXPECT_EQ(
15921       FormatStyle::LK_ObjC,
15922       guessLanguage("foo.h", "int(^foo[(kNumEntries + 10)])(char, float);"));
15923 }
15924 
15925 TEST_F(FormatTest, FormatsInlineAsmSymbolicNames) {
15926   // ASM symbolic names are identifiers that must be surrounded by [] without
15927   // space in between:
15928   // https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html#InputOperands
15929 
15930   // Example from https://bugs.llvm.org/show_bug.cgi?id=45108.
15931   verifyFormat(R"(//
15932 asm volatile("mrs %x[result], FPCR" : [result] "=r"(result));
15933 )");
15934 
15935   // A list of several ASM symbolic names.
15936   verifyFormat(R"(asm("mov %[e], %[d]" : [d] "=rm"(d), [e] "rm"(*e));)");
15937 
15938   // ASM symbolic names in inline ASM with inputs and outputs.
15939   verifyFormat(R"(//
15940 asm("cmoveq %1, %2, %[result]"
15941     : [result] "=r"(result)
15942     : "r"(test), "r"(new), "[result]"(old));
15943 )");
15944 
15945   // ASM symbolic names in inline ASM with no outputs.
15946   verifyFormat(R"(asm("mov %[e], %[d]" : : [d] "=rm"(d), [e] "rm"(*e));)");
15947 }
15948 
15949 TEST_F(FormatTest, GuessedLanguageWithInlineAsmClobbers) {
15950   EXPECT_EQ(FormatStyle::LK_Cpp,
15951             guessLanguage("foo.h", "void f() {\n"
15952                                    "  asm (\"mov %[e], %[d]\"\n"
15953                                    "     : [d] \"=rm\" (d)\n"
15954                                    "       [e] \"rm\" (*e));\n"
15955                                    "}"));
15956   EXPECT_EQ(FormatStyle::LK_Cpp,
15957             guessLanguage("foo.h", "void f() {\n"
15958                                    "  _asm (\"mov %[e], %[d]\"\n"
15959                                    "     : [d] \"=rm\" (d)\n"
15960                                    "       [e] \"rm\" (*e));\n"
15961                                    "}"));
15962   EXPECT_EQ(FormatStyle::LK_Cpp,
15963             guessLanguage("foo.h", "void f() {\n"
15964                                    "  __asm (\"mov %[e], %[d]\"\n"
15965                                    "     : [d] \"=rm\" (d)\n"
15966                                    "       [e] \"rm\" (*e));\n"
15967                                    "}"));
15968   EXPECT_EQ(FormatStyle::LK_Cpp,
15969             guessLanguage("foo.h", "void f() {\n"
15970                                    "  __asm__ (\"mov %[e], %[d]\"\n"
15971                                    "     : [d] \"=rm\" (d)\n"
15972                                    "       [e] \"rm\" (*e));\n"
15973                                    "}"));
15974   EXPECT_EQ(FormatStyle::LK_Cpp,
15975             guessLanguage("foo.h", "void f() {\n"
15976                                    "  asm (\"mov %[e], %[d]\"\n"
15977                                    "     : [d] \"=rm\" (d),\n"
15978                                    "       [e] \"rm\" (*e));\n"
15979                                    "}"));
15980   EXPECT_EQ(FormatStyle::LK_Cpp,
15981             guessLanguage("foo.h", "void f() {\n"
15982                                    "  asm volatile (\"mov %[e], %[d]\"\n"
15983                                    "     : [d] \"=rm\" (d)\n"
15984                                    "       [e] \"rm\" (*e));\n"
15985                                    "}"));
15986 }
15987 
15988 TEST_F(FormatTest, GuessLanguageWithChildLines) {
15989   EXPECT_EQ(FormatStyle::LK_Cpp,
15990             guessLanguage("foo.h", "#define FOO ({ std::string s; })"));
15991   EXPECT_EQ(FormatStyle::LK_ObjC,
15992             guessLanguage("foo.h", "#define FOO ({ NSString *s; })"));
15993   EXPECT_EQ(
15994       FormatStyle::LK_Cpp,
15995       guessLanguage("foo.h", "#define FOO ({ foo(); ({ std::string s; }) })"));
15996   EXPECT_EQ(
15997       FormatStyle::LK_ObjC,
15998       guessLanguage("foo.h", "#define FOO ({ foo(); ({ NSString *s; }) })"));
15999 }
16000 
16001 TEST_F(FormatTest, TypenameMacros) {
16002   std::vector<std::string> TypenameMacros = {"STACK_OF", "LIST", "TAILQ_ENTRY"};
16003 
16004   // Test case reported in https://bugs.llvm.org/show_bug.cgi?id=30353
16005   FormatStyle Google = getGoogleStyleWithColumns(0);
16006   Google.TypenameMacros = TypenameMacros;
16007   verifyFormat("struct foo {\n"
16008                "  int bar;\n"
16009                "  TAILQ_ENTRY(a) bleh;\n"
16010                "};",
16011                Google);
16012 
16013   FormatStyle Macros = getLLVMStyle();
16014   Macros.TypenameMacros = TypenameMacros;
16015 
16016   verifyFormat("STACK_OF(int) a;", Macros);
16017   verifyFormat("STACK_OF(int) *a;", Macros);
16018   verifyFormat("STACK_OF(int const *) *a;", Macros);
16019   verifyFormat("STACK_OF(int *const) *a;", Macros);
16020   verifyFormat("STACK_OF(int, string) a;", Macros);
16021   verifyFormat("STACK_OF(LIST(int)) a;", Macros);
16022   verifyFormat("STACK_OF(LIST(int)) a, b;", Macros);
16023   verifyFormat("for (LIST(int) *a = NULL; a;) {\n}", Macros);
16024   verifyFormat("STACK_OF(int) f(LIST(int) *arg);", Macros);
16025 
16026   Macros.PointerAlignment = FormatStyle::PAS_Left;
16027   verifyFormat("STACK_OF(int)* a;", Macros);
16028   verifyFormat("STACK_OF(int*)* a;", Macros);
16029 }
16030 
16031 TEST_F(FormatTest, AmbersandInLamda) {
16032   // Test case reported in https://bugs.llvm.org/show_bug.cgi?id=41899
16033   FormatStyle AlignStyle = getLLVMStyle();
16034   AlignStyle.PointerAlignment = FormatStyle::PAS_Left;
16035   verifyFormat("auto lambda = [&a = a]() { a = 2; };", AlignStyle);
16036   AlignStyle.PointerAlignment = FormatStyle::PAS_Right;
16037   verifyFormat("auto lambda = [&a = a]() { a = 2; };", AlignStyle);
16038 }
16039 
16040 TEST_F(FormatTest, SpacesInConditionalStatement) {
16041   FormatStyle Spaces = getLLVMStyle();
16042   Spaces.SpacesInConditionalStatement = true;
16043   verifyFormat("for ( int i = 0; i; i++ )\n  continue;", Spaces);
16044   verifyFormat("if ( !a )\n  return;", Spaces);
16045   verifyFormat("if ( a )\n  return;", Spaces);
16046   verifyFormat("if constexpr ( a )\n  return;", Spaces);
16047   verifyFormat("switch ( a )\ncase 1:\n  return;", Spaces);
16048   verifyFormat("while ( a )\n  return;", Spaces);
16049   verifyFormat("while ( (a && b) )\n  return;", Spaces);
16050   verifyFormat("do {\n} while ( 1 != 0 );", Spaces);
16051   verifyFormat("try {\n} catch ( const std::exception & ) {\n}", Spaces);
16052   // Check that space on the left of "::" is inserted as expected at beginning
16053   // of condition.
16054   verifyFormat("while ( ::func() )\n  return;", Spaces);
16055 }
16056 
16057 TEST_F(FormatTest, AlternativeOperators) {
16058   // Test case for ensuring alternate operators are not
16059   // combined with their right most neighbour.
16060   verifyFormat("int a and b;");
16061   verifyFormat("int a and_eq b;");
16062   verifyFormat("int a bitand b;");
16063   verifyFormat("int a bitor b;");
16064   verifyFormat("int a compl b;");
16065   verifyFormat("int a not b;");
16066   verifyFormat("int a not_eq b;");
16067   verifyFormat("int a or b;");
16068   verifyFormat("int a xor b;");
16069   verifyFormat("int a xor_eq b;");
16070   verifyFormat("return this not_eq bitand other;");
16071   verifyFormat("bool operator not_eq(const X bitand other)");
16072 
16073   verifyFormat("int a and 5;");
16074   verifyFormat("int a and_eq 5;");
16075   verifyFormat("int a bitand 5;");
16076   verifyFormat("int a bitor 5;");
16077   verifyFormat("int a compl 5;");
16078   verifyFormat("int a not 5;");
16079   verifyFormat("int a not_eq 5;");
16080   verifyFormat("int a or 5;");
16081   verifyFormat("int a xor 5;");
16082   verifyFormat("int a xor_eq 5;");
16083 
16084   verifyFormat("int a compl(5);");
16085   verifyFormat("int a not(5);");
16086 
16087   /* FIXME handle alternate tokens
16088    * https://en.cppreference.com/w/cpp/language/operator_alternative
16089   // alternative tokens
16090   verifyFormat("compl foo();");     //  ~foo();
16091   verifyFormat("foo() <%%>;");      // foo();
16092   verifyFormat("void foo() <%%>;"); // void foo(){}
16093   verifyFormat("int a <:1:>;");     // int a[1];[
16094   verifyFormat("%:define ABC abc"); // #define ABC abc
16095   verifyFormat("%:%:");             // ##
16096   */
16097 }
16098 
16099 TEST_F(FormatTest, STLWhileNotDefineChed) {
16100   verifyFormat("#if defined(while)\n"
16101                "#define while EMIT WARNING C4005\n"
16102                "#endif // while");
16103 }
16104 
16105 TEST_F(FormatTest, OperatorSpacing) {
16106   FormatStyle Style = getLLVMStyle();
16107   Style.PointerAlignment = FormatStyle::PAS_Right;
16108   verifyFormat("Foo::operator*();", Style);
16109   verifyFormat("Foo::operator void *();", Style);
16110   verifyFormat("Foo::operator void **();", Style);
16111   verifyFormat("Foo::operator void *&();", Style);
16112   verifyFormat("Foo::operator void *&&();", Style);
16113   verifyFormat("Foo::operator()(void *);", Style);
16114   verifyFormat("Foo::operator*(void *);", Style);
16115   verifyFormat("Foo::operator*();", Style);
16116   verifyFormat("Foo::operator**();", Style);
16117   verifyFormat("Foo::operator&();", Style);
16118   verifyFormat("Foo::operator<int> *();", Style);
16119   verifyFormat("Foo::operator<Foo> *();", Style);
16120   verifyFormat("Foo::operator<int> **();", Style);
16121   verifyFormat("Foo::operator<Foo> **();", Style);
16122   verifyFormat("Foo::operator<int> &();", Style);
16123   verifyFormat("Foo::operator<Foo> &();", Style);
16124   verifyFormat("Foo::operator<int> &&();", Style);
16125   verifyFormat("Foo::operator<Foo> &&();", Style);
16126   verifyFormat("Foo::operator<int> *&();", Style);
16127   verifyFormat("Foo::operator<Foo> *&();", Style);
16128   verifyFormat("Foo::operator<int> *&&();", Style);
16129   verifyFormat("Foo::operator<Foo> *&&();", Style);
16130   verifyFormat("operator*(int (*)(), class Foo);", Style);
16131 
16132   verifyFormat("Foo::operator&();", Style);
16133   verifyFormat("Foo::operator void &();", Style);
16134   verifyFormat("Foo::operator()(void &);", Style);
16135   verifyFormat("Foo::operator&(void &);", Style);
16136   verifyFormat("Foo::operator&();", Style);
16137   verifyFormat("operator&(int (&)(), class Foo);", Style);
16138 
16139   verifyFormat("Foo::operator&&();", Style);
16140   verifyFormat("Foo::operator**();", Style);
16141   verifyFormat("Foo::operator void &&();", Style);
16142   verifyFormat("Foo::operator()(void &&);", Style);
16143   verifyFormat("Foo::operator&&(void &&);", Style);
16144   verifyFormat("Foo::operator&&();", Style);
16145   verifyFormat("operator&&(int(&&)(), class Foo);", Style);
16146   verifyFormat("operator const nsTArrayRight<E> &()", Style);
16147   verifyFormat("[[nodiscard]] operator const nsTArrayRight<E, Allocator> &()",
16148                Style);
16149   verifyFormat("operator void **()", Style);
16150   verifyFormat("operator const FooRight<Object> &()", Style);
16151   verifyFormat("operator const FooRight<Object> *()", Style);
16152   verifyFormat("operator const FooRight<Object> **()", Style);
16153   verifyFormat("operator const FooRight<Object> *&()", Style);
16154   verifyFormat("operator const FooRight<Object> *&&()", Style);
16155 
16156   Style.PointerAlignment = FormatStyle::PAS_Left;
16157   verifyFormat("Foo::operator*();", Style);
16158   verifyFormat("Foo::operator**();", Style);
16159   verifyFormat("Foo::operator void*();", Style);
16160   verifyFormat("Foo::operator void**();", Style);
16161   verifyFormat("Foo::operator void*&();", Style);
16162   verifyFormat("Foo::operator/*comment*/ void*();", Style);
16163   verifyFormat("Foo::operator/*a*/ const /*b*/ void*();", Style);
16164   verifyFormat("Foo::operator/*a*/ volatile /*b*/ void*();", Style);
16165   verifyFormat("Foo::operator()(void*);", Style);
16166   verifyFormat("Foo::operator*(void*);", Style);
16167   verifyFormat("Foo::operator*();", Style);
16168   verifyFormat("Foo::operator<int>*();", Style);
16169   verifyFormat("Foo::operator<Foo>*();", Style);
16170   verifyFormat("Foo::operator<int>**();", Style);
16171   verifyFormat("Foo::operator<Foo>**();", Style);
16172   verifyFormat("Foo::operator<Foo>*&();", Style);
16173   verifyFormat("Foo::operator<int>&();", Style);
16174   verifyFormat("Foo::operator<Foo>&();", Style);
16175   verifyFormat("Foo::operator<int>&&();", Style);
16176   verifyFormat("Foo::operator<Foo>&&();", Style);
16177   verifyFormat("Foo::operator<int>*&();", Style);
16178   verifyFormat("Foo::operator<Foo>*&();", Style);
16179   verifyFormat("operator*(int (*)(), class Foo);", Style);
16180 
16181   verifyFormat("Foo::operator&();", Style);
16182   verifyFormat("Foo::operator void&();", Style);
16183   verifyFormat("Foo::operator/*comment*/ void&();", Style);
16184   verifyFormat("Foo::operator/*a*/ const /*b*/ void&();", Style);
16185   verifyFormat("Foo::operator/*a*/ volatile /*b*/ void&();", Style);
16186   verifyFormat("Foo::operator()(void&);", Style);
16187   verifyFormat("Foo::operator&(void&);", Style);
16188   verifyFormat("Foo::operator&();", Style);
16189   verifyFormat("operator&(int (&)(), class Foo);", Style);
16190 
16191   verifyFormat("Foo::operator&&();", Style);
16192   verifyFormat("Foo::operator void&&();", Style);
16193   verifyFormat("Foo::operator/*comment*/ void&&();", Style);
16194   verifyFormat("Foo::operator/*a*/ const /*b*/ void&&();", Style);
16195   verifyFormat("Foo::operator/*a*/ volatile /*b*/ void&&();", Style);
16196   verifyFormat("Foo::operator()(void&&);", Style);
16197   verifyFormat("Foo::operator&&(void&&);", Style);
16198   verifyFormat("Foo::operator&&();", Style);
16199   verifyFormat("operator&&(int(&&)(), class Foo);", Style);
16200   verifyFormat("operator const nsTArrayLeft<E>&()", Style);
16201   verifyFormat("[[nodiscard]] operator const nsTArrayLeft<E, Allocator>&()",
16202                Style);
16203   verifyFormat("operator void**()", Style);
16204   verifyFormat("operator const FooLeft<Object>&()", Style);
16205   verifyFormat("operator const FooLeft<Object>*()", Style);
16206   verifyFormat("operator const FooLeft<Object>**()", Style);
16207   verifyFormat("operator const FooLeft<Object>*&()", Style);
16208   verifyFormat("operator const FooLeft<Object>*&&()", Style);
16209 
16210   // PR45107
16211   verifyFormat("operator Vector<String>&();", Style);
16212   verifyFormat("operator const Vector<String>&();", Style);
16213   verifyFormat("operator foo::Bar*();", Style);
16214   verifyFormat("operator const Foo<X>::Bar<Y>*();", Style);
16215   verifyFormat("operator/*a*/ const /*b*/ Foo /*c*/<X> /*d*/ ::Bar<Y>*();",
16216                Style);
16217 
16218   Style.PointerAlignment = FormatStyle::PAS_Middle;
16219   verifyFormat("Foo::operator*();", Style);
16220   verifyFormat("Foo::operator void *();", Style);
16221   verifyFormat("Foo::operator()(void *);", Style);
16222   verifyFormat("Foo::operator*(void *);", Style);
16223   verifyFormat("Foo::operator*();", Style);
16224   verifyFormat("operator*(int (*)(), class Foo);", Style);
16225 
16226   verifyFormat("Foo::operator&();", Style);
16227   verifyFormat("Foo::operator void &();", Style);
16228   verifyFormat("Foo::operator()(void &);", Style);
16229   verifyFormat("Foo::operator&(void &);", Style);
16230   verifyFormat("Foo::operator&();", Style);
16231   verifyFormat("operator&(int (&)(), class Foo);", Style);
16232 
16233   verifyFormat("Foo::operator&&();", Style);
16234   verifyFormat("Foo::operator void &&();", Style);
16235   verifyFormat("Foo::operator()(void &&);", Style);
16236   verifyFormat("Foo::operator&&(void &&);", Style);
16237   verifyFormat("Foo::operator&&();", Style);
16238   verifyFormat("operator&&(int(&&)(), class Foo);", Style);
16239 }
16240 
16241 TEST_F(FormatTest, VeryLongNamespaceCommentSplit) {
16242   // These tests are not in NamespaceFixer because that doesn't
16243   // test its interaction with line wrapping
16244   FormatStyle Style = getLLVMStyle();
16245   Style.ColumnLimit = 80;
16246   verifyFormat("namespace {\n"
16247                "int i;\n"
16248                "int j;\n"
16249                "} // namespace",
16250                Style);
16251 
16252   verifyFormat("namespace AAA {\n"
16253                "int i;\n"
16254                "int j;\n"
16255                "} // namespace AAA",
16256                Style);
16257 
16258   EXPECT_EQ("namespace Averyveryveryverylongnamespace {\n"
16259             "int i;\n"
16260             "int j;\n"
16261             "} // namespace Averyveryveryverylongnamespace",
16262             format("namespace Averyveryveryverylongnamespace {\n"
16263                    "int i;\n"
16264                    "int j;\n"
16265                    "}",
16266                    Style));
16267 
16268   EXPECT_EQ(
16269       "namespace "
16270       "would::it::save::you::a::lot::of::time::if_::i::just::gave::up::and_::\n"
16271       "    went::mad::now {\n"
16272       "int i;\n"
16273       "int j;\n"
16274       "} // namespace\n"
16275       "  // "
16276       "would::it::save::you::a::lot::of::time::if_::i::just::gave::up::and_::"
16277       "went::mad::now",
16278       format("namespace "
16279              "would::it::save::you::a::lot::of::time::if_::i::"
16280              "just::gave::up::and_::went::mad::now {\n"
16281              "int i;\n"
16282              "int j;\n"
16283              "}",
16284              Style));
16285 
16286   // This used to duplicate the comment again and again on subsequent runs
16287   EXPECT_EQ(
16288       "namespace "
16289       "would::it::save::you::a::lot::of::time::if_::i::just::gave::up::and_::\n"
16290       "    went::mad::now {\n"
16291       "int i;\n"
16292       "int j;\n"
16293       "} // namespace\n"
16294       "  // "
16295       "would::it::save::you::a::lot::of::time::if_::i::just::gave::up::and_::"
16296       "went::mad::now",
16297       format("namespace "
16298              "would::it::save::you::a::lot::of::time::if_::i::"
16299              "just::gave::up::and_::went::mad::now {\n"
16300              "int i;\n"
16301              "int j;\n"
16302              "} // namespace\n"
16303              "  // "
16304              "would::it::save::you::a::lot::of::time::if_::i::just::gave::up::"
16305              "and_::went::mad::now",
16306              Style));
16307 }
16308 
16309 } // namespace
16310 } // namespace format
16311 } // namespace clang
16312