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   // As function-like macros.
976   verifyFormat("#define foreach(x, y)\n"
977                "#define Q_FOREACH(x, y)\n"
978                "#define BOOST_FOREACH(x, y)\n"
979                "#define UNKNOWN_FOREACH(x, y)\n");
980 
981   // Not as function-like macros.
982   verifyFormat("#define foreach (x, y)\n"
983                "#define Q_FOREACH (x, y)\n"
984                "#define BOOST_FOREACH (x, y)\n"
985                "#define UNKNOWN_FOREACH (x, y)\n");
986 }
987 
988 TEST_F(FormatTest, FormatsWhileLoop) {
989   verifyFormat("while (true) {\n}");
990   verifyFormat("while (true)\n"
991                "  f();");
992   verifyFormat("while () {\n}");
993   verifyFormat("while () {\n"
994                "  f();\n"
995                "}");
996 }
997 
998 TEST_F(FormatTest, FormatsDoWhile) {
999   verifyFormat("do {\n"
1000                "  do_something();\n"
1001                "} while (something());");
1002   verifyFormat("do\n"
1003                "  do_something();\n"
1004                "while (something());");
1005 }
1006 
1007 TEST_F(FormatTest, FormatsSwitchStatement) {
1008   verifyFormat("switch (x) {\n"
1009                "case 1:\n"
1010                "  f();\n"
1011                "  break;\n"
1012                "case kFoo:\n"
1013                "case ns::kBar:\n"
1014                "case kBaz:\n"
1015                "  break;\n"
1016                "default:\n"
1017                "  g();\n"
1018                "  break;\n"
1019                "}");
1020   verifyFormat("switch (x) {\n"
1021                "case 1: {\n"
1022                "  f();\n"
1023                "  break;\n"
1024                "}\n"
1025                "case 2: {\n"
1026                "  break;\n"
1027                "}\n"
1028                "}");
1029   verifyFormat("switch (x) {\n"
1030                "case 1: {\n"
1031                "  f();\n"
1032                "  {\n"
1033                "    g();\n"
1034                "    h();\n"
1035                "  }\n"
1036                "  break;\n"
1037                "}\n"
1038                "}");
1039   verifyFormat("switch (x) {\n"
1040                "case 1: {\n"
1041                "  f();\n"
1042                "  if (foo) {\n"
1043                "    g();\n"
1044                "    h();\n"
1045                "  }\n"
1046                "  break;\n"
1047                "}\n"
1048                "}");
1049   verifyFormat("switch (x) {\n"
1050                "case 1: {\n"
1051                "  f();\n"
1052                "  g();\n"
1053                "} break;\n"
1054                "}");
1055   verifyFormat("switch (test)\n"
1056                "  ;");
1057   verifyFormat("switch (x) {\n"
1058                "default: {\n"
1059                "  // Do nothing.\n"
1060                "}\n"
1061                "}");
1062   verifyFormat("switch (x) {\n"
1063                "// comment\n"
1064                "// if 1, do f()\n"
1065                "case 1:\n"
1066                "  f();\n"
1067                "}");
1068   verifyFormat("switch (x) {\n"
1069                "case 1:\n"
1070                "  // Do amazing stuff\n"
1071                "  {\n"
1072                "    f();\n"
1073                "    g();\n"
1074                "  }\n"
1075                "  break;\n"
1076                "}");
1077   verifyFormat("#define A          \\\n"
1078                "  switch (x) {     \\\n"
1079                "  case a:          \\\n"
1080                "    foo = b;       \\\n"
1081                "  }",
1082                getLLVMStyleWithColumns(20));
1083   verifyFormat("#define OPERATION_CASE(name)           \\\n"
1084                "  case OP_name:                        \\\n"
1085                "    return operations::Operation##name\n",
1086                getLLVMStyleWithColumns(40));
1087   verifyFormat("switch (x) {\n"
1088                "case 1:;\n"
1089                "default:;\n"
1090                "  int i;\n"
1091                "}");
1092 
1093   verifyGoogleFormat("switch (x) {\n"
1094                      "  case 1:\n"
1095                      "    f();\n"
1096                      "    break;\n"
1097                      "  case kFoo:\n"
1098                      "  case ns::kBar:\n"
1099                      "  case kBaz:\n"
1100                      "    break;\n"
1101                      "  default:\n"
1102                      "    g();\n"
1103                      "    break;\n"
1104                      "}");
1105   verifyGoogleFormat("switch (x) {\n"
1106                      "  case 1: {\n"
1107                      "    f();\n"
1108                      "    break;\n"
1109                      "  }\n"
1110                      "}");
1111   verifyGoogleFormat("switch (test)\n"
1112                      "  ;");
1113 
1114   verifyGoogleFormat("#define OPERATION_CASE(name) \\\n"
1115                      "  case OP_name:              \\\n"
1116                      "    return operations::Operation##name\n");
1117   verifyGoogleFormat("Operation codeToOperation(OperationCode OpCode) {\n"
1118                      "  // Get the correction operation class.\n"
1119                      "  switch (OpCode) {\n"
1120                      "    CASE(Add);\n"
1121                      "    CASE(Subtract);\n"
1122                      "    default:\n"
1123                      "      return operations::Unknown;\n"
1124                      "  }\n"
1125                      "#undef OPERATION_CASE\n"
1126                      "}");
1127   verifyFormat("DEBUG({\n"
1128                "  switch (x) {\n"
1129                "  case A:\n"
1130                "    f();\n"
1131                "    break;\n"
1132                "    // fallthrough\n"
1133                "  case B:\n"
1134                "    g();\n"
1135                "    break;\n"
1136                "  }\n"
1137                "});");
1138   EXPECT_EQ("DEBUG({\n"
1139             "  switch (x) {\n"
1140             "  case A:\n"
1141             "    f();\n"
1142             "    break;\n"
1143             "  // On B:\n"
1144             "  case B:\n"
1145             "    g();\n"
1146             "    break;\n"
1147             "  }\n"
1148             "});",
1149             format("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                    getLLVMStyle()));
1161   EXPECT_EQ("switch (n) {\n"
1162             "case 0: {\n"
1163             "  return false;\n"
1164             "}\n"
1165             "default: {\n"
1166             "  return true;\n"
1167             "}\n"
1168             "}",
1169             format("switch (n)\n"
1170                    "{\n"
1171                    "case 0: {\n"
1172                    "  return false;\n"
1173                    "}\n"
1174                    "default: {\n"
1175                    "  return true;\n"
1176                    "}\n"
1177                    "}",
1178                    getLLVMStyle()));
1179   verifyFormat("switch (a) {\n"
1180                "case (b):\n"
1181                "  return;\n"
1182                "}");
1183 
1184   verifyFormat("switch (a) {\n"
1185                "case some_namespace::\n"
1186                "    some_constant:\n"
1187                "  return;\n"
1188                "}",
1189                getLLVMStyleWithColumns(34));
1190 
1191   FormatStyle Style = getLLVMStyle();
1192   Style.IndentCaseLabels = true;
1193   Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Never;
1194   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1195   Style.BraceWrapping.AfterCaseLabel = true;
1196   Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Always;
1197   EXPECT_EQ("switch (n)\n"
1198             "{\n"
1199             "  case 0:\n"
1200             "  {\n"
1201             "    return false;\n"
1202             "  }\n"
1203             "  default:\n"
1204             "  {\n"
1205             "    return true;\n"
1206             "  }\n"
1207             "}",
1208             format("switch (n) {\n"
1209                    "  case 0: {\n"
1210                    "    return false;\n"
1211                    "  }\n"
1212                    "  default: {\n"
1213                    "    return true;\n"
1214                    "  }\n"
1215                    "}",
1216                    Style));
1217   Style.BraceWrapping.AfterCaseLabel = false;
1218   EXPECT_EQ("switch (n)\n"
1219             "{\n"
1220             "  case 0: {\n"
1221             "    return false;\n"
1222             "  }\n"
1223             "  default: {\n"
1224             "    return true;\n"
1225             "  }\n"
1226             "}",
1227             format("switch (n) {\n"
1228                    "  case 0:\n"
1229                    "  {\n"
1230                    "    return false;\n"
1231                    "  }\n"
1232                    "  default:\n"
1233                    "  {\n"
1234                    "    return true;\n"
1235                    "  }\n"
1236                    "}",
1237                    Style));
1238   Style.IndentCaseLabels = false;
1239   Style.IndentCaseBlocks = true;
1240   EXPECT_EQ("switch (n)\n"
1241             "{\n"
1242             "case 0:\n"
1243             "  {\n"
1244             "    return false;\n"
1245             "  }\n"
1246             "case 1:\n"
1247             "  break;\n"
1248             "default:\n"
1249             "  {\n"
1250             "    return true;\n"
1251             "  }\n"
1252             "}",
1253             format("switch (n) {\n"
1254                    "case 0: {\n"
1255                    "  return false;\n"
1256                    "}\n"
1257                    "case 1:\n"
1258                    "  break;\n"
1259                    "default: {\n"
1260                    "  return true;\n"
1261                    "}\n"
1262                    "}",
1263                    Style));
1264   Style.IndentCaseLabels = true;
1265   Style.IndentCaseBlocks = true;
1266   EXPECT_EQ("switch (n)\n"
1267             "{\n"
1268             "  case 0:\n"
1269             "    {\n"
1270             "      return false;\n"
1271             "    }\n"
1272             "  case 1:\n"
1273             "    break;\n"
1274             "  default:\n"
1275             "    {\n"
1276             "      return true;\n"
1277             "    }\n"
1278             "}",
1279             format("switch (n) {\n"
1280                    "case 0: {\n"
1281                    "  return false;\n"
1282                    "}\n"
1283                    "case 1:\n"
1284                    "  break;\n"
1285                    "default: {\n"
1286                    "  return true;\n"
1287                    "}\n"
1288                    "}",
1289                    Style));
1290 }
1291 
1292 TEST_F(FormatTest, CaseRanges) {
1293   verifyFormat("switch (x) {\n"
1294                "case 'A' ... 'Z':\n"
1295                "case 1 ... 5:\n"
1296                "case a ... b:\n"
1297                "  break;\n"
1298                "}");
1299 }
1300 
1301 TEST_F(FormatTest, ShortEnums) {
1302   FormatStyle Style = getLLVMStyle();
1303   Style.AllowShortEnumsOnASingleLine = true;
1304   verifyFormat("enum { A, B, C } ShortEnum1, ShortEnum2;", Style);
1305   Style.AllowShortEnumsOnASingleLine = false;
1306   verifyFormat("enum\n"
1307                "{\n"
1308                "  A,\n"
1309                "  B,\n"
1310                "  C\n"
1311                "} ShortEnum1, ShortEnum2;",
1312                Style);
1313 }
1314 
1315 TEST_F(FormatTest, ShortCaseLabels) {
1316   FormatStyle Style = getLLVMStyle();
1317   Style.AllowShortCaseLabelsOnASingleLine = true;
1318   verifyFormat("switch (a) {\n"
1319                "case 1: x = 1; break;\n"
1320                "case 2: return;\n"
1321                "case 3:\n"
1322                "case 4:\n"
1323                "case 5: return;\n"
1324                "case 6: // comment\n"
1325                "  return;\n"
1326                "case 7:\n"
1327                "  // comment\n"
1328                "  return;\n"
1329                "case 8:\n"
1330                "  x = 8; // comment\n"
1331                "  break;\n"
1332                "default: y = 1; break;\n"
1333                "}",
1334                Style);
1335   verifyFormat("switch (a) {\n"
1336                "case 0: return; // comment\n"
1337                "case 1: break;  // comment\n"
1338                "case 2: return;\n"
1339                "// comment\n"
1340                "case 3: return;\n"
1341                "// comment 1\n"
1342                "// comment 2\n"
1343                "// comment 3\n"
1344                "case 4: break; /* comment */\n"
1345                "case 5:\n"
1346                "  // comment\n"
1347                "  break;\n"
1348                "case 6: /* comment */ x = 1; break;\n"
1349                "case 7: x = /* comment */ 1; break;\n"
1350                "case 8:\n"
1351                "  x = 1; /* comment */\n"
1352                "  break;\n"
1353                "case 9:\n"
1354                "  break; // comment line 1\n"
1355                "         // comment line 2\n"
1356                "}",
1357                Style);
1358   EXPECT_EQ("switch (a) {\n"
1359             "case 1:\n"
1360             "  x = 8;\n"
1361             "  // fall through\n"
1362             "case 2: x = 8;\n"
1363             "// comment\n"
1364             "case 3:\n"
1365             "  return; /* comment line 1\n"
1366             "           * comment line 2 */\n"
1367             "case 4: i = 8;\n"
1368             "// something else\n"
1369             "#if FOO\n"
1370             "case 5: break;\n"
1371             "#endif\n"
1372             "}",
1373             format("switch (a) {\n"
1374                    "case 1: x = 8;\n"
1375                    "  // fall through\n"
1376                    "case 2:\n"
1377                    "  x = 8;\n"
1378                    "// comment\n"
1379                    "case 3:\n"
1380                    "  return; /* comment line 1\n"
1381                    "           * comment line 2 */\n"
1382                    "case 4:\n"
1383                    "  i = 8;\n"
1384                    "// something else\n"
1385                    "#if FOO\n"
1386                    "case 5: break;\n"
1387                    "#endif\n"
1388                    "}",
1389                    Style));
1390   EXPECT_EQ("switch (a) {\n"
1391             "case 0:\n"
1392             "  return; // long long long long long long long long long long "
1393             "long long comment\n"
1394             "          // line\n"
1395             "}",
1396             format("switch (a) {\n"
1397                    "case 0: return; // long long long long long long long long "
1398                    "long long long long comment line\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   verifyFormat("switch (a) {\n"
1413                "#if FOO\n"
1414                "case 0: return 0;\n"
1415                "#endif\n"
1416                "}",
1417                Style);
1418   verifyFormat("switch (a) {\n"
1419                "case 1: {\n"
1420                "}\n"
1421                "case 2: {\n"
1422                "  return;\n"
1423                "}\n"
1424                "case 3: {\n"
1425                "  x = 1;\n"
1426                "  return;\n"
1427                "}\n"
1428                "case 4:\n"
1429                "  if (x)\n"
1430                "    return;\n"
1431                "}",
1432                Style);
1433   Style.ColumnLimit = 21;
1434   verifyFormat("switch (a) {\n"
1435                "case 1: x = 1; break;\n"
1436                "case 2: return;\n"
1437                "case 3:\n"
1438                "case 4:\n"
1439                "case 5: return;\n"
1440                "default:\n"
1441                "  y = 1;\n"
1442                "  break;\n"
1443                "}",
1444                Style);
1445   Style.ColumnLimit = 80;
1446   Style.AllowShortCaseLabelsOnASingleLine = false;
1447   Style.IndentCaseLabels = true;
1448   EXPECT_EQ("switch (n) {\n"
1449             "  default /*comments*/:\n"
1450             "    return true;\n"
1451             "  case 0:\n"
1452             "    return false;\n"
1453             "}",
1454             format("switch (n) {\n"
1455                    "default/*comments*/:\n"
1456                    "  return true;\n"
1457                    "case 0:\n"
1458                    "  return false;\n"
1459                    "}",
1460                    Style));
1461   Style.AllowShortCaseLabelsOnASingleLine = true;
1462   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1463   Style.BraceWrapping.AfterCaseLabel = true;
1464   Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Always;
1465   EXPECT_EQ("switch (n)\n"
1466             "{\n"
1467             "  case 0:\n"
1468             "  {\n"
1469             "    return false;\n"
1470             "  }\n"
1471             "  default:\n"
1472             "  {\n"
1473             "    return true;\n"
1474             "  }\n"
1475             "}",
1476             format("switch (n) {\n"
1477                    "  case 0: {\n"
1478                    "    return false;\n"
1479                    "  }\n"
1480                    "  default:\n"
1481                    "  {\n"
1482                    "    return true;\n"
1483                    "  }\n"
1484                    "}",
1485                    Style));
1486 }
1487 
1488 TEST_F(FormatTest, FormatsLabels) {
1489   verifyFormat("void f() {\n"
1490                "  some_code();\n"
1491                "test_label:\n"
1492                "  some_other_code();\n"
1493                "  {\n"
1494                "    some_more_code();\n"
1495                "  another_label:\n"
1496                "    some_more_code();\n"
1497                "  }\n"
1498                "}");
1499   verifyFormat("{\n"
1500                "  some_code();\n"
1501                "test_label:\n"
1502                "  some_other_code();\n"
1503                "}");
1504   verifyFormat("{\n"
1505                "  some_code();\n"
1506                "test_label:;\n"
1507                "  int i = 0;\n"
1508                "}");
1509   FormatStyle Style = getLLVMStyle();
1510   Style.IndentGotoLabels = false;
1511   verifyFormat("void f() {\n"
1512                "  some_code();\n"
1513                "test_label:\n"
1514                "  some_other_code();\n"
1515                "  {\n"
1516                "    some_more_code();\n"
1517                "another_label:\n"
1518                "    some_more_code();\n"
1519                "  }\n"
1520                "}",
1521                Style);
1522   verifyFormat("{\n"
1523                "  some_code();\n"
1524                "test_label:\n"
1525                "  some_other_code();\n"
1526                "}",
1527                Style);
1528   verifyFormat("{\n"
1529                "  some_code();\n"
1530                "test_label:;\n"
1531                "  int i = 0;\n"
1532                "}");
1533 }
1534 
1535 TEST_F(FormatTest, MultiLineControlStatements) {
1536   FormatStyle Style = getLLVMStyle();
1537   Style.BreakBeforeBraces = FormatStyle::BraceBreakingStyle::BS_Custom;
1538   Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_MultiLine;
1539   Style.ColumnLimit = 20;
1540   // Short lines should keep opening brace on same line.
1541   EXPECT_EQ("if (foo) {\n"
1542             "  bar();\n"
1543             "}",
1544             format("if(foo){bar();}", Style));
1545   EXPECT_EQ("if (foo) {\n"
1546             "  bar();\n"
1547             "} else {\n"
1548             "  baz();\n"
1549             "}",
1550             format("if(foo){bar();}else{baz();}", Style));
1551   EXPECT_EQ("if (foo && bar) {\n"
1552             "  baz();\n"
1553             "}",
1554             format("if(foo&&bar){baz();}", Style));
1555   EXPECT_EQ("if (foo) {\n"
1556             "  bar();\n"
1557             "} else if (baz) {\n"
1558             "  quux();\n"
1559             "}",
1560             format("if(foo){bar();}else if(baz){quux();}", Style));
1561   EXPECT_EQ(
1562       "if (foo) {\n"
1563       "  bar();\n"
1564       "} else if (baz) {\n"
1565       "  quux();\n"
1566       "} else {\n"
1567       "  foobar();\n"
1568       "}",
1569       format("if(foo){bar();}else if(baz){quux();}else{foobar();}", Style));
1570   EXPECT_EQ("for (;;) {\n"
1571             "  foo();\n"
1572             "}",
1573             format("for(;;){foo();}"));
1574   EXPECT_EQ("while (1) {\n"
1575             "  foo();\n"
1576             "}",
1577             format("while(1){foo();}", Style));
1578   EXPECT_EQ("switch (foo) {\n"
1579             "case bar:\n"
1580             "  return;\n"
1581             "}",
1582             format("switch(foo){case bar:return;}", Style));
1583   EXPECT_EQ("try {\n"
1584             "  foo();\n"
1585             "} catch (...) {\n"
1586             "  bar();\n"
1587             "}",
1588             format("try{foo();}catch(...){bar();}", Style));
1589   EXPECT_EQ("do {\n"
1590             "  foo();\n"
1591             "} while (bar &&\n"
1592             "         baz);",
1593             format("do{foo();}while(bar&&baz);", Style));
1594   // Long lines should put opening brace on new line.
1595   EXPECT_EQ("if (foo && bar &&\n"
1596             "    baz)\n"
1597             "{\n"
1598             "  quux();\n"
1599             "}",
1600             format("if(foo&&bar&&baz){quux();}", Style));
1601   EXPECT_EQ("if (foo && bar &&\n"
1602             "    baz)\n"
1603             "{\n"
1604             "  quux();\n"
1605             "}",
1606             format("if (foo && bar &&\n"
1607                    "    baz) {\n"
1608                    "  quux();\n"
1609                    "}",
1610                    Style));
1611   EXPECT_EQ("if (foo) {\n"
1612             "  bar();\n"
1613             "} else if (baz ||\n"
1614             "           quux)\n"
1615             "{\n"
1616             "  foobar();\n"
1617             "}",
1618             format("if(foo){bar();}else if(baz||quux){foobar();}", Style));
1619   EXPECT_EQ(
1620       "if (foo) {\n"
1621       "  bar();\n"
1622       "} else if (baz ||\n"
1623       "           quux)\n"
1624       "{\n"
1625       "  foobar();\n"
1626       "} else {\n"
1627       "  barbaz();\n"
1628       "}",
1629       format("if(foo){bar();}else if(baz||quux){foobar();}else{barbaz();}",
1630              Style));
1631   EXPECT_EQ("for (int i = 0;\n"
1632             "     i < 10; ++i)\n"
1633             "{\n"
1634             "  foo();\n"
1635             "}",
1636             format("for(int i=0;i<10;++i){foo();}", Style));
1637   EXPECT_EQ("while (foo || bar ||\n"
1638             "       baz)\n"
1639             "{\n"
1640             "  quux();\n"
1641             "}",
1642             format("while(foo||bar||baz){quux();}", Style));
1643   EXPECT_EQ("switch (\n"
1644             "    foo = barbaz)\n"
1645             "{\n"
1646             "case quux:\n"
1647             "  return;\n"
1648             "}",
1649             format("switch(foo=barbaz){case quux:return;}", Style));
1650   EXPECT_EQ("try {\n"
1651             "  foo();\n"
1652             "} catch (\n"
1653             "    Exception &bar)\n"
1654             "{\n"
1655             "  baz();\n"
1656             "}",
1657             format("try{foo();}catch(Exception&bar){baz();}", Style));
1658   Style.ColumnLimit =
1659       40; // to concentrate at brace wrapping, not line wrap due to column limit
1660   EXPECT_EQ("try {\n"
1661             "  foo();\n"
1662             "} catch (Exception &bar) {\n"
1663             "  baz();\n"
1664             "}",
1665             format("try{foo();}catch(Exception&bar){baz();}", Style));
1666   Style.ColumnLimit =
1667       20; // to concentrate at brace wrapping, not line wrap due to column limit
1668 
1669   Style.BraceWrapping.BeforeElse = true;
1670   EXPECT_EQ(
1671       "if (foo) {\n"
1672       "  bar();\n"
1673       "}\n"
1674       "else if (baz ||\n"
1675       "         quux)\n"
1676       "{\n"
1677       "  foobar();\n"
1678       "}\n"
1679       "else {\n"
1680       "  barbaz();\n"
1681       "}",
1682       format("if(foo){bar();}else if(baz||quux){foobar();}else{barbaz();}",
1683              Style));
1684 
1685   Style.BraceWrapping.BeforeCatch = true;
1686   EXPECT_EQ("try {\n"
1687             "  foo();\n"
1688             "}\n"
1689             "catch (...) {\n"
1690             "  baz();\n"
1691             "}",
1692             format("try{foo();}catch(...){baz();}", Style));
1693 }
1694 
1695 //===----------------------------------------------------------------------===//
1696 // Tests for classes, namespaces, etc.
1697 //===----------------------------------------------------------------------===//
1698 
1699 TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) {
1700   verifyFormat("class A {};");
1701 }
1702 
1703 TEST_F(FormatTest, UnderstandsAccessSpecifiers) {
1704   verifyFormat("class A {\n"
1705                "public:\n"
1706                "public: // comment\n"
1707                "protected:\n"
1708                "private:\n"
1709                "  void f() {}\n"
1710                "};");
1711   verifyFormat("export class A {\n"
1712                "public:\n"
1713                "public: // comment\n"
1714                "protected:\n"
1715                "private:\n"
1716                "  void f() {}\n"
1717                "};");
1718   verifyGoogleFormat("class A {\n"
1719                      " public:\n"
1720                      " protected:\n"
1721                      " private:\n"
1722                      "  void f() {}\n"
1723                      "};");
1724   verifyGoogleFormat("export class A {\n"
1725                      " public:\n"
1726                      " protected:\n"
1727                      " private:\n"
1728                      "  void f() {}\n"
1729                      "};");
1730   verifyFormat("class A {\n"
1731                "public slots:\n"
1732                "  void f1() {}\n"
1733                "public Q_SLOTS:\n"
1734                "  void f2() {}\n"
1735                "protected slots:\n"
1736                "  void f3() {}\n"
1737                "protected Q_SLOTS:\n"
1738                "  void f4() {}\n"
1739                "private slots:\n"
1740                "  void f5() {}\n"
1741                "private Q_SLOTS:\n"
1742                "  void f6() {}\n"
1743                "signals:\n"
1744                "  void g1();\n"
1745                "Q_SIGNALS:\n"
1746                "  void g2();\n"
1747                "};");
1748 
1749   // Don't interpret 'signals' the wrong way.
1750   verifyFormat("signals.set();");
1751   verifyFormat("for (Signals signals : f()) {\n}");
1752   verifyFormat("{\n"
1753                "  signals.set(); // This needs indentation.\n"
1754                "}");
1755   verifyFormat("void f() {\n"
1756                "label:\n"
1757                "  signals.baz();\n"
1758                "}");
1759 }
1760 
1761 TEST_F(FormatTest, SeparatesLogicalBlocks) {
1762   EXPECT_EQ("class A {\n"
1763             "public:\n"
1764             "  void f();\n"
1765             "\n"
1766             "private:\n"
1767             "  void g() {}\n"
1768             "  // test\n"
1769             "protected:\n"
1770             "  int h;\n"
1771             "};",
1772             format("class A {\n"
1773                    "public:\n"
1774                    "void f();\n"
1775                    "private:\n"
1776                    "void g() {}\n"
1777                    "// test\n"
1778                    "protected:\n"
1779                    "int h;\n"
1780                    "};"));
1781   EXPECT_EQ("class A {\n"
1782             "protected:\n"
1783             "public:\n"
1784             "  void f();\n"
1785             "};",
1786             format("class A {\n"
1787                    "protected:\n"
1788                    "\n"
1789                    "public:\n"
1790                    "\n"
1791                    "  void f();\n"
1792                    "};"));
1793 
1794   // Even ensure proper spacing inside macros.
1795   EXPECT_EQ("#define B     \\\n"
1796             "  class A {   \\\n"
1797             "   protected: \\\n"
1798             "   public:    \\\n"
1799             "    void f(); \\\n"
1800             "  };",
1801             format("#define B     \\\n"
1802                    "  class A {   \\\n"
1803                    "   protected: \\\n"
1804                    "              \\\n"
1805                    "   public:    \\\n"
1806                    "              \\\n"
1807                    "    void f(); \\\n"
1808                    "  };",
1809                    getGoogleStyle()));
1810   // But don't remove empty lines after macros ending in access specifiers.
1811   EXPECT_EQ("#define A private:\n"
1812             "\n"
1813             "int i;",
1814             format("#define A         private:\n"
1815                    "\n"
1816                    "int              i;"));
1817 }
1818 
1819 TEST_F(FormatTest, FormatsClasses) {
1820   verifyFormat("class A : public B {};");
1821   verifyFormat("class A : public ::B {};");
1822 
1823   verifyFormat(
1824       "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
1825       "                             public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
1826   verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n"
1827                "    : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
1828                "      public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
1829   verifyFormat(
1830       "class A : public B, public C, public D, public E, public F {};");
1831   verifyFormat("class AAAAAAAAAAAA : public B,\n"
1832                "                     public C,\n"
1833                "                     public D,\n"
1834                "                     public E,\n"
1835                "                     public F,\n"
1836                "                     public G {};");
1837 
1838   verifyFormat("class\n"
1839                "    ReallyReallyLongClassName {\n"
1840                "  int i;\n"
1841                "};",
1842                getLLVMStyleWithColumns(32));
1843   verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n"
1844                "                           aaaaaaaaaaaaaaaa> {};");
1845   verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n"
1846                "    : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n"
1847                "                                 aaaaaaaaaaaaaaaaaaaaaa> {};");
1848   verifyFormat("template <class R, class C>\n"
1849                "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n"
1850                "    : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};");
1851   verifyFormat("class ::A::B {};");
1852 }
1853 
1854 TEST_F(FormatTest, BreakInheritanceStyle) {
1855   FormatStyle StyleWithInheritanceBreakBeforeComma = getLLVMStyle();
1856   StyleWithInheritanceBreakBeforeComma.BreakInheritanceList =
1857       FormatStyle::BILS_BeforeComma;
1858   verifyFormat("class MyClass : public X {};",
1859                StyleWithInheritanceBreakBeforeComma);
1860   verifyFormat("class MyClass\n"
1861                "    : public X\n"
1862                "    , public Y {};",
1863                StyleWithInheritanceBreakBeforeComma);
1864   verifyFormat("class AAAAAAAAAAAAAAAAAAAAAA\n"
1865                "    : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n"
1866                "    , public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};",
1867                StyleWithInheritanceBreakBeforeComma);
1868   verifyFormat("struct aaaaaaaaaaaaa\n"
1869                "    : public aaaaaaaaaaaaaaaaaaa< // break\n"
1870                "          aaaaaaaaaaaaaaaa> {};",
1871                StyleWithInheritanceBreakBeforeComma);
1872 
1873   FormatStyle StyleWithInheritanceBreakAfterColon = getLLVMStyle();
1874   StyleWithInheritanceBreakAfterColon.BreakInheritanceList =
1875       FormatStyle::BILS_AfterColon;
1876   verifyFormat("class MyClass : public X {};",
1877                StyleWithInheritanceBreakAfterColon);
1878   verifyFormat("class MyClass : public X, public Y {};",
1879                StyleWithInheritanceBreakAfterColon);
1880   verifyFormat("class AAAAAAAAAAAAAAAAAAAAAA :\n"
1881                "    public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
1882                "    public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};",
1883                StyleWithInheritanceBreakAfterColon);
1884   verifyFormat("struct aaaaaaaaaaaaa :\n"
1885                "    public aaaaaaaaaaaaaaaaaaa< // break\n"
1886                "        aaaaaaaaaaaaaaaa> {};",
1887                StyleWithInheritanceBreakAfterColon);
1888 }
1889 
1890 TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) {
1891   verifyFormat("class A {\n} a, b;");
1892   verifyFormat("struct A {\n} a, b;");
1893   verifyFormat("union A {\n} a;");
1894 }
1895 
1896 TEST_F(FormatTest, FormatsEnum) {
1897   verifyFormat("enum {\n"
1898                "  Zero,\n"
1899                "  One = 1,\n"
1900                "  Two = One + 1,\n"
1901                "  Three = (One + Two),\n"
1902                "  Four = (Zero && (One ^ Two)) | (One << Two),\n"
1903                "  Five = (One, Two, Three, Four, 5)\n"
1904                "};");
1905   verifyGoogleFormat("enum {\n"
1906                      "  Zero,\n"
1907                      "  One = 1,\n"
1908                      "  Two = One + 1,\n"
1909                      "  Three = (One + Two),\n"
1910                      "  Four = (Zero && (One ^ Two)) | (One << Two),\n"
1911                      "  Five = (One, Two, Three, Four, 5)\n"
1912                      "};");
1913   verifyFormat("enum Enum {};");
1914   verifyFormat("enum {};");
1915   verifyFormat("enum X E {} d;");
1916   verifyFormat("enum __attribute__((...)) E {} d;");
1917   verifyFormat("enum __declspec__((...)) E {} d;");
1918   verifyFormat("enum {\n"
1919                "  Bar = Foo<int, int>::value\n"
1920                "};",
1921                getLLVMStyleWithColumns(30));
1922 
1923   verifyFormat("enum ShortEnum { A, B, C };");
1924   verifyGoogleFormat("enum ShortEnum { A, B, C };");
1925 
1926   EXPECT_EQ("enum KeepEmptyLines {\n"
1927             "  ONE,\n"
1928             "\n"
1929             "  TWO,\n"
1930             "\n"
1931             "  THREE\n"
1932             "}",
1933             format("enum KeepEmptyLines {\n"
1934                    "  ONE,\n"
1935                    "\n"
1936                    "  TWO,\n"
1937                    "\n"
1938                    "\n"
1939                    "  THREE\n"
1940                    "}"));
1941   verifyFormat("enum E { // comment\n"
1942                "  ONE,\n"
1943                "  TWO\n"
1944                "};\n"
1945                "int i;");
1946 
1947   FormatStyle EightIndent = getLLVMStyle();
1948   EightIndent.IndentWidth = 8;
1949   verifyFormat("enum {\n"
1950                "        VOID,\n"
1951                "        CHAR,\n"
1952                "        SHORT,\n"
1953                "        INT,\n"
1954                "        LONG,\n"
1955                "        SIGNED,\n"
1956                "        UNSIGNED,\n"
1957                "        BOOL,\n"
1958                "        FLOAT,\n"
1959                "        DOUBLE,\n"
1960                "        COMPLEX\n"
1961                "};",
1962                EightIndent);
1963 
1964   // Not enums.
1965   verifyFormat("enum X f() {\n"
1966                "  a();\n"
1967                "  return 42;\n"
1968                "}");
1969   verifyFormat("enum X Type::f() {\n"
1970                "  a();\n"
1971                "  return 42;\n"
1972                "}");
1973   verifyFormat("enum ::X f() {\n"
1974                "  a();\n"
1975                "  return 42;\n"
1976                "}");
1977   verifyFormat("enum ns::X f() {\n"
1978                "  a();\n"
1979                "  return 42;\n"
1980                "}");
1981 }
1982 
1983 TEST_F(FormatTest, FormatsEnumsWithErrors) {
1984   verifyFormat("enum Type {\n"
1985                "  One = 0; // These semicolons should be commas.\n"
1986                "  Two = 1;\n"
1987                "};");
1988   verifyFormat("namespace n {\n"
1989                "enum Type {\n"
1990                "  One,\n"
1991                "  Two, // missing };\n"
1992                "  int i;\n"
1993                "}\n"
1994                "void g() {}");
1995 }
1996 
1997 TEST_F(FormatTest, FormatsEnumStruct) {
1998   verifyFormat("enum struct {\n"
1999                "  Zero,\n"
2000                "  One = 1,\n"
2001                "  Two = One + 1,\n"
2002                "  Three = (One + Two),\n"
2003                "  Four = (Zero && (One ^ Two)) | (One << Two),\n"
2004                "  Five = (One, Two, Three, Four, 5)\n"
2005                "};");
2006   verifyFormat("enum struct Enum {};");
2007   verifyFormat("enum struct {};");
2008   verifyFormat("enum struct X E {} d;");
2009   verifyFormat("enum struct __attribute__((...)) E {} d;");
2010   verifyFormat("enum struct __declspec__((...)) E {} d;");
2011   verifyFormat("enum struct X f() {\n  a();\n  return 42;\n}");
2012 }
2013 
2014 TEST_F(FormatTest, FormatsEnumClass) {
2015   verifyFormat("enum class {\n"
2016                "  Zero,\n"
2017                "  One = 1,\n"
2018                "  Two = One + 1,\n"
2019                "  Three = (One + Two),\n"
2020                "  Four = (Zero && (One ^ Two)) | (One << Two),\n"
2021                "  Five = (One, Two, Three, Four, 5)\n"
2022                "};");
2023   verifyFormat("enum class Enum {};");
2024   verifyFormat("enum class {};");
2025   verifyFormat("enum class X E {} d;");
2026   verifyFormat("enum class __attribute__((...)) E {} d;");
2027   verifyFormat("enum class __declspec__((...)) E {} d;");
2028   verifyFormat("enum class X f() {\n  a();\n  return 42;\n}");
2029 }
2030 
2031 TEST_F(FormatTest, FormatsEnumTypes) {
2032   verifyFormat("enum X : int {\n"
2033                "  A, // Force multiple lines.\n"
2034                "  B\n"
2035                "};");
2036   verifyFormat("enum X : int { A, B };");
2037   verifyFormat("enum X : std::uint32_t { A, B };");
2038 }
2039 
2040 TEST_F(FormatTest, FormatsTypedefEnum) {
2041   FormatStyle Style = getLLVMStyle();
2042   Style.ColumnLimit = 40;
2043   verifyFormat("typedef enum {} EmptyEnum;");
2044   verifyFormat("typedef enum { A, B, C } ShortEnum;");
2045   verifyFormat("typedef enum {\n"
2046                "  ZERO = 0,\n"
2047                "  ONE = 1,\n"
2048                "  TWO = 2,\n"
2049                "  THREE = 3\n"
2050                "} LongEnum;",
2051                Style);
2052   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
2053   Style.BraceWrapping.AfterEnum = true;
2054   verifyFormat("typedef enum {} EmptyEnum;");
2055   verifyFormat("typedef enum { A, B, C } ShortEnum;");
2056   verifyFormat("typedef enum\n"
2057                "{\n"
2058                "  ZERO = 0,\n"
2059                "  ONE = 1,\n"
2060                "  TWO = 2,\n"
2061                "  THREE = 3\n"
2062                "} LongEnum;",
2063                Style);
2064 }
2065 
2066 TEST_F(FormatTest, FormatsNSEnums) {
2067   verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }");
2068   verifyGoogleFormat(
2069       "typedef NS_CLOSED_ENUM(NSInteger, SomeName) { AAA, BBB }");
2070   verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n"
2071                      "  // Information about someDecentlyLongValue.\n"
2072                      "  someDecentlyLongValue,\n"
2073                      "  // Information about anotherDecentlyLongValue.\n"
2074                      "  anotherDecentlyLongValue,\n"
2075                      "  // Information about aThirdDecentlyLongValue.\n"
2076                      "  aThirdDecentlyLongValue\n"
2077                      "};");
2078   verifyGoogleFormat("typedef NS_CLOSED_ENUM(NSInteger, MyType) {\n"
2079                      "  // Information about someDecentlyLongValue.\n"
2080                      "  someDecentlyLongValue,\n"
2081                      "  // Information about anotherDecentlyLongValue.\n"
2082                      "  anotherDecentlyLongValue,\n"
2083                      "  // Information about aThirdDecentlyLongValue.\n"
2084                      "  aThirdDecentlyLongValue\n"
2085                      "};");
2086   verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n"
2087                      "  a = 1,\n"
2088                      "  b = 2,\n"
2089                      "  c = 3,\n"
2090                      "};");
2091   verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n"
2092                      "  a = 1,\n"
2093                      "  b = 2,\n"
2094                      "  c = 3,\n"
2095                      "};");
2096   verifyGoogleFormat("typedef CF_CLOSED_ENUM(NSInteger, MyType) {\n"
2097                      "  a = 1,\n"
2098                      "  b = 2,\n"
2099                      "  c = 3,\n"
2100                      "};");
2101   verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n"
2102                      "  a = 1,\n"
2103                      "  b = 2,\n"
2104                      "  c = 3,\n"
2105                      "};");
2106 }
2107 
2108 TEST_F(FormatTest, FormatsBitfields) {
2109   verifyFormat("struct Bitfields {\n"
2110                "  unsigned sClass : 8;\n"
2111                "  unsigned ValueKind : 2;\n"
2112                "};");
2113   verifyFormat("struct A {\n"
2114                "  int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n"
2115                "      bbbbbbbbbbbbbbbbbbbbbbbbb;\n"
2116                "};");
2117   verifyFormat("struct MyStruct {\n"
2118                "  uchar data;\n"
2119                "  uchar : 8;\n"
2120                "  uchar : 8;\n"
2121                "  uchar other;\n"
2122                "};");
2123 }
2124 
2125 TEST_F(FormatTest, FormatsNamespaces) {
2126   FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle();
2127   LLVMWithNoNamespaceFix.FixNamespaceComments = false;
2128 
2129   verifyFormat("namespace some_namespace {\n"
2130                "class A {};\n"
2131                "void f() { f(); }\n"
2132                "}",
2133                LLVMWithNoNamespaceFix);
2134   verifyFormat("namespace N::inline D {\n"
2135                "class A {};\n"
2136                "void f() { f(); }\n"
2137                "}",
2138                LLVMWithNoNamespaceFix);
2139   verifyFormat("namespace N::inline D::E {\n"
2140                "class A {};\n"
2141                "void f() { f(); }\n"
2142                "}",
2143                LLVMWithNoNamespaceFix);
2144   verifyFormat("namespace [[deprecated(\"foo[bar\")]] some_namespace {\n"
2145                "class A {};\n"
2146                "void f() { f(); }\n"
2147                "}",
2148                LLVMWithNoNamespaceFix);
2149   verifyFormat("/* something */ namespace some_namespace {\n"
2150                "class A {};\n"
2151                "void f() { f(); }\n"
2152                "}",
2153                LLVMWithNoNamespaceFix);
2154   verifyFormat("namespace {\n"
2155                "class A {};\n"
2156                "void f() { f(); }\n"
2157                "}",
2158                LLVMWithNoNamespaceFix);
2159   verifyFormat("/* something */ namespace {\n"
2160                "class A {};\n"
2161                "void f() { f(); }\n"
2162                "}",
2163                LLVMWithNoNamespaceFix);
2164   verifyFormat("inline namespace X {\n"
2165                "class A {};\n"
2166                "void f() { f(); }\n"
2167                "}",
2168                LLVMWithNoNamespaceFix);
2169   verifyFormat("/* something */ inline namespace X {\n"
2170                "class A {};\n"
2171                "void f() { f(); }\n"
2172                "}",
2173                LLVMWithNoNamespaceFix);
2174   verifyFormat("export namespace X {\n"
2175                "class A {};\n"
2176                "void f() { f(); }\n"
2177                "}",
2178                LLVMWithNoNamespaceFix);
2179   verifyFormat("using namespace some_namespace;\n"
2180                "class A {};\n"
2181                "void f() { f(); }",
2182                LLVMWithNoNamespaceFix);
2183 
2184   // This code is more common than we thought; if we
2185   // layout this correctly the semicolon will go into
2186   // its own line, which is undesirable.
2187   verifyFormat("namespace {};", LLVMWithNoNamespaceFix);
2188   verifyFormat("namespace {\n"
2189                "class A {};\n"
2190                "};",
2191                LLVMWithNoNamespaceFix);
2192 
2193   verifyFormat("namespace {\n"
2194                "int SomeVariable = 0; // comment\n"
2195                "} // namespace",
2196                LLVMWithNoNamespaceFix);
2197   EXPECT_EQ("#ifndef HEADER_GUARD\n"
2198             "#define HEADER_GUARD\n"
2199             "namespace my_namespace {\n"
2200             "int i;\n"
2201             "} // my_namespace\n"
2202             "#endif // HEADER_GUARD",
2203             format("#ifndef HEADER_GUARD\n"
2204                    " #define HEADER_GUARD\n"
2205                    "   namespace my_namespace {\n"
2206                    "int i;\n"
2207                    "}    // my_namespace\n"
2208                    "#endif    // HEADER_GUARD",
2209                    LLVMWithNoNamespaceFix));
2210 
2211   EXPECT_EQ("namespace A::B {\n"
2212             "class C {};\n"
2213             "}",
2214             format("namespace A::B {\n"
2215                    "class C {};\n"
2216                    "}",
2217                    LLVMWithNoNamespaceFix));
2218 
2219   FormatStyle Style = getLLVMStyle();
2220   Style.NamespaceIndentation = FormatStyle::NI_All;
2221   EXPECT_EQ("namespace out {\n"
2222             "  int i;\n"
2223             "  namespace in {\n"
2224             "    int i;\n"
2225             "  } // namespace in\n"
2226             "} // namespace out",
2227             format("namespace out {\n"
2228                    "int i;\n"
2229                    "namespace in {\n"
2230                    "int i;\n"
2231                    "} // namespace in\n"
2232                    "} // namespace out",
2233                    Style));
2234 
2235   Style.NamespaceIndentation = FormatStyle::NI_Inner;
2236   EXPECT_EQ("namespace out {\n"
2237             "int i;\n"
2238             "namespace in {\n"
2239             "  int i;\n"
2240             "} // namespace in\n"
2241             "} // namespace out",
2242             format("namespace out {\n"
2243                    "int i;\n"
2244                    "namespace in {\n"
2245                    "int i;\n"
2246                    "} // namespace in\n"
2247                    "} // namespace out",
2248                    Style));
2249 }
2250 
2251 TEST_F(FormatTest, NamespaceMacros) {
2252   FormatStyle Style = getLLVMStyle();
2253   Style.NamespaceMacros.push_back("TESTSUITE");
2254 
2255   verifyFormat("TESTSUITE(A) {\n"
2256                "int foo();\n"
2257                "} // TESTSUITE(A)",
2258                Style);
2259 
2260   verifyFormat("TESTSUITE(A, B) {\n"
2261                "int foo();\n"
2262                "} // TESTSUITE(A)",
2263                Style);
2264 
2265   // Properly indent according to NamespaceIndentation style
2266   Style.NamespaceIndentation = FormatStyle::NI_All;
2267   verifyFormat("TESTSUITE(A) {\n"
2268                "  int foo();\n"
2269                "} // TESTSUITE(A)",
2270                Style);
2271   verifyFormat("TESTSUITE(A) {\n"
2272                "  namespace B {\n"
2273                "    int foo();\n"
2274                "  } // namespace B\n"
2275                "} // TESTSUITE(A)",
2276                Style);
2277   verifyFormat("namespace A {\n"
2278                "  TESTSUITE(B) {\n"
2279                "    int foo();\n"
2280                "  } // TESTSUITE(B)\n"
2281                "} // namespace A",
2282                Style);
2283 
2284   Style.NamespaceIndentation = FormatStyle::NI_Inner;
2285   verifyFormat("TESTSUITE(A) {\n"
2286                "TESTSUITE(B) {\n"
2287                "  int foo();\n"
2288                "} // TESTSUITE(B)\n"
2289                "} // TESTSUITE(A)",
2290                Style);
2291   verifyFormat("TESTSUITE(A) {\n"
2292                "namespace B {\n"
2293                "  int foo();\n"
2294                "} // namespace B\n"
2295                "} // TESTSUITE(A)",
2296                Style);
2297   verifyFormat("namespace A {\n"
2298                "TESTSUITE(B) {\n"
2299                "  int foo();\n"
2300                "} // TESTSUITE(B)\n"
2301                "} // namespace A",
2302                Style);
2303 
2304   // Properly merge namespace-macros blocks in CompactNamespaces mode
2305   Style.NamespaceIndentation = FormatStyle::NI_None;
2306   Style.CompactNamespaces = true;
2307   verifyFormat("TESTSUITE(A) { TESTSUITE(B) {\n"
2308                "}} // TESTSUITE(A::B)",
2309                Style);
2310 
2311   EXPECT_EQ("TESTSUITE(out) { TESTSUITE(in) {\n"
2312             "}} // TESTSUITE(out::in)",
2313             format("TESTSUITE(out) {\n"
2314                    "TESTSUITE(in) {\n"
2315                    "} // TESTSUITE(in)\n"
2316                    "} // TESTSUITE(out)",
2317                    Style));
2318 
2319   EXPECT_EQ("TESTSUITE(out) { TESTSUITE(in) {\n"
2320             "}} // TESTSUITE(out::in)",
2321             format("TESTSUITE(out) {\n"
2322                    "TESTSUITE(in) {\n"
2323                    "} // TESTSUITE(in)\n"
2324                    "} // TESTSUITE(out)",
2325                    Style));
2326 
2327   // Do not merge different namespaces/macros
2328   EXPECT_EQ("namespace out {\n"
2329             "TESTSUITE(in) {\n"
2330             "} // TESTSUITE(in)\n"
2331             "} // namespace out",
2332             format("namespace out {\n"
2333                    "TESTSUITE(in) {\n"
2334                    "} // TESTSUITE(in)\n"
2335                    "} // namespace out",
2336                    Style));
2337   EXPECT_EQ("TESTSUITE(out) {\n"
2338             "namespace in {\n"
2339             "} // namespace in\n"
2340             "} // TESTSUITE(out)",
2341             format("TESTSUITE(out) {\n"
2342                    "namespace in {\n"
2343                    "} // namespace in\n"
2344                    "} // TESTSUITE(out)",
2345                    Style));
2346   Style.NamespaceMacros.push_back("FOOBAR");
2347   EXPECT_EQ("TESTSUITE(out) {\n"
2348             "FOOBAR(in) {\n"
2349             "} // FOOBAR(in)\n"
2350             "} // TESTSUITE(out)",
2351             format("TESTSUITE(out) {\n"
2352                    "FOOBAR(in) {\n"
2353                    "} // FOOBAR(in)\n"
2354                    "} // TESTSUITE(out)",
2355                    Style));
2356 }
2357 
2358 TEST_F(FormatTest, FormatsCompactNamespaces) {
2359   FormatStyle Style = getLLVMStyle();
2360   Style.CompactNamespaces = true;
2361   Style.NamespaceMacros.push_back("TESTSUITE");
2362 
2363   verifyFormat("namespace A { namespace B {\n"
2364                "}} // namespace A::B",
2365                Style);
2366 
2367   EXPECT_EQ("namespace out { namespace in {\n"
2368             "}} // namespace out::in",
2369             format("namespace out {\n"
2370                    "namespace in {\n"
2371                    "} // namespace in\n"
2372                    "} // namespace out",
2373                    Style));
2374 
2375   // Only namespaces which have both consecutive opening and end get compacted
2376   EXPECT_EQ("namespace out {\n"
2377             "namespace in1 {\n"
2378             "} // namespace in1\n"
2379             "namespace in2 {\n"
2380             "} // namespace in2\n"
2381             "} // namespace out",
2382             format("namespace out {\n"
2383                    "namespace in1 {\n"
2384                    "} // namespace in1\n"
2385                    "namespace in2 {\n"
2386                    "} // namespace in2\n"
2387                    "} // namespace out",
2388                    Style));
2389 
2390   EXPECT_EQ("namespace out {\n"
2391             "int i;\n"
2392             "namespace in {\n"
2393             "int j;\n"
2394             "} // namespace in\n"
2395             "int k;\n"
2396             "} // namespace out",
2397             format("namespace out { int i;\n"
2398                    "namespace in { int j; } // namespace in\n"
2399                    "int k; } // namespace out",
2400                    Style));
2401 
2402   EXPECT_EQ("namespace A { namespace B { namespace C {\n"
2403             "}}} // namespace A::B::C\n",
2404             format("namespace A { namespace B {\n"
2405                    "namespace C {\n"
2406                    "}} // namespace B::C\n"
2407                    "} // namespace A\n",
2408                    Style));
2409 
2410   Style.ColumnLimit = 40;
2411   EXPECT_EQ("namespace aaaaaaaaaa {\n"
2412             "namespace bbbbbbbbbb {\n"
2413             "}} // namespace aaaaaaaaaa::bbbbbbbbbb",
2414             format("namespace aaaaaaaaaa {\n"
2415                    "namespace bbbbbbbbbb {\n"
2416                    "} // namespace bbbbbbbbbb\n"
2417                    "} // namespace aaaaaaaaaa",
2418                    Style));
2419 
2420   EXPECT_EQ("namespace aaaaaa { namespace bbbbbb {\n"
2421             "namespace cccccc {\n"
2422             "}}} // namespace aaaaaa::bbbbbb::cccccc",
2423             format("namespace aaaaaa {\n"
2424                    "namespace bbbbbb {\n"
2425                    "namespace cccccc {\n"
2426                    "} // namespace cccccc\n"
2427                    "} // namespace bbbbbb\n"
2428                    "} // namespace aaaaaa",
2429                    Style));
2430   Style.ColumnLimit = 80;
2431 
2432   // Extra semicolon after 'inner' closing brace prevents merging
2433   EXPECT_EQ("namespace out { namespace in {\n"
2434             "}; } // namespace out::in",
2435             format("namespace out {\n"
2436                    "namespace in {\n"
2437                    "}; // namespace in\n"
2438                    "} // namespace out",
2439                    Style));
2440 
2441   // Extra semicolon after 'outer' closing brace is conserved
2442   EXPECT_EQ("namespace out { namespace in {\n"
2443             "}}; // namespace out::in",
2444             format("namespace out {\n"
2445                    "namespace in {\n"
2446                    "} // namespace in\n"
2447                    "}; // namespace out",
2448                    Style));
2449 
2450   Style.NamespaceIndentation = FormatStyle::NI_All;
2451   EXPECT_EQ("namespace out { namespace in {\n"
2452             "  int i;\n"
2453             "}} // namespace out::in",
2454             format("namespace out {\n"
2455                    "namespace in {\n"
2456                    "int i;\n"
2457                    "} // namespace in\n"
2458                    "} // namespace out",
2459                    Style));
2460   EXPECT_EQ("namespace out { namespace mid {\n"
2461             "  namespace in {\n"
2462             "    int j;\n"
2463             "  } // namespace in\n"
2464             "  int k;\n"
2465             "}} // namespace out::mid",
2466             format("namespace out { namespace mid {\n"
2467                    "namespace in { int j; } // namespace in\n"
2468                    "int k; }} // namespace out::mid",
2469                    Style));
2470 
2471   Style.NamespaceIndentation = FormatStyle::NI_Inner;
2472   EXPECT_EQ("namespace out { namespace in {\n"
2473             "  int i;\n"
2474             "}} // namespace out::in",
2475             format("namespace out {\n"
2476                    "namespace in {\n"
2477                    "int i;\n"
2478                    "} // namespace in\n"
2479                    "} // namespace out",
2480                    Style));
2481   EXPECT_EQ("namespace out { namespace mid { namespace in {\n"
2482             "  int i;\n"
2483             "}}} // namespace out::mid::in",
2484             format("namespace out {\n"
2485                    "namespace mid {\n"
2486                    "namespace in {\n"
2487                    "int i;\n"
2488                    "} // namespace in\n"
2489                    "} // namespace mid\n"
2490                    "} // namespace out",
2491                    Style));
2492 }
2493 
2494 TEST_F(FormatTest, FormatsExternC) {
2495   verifyFormat("extern \"C\" {\nint a;");
2496   verifyFormat("extern \"C\" {}");
2497   verifyFormat("extern \"C\" {\n"
2498                "int foo();\n"
2499                "}");
2500   verifyFormat("extern \"C\" int foo() {}");
2501   verifyFormat("extern \"C\" int foo();");
2502   verifyFormat("extern \"C\" int foo() {\n"
2503                "  int i = 42;\n"
2504                "  return i;\n"
2505                "}");
2506 
2507   FormatStyle Style = getLLVMStyle();
2508   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
2509   Style.BraceWrapping.AfterFunction = true;
2510   verifyFormat("extern \"C\" int foo() {}", Style);
2511   verifyFormat("extern \"C\" int foo();", Style);
2512   verifyFormat("extern \"C\" int foo()\n"
2513                "{\n"
2514                "  int i = 42;\n"
2515                "  return i;\n"
2516                "}",
2517                Style);
2518 
2519   Style.BraceWrapping.AfterExternBlock = true;
2520   Style.BraceWrapping.SplitEmptyRecord = false;
2521   verifyFormat("extern \"C\"\n"
2522                "{}",
2523                Style);
2524   verifyFormat("extern \"C\"\n"
2525                "{\n"
2526                "  int foo();\n"
2527                "}",
2528                Style);
2529 }
2530 
2531 TEST_F(FormatTest, FormatsInlineASM) {
2532   verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));");
2533   verifyFormat("asm(\"nop\" ::: \"memory\");");
2534   verifyFormat(
2535       "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n"
2536       "    \"cpuid\\n\\t\"\n"
2537       "    \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n"
2538       "    : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n"
2539       "    : \"a\"(value));");
2540   EXPECT_EQ(
2541       "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
2542       "  __asm {\n"
2543       "        mov     edx,[that] // vtable in edx\n"
2544       "        mov     eax,methodIndex\n"
2545       "        call    [edx][eax*4] // stdcall\n"
2546       "  }\n"
2547       "}",
2548       format("void NS_InvokeByIndex(void *that,   unsigned int methodIndex) {\n"
2549              "    __asm {\n"
2550              "        mov     edx,[that] // vtable in edx\n"
2551              "        mov     eax,methodIndex\n"
2552              "        call    [edx][eax*4] // stdcall\n"
2553              "    }\n"
2554              "}"));
2555   EXPECT_EQ("_asm {\n"
2556             "  xor eax, eax;\n"
2557             "  cpuid;\n"
2558             "}",
2559             format("_asm {\n"
2560                    "  xor eax, eax;\n"
2561                    "  cpuid;\n"
2562                    "}"));
2563   verifyFormat("void function() {\n"
2564                "  // comment\n"
2565                "  asm(\"\");\n"
2566                "}");
2567   EXPECT_EQ("__asm {\n"
2568             "}\n"
2569             "int i;",
2570             format("__asm   {\n"
2571                    "}\n"
2572                    "int   i;"));
2573 }
2574 
2575 TEST_F(FormatTest, FormatTryCatch) {
2576   verifyFormat("try {\n"
2577                "  throw a * b;\n"
2578                "} catch (int a) {\n"
2579                "  // Do nothing.\n"
2580                "} catch (...) {\n"
2581                "  exit(42);\n"
2582                "}");
2583 
2584   // Function-level try statements.
2585   verifyFormat("int f() try { return 4; } catch (...) {\n"
2586                "  return 5;\n"
2587                "}");
2588   verifyFormat("class A {\n"
2589                "  int a;\n"
2590                "  A() try : a(0) {\n"
2591                "  } catch (...) {\n"
2592                "    throw;\n"
2593                "  }\n"
2594                "};\n");
2595 
2596   // Incomplete try-catch blocks.
2597   verifyIncompleteFormat("try {} catch (");
2598 }
2599 
2600 TEST_F(FormatTest, FormatSEHTryCatch) {
2601   verifyFormat("__try {\n"
2602                "  int a = b * c;\n"
2603                "} __except (EXCEPTION_EXECUTE_HANDLER) {\n"
2604                "  // Do nothing.\n"
2605                "}");
2606 
2607   verifyFormat("__try {\n"
2608                "  int a = b * c;\n"
2609                "} __finally {\n"
2610                "  // Do nothing.\n"
2611                "}");
2612 
2613   verifyFormat("DEBUG({\n"
2614                "  __try {\n"
2615                "  } __finally {\n"
2616                "  }\n"
2617                "});\n");
2618 }
2619 
2620 TEST_F(FormatTest, IncompleteTryCatchBlocks) {
2621   verifyFormat("try {\n"
2622                "  f();\n"
2623                "} catch {\n"
2624                "  g();\n"
2625                "}");
2626   verifyFormat("try {\n"
2627                "  f();\n"
2628                "} catch (A a) MACRO(x) {\n"
2629                "  g();\n"
2630                "} catch (B b) MACRO(x) {\n"
2631                "  g();\n"
2632                "}");
2633 }
2634 
2635 TEST_F(FormatTest, FormatTryCatchBraceStyles) {
2636   FormatStyle Style = getLLVMStyle();
2637   for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla,
2638                           FormatStyle::BS_WebKit}) {
2639     Style.BreakBeforeBraces = BraceStyle;
2640     verifyFormat("try {\n"
2641                  "  // something\n"
2642                  "} catch (...) {\n"
2643                  "  // something\n"
2644                  "}",
2645                  Style);
2646   }
2647   Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
2648   verifyFormat("try {\n"
2649                "  // something\n"
2650                "}\n"
2651                "catch (...) {\n"
2652                "  // something\n"
2653                "}",
2654                Style);
2655   verifyFormat("__try {\n"
2656                "  // something\n"
2657                "}\n"
2658                "__finally {\n"
2659                "  // something\n"
2660                "}",
2661                Style);
2662   verifyFormat("@try {\n"
2663                "  // something\n"
2664                "}\n"
2665                "@finally {\n"
2666                "  // something\n"
2667                "}",
2668                Style);
2669   Style.BreakBeforeBraces = FormatStyle::BS_Allman;
2670   verifyFormat("try\n"
2671                "{\n"
2672                "  // something\n"
2673                "}\n"
2674                "catch (...)\n"
2675                "{\n"
2676                "  // something\n"
2677                "}",
2678                Style);
2679   Style.BreakBeforeBraces = FormatStyle::BS_Whitesmiths;
2680   verifyFormat("try\n"
2681                "  {\n"
2682                "  // something white\n"
2683                "  }\n"
2684                "catch (...)\n"
2685                "  {\n"
2686                "  // something white\n"
2687                "  }",
2688                Style);
2689   Style.BreakBeforeBraces = FormatStyle::BS_GNU;
2690   verifyFormat("try\n"
2691                "  {\n"
2692                "    // something\n"
2693                "  }\n"
2694                "catch (...)\n"
2695                "  {\n"
2696                "    // something\n"
2697                "  }",
2698                Style);
2699   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
2700   Style.BraceWrapping.BeforeCatch = true;
2701   verifyFormat("try {\n"
2702                "  // something\n"
2703                "}\n"
2704                "catch (...) {\n"
2705                "  // something\n"
2706                "}",
2707                Style);
2708 }
2709 
2710 TEST_F(FormatTest, StaticInitializers) {
2711   verifyFormat("static SomeClass SC = {1, 'a'};");
2712 
2713   verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n"
2714                "    100000000, "
2715                "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};");
2716 
2717   // Here, everything other than the "}" would fit on a line.
2718   verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n"
2719                "    10000000000000000000000000};");
2720   EXPECT_EQ("S s = {a,\n"
2721             "\n"
2722             "       b};",
2723             format("S s = {\n"
2724                    "  a,\n"
2725                    "\n"
2726                    "  b\n"
2727                    "};"));
2728 
2729   // FIXME: This would fit into the column limit if we'd fit "{ {" on the first
2730   // line. However, the formatting looks a bit off and this probably doesn't
2731   // happen often in practice.
2732   verifyFormat("static int Variable[1] = {\n"
2733                "    {1000000000000000000000000000000000000}};",
2734                getLLVMStyleWithColumns(40));
2735 }
2736 
2737 TEST_F(FormatTest, DesignatedInitializers) {
2738   verifyFormat("const struct A a = {.a = 1, .b = 2};");
2739   verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n"
2740                "                    .bbbbbbbbbb = 2,\n"
2741                "                    .cccccccccc = 3,\n"
2742                "                    .dddddddddd = 4,\n"
2743                "                    .eeeeeeeeee = 5};");
2744   verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
2745                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n"
2746                "    .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n"
2747                "    .ccccccccccccccccccccccccccc = 3,\n"
2748                "    .ddddddddddddddddddddddddddd = 4,\n"
2749                "    .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};");
2750 
2751   verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};");
2752 
2753   verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
2754   verifyFormat("const struct A a = {[1] = aaaaaaaaaa,\n"
2755                "                    [2] = bbbbbbbbbb,\n"
2756                "                    [3] = cccccccccc,\n"
2757                "                    [4] = dddddddddd,\n"
2758                "                    [5] = eeeeeeeeee};");
2759   verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
2760                "    [1] = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2761                "    [2] = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
2762                "    [3] = cccccccccccccccccccccccccccccccccccccc,\n"
2763                "    [4] = dddddddddddddddddddddddddddddddddddddd,\n"
2764                "    [5] = eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee};");
2765 }
2766 
2767 TEST_F(FormatTest, NestedStaticInitializers) {
2768   verifyFormat("static A x = {{{}}};\n");
2769   verifyFormat("static A x = {{{init1, init2, init3, init4},\n"
2770                "               {init1, init2, init3, init4}}};",
2771                getLLVMStyleWithColumns(50));
2772 
2773   verifyFormat("somes Status::global_reps[3] = {\n"
2774                "    {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
2775                "    {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
2776                "    {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};",
2777                getLLVMStyleWithColumns(60));
2778   verifyGoogleFormat("SomeType Status::global_reps[3] = {\n"
2779                      "    {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
2780                      "    {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
2781                      "    {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};");
2782   verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n"
2783                "                  {rect.fRight - rect.fLeft, rect.fBottom - "
2784                "rect.fTop}};");
2785 
2786   verifyFormat(
2787       "SomeArrayOfSomeType a = {\n"
2788       "    {{1, 2, 3},\n"
2789       "     {1, 2, 3},\n"
2790       "     {111111111111111111111111111111, 222222222222222222222222222222,\n"
2791       "      333333333333333333333333333333},\n"
2792       "     {1, 2, 3},\n"
2793       "     {1, 2, 3}}};");
2794   verifyFormat(
2795       "SomeArrayOfSomeType a = {\n"
2796       "    {{1, 2, 3}},\n"
2797       "    {{1, 2, 3}},\n"
2798       "    {{111111111111111111111111111111, 222222222222222222222222222222,\n"
2799       "      333333333333333333333333333333}},\n"
2800       "    {{1, 2, 3}},\n"
2801       "    {{1, 2, 3}}};");
2802 
2803   verifyFormat("struct {\n"
2804                "  unsigned bit;\n"
2805                "  const char *const name;\n"
2806                "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n"
2807                "                 {kOsWin, \"Windows\"},\n"
2808                "                 {kOsLinux, \"Linux\"},\n"
2809                "                 {kOsCrOS, \"Chrome OS\"}};");
2810   verifyFormat("struct {\n"
2811                "  unsigned bit;\n"
2812                "  const char *const name;\n"
2813                "} kBitsToOs[] = {\n"
2814                "    {kOsMac, \"Mac\"},\n"
2815                "    {kOsWin, \"Windows\"},\n"
2816                "    {kOsLinux, \"Linux\"},\n"
2817                "    {kOsCrOS, \"Chrome OS\"},\n"
2818                "};");
2819 }
2820 
2821 TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) {
2822   verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro("
2823                "                      \\\n"
2824                "    aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)");
2825 }
2826 
2827 TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) {
2828   verifyFormat("virtual void write(ELFWriter *writerrr,\n"
2829                "                   OwningPtr<FileOutputBuffer> &buffer) = 0;");
2830 
2831   // Do break defaulted and deleted functions.
2832   verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
2833                "    default;",
2834                getLLVMStyleWithColumns(40));
2835   verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
2836                "    delete;",
2837                getLLVMStyleWithColumns(40));
2838 }
2839 
2840 TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) {
2841   verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3",
2842                getLLVMStyleWithColumns(40));
2843   verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
2844                getLLVMStyleWithColumns(40));
2845   EXPECT_EQ("#define Q                              \\\n"
2846             "  \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\"    \\\n"
2847             "  \"aaaaaaaa.cpp\"",
2848             format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
2849                    getLLVMStyleWithColumns(40)));
2850 }
2851 
2852 TEST_F(FormatTest, UnderstandsLinePPDirective) {
2853   EXPECT_EQ("# 123 \"A string literal\"",
2854             format("   #     123    \"A string literal\""));
2855 }
2856 
2857 TEST_F(FormatTest, LayoutUnknownPPDirective) {
2858   EXPECT_EQ("#;", format("#;"));
2859   verifyFormat("#\n;\n;\n;");
2860 }
2861 
2862 TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) {
2863   EXPECT_EQ("#line 42 \"test\"\n",
2864             format("#  \\\n  line  \\\n  42  \\\n  \"test\"\n"));
2865   EXPECT_EQ("#define A B\n", format("#  \\\n define  \\\n    A  \\\n       B\n",
2866                                     getLLVMStyleWithColumns(12)));
2867 }
2868 
2869 TEST_F(FormatTest, EndOfFileEndsPPDirective) {
2870   EXPECT_EQ("#line 42 \"test\"",
2871             format("#  \\\n  line  \\\n  42  \\\n  \"test\""));
2872   EXPECT_EQ("#define A B", format("#  \\\n define  \\\n    A  \\\n       B"));
2873 }
2874 
2875 TEST_F(FormatTest, DoesntRemoveUnknownTokens) {
2876   verifyFormat("#define A \\x20");
2877   verifyFormat("#define A \\ x20");
2878   EXPECT_EQ("#define A \\ x20", format("#define A \\   x20"));
2879   verifyFormat("#define A ''");
2880   verifyFormat("#define A ''qqq");
2881   verifyFormat("#define A `qqq");
2882   verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");");
2883   EXPECT_EQ("const char *c = STRINGIFY(\n"
2884             "\\na : b);",
2885             format("const char * c = STRINGIFY(\n"
2886                    "\\na : b);"));
2887 
2888   verifyFormat("a\r\\");
2889   verifyFormat("a\v\\");
2890   verifyFormat("a\f\\");
2891 }
2892 
2893 TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) {
2894   verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13));
2895   verifyFormat("#define A( \\\n    BB)", getLLVMStyleWithColumns(12));
2896   verifyFormat("#define A( \\\n    A, B)", getLLVMStyleWithColumns(12));
2897   // FIXME: We never break before the macro name.
2898   verifyFormat("#define AA( \\\n    B)", getLLVMStyleWithColumns(12));
2899 
2900   verifyFormat("#define A A\n#define A A");
2901   verifyFormat("#define A(X) A\n#define A A");
2902 
2903   verifyFormat("#define Something Other", getLLVMStyleWithColumns(23));
2904   verifyFormat("#define Something    \\\n  Other", getLLVMStyleWithColumns(22));
2905 }
2906 
2907 TEST_F(FormatTest, HandlePreprocessorDirectiveContext) {
2908   EXPECT_EQ("// somecomment\n"
2909             "#include \"a.h\"\n"
2910             "#define A(  \\\n"
2911             "    A, B)\n"
2912             "#include \"b.h\"\n"
2913             "// somecomment\n",
2914             format("  // somecomment\n"
2915                    "  #include \"a.h\"\n"
2916                    "#define A(A,\\\n"
2917                    "    B)\n"
2918                    "    #include \"b.h\"\n"
2919                    " // somecomment\n",
2920                    getLLVMStyleWithColumns(13)));
2921 }
2922 
2923 TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); }
2924 
2925 TEST_F(FormatTest, LayoutCodeInMacroDefinitions) {
2926   EXPECT_EQ("#define A    \\\n"
2927             "  c;         \\\n"
2928             "  e;\n"
2929             "f;",
2930             format("#define A c; e;\n"
2931                    "f;",
2932                    getLLVMStyleWithColumns(14)));
2933 }
2934 
2935 TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); }
2936 
2937 TEST_F(FormatTest, MacroDefinitionInsideStatement) {
2938   EXPECT_EQ("int x,\n"
2939             "#define A\n"
2940             "    y;",
2941             format("int x,\n#define A\ny;"));
2942 }
2943 
2944 TEST_F(FormatTest, HashInMacroDefinition) {
2945   EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle()));
2946   verifyFormat("#define A \\\n  b #c;", getLLVMStyleWithColumns(11));
2947   verifyFormat("#define A  \\\n"
2948                "  {        \\\n"
2949                "    f(#c); \\\n"
2950                "  }",
2951                getLLVMStyleWithColumns(11));
2952 
2953   verifyFormat("#define A(X)         \\\n"
2954                "  void function##X()",
2955                getLLVMStyleWithColumns(22));
2956 
2957   verifyFormat("#define A(a, b, c)   \\\n"
2958                "  void a##b##c()",
2959                getLLVMStyleWithColumns(22));
2960 
2961   verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22));
2962 }
2963 
2964 TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) {
2965   EXPECT_EQ("#define A (x)", format("#define A (x)"));
2966   EXPECT_EQ("#define A(x)", format("#define A(x)"));
2967 
2968   FormatStyle Style = getLLVMStyle();
2969   Style.SpaceBeforeParens = FormatStyle::SBPO_Never;
2970   verifyFormat("#define true ((foo)1)", Style);
2971   Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
2972   verifyFormat("#define false((foo)0)", Style);
2973 }
2974 
2975 TEST_F(FormatTest, EmptyLinesInMacroDefinitions) {
2976   EXPECT_EQ("#define A b;", format("#define A \\\n"
2977                                    "          \\\n"
2978                                    "  b;",
2979                                    getLLVMStyleWithColumns(25)));
2980   EXPECT_EQ("#define A \\\n"
2981             "          \\\n"
2982             "  a;      \\\n"
2983             "  b;",
2984             format("#define A \\\n"
2985                    "          \\\n"
2986                    "  a;      \\\n"
2987                    "  b;",
2988                    getLLVMStyleWithColumns(11)));
2989   EXPECT_EQ("#define A \\\n"
2990             "  a;      \\\n"
2991             "          \\\n"
2992             "  b;",
2993             format("#define A \\\n"
2994                    "  a;      \\\n"
2995                    "          \\\n"
2996                    "  b;",
2997                    getLLVMStyleWithColumns(11)));
2998 }
2999 
3000 TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) {
3001   verifyIncompleteFormat("#define A :");
3002   verifyFormat("#define SOMECASES  \\\n"
3003                "  case 1:          \\\n"
3004                "  case 2\n",
3005                getLLVMStyleWithColumns(20));
3006   verifyFormat("#define MACRO(a) \\\n"
3007                "  if (a)         \\\n"
3008                "    f();         \\\n"
3009                "  else           \\\n"
3010                "    g()",
3011                getLLVMStyleWithColumns(18));
3012   verifyFormat("#define A template <typename T>");
3013   verifyIncompleteFormat("#define STR(x) #x\n"
3014                          "f(STR(this_is_a_string_literal{));");
3015   verifyFormat("#pragma omp threadprivate( \\\n"
3016                "    y)), // expected-warning",
3017                getLLVMStyleWithColumns(28));
3018   verifyFormat("#d, = };");
3019   verifyFormat("#if \"a");
3020   verifyIncompleteFormat("({\n"
3021                          "#define b     \\\n"
3022                          "  }           \\\n"
3023                          "  a\n"
3024                          "a",
3025                          getLLVMStyleWithColumns(15));
3026   verifyFormat("#define A     \\\n"
3027                "  {           \\\n"
3028                "    {\n"
3029                "#define B     \\\n"
3030                "  }           \\\n"
3031                "  }",
3032                getLLVMStyleWithColumns(15));
3033   verifyNoCrash("#if a\na(\n#else\n#endif\n{a");
3034   verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}");
3035   verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};");
3036   verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() {      \n)}");
3037 }
3038 
3039 TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) {
3040   verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline.
3041   EXPECT_EQ("class A : public QObject {\n"
3042             "  Q_OBJECT\n"
3043             "\n"
3044             "  A() {}\n"
3045             "};",
3046             format("class A  :  public QObject {\n"
3047                    "     Q_OBJECT\n"
3048                    "\n"
3049                    "  A() {\n}\n"
3050                    "}  ;"));
3051   EXPECT_EQ("MACRO\n"
3052             "/*static*/ int i;",
3053             format("MACRO\n"
3054                    " /*static*/ int   i;"));
3055   EXPECT_EQ("SOME_MACRO\n"
3056             "namespace {\n"
3057             "void f();\n"
3058             "} // namespace",
3059             format("SOME_MACRO\n"
3060                    "  namespace    {\n"
3061                    "void   f(  );\n"
3062                    "} // namespace"));
3063   // Only if the identifier contains at least 5 characters.
3064   EXPECT_EQ("HTTP f();", format("HTTP\nf();"));
3065   EXPECT_EQ("MACRO\nf();", format("MACRO\nf();"));
3066   // Only if everything is upper case.
3067   EXPECT_EQ("class A : public QObject {\n"
3068             "  Q_Object A() {}\n"
3069             "};",
3070             format("class A  :  public QObject {\n"
3071                    "     Q_Object\n"
3072                    "  A() {\n}\n"
3073                    "}  ;"));
3074 
3075   // Only if the next line can actually start an unwrapped line.
3076   EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;",
3077             format("SOME_WEIRD_LOG_MACRO\n"
3078                    "<< SomeThing;"));
3079 
3080   verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), "
3081                "(n, buffers))\n",
3082                getChromiumStyle(FormatStyle::LK_Cpp));
3083 
3084   // See PR41483
3085   EXPECT_EQ("/**/ FOO(a)\n"
3086             "FOO(b)",
3087             format("/**/ FOO(a)\n"
3088                    "FOO(b)"));
3089 }
3090 
3091 TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) {
3092   EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
3093             "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
3094             "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
3095             "class X {};\n"
3096             "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
3097             "int *createScopDetectionPass() { return 0; }",
3098             format("  INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
3099                    "  INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
3100                    "  INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
3101                    "  class X {};\n"
3102                    "  INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
3103                    "  int *createScopDetectionPass() { return 0; }"));
3104   // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as
3105   // braces, so that inner block is indented one level more.
3106   EXPECT_EQ("int q() {\n"
3107             "  IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
3108             "  IPC_MESSAGE_HANDLER(xxx, qqq)\n"
3109             "  IPC_END_MESSAGE_MAP()\n"
3110             "}",
3111             format("int q() {\n"
3112                    "  IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
3113                    "    IPC_MESSAGE_HANDLER(xxx, qqq)\n"
3114                    "  IPC_END_MESSAGE_MAP()\n"
3115                    "}"));
3116 
3117   // Same inside macros.
3118   EXPECT_EQ("#define LIST(L) \\\n"
3119             "  L(A)          \\\n"
3120             "  L(B)          \\\n"
3121             "  L(C)",
3122             format("#define LIST(L) \\\n"
3123                    "  L(A) \\\n"
3124                    "  L(B) \\\n"
3125                    "  L(C)",
3126                    getGoogleStyle()));
3127 
3128   // These must not be recognized as macros.
3129   EXPECT_EQ("int q() {\n"
3130             "  f(x);\n"
3131             "  f(x) {}\n"
3132             "  f(x)->g();\n"
3133             "  f(x)->*g();\n"
3134             "  f(x).g();\n"
3135             "  f(x) = x;\n"
3136             "  f(x) += x;\n"
3137             "  f(x) -= x;\n"
3138             "  f(x) *= x;\n"
3139             "  f(x) /= x;\n"
3140             "  f(x) %= x;\n"
3141             "  f(x) &= x;\n"
3142             "  f(x) |= x;\n"
3143             "  f(x) ^= x;\n"
3144             "  f(x) >>= x;\n"
3145             "  f(x) <<= x;\n"
3146             "  f(x)[y].z();\n"
3147             "  LOG(INFO) << x;\n"
3148             "  ifstream(x) >> x;\n"
3149             "}\n",
3150             format("int q() {\n"
3151                    "  f(x)\n;\n"
3152                    "  f(x)\n {}\n"
3153                    "  f(x)\n->g();\n"
3154                    "  f(x)\n->*g();\n"
3155                    "  f(x)\n.g();\n"
3156                    "  f(x)\n = x;\n"
3157                    "  f(x)\n += x;\n"
3158                    "  f(x)\n -= x;\n"
3159                    "  f(x)\n *= x;\n"
3160                    "  f(x)\n /= x;\n"
3161                    "  f(x)\n %= x;\n"
3162                    "  f(x)\n &= x;\n"
3163                    "  f(x)\n |= x;\n"
3164                    "  f(x)\n ^= x;\n"
3165                    "  f(x)\n >>= x;\n"
3166                    "  f(x)\n <<= x;\n"
3167                    "  f(x)\n[y].z();\n"
3168                    "  LOG(INFO)\n << x;\n"
3169                    "  ifstream(x)\n >> x;\n"
3170                    "}\n"));
3171   EXPECT_EQ("int q() {\n"
3172             "  F(x)\n"
3173             "  if (1) {\n"
3174             "  }\n"
3175             "  F(x)\n"
3176             "  while (1) {\n"
3177             "  }\n"
3178             "  F(x)\n"
3179             "  G(x);\n"
3180             "  F(x)\n"
3181             "  try {\n"
3182             "    Q();\n"
3183             "  } catch (...) {\n"
3184             "  }\n"
3185             "}\n",
3186             format("int q() {\n"
3187                    "F(x)\n"
3188                    "if (1) {}\n"
3189                    "F(x)\n"
3190                    "while (1) {}\n"
3191                    "F(x)\n"
3192                    "G(x);\n"
3193                    "F(x)\n"
3194                    "try { Q(); } catch (...) {}\n"
3195                    "}\n"));
3196   EXPECT_EQ("class A {\n"
3197             "  A() : t(0) {}\n"
3198             "  A(int i) noexcept() : {}\n"
3199             "  A(X x)\n" // FIXME: function-level try blocks are broken.
3200             "  try : t(0) {\n"
3201             "  } catch (...) {\n"
3202             "  }\n"
3203             "};",
3204             format("class A {\n"
3205                    "  A()\n : t(0) {}\n"
3206                    "  A(int i)\n noexcept() : {}\n"
3207                    "  A(X x)\n"
3208                    "  try : t(0) {} catch (...) {}\n"
3209                    "};"));
3210   FormatStyle Style = getLLVMStyle();
3211   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
3212   Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Always;
3213   Style.BraceWrapping.AfterFunction = true;
3214   EXPECT_EQ("void f()\n"
3215             "try\n"
3216             "{\n"
3217             "}",
3218             format("void f() try {\n"
3219                    "}",
3220                    Style));
3221   EXPECT_EQ("class SomeClass {\n"
3222             "public:\n"
3223             "  SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3224             "};",
3225             format("class SomeClass {\n"
3226                    "public:\n"
3227                    "  SomeClass()\n"
3228                    "  EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3229                    "};"));
3230   EXPECT_EQ("class SomeClass {\n"
3231             "public:\n"
3232             "  SomeClass()\n"
3233             "      EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3234             "};",
3235             format("class SomeClass {\n"
3236                    "public:\n"
3237                    "  SomeClass()\n"
3238                    "  EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
3239                    "};",
3240                    getLLVMStyleWithColumns(40)));
3241 
3242   verifyFormat("MACRO(>)");
3243 
3244   // Some macros contain an implicit semicolon.
3245   Style = getLLVMStyle();
3246   Style.StatementMacros.push_back("FOO");
3247   verifyFormat("FOO(a) int b = 0;");
3248   verifyFormat("FOO(a)\n"
3249                "int b = 0;",
3250                Style);
3251   verifyFormat("FOO(a);\n"
3252                "int b = 0;",
3253                Style);
3254   verifyFormat("FOO(argc, argv, \"4.0.2\")\n"
3255                "int b = 0;",
3256                Style);
3257   verifyFormat("FOO()\n"
3258                "int b = 0;",
3259                Style);
3260   verifyFormat("FOO\n"
3261                "int b = 0;",
3262                Style);
3263   verifyFormat("void f() {\n"
3264                "  FOO(a)\n"
3265                "  return a;\n"
3266                "}",
3267                Style);
3268   verifyFormat("FOO(a)\n"
3269                "FOO(b)",
3270                Style);
3271   verifyFormat("int a = 0;\n"
3272                "FOO(b)\n"
3273                "int c = 0;",
3274                Style);
3275   verifyFormat("int a = 0;\n"
3276                "int x = FOO(a)\n"
3277                "int b = 0;",
3278                Style);
3279   verifyFormat("void foo(int a) { FOO(a) }\n"
3280                "uint32_t bar() {}",
3281                Style);
3282 }
3283 
3284 TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) {
3285   verifyFormat("#define A \\\n"
3286                "  f({     \\\n"
3287                "    g();  \\\n"
3288                "  });",
3289                getLLVMStyleWithColumns(11));
3290 }
3291 
3292 TEST_F(FormatTest, IndentPreprocessorDirectives) {
3293   FormatStyle Style = getLLVMStyle();
3294   Style.IndentPPDirectives = FormatStyle::PPDIS_None;
3295   Style.ColumnLimit = 40;
3296   verifyFormat("#ifdef _WIN32\n"
3297                "#define A 0\n"
3298                "#ifdef VAR2\n"
3299                "#define B 1\n"
3300                "#include <someheader.h>\n"
3301                "#define MACRO                          \\\n"
3302                "  some_very_long_func_aaaaaaaaaa();\n"
3303                "#endif\n"
3304                "#else\n"
3305                "#define A 1\n"
3306                "#endif",
3307                Style);
3308   Style.IndentPPDirectives = FormatStyle::PPDIS_AfterHash;
3309   verifyFormat("#ifdef _WIN32\n"
3310                "#  define A 0\n"
3311                "#  ifdef VAR2\n"
3312                "#    define B 1\n"
3313                "#    include <someheader.h>\n"
3314                "#    define MACRO                      \\\n"
3315                "      some_very_long_func_aaaaaaaaaa();\n"
3316                "#  endif\n"
3317                "#else\n"
3318                "#  define A 1\n"
3319                "#endif",
3320                Style);
3321   verifyFormat("#if A\n"
3322                "#  define MACRO                        \\\n"
3323                "    void a(int x) {                    \\\n"
3324                "      b();                             \\\n"
3325                "      c();                             \\\n"
3326                "      d();                             \\\n"
3327                "      e();                             \\\n"
3328                "      f();                             \\\n"
3329                "    }\n"
3330                "#endif",
3331                Style);
3332   // Comments before include guard.
3333   verifyFormat("// file comment\n"
3334                "// file comment\n"
3335                "#ifndef HEADER_H\n"
3336                "#define HEADER_H\n"
3337                "code();\n"
3338                "#endif",
3339                Style);
3340   // Test with include guards.
3341   verifyFormat("#ifndef HEADER_H\n"
3342                "#define HEADER_H\n"
3343                "code();\n"
3344                "#endif",
3345                Style);
3346   // Include guards must have a #define with the same variable immediately
3347   // after #ifndef.
3348   verifyFormat("#ifndef NOT_GUARD\n"
3349                "#  define FOO\n"
3350                "code();\n"
3351                "#endif",
3352                Style);
3353 
3354   // Include guards must cover the entire file.
3355   verifyFormat("code();\n"
3356                "code();\n"
3357                "#ifndef NOT_GUARD\n"
3358                "#  define NOT_GUARD\n"
3359                "code();\n"
3360                "#endif",
3361                Style);
3362   verifyFormat("#ifndef NOT_GUARD\n"
3363                "#  define NOT_GUARD\n"
3364                "code();\n"
3365                "#endif\n"
3366                "code();",
3367                Style);
3368   // Test with trailing blank lines.
3369   verifyFormat("#ifndef HEADER_H\n"
3370                "#define HEADER_H\n"
3371                "code();\n"
3372                "#endif\n",
3373                Style);
3374   // Include guards don't have #else.
3375   verifyFormat("#ifndef NOT_GUARD\n"
3376                "#  define NOT_GUARD\n"
3377                "code();\n"
3378                "#else\n"
3379                "#endif",
3380                Style);
3381   verifyFormat("#ifndef NOT_GUARD\n"
3382                "#  define NOT_GUARD\n"
3383                "code();\n"
3384                "#elif FOO\n"
3385                "#endif",
3386                Style);
3387   // Non-identifier #define after potential include guard.
3388   verifyFormat("#ifndef FOO\n"
3389                "#  define 1\n"
3390                "#endif\n",
3391                Style);
3392   // #if closes past last non-preprocessor line.
3393   verifyFormat("#ifndef FOO\n"
3394                "#define FOO\n"
3395                "#if 1\n"
3396                "int i;\n"
3397                "#  define A 0\n"
3398                "#endif\n"
3399                "#endif\n",
3400                Style);
3401   // Don't crash if there is an #elif directive without a condition.
3402   verifyFormat("#if 1\n"
3403                "int x;\n"
3404                "#elif\n"
3405                "int y;\n"
3406                "#else\n"
3407                "int z;\n"
3408                "#endif",
3409                Style);
3410   // FIXME: This doesn't handle the case where there's code between the
3411   // #ifndef and #define but all other conditions hold. This is because when
3412   // the #define line is parsed, UnwrappedLineParser::Lines doesn't hold the
3413   // previous code line yet, so we can't detect it.
3414   EXPECT_EQ("#ifndef NOT_GUARD\n"
3415             "code();\n"
3416             "#define NOT_GUARD\n"
3417             "code();\n"
3418             "#endif",
3419             format("#ifndef NOT_GUARD\n"
3420                    "code();\n"
3421                    "#  define NOT_GUARD\n"
3422                    "code();\n"
3423                    "#endif",
3424                    Style));
3425   // FIXME: This doesn't handle cases where legitimate preprocessor lines may
3426   // be outside an include guard. Examples are #pragma once and
3427   // #pragma GCC diagnostic, or anything else that does not change the meaning
3428   // of the file if it's included multiple times.
3429   EXPECT_EQ("#ifdef WIN32\n"
3430             "#  pragma once\n"
3431             "#endif\n"
3432             "#ifndef HEADER_H\n"
3433             "#  define HEADER_H\n"
3434             "code();\n"
3435             "#endif",
3436             format("#ifdef WIN32\n"
3437                    "#  pragma once\n"
3438                    "#endif\n"
3439                    "#ifndef HEADER_H\n"
3440                    "#define HEADER_H\n"
3441                    "code();\n"
3442                    "#endif",
3443                    Style));
3444   // FIXME: This does not detect when there is a single non-preprocessor line
3445   // in front of an include-guard-like structure where other conditions hold
3446   // because ScopedLineState hides the line.
3447   EXPECT_EQ("code();\n"
3448             "#ifndef HEADER_H\n"
3449             "#define HEADER_H\n"
3450             "code();\n"
3451             "#endif",
3452             format("code();\n"
3453                    "#ifndef HEADER_H\n"
3454                    "#  define HEADER_H\n"
3455                    "code();\n"
3456                    "#endif",
3457                    Style));
3458   // Keep comments aligned with #, otherwise indent comments normally. These
3459   // tests cannot use verifyFormat because messUp manipulates leading
3460   // whitespace.
3461   {
3462     const char *Expected = ""
3463                            "void f() {\n"
3464                            "#if 1\n"
3465                            "// Preprocessor aligned.\n"
3466                            "#  define A 0\n"
3467                            "  // Code. Separated by blank line.\n"
3468                            "\n"
3469                            "#  define B 0\n"
3470                            "  // Code. Not aligned with #\n"
3471                            "#  define C 0\n"
3472                            "#endif";
3473     const char *ToFormat = ""
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     EXPECT_EQ(Expected, format(ToFormat, Style));
3485     EXPECT_EQ(Expected, format(Expected, Style));
3486   }
3487   // Keep block quotes aligned.
3488   {
3489     const char *Expected = ""
3490                            "void f() {\n"
3491                            "#if 1\n"
3492                            "/* Preprocessor aligned. */\n"
3493                            "#  define A 0\n"
3494                            "  /* Code. Separated by blank line. */\n"
3495                            "\n"
3496                            "#  define B 0\n"
3497                            "  /* Code. Not aligned with # */\n"
3498                            "#  define C 0\n"
3499                            "#endif";
3500     const char *ToFormat = ""
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     EXPECT_EQ(Expected, format(ToFormat, Style));
3512     EXPECT_EQ(Expected, format(Expected, Style));
3513   }
3514   // Keep comments aligned with un-indented directives.
3515   {
3516     const char *Expected = ""
3517                            "void f() {\n"
3518                            "// Preprocessor aligned.\n"
3519                            "#define A 0\n"
3520                            "  // Code. Separated by blank line.\n"
3521                            "\n"
3522                            "#define B 0\n"
3523                            "  // Code. Not aligned with #\n"
3524                            "#define C 0\n";
3525     const char *ToFormat = ""
3526                            "void f() {\n"
3527                            "// Preprocessor aligned.\n"
3528                            "#define A 0\n"
3529                            "// Code. Separated by blank line.\n"
3530                            "\n"
3531                            "#define B 0\n"
3532                            "   // Code. Not aligned with #\n"
3533                            "#define C 0\n";
3534     EXPECT_EQ(Expected, format(ToFormat, Style));
3535     EXPECT_EQ(Expected, format(Expected, Style));
3536   }
3537   // Test AfterHash with tabs.
3538   {
3539     FormatStyle Tabbed = Style;
3540     Tabbed.UseTab = FormatStyle::UT_Always;
3541     Tabbed.IndentWidth = 8;
3542     Tabbed.TabWidth = 8;
3543     verifyFormat("#ifdef _WIN32\n"
3544                  "#\tdefine A 0\n"
3545                  "#\tifdef VAR2\n"
3546                  "#\t\tdefine B 1\n"
3547                  "#\t\tinclude <someheader.h>\n"
3548                  "#\t\tdefine MACRO          \\\n"
3549                  "\t\t\tsome_very_long_func_aaaaaaaaaa();\n"
3550                  "#\tendif\n"
3551                  "#else\n"
3552                  "#\tdefine A 1\n"
3553                  "#endif",
3554                  Tabbed);
3555   }
3556 
3557   // Regression test: Multiline-macro inside include guards.
3558   verifyFormat("#ifndef HEADER_H\n"
3559                "#define HEADER_H\n"
3560                "#define A()        \\\n"
3561                "  int i;           \\\n"
3562                "  int j;\n"
3563                "#endif // HEADER_H",
3564                getLLVMStyleWithColumns(20));
3565 
3566   Style.IndentPPDirectives = FormatStyle::PPDIS_BeforeHash;
3567   // Basic before hash indent tests
3568   verifyFormat("#ifdef _WIN32\n"
3569                "  #define A 0\n"
3570                "  #ifdef VAR2\n"
3571                "    #define B 1\n"
3572                "    #include <someheader.h>\n"
3573                "    #define MACRO                      \\\n"
3574                "      some_very_long_func_aaaaaaaaaa();\n"
3575                "  #endif\n"
3576                "#else\n"
3577                "  #define A 1\n"
3578                "#endif",
3579                Style);
3580   verifyFormat("#if A\n"
3581                "  #define MACRO                        \\\n"
3582                "    void a(int x) {                    \\\n"
3583                "      b();                             \\\n"
3584                "      c();                             \\\n"
3585                "      d();                             \\\n"
3586                "      e();                             \\\n"
3587                "      f();                             \\\n"
3588                "    }\n"
3589                "#endif",
3590                Style);
3591   // Keep comments aligned with indented directives. These
3592   // tests cannot use verifyFormat because messUp manipulates leading
3593   // whitespace.
3594   {
3595     const char *Expected = "void f() {\n"
3596                            "// Aligned to preprocessor.\n"
3597                            "#if 1\n"
3598                            "  // Aligned to code.\n"
3599                            "  int a;\n"
3600                            "  #if 1\n"
3601                            "    // Aligned to preprocessor.\n"
3602                            "    #define A 0\n"
3603                            "  // Aligned to code.\n"
3604                            "  int b;\n"
3605                            "  #endif\n"
3606                            "#endif\n"
3607                            "}";
3608     const char *ToFormat = "void f() {\n"
3609                            "// Aligned to preprocessor.\n"
3610                            "#if 1\n"
3611                            "// Aligned to code.\n"
3612                            "int a;\n"
3613                            "#if 1\n"
3614                            "// Aligned to preprocessor.\n"
3615                            "#define A 0\n"
3616                            "// Aligned to code.\n"
3617                            "int b;\n"
3618                            "#endif\n"
3619                            "#endif\n"
3620                            "}";
3621     EXPECT_EQ(Expected, format(ToFormat, Style));
3622     EXPECT_EQ(Expected, format(Expected, Style));
3623   }
3624   {
3625     const char *Expected = "void f() {\n"
3626                            "/* Aligned to preprocessor. */\n"
3627                            "#if 1\n"
3628                            "  /* Aligned to code. */\n"
3629                            "  int a;\n"
3630                            "  #if 1\n"
3631                            "    /* Aligned to preprocessor. */\n"
3632                            "    #define A 0\n"
3633                            "  /* Aligned to code. */\n"
3634                            "  int b;\n"
3635                            "  #endif\n"
3636                            "#endif\n"
3637                            "}";
3638     const char *ToFormat = "void f() {\n"
3639                            "/* Aligned to preprocessor. */\n"
3640                            "#if 1\n"
3641                            "/* Aligned to code. */\n"
3642                            "int a;\n"
3643                            "#if 1\n"
3644                            "/* Aligned to preprocessor. */\n"
3645                            "#define A 0\n"
3646                            "/* Aligned to code. */\n"
3647                            "int b;\n"
3648                            "#endif\n"
3649                            "#endif\n"
3650                            "}";
3651     EXPECT_EQ(Expected, format(ToFormat, Style));
3652     EXPECT_EQ(Expected, format(Expected, Style));
3653   }
3654 
3655   // Test single comment before preprocessor
3656   verifyFormat("// Comment\n"
3657                "\n"
3658                "#if 1\n"
3659                "#endif",
3660                Style);
3661 }
3662 
3663 TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) {
3664   verifyFormat("{\n  { a #c; }\n}");
3665 }
3666 
3667 TEST_F(FormatTest, FormatUnbalancedStructuralElements) {
3668   EXPECT_EQ("#define A \\\n  {       \\\n    {\nint i;",
3669             format("#define A { {\nint i;", getLLVMStyleWithColumns(11)));
3670   EXPECT_EQ("#define A \\\n  }       \\\n  }\nint i;",
3671             format("#define A } }\nint i;", getLLVMStyleWithColumns(11)));
3672 }
3673 
3674 TEST_F(FormatTest, EscapedNewlines) {
3675   FormatStyle Narrow = getLLVMStyleWithColumns(11);
3676   EXPECT_EQ("#define A \\\n  int i;  \\\n  int j;",
3677             format("#define A \\\nint i;\\\n  int j;", Narrow));
3678   EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;"));
3679   EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
3680   EXPECT_EQ("/* \\  \\  \\\n */", format("\\\n/* \\  \\  \\\n */"));
3681   EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>"));
3682 
3683   FormatStyle AlignLeft = getLLVMStyle();
3684   AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
3685   EXPECT_EQ("#define MACRO(x) \\\n"
3686             "private:         \\\n"
3687             "  int x(int a);\n",
3688             format("#define MACRO(x) \\\n"
3689                    "private:         \\\n"
3690                    "  int x(int a);\n",
3691                    AlignLeft));
3692 
3693   // CRLF line endings
3694   EXPECT_EQ("#define A \\\r\n  int i;  \\\r\n  int j;",
3695             format("#define A \\\r\nint i;\\\r\n  int j;", Narrow));
3696   EXPECT_EQ("#define A\r\n\r\nint i;", format("#define A \\\r\n\r\n int i;"));
3697   EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
3698   EXPECT_EQ("/* \\  \\  \\\r\n */", format("\\\r\n/* \\  \\  \\\r\n */"));
3699   EXPECT_EQ("<a\r\n\\\\\r\n>", format("<a\r\n\\\\\r\n>"));
3700   EXPECT_EQ("#define MACRO(x) \\\r\n"
3701             "private:         \\\r\n"
3702             "  int x(int a);\r\n",
3703             format("#define MACRO(x) \\\r\n"
3704                    "private:         \\\r\n"
3705                    "  int x(int a);\r\n",
3706                    AlignLeft));
3707 
3708   FormatStyle DontAlign = getLLVMStyle();
3709   DontAlign.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
3710   DontAlign.MaxEmptyLinesToKeep = 3;
3711   // FIXME: can't use verifyFormat here because the newline before
3712   // "public:" is not inserted the first time it's reformatted
3713   EXPECT_EQ("#define A \\\n"
3714             "  class Foo { \\\n"
3715             "    void bar(); \\\n"
3716             "\\\n"
3717             "\\\n"
3718             "\\\n"
3719             "  public: \\\n"
3720             "    void baz(); \\\n"
3721             "  };",
3722             format("#define A \\\n"
3723                    "  class Foo { \\\n"
3724                    "    void bar(); \\\n"
3725                    "\\\n"
3726                    "\\\n"
3727                    "\\\n"
3728                    "  public: \\\n"
3729                    "    void baz(); \\\n"
3730                    "  };",
3731                    DontAlign));
3732 }
3733 
3734 TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) {
3735   verifyFormat("#define A \\\n"
3736                "  int v(  \\\n"
3737                "      a); \\\n"
3738                "  int i;",
3739                getLLVMStyleWithColumns(11));
3740 }
3741 
3742 TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) {
3743   EXPECT_EQ(
3744       "#define ALooooooooooooooooooooooooooooooooooooooongMacro("
3745       "                      \\\n"
3746       "    aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
3747       "\n"
3748       "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
3749       "    aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n",
3750       format("  #define   ALooooooooooooooooooooooooooooooooooooooongMacro("
3751              "\\\n"
3752              "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
3753              "  \n"
3754              "   AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
3755              "  aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n"));
3756 }
3757 
3758 TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) {
3759   EXPECT_EQ("int\n"
3760             "#define A\n"
3761             "    a;",
3762             format("int\n#define A\na;"));
3763   verifyFormat("functionCallTo(\n"
3764                "    someOtherFunction(\n"
3765                "        withSomeParameters, whichInSequence,\n"
3766                "        areLongerThanALine(andAnotherCall,\n"
3767                "#define A B\n"
3768                "                           withMoreParamters,\n"
3769                "                           whichStronglyInfluenceTheLayout),\n"
3770                "        andMoreParameters),\n"
3771                "    trailing);",
3772                getLLVMStyleWithColumns(69));
3773   verifyFormat("Foo::Foo()\n"
3774                "#ifdef BAR\n"
3775                "    : baz(0)\n"
3776                "#endif\n"
3777                "{\n"
3778                "}");
3779   verifyFormat("void f() {\n"
3780                "  if (true)\n"
3781                "#ifdef A\n"
3782                "    f(42);\n"
3783                "  x();\n"
3784                "#else\n"
3785                "    g();\n"
3786                "  x();\n"
3787                "#endif\n"
3788                "}");
3789   verifyFormat("void f(param1, param2,\n"
3790                "       param3,\n"
3791                "#ifdef A\n"
3792                "       param4(param5,\n"
3793                "#ifdef A1\n"
3794                "              param6,\n"
3795                "#ifdef A2\n"
3796                "              param7),\n"
3797                "#else\n"
3798                "              param8),\n"
3799                "       param9,\n"
3800                "#endif\n"
3801                "       param10,\n"
3802                "#endif\n"
3803                "       param11)\n"
3804                "#else\n"
3805                "       param12)\n"
3806                "#endif\n"
3807                "{\n"
3808                "  x();\n"
3809                "}",
3810                getLLVMStyleWithColumns(28));
3811   verifyFormat("#if 1\n"
3812                "int i;");
3813   verifyFormat("#if 1\n"
3814                "#endif\n"
3815                "#if 1\n"
3816                "#else\n"
3817                "#endif\n");
3818   verifyFormat("DEBUG({\n"
3819                "  return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3820                "         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
3821                "});\n"
3822                "#if a\n"
3823                "#else\n"
3824                "#endif");
3825 
3826   verifyIncompleteFormat("void f(\n"
3827                          "#if A\n"
3828                          ");\n"
3829                          "#else\n"
3830                          "#endif");
3831 }
3832 
3833 TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) {
3834   verifyFormat("#endif\n"
3835                "#if B");
3836 }
3837 
3838 TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) {
3839   FormatStyle SingleLine = getLLVMStyle();
3840   SingleLine.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_WithoutElse;
3841   verifyFormat("#if 0\n"
3842                "#elif 1\n"
3843                "#endif\n"
3844                "void foo() {\n"
3845                "  if (test) foo2();\n"
3846                "}",
3847                SingleLine);
3848 }
3849 
3850 TEST_F(FormatTest, LayoutBlockInsideParens) {
3851   verifyFormat("functionCall({ int i; });");
3852   verifyFormat("functionCall({\n"
3853                "  int i;\n"
3854                "  int j;\n"
3855                "});");
3856   verifyFormat("functionCall(\n"
3857                "    {\n"
3858                "      int i;\n"
3859                "      int j;\n"
3860                "    },\n"
3861                "    aaaa, bbbb, cccc);");
3862   verifyFormat("functionA(functionB({\n"
3863                "            int i;\n"
3864                "            int j;\n"
3865                "          }),\n"
3866                "          aaaa, bbbb, cccc);");
3867   verifyFormat("functionCall(\n"
3868                "    {\n"
3869                "      int i;\n"
3870                "      int j;\n"
3871                "    },\n"
3872                "    aaaa, bbbb, // comment\n"
3873                "    cccc);");
3874   verifyFormat("functionA(functionB({\n"
3875                "            int i;\n"
3876                "            int j;\n"
3877                "          }),\n"
3878                "          aaaa, bbbb, // comment\n"
3879                "          cccc);");
3880   verifyFormat("functionCall(aaaa, bbbb, { int i; });");
3881   verifyFormat("functionCall(aaaa, bbbb, {\n"
3882                "  int i;\n"
3883                "  int j;\n"
3884                "});");
3885   verifyFormat(
3886       "Aaa(\n" // FIXME: There shouldn't be a linebreak here.
3887       "    {\n"
3888       "      int i; // break\n"
3889       "    },\n"
3890       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
3891       "                                     ccccccccccccccccc));");
3892   verifyFormat("DEBUG({\n"
3893                "  if (a)\n"
3894                "    f();\n"
3895                "});");
3896 }
3897 
3898 TEST_F(FormatTest, LayoutBlockInsideStatement) {
3899   EXPECT_EQ("SOME_MACRO { int i; }\n"
3900             "int i;",
3901             format("  SOME_MACRO  {int i;}  int i;"));
3902 }
3903 
3904 TEST_F(FormatTest, LayoutNestedBlocks) {
3905   verifyFormat("void AddOsStrings(unsigned bitmask) {\n"
3906                "  struct s {\n"
3907                "    int i;\n"
3908                "  };\n"
3909                "  s kBitsToOs[] = {{10}};\n"
3910                "  for (int i = 0; i < 10; ++i)\n"
3911                "    return;\n"
3912                "}");
3913   verifyFormat("call(parameter, {\n"
3914                "  something();\n"
3915                "  // Comment using all columns.\n"
3916                "  somethingelse();\n"
3917                "});",
3918                getLLVMStyleWithColumns(40));
3919   verifyFormat("DEBUG( //\n"
3920                "    { f(); }, a);");
3921   verifyFormat("DEBUG( //\n"
3922                "    {\n"
3923                "      f(); //\n"
3924                "    },\n"
3925                "    a);");
3926 
3927   EXPECT_EQ("call(parameter, {\n"
3928             "  something();\n"
3929             "  // Comment too\n"
3930             "  // looooooooooong.\n"
3931             "  somethingElse();\n"
3932             "});",
3933             format("call(parameter, {\n"
3934                    "  something();\n"
3935                    "  // Comment too looooooooooong.\n"
3936                    "  somethingElse();\n"
3937                    "});",
3938                    getLLVMStyleWithColumns(29)));
3939   EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int   i; });"));
3940   EXPECT_EQ("DEBUG({ // comment\n"
3941             "  int i;\n"
3942             "});",
3943             format("DEBUG({ // comment\n"
3944                    "int  i;\n"
3945                    "});"));
3946   EXPECT_EQ("DEBUG({\n"
3947             "  int i;\n"
3948             "\n"
3949             "  // comment\n"
3950             "  int j;\n"
3951             "});",
3952             format("DEBUG({\n"
3953                    "  int  i;\n"
3954                    "\n"
3955                    "  // comment\n"
3956                    "  int  j;\n"
3957                    "});"));
3958 
3959   verifyFormat("DEBUG({\n"
3960                "  if (a)\n"
3961                "    return;\n"
3962                "});");
3963   verifyGoogleFormat("DEBUG({\n"
3964                      "  if (a) return;\n"
3965                      "});");
3966   FormatStyle Style = getGoogleStyle();
3967   Style.ColumnLimit = 45;
3968   verifyFormat("Debug(\n"
3969                "    aaaaa,\n"
3970                "    {\n"
3971                "      if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n"
3972                "    },\n"
3973                "    a);",
3974                Style);
3975 
3976   verifyFormat("SomeFunction({MACRO({ return output; }), b});");
3977 
3978   verifyNoCrash("^{v^{a}}");
3979 }
3980 
3981 TEST_F(FormatTest, FormatNestedBlocksInMacros) {
3982   EXPECT_EQ("#define MACRO()                     \\\n"
3983             "  Debug(aaa, /* force line break */ \\\n"
3984             "        {                           \\\n"
3985             "          int i;                    \\\n"
3986             "          int j;                    \\\n"
3987             "        })",
3988             format("#define   MACRO()   Debug(aaa,  /* force line break */ \\\n"
3989                    "          {  int   i;  int  j;   })",
3990                    getGoogleStyle()));
3991 
3992   EXPECT_EQ("#define A                                       \\\n"
3993             "  [] {                                          \\\n"
3994             "    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx(        \\\n"
3995             "        xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n"
3996             "  }",
3997             format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3998                    "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }",
3999                    getGoogleStyle()));
4000 }
4001 
4002 TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) {
4003   EXPECT_EQ("{}", format("{}"));
4004   verifyFormat("enum E {};");
4005   verifyFormat("enum E {}");
4006   FormatStyle Style = getLLVMStyle();
4007   Style.SpaceInEmptyBlock = true;
4008   EXPECT_EQ("void f() { }", format("void f() {}", Style));
4009   Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Empty;
4010   EXPECT_EQ("while (true) { }", format("while (true) {}", Style));
4011 }
4012 
4013 TEST_F(FormatTest, FormatBeginBlockEndMacros) {
4014   FormatStyle Style = getLLVMStyle();
4015   Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$";
4016   Style.MacroBlockEnd = "^[A-Z_]+_END$";
4017   verifyFormat("FOO_BEGIN\n"
4018                "  FOO_ENTRY\n"
4019                "FOO_END",
4020                Style);
4021   verifyFormat("FOO_BEGIN\n"
4022                "  NESTED_FOO_BEGIN\n"
4023                "    NESTED_FOO_ENTRY\n"
4024                "  NESTED_FOO_END\n"
4025                "FOO_END",
4026                Style);
4027   verifyFormat("FOO_BEGIN(Foo, Bar)\n"
4028                "  int x;\n"
4029                "  x = 1;\n"
4030                "FOO_END(Baz)",
4031                Style);
4032 }
4033 
4034 //===----------------------------------------------------------------------===//
4035 // Line break tests.
4036 //===----------------------------------------------------------------------===//
4037 
4038 TEST_F(FormatTest, PreventConfusingIndents) {
4039   verifyFormat(
4040       "void f() {\n"
4041       "  SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
4042       "                         parameter, parameter, parameter)),\n"
4043       "                     SecondLongCall(parameter));\n"
4044       "}");
4045   verifyFormat(
4046       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4047       "    aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4048       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4049       "    aaaaaaaaaaaaaaaaaaaaaaaa);");
4050   verifyFormat(
4051       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4052       "    [aaaaaaaaaaaaaaaaaaaaaaaa\n"
4053       "         [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
4054       "         [aaaaaaaaaaaaaaaaaaaaaaaa]];");
4055   verifyFormat(
4056       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
4057       "    aaaaaaaaaaaaaaaaaaaaaaaa<\n"
4058       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n"
4059       "    aaaaaaaaaaaaaaaaaaaaaaaa>;");
4060   verifyFormat("int a = bbbb && ccc &&\n"
4061                "        fffff(\n"
4062                "#define A Just forcing a new line\n"
4063                "            ddd);");
4064 }
4065 
4066 TEST_F(FormatTest, LineBreakingInBinaryExpressions) {
4067   verifyFormat(
4068       "bool aaaaaaa =\n"
4069       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n"
4070       "    bbbbbbbb();");
4071   verifyFormat(
4072       "bool aaaaaaa =\n"
4073       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n"
4074       "    bbbbbbbb();");
4075 
4076   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
4077                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n"
4078                "    ccccccccc == ddddddddddd;");
4079   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
4080                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n"
4081                "    ccccccccc == ddddddddddd;");
4082   verifyFormat(
4083       "bool aaaaaaaaaaaaaaaaaaaaa =\n"
4084       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n"
4085       "    ccccccccc == ddddddddddd;");
4086 
4087   verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
4088                "                 aaaaaa) &&\n"
4089                "         bbbbbb && cccccc;");
4090   verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
4091                "                 aaaaaa) >>\n"
4092                "         bbbbbb;");
4093   verifyFormat("aa = Whitespaces.addUntouchableComment(\n"
4094                "    SourceMgr.getSpellingColumnNumber(\n"
4095                "        TheLine.Last->FormatTok.Tok.getLocation()) -\n"
4096                "    1);");
4097 
4098   verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4099                "     bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n"
4100                "    cccccc) {\n}");
4101   verifyFormat("if constexpr ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4102                "               bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n"
4103                "              cccccc) {\n}");
4104   verifyFormat("if CONSTEXPR ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4105                "               bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n"
4106                "              cccccc) {\n}");
4107   verifyFormat("b = a &&\n"
4108                "    // Comment\n"
4109                "    b.c && d;");
4110 
4111   // If the LHS of a comparison is not a binary expression itself, the
4112   // additional linebreak confuses many people.
4113   verifyFormat(
4114       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4115       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n"
4116       "}");
4117   verifyFormat(
4118       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4119       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
4120       "}");
4121   verifyFormat(
4122       "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n"
4123       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
4124       "}");
4125   verifyFormat(
4126       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4127       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) <=> 5) {\n"
4128       "}");
4129   // Even explicit parentheses stress the precedence enough to make the
4130   // additional break unnecessary.
4131   verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4132                "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
4133                "}");
4134   // This cases is borderline, but with the indentation it is still readable.
4135   verifyFormat(
4136       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4137       "        aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4138       "                               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
4139       "}",
4140       getLLVMStyleWithColumns(75));
4141 
4142   // If the LHS is a binary expression, we should still use the additional break
4143   // as otherwise the formatting hides the operator precedence.
4144   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4145                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4146                "    5) {\n"
4147                "}");
4148   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4149                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa <=>\n"
4150                "    5) {\n"
4151                "}");
4152 
4153   FormatStyle OnePerLine = getLLVMStyle();
4154   OnePerLine.BinPackParameters = false;
4155   verifyFormat(
4156       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4157       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4158       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}",
4159       OnePerLine);
4160 
4161   verifyFormat("int i = someFunction(aaaaaaa, 0)\n"
4162                "                .aaa(aaaaaaaaaaaaa) *\n"
4163                "            aaaaaaa +\n"
4164                "        aaaaaaa;",
4165                getLLVMStyleWithColumns(40));
4166 }
4167 
4168 TEST_F(FormatTest, ExpressionIndentation) {
4169   verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4170                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4171                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4172                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4173                "                         bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
4174                "                     bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n"
4175                "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4176                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n"
4177                "                 ccccccccccccccccccccccccccccccccccccccccc;");
4178   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4179                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4180                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4181                "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
4182   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4183                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4184                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4185                "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
4186   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
4187                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
4188                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4189                "        bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
4190   verifyFormat("if () {\n"
4191                "} else if (aaaaa && bbbbb > // break\n"
4192                "                        ccccc) {\n"
4193                "}");
4194   verifyFormat("if () {\n"
4195                "} else if constexpr (aaaaa && bbbbb > // break\n"
4196                "                                  ccccc) {\n"
4197                "}");
4198   verifyFormat("if () {\n"
4199                "} else if CONSTEXPR (aaaaa && bbbbb > // break\n"
4200                "                                  ccccc) {\n"
4201                "}");
4202   verifyFormat("if () {\n"
4203                "} else if (aaaaa &&\n"
4204                "           bbbbb > // break\n"
4205                "               ccccc &&\n"
4206                "           ddddd) {\n"
4207                "}");
4208 
4209   // Presence of a trailing comment used to change indentation of b.
4210   verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n"
4211                "       b;\n"
4212                "return aaaaaaaaaaaaaaaaaaa +\n"
4213                "       b; //",
4214                getLLVMStyleWithColumns(30));
4215 }
4216 
4217 TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) {
4218   // Not sure what the best system is here. Like this, the LHS can be found
4219   // immediately above an operator (everything with the same or a higher
4220   // indent). The RHS is aligned right of the operator and so compasses
4221   // everything until something with the same indent as the operator is found.
4222   // FIXME: Is this a good system?
4223   FormatStyle Style = getLLVMStyle();
4224   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
4225   verifyFormat(
4226       "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4227       "                     + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4228       "                     + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4229       "                 == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4230       "                            * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4231       "                        + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4232       "             && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4233       "                        * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4234       "                    > ccccccccccccccccccccccccccccccccccccccccc;",
4235       Style);
4236   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4237                "            * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4238                "        + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4239                "    == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
4240                Style);
4241   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4242                "        + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4243                "              * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4244                "    == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
4245                Style);
4246   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4247                "    == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4248                "               * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4249                "           + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
4250                Style);
4251   verifyFormat("if () {\n"
4252                "} else if (aaaaa\n"
4253                "           && bbbbb // break\n"
4254                "                  > ccccc) {\n"
4255                "}",
4256                Style);
4257   verifyFormat("return (a)\n"
4258                "       // comment\n"
4259                "       + b;",
4260                Style);
4261   verifyFormat(
4262       "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4263       "                 * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4264       "             + cc;",
4265       Style);
4266 
4267   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4268                "    = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4269                Style);
4270 
4271   // Forced by comments.
4272   verifyFormat(
4273       "unsigned ContentSize =\n"
4274       "    sizeof(int16_t)   // DWARF ARange version number\n"
4275       "    + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
4276       "    + sizeof(int8_t)  // Pointer Size (in bytes)\n"
4277       "    + sizeof(int8_t); // Segment Size (in bytes)");
4278 
4279   verifyFormat("return boost::fusion::at_c<0>(iiii).second\n"
4280                "       == boost::fusion::at_c<1>(iiii).second;",
4281                Style);
4282 
4283   Style.ColumnLimit = 60;
4284   verifyFormat("zzzzzzzzzz\n"
4285                "    = bbbbbbbbbbbbbbbbb\n"
4286                "      >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);",
4287                Style);
4288 
4289   Style.ColumnLimit = 80;
4290   Style.IndentWidth = 4;
4291   Style.TabWidth = 4;
4292   Style.UseTab = FormatStyle::UT_Always;
4293   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
4294   Style.AlignOperands = false;
4295   EXPECT_EQ("return someVeryVeryLongConditionThatBarelyFitsOnALine\n"
4296             "\t&& (someOtherLongishConditionPart1\n"
4297             "\t\t|| someOtherEvenLongerNestedConditionPart2);",
4298             format("return someVeryVeryLongConditionThatBarelyFitsOnALine && "
4299                    "(someOtherLongishConditionPart1 || "
4300                    "someOtherEvenLongerNestedConditionPart2);",
4301                    Style));
4302 }
4303 
4304 TEST_F(FormatTest, EnforcedOperatorWraps) {
4305   // Here we'd like to wrap after the || operators, but a comment is forcing an
4306   // earlier wrap.
4307   verifyFormat("bool x = aaaaa //\n"
4308                "         || bbbbb\n"
4309                "         //\n"
4310                "         || cccc;");
4311 }
4312 
4313 TEST_F(FormatTest, NoOperandAlignment) {
4314   FormatStyle Style = getLLVMStyle();
4315   Style.AlignOperands = false;
4316   verifyFormat("aaaaaaaaaaaaaa(aaaaaaaaaaaa,\n"
4317                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4318                "                   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4319                Style);
4320   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
4321   verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4322                "            + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4323                "            + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4324                "        == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4325                "                * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4326                "            + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4327                "    && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4328                "            * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4329                "        > ccccccccccccccccccccccccccccccccccccccccc;",
4330                Style);
4331 
4332   verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4333                "        * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4334                "    + cc;",
4335                Style);
4336   verifyFormat("int a = aa\n"
4337                "    + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
4338                "        * cccccccccccccccccccccccccccccccccccc;\n",
4339                Style);
4340 
4341   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
4342   verifyFormat("return (a > b\n"
4343                "    // comment1\n"
4344                "    // comment2\n"
4345                "    || c);",
4346                Style);
4347 }
4348 
4349 TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) {
4350   FormatStyle Style = getLLVMStyle();
4351   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
4352   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4353                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4354                "    + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
4355                Style);
4356 }
4357 
4358 TEST_F(FormatTest, AllowBinPackingInsideArguments) {
4359   FormatStyle Style = getLLVMStyle();
4360   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
4361   Style.BinPackArguments = false;
4362   Style.ColumnLimit = 40;
4363   verifyFormat("void test() {\n"
4364                "  someFunction(\n"
4365                "      this + argument + is + quite\n"
4366                "      + long + so + it + gets + wrapped\n"
4367                "      + but + remains + bin - packed);\n"
4368                "}",
4369                Style);
4370   verifyFormat("void test() {\n"
4371                "  someFunction(arg1,\n"
4372                "               this + argument + is\n"
4373                "                   + quite + long + so\n"
4374                "                   + it + gets + wrapped\n"
4375                "                   + but + remains + bin\n"
4376                "                   - packed,\n"
4377                "               arg3);\n"
4378                "}",
4379                Style);
4380   verifyFormat("void test() {\n"
4381                "  someFunction(\n"
4382                "      arg1,\n"
4383                "      this + argument + has\n"
4384                "          + anotherFunc(nested,\n"
4385                "                        calls + whose\n"
4386                "                            + arguments\n"
4387                "                            + are + also\n"
4388                "                            + wrapped,\n"
4389                "                        in + addition)\n"
4390                "          + to + being + bin - packed,\n"
4391                "      arg3);\n"
4392                "}",
4393                Style);
4394 
4395   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
4396   verifyFormat("void test() {\n"
4397                "  someFunction(\n"
4398                "      arg1,\n"
4399                "      this + argument + has +\n"
4400                "          anotherFunc(nested,\n"
4401                "                      calls + whose +\n"
4402                "                          arguments +\n"
4403                "                          are + also +\n"
4404                "                          wrapped,\n"
4405                "                      in + addition) +\n"
4406                "          to + being + bin - packed,\n"
4407                "      arg3);\n"
4408                "}",
4409                Style);
4410 }
4411 
4412 TEST_F(FormatTest, ConstructorInitializers) {
4413   verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
4414   verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}",
4415                getLLVMStyleWithColumns(45));
4416   verifyFormat("Constructor()\n"
4417                "    : Inttializer(FitsOnTheLine) {}",
4418                getLLVMStyleWithColumns(44));
4419   verifyFormat("Constructor()\n"
4420                "    : Inttializer(FitsOnTheLine) {}",
4421                getLLVMStyleWithColumns(43));
4422 
4423   verifyFormat("template <typename T>\n"
4424                "Constructor() : Initializer(FitsOnTheLine) {}",
4425                getLLVMStyleWithColumns(45));
4426 
4427   verifyFormat(
4428       "SomeClass::Constructor()\n"
4429       "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
4430 
4431   verifyFormat(
4432       "SomeClass::Constructor()\n"
4433       "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4434       "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}");
4435   verifyFormat(
4436       "SomeClass::Constructor()\n"
4437       "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4438       "      aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
4439   verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4440                "            aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4441                "    : aaaaaaaaaa(aaaaaa) {}");
4442 
4443   verifyFormat("Constructor()\n"
4444                "    : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4445                "      aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4446                "                               aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4447                "      aaaaaaaaaaaaaaaaaaaaaaa() {}");
4448 
4449   verifyFormat("Constructor()\n"
4450                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4451                "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
4452 
4453   verifyFormat("Constructor(int Parameter = 0)\n"
4454                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
4455                "      aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}");
4456   verifyFormat("Constructor()\n"
4457                "    : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
4458                "}",
4459                getLLVMStyleWithColumns(60));
4460   verifyFormat("Constructor()\n"
4461                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4462                "          aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}");
4463 
4464   // Here a line could be saved by splitting the second initializer onto two
4465   // lines, but that is not desirable.
4466   verifyFormat("Constructor()\n"
4467                "    : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
4468                "      aaaaaaaaaaa(aaaaaaaaaaa),\n"
4469                "      aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
4470 
4471   FormatStyle OnePerLine = getLLVMStyle();
4472   OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
4473   OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
4474   verifyFormat("SomeClass::Constructor()\n"
4475                "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4476                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4477                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
4478                OnePerLine);
4479   verifyFormat("SomeClass::Constructor()\n"
4480                "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
4481                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4482                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
4483                OnePerLine);
4484   verifyFormat("MyClass::MyClass(int var)\n"
4485                "    : some_var_(var),            // 4 space indent\n"
4486                "      some_other_var_(var + 1) { // lined up\n"
4487                "}",
4488                OnePerLine);
4489   verifyFormat("Constructor()\n"
4490                "    : aaaaa(aaaaaa),\n"
4491                "      aaaaa(aaaaaa),\n"
4492                "      aaaaa(aaaaaa),\n"
4493                "      aaaaa(aaaaaa),\n"
4494                "      aaaaa(aaaaaa) {}",
4495                OnePerLine);
4496   verifyFormat("Constructor()\n"
4497                "    : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
4498                "            aaaaaaaaaaaaaaaaaaaaaa) {}",
4499                OnePerLine);
4500   OnePerLine.BinPackParameters = false;
4501   verifyFormat(
4502       "Constructor()\n"
4503       "    : aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4504       "          aaaaaaaaaaa().aaa(),\n"
4505       "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4506       OnePerLine);
4507   OnePerLine.ColumnLimit = 60;
4508   verifyFormat("Constructor()\n"
4509                "    : aaaaaaaaaaaaaaaaaaaa(a),\n"
4510                "      bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
4511                OnePerLine);
4512 
4513   EXPECT_EQ("Constructor()\n"
4514             "    : // Comment forcing unwanted break.\n"
4515             "      aaaa(aaaa) {}",
4516             format("Constructor() :\n"
4517                    "    // Comment forcing unwanted break.\n"
4518                    "    aaaa(aaaa) {}"));
4519 }
4520 
4521 TEST_F(FormatTest, AllowAllConstructorInitializersOnNextLine) {
4522   FormatStyle Style = getLLVMStyle();
4523   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
4524   Style.ColumnLimit = 60;
4525   Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
4526   Style.AllowAllConstructorInitializersOnNextLine = true;
4527   Style.BinPackParameters = false;
4528 
4529   for (int i = 0; i < 4; ++i) {
4530     // Test all combinations of parameters that should not have an effect.
4531     Style.AllowAllParametersOfDeclarationOnNextLine = i & 1;
4532     Style.AllowAllArgumentsOnNextLine = i & 2;
4533 
4534     Style.AllowAllConstructorInitializersOnNextLine = true;
4535     Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
4536     verifyFormat("Constructor()\n"
4537                  "    : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4538                  Style);
4539     verifyFormat("Constructor() : a(a), b(b) {}", Style);
4540 
4541     Style.AllowAllConstructorInitializersOnNextLine = false;
4542     verifyFormat("Constructor()\n"
4543                  "    : aaaaaaaaaaaaaaaaaaaa(a)\n"
4544                  "    , bbbbbbbbbbbbbbbbbbbbb(b) {}",
4545                  Style);
4546     verifyFormat("Constructor() : a(a), b(b) {}", Style);
4547 
4548     Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
4549     Style.AllowAllConstructorInitializersOnNextLine = true;
4550     verifyFormat("Constructor()\n"
4551                  "    : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4552                  Style);
4553 
4554     Style.AllowAllConstructorInitializersOnNextLine = false;
4555     verifyFormat("Constructor()\n"
4556                  "    : aaaaaaaaaaaaaaaaaaaa(a),\n"
4557                  "      bbbbbbbbbbbbbbbbbbbbb(b) {}",
4558                  Style);
4559 
4560     Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
4561     Style.AllowAllConstructorInitializersOnNextLine = true;
4562     verifyFormat("Constructor() :\n"
4563                  "    aaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4564                  Style);
4565 
4566     Style.AllowAllConstructorInitializersOnNextLine = false;
4567     verifyFormat("Constructor() :\n"
4568                  "    aaaaaaaaaaaaaaaaaa(a),\n"
4569                  "    bbbbbbbbbbbbbbbbbbbbb(b) {}",
4570                  Style);
4571   }
4572 
4573   // Test interactions between AllowAllParametersOfDeclarationOnNextLine and
4574   // AllowAllConstructorInitializersOnNextLine in all
4575   // BreakConstructorInitializers modes
4576   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
4577   Style.AllowAllParametersOfDeclarationOnNextLine = true;
4578   Style.AllowAllConstructorInitializersOnNextLine = false;
4579   verifyFormat("SomeClassWithALongName::Constructor(\n"
4580                "    int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb)\n"
4581                "    : aaaaaaaaaaaaaaaaaaaa(a)\n"
4582                "    , bbbbbbbbbbbbbbbbbbbbb(b) {}",
4583                Style);
4584 
4585   Style.AllowAllConstructorInitializersOnNextLine = true;
4586   verifyFormat("SomeClassWithALongName::Constructor(\n"
4587                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4588                "    int bbbbbbbbbbbbb,\n"
4589                "    int cccccccccccccccc)\n"
4590                "    : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4591                Style);
4592 
4593   Style.AllowAllParametersOfDeclarationOnNextLine = false;
4594   Style.AllowAllConstructorInitializersOnNextLine = false;
4595   verifyFormat("SomeClassWithALongName::Constructor(\n"
4596                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4597                "    int bbbbbbbbbbbbb)\n"
4598                "    : aaaaaaaaaaaaaaaaaaaa(a)\n"
4599                "    , bbbbbbbbbbbbbbbbbbbbb(b) {}",
4600                Style);
4601 
4602   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
4603 
4604   Style.AllowAllParametersOfDeclarationOnNextLine = true;
4605   verifyFormat("SomeClassWithALongName::Constructor(\n"
4606                "    int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb)\n"
4607                "    : aaaaaaaaaaaaaaaaaaaa(a),\n"
4608                "      bbbbbbbbbbbbbbbbbbbbb(b) {}",
4609                Style);
4610 
4611   Style.AllowAllConstructorInitializersOnNextLine = true;
4612   verifyFormat("SomeClassWithALongName::Constructor(\n"
4613                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4614                "    int bbbbbbbbbbbbb,\n"
4615                "    int cccccccccccccccc)\n"
4616                "    : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4617                Style);
4618 
4619   Style.AllowAllParametersOfDeclarationOnNextLine = false;
4620   Style.AllowAllConstructorInitializersOnNextLine = false;
4621   verifyFormat("SomeClassWithALongName::Constructor(\n"
4622                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4623                "    int bbbbbbbbbbbbb)\n"
4624                "    : aaaaaaaaaaaaaaaaaaaa(a),\n"
4625                "      bbbbbbbbbbbbbbbbbbbbb(b) {}",
4626                Style);
4627 
4628   Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
4629   Style.AllowAllParametersOfDeclarationOnNextLine = true;
4630   verifyFormat("SomeClassWithALongName::Constructor(\n"
4631                "    int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb) :\n"
4632                "    aaaaaaaaaaaaaaaaaaaa(a),\n"
4633                "    bbbbbbbbbbbbbbbbbbbbb(b) {}",
4634                Style);
4635 
4636   Style.AllowAllConstructorInitializersOnNextLine = true;
4637   verifyFormat("SomeClassWithALongName::Constructor(\n"
4638                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4639                "    int bbbbbbbbbbbbb,\n"
4640                "    int cccccccccccccccc) :\n"
4641                "    aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4642                Style);
4643 
4644   Style.AllowAllParametersOfDeclarationOnNextLine = false;
4645   Style.AllowAllConstructorInitializersOnNextLine = false;
4646   verifyFormat("SomeClassWithALongName::Constructor(\n"
4647                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4648                "    int bbbbbbbbbbbbb) :\n"
4649                "    aaaaaaaaaaaaaaaaaaaa(a),\n"
4650                "    bbbbbbbbbbbbbbbbbbbbb(b) {}",
4651                Style);
4652 }
4653 
4654 TEST_F(FormatTest, AllowAllArgumentsOnNextLine) {
4655   FormatStyle Style = getLLVMStyle();
4656   Style.ColumnLimit = 60;
4657   Style.BinPackArguments = false;
4658   for (int i = 0; i < 4; ++i) {
4659     // Test all combinations of parameters that should not have an effect.
4660     Style.AllowAllParametersOfDeclarationOnNextLine = i & 1;
4661     Style.AllowAllConstructorInitializersOnNextLine = i & 2;
4662 
4663     Style.AllowAllArgumentsOnNextLine = true;
4664     verifyFormat("void foo() {\n"
4665                  "  FunctionCallWithReallyLongName(\n"
4666                  "      aaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbb);\n"
4667                  "}",
4668                  Style);
4669     Style.AllowAllArgumentsOnNextLine = false;
4670     verifyFormat("void foo() {\n"
4671                  "  FunctionCallWithReallyLongName(\n"
4672                  "      aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4673                  "      bbbbbbbbbbbb);\n"
4674                  "}",
4675                  Style);
4676 
4677     Style.AllowAllArgumentsOnNextLine = true;
4678     verifyFormat("void foo() {\n"
4679                  "  auto VariableWithReallyLongName = {\n"
4680                  "      aaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbb};\n"
4681                  "}",
4682                  Style);
4683     Style.AllowAllArgumentsOnNextLine = false;
4684     verifyFormat("void foo() {\n"
4685                  "  auto VariableWithReallyLongName = {\n"
4686                  "      aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4687                  "      bbbbbbbbbbbb};\n"
4688                  "}",
4689                  Style);
4690   }
4691 
4692   // This parameter should not affect declarations.
4693   Style.BinPackParameters = false;
4694   Style.AllowAllArgumentsOnNextLine = false;
4695   Style.AllowAllParametersOfDeclarationOnNextLine = true;
4696   verifyFormat("void FunctionCallWithReallyLongName(\n"
4697                "    int aaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbb);",
4698                Style);
4699   Style.AllowAllParametersOfDeclarationOnNextLine = false;
4700   verifyFormat("void FunctionCallWithReallyLongName(\n"
4701                "    int aaaaaaaaaaaaaaaaaaaaaaa,\n"
4702                "    int bbbbbbbbbbbb);",
4703                Style);
4704 }
4705 
4706 TEST_F(FormatTest, BreakConstructorInitializersAfterColon) {
4707   FormatStyle Style = getLLVMStyle();
4708   Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
4709 
4710   verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
4711   verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}",
4712                getStyleWithColumns(Style, 45));
4713   verifyFormat("Constructor() :\n"
4714                "    Initializer(FitsOnTheLine) {}",
4715                getStyleWithColumns(Style, 44));
4716   verifyFormat("Constructor() :\n"
4717                "    Initializer(FitsOnTheLine) {}",
4718                getStyleWithColumns(Style, 43));
4719 
4720   verifyFormat("template <typename T>\n"
4721                "Constructor() : Initializer(FitsOnTheLine) {}",
4722                getStyleWithColumns(Style, 50));
4723   Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
4724   verifyFormat(
4725       "SomeClass::Constructor() :\n"
4726       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
4727       Style);
4728 
4729   Style.ConstructorInitializerAllOnOneLineOrOnePerLine = false;
4730   verifyFormat(
4731       "SomeClass::Constructor() :\n"
4732       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
4733       Style);
4734 
4735   verifyFormat(
4736       "SomeClass::Constructor() :\n"
4737       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4738       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
4739       Style);
4740   verifyFormat(
4741       "SomeClass::Constructor() :\n"
4742       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4743       "    aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
4744       Style);
4745   verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4746                "            aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4747                "    aaaaaaaaaa(aaaaaa) {}",
4748                Style);
4749 
4750   verifyFormat("Constructor() :\n"
4751                "    aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4752                "    aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4753                "                             aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4754                "    aaaaaaaaaaaaaaaaaaaaaaa() {}",
4755                Style);
4756 
4757   verifyFormat("Constructor() :\n"
4758                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4759                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4760                Style);
4761 
4762   verifyFormat("Constructor(int Parameter = 0) :\n"
4763                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
4764                "    aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}",
4765                Style);
4766   verifyFormat("Constructor() :\n"
4767                "    aaaaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
4768                "}",
4769                getStyleWithColumns(Style, 60));
4770   verifyFormat("Constructor() :\n"
4771                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4772                "        aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}",
4773                Style);
4774 
4775   // Here a line could be saved by splitting the second initializer onto two
4776   // lines, but that is not desirable.
4777   verifyFormat("Constructor() :\n"
4778                "    aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
4779                "    aaaaaaaaaaa(aaaaaaaaaaa),\n"
4780                "    aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4781                Style);
4782 
4783   FormatStyle OnePerLine = Style;
4784   OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
4785   OnePerLine.AllowAllConstructorInitializersOnNextLine = false;
4786   verifyFormat("SomeClass::Constructor() :\n"
4787                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4788                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4789                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
4790                OnePerLine);
4791   verifyFormat("SomeClass::Constructor() :\n"
4792                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
4793                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4794                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
4795                OnePerLine);
4796   verifyFormat("MyClass::MyClass(int var) :\n"
4797                "    some_var_(var),            // 4 space indent\n"
4798                "    some_other_var_(var + 1) { // lined up\n"
4799                "}",
4800                OnePerLine);
4801   verifyFormat("Constructor() :\n"
4802                "    aaaaa(aaaaaa),\n"
4803                "    aaaaa(aaaaaa),\n"
4804                "    aaaaa(aaaaaa),\n"
4805                "    aaaaa(aaaaaa),\n"
4806                "    aaaaa(aaaaaa) {}",
4807                OnePerLine);
4808   verifyFormat("Constructor() :\n"
4809                "    aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
4810                "          aaaaaaaaaaaaaaaaaaaaaa) {}",
4811                OnePerLine);
4812   OnePerLine.BinPackParameters = false;
4813   verifyFormat("Constructor() :\n"
4814                "    aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4815                "        aaaaaaaaaaa().aaa(),\n"
4816                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4817                OnePerLine);
4818   OnePerLine.ColumnLimit = 60;
4819   verifyFormat("Constructor() :\n"
4820                "    aaaaaaaaaaaaaaaaaaaa(a),\n"
4821                "    bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
4822                OnePerLine);
4823 
4824   EXPECT_EQ("Constructor() :\n"
4825             "    // Comment forcing unwanted break.\n"
4826             "    aaaa(aaaa) {}",
4827             format("Constructor() :\n"
4828                    "    // Comment forcing unwanted break.\n"
4829                    "    aaaa(aaaa) {}",
4830                    Style));
4831 
4832   Style.ColumnLimit = 0;
4833   verifyFormat("SomeClass::Constructor() :\n"
4834                "    a(a) {}",
4835                Style);
4836   verifyFormat("SomeClass::Constructor() noexcept :\n"
4837                "    a(a) {}",
4838                Style);
4839   verifyFormat("SomeClass::Constructor() :\n"
4840                "    a(a), b(b), c(c) {}",
4841                Style);
4842   verifyFormat("SomeClass::Constructor() :\n"
4843                "    a(a) {\n"
4844                "  foo();\n"
4845                "  bar();\n"
4846                "}",
4847                Style);
4848 
4849   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
4850   verifyFormat("SomeClass::Constructor() :\n"
4851                "    a(a), b(b), c(c) {\n"
4852                "}",
4853                Style);
4854   verifyFormat("SomeClass::Constructor() :\n"
4855                "    a(a) {\n"
4856                "}",
4857                Style);
4858 
4859   Style.ColumnLimit = 80;
4860   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
4861   Style.ConstructorInitializerIndentWidth = 2;
4862   verifyFormat("SomeClass::Constructor() : a(a), b(b), c(c) {}", Style);
4863   verifyFormat("SomeClass::Constructor() :\n"
4864                "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4865                "  bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {}",
4866                Style);
4867 
4868   // `ConstructorInitializerIndentWidth` actually applies to InheritanceList as
4869   // well
4870   Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
4871   verifyFormat(
4872       "class SomeClass\n"
4873       "  : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4874       "    public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};",
4875       Style);
4876   Style.BreakInheritanceList = FormatStyle::BILS_BeforeComma;
4877   verifyFormat(
4878       "class SomeClass\n"
4879       "  : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4880       "  , public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};",
4881       Style);
4882   Style.BreakInheritanceList = FormatStyle::BILS_AfterColon;
4883   verifyFormat(
4884       "class SomeClass :\n"
4885       "  public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4886       "  public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};",
4887       Style);
4888 }
4889 
4890 #ifndef EXPENSIVE_CHECKS
4891 // Expensive checks enables libstdc++ checking which includes validating the
4892 // state of ranges used in std::priority_queue - this blows out the
4893 // runtime/scalability of the function and makes this test unacceptably slow.
4894 TEST_F(FormatTest, MemoizationTests) {
4895   // This breaks if the memoization lookup does not take \c Indent and
4896   // \c LastSpace into account.
4897   verifyFormat(
4898       "extern CFRunLoopTimerRef\n"
4899       "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n"
4900       "                     CFTimeInterval interval, CFOptionFlags flags,\n"
4901       "                     CFIndex order, CFRunLoopTimerCallBack callout,\n"
4902       "                     CFRunLoopTimerContext *context) {}");
4903 
4904   // Deep nesting somewhat works around our memoization.
4905   verifyFormat(
4906       "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4907       "    aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4908       "        aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4909       "            aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4910       "                aaaaa())))))))))))))))))))))))))))))))))))))));",
4911       getLLVMStyleWithColumns(65));
4912   verifyFormat(
4913       "aaaaa(\n"
4914       "    aaaaa,\n"
4915       "    aaaaa(\n"
4916       "        aaaaa,\n"
4917       "        aaaaa(\n"
4918       "            aaaaa,\n"
4919       "            aaaaa(\n"
4920       "                aaaaa,\n"
4921       "                aaaaa(\n"
4922       "                    aaaaa,\n"
4923       "                    aaaaa(\n"
4924       "                        aaaaa,\n"
4925       "                        aaaaa(\n"
4926       "                            aaaaa,\n"
4927       "                            aaaaa(\n"
4928       "                                aaaaa,\n"
4929       "                                aaaaa(\n"
4930       "                                    aaaaa,\n"
4931       "                                    aaaaa(\n"
4932       "                                        aaaaa,\n"
4933       "                                        aaaaa(\n"
4934       "                                            aaaaa,\n"
4935       "                                            aaaaa(\n"
4936       "                                                aaaaa,\n"
4937       "                                                aaaaa))))))))))));",
4938       getLLVMStyleWithColumns(65));
4939   verifyFormat(
4940       "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"
4941       "                                  a),\n"
4942       "                                a),\n"
4943       "                              a),\n"
4944       "                            a),\n"
4945       "                          a),\n"
4946       "                        a),\n"
4947       "                      a),\n"
4948       "                    a),\n"
4949       "                  a),\n"
4950       "                a),\n"
4951       "              a),\n"
4952       "            a),\n"
4953       "          a),\n"
4954       "        a),\n"
4955       "      a),\n"
4956       "    a),\n"
4957       "  a)",
4958       getLLVMStyleWithColumns(65));
4959 
4960   // This test takes VERY long when memoization is broken.
4961   FormatStyle OnePerLine = getLLVMStyle();
4962   OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
4963   OnePerLine.BinPackParameters = false;
4964   std::string input = "Constructor()\n"
4965                       "    : aaaa(a,\n";
4966   for (unsigned i = 0, e = 80; i != e; ++i) {
4967     input += "           a,\n";
4968   }
4969   input += "           a) {}";
4970   verifyFormat(input, OnePerLine);
4971 }
4972 #endif
4973 
4974 TEST_F(FormatTest, BreaksAsHighAsPossible) {
4975   verifyFormat(
4976       "void f() {\n"
4977       "  if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
4978       "      (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
4979       "    f();\n"
4980       "}");
4981   verifyFormat("if (Intervals[i].getRange().getFirst() <\n"
4982                "    Intervals[i - 1].getRange().getLast()) {\n}");
4983 }
4984 
4985 TEST_F(FormatTest, BreaksFunctionDeclarations) {
4986   // Principially, we break function declarations in a certain order:
4987   // 1) break amongst arguments.
4988   verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n"
4989                "                              Cccccccccccccc cccccccccccccc);");
4990   verifyFormat("template <class TemplateIt>\n"
4991                "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n"
4992                "                            TemplateIt *stop) {}");
4993 
4994   // 2) break after return type.
4995   verifyFormat(
4996       "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4997       "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);",
4998       getGoogleStyle());
4999 
5000   // 3) break after (.
5001   verifyFormat(
5002       "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n"
5003       "    Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);",
5004       getGoogleStyle());
5005 
5006   // 4) break before after nested name specifiers.
5007   verifyFormat(
5008       "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5009       "SomeClasssssssssssssssssssssssssssssssssssssss::\n"
5010       "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);",
5011       getGoogleStyle());
5012 
5013   // However, there are exceptions, if a sufficient amount of lines can be
5014   // saved.
5015   // FIXME: The precise cut-offs wrt. the number of saved lines might need some
5016   // more adjusting.
5017   verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
5018                "                                  Cccccccccccccc cccccccccc,\n"
5019                "                                  Cccccccccccccc cccccccccc,\n"
5020                "                                  Cccccccccccccc cccccccccc,\n"
5021                "                                  Cccccccccccccc cccccccccc);");
5022   verifyFormat(
5023       "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5024       "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
5025       "            Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
5026       "            Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);",
5027       getGoogleStyle());
5028   verifyFormat(
5029       "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
5030       "                                          Cccccccccccccc cccccccccc,\n"
5031       "                                          Cccccccccccccc cccccccccc,\n"
5032       "                                          Cccccccccccccc cccccccccc,\n"
5033       "                                          Cccccccccccccc cccccccccc,\n"
5034       "                                          Cccccccccccccc cccccccccc,\n"
5035       "                                          Cccccccccccccc cccccccccc);");
5036   verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
5037                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
5038                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
5039                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
5040                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
5041 
5042   // Break after multi-line parameters.
5043   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5044                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5045                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5046                "    bbbb bbbb);");
5047   verifyFormat("void SomeLoooooooooooongFunction(\n"
5048                "    std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
5049                "        aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5050                "    int bbbbbbbbbbbbb);");
5051 
5052   // Treat overloaded operators like other functions.
5053   verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
5054                "operator>(const SomeLoooooooooooooooooooooooooogType &other);");
5055   verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
5056                "operator>>(const SomeLooooooooooooooooooooooooogType &other);");
5057   verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
5058                "operator<<(const SomeLooooooooooooooooooooooooogType &other);");
5059   verifyGoogleFormat(
5060       "SomeLoooooooooooooooooooooooooooooogType operator>>(\n"
5061       "    const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
5062   verifyGoogleFormat(
5063       "SomeLoooooooooooooooooooooooooooooogType operator<<(\n"
5064       "    const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
5065   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5066                "    int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);");
5067   verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n"
5068                "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);");
5069   verifyGoogleFormat(
5070       "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n"
5071       "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5072       "    bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}");
5073   verifyGoogleFormat("template <typename T>\n"
5074                      "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5075                      "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n"
5076                      "    aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);");
5077 
5078   FormatStyle Style = getLLVMStyle();
5079   Style.PointerAlignment = FormatStyle::PAS_Left;
5080   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5081                "    aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}",
5082                Style);
5083   verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n"
5084                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
5085                Style);
5086 }
5087 
5088 TEST_F(FormatTest, DontBreakBeforeQualifiedOperator) {
5089   // Regression test for https://bugs.llvm.org/show_bug.cgi?id=40516:
5090   // Prefer keeping `::` followed by `operator` together.
5091   EXPECT_EQ("const aaaa::bbbbbbb &\n"
5092             "ccccccccc::operator++() {\n"
5093             "  stuff();\n"
5094             "}",
5095             format("const aaaa::bbbbbbb\n"
5096                    "&ccccccccc::operator++() { stuff(); }",
5097                    getLLVMStyleWithColumns(40)));
5098 }
5099 
5100 TEST_F(FormatTest, TrailingReturnType) {
5101   verifyFormat("auto foo() -> int;\n");
5102   // correct trailing return type spacing
5103   verifyFormat("auto operator->() -> int;\n");
5104   verifyFormat("auto operator++(int) -> int;\n");
5105 
5106   verifyFormat("struct S {\n"
5107                "  auto bar() const -> int;\n"
5108                "};");
5109   verifyFormat("template <size_t Order, typename T>\n"
5110                "auto load_img(const std::string &filename)\n"
5111                "    -> alias::tensor<Order, T, mem::tag::cpu> {}");
5112   verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n"
5113                "    -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}");
5114   verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}");
5115   verifyFormat("template <typename T>\n"
5116                "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n"
5117                "    -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());");
5118 
5119   // Not trailing return types.
5120   verifyFormat("void f() { auto a = b->c(); }");
5121 }
5122 
5123 TEST_F(FormatTest, DeductionGuides) {
5124   verifyFormat("template <class T> A(const T &, const T &) -> A<T &>;");
5125   verifyFormat("template <class T> explicit A(T &, T &&) -> A<T>;");
5126   verifyFormat("template <class... Ts> S(Ts...) -> S<Ts...>;");
5127   verifyFormat(
5128       "template <class... T>\n"
5129       "array(T &&... t) -> array<std::common_type_t<T...>, sizeof...(T)>;");
5130   verifyFormat("template <class T> A() -> A<decltype(p->foo<3>())>;");
5131   verifyFormat("template <class T> A() -> A<decltype(foo<traits<1>>)>;");
5132   verifyFormat("template <class T> A() -> A<sizeof(p->foo<1>)>;");
5133   verifyFormat("template <class T> A() -> A<(3 < 2)>;");
5134   verifyFormat("template <class T> A() -> A<((3) < (2))>;");
5135   verifyFormat("template <class T> x() -> x<1>;");
5136   verifyFormat("template <class T> explicit x(T &) -> x<1>;");
5137 
5138   // Ensure not deduction guides.
5139   verifyFormat("c()->f<int>();");
5140   verifyFormat("x()->foo<1>;");
5141   verifyFormat("x = p->foo<3>();");
5142   verifyFormat("x()->x<1>();");
5143   verifyFormat("x()->x<1>;");
5144 }
5145 
5146 TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) {
5147   // Avoid breaking before trailing 'const' or other trailing annotations, if
5148   // they are not function-like.
5149   FormatStyle Style = getGoogleStyle();
5150   Style.ColumnLimit = 47;
5151   verifyFormat("void someLongFunction(\n"
5152                "    int someLoooooooooooooongParameter) const {\n}",
5153                getLLVMStyleWithColumns(47));
5154   verifyFormat("LoooooongReturnType\n"
5155                "someLoooooooongFunction() const {}",
5156                getLLVMStyleWithColumns(47));
5157   verifyFormat("LoooooongReturnType someLoooooooongFunction()\n"
5158                "    const {}",
5159                Style);
5160   verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
5161                "                  aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;");
5162   verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
5163                "                  aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;");
5164   verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
5165                "                  aaaaa aaaaaaaaaaaaaaaaaaaa) override final;");
5166   verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n"
5167                "                   aaaaaaaaaaa aaaaa) const override;");
5168   verifyGoogleFormat(
5169       "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5170       "    const override;");
5171 
5172   // Even if the first parameter has to be wrapped.
5173   verifyFormat("void someLongFunction(\n"
5174                "    int someLongParameter) const {}",
5175                getLLVMStyleWithColumns(46));
5176   verifyFormat("void someLongFunction(\n"
5177                "    int someLongParameter) const {}",
5178                Style);
5179   verifyFormat("void someLongFunction(\n"
5180                "    int someLongParameter) override {}",
5181                Style);
5182   verifyFormat("void someLongFunction(\n"
5183                "    int someLongParameter) OVERRIDE {}",
5184                Style);
5185   verifyFormat("void someLongFunction(\n"
5186                "    int someLongParameter) final {}",
5187                Style);
5188   verifyFormat("void someLongFunction(\n"
5189                "    int someLongParameter) FINAL {}",
5190                Style);
5191   verifyFormat("void someLongFunction(\n"
5192                "    int parameter) const override {}",
5193                Style);
5194 
5195   Style.BreakBeforeBraces = FormatStyle::BS_Allman;
5196   verifyFormat("void someLongFunction(\n"
5197                "    int someLongParameter) const\n"
5198                "{\n"
5199                "}",
5200                Style);
5201 
5202   Style.BreakBeforeBraces = FormatStyle::BS_Whitesmiths;
5203   verifyFormat("void someLongFunction(\n"
5204                "    int someLongParameter) const\n"
5205                "  {\n"
5206                "  }",
5207                Style);
5208 
5209   // Unless these are unknown annotations.
5210   verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n"
5211                "                  aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5212                "    LONG_AND_UGLY_ANNOTATION;");
5213 
5214   // Breaking before function-like trailing annotations is fine to keep them
5215   // close to their arguments.
5216   verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5217                "    LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
5218   verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
5219                "    LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
5220   verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
5221                "    LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}");
5222   verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n"
5223                      "    AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);");
5224   verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});");
5225 
5226   verifyFormat(
5227       "void aaaaaaaaaaaaaaaaaa()\n"
5228       "    __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n"
5229       "                   aaaaaaaaaaaaaaaaaaaaaaaaa));");
5230   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5231                "    __attribute__((unused));");
5232   verifyGoogleFormat(
5233       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5234       "    GUARDED_BY(aaaaaaaaaaaa);");
5235   verifyGoogleFormat(
5236       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5237       "    GUARDED_BY(aaaaaaaaaaaa);");
5238   verifyGoogleFormat(
5239       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
5240       "    aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5241   verifyGoogleFormat(
5242       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
5243       "    aaaaaaaaaaaaaaaaaaaaaaaaa;");
5244 }
5245 
5246 TEST_F(FormatTest, FunctionAnnotations) {
5247   verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
5248                "int OldFunction(const string &parameter) {}");
5249   verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
5250                "string OldFunction(const string &parameter) {}");
5251   verifyFormat("template <typename T>\n"
5252                "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
5253                "string OldFunction(const string &parameter) {}");
5254 
5255   // Not function annotations.
5256   verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5257                "                << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
5258   verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n"
5259                "       ThisIsATestWithAReallyReallyReallyReallyLongName) {}");
5260   verifyFormat("MACRO(abc).function() // wrap\n"
5261                "    << abc;");
5262   verifyFormat("MACRO(abc)->function() // wrap\n"
5263                "    << abc;");
5264   verifyFormat("MACRO(abc)::function() // wrap\n"
5265                "    << abc;");
5266 }
5267 
5268 TEST_F(FormatTest, BreaksDesireably) {
5269   verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
5270                "    aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
5271                "    aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
5272   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5273                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
5274                "}");
5275 
5276   verifyFormat(
5277       "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5278       "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
5279 
5280   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5281                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5282                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
5283 
5284   verifyFormat(
5285       "aaaaaaaa(aaaaaaaaaaaaa,\n"
5286       "         aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5287       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
5288       "         aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5289       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
5290 
5291   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
5292                "    (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5293 
5294   verifyFormat(
5295       "void f() {\n"
5296       "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
5297       "                                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
5298       "}");
5299   verifyFormat(
5300       "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5301       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
5302   verifyFormat(
5303       "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5304       "                aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
5305   verifyFormat(
5306       "aaaaaa(aaa,\n"
5307       "       new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5308       "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5309       "       aaaa);");
5310   verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5311                "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5312                "                  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5313 
5314   // Indent consistently independent of call expression and unary operator.
5315   verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
5316                "    dddddddddddddddddddddddddddddd));");
5317   verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
5318                "    dddddddddddddddddddddddddddddd));");
5319   verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n"
5320                "    dddddddddddddddddddddddddddddd));");
5321 
5322   // This test case breaks on an incorrect memoization, i.e. an optimization not
5323   // taking into account the StopAt value.
5324   verifyFormat(
5325       "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
5326       "       aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
5327       "       aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
5328       "       (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5329 
5330   verifyFormat("{\n  {\n    {\n"
5331                "      Annotation.SpaceRequiredBefore =\n"
5332                "          Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
5333                "          Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
5334                "    }\n  }\n}");
5335 
5336   // Break on an outer level if there was a break on an inner level.
5337   EXPECT_EQ("f(g(h(a, // comment\n"
5338             "      b, c),\n"
5339             "    d, e),\n"
5340             "  x, y);",
5341             format("f(g(h(a, // comment\n"
5342                    "    b, c), d, e), x, y);"));
5343 
5344   // Prefer breaking similar line breaks.
5345   verifyFormat(
5346       "const int kTrackingOptions = NSTrackingMouseMoved |\n"
5347       "                             NSTrackingMouseEnteredAndExited |\n"
5348       "                             NSTrackingActiveAlways;");
5349 }
5350 
5351 TEST_F(FormatTest, FormatsDeclarationsOnePerLine) {
5352   FormatStyle NoBinPacking = getGoogleStyle();
5353   NoBinPacking.BinPackParameters = false;
5354   NoBinPacking.BinPackArguments = true;
5355   verifyFormat("void f() {\n"
5356                "  f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n"
5357                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
5358                "}",
5359                NoBinPacking);
5360   verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n"
5361                "       int aaaaaaaaaaaaaaaaaaaa,\n"
5362                "       int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
5363                NoBinPacking);
5364 
5365   NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
5366   verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5367                "                        vector<int> bbbbbbbbbbbbbbb);",
5368                NoBinPacking);
5369   // FIXME: This behavior difference is probably not wanted. However, currently
5370   // we cannot distinguish BreakBeforeParameter being set because of the wrapped
5371   // template arguments from BreakBeforeParameter being set because of the
5372   // one-per-line formatting.
5373   verifyFormat(
5374       "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n"
5375       "                                             aaaaaaaaaa> aaaaaaaaaa);",
5376       NoBinPacking);
5377   verifyFormat(
5378       "void fffffffffff(\n"
5379       "    aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n"
5380       "        aaaaaaaaaa);");
5381 }
5382 
5383 TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) {
5384   FormatStyle NoBinPacking = getGoogleStyle();
5385   NoBinPacking.BinPackParameters = false;
5386   NoBinPacking.BinPackArguments = false;
5387   verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n"
5388                "  aaaaaaaaaaaaaaaaaaaa,\n"
5389                "  aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);",
5390                NoBinPacking);
5391   verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n"
5392                "        aaaaaaaaaaaaa,\n"
5393                "        aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));",
5394                NoBinPacking);
5395   verifyFormat(
5396       "aaaaaaaa(aaaaaaaaaaaaa,\n"
5397       "         aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5398       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
5399       "         aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5400       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));",
5401       NoBinPacking);
5402   verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
5403                "    .aaaaaaaaaaaaaaaaaa();",
5404                NoBinPacking);
5405   verifyFormat("void f() {\n"
5406                "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5407                "      aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n"
5408                "}",
5409                NoBinPacking);
5410 
5411   verifyFormat(
5412       "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5413       "             aaaaaaaaaaaa,\n"
5414       "             aaaaaaaaaaaa);",
5415       NoBinPacking);
5416   verifyFormat(
5417       "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n"
5418       "                               ddddddddddddddddddddddddddddd),\n"
5419       "             test);",
5420       NoBinPacking);
5421 
5422   verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n"
5423                "            aaaaaaaaaaaaaaaaaaaaaaa,\n"
5424                "            aaaaaaaaaaaaaaaaaaaaaaa>\n"
5425                "    aaaaaaaaaaaaaaaaaa;",
5426                NoBinPacking);
5427   verifyFormat("a(\"a\"\n"
5428                "  \"a\",\n"
5429                "  a);");
5430 
5431   NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
5432   verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n"
5433                "                aaaaaaaaa,\n"
5434                "                aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5435                NoBinPacking);
5436   verifyFormat(
5437       "void f() {\n"
5438       "  aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
5439       "      .aaaaaaa();\n"
5440       "}",
5441       NoBinPacking);
5442   verifyFormat(
5443       "template <class SomeType, class SomeOtherType>\n"
5444       "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}",
5445       NoBinPacking);
5446 }
5447 
5448 TEST_F(FormatTest, AdaptiveOnePerLineFormatting) {
5449   FormatStyle Style = getLLVMStyleWithColumns(15);
5450   Style.ExperimentalAutoDetectBinPacking = true;
5451   EXPECT_EQ("aaa(aaaa,\n"
5452             "    aaaa,\n"
5453             "    aaaa);\n"
5454             "aaa(aaaa,\n"
5455             "    aaaa,\n"
5456             "    aaaa);",
5457             format("aaa(aaaa,\n" // one-per-line
5458                    "  aaaa,\n"
5459                    "    aaaa  );\n"
5460                    "aaa(aaaa,  aaaa,  aaaa);", // inconclusive
5461                    Style));
5462   EXPECT_EQ("aaa(aaaa, aaaa,\n"
5463             "    aaaa);\n"
5464             "aaa(aaaa, aaaa,\n"
5465             "    aaaa);",
5466             format("aaa(aaaa,  aaaa,\n" // bin-packed
5467                    "    aaaa  );\n"
5468                    "aaa(aaaa,  aaaa,  aaaa);", // inconclusive
5469                    Style));
5470 }
5471 
5472 TEST_F(FormatTest, FormatsBuilderPattern) {
5473   verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n"
5474                "    .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n"
5475                "    .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n"
5476                "    .StartsWith(\".init\", ORDER_INIT)\n"
5477                "    .StartsWith(\".fini\", ORDER_FINI)\n"
5478                "    .StartsWith(\".hash\", ORDER_HASH)\n"
5479                "    .Default(ORDER_TEXT);\n");
5480 
5481   verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n"
5482                "       aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();");
5483   verifyFormat("aaaaaaa->aaaaaaa\n"
5484                "    ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5485                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5486                "    ->aaaaaaaa(aaaaaaaaaaaaaaa);");
5487   verifyFormat(
5488       "aaaaaaa->aaaaaaa\n"
5489       "    ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5490       "    ->aaaaaaaa(aaaaaaaaaaaaaaa);");
5491   verifyFormat(
5492       "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"
5493       "    aaaaaaaaaaaaaa);");
5494   verifyFormat(
5495       "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n"
5496       "    aaaaaa->aaaaaaaaaaaa()\n"
5497       "        ->aaaaaaaaaaaaaaaa(\n"
5498       "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5499       "        ->aaaaaaaaaaaaaaaaa();");
5500   verifyGoogleFormat(
5501       "void f() {\n"
5502       "  someo->Add((new util::filetools::Handler(dir))\n"
5503       "                 ->OnEvent1(NewPermanentCallback(\n"
5504       "                     this, &HandlerHolderClass::EventHandlerCBA))\n"
5505       "                 ->OnEvent2(NewPermanentCallback(\n"
5506       "                     this, &HandlerHolderClass::EventHandlerCBB))\n"
5507       "                 ->OnEvent3(NewPermanentCallback(\n"
5508       "                     this, &HandlerHolderClass::EventHandlerCBC))\n"
5509       "                 ->OnEvent5(NewPermanentCallback(\n"
5510       "                     this, &HandlerHolderClass::EventHandlerCBD))\n"
5511       "                 ->OnEvent6(NewPermanentCallback(\n"
5512       "                     this, &HandlerHolderClass::EventHandlerCBE)));\n"
5513       "}");
5514 
5515   verifyFormat(
5516       "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();");
5517   verifyFormat("aaaaaaaaaaaaaaa()\n"
5518                "    .aaaaaaaaaaaaaaa()\n"
5519                "    .aaaaaaaaaaaaaaa()\n"
5520                "    .aaaaaaaaaaaaaaa()\n"
5521                "    .aaaaaaaaaaaaaaa();");
5522   verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
5523                "    .aaaaaaaaaaaaaaa()\n"
5524                "    .aaaaaaaaaaaaaaa()\n"
5525                "    .aaaaaaaaaaaaaaa();");
5526   verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
5527                "    .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
5528                "    .aaaaaaaaaaaaaaa();");
5529   verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n"
5530                "    ->aaaaaaaaaaaaaae(0)\n"
5531                "    ->aaaaaaaaaaaaaaa();");
5532 
5533   // Don't linewrap after very short segments.
5534   verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5535                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5536                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5537   verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5538                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5539                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5540   verifyFormat("aaa()\n"
5541                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5542                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5543                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5544 
5545   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
5546                "    .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5547                "    .has<bbbbbbbbbbbbbbbbbbbbb>();");
5548   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
5549                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
5550                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();");
5551 
5552   // Prefer not to break after empty parentheses.
5553   verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n"
5554                "    First->LastNewlineOffset);");
5555 
5556   // Prefer not to create "hanging" indents.
5557   verifyFormat(
5558       "return !soooooooooooooome_map\n"
5559       "            .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5560       "            .second;");
5561   verifyFormat(
5562       "return aaaaaaaaaaaaaaaa\n"
5563       "    .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n"
5564       "    .aaaa(aaaaaaaaaaaaaa);");
5565   // No hanging indent here.
5566   verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n"
5567                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5568   verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n"
5569                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5570   verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
5571                "    .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5572                getLLVMStyleWithColumns(60));
5573   verifyFormat("aaaaaaaaaaaaaaaaaa\n"
5574                "    .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
5575                "    .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5576                getLLVMStyleWithColumns(59));
5577   verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5578                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5579                "    .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5580 
5581   // Dont break if only closing statements before member call
5582   verifyFormat("test() {\n"
5583                "  ([]() -> {\n"
5584                "    int b = 32;\n"
5585                "    return 3;\n"
5586                "  }).foo();\n"
5587                "}");
5588   verifyFormat("test() {\n"
5589                "  (\n"
5590                "      []() -> {\n"
5591                "        int b = 32;\n"
5592                "        return 3;\n"
5593                "      },\n"
5594                "      foo, bar)\n"
5595                "      .foo();\n"
5596                "}");
5597   verifyFormat("test() {\n"
5598                "  ([]() -> {\n"
5599                "    int b = 32;\n"
5600                "    return 3;\n"
5601                "  })\n"
5602                "      .foo()\n"
5603                "      .bar();\n"
5604                "}");
5605   verifyFormat("test() {\n"
5606                "  ([]() -> {\n"
5607                "    int b = 32;\n"
5608                "    return 3;\n"
5609                "  })\n"
5610                "      .foo(\"aaaaaaaaaaaaaaaaa\"\n"
5611                "           \"bbbb\");\n"
5612                "}",
5613                getLLVMStyleWithColumns(30));
5614 }
5615 
5616 TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
5617   verifyFormat(
5618       "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
5619       "    bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
5620   verifyFormat(
5621       "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n"
5622       "    bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}");
5623 
5624   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
5625                "    ccccccccccccccccccccccccc) {\n}");
5626   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n"
5627                "    ccccccccccccccccccccccccc) {\n}");
5628 
5629   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
5630                "    ccccccccccccccccccccccccc) {\n}");
5631   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n"
5632                "    ccccccccccccccccccccccccc) {\n}");
5633 
5634   verifyFormat(
5635       "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
5636       "    ccccccccccccccccccccccccc) {\n}");
5637   verifyFormat(
5638       "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n"
5639       "    ccccccccccccccccccccccccc) {\n}");
5640 
5641   verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
5642                "       bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
5643                "       cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
5644                "       dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
5645   verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n"
5646                "       bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n"
5647                "       cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n"
5648                "       dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
5649 
5650   verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
5651                "     aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
5652                "    aaaaaaaaaaaaaaa != aa) {\n}");
5653   verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n"
5654                "     aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n"
5655                "    aaaaaaaaaaaaaaa != aa) {\n}");
5656 }
5657 
5658 TEST_F(FormatTest, BreaksAfterAssignments) {
5659   verifyFormat(
5660       "unsigned Cost =\n"
5661       "    TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
5662       "                        SI->getPointerAddressSpaceee());\n");
5663   verifyFormat(
5664       "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
5665       "    Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
5666 
5667   verifyFormat(
5668       "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n"
5669       "    aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
5670   verifyFormat("unsigned OriginalStartColumn =\n"
5671                "    SourceMgr.getSpellingColumnNumber(\n"
5672                "        Current.FormatTok.getStartOfNonWhitespace()) -\n"
5673                "    1;");
5674 }
5675 
5676 TEST_F(FormatTest, ConfigurableBreakAssignmentPenalty) {
5677   FormatStyle Style = getLLVMStyle();
5678   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5679                "    bbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccccccccccccc;",
5680                Style);
5681 
5682   Style.PenaltyBreakAssignment = 20;
5683   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
5684                "                                 cccccccccccccccccccccccccc;",
5685                Style);
5686 }
5687 
5688 TEST_F(FormatTest, AlignsAfterAssignments) {
5689   verifyFormat(
5690       "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5691       "             aaaaaaaaaaaaaaaaaaaaaaaaa;");
5692   verifyFormat(
5693       "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5694       "          aaaaaaaaaaaaaaaaaaaaaaaaa;");
5695   verifyFormat(
5696       "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5697       "           aaaaaaaaaaaaaaaaaaaaaaaaa;");
5698   verifyFormat(
5699       "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5700       "              aaaaaaaaaaaaaaaaaaaaaaaaa);");
5701   verifyFormat(
5702       "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n"
5703       "                                            aaaaaaaaaaaaaaaaaaaaaaaa +\n"
5704       "                                            aaaaaaaaaaaaaaaaaaaaaaaa;");
5705 }
5706 
5707 TEST_F(FormatTest, AlignsAfterReturn) {
5708   verifyFormat(
5709       "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5710       "       aaaaaaaaaaaaaaaaaaaaaaaaa;");
5711   verifyFormat(
5712       "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5713       "        aaaaaaaaaaaaaaaaaaaaaaaaa);");
5714   verifyFormat(
5715       "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
5716       "       aaaaaaaaaaaaaaaaaaaaaa();");
5717   verifyFormat(
5718       "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
5719       "        aaaaaaaaaaaaaaaaaaaaaa());");
5720   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5721                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5722   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5723                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
5724                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5725   verifyFormat("return\n"
5726                "    // true if code is one of a or b.\n"
5727                "    code == a || code == b;");
5728 }
5729 
5730 TEST_F(FormatTest, AlignsAfterOpenBracket) {
5731   verifyFormat(
5732       "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
5733       "                                                aaaaaaaaa aaaaaaa) {}");
5734   verifyFormat(
5735       "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
5736       "                                               aaaaaaaaaaa aaaaaaaaa);");
5737   verifyFormat(
5738       "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
5739       "                                             aaaaaaaaaaaaaaaaaaaaa));");
5740   FormatStyle Style = getLLVMStyle();
5741   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5742   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5743                "    aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",
5744                Style);
5745   verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
5746                "    aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);",
5747                Style);
5748   verifyFormat("SomeLongVariableName->someFunction(\n"
5749                "    foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));",
5750                Style);
5751   verifyFormat(
5752       "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
5753       "    aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
5754       Style);
5755   verifyFormat(
5756       "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
5757       "    aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5758       Style);
5759   verifyFormat(
5760       "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
5761       "    aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
5762       Style);
5763 
5764   verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n"
5765                "    ccccccc(aaaaaaaaaaaaaaaaa,         //\n"
5766                "        b));",
5767                Style);
5768 
5769   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5770   Style.BinPackArguments = false;
5771   Style.BinPackParameters = false;
5772   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5773                "    aaaaaaaaaaa aaaaaaaa,\n"
5774                "    aaaaaaaaa aaaaaaa,\n"
5775                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
5776                Style);
5777   verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
5778                "    aaaaaaaaaaa aaaaaaaaa,\n"
5779                "    aaaaaaaaaaa aaaaaaaaa,\n"
5780                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5781                Style);
5782   verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n"
5783                "    aaaaaaaaaaaaaaa,\n"
5784                "    aaaaaaaaaaaaaaaaaaaaa,\n"
5785                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
5786                Style);
5787   verifyFormat(
5788       "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n"
5789       "    aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
5790       Style);
5791   verifyFormat(
5792       "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n"
5793       "    aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
5794       Style);
5795   verifyFormat(
5796       "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
5797       "    aaaaaaaaaaaaaaaaaaaaa(\n"
5798       "        aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n"
5799       "    aaaaaaaaaaaaaaaa);",
5800       Style);
5801   verifyFormat(
5802       "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
5803       "    aaaaaaaaaaaaaaaaaaaaa(\n"
5804       "        aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
5805       "    aaaaaaaaaaaaaaaa);",
5806       Style);
5807 }
5808 
5809 TEST_F(FormatTest, ParenthesesAndOperandAlignment) {
5810   FormatStyle Style = getLLVMStyleWithColumns(40);
5811   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5812                "          bbbbbbbbbbbbbbbbbbbbbb);",
5813                Style);
5814   Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
5815   Style.AlignOperands = false;
5816   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5817                "          bbbbbbbbbbbbbbbbbbbbbb);",
5818                Style);
5819   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5820   Style.AlignOperands = true;
5821   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5822                "          bbbbbbbbbbbbbbbbbbbbbb);",
5823                Style);
5824   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5825   Style.AlignOperands = false;
5826   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5827                "    bbbbbbbbbbbbbbbbbbbbbb);",
5828                Style);
5829 }
5830 
5831 TEST_F(FormatTest, BreaksConditionalExpressions) {
5832   verifyFormat(
5833       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5834       "                               ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5835       "                               : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5836   verifyFormat(
5837       "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
5838       "     aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5839       "                                : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5840   verifyFormat(
5841       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5842       "                                   : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5843   verifyFormat("aaaa(aaaaaaaaa, aaaaaaaaa,\n"
5844                "     aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5845                "             : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5846   verifyFormat(
5847       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
5848       "                                                    : aaaaaaaaaaaaa);");
5849   verifyFormat(
5850       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5851       "                   aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5852       "                                    : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5853       "                   aaaaaaaaaaaaa);");
5854   verifyFormat(
5855       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5856       "                   aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5857       "                   aaaaaaaaaaaaa);");
5858   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5859                "    ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5860                "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5861                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5862                "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5863   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5864                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5865                "           ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5866                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5867                "           : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5868                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5869                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5870   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5871                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5872                "           ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5873                "                  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5874                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5875   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5876                "    ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5877                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5878   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
5879                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5880                "        ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5881                "        : aaaaaaaaaaaaaaaa;");
5882   verifyFormat(
5883       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5884       "    ? aaaaaaaaaaaaaaa\n"
5885       "    : aaaaaaaaaaaaaaa;");
5886   verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
5887                "          aaaaaaaaa\n"
5888                "      ? b\n"
5889                "      : c);");
5890   verifyFormat("return aaaa == bbbb\n"
5891                "           // comment\n"
5892                "           ? aaaa\n"
5893                "           : bbbb;");
5894   verifyFormat("unsigned Indent =\n"
5895                "    format(TheLine.First,\n"
5896                "           IndentForLevel[TheLine.Level] >= 0\n"
5897                "               ? IndentForLevel[TheLine.Level]\n"
5898                "               : TheLine * 2,\n"
5899                "           TheLine.InPPDirective, PreviousEndOfLineColumn);",
5900                getLLVMStyleWithColumns(60));
5901   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
5902                "                  ? aaaaaaaaaaaaaaa\n"
5903                "                  : bbbbbbbbbbbbbbb //\n"
5904                "                        ? ccccccccccccccc\n"
5905                "                        : ddddddddddddddd;");
5906   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
5907                "                  ? aaaaaaaaaaaaaaa\n"
5908                "                  : (bbbbbbbbbbbbbbb //\n"
5909                "                         ? ccccccccccccccc\n"
5910                "                         : ddddddddddddddd);");
5911   verifyFormat(
5912       "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5913       "                                      ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5914       "                                            aaaaaaaaaaaaaaaaaaaaa +\n"
5915       "                                            aaaaaaaaaaaaaaaaaaaaa\n"
5916       "                                      : aaaaaaaaaa;");
5917   verifyFormat(
5918       "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5919       "                                   : aaaaaaaaaaaaaaaaaaaaaa\n"
5920       "                      : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5921 
5922   FormatStyle NoBinPacking = getLLVMStyle();
5923   NoBinPacking.BinPackArguments = false;
5924   verifyFormat(
5925       "void f() {\n"
5926       "  g(aaa,\n"
5927       "    aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
5928       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5929       "        ? aaaaaaaaaaaaaaa\n"
5930       "        : aaaaaaaaaaaaaaa);\n"
5931       "}",
5932       NoBinPacking);
5933   verifyFormat(
5934       "void f() {\n"
5935       "  g(aaa,\n"
5936       "    aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
5937       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5938       "        ?: aaaaaaaaaaaaaaa);\n"
5939       "}",
5940       NoBinPacking);
5941 
5942   verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n"
5943                "             // comment.\n"
5944                "             ccccccccccccccccccccccccccccccccccccccc\n"
5945                "                 ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5946                "                 : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);");
5947 
5948   // Assignments in conditional expressions. Apparently not uncommon :-(.
5949   verifyFormat("return a != b\n"
5950                "           // comment\n"
5951                "           ? a = b\n"
5952                "           : a = b;");
5953   verifyFormat("return a != b\n"
5954                "           // comment\n"
5955                "           ? a = a != b\n"
5956                "                     // comment\n"
5957                "                     ? a = b\n"
5958                "                     : a\n"
5959                "           : a;\n");
5960   verifyFormat("return a != b\n"
5961                "           // comment\n"
5962                "           ? a\n"
5963                "           : a = a != b\n"
5964                "                     // comment\n"
5965                "                     ? a = b\n"
5966                "                     : a;");
5967 }
5968 
5969 TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {
5970   FormatStyle Style = getLLVMStyle();
5971   Style.BreakBeforeTernaryOperators = false;
5972   Style.ColumnLimit = 70;
5973   verifyFormat(
5974       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5975       "                               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5976       "                               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5977       Style);
5978   verifyFormat(
5979       "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
5980       "     aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5981       "                                  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5982       Style);
5983   verifyFormat(
5984       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5985       "                                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5986       Style);
5987   verifyFormat("aaaa(aaaaaaaa, aaaaaaaaaa,\n"
5988                "     aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5989                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5990                Style);
5991   verifyFormat(
5992       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n"
5993       "                                                      aaaaaaaaaaaaa);",
5994       Style);
5995   verifyFormat(
5996       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5997       "                   aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5998       "                                      aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5999       "                   aaaaaaaaaaaaa);",
6000       Style);
6001   verifyFormat(
6002       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6003       "                   aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6004       "                   aaaaaaaaaaaaa);",
6005       Style);
6006   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
6007                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6008                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
6009                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6010                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
6011                Style);
6012   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6013                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
6014                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6015                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
6016                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6017                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
6018                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
6019                Style);
6020   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6021                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n"
6022                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6023                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
6024                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
6025                Style);
6026   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
6027                "    aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
6028                "    aaaaaaaaaaaaaaaaaaaaaaaaaaa;",
6029                Style);
6030   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
6031                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
6032                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
6033                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
6034                Style);
6035   verifyFormat(
6036       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
6037       "    aaaaaaaaaaaaaaa :\n"
6038       "    aaaaaaaaaaaaaaa;",
6039       Style);
6040   verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
6041                "          aaaaaaaaa ?\n"
6042                "      b :\n"
6043                "      c);",
6044                Style);
6045   verifyFormat("unsigned Indent =\n"
6046                "    format(TheLine.First,\n"
6047                "           IndentForLevel[TheLine.Level] >= 0 ?\n"
6048                "               IndentForLevel[TheLine.Level] :\n"
6049                "               TheLine * 2,\n"
6050                "           TheLine.InPPDirective, PreviousEndOfLineColumn);",
6051                Style);
6052   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
6053                "                  aaaaaaaaaaaaaaa :\n"
6054                "                  bbbbbbbbbbbbbbb ? //\n"
6055                "                      ccccccccccccccc :\n"
6056                "                      ddddddddddddddd;",
6057                Style);
6058   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
6059                "                  aaaaaaaaaaaaaaa :\n"
6060                "                  (bbbbbbbbbbbbbbb ? //\n"
6061                "                       ccccccccccccccc :\n"
6062                "                       ddddddddddddddd);",
6063                Style);
6064   verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
6065                "            /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n"
6066                "            ccccccccccccccccccccccccccc;",
6067                Style);
6068   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
6069                "           aaaaa :\n"
6070                "           bbbbbbbbbbbbbbb + cccccccccccccccc;",
6071                Style);
6072 }
6073 
6074 TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
6075   verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
6076                "     aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
6077   verifyFormat("bool a = true, b = false;");
6078 
6079   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6080                "         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
6081                "     bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
6082                "         bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
6083   verifyFormat(
6084       "bool aaaaaaaaaaaaaaaaaaaaa =\n"
6085       "         bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
6086       "     d = e && f;");
6087   verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
6088                "          c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
6089   verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
6090                "          *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
6091   verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
6092                "          ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
6093 
6094   FormatStyle Style = getGoogleStyle();
6095   Style.PointerAlignment = FormatStyle::PAS_Left;
6096   Style.DerivePointerAlignment = false;
6097   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6098                "    *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
6099                "    *b = bbbbbbbbbbbbbbbbbbb;",
6100                Style);
6101   verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
6102                "          *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;",
6103                Style);
6104   verifyFormat("vector<int*> a, b;", Style);
6105   verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style);
6106 }
6107 
6108 TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
6109   verifyFormat("arr[foo ? bar : baz];");
6110   verifyFormat("f()[foo ? bar : baz];");
6111   verifyFormat("(a + b)[foo ? bar : baz];");
6112   verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
6113 }
6114 
6115 TEST_F(FormatTest, AlignsStringLiterals) {
6116   verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
6117                "                                      \"short literal\");");
6118   verifyFormat(
6119       "looooooooooooooooooooooooongFunction(\n"
6120       "    \"short literal\"\n"
6121       "    \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
6122   verifyFormat("someFunction(\"Always break between multi-line\"\n"
6123                "             \" string literals\",\n"
6124                "             and, other, parameters);");
6125   EXPECT_EQ("fun + \"1243\" /* comment */\n"
6126             "      \"5678\";",
6127             format("fun + \"1243\" /* comment */\n"
6128                    "    \"5678\";",
6129                    getLLVMStyleWithColumns(28)));
6130   EXPECT_EQ(
6131       "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
6132       "         \"aaaaaaaaaaaaaaaaaaaaa\"\n"
6133       "         \"aaaaaaaaaaaaaaaa\";",
6134       format("aaaaaa ="
6135              "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
6136              "aaaaaaaaaaaaaaaaaaaaa\" "
6137              "\"aaaaaaaaaaaaaaaa\";"));
6138   verifyFormat("a = a + \"a\"\n"
6139                "        \"a\"\n"
6140                "        \"a\";");
6141   verifyFormat("f(\"a\", \"b\"\n"
6142                "       \"c\");");
6143 
6144   verifyFormat(
6145       "#define LL_FORMAT \"ll\"\n"
6146       "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
6147       "       \"d, ddddddddd: %\" LL_FORMAT \"d\");");
6148 
6149   verifyFormat("#define A(X)          \\\n"
6150                "  \"aaaaa\" #X \"bbbbbb\" \\\n"
6151                "  \"ccccc\"",
6152                getLLVMStyleWithColumns(23));
6153   verifyFormat("#define A \"def\"\n"
6154                "f(\"abc\" A \"ghi\"\n"
6155                "  \"jkl\");");
6156 
6157   verifyFormat("f(L\"a\"\n"
6158                "  L\"b\");");
6159   verifyFormat("#define A(X)            \\\n"
6160                "  L\"aaaaa\" #X L\"bbbbbb\" \\\n"
6161                "  L\"ccccc\"",
6162                getLLVMStyleWithColumns(25));
6163 
6164   verifyFormat("f(@\"a\"\n"
6165                "  @\"b\");");
6166   verifyFormat("NSString s = @\"a\"\n"
6167                "             @\"b\"\n"
6168                "             @\"c\";");
6169   verifyFormat("NSString s = @\"a\"\n"
6170                "              \"b\"\n"
6171                "              \"c\";");
6172 }
6173 
6174 TEST_F(FormatTest, ReturnTypeBreakingStyle) {
6175   FormatStyle Style = getLLVMStyle();
6176   // No declarations or definitions should be moved to own line.
6177   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;
6178   verifyFormat("class A {\n"
6179                "  int f() { return 1; }\n"
6180                "  int g();\n"
6181                "};\n"
6182                "int f() { return 1; }\n"
6183                "int g();\n",
6184                Style);
6185 
6186   // All declarations and definitions should have the return type moved to its
6187   // own
6188   // line.
6189   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
6190   verifyFormat("class E {\n"
6191                "  int\n"
6192                "  f() {\n"
6193                "    return 1;\n"
6194                "  }\n"
6195                "  int\n"
6196                "  g();\n"
6197                "};\n"
6198                "int\n"
6199                "f() {\n"
6200                "  return 1;\n"
6201                "}\n"
6202                "int\n"
6203                "g();\n",
6204                Style);
6205 
6206   // Top-level definitions, and no kinds of declarations should have the
6207   // return type moved to its own line.
6208   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions;
6209   verifyFormat("class B {\n"
6210                "  int f() { return 1; }\n"
6211                "  int g();\n"
6212                "};\n"
6213                "int\n"
6214                "f() {\n"
6215                "  return 1;\n"
6216                "}\n"
6217                "int g();\n",
6218                Style);
6219 
6220   // Top-level definitions and declarations should have the return type moved
6221   // to its own line.
6222   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;
6223   verifyFormat("class C {\n"
6224                "  int f() { return 1; }\n"
6225                "  int g();\n"
6226                "};\n"
6227                "int\n"
6228                "f() {\n"
6229                "  return 1;\n"
6230                "}\n"
6231                "int\n"
6232                "g();\n",
6233                Style);
6234 
6235   // All definitions should have the return type moved to its own line, but no
6236   // kinds of declarations.
6237   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
6238   verifyFormat("class D {\n"
6239                "  int\n"
6240                "  f() {\n"
6241                "    return 1;\n"
6242                "  }\n"
6243                "  int g();\n"
6244                "};\n"
6245                "int\n"
6246                "f() {\n"
6247                "  return 1;\n"
6248                "}\n"
6249                "int g();\n",
6250                Style);
6251   verifyFormat("const char *\n"
6252                "f(void) {\n" // Break here.
6253                "  return \"\";\n"
6254                "}\n"
6255                "const char *bar(void);\n", // No break here.
6256                Style);
6257   verifyFormat("template <class T>\n"
6258                "T *\n"
6259                "f(T &c) {\n" // Break here.
6260                "  return NULL;\n"
6261                "}\n"
6262                "template <class T> T *f(T &c);\n", // No break here.
6263                Style);
6264   verifyFormat("class C {\n"
6265                "  int\n"
6266                "  operator+() {\n"
6267                "    return 1;\n"
6268                "  }\n"
6269                "  int\n"
6270                "  operator()() {\n"
6271                "    return 1;\n"
6272                "  }\n"
6273                "};\n",
6274                Style);
6275   verifyFormat("void\n"
6276                "A::operator()() {}\n"
6277                "void\n"
6278                "A::operator>>() {}\n"
6279                "void\n"
6280                "A::operator+() {}\n"
6281                "void\n"
6282                "A::operator*() {}\n"
6283                "void\n"
6284                "A::operator->() {}\n"
6285                "void\n"
6286                "A::operator void *() {}\n"
6287                "void\n"
6288                "A::operator void &() {}\n"
6289                "void\n"
6290                "A::operator void &&() {}\n"
6291                "void\n"
6292                "A::operator char *() {}\n"
6293                "void\n"
6294                "A::operator[]() {}\n"
6295                "void\n"
6296                "A::operator!() {}\n"
6297                "void\n"
6298                "A::operator**() {}\n"
6299                "void\n"
6300                "A::operator<Foo> *() {}\n"
6301                "void\n"
6302                "A::operator<Foo> **() {}\n"
6303                "void\n"
6304                "A::operator<Foo> &() {}\n"
6305                "void\n"
6306                "A::operator void **() {}\n",
6307                Style);
6308   verifyFormat("constexpr auto\n"
6309                "operator()() const -> reference {}\n"
6310                "constexpr auto\n"
6311                "operator>>() const -> reference {}\n"
6312                "constexpr auto\n"
6313                "operator+() const -> reference {}\n"
6314                "constexpr auto\n"
6315                "operator*() const -> reference {}\n"
6316                "constexpr auto\n"
6317                "operator->() const -> reference {}\n"
6318                "constexpr auto\n"
6319                "operator++() const -> reference {}\n"
6320                "constexpr auto\n"
6321                "operator void *() const -> reference {}\n"
6322                "constexpr auto\n"
6323                "operator void **() const -> reference {}\n"
6324                "constexpr auto\n"
6325                "operator void *() const -> reference {}\n"
6326                "constexpr auto\n"
6327                "operator void &() const -> reference {}\n"
6328                "constexpr auto\n"
6329                "operator void &&() const -> reference {}\n"
6330                "constexpr auto\n"
6331                "operator char *() const -> reference {}\n"
6332                "constexpr auto\n"
6333                "operator!() const -> reference {}\n"
6334                "constexpr auto\n"
6335                "operator[]() const -> reference {}\n",
6336                Style);
6337   verifyFormat("void *operator new(std::size_t s);", // No break here.
6338                Style);
6339   verifyFormat("void *\n"
6340                "operator new(std::size_t s) {}",
6341                Style);
6342   verifyFormat("void *\n"
6343                "operator delete[](void *ptr) {}",
6344                Style);
6345   Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
6346   verifyFormat("const char *\n"
6347                "f(void)\n" // Break here.
6348                "{\n"
6349                "  return \"\";\n"
6350                "}\n"
6351                "const char *bar(void);\n", // No break here.
6352                Style);
6353   verifyFormat("template <class T>\n"
6354                "T *\n"     // Problem here: no line break
6355                "f(T &c)\n" // Break here.
6356                "{\n"
6357                "  return NULL;\n"
6358                "}\n"
6359                "template <class T> T *f(T &c);\n", // No break here.
6360                Style);
6361   verifyFormat("int\n"
6362                "foo(A<bool> a)\n"
6363                "{\n"
6364                "  return a;\n"
6365                "}\n",
6366                Style);
6367   verifyFormat("int\n"
6368                "foo(A<8> a)\n"
6369                "{\n"
6370                "  return a;\n"
6371                "}\n",
6372                Style);
6373   verifyFormat("int\n"
6374                "foo(A<B<bool>, 8> a)\n"
6375                "{\n"
6376                "  return a;\n"
6377                "}\n",
6378                Style);
6379   verifyFormat("int\n"
6380                "foo(A<B<8>, bool> a)\n"
6381                "{\n"
6382                "  return a;\n"
6383                "}\n",
6384                Style);
6385   verifyFormat("int\n"
6386                "foo(A<B<bool>, bool> a)\n"
6387                "{\n"
6388                "  return a;\n"
6389                "}\n",
6390                Style);
6391   verifyFormat("int\n"
6392                "foo(A<B<8>, 8> a)\n"
6393                "{\n"
6394                "  return a;\n"
6395                "}\n",
6396                Style);
6397 
6398   Style = getGNUStyle();
6399 
6400   // Test for comments at the end of function declarations.
6401   verifyFormat("void\n"
6402                "foo (int a, /*abc*/ int b) // def\n"
6403                "{\n"
6404                "}\n",
6405                Style);
6406 
6407   verifyFormat("void\n"
6408                "foo (int a, /* abc */ int b) /* def */\n"
6409                "{\n"
6410                "}\n",
6411                Style);
6412 
6413   // Definitions that should not break after return type
6414   verifyFormat("void foo (int a, int b); // def\n", Style);
6415   verifyFormat("void foo (int a, int b); /* def */\n", Style);
6416   verifyFormat("void foo (int a, int b);\n", Style);
6417 }
6418 
6419 TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
6420   FormatStyle NoBreak = getLLVMStyle();
6421   NoBreak.AlwaysBreakBeforeMultilineStrings = false;
6422   FormatStyle Break = getLLVMStyle();
6423   Break.AlwaysBreakBeforeMultilineStrings = true;
6424   verifyFormat("aaaa = \"bbbb\"\n"
6425                "       \"cccc\";",
6426                NoBreak);
6427   verifyFormat("aaaa =\n"
6428                "    \"bbbb\"\n"
6429                "    \"cccc\";",
6430                Break);
6431   verifyFormat("aaaa(\"bbbb\"\n"
6432                "     \"cccc\");",
6433                NoBreak);
6434   verifyFormat("aaaa(\n"
6435                "    \"bbbb\"\n"
6436                "    \"cccc\");",
6437                Break);
6438   verifyFormat("aaaa(qqq, \"bbbb\"\n"
6439                "          \"cccc\");",
6440                NoBreak);
6441   verifyFormat("aaaa(qqq,\n"
6442                "     \"bbbb\"\n"
6443                "     \"cccc\");",
6444                Break);
6445   verifyFormat("aaaa(qqq,\n"
6446                "     L\"bbbb\"\n"
6447                "     L\"cccc\");",
6448                Break);
6449   verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n"
6450                "                      \"bbbb\"));",
6451                Break);
6452   verifyFormat("string s = someFunction(\n"
6453                "    \"abc\"\n"
6454                "    \"abc\");",
6455                Break);
6456 
6457   // As we break before unary operators, breaking right after them is bad.
6458   verifyFormat("string foo = abc ? \"x\"\n"
6459                "                   \"blah blah blah blah blah blah\"\n"
6460                "                 : \"y\";",
6461                Break);
6462 
6463   // Don't break if there is no column gain.
6464   verifyFormat("f(\"aaaa\"\n"
6465                "  \"bbbb\");",
6466                Break);
6467 
6468   // Treat literals with escaped newlines like multi-line string literals.
6469   EXPECT_EQ("x = \"a\\\n"
6470             "b\\\n"
6471             "c\";",
6472             format("x = \"a\\\n"
6473                    "b\\\n"
6474                    "c\";",
6475                    NoBreak));
6476   EXPECT_EQ("xxxx =\n"
6477             "    \"a\\\n"
6478             "b\\\n"
6479             "c\";",
6480             format("xxxx = \"a\\\n"
6481                    "b\\\n"
6482                    "c\";",
6483                    Break));
6484 
6485   EXPECT_EQ("NSString *const kString =\n"
6486             "    @\"aaaa\"\n"
6487             "    @\"bbbb\";",
6488             format("NSString *const kString = @\"aaaa\"\n"
6489                    "@\"bbbb\";",
6490                    Break));
6491 
6492   Break.ColumnLimit = 0;
6493   verifyFormat("const char *hello = \"hello llvm\";", Break);
6494 }
6495 
6496 TEST_F(FormatTest, AlignsPipes) {
6497   verifyFormat(
6498       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6499       "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6500       "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
6501   verifyFormat(
6502       "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
6503       "                     << aaaaaaaaaaaaaaaaaaaa;");
6504   verifyFormat(
6505       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6506       "                                 << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
6507   verifyFormat(
6508       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
6509       "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
6510   verifyFormat(
6511       "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
6512       "                \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
6513       "             << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
6514   verifyFormat(
6515       "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6516       "                                 << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6517       "         << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
6518   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6519                "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6520                "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6521                "             << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
6522   verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n"
6523                "             << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);");
6524   verifyFormat(
6525       "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6526       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6527   verifyFormat(
6528       "auto Diag = diag() << aaaaaaaaaaaaaaaa(aaaaaaaaaaaa, aaaaaaaaaaaaa,\n"
6529       "                                       aaaaaaaaaaaaaaaaaaaaaaaaaa);");
6530 
6531   verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n"
6532                "             << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();");
6533   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6534                "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6535                "                    aaaaaaaaaaaaaaaaaaaaa)\n"
6536                "             << aaaaaaaaaaaaaaaaaaaaaaaaaa;");
6537   verifyFormat("LOG_IF(aaa == //\n"
6538                "       bbb)\n"
6539                "    << a << b;");
6540 
6541   // But sometimes, breaking before the first "<<" is desirable.
6542   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
6543                "    << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);");
6544   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n"
6545                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6546                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
6547   verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n"
6548                "    << BEF << IsTemplate << Description << E->getType();");
6549   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
6550                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6551                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6552   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
6553                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6554                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6555                "    << aaa;");
6556 
6557   verifyFormat(
6558       "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6559       "                    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
6560 
6561   // Incomplete string literal.
6562   EXPECT_EQ("llvm::errs() << \"\n"
6563             "             << a;",
6564             format("llvm::errs() << \"\n<<a;"));
6565 
6566   verifyFormat("void f() {\n"
6567                "  CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n"
6568                "      << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n"
6569                "}");
6570 
6571   // Handle 'endl'.
6572   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n"
6573                "             << bbbbbbbbbbbbbbbbbbbbbb << endl;");
6574   verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;");
6575 
6576   // Handle '\n'.
6577   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n"
6578                "             << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
6579   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n"
6580                "             << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';");
6581   verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n"
6582                "             << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";");
6583   verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
6584 }
6585 
6586 TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) {
6587   verifyFormat("return out << \"somepacket = {\\n\"\n"
6588                "           << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
6589                "           << \" bbbb = \" << pkt.bbbb << \"\\n\"\n"
6590                "           << \" cccccc = \" << pkt.cccccc << \"\\n\"\n"
6591                "           << \" ddd = [\" << pkt.ddd << \"]\\n\"\n"
6592                "           << \"}\";");
6593 
6594   verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
6595                "             << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
6596                "             << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;");
6597   verifyFormat(
6598       "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
6599       "             << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
6600       "             << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
6601       "             << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
6602       "             << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
6603   verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
6604                "             << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
6605   verifyFormat(
6606       "void f() {\n"
6607       "  llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n"
6608       "               << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
6609       "}");
6610 
6611   // Breaking before the first "<<" is generally not desirable.
6612   verifyFormat(
6613       "llvm::errs()\n"
6614       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6615       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6616       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6617       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
6618       getLLVMStyleWithColumns(70));
6619   verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n"
6620                "             << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6621                "             << \"aaaaaaaaaaaaaaaaaaa: \"\n"
6622                "             << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6623                "             << \"aaaaaaaaaaaaaaaaaaa: \"\n"
6624                "             << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
6625                getLLVMStyleWithColumns(70));
6626 
6627   verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
6628                "           \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
6629                "           \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;");
6630   verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
6631                "                  \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
6632                "                  \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);");
6633   verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n"
6634                "           (aaaa + aaaa);",
6635                getLLVMStyleWithColumns(40));
6636   verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n"
6637                "                  (aaaaaaa + aaaaa));",
6638                getLLVMStyleWithColumns(40));
6639   verifyFormat(
6640       "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n"
6641       "                  SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n"
6642       "                  bbbbbbbbbbbbbbbbbbbbbbb);");
6643 }
6644 
6645 TEST_F(FormatTest, UnderstandsEquals) {
6646   verifyFormat(
6647       "aaaaaaaaaaaaaaaaa =\n"
6648       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
6649   verifyFormat(
6650       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6651       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
6652   verifyFormat(
6653       "if (a) {\n"
6654       "  f();\n"
6655       "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6656       "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
6657       "}");
6658 
6659   verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6660                "        100000000 + 10000000) {\n}");
6661 }
6662 
6663 TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
6664   verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
6665                "    .looooooooooooooooooooooooooooooooooooooongFunction();");
6666 
6667   verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
6668                "    ->looooooooooooooooooooooooooooooooooooooongFunction();");
6669 
6670   verifyFormat(
6671       "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
6672       "                                                          Parameter2);");
6673 
6674   verifyFormat(
6675       "ShortObject->shortFunction(\n"
6676       "    LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
6677       "    LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
6678 
6679   verifyFormat("loooooooooooooongFunction(\n"
6680                "    LoooooooooooooongObject->looooooooooooooooongFunction());");
6681 
6682   verifyFormat(
6683       "function(LoooooooooooooooooooooooooooooooooooongObject\n"
6684       "             ->loooooooooooooooooooooooooooooooooooooooongFunction());");
6685 
6686   verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
6687                "    .WillRepeatedly(Return(SomeValue));");
6688   verifyFormat("void f() {\n"
6689                "  EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
6690                "      .Times(2)\n"
6691                "      .WillRepeatedly(Return(SomeValue));\n"
6692                "}");
6693   verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n"
6694                "    ccccccccccccccccccccccc);");
6695   verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6696                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6697                "          .aaaaa(aaaaa),\n"
6698                "      aaaaaaaaaaaaaaaaaaaaa);");
6699   verifyFormat("void f() {\n"
6700                "  aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6701                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n"
6702                "}");
6703   verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6704                "      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6705                "    .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6706                "                        aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6707                "                        aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
6708   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6709                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6710                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6711                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
6712                "}");
6713 
6714   // Here, it is not necessary to wrap at "." or "->".
6715   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
6716                "    aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
6717   verifyFormat(
6718       "aaaaaaaaaaa->aaaaaaaaa(\n"
6719       "    aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6720       "    aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
6721 
6722   verifyFormat(
6723       "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6724       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
6725   verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
6726                "                         aaaaaaaaa()->aaaaaa()->aaaaa());");
6727   verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
6728                "                         aaaaaaaaa()->aaaaaa()->aaaaa());");
6729 
6730   verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6731                "      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6732                "    .a();");
6733 
6734   FormatStyle NoBinPacking = getLLVMStyle();
6735   NoBinPacking.BinPackParameters = false;
6736   verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
6737                "    .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
6738                "    .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
6739                "                         aaaaaaaaaaaaaaaaaaa,\n"
6740                "                         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
6741                NoBinPacking);
6742 
6743   // If there is a subsequent call, change to hanging indentation.
6744   verifyFormat(
6745       "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6746       "                         aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n"
6747       "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
6748   verifyFormat(
6749       "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6750       "    aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));");
6751   verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6752                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6753                "                 .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
6754   verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6755                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6756                "               .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
6757 }
6758 
6759 TEST_F(FormatTest, WrapsTemplateDeclarations) {
6760   verifyFormat("template <typename T>\n"
6761                "virtual void loooooooooooongFunction(int Param1, int Param2);");
6762   verifyFormat("template <typename T>\n"
6763                "// T should be one of {A, B}.\n"
6764                "virtual void loooooooooooongFunction(int Param1, int Param2);");
6765   verifyFormat(
6766       "template <typename T>\n"
6767       "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
6768   verifyFormat("template <typename T>\n"
6769                "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
6770                "       int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
6771   verifyFormat(
6772       "template <typename T>\n"
6773       "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
6774       "                                      int Paaaaaaaaaaaaaaaaaaaaram2);");
6775   verifyFormat(
6776       "template <typename T>\n"
6777       "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
6778       "                    aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
6779       "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6780   verifyFormat("template <typename T>\n"
6781                "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6782                "    int aaaaaaaaaaaaaaaaaaaaaa);");
6783   verifyFormat(
6784       "template <typename T1, typename T2 = char, typename T3 = char,\n"
6785       "          typename T4 = char>\n"
6786       "void f();");
6787   verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n"
6788                "          template <typename> class cccccccccccccccccccccc,\n"
6789                "          typename ddddddddddddd>\n"
6790                "class C {};");
6791   verifyFormat(
6792       "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
6793       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6794 
6795   verifyFormat("void f() {\n"
6796                "  a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
6797                "      a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n"
6798                "}");
6799 
6800   verifyFormat("template <typename T> class C {};");
6801   verifyFormat("template <typename T> void f();");
6802   verifyFormat("template <typename T> void f() {}");
6803   verifyFormat(
6804       "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
6805       "              aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6806       "              aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n"
6807       "    new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
6808       "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6809       "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
6810       "        bbbbbbbbbbbbbbbbbbbbbbbb);",
6811       getLLVMStyleWithColumns(72));
6812   EXPECT_EQ("static_cast<A< //\n"
6813             "    B> *>(\n"
6814             "\n"
6815             ");",
6816             format("static_cast<A<//\n"
6817                    "    B>*>(\n"
6818                    "\n"
6819                    "    );"));
6820   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6821                "    const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);");
6822 
6823   FormatStyle AlwaysBreak = getLLVMStyle();
6824   AlwaysBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes;
6825   verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);
6826   verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);
6827   verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);
6828   verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6829                "                         bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
6830                "    ccccccccccccccccccccccccccccccccccccccccccccccc);");
6831   verifyFormat("template <template <typename> class Fooooooo,\n"
6832                "          template <typename> class Baaaaaaar>\n"
6833                "struct C {};",
6834                AlwaysBreak);
6835   verifyFormat("template <typename T> // T can be A, B or C.\n"
6836                "struct C {};",
6837                AlwaysBreak);
6838   verifyFormat("template <enum E> class A {\n"
6839                "public:\n"
6840                "  E *f();\n"
6841                "};");
6842 
6843   FormatStyle NeverBreak = getLLVMStyle();
6844   NeverBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_No;
6845   verifyFormat("template <typename T> class C {};", NeverBreak);
6846   verifyFormat("template <typename T> void f();", NeverBreak);
6847   verifyFormat("template <typename T> void f() {}", NeverBreak);
6848   verifyFormat("template <typename T>\nvoid foo(aaaaaaaaaaaaaaaaaaaaaaaaaa "
6849                "bbbbbbbbbbbbbbbbbbbb) {}",
6850                NeverBreak);
6851   verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6852                "                         bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
6853                "    ccccccccccccccccccccccccccccccccccccccccccccccc);",
6854                NeverBreak);
6855   verifyFormat("template <template <typename> class Fooooooo,\n"
6856                "          template <typename> class Baaaaaaar>\n"
6857                "struct C {};",
6858                NeverBreak);
6859   verifyFormat("template <typename T> // T can be A, B or C.\n"
6860                "struct C {};",
6861                NeverBreak);
6862   verifyFormat("template <enum E> class A {\n"
6863                "public:\n"
6864                "  E *f();\n"
6865                "};",
6866                NeverBreak);
6867   NeverBreak.PenaltyBreakTemplateDeclaration = 100;
6868   verifyFormat("template <typename T> void\nfoo(aaaaaaaaaaaaaaaaaaaaaaaaaa "
6869                "bbbbbbbbbbbbbbbbbbbb) {}",
6870                NeverBreak);
6871 }
6872 
6873 TEST_F(FormatTest, WrapsTemplateDeclarationsWithComments) {
6874   FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp);
6875   Style.ColumnLimit = 60;
6876   EXPECT_EQ("// Baseline - no comments.\n"
6877             "template <\n"
6878             "    typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n"
6879             "void f() {}",
6880             format("// Baseline - no comments.\n"
6881                    "template <\n"
6882                    "    typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n"
6883                    "void f() {}",
6884                    Style));
6885 
6886   EXPECT_EQ("template <\n"
6887             "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value>  // trailing\n"
6888             "void f() {}",
6889             format("template <\n"
6890                    "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n"
6891                    "void f() {}",
6892                    Style));
6893 
6894   EXPECT_EQ(
6895       "template <\n"
6896       "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value> /* line */\n"
6897       "void f() {}",
6898       format("template <typename aaaaaaaaaa<bbbbbbbbbbbb>::value>  /* line */\n"
6899              "void f() {}",
6900              Style));
6901 
6902   EXPECT_EQ(
6903       "template <\n"
6904       "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value>  // trailing\n"
6905       "                                               // multiline\n"
6906       "void f() {}",
6907       format("template <\n"
6908              "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n"
6909              "                                              // multiline\n"
6910              "void f() {}",
6911              Style));
6912 
6913   EXPECT_EQ(
6914       "template <typename aaaaaaaaaa<\n"
6915       "    bbbbbbbbbbbb>::value>  // trailing loooong\n"
6916       "void f() {}",
6917       format(
6918           "template <\n"
6919           "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing loooong\n"
6920           "void f() {}",
6921           Style));
6922 }
6923 
6924 TEST_F(FormatTest, WrapsTemplateParameters) {
6925   FormatStyle Style = getLLVMStyle();
6926   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
6927   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
6928   verifyFormat(
6929       "template <typename... a> struct q {};\n"
6930       "extern q<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
6931       "    aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
6932       "    y;",
6933       Style);
6934   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
6935   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
6936   verifyFormat(
6937       "template <typename... a> struct r {};\n"
6938       "extern r<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
6939       "    aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
6940       "    y;",
6941       Style);
6942   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
6943   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
6944   verifyFormat("template <typename... a> struct s {};\n"
6945                "extern s<\n"
6946                "    aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, "
6947                "aaaaaaaaaaaaaaaaaaaaaa,\n"
6948                "    aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, "
6949                "aaaaaaaaaaaaaaaaaaaaaa>\n"
6950                "    y;",
6951                Style);
6952   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
6953   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
6954   verifyFormat("template <typename... a> struct t {};\n"
6955                "extern t<\n"
6956                "    aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, "
6957                "aaaaaaaaaaaaaaaaaaaaaa,\n"
6958                "    aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, "
6959                "aaaaaaaaaaaaaaaaaaaaaa>\n"
6960                "    y;",
6961                Style);
6962 }
6963 
6964 TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
6965   verifyFormat(
6966       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6967       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
6968   verifyFormat(
6969       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6970       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6971       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
6972 
6973   // FIXME: Should we have the extra indent after the second break?
6974   verifyFormat(
6975       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6976       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6977       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
6978 
6979   verifyFormat(
6980       "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
6981       "                    cccccccccccccccccccccccccccccccccccccccccccccc());");
6982 
6983   // Breaking at nested name specifiers is generally not desirable.
6984   verifyFormat(
6985       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6986       "    aaaaaaaaaaaaaaaaaaaaaaa);");
6987 
6988   verifyFormat("aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n"
6989                "                   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6990                "                       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6991                "                   aaaaaaaaaaaaaaaaaaaaa);",
6992                getLLVMStyleWithColumns(74));
6993 
6994   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6995                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6996                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
6997 }
6998 
6999 TEST_F(FormatTest, UnderstandsTemplateParameters) {
7000   verifyFormat("A<int> a;");
7001   verifyFormat("A<A<A<int>>> a;");
7002   verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
7003   verifyFormat("bool x = a < 1 || 2 > a;");
7004   verifyFormat("bool x = 5 < f<int>();");
7005   verifyFormat("bool x = f<int>() > 5;");
7006   verifyFormat("bool x = 5 < a<int>::x;");
7007   verifyFormat("bool x = a < 4 ? a > 2 : false;");
7008   verifyFormat("bool x = f() ? a < 2 : a > 2;");
7009 
7010   verifyGoogleFormat("A<A<int>> a;");
7011   verifyGoogleFormat("A<A<A<int>>> a;");
7012   verifyGoogleFormat("A<A<A<A<int>>>> a;");
7013   verifyGoogleFormat("A<A<int> > a;");
7014   verifyGoogleFormat("A<A<A<int> > > a;");
7015   verifyGoogleFormat("A<A<A<A<int> > > > a;");
7016   verifyGoogleFormat("A<::A<int>> a;");
7017   verifyGoogleFormat("A<::A> a;");
7018   verifyGoogleFormat("A< ::A> a;");
7019   verifyGoogleFormat("A< ::A<int> > a;");
7020   EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
7021   EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
7022   EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle()));
7023   EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle()));
7024   EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };",
7025             format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle()));
7026 
7027   verifyFormat("A<A<int>> a;", getChromiumStyle(FormatStyle::LK_Cpp));
7028 
7029   // template closer followed by a token that starts with > or =
7030   verifyFormat("bool b = a<1> > 1;");
7031   verifyFormat("bool b = a<1> >= 1;");
7032   verifyFormat("int i = a<1> >> 1;");
7033   FormatStyle Style = getLLVMStyle();
7034   Style.SpaceBeforeAssignmentOperators = false;
7035   verifyFormat("bool b= a<1> == 1;", Style);
7036   verifyFormat("a<int> = 1;", Style);
7037   verifyFormat("a<int> >>= 1;", Style);
7038 
7039   verifyFormat("test >> a >> b;");
7040   verifyFormat("test << a >> b;");
7041 
7042   verifyFormat("f<int>();");
7043   verifyFormat("template <typename T> void f() {}");
7044   verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;");
7045   verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : "
7046                "sizeof(char)>::type>;");
7047   verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};");
7048   verifyFormat("f(a.operator()<A>());");
7049   verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7050                "      .template operator()<A>());",
7051                getLLVMStyleWithColumns(35));
7052 
7053   // Not template parameters.
7054   verifyFormat("return a < b && c > d;");
7055   verifyFormat("void f() {\n"
7056                "  while (a < b && c > d) {\n"
7057                "  }\n"
7058                "}");
7059   verifyFormat("template <typename... Types>\n"
7060                "typename enable_if<0 < sizeof...(Types)>::type Foo() {}");
7061 
7062   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7063                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);",
7064                getLLVMStyleWithColumns(60));
7065   verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");");
7066   verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}");
7067   verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <");
7068 }
7069 
7070 TEST_F(FormatTest, BitshiftOperatorWidth) {
7071   EXPECT_EQ("int a = 1 << 2; /* foo\n"
7072             "                   bar */",
7073             format("int    a=1<<2;  /* foo\n"
7074                    "                   bar */"));
7075 
7076   EXPECT_EQ("int b = 256 >> 1; /* foo\n"
7077             "                     bar */",
7078             format("int  b  =256>>1 ;  /* foo\n"
7079                    "                      bar */"));
7080 }
7081 
7082 TEST_F(FormatTest, UnderstandsBinaryOperators) {
7083   verifyFormat("COMPARE(a, ==, b);");
7084   verifyFormat("auto s = sizeof...(Ts) - 1;");
7085 }
7086 
7087 TEST_F(FormatTest, UnderstandsPointersToMembers) {
7088   verifyFormat("int A::*x;");
7089   verifyFormat("int (S::*func)(void *);");
7090   verifyFormat("void f() { int (S::*func)(void *); }");
7091   verifyFormat("typedef bool *(Class::*Member)() const;");
7092   verifyFormat("void f() {\n"
7093                "  (a->*f)();\n"
7094                "  a->*x;\n"
7095                "  (a.*f)();\n"
7096                "  ((*a).*f)();\n"
7097                "  a.*x;\n"
7098                "}");
7099   verifyFormat("void f() {\n"
7100                "  (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
7101                "      aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
7102                "}");
7103   verifyFormat(
7104       "(aaaaaaaaaa->*bbbbbbb)(\n"
7105       "    aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
7106   FormatStyle Style = getLLVMStyle();
7107   Style.PointerAlignment = FormatStyle::PAS_Left;
7108   verifyFormat("typedef bool* (Class::*Member)() const;", Style);
7109 }
7110 
7111 TEST_F(FormatTest, UnderstandsUnaryOperators) {
7112   verifyFormat("int a = -2;");
7113   verifyFormat("f(-1, -2, -3);");
7114   verifyFormat("a[-1] = 5;");
7115   verifyFormat("int a = 5 + -2;");
7116   verifyFormat("if (i == -1) {\n}");
7117   verifyFormat("if (i != -1) {\n}");
7118   verifyFormat("if (i > -1) {\n}");
7119   verifyFormat("if (i < -1) {\n}");
7120   verifyFormat("++(a->f());");
7121   verifyFormat("--(a->f());");
7122   verifyFormat("(a->f())++;");
7123   verifyFormat("a[42]++;");
7124   verifyFormat("if (!(a->f())) {\n}");
7125   verifyFormat("if (!+i) {\n}");
7126   verifyFormat("~&a;");
7127 
7128   verifyFormat("a-- > b;");
7129   verifyFormat("b ? -a : c;");
7130   verifyFormat("n * sizeof char16;");
7131   verifyFormat("n * alignof char16;", getGoogleStyle());
7132   verifyFormat("sizeof(char);");
7133   verifyFormat("alignof(char);", getGoogleStyle());
7134 
7135   verifyFormat("return -1;");
7136   verifyFormat("throw -1;");
7137   verifyFormat("switch (a) {\n"
7138                "case -1:\n"
7139                "  break;\n"
7140                "}");
7141   verifyFormat("#define X -1");
7142   verifyFormat("#define X -kConstant");
7143 
7144   verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};");
7145   verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};");
7146 
7147   verifyFormat("int a = /* confusing comment */ -1;");
7148   // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
7149   verifyFormat("int a = i /* confusing comment */++;");
7150 
7151   verifyFormat("co_yield -1;");
7152   verifyFormat("co_return -1;");
7153 }
7154 
7155 TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) {
7156   verifyFormat("if (!aaaaaaaaaa( // break\n"
7157                "        aaaaa)) {\n"
7158                "}");
7159   verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
7160                "    aaaaa));");
7161   verifyFormat("*aaa = aaaaaaa( // break\n"
7162                "    bbbbbb);");
7163 }
7164 
7165 TEST_F(FormatTest, UnderstandsOverloadedOperators) {
7166   verifyFormat("bool operator<();");
7167   verifyFormat("bool operator>();");
7168   verifyFormat("bool operator=();");
7169   verifyFormat("bool operator==();");
7170   verifyFormat("bool operator!=();");
7171   verifyFormat("int operator+();");
7172   verifyFormat("int operator++();");
7173   verifyFormat("int operator++(int) volatile noexcept;");
7174   verifyFormat("bool operator,();");
7175   verifyFormat("bool operator();");
7176   verifyFormat("bool operator()();");
7177   verifyFormat("bool operator[]();");
7178   verifyFormat("operator bool();");
7179   verifyFormat("operator int();");
7180   verifyFormat("operator void *();");
7181   verifyFormat("operator SomeType<int>();");
7182   verifyFormat("operator SomeType<int, int>();");
7183   verifyFormat("operator SomeType<SomeType<int>>();");
7184   verifyFormat("void *operator new(std::size_t size);");
7185   verifyFormat("void *operator new[](std::size_t size);");
7186   verifyFormat("void operator delete(void *ptr);");
7187   verifyFormat("void operator delete[](void *ptr);");
7188   verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
7189                "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
7190   verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n"
7191                "    aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;");
7192 
7193   verifyFormat(
7194       "ostream &operator<<(ostream &OutputStream,\n"
7195       "                    SomeReallyLongType WithSomeReallyLongValue);");
7196   verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
7197                "               const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
7198                "  return left.group < right.group;\n"
7199                "}");
7200   verifyFormat("SomeType &operator=(const SomeType &S);");
7201   verifyFormat("f.template operator()<int>();");
7202 
7203   verifyGoogleFormat("operator void*();");
7204   verifyGoogleFormat("operator SomeType<SomeType<int>>();");
7205   verifyGoogleFormat("operator ::A();");
7206 
7207   verifyFormat("using A::operator+;");
7208   verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n"
7209                "int i;");
7210 }
7211 
7212 TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
7213   verifyFormat("Deleted &operator=(const Deleted &) & = default;");
7214   verifyFormat("Deleted &operator=(const Deleted &) && = delete;");
7215   verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;");
7216   verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;");
7217   verifyFormat("Deleted &operator=(const Deleted &) &;");
7218   verifyFormat("Deleted &operator=(const Deleted &) &&;");
7219   verifyFormat("SomeType MemberFunction(const Deleted &) &;");
7220   verifyFormat("SomeType MemberFunction(const Deleted &) &&;");
7221   verifyFormat("SomeType MemberFunction(const Deleted &) && {}");
7222   verifyFormat("SomeType MemberFunction(const Deleted &) && final {}");
7223   verifyFormat("SomeType MemberFunction(const Deleted &) && override {}");
7224   verifyFormat("void Fn(T const &) const &;");
7225   verifyFormat("void Fn(T const volatile &&) const volatile &&;");
7226   verifyFormat("template <typename T>\n"
7227                "void F(T) && = delete;",
7228                getGoogleStyle());
7229 
7230   FormatStyle AlignLeft = getLLVMStyle();
7231   AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
7232   verifyFormat("void A::b() && {}", AlignLeft);
7233   verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
7234   verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
7235                AlignLeft);
7236   verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
7237   verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
7238   verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
7239   verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
7240   verifyFormat("auto Function(T) & -> void {}", AlignLeft);
7241   verifyFormat("auto Function(T) & -> void;", AlignLeft);
7242   verifyFormat("void Fn(T const&) const&;", AlignLeft);
7243   verifyFormat("void Fn(T const volatile&&) const volatile&&;", AlignLeft);
7244 
7245   FormatStyle Spaces = getLLVMStyle();
7246   Spaces.SpacesInCStyleCastParentheses = true;
7247   verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
7248   verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
7249   verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
7250   verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
7251 
7252   Spaces.SpacesInCStyleCastParentheses = false;
7253   Spaces.SpacesInParentheses = true;
7254   verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
7255   verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;",
7256                Spaces);
7257   verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
7258   verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
7259 
7260   FormatStyle BreakTemplate = getLLVMStyle();
7261   BreakTemplate.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes;
7262 
7263   verifyFormat("struct f {\n"
7264                "  template <class T>\n"
7265                "  int &foo(const std::string &str) &noexcept {}\n"
7266                "};",
7267                BreakTemplate);
7268 
7269   verifyFormat("struct f {\n"
7270                "  template <class T>\n"
7271                "  int &foo(const std::string &str) &&noexcept {}\n"
7272                "};",
7273                BreakTemplate);
7274 
7275   verifyFormat("struct f {\n"
7276                "  template <class T>\n"
7277                "  int &foo(const std::string &str) const &noexcept {}\n"
7278                "};",
7279                BreakTemplate);
7280 
7281   verifyFormat("struct f {\n"
7282                "  template <class T>\n"
7283                "  int &foo(const std::string &str) const &noexcept {}\n"
7284                "};",
7285                BreakTemplate);
7286 
7287   verifyFormat("struct f {\n"
7288                "  template <class T>\n"
7289                "  auto foo(const std::string &str) &&noexcept -> int & {}\n"
7290                "};",
7291                BreakTemplate);
7292 
7293   FormatStyle AlignLeftBreakTemplate = getLLVMStyle();
7294   AlignLeftBreakTemplate.AlwaysBreakTemplateDeclarations =
7295       FormatStyle::BTDS_Yes;
7296   AlignLeftBreakTemplate.PointerAlignment = FormatStyle::PAS_Left;
7297 
7298   verifyFormat("struct f {\n"
7299                "  template <class T>\n"
7300                "  int& foo(const std::string& str) & noexcept {}\n"
7301                "};",
7302                AlignLeftBreakTemplate);
7303 
7304   verifyFormat("struct f {\n"
7305                "  template <class T>\n"
7306                "  int& foo(const std::string& str) && noexcept {}\n"
7307                "};",
7308                AlignLeftBreakTemplate);
7309 
7310   verifyFormat("struct f {\n"
7311                "  template <class T>\n"
7312                "  int& foo(const std::string& str) const& noexcept {}\n"
7313                "};",
7314                AlignLeftBreakTemplate);
7315 
7316   verifyFormat("struct f {\n"
7317                "  template <class T>\n"
7318                "  int& foo(const std::string& str) const&& noexcept {}\n"
7319                "};",
7320                AlignLeftBreakTemplate);
7321 
7322   verifyFormat("struct f {\n"
7323                "  template <class T>\n"
7324                "  auto foo(const std::string& str) && noexcept -> int& {}\n"
7325                "};",
7326                AlignLeftBreakTemplate);
7327 
7328   // The `&` in `Type&` should not be confused with a trailing `&` of
7329   // DEPRECATED(reason) member function.
7330   verifyFormat("struct f {\n"
7331                "  template <class T>\n"
7332                "  DEPRECATED(reason)\n"
7333                "  Type &foo(arguments) {}\n"
7334                "};",
7335                BreakTemplate);
7336 
7337   verifyFormat("struct f {\n"
7338                "  template <class T>\n"
7339                "  DEPRECATED(reason)\n"
7340                "  Type& foo(arguments) {}\n"
7341                "};",
7342                AlignLeftBreakTemplate);
7343 
7344   verifyFormat("void (*foopt)(int) = &func;");
7345 }
7346 
7347 TEST_F(FormatTest, UnderstandsNewAndDelete) {
7348   verifyFormat("void f() {\n"
7349                "  A *a = new A;\n"
7350                "  A *a = new (placement) A;\n"
7351                "  delete a;\n"
7352                "  delete (A *)a;\n"
7353                "}");
7354   verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
7355                "    typename aaaaaaaaaaaaaaaaaaaaaaaa();");
7356   verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7357                "    new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
7358                "        typename aaaaaaaaaaaaaaaaaaaaaaaa();");
7359   verifyFormat("delete[] h->p;");
7360 }
7361 
7362 TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
7363   verifyFormat("int *f(int *a) {}");
7364   verifyFormat("int main(int argc, char **argv) {}");
7365   verifyFormat("Test::Test(int b) : a(b * b) {}");
7366   verifyIndependentOfContext("f(a, *a);");
7367   verifyFormat("void g() { f(*a); }");
7368   verifyIndependentOfContext("int a = b * 10;");
7369   verifyIndependentOfContext("int a = 10 * b;");
7370   verifyIndependentOfContext("int a = b * c;");
7371   verifyIndependentOfContext("int a += b * c;");
7372   verifyIndependentOfContext("int a -= b * c;");
7373   verifyIndependentOfContext("int a *= b * c;");
7374   verifyIndependentOfContext("int a /= b * c;");
7375   verifyIndependentOfContext("int a = *b;");
7376   verifyIndependentOfContext("int a = *b * c;");
7377   verifyIndependentOfContext("int a = b * *c;");
7378   verifyIndependentOfContext("int a = b * (10);");
7379   verifyIndependentOfContext("S << b * (10);");
7380   verifyIndependentOfContext("return 10 * b;");
7381   verifyIndependentOfContext("return *b * *c;");
7382   verifyIndependentOfContext("return a & ~b;");
7383   verifyIndependentOfContext("f(b ? *c : *d);");
7384   verifyIndependentOfContext("int a = b ? *c : *d;");
7385   verifyIndependentOfContext("*b = a;");
7386   verifyIndependentOfContext("a * ~b;");
7387   verifyIndependentOfContext("a * !b;");
7388   verifyIndependentOfContext("a * +b;");
7389   verifyIndependentOfContext("a * -b;");
7390   verifyIndependentOfContext("a * ++b;");
7391   verifyIndependentOfContext("a * --b;");
7392   verifyIndependentOfContext("a[4] * b;");
7393   verifyIndependentOfContext("a[a * a] = 1;");
7394   verifyIndependentOfContext("f() * b;");
7395   verifyIndependentOfContext("a * [self dostuff];");
7396   verifyIndependentOfContext("int x = a * (a + b);");
7397   verifyIndependentOfContext("(a *)(a + b);");
7398   verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
7399   verifyIndependentOfContext("int *pa = (int *)&a;");
7400   verifyIndependentOfContext("return sizeof(int **);");
7401   verifyIndependentOfContext("return sizeof(int ******);");
7402   verifyIndependentOfContext("return (int **&)a;");
7403   verifyIndependentOfContext("f((*PointerToArray)[10]);");
7404   verifyFormat("void f(Type (*parameter)[10]) {}");
7405   verifyFormat("void f(Type (&parameter)[10]) {}");
7406   verifyGoogleFormat("return sizeof(int**);");
7407   verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
7408   verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
7409   verifyFormat("auto a = [](int **&, int ***) {};");
7410   verifyFormat("auto PointerBinding = [](const char *S) {};");
7411   verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
7412   verifyFormat("[](const decltype(*a) &value) {}");
7413   verifyFormat("decltype(a * b) F();");
7414   verifyFormat("#define MACRO() [](A *a) { return 1; }");
7415   verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
7416   verifyIndependentOfContext("typedef void (*f)(int *a);");
7417   verifyIndependentOfContext("int i{a * b};");
7418   verifyIndependentOfContext("aaa && aaa->f();");
7419   verifyIndependentOfContext("int x = ~*p;");
7420   verifyFormat("Constructor() : a(a), area(width * height) {}");
7421   verifyFormat("Constructor() : a(a), area(a, width * height) {}");
7422   verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
7423   verifyFormat("void f() { f(a, c * d); }");
7424   verifyFormat("void f() { f(new a(), c * d); }");
7425   verifyFormat("void f(const MyOverride &override);");
7426   verifyFormat("void f(const MyFinal &final);");
7427   verifyIndependentOfContext("bool a = f() && override.f();");
7428   verifyIndependentOfContext("bool a = f() && final.f();");
7429 
7430   verifyIndependentOfContext("InvalidRegions[*R] = 0;");
7431 
7432   verifyIndependentOfContext("A<int *> a;");
7433   verifyIndependentOfContext("A<int **> a;");
7434   verifyIndependentOfContext("A<int *, int *> a;");
7435   verifyIndependentOfContext("A<int *[]> a;");
7436   verifyIndependentOfContext(
7437       "const char *const p = reinterpret_cast<const char *const>(q);");
7438   verifyIndependentOfContext("A<int **, int **> a;");
7439   verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
7440   verifyFormat("for (char **a = b; *a; ++a) {\n}");
7441   verifyFormat("for (; a && b;) {\n}");
7442   verifyFormat("bool foo = true && [] { return false; }();");
7443 
7444   verifyFormat(
7445       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7446       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
7447 
7448   verifyGoogleFormat("int const* a = &b;");
7449   verifyGoogleFormat("**outparam = 1;");
7450   verifyGoogleFormat("*outparam = a * b;");
7451   verifyGoogleFormat("int main(int argc, char** argv) {}");
7452   verifyGoogleFormat("A<int*> a;");
7453   verifyGoogleFormat("A<int**> a;");
7454   verifyGoogleFormat("A<int*, int*> a;");
7455   verifyGoogleFormat("A<int**, int**> a;");
7456   verifyGoogleFormat("f(b ? *c : *d);");
7457   verifyGoogleFormat("int a = b ? *c : *d;");
7458   verifyGoogleFormat("Type* t = **x;");
7459   verifyGoogleFormat("Type* t = *++*x;");
7460   verifyGoogleFormat("*++*x;");
7461   verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
7462   verifyGoogleFormat("Type* t = x++ * y;");
7463   verifyGoogleFormat(
7464       "const char* const p = reinterpret_cast<const char* const>(q);");
7465   verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
7466   verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
7467   verifyGoogleFormat("template <typename T>\n"
7468                      "void f(int i = 0, SomeType** temps = NULL);");
7469 
7470   FormatStyle Left = getLLVMStyle();
7471   Left.PointerAlignment = FormatStyle::PAS_Left;
7472   verifyFormat("x = *a(x) = *a(y);", Left);
7473   verifyFormat("for (;; *a = b) {\n}", Left);
7474   verifyFormat("return *this += 1;", Left);
7475   verifyFormat("throw *x;", Left);
7476   verifyFormat("delete *x;", Left);
7477   verifyFormat("typedef typeof(int(int, int))* MyFuncPtr;", Left);
7478   verifyFormat("[](const decltype(*a)* ptr) {}", Left);
7479   verifyFormat("typedef typeof /*comment*/ (int(int, int))* MyFuncPtr;", Left);
7480   verifyFormat("auto x(A&&, B&&, C&&) -> D;", Left);
7481   verifyFormat("auto x = [](A&&, B&&, C&&) -> D {};", Left);
7482   verifyFormat("template <class T> X(T&&, T&&, T&&) -> X<T>;", Left);
7483 
7484   verifyIndependentOfContext("a = *(x + y);");
7485   verifyIndependentOfContext("a = &(x + y);");
7486   verifyIndependentOfContext("*(x + y).call();");
7487   verifyIndependentOfContext("&(x + y)->call();");
7488   verifyFormat("void f() { &(*I).first; }");
7489 
7490   verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
7491   verifyFormat(
7492       "int *MyValues = {\n"
7493       "    *A, // Operator detection might be confused by the '{'\n"
7494       "    *BB // Operator detection might be confused by previous comment\n"
7495       "};");
7496 
7497   verifyIndependentOfContext("if (int *a = &b)");
7498   verifyIndependentOfContext("if (int &a = *b)");
7499   verifyIndependentOfContext("if (a & b[i])");
7500   verifyIndependentOfContext("if constexpr (a & b[i])");
7501   verifyIndependentOfContext("if CONSTEXPR (a & b[i])");
7502   verifyIndependentOfContext("if (a * (b * c))");
7503   verifyIndependentOfContext("if constexpr (a * (b * c))");
7504   verifyIndependentOfContext("if CONSTEXPR (a * (b * c))");
7505   verifyIndependentOfContext("if (a::b::c::d & b[i])");
7506   verifyIndependentOfContext("if (*b[i])");
7507   verifyIndependentOfContext("if (int *a = (&b))");
7508   verifyIndependentOfContext("while (int *a = &b)");
7509   verifyIndependentOfContext("while (a * (b * c))");
7510   verifyIndependentOfContext("size = sizeof *a;");
7511   verifyIndependentOfContext("if (a && (b = c))");
7512   verifyFormat("void f() {\n"
7513                "  for (const int &v : Values) {\n"
7514                "  }\n"
7515                "}");
7516   verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
7517   verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
7518   verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
7519 
7520   verifyFormat("#define A (!a * b)");
7521   verifyFormat("#define MACRO     \\\n"
7522                "  int *i = a * b; \\\n"
7523                "  void f(a *b);",
7524                getLLVMStyleWithColumns(19));
7525 
7526   verifyIndependentOfContext("A = new SomeType *[Length];");
7527   verifyIndependentOfContext("A = new SomeType *[Length]();");
7528   verifyIndependentOfContext("T **t = new T *;");
7529   verifyIndependentOfContext("T **t = new T *();");
7530   verifyGoogleFormat("A = new SomeType*[Length]();");
7531   verifyGoogleFormat("A = new SomeType*[Length];");
7532   verifyGoogleFormat("T** t = new T*;");
7533   verifyGoogleFormat("T** t = new T*();");
7534 
7535   verifyFormat("STATIC_ASSERT((a & b) == 0);");
7536   verifyFormat("STATIC_ASSERT(0 == (a & b));");
7537   verifyFormat("template <bool a, bool b> "
7538                "typename t::if<x && y>::type f() {}");
7539   verifyFormat("template <int *y> f() {}");
7540   verifyFormat("vector<int *> v;");
7541   verifyFormat("vector<int *const> v;");
7542   verifyFormat("vector<int *const **const *> v;");
7543   verifyFormat("vector<int *volatile> v;");
7544   verifyFormat("vector<a * b> v;");
7545   verifyFormat("foo<b && false>();");
7546   verifyFormat("foo<b & 1>();");
7547   verifyFormat("decltype(*::std::declval<const T &>()) void F();");
7548   verifyFormat(
7549       "template <class T, class = typename std::enable_if<\n"
7550       "                       std::is_integral<T>::value &&\n"
7551       "                       (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
7552       "void F();",
7553       getLLVMStyleWithColumns(70));
7554   verifyFormat("template <class T,\n"
7555                "          class = typename std::enable_if<\n"
7556                "              std::is_integral<T>::value &&\n"
7557                "              (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n"
7558                "          class U>\n"
7559                "void F();",
7560                getLLVMStyleWithColumns(70));
7561   verifyFormat(
7562       "template <class T,\n"
7563       "          class = typename ::std::enable_if<\n"
7564       "              ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
7565       "void F();",
7566       getGoogleStyleWithColumns(68));
7567 
7568   verifyIndependentOfContext("MACRO(int *i);");
7569   verifyIndependentOfContext("MACRO(auto *a);");
7570   verifyIndependentOfContext("MACRO(const A *a);");
7571   verifyIndependentOfContext("MACRO(A *const a);");
7572   verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
7573   verifyFormat("void f() { f(float{1}, a * a); }");
7574   // FIXME: Is there a way to make this work?
7575   // verifyIndependentOfContext("MACRO(A *a);");
7576 
7577   verifyFormat("DatumHandle const *operator->() const { return input_; }");
7578   verifyFormat("return options != nullptr && operator==(*options);");
7579 
7580   EXPECT_EQ("#define OP(x)                                    \\\n"
7581             "  ostream &operator<<(ostream &s, const A &a) {  \\\n"
7582             "    return s << a.DebugString();                 \\\n"
7583             "  }",
7584             format("#define OP(x) \\\n"
7585                    "  ostream &operator<<(ostream &s, const A &a) { \\\n"
7586                    "    return s << a.DebugString(); \\\n"
7587                    "  }",
7588                    getLLVMStyleWithColumns(50)));
7589 
7590   // FIXME: We cannot handle this case yet; we might be able to figure out that
7591   // foo<x> d > v; doesn't make sense.
7592   verifyFormat("foo<a<b && c> d> v;");
7593 
7594   FormatStyle PointerMiddle = getLLVMStyle();
7595   PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
7596   verifyFormat("delete *x;", PointerMiddle);
7597   verifyFormat("int * x;", PointerMiddle);
7598   verifyFormat("int *[] x;", PointerMiddle);
7599   verifyFormat("template <int * y> f() {}", PointerMiddle);
7600   verifyFormat("int * f(int * a) {}", PointerMiddle);
7601   verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
7602   verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
7603   verifyFormat("A<int *> a;", PointerMiddle);
7604   verifyFormat("A<int **> a;", PointerMiddle);
7605   verifyFormat("A<int *, int *> a;", PointerMiddle);
7606   verifyFormat("A<int *[]> a;", PointerMiddle);
7607   verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
7608   verifyFormat("A = new SomeType *[Length];", PointerMiddle);
7609   verifyFormat("T ** t = new T *;", PointerMiddle);
7610 
7611   // Member function reference qualifiers aren't binary operators.
7612   verifyFormat("string // break\n"
7613                "operator()() & {}");
7614   verifyFormat("string // break\n"
7615                "operator()() && {}");
7616   verifyGoogleFormat("template <typename T>\n"
7617                      "auto x() & -> int {}");
7618 }
7619 
7620 TEST_F(FormatTest, UnderstandsAttributes) {
7621   verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
7622   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
7623                "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
7624   FormatStyle AfterType = getLLVMStyle();
7625   AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
7626   verifyFormat("__attribute__((nodebug)) void\n"
7627                "foo() {}\n",
7628                AfterType);
7629 }
7630 
7631 TEST_F(FormatTest, UnderstandsSquareAttributes) {
7632   verifyFormat("SomeType s [[unused]] (InitValue);");
7633   verifyFormat("SomeType s [[gnu::unused]] (InitValue);");
7634   verifyFormat("SomeType s [[using gnu: unused]] (InitValue);");
7635   verifyFormat("[[gsl::suppress(\"clang-tidy-check-name\")]] void f() {}");
7636   verifyFormat("void f() [[deprecated(\"so sorry\")]];");
7637   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7638                "    [[unused]] aaaaaaaaaaaaaaaaaaaaaaa(int i);");
7639 
7640   // Make sure we do not mistake attributes for array subscripts.
7641   verifyFormat("int a() {}\n"
7642                "[[unused]] int b() {}\n");
7643   verifyFormat("NSArray *arr;\n"
7644                "arr[[Foo() bar]];");
7645 
7646   // On the other hand, we still need to correctly find array subscripts.
7647   verifyFormat("int a = std::vector<int>{1, 2, 3}[0];");
7648 
7649   // Make sure that we do not mistake Objective-C method inside array literals
7650   // as attributes, even if those method names are also keywords.
7651   verifyFormat("@[ [foo bar] ];");
7652   verifyFormat("@[ [NSArray class] ];");
7653   verifyFormat("@[ [foo enum] ];");
7654 
7655   // Make sure we do not parse attributes as lambda introducers.
7656   FormatStyle MultiLineFunctions = getLLVMStyle();
7657   MultiLineFunctions.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
7658   verifyFormat("[[unused]] int b() {\n"
7659                "  return 42;\n"
7660                "}\n",
7661                MultiLineFunctions);
7662 }
7663 
7664 TEST_F(FormatTest, UnderstandsEllipsis) {
7665   verifyFormat("int printf(const char *fmt, ...);");
7666   verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
7667   verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
7668 
7669   FormatStyle PointersLeft = getLLVMStyle();
7670   PointersLeft.PointerAlignment = FormatStyle::PAS_Left;
7671   verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
7672 }
7673 
7674 TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
7675   EXPECT_EQ("int *a;\n"
7676             "int *a;\n"
7677             "int *a;",
7678             format("int *a;\n"
7679                    "int* a;\n"
7680                    "int *a;",
7681                    getGoogleStyle()));
7682   EXPECT_EQ("int* a;\n"
7683             "int* a;\n"
7684             "int* a;",
7685             format("int* a;\n"
7686                    "int* a;\n"
7687                    "int *a;",
7688                    getGoogleStyle()));
7689   EXPECT_EQ("int *a;\n"
7690             "int *a;\n"
7691             "int *a;",
7692             format("int *a;\n"
7693                    "int * a;\n"
7694                    "int *  a;",
7695                    getGoogleStyle()));
7696   EXPECT_EQ("auto x = [] {\n"
7697             "  int *a;\n"
7698             "  int *a;\n"
7699             "  int *a;\n"
7700             "};",
7701             format("auto x=[]{int *a;\n"
7702                    "int * a;\n"
7703                    "int *  a;};",
7704                    getGoogleStyle()));
7705 }
7706 
7707 TEST_F(FormatTest, UnderstandsRvalueReferences) {
7708   verifyFormat("int f(int &&a) {}");
7709   verifyFormat("int f(int a, char &&b) {}");
7710   verifyFormat("void f() { int &&a = b; }");
7711   verifyGoogleFormat("int f(int a, char&& b) {}");
7712   verifyGoogleFormat("void f() { int&& a = b; }");
7713 
7714   verifyIndependentOfContext("A<int &&> a;");
7715   verifyIndependentOfContext("A<int &&, int &&> a;");
7716   verifyGoogleFormat("A<int&&> a;");
7717   verifyGoogleFormat("A<int&&, int&&> a;");
7718 
7719   // Not rvalue references:
7720   verifyFormat("template <bool B, bool C> class A {\n"
7721                "  static_assert(B && C, \"Something is wrong\");\n"
7722                "};");
7723   verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
7724   verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
7725   verifyFormat("#define A(a, b) (a && b)");
7726 }
7727 
7728 TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
7729   verifyFormat("void f() {\n"
7730                "  x[aaaaaaaaa -\n"
7731                "    b] = 23;\n"
7732                "}",
7733                getLLVMStyleWithColumns(15));
7734 }
7735 
7736 TEST_F(FormatTest, FormatsCasts) {
7737   verifyFormat("Type *A = static_cast<Type *>(P);");
7738   verifyFormat("Type *A = (Type *)P;");
7739   verifyFormat("Type *A = (vector<Type *, int *>)P;");
7740   verifyFormat("int a = (int)(2.0f);");
7741   verifyFormat("int a = (int)2.0f;");
7742   verifyFormat("x[(int32)y];");
7743   verifyFormat("x = (int32)y;");
7744   verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
7745   verifyFormat("int a = (int)*b;");
7746   verifyFormat("int a = (int)2.0f;");
7747   verifyFormat("int a = (int)~0;");
7748   verifyFormat("int a = (int)++a;");
7749   verifyFormat("int a = (int)sizeof(int);");
7750   verifyFormat("int a = (int)+2;");
7751   verifyFormat("my_int a = (my_int)2.0f;");
7752   verifyFormat("my_int a = (my_int)sizeof(int);");
7753   verifyFormat("return (my_int)aaa;");
7754   verifyFormat("#define x ((int)-1)");
7755   verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
7756   verifyFormat("#define p(q) ((int *)&q)");
7757   verifyFormat("fn(a)(b) + 1;");
7758 
7759   verifyFormat("void f() { my_int a = (my_int)*b; }");
7760   verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
7761   verifyFormat("my_int a = (my_int)~0;");
7762   verifyFormat("my_int a = (my_int)++a;");
7763   verifyFormat("my_int a = (my_int)-2;");
7764   verifyFormat("my_int a = (my_int)1;");
7765   verifyFormat("my_int a = (my_int *)1;");
7766   verifyFormat("my_int a = (const my_int)-1;");
7767   verifyFormat("my_int a = (const my_int *)-1;");
7768   verifyFormat("my_int a = (my_int)(my_int)-1;");
7769   verifyFormat("my_int a = (ns::my_int)-2;");
7770   verifyFormat("case (my_int)ONE:");
7771   verifyFormat("auto x = (X)this;");
7772   // Casts in Obj-C style calls used to not be recognized as such.
7773   verifyFormat("int a = [(type*)[((type*)val) arg] arg];", getGoogleStyle());
7774 
7775   // FIXME: single value wrapped with paren will be treated as cast.
7776   verifyFormat("void f(int i = (kValue)*kMask) {}");
7777 
7778   verifyFormat("{ (void)F; }");
7779 
7780   // Don't break after a cast's
7781   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7782                "    (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
7783                "                                   bbbbbbbbbbbbbbbbbbbbbb);");
7784 
7785   // These are not casts.
7786   verifyFormat("void f(int *) {}");
7787   verifyFormat("f(foo)->b;");
7788   verifyFormat("f(foo).b;");
7789   verifyFormat("f(foo)(b);");
7790   verifyFormat("f(foo)[b];");
7791   verifyFormat("[](foo) { return 4; }(bar);");
7792   verifyFormat("(*funptr)(foo)[4];");
7793   verifyFormat("funptrs[4](foo)[4];");
7794   verifyFormat("void f(int *);");
7795   verifyFormat("void f(int *) = 0;");
7796   verifyFormat("void f(SmallVector<int>) {}");
7797   verifyFormat("void f(SmallVector<int>);");
7798   verifyFormat("void f(SmallVector<int>) = 0;");
7799   verifyFormat("void f(int i = (kA * kB) & kMask) {}");
7800   verifyFormat("int a = sizeof(int) * b;");
7801   verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
7802   verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
7803   verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
7804   verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
7805 
7806   // These are not casts, but at some point were confused with casts.
7807   verifyFormat("virtual void foo(int *) override;");
7808   verifyFormat("virtual void foo(char &) const;");
7809   verifyFormat("virtual void foo(int *a, char *) const;");
7810   verifyFormat("int a = sizeof(int *) + b;");
7811   verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
7812   verifyFormat("bool b = f(g<int>) && c;");
7813   verifyFormat("typedef void (*f)(int i) func;");
7814   verifyFormat("void operator++(int) noexcept;");
7815   verifyFormat("void operator++(int &) noexcept;");
7816   verifyFormat("void operator delete(void *, std::size_t, const std::nothrow_t "
7817                "&) noexcept;");
7818   verifyFormat(
7819       "void operator delete(std::size_t, const std::nothrow_t &) noexcept;");
7820   verifyFormat("void operator delete(const std::nothrow_t &) noexcept;");
7821   verifyFormat("void operator delete(std::nothrow_t &) noexcept;");
7822   verifyFormat("void operator delete(nothrow_t &) noexcept;");
7823   verifyFormat("void operator delete(foo &) noexcept;");
7824   verifyFormat("void operator delete(foo) noexcept;");
7825   verifyFormat("void operator delete(int) noexcept;");
7826   verifyFormat("void operator delete(int &) noexcept;");
7827   verifyFormat("void operator delete(int &) volatile noexcept;");
7828   verifyFormat("void operator delete(int &) const");
7829   verifyFormat("void operator delete(int &) = default");
7830   verifyFormat("void operator delete(int &) = delete");
7831   verifyFormat("void operator delete(int &) [[noreturn]]");
7832   verifyFormat("void operator delete(int &) throw();");
7833   verifyFormat("void operator delete(int &) throw(int);");
7834   verifyFormat("auto operator delete(int &) -> int;");
7835   verifyFormat("auto operator delete(int &) override");
7836   verifyFormat("auto operator delete(int &) final");
7837 
7838   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
7839                "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
7840   // FIXME: The indentation here is not ideal.
7841   verifyFormat(
7842       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7843       "    [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
7844       "        [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
7845 }
7846 
7847 TEST_F(FormatTest, FormatsFunctionTypes) {
7848   verifyFormat("A<bool()> a;");
7849   verifyFormat("A<SomeType()> a;");
7850   verifyFormat("A<void (*)(int, std::string)> a;");
7851   verifyFormat("A<void *(int)>;");
7852   verifyFormat("void *(*a)(int *, SomeType *);");
7853   verifyFormat("int (*func)(void *);");
7854   verifyFormat("void f() { int (*func)(void *); }");
7855   verifyFormat("template <class CallbackClass>\n"
7856                "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
7857 
7858   verifyGoogleFormat("A<void*(int*, SomeType*)>;");
7859   verifyGoogleFormat("void* (*a)(int);");
7860   verifyGoogleFormat(
7861       "template <class CallbackClass>\n"
7862       "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
7863 
7864   // Other constructs can look somewhat like function types:
7865   verifyFormat("A<sizeof(*x)> a;");
7866   verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
7867   verifyFormat("some_var = function(*some_pointer_var)[0];");
7868   verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
7869   verifyFormat("int x = f(&h)();");
7870   verifyFormat("returnsFunction(&param1, &param2)(param);");
7871   verifyFormat("std::function<\n"
7872                "    LooooooooooongTemplatedType<\n"
7873                "        SomeType>*(\n"
7874                "        LooooooooooooooooongType type)>\n"
7875                "    function;",
7876                getGoogleStyleWithColumns(40));
7877 }
7878 
7879 TEST_F(FormatTest, FormatsPointersToArrayTypes) {
7880   verifyFormat("A (*foo_)[6];");
7881   verifyFormat("vector<int> (*foo_)[6];");
7882 }
7883 
7884 TEST_F(FormatTest, BreaksLongVariableDeclarations) {
7885   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
7886                "    LoooooooooooooooooooooooooooooooooooooooongVariable;");
7887   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
7888                "    LoooooooooooooooooooooooooooooooooooooooongVariable;");
7889   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
7890                "    *LoooooooooooooooooooooooooooooooooooooooongVariable;");
7891 
7892   // Different ways of ()-initializiation.
7893   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
7894                "    LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
7895   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
7896                "    LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
7897   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
7898                "    LoooooooooooooooooooooooooooooooooooooooongVariable({});");
7899   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
7900                "    LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
7901 
7902   // Lambdas should not confuse the variable declaration heuristic.
7903   verifyFormat("LooooooooooooooooongType\n"
7904                "    variable(nullptr, [](A *a) {});",
7905                getLLVMStyleWithColumns(40));
7906 }
7907 
7908 TEST_F(FormatTest, BreaksLongDeclarations) {
7909   verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
7910                "    AnotherNameForTheLongType;");
7911   verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
7912                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
7913   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
7914                "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
7915   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
7916                "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
7917   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
7918                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
7919   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
7920                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
7921   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
7922                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
7923   verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
7924                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
7925   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
7926                "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
7927   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
7928                "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
7929   FormatStyle Indented = getLLVMStyle();
7930   Indented.IndentWrappedFunctionNames = true;
7931   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
7932                "    LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
7933                Indented);
7934   verifyFormat(
7935       "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
7936       "    LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
7937       Indented);
7938   verifyFormat(
7939       "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
7940       "    LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
7941       Indented);
7942   verifyFormat(
7943       "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
7944       "    LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
7945       Indented);
7946 
7947   // FIXME: Without the comment, this breaks after "(".
7948   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType  // break\n"
7949                "    (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
7950                getGoogleStyle());
7951 
7952   verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
7953                "                  int LoooooooooooooooooooongParam2) {}");
7954   verifyFormat(
7955       "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
7956       "                                   SourceLocation L, IdentifierIn *II,\n"
7957       "                                   Type *T) {}");
7958   verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
7959                "ReallyReaaallyLongFunctionName(\n"
7960                "    const std::string &SomeParameter,\n"
7961                "    const SomeType<string, SomeOtherTemplateParameter>\n"
7962                "        &ReallyReallyLongParameterName,\n"
7963                "    const SomeType<string, SomeOtherTemplateParameter>\n"
7964                "        &AnotherLongParameterName) {}");
7965   verifyFormat("template <typename A>\n"
7966                "SomeLoooooooooooooooooooooongType<\n"
7967                "    typename some_namespace::SomeOtherType<A>::Type>\n"
7968                "Function() {}");
7969 
7970   verifyGoogleFormat(
7971       "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
7972       "    aaaaaaaaaaaaaaaaaaaaaaa;");
7973   verifyGoogleFormat(
7974       "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
7975       "                                   SourceLocation L) {}");
7976   verifyGoogleFormat(
7977       "some_namespace::LongReturnType\n"
7978       "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
7979       "    int first_long_parameter, int second_parameter) {}");
7980 
7981   verifyGoogleFormat("template <typename T>\n"
7982                      "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
7983                      "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
7984   verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7985                      "                   int aaaaaaaaaaaaaaaaaaaaaaa);");
7986 
7987   verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
7988                "    const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7989                "        *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
7990   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7991                "    vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
7992                "        aaaaaaaaaaaaaaaaaaaaaaaa);");
7993   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7994                "    vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
7995                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
7996                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
7997 
7998   verifyFormat("template <typename T> // Templates on own line.\n"
7999                "static int            // Some comment.\n"
8000                "MyFunction(int a);",
8001                getLLVMStyle());
8002 }
8003 
8004 TEST_F(FormatTest, FormatsArrays) {
8005   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
8006                "                         [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
8007   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
8008                "                         [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
8009   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
8010                "    aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
8011   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8012                "    [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
8013   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8014                "    [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
8015   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8016                "    [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
8017                "    [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
8018   verifyFormat(
8019       "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
8020       "             << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
8021       "                                  [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
8022   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
8023                "    .aaaaaaaaaaaaaaaaaaaaaa();");
8024 
8025   verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
8026                      "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
8027   verifyFormat(
8028       "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
8029       "                                  .aaaaaaa[0]\n"
8030       "                                  .aaaaaaaaaaaaaaaaaaaaaa();");
8031   verifyFormat("a[::b::c];");
8032 
8033   verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
8034 
8035   FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
8036   verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
8037 }
8038 
8039 TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
8040   verifyFormat("(a)->b();");
8041   verifyFormat("--a;");
8042 }
8043 
8044 TEST_F(FormatTest, HandlesIncludeDirectives) {
8045   verifyFormat("#include <string>\n"
8046                "#include <a/b/c.h>\n"
8047                "#include \"a/b/string\"\n"
8048                "#include \"string.h\"\n"
8049                "#include \"string.h\"\n"
8050                "#include <a-a>\n"
8051                "#include < path with space >\n"
8052                "#include_next <test.h>"
8053                "#include \"abc.h\" // this is included for ABC\n"
8054                "#include \"some long include\" // with a comment\n"
8055                "#include \"some very long include path\"\n"
8056                "#include <some/very/long/include/path>\n",
8057                getLLVMStyleWithColumns(35));
8058   EXPECT_EQ("#include \"a.h\"", format("#include  \"a.h\""));
8059   EXPECT_EQ("#include <a>", format("#include<a>"));
8060 
8061   verifyFormat("#import <string>");
8062   verifyFormat("#import <a/b/c.h>");
8063   verifyFormat("#import \"a/b/string\"");
8064   verifyFormat("#import \"string.h\"");
8065   verifyFormat("#import \"string.h\"");
8066   verifyFormat("#if __has_include(<strstream>)\n"
8067                "#include <strstream>\n"
8068                "#endif");
8069 
8070   verifyFormat("#define MY_IMPORT <a/b>");
8071 
8072   verifyFormat("#if __has_include(<a/b>)");
8073   verifyFormat("#if __has_include_next(<a/b>)");
8074   verifyFormat("#define F __has_include(<a/b>)");
8075   verifyFormat("#define F __has_include_next(<a/b>)");
8076 
8077   // Protocol buffer definition or missing "#".
8078   verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
8079                getLLVMStyleWithColumns(30));
8080 
8081   FormatStyle Style = getLLVMStyle();
8082   Style.AlwaysBreakBeforeMultilineStrings = true;
8083   Style.ColumnLimit = 0;
8084   verifyFormat("#import \"abc.h\"", Style);
8085 
8086   // But 'import' might also be a regular C++ namespace.
8087   verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
8088                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
8089 }
8090 
8091 //===----------------------------------------------------------------------===//
8092 // Error recovery tests.
8093 //===----------------------------------------------------------------------===//
8094 
8095 TEST_F(FormatTest, IncompleteParameterLists) {
8096   FormatStyle NoBinPacking = getLLVMStyle();
8097   NoBinPacking.BinPackParameters = false;
8098   verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
8099                "                        double *min_x,\n"
8100                "                        double *max_x,\n"
8101                "                        double *min_y,\n"
8102                "                        double *max_y,\n"
8103                "                        double *min_z,\n"
8104                "                        double *max_z, ) {}",
8105                NoBinPacking);
8106 }
8107 
8108 TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
8109   verifyFormat("void f() { return; }\n42");
8110   verifyFormat("void f() {\n"
8111                "  if (0)\n"
8112                "    return;\n"
8113                "}\n"
8114                "42");
8115   verifyFormat("void f() { return }\n42");
8116   verifyFormat("void f() {\n"
8117                "  if (0)\n"
8118                "    return\n"
8119                "}\n"
8120                "42");
8121 }
8122 
8123 TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
8124   EXPECT_EQ("void f() { return }", format("void  f ( )  {  return  }"));
8125   EXPECT_EQ("void f() {\n"
8126             "  if (a)\n"
8127             "    return\n"
8128             "}",
8129             format("void  f  (  )  {  if  ( a )  return  }"));
8130   EXPECT_EQ("namespace N {\n"
8131             "void f()\n"
8132             "}",
8133             format("namespace  N  {  void f()  }"));
8134   EXPECT_EQ("namespace N {\n"
8135             "void f() {}\n"
8136             "void g()\n"
8137             "} // namespace N",
8138             format("namespace N  { void f( ) { } void g( ) }"));
8139 }
8140 
8141 TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
8142   verifyFormat("int aaaaaaaa =\n"
8143                "    // Overlylongcomment\n"
8144                "    b;",
8145                getLLVMStyleWithColumns(20));
8146   verifyFormat("function(\n"
8147                "    ShortArgument,\n"
8148                "    LoooooooooooongArgument);\n",
8149                getLLVMStyleWithColumns(20));
8150 }
8151 
8152 TEST_F(FormatTest, IncorrectAccessSpecifier) {
8153   verifyFormat("public:");
8154   verifyFormat("class A {\n"
8155                "public\n"
8156                "  void f() {}\n"
8157                "};");
8158   verifyFormat("public\n"
8159                "int qwerty;");
8160   verifyFormat("public\n"
8161                "B {}");
8162   verifyFormat("public\n"
8163                "{}");
8164   verifyFormat("public\n"
8165                "B { int x; }");
8166 }
8167 
8168 TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
8169   verifyFormat("{");
8170   verifyFormat("#})");
8171   verifyNoCrash("(/**/[:!] ?[).");
8172 }
8173 
8174 TEST_F(FormatTest, IncorrectUnbalancedBracesInMacrosWithUnicode) {
8175   // Found by oss-fuzz:
8176   // https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=8212
8177   FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp);
8178   Style.ColumnLimit = 60;
8179   verifyNoCrash(
8180       "\x23\x47\xff\x20\x28\xff\x3c\xff\x3f\xff\x20\x2f\x7b\x7a\xff\x20"
8181       "\xff\xff\xff\xca\xb5\xff\xff\xff\xff\x3a\x7b\x7d\xff\x20\xff\x20"
8182       "\xff\x74\xff\x20\x7d\x7d\xff\x7b\x3a\xff\x20\x71\xff\x20\xff\x0a",
8183       Style);
8184 }
8185 
8186 TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
8187   verifyFormat("do {\n}");
8188   verifyFormat("do {\n}\n"
8189                "f();");
8190   verifyFormat("do {\n}\n"
8191                "wheeee(fun);");
8192   verifyFormat("do {\n"
8193                "  f();\n"
8194                "}");
8195 }
8196 
8197 TEST_F(FormatTest, IncorrectCodeMissingParens) {
8198   verifyFormat("if {\n  foo;\n  foo();\n}");
8199   verifyFormat("switch {\n  foo;\n  foo();\n}");
8200   verifyIncompleteFormat("for {\n  foo;\n  foo();\n}");
8201   verifyFormat("while {\n  foo;\n  foo();\n}");
8202   verifyFormat("do {\n  foo;\n  foo();\n} while;");
8203 }
8204 
8205 TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
8206   verifyIncompleteFormat("namespace {\n"
8207                          "class Foo { Foo (\n"
8208                          "};\n"
8209                          "} // namespace");
8210 }
8211 
8212 TEST_F(FormatTest, IncorrectCodeErrorDetection) {
8213   EXPECT_EQ("{\n  {}\n", format("{\n{\n}\n"));
8214   EXPECT_EQ("{\n  {}\n", format("{\n  {\n}\n"));
8215   EXPECT_EQ("{\n  {}\n", format("{\n  {\n  }\n"));
8216   EXPECT_EQ("{\n  {}\n}\n}\n", format("{\n  {\n    }\n  }\n}\n"));
8217 
8218   EXPECT_EQ("{\n"
8219             "  {\n"
8220             "    breakme(\n"
8221             "        qwe);\n"
8222             "  }\n",
8223             format("{\n"
8224                    "    {\n"
8225                    " breakme(qwe);\n"
8226                    "}\n",
8227                    getLLVMStyleWithColumns(10)));
8228 }
8229 
8230 TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
8231   verifyFormat("int x = {\n"
8232                "    avariable,\n"
8233                "    b(alongervariable)};",
8234                getLLVMStyleWithColumns(25));
8235 }
8236 
8237 TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
8238   verifyFormat("return (a)(b){1, 2, 3};");
8239 }
8240 
8241 TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
8242   verifyFormat("vector<int> x{1, 2, 3, 4};");
8243   verifyFormat("vector<int> x{\n"
8244                "    1,\n"
8245                "    2,\n"
8246                "    3,\n"
8247                "    4,\n"
8248                "};");
8249   verifyFormat("vector<T> x{{}, {}, {}, {}};");
8250   verifyFormat("f({1, 2});");
8251   verifyFormat("auto v = Foo{-1};");
8252   verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
8253   verifyFormat("Class::Class : member{1, 2, 3} {}");
8254   verifyFormat("new vector<int>{1, 2, 3};");
8255   verifyFormat("new int[3]{1, 2, 3};");
8256   verifyFormat("new int{1};");
8257   verifyFormat("return {arg1, arg2};");
8258   verifyFormat("return {arg1, SomeType{parameter}};");
8259   verifyFormat("int count = set<int>{f(), g(), h()}.size();");
8260   verifyFormat("new T{arg1, arg2};");
8261   verifyFormat("f(MyMap[{composite, key}]);");
8262   verifyFormat("class Class {\n"
8263                "  T member = {arg1, arg2};\n"
8264                "};");
8265   verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
8266   verifyFormat("const struct A a = {.a = 1, .b = 2};");
8267   verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
8268   verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
8269   verifyFormat("int a = std::is_integral<int>{} + 0;");
8270 
8271   verifyFormat("int foo(int i) { return fo1{}(i); }");
8272   verifyFormat("int foo(int i) { return fo1{}(i); }");
8273   verifyFormat("auto i = decltype(x){};");
8274   verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
8275   verifyFormat("Node n{1, Node{1000}, //\n"
8276                "       2};");
8277   verifyFormat("Aaaa aaaaaaa{\n"
8278                "    {\n"
8279                "        aaaa,\n"
8280                "    },\n"
8281                "};");
8282   verifyFormat("class C : public D {\n"
8283                "  SomeClass SC{2};\n"
8284                "};");
8285   verifyFormat("class C : public A {\n"
8286                "  class D : public B {\n"
8287                "    void f() { int i{2}; }\n"
8288                "  };\n"
8289                "};");
8290   verifyFormat("#define A {a, a},");
8291 
8292   // Avoid breaking between equal sign and opening brace
8293   FormatStyle AvoidBreakingFirstArgument = getLLVMStyle();
8294   AvoidBreakingFirstArgument.PenaltyBreakBeforeFirstCallParameter = 200;
8295   verifyFormat("const std::unordered_map<std::string, int> MyHashTable =\n"
8296                "    {{\"aaaaaaaaaaaaaaaaaaaaa\", 0},\n"
8297                "     {\"bbbbbbbbbbbbbbbbbbbbb\", 1},\n"
8298                "     {\"ccccccccccccccccccccc\", 2}};",
8299                AvoidBreakingFirstArgument);
8300 
8301   // Binpacking only if there is no trailing comma
8302   verifyFormat("const Aaaaaa aaaaa = {aaaaaaaaaa, bbbbbbbbbb,\n"
8303                "                      cccccccccc, dddddddddd};",
8304                getLLVMStyleWithColumns(50));
8305   verifyFormat("const Aaaaaa aaaaa = {\n"
8306                "    aaaaaaaaaaa,\n"
8307                "    bbbbbbbbbbb,\n"
8308                "    ccccccccccc,\n"
8309                "    ddddddddddd,\n"
8310                "};",
8311                getLLVMStyleWithColumns(50));
8312 
8313   // Cases where distinguising braced lists and blocks is hard.
8314   verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
8315   verifyFormat("void f() {\n"
8316                "  return; // comment\n"
8317                "}\n"
8318                "SomeType t;");
8319   verifyFormat("void f() {\n"
8320                "  if (a) {\n"
8321                "    f();\n"
8322                "  }\n"
8323                "}\n"
8324                "SomeType t;");
8325 
8326   // In combination with BinPackArguments = false.
8327   FormatStyle NoBinPacking = getLLVMStyle();
8328   NoBinPacking.BinPackArguments = false;
8329   verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
8330                "                      bbbbb,\n"
8331                "                      ccccc,\n"
8332                "                      ddddd,\n"
8333                "                      eeeee,\n"
8334                "                      ffffff,\n"
8335                "                      ggggg,\n"
8336                "                      hhhhhh,\n"
8337                "                      iiiiii,\n"
8338                "                      jjjjjj,\n"
8339                "                      kkkkkk};",
8340                NoBinPacking);
8341   verifyFormat("const Aaaaaa aaaaa = {\n"
8342                "    aaaaa,\n"
8343                "    bbbbb,\n"
8344                "    ccccc,\n"
8345                "    ddddd,\n"
8346                "    eeeee,\n"
8347                "    ffffff,\n"
8348                "    ggggg,\n"
8349                "    hhhhhh,\n"
8350                "    iiiiii,\n"
8351                "    jjjjjj,\n"
8352                "    kkkkkk,\n"
8353                "};",
8354                NoBinPacking);
8355   verifyFormat(
8356       "const Aaaaaa aaaaa = {\n"
8357       "    aaaaa,  bbbbb,  ccccc,  ddddd,  eeeee,  ffffff, ggggg, hhhhhh,\n"
8358       "    iiiiii, jjjjjj, kkkkkk, aaaaa,  bbbbb,  ccccc,  ddddd, eeeee,\n"
8359       "    ffffff, ggggg,  hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
8360       "};",
8361       NoBinPacking);
8362 
8363   NoBinPacking.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
8364   EXPECT_EQ("static uint8 CddDp83848Reg[] = {\n"
8365             "    CDDDP83848_BMCR_REGISTER,\n"
8366             "    CDDDP83848_BMSR_REGISTER,\n"
8367             "    CDDDP83848_RBR_REGISTER};",
8368             format("static uint8 CddDp83848Reg[] = {CDDDP83848_BMCR_REGISTER,\n"
8369                    "                                CDDDP83848_BMSR_REGISTER,\n"
8370                    "                                CDDDP83848_RBR_REGISTER};",
8371                    NoBinPacking));
8372 
8373   // FIXME: The alignment of these trailing comments might be bad. Then again,
8374   // this might be utterly useless in real code.
8375   verifyFormat("Constructor::Constructor()\n"
8376                "    : some_value{         //\n"
8377                "                 aaaaaaa, //\n"
8378                "                 bbbbbbb} {}");
8379 
8380   // In braced lists, the first comment is always assumed to belong to the
8381   // first element. Thus, it can be moved to the next or previous line as
8382   // appropriate.
8383   EXPECT_EQ("function({// First element:\n"
8384             "          1,\n"
8385             "          // Second element:\n"
8386             "          2});",
8387             format("function({\n"
8388                    "    // First element:\n"
8389                    "    1,\n"
8390                    "    // Second element:\n"
8391                    "    2});"));
8392   EXPECT_EQ("std::vector<int> MyNumbers{\n"
8393             "    // First element:\n"
8394             "    1,\n"
8395             "    // Second element:\n"
8396             "    2};",
8397             format("std::vector<int> MyNumbers{// First element:\n"
8398                    "                           1,\n"
8399                    "                           // Second element:\n"
8400                    "                           2};",
8401                    getLLVMStyleWithColumns(30)));
8402   // A trailing comma should still lead to an enforced line break and no
8403   // binpacking.
8404   EXPECT_EQ("vector<int> SomeVector = {\n"
8405             "    // aaa\n"
8406             "    1,\n"
8407             "    2,\n"
8408             "};",
8409             format("vector<int> SomeVector = { // aaa\n"
8410                    "    1, 2, };"));
8411 
8412   // C++11 brace initializer list l-braces should not be treated any differently
8413   // when breaking before lambda bodies is enabled
8414   FormatStyle BreakBeforeLambdaBody = getLLVMStyle();
8415   BreakBeforeLambdaBody.BreakBeforeBraces = FormatStyle::BS_Custom;
8416   BreakBeforeLambdaBody.BraceWrapping.BeforeLambdaBody = true;
8417   BreakBeforeLambdaBody.AlwaysBreakBeforeMultilineStrings = true;
8418   verifyFormat(
8419       "std::runtime_error{\n"
8420       "    \"Long string which will force a break onto the next line...\"};",
8421       BreakBeforeLambdaBody);
8422 
8423   FormatStyle ExtraSpaces = getLLVMStyle();
8424   ExtraSpaces.Cpp11BracedListStyle = false;
8425   ExtraSpaces.ColumnLimit = 75;
8426   verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
8427   verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
8428   verifyFormat("f({ 1, 2 });", ExtraSpaces);
8429   verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
8430   verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
8431   verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
8432   verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
8433   verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
8434   verifyFormat("return { arg1, arg2 };", ExtraSpaces);
8435   verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
8436   verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
8437   verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
8438   verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
8439   verifyFormat("class Class {\n"
8440                "  T member = { arg1, arg2 };\n"
8441                "};",
8442                ExtraSpaces);
8443   verifyFormat(
8444       "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
8445       "                                 aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
8446       "                  : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
8447       "                                 bbbbbbbbbbbbbbbbbbbb, bbbbb };",
8448       ExtraSpaces);
8449   verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
8450   verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
8451                ExtraSpaces);
8452   verifyFormat(
8453       "someFunction(OtherParam,\n"
8454       "             BracedList{ // comment 1 (Forcing interesting break)\n"
8455       "                         param1, param2,\n"
8456       "                         // comment 2\n"
8457       "                         param3, param4 });",
8458       ExtraSpaces);
8459   verifyFormat(
8460       "std::this_thread::sleep_for(\n"
8461       "    std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
8462       ExtraSpaces);
8463   verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n"
8464                "    aaaaaaa,\n"
8465                "    aaaaaaaaaa,\n"
8466                "    aaaaa,\n"
8467                "    aaaaaaaaaaaaaaa,\n"
8468                "    aaa,\n"
8469                "    aaaaaaaaaa,\n"
8470                "    a,\n"
8471                "    aaaaaaaaaaaaaaaaaaaaa,\n"
8472                "    aaaaaaaaaaaa,\n"
8473                "    aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
8474                "    aaaaaaa,\n"
8475                "    a};");
8476   verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
8477   verifyFormat("const struct A a = { .a = 1, .b = 2 };", ExtraSpaces);
8478   verifyFormat("const struct A a = { [0] = 1, [1] = 2 };", ExtraSpaces);
8479 
8480   // Avoid breaking between initializer/equal sign and opening brace
8481   ExtraSpaces.PenaltyBreakBeforeFirstCallParameter = 200;
8482   verifyFormat("const std::unordered_map<std::string, int> MyHashTable = {\n"
8483                "  { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n"
8484                "  { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n"
8485                "  { \"ccccccccccccccccccccc\", 2 }\n"
8486                "};",
8487                ExtraSpaces);
8488   verifyFormat("const std::unordered_map<std::string, int> MyHashTable{\n"
8489                "  { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n"
8490                "  { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n"
8491                "  { \"ccccccccccccccccccccc\", 2 }\n"
8492                "};",
8493                ExtraSpaces);
8494 
8495   FormatStyle SpaceBeforeBrace = getLLVMStyle();
8496   SpaceBeforeBrace.SpaceBeforeCpp11BracedList = true;
8497   verifyFormat("vector<int> x {1, 2, 3, 4};", SpaceBeforeBrace);
8498   verifyFormat("f({}, {{}, {}}, MyMap[{k, v}]);", SpaceBeforeBrace);
8499 
8500   FormatStyle SpaceBetweenBraces = getLLVMStyle();
8501   SpaceBetweenBraces.SpacesInAngles = true;
8502   SpaceBetweenBraces.SpacesInParentheses = true;
8503   SpaceBetweenBraces.SpacesInSquareBrackets = true;
8504   verifyFormat("vector< int > x{ 1, 2, 3, 4 };", SpaceBetweenBraces);
8505   verifyFormat("f( {}, { {}, {} }, MyMap[ { k, v } ] );", SpaceBetweenBraces);
8506   verifyFormat("vector< int > x{ // comment 1\n"
8507                "                 1, 2, 3, 4 };",
8508                SpaceBetweenBraces);
8509   SpaceBetweenBraces.ColumnLimit = 20;
8510   EXPECT_EQ("vector< int > x{\n"
8511             "    1, 2, 3, 4 };",
8512             format("vector<int>x{1,2,3,4};", SpaceBetweenBraces));
8513   SpaceBetweenBraces.ColumnLimit = 24;
8514   EXPECT_EQ("vector< int > x{ 1, 2,\n"
8515             "                 3, 4 };",
8516             format("vector<int>x{1,2,3,4};", SpaceBetweenBraces));
8517   EXPECT_EQ("vector< int > x{\n"
8518             "    1,\n"
8519             "    2,\n"
8520             "    3,\n"
8521             "    4,\n"
8522             "};",
8523             format("vector<int>x{1,2,3,4,};", SpaceBetweenBraces));
8524   verifyFormat("vector< int > x{};", SpaceBetweenBraces);
8525   SpaceBetweenBraces.SpaceInEmptyParentheses = true;
8526   verifyFormat("vector< int > x{ };", SpaceBetweenBraces);
8527 }
8528 
8529 TEST_F(FormatTest, FormatSpacesInAngles) {
8530   FormatStyle SpaceInAngles = getLLVMStyle();
8531   SpaceInAngles.SpacesInAngles = true;
8532   verifyFormat("vector< ::std::string > x1;", SpaceInAngles);
8533   verifyFormat("Foo< int, Bar > x2;", SpaceInAngles);
8534   verifyFormat("Foo< ::int, ::Bar > x3;", SpaceInAngles);
8535 
8536   SpaceInAngles.SpacesInAngles = false;
8537   verifyFormat("vector<::std::string> x4;", SpaceInAngles);
8538   verifyFormat("vector<int> x5;", SpaceInAngles);
8539   verifyFormat("Foo<int, Bar> x6;", SpaceInAngles);
8540   verifyFormat("Foo<::int, ::Bar> x7;", SpaceInAngles);
8541 }
8542 
8543 TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
8544   verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8545                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8546                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8547                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8548                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8549                "                 1, 22, 333, 4444, 55555, 666666, 7777777};");
8550   verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
8551                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8552                "                 1, 22, 333, 4444, 55555, //\n"
8553                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8554                "                 1, 22, 333, 4444, 55555, 666666, 7777777};");
8555   verifyFormat(
8556       "vector<int> x = {1,       22, 333, 4444, 55555, 666666, 7777777,\n"
8557       "                 1,       22, 333, 4444, 55555, 666666, 7777777,\n"
8558       "                 1,       22, 333, 4444, 55555, 666666, // comment\n"
8559       "                 7777777, 1,  22,  333,  4444,  55555,  666666,\n"
8560       "                 7777777, 1,  22,  333,  4444,  55555,  666666,\n"
8561       "                 7777777, 1,  22,  333,  4444,  55555,  666666,\n"
8562       "                 7777777};");
8563   verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
8564                "    X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
8565                "    X86::R8,  X86::R9,  X86::R10, X86::R11, 0};");
8566   verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
8567                "    X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
8568                "    // Separating comment.\n"
8569                "    X86::R8, X86::R9, X86::R10, X86::R11, 0};");
8570   verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
8571                "    // Leading comment\n"
8572                "    X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
8573                "    X86::R8,  X86::R9,  X86::R10, X86::R11, 0};");
8574   verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
8575                "                 1, 1, 1, 1};",
8576                getLLVMStyleWithColumns(39));
8577   verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
8578                "                 1, 1, 1, 1};",
8579                getLLVMStyleWithColumns(38));
8580   verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
8581                "    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
8582                getLLVMStyleWithColumns(43));
8583   verifyFormat(
8584       "static unsigned SomeValues[10][3] = {\n"
8585       "    {1, 4, 0},  {4, 9, 0},  {4, 5, 9},  {8, 5, 4}, {1, 8, 4},\n"
8586       "    {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
8587   verifyFormat("static auto fields = new vector<string>{\n"
8588                "    \"aaaaaaaaaaaaa\",\n"
8589                "    \"aaaaaaaaaaaaa\",\n"
8590                "    \"aaaaaaaaaaaa\",\n"
8591                "    \"aaaaaaaaaaaaaa\",\n"
8592                "    \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
8593                "    \"aaaaaaaaaaaa\",\n"
8594                "    \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
8595                "};");
8596   verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
8597   verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
8598                "                 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
8599                "                 3, cccccccccccccccccccccc};",
8600                getLLVMStyleWithColumns(60));
8601 
8602   // Trailing commas.
8603   verifyFormat("vector<int> x = {\n"
8604                "    1, 1, 1, 1, 1, 1, 1, 1,\n"
8605                "};",
8606                getLLVMStyleWithColumns(39));
8607   verifyFormat("vector<int> x = {\n"
8608                "    1, 1, 1, 1, 1, 1, 1, 1, //\n"
8609                "};",
8610                getLLVMStyleWithColumns(39));
8611   verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
8612                "                 1, 1, 1, 1,\n"
8613                "                 /**/ /**/};",
8614                getLLVMStyleWithColumns(39));
8615 
8616   // Trailing comment in the first line.
8617   verifyFormat("vector<int> iiiiiiiiiiiiiii = {                      //\n"
8618                "    1111111111, 2222222222, 33333333333, 4444444444, //\n"
8619                "    111111111,  222222222,  3333333333,  444444444,  //\n"
8620                "    11111111,   22222222,   333333333,   44444444};");
8621   // Trailing comment in the last line.
8622   verifyFormat("int aaaaa[] = {\n"
8623                "    1, 2, 3, // comment\n"
8624                "    4, 5, 6  // comment\n"
8625                "};");
8626 
8627   // With nested lists, we should either format one item per line or all nested
8628   // lists one on line.
8629   // FIXME: For some nested lists, we can do better.
8630   verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
8631                "        {aaaaaaaaaaaaaaaaaaa},\n"
8632                "        {aaaaaaaaaaaaaaaaaaaaa},\n"
8633                "        {aaaaaaaaaaaaaaaaa}};",
8634                getLLVMStyleWithColumns(60));
8635   verifyFormat(
8636       "SomeStruct my_struct_array = {\n"
8637       "    {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
8638       "     aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
8639       "    {aaa, aaa},\n"
8640       "    {aaa, aaa},\n"
8641       "    {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
8642       "    {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
8643       "     aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
8644 
8645   // No column layout should be used here.
8646   verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
8647                "                   bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
8648 
8649   verifyNoCrash("a<,");
8650 
8651   // No braced initializer here.
8652   verifyFormat("void f() {\n"
8653                "  struct Dummy {};\n"
8654                "  f(v);\n"
8655                "}");
8656 
8657   // Long lists should be formatted in columns even if they are nested.
8658   verifyFormat(
8659       "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8660       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8661       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8662       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8663       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
8664       "                          1, 22, 333, 4444, 55555, 666666, 7777777});");
8665 
8666   // Allow "single-column" layout even if that violates the column limit. There
8667   // isn't going to be a better way.
8668   verifyFormat("std::vector<int> a = {\n"
8669                "    aaaaaaaa,\n"
8670                "    aaaaaaaa,\n"
8671                "    aaaaaaaa,\n"
8672                "    aaaaaaaa,\n"
8673                "    aaaaaaaaaa,\n"
8674                "    aaaaaaaa,\n"
8675                "    aaaaaaaaaaaaaaaaaaaaaaaaaaa};",
8676                getLLVMStyleWithColumns(30));
8677   verifyFormat("vector<int> aaaa = {\n"
8678                "    aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
8679                "    aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
8680                "    aaaaaa.aaaaaaa,\n"
8681                "    aaaaaa.aaaaaaa,\n"
8682                "    aaaaaa.aaaaaaa,\n"
8683                "    aaaaaa.aaaaaaa,\n"
8684                "};");
8685 
8686   // Don't create hanging lists.
8687   verifyFormat("someFunction(Param, {List1, List2,\n"
8688                "                     List3});",
8689                getLLVMStyleWithColumns(35));
8690   verifyFormat("someFunction(Param, Param,\n"
8691                "             {List1, List2,\n"
8692                "              List3});",
8693                getLLVMStyleWithColumns(35));
8694   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n"
8695                "                               aaaaaaaaaaaaaaaaaaaaaaa);");
8696 }
8697 
8698 TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
8699   FormatStyle DoNotMerge = getLLVMStyle();
8700   DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
8701 
8702   verifyFormat("void f() { return 42; }");
8703   verifyFormat("void f() {\n"
8704                "  return 42;\n"
8705                "}",
8706                DoNotMerge);
8707   verifyFormat("void f() {\n"
8708                "  // Comment\n"
8709                "}");
8710   verifyFormat("{\n"
8711                "#error {\n"
8712                "  int a;\n"
8713                "}");
8714   verifyFormat("{\n"
8715                "  int a;\n"
8716                "#error {\n"
8717                "}");
8718   verifyFormat("void f() {} // comment");
8719   verifyFormat("void f() { int a; } // comment");
8720   verifyFormat("void f() {\n"
8721                "} // comment",
8722                DoNotMerge);
8723   verifyFormat("void f() {\n"
8724                "  int a;\n"
8725                "} // comment",
8726                DoNotMerge);
8727   verifyFormat("void f() {\n"
8728                "} // comment",
8729                getLLVMStyleWithColumns(15));
8730 
8731   verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
8732   verifyFormat("void f() {\n  return 42;\n}", getLLVMStyleWithColumns(22));
8733 
8734   verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
8735   verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
8736   verifyFormat("class C {\n"
8737                "  C()\n"
8738                "      : iiiiiiii(nullptr),\n"
8739                "        kkkkkkk(nullptr),\n"
8740                "        mmmmmmm(nullptr),\n"
8741                "        nnnnnnn(nullptr) {}\n"
8742                "};",
8743                getGoogleStyle());
8744 
8745   FormatStyle NoColumnLimit = getLLVMStyle();
8746   NoColumnLimit.ColumnLimit = 0;
8747   EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
8748   EXPECT_EQ("class C {\n"
8749             "  A() : b(0) {}\n"
8750             "};",
8751             format("class C{A():b(0){}};", NoColumnLimit));
8752   EXPECT_EQ("A()\n"
8753             "    : b(0) {\n"
8754             "}",
8755             format("A()\n:b(0)\n{\n}", NoColumnLimit));
8756 
8757   FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
8758   DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
8759       FormatStyle::SFS_None;
8760   EXPECT_EQ("A()\n"
8761             "    : b(0) {\n"
8762             "}",
8763             format("A():b(0){}", DoNotMergeNoColumnLimit));
8764   EXPECT_EQ("A()\n"
8765             "    : b(0) {\n"
8766             "}",
8767             format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
8768 
8769   verifyFormat("#define A          \\\n"
8770                "  void f() {       \\\n"
8771                "    int i;         \\\n"
8772                "  }",
8773                getLLVMStyleWithColumns(20));
8774   verifyFormat("#define A           \\\n"
8775                "  void f() { int i; }",
8776                getLLVMStyleWithColumns(21));
8777   verifyFormat("#define A            \\\n"
8778                "  void f() {         \\\n"
8779                "    int i;           \\\n"
8780                "  }                  \\\n"
8781                "  int j;",
8782                getLLVMStyleWithColumns(22));
8783   verifyFormat("#define A             \\\n"
8784                "  void f() { int i; } \\\n"
8785                "  int j;",
8786                getLLVMStyleWithColumns(23));
8787 }
8788 
8789 TEST_F(FormatTest, PullEmptyFunctionDefinitionsIntoSingleLine) {
8790   FormatStyle MergeEmptyOnly = getLLVMStyle();
8791   MergeEmptyOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
8792   verifyFormat("class C {\n"
8793                "  int f() {}\n"
8794                "};",
8795                MergeEmptyOnly);
8796   verifyFormat("class C {\n"
8797                "  int f() {\n"
8798                "    return 42;\n"
8799                "  }\n"
8800                "};",
8801                MergeEmptyOnly);
8802   verifyFormat("int f() {}", MergeEmptyOnly);
8803   verifyFormat("int f() {\n"
8804                "  return 42;\n"
8805                "}",
8806                MergeEmptyOnly);
8807 
8808   // Also verify behavior when BraceWrapping.AfterFunction = true
8809   MergeEmptyOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
8810   MergeEmptyOnly.BraceWrapping.AfterFunction = true;
8811   verifyFormat("int f() {}", MergeEmptyOnly);
8812   verifyFormat("class C {\n"
8813                "  int f() {}\n"
8814                "};",
8815                MergeEmptyOnly);
8816 }
8817 
8818 TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
8819   FormatStyle MergeInlineOnly = getLLVMStyle();
8820   MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
8821   verifyFormat("class C {\n"
8822                "  int f() { return 42; }\n"
8823                "};",
8824                MergeInlineOnly);
8825   verifyFormat("int f() {\n"
8826                "  return 42;\n"
8827                "}",
8828                MergeInlineOnly);
8829 
8830   // SFS_Inline implies SFS_Empty
8831   verifyFormat("class C {\n"
8832                "  int f() {}\n"
8833                "};",
8834                MergeInlineOnly);
8835   verifyFormat("int f() {}", MergeInlineOnly);
8836 
8837   // Also verify behavior when BraceWrapping.AfterFunction = true
8838   MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
8839   MergeInlineOnly.BraceWrapping.AfterFunction = true;
8840   verifyFormat("class C {\n"
8841                "  int f() { return 42; }\n"
8842                "};",
8843                MergeInlineOnly);
8844   verifyFormat("int f()\n"
8845                "{\n"
8846                "  return 42;\n"
8847                "}",
8848                MergeInlineOnly);
8849 
8850   // SFS_Inline implies SFS_Empty
8851   verifyFormat("int f() {}", MergeInlineOnly);
8852   verifyFormat("class C {\n"
8853                "  int f() {}\n"
8854                "};",
8855                MergeInlineOnly);
8856 }
8857 
8858 TEST_F(FormatTest, PullInlineOnlyFunctionDefinitionsIntoSingleLine) {
8859   FormatStyle MergeInlineOnly = getLLVMStyle();
8860   MergeInlineOnly.AllowShortFunctionsOnASingleLine =
8861       FormatStyle::SFS_InlineOnly;
8862   verifyFormat("class C {\n"
8863                "  int f() { return 42; }\n"
8864                "};",
8865                MergeInlineOnly);
8866   verifyFormat("int f() {\n"
8867                "  return 42;\n"
8868                "}",
8869                MergeInlineOnly);
8870 
8871   // SFS_InlineOnly does not imply SFS_Empty
8872   verifyFormat("class C {\n"
8873                "  int f() {}\n"
8874                "};",
8875                MergeInlineOnly);
8876   verifyFormat("int f() {\n"
8877                "}",
8878                MergeInlineOnly);
8879 
8880   // Also verify behavior when BraceWrapping.AfterFunction = true
8881   MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
8882   MergeInlineOnly.BraceWrapping.AfterFunction = true;
8883   verifyFormat("class C {\n"
8884                "  int f() { return 42; }\n"
8885                "};",
8886                MergeInlineOnly);
8887   verifyFormat("int f()\n"
8888                "{\n"
8889                "  return 42;\n"
8890                "}",
8891                MergeInlineOnly);
8892 
8893   // SFS_InlineOnly does not imply SFS_Empty
8894   verifyFormat("int f()\n"
8895                "{\n"
8896                "}",
8897                MergeInlineOnly);
8898   verifyFormat("class C {\n"
8899                "  int f() {}\n"
8900                "};",
8901                MergeInlineOnly);
8902 }
8903 
8904 TEST_F(FormatTest, SplitEmptyFunction) {
8905   FormatStyle Style = getLLVMStyle();
8906   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
8907   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
8908   Style.BraceWrapping.AfterFunction = true;
8909   Style.BraceWrapping.SplitEmptyFunction = false;
8910   Style.ColumnLimit = 40;
8911 
8912   verifyFormat("int f()\n"
8913                "{}",
8914                Style);
8915   verifyFormat("int f()\n"
8916                "{\n"
8917                "  return 42;\n"
8918                "}",
8919                Style);
8920   verifyFormat("int f()\n"
8921                "{\n"
8922                "  // some comment\n"
8923                "}",
8924                Style);
8925 
8926   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
8927   verifyFormat("int f() {}", Style);
8928   verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
8929                "{}",
8930                Style);
8931   verifyFormat("int f()\n"
8932                "{\n"
8933                "  return 0;\n"
8934                "}",
8935                Style);
8936 
8937   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
8938   verifyFormat("class Foo {\n"
8939                "  int f() {}\n"
8940                "};\n",
8941                Style);
8942   verifyFormat("class Foo {\n"
8943                "  int f() { return 0; }\n"
8944                "};\n",
8945                Style);
8946   verifyFormat("class Foo {\n"
8947                "  int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
8948                "  {}\n"
8949                "};\n",
8950                Style);
8951   verifyFormat("class Foo {\n"
8952                "  int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
8953                "  {\n"
8954                "    return 0;\n"
8955                "  }\n"
8956                "};\n",
8957                Style);
8958 
8959   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
8960   verifyFormat("int f() {}", Style);
8961   verifyFormat("int f() { return 0; }", Style);
8962   verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
8963                "{}",
8964                Style);
8965   verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
8966                "{\n"
8967                "  return 0;\n"
8968                "}",
8969                Style);
8970 }
8971 TEST_F(FormatTest, KeepShortFunctionAfterPPElse) {
8972   FormatStyle Style = getLLVMStyle();
8973   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
8974   verifyFormat("#ifdef A\n"
8975                "int f() {}\n"
8976                "#else\n"
8977                "int g() {}\n"
8978                "#endif",
8979                Style);
8980 }
8981 
8982 TEST_F(FormatTest, SplitEmptyClass) {
8983   FormatStyle Style = getLLVMStyle();
8984   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
8985   Style.BraceWrapping.AfterClass = true;
8986   Style.BraceWrapping.SplitEmptyRecord = false;
8987 
8988   verifyFormat("class Foo\n"
8989                "{};",
8990                Style);
8991   verifyFormat("/* something */ class Foo\n"
8992                "{};",
8993                Style);
8994   verifyFormat("template <typename X> class Foo\n"
8995                "{};",
8996                Style);
8997   verifyFormat("class Foo\n"
8998                "{\n"
8999                "  Foo();\n"
9000                "};",
9001                Style);
9002   verifyFormat("typedef class Foo\n"
9003                "{\n"
9004                "} Foo_t;",
9005                Style);
9006 }
9007 
9008 TEST_F(FormatTest, SplitEmptyStruct) {
9009   FormatStyle Style = getLLVMStyle();
9010   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
9011   Style.BraceWrapping.AfterStruct = true;
9012   Style.BraceWrapping.SplitEmptyRecord = false;
9013 
9014   verifyFormat("struct Foo\n"
9015                "{};",
9016                Style);
9017   verifyFormat("/* something */ struct Foo\n"
9018                "{};",
9019                Style);
9020   verifyFormat("template <typename X> struct Foo\n"
9021                "{};",
9022                Style);
9023   verifyFormat("struct Foo\n"
9024                "{\n"
9025                "  Foo();\n"
9026                "};",
9027                Style);
9028   verifyFormat("typedef struct Foo\n"
9029                "{\n"
9030                "} Foo_t;",
9031                Style);
9032   // typedef struct Bar {} Bar_t;
9033 }
9034 
9035 TEST_F(FormatTest, SplitEmptyUnion) {
9036   FormatStyle Style = getLLVMStyle();
9037   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
9038   Style.BraceWrapping.AfterUnion = true;
9039   Style.BraceWrapping.SplitEmptyRecord = false;
9040 
9041   verifyFormat("union Foo\n"
9042                "{};",
9043                Style);
9044   verifyFormat("/* something */ union Foo\n"
9045                "{};",
9046                Style);
9047   verifyFormat("union Foo\n"
9048                "{\n"
9049                "  A,\n"
9050                "};",
9051                Style);
9052   verifyFormat("typedef union Foo\n"
9053                "{\n"
9054                "} Foo_t;",
9055                Style);
9056 }
9057 
9058 TEST_F(FormatTest, SplitEmptyNamespace) {
9059   FormatStyle Style = getLLVMStyle();
9060   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
9061   Style.BraceWrapping.AfterNamespace = true;
9062   Style.BraceWrapping.SplitEmptyNamespace = false;
9063 
9064   verifyFormat("namespace Foo\n"
9065                "{};",
9066                Style);
9067   verifyFormat("/* something */ namespace Foo\n"
9068                "{};",
9069                Style);
9070   verifyFormat("inline namespace Foo\n"
9071                "{};",
9072                Style);
9073   verifyFormat("/* something */ inline namespace Foo\n"
9074                "{};",
9075                Style);
9076   verifyFormat("export namespace Foo\n"
9077                "{};",
9078                Style);
9079   verifyFormat("namespace Foo\n"
9080                "{\n"
9081                "void Bar();\n"
9082                "};",
9083                Style);
9084 }
9085 
9086 TEST_F(FormatTest, NeverMergeShortRecords) {
9087   FormatStyle Style = getLLVMStyle();
9088 
9089   verifyFormat("class Foo {\n"
9090                "  Foo();\n"
9091                "};",
9092                Style);
9093   verifyFormat("typedef class Foo {\n"
9094                "  Foo();\n"
9095                "} Foo_t;",
9096                Style);
9097   verifyFormat("struct Foo {\n"
9098                "  Foo();\n"
9099                "};",
9100                Style);
9101   verifyFormat("typedef struct Foo {\n"
9102                "  Foo();\n"
9103                "} Foo_t;",
9104                Style);
9105   verifyFormat("union Foo {\n"
9106                "  A,\n"
9107                "};",
9108                Style);
9109   verifyFormat("typedef union Foo {\n"
9110                "  A,\n"
9111                "} Foo_t;",
9112                Style);
9113   verifyFormat("namespace Foo {\n"
9114                "void Bar();\n"
9115                "};",
9116                Style);
9117 
9118   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
9119   Style.BraceWrapping.AfterClass = true;
9120   Style.BraceWrapping.AfterStruct = true;
9121   Style.BraceWrapping.AfterUnion = true;
9122   Style.BraceWrapping.AfterNamespace = true;
9123   verifyFormat("class Foo\n"
9124                "{\n"
9125                "  Foo();\n"
9126                "};",
9127                Style);
9128   verifyFormat("typedef class Foo\n"
9129                "{\n"
9130                "  Foo();\n"
9131                "} Foo_t;",
9132                Style);
9133   verifyFormat("struct Foo\n"
9134                "{\n"
9135                "  Foo();\n"
9136                "};",
9137                Style);
9138   verifyFormat("typedef struct Foo\n"
9139                "{\n"
9140                "  Foo();\n"
9141                "} Foo_t;",
9142                Style);
9143   verifyFormat("union Foo\n"
9144                "{\n"
9145                "  A,\n"
9146                "};",
9147                Style);
9148   verifyFormat("typedef union Foo\n"
9149                "{\n"
9150                "  A,\n"
9151                "} Foo_t;",
9152                Style);
9153   verifyFormat("namespace Foo\n"
9154                "{\n"
9155                "void Bar();\n"
9156                "};",
9157                Style);
9158 }
9159 
9160 TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
9161   // Elaborate type variable declarations.
9162   verifyFormat("struct foo a = {bar};\nint n;");
9163   verifyFormat("class foo a = {bar};\nint n;");
9164   verifyFormat("union foo a = {bar};\nint n;");
9165 
9166   // Elaborate types inside function definitions.
9167   verifyFormat("struct foo f() {}\nint n;");
9168   verifyFormat("class foo f() {}\nint n;");
9169   verifyFormat("union foo f() {}\nint n;");
9170 
9171   // Templates.
9172   verifyFormat("template <class X> void f() {}\nint n;");
9173   verifyFormat("template <struct X> void f() {}\nint n;");
9174   verifyFormat("template <union X> void f() {}\nint n;");
9175 
9176   // Actual definitions...
9177   verifyFormat("struct {\n} n;");
9178   verifyFormat(
9179       "template <template <class T, class Y>, class Z> class X {\n} n;");
9180   verifyFormat("union Z {\n  int n;\n} x;");
9181   verifyFormat("class MACRO Z {\n} n;");
9182   verifyFormat("class MACRO(X) Z {\n} n;");
9183   verifyFormat("class __attribute__(X) Z {\n} n;");
9184   verifyFormat("class __declspec(X) Z {\n} n;");
9185   verifyFormat("class A##B##C {\n} n;");
9186   verifyFormat("class alignas(16) Z {\n} n;");
9187   verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
9188   verifyFormat("class MACROA MACRO(X) Z {\n} n;");
9189 
9190   // Redefinition from nested context:
9191   verifyFormat("class A::B::C {\n} n;");
9192 
9193   // Template definitions.
9194   verifyFormat(
9195       "template <typename F>\n"
9196       "Matcher(const Matcher<F> &Other,\n"
9197       "        typename enable_if_c<is_base_of<F, T>::value &&\n"
9198       "                             !is_same<F, T>::value>::type * = 0)\n"
9199       "    : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
9200 
9201   // FIXME: This is still incorrectly handled at the formatter side.
9202   verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
9203   verifyFormat("int i = SomeFunction(a<b, a> b);");
9204 
9205   // FIXME:
9206   // This now gets parsed incorrectly as class definition.
9207   // verifyFormat("class A<int> f() {\n}\nint n;");
9208 
9209   // Elaborate types where incorrectly parsing the structural element would
9210   // break the indent.
9211   verifyFormat("if (true)\n"
9212                "  class X x;\n"
9213                "else\n"
9214                "  f();\n");
9215 
9216   // This is simply incomplete. Formatting is not important, but must not crash.
9217   verifyFormat("class A:");
9218 }
9219 
9220 TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
9221   EXPECT_EQ("#error Leave     all         white!!!!! space* alone!\n",
9222             format("#error Leave     all         white!!!!! space* alone!\n"));
9223   EXPECT_EQ(
9224       "#warning Leave     all         white!!!!! space* alone!\n",
9225       format("#warning Leave     all         white!!!!! space* alone!\n"));
9226   EXPECT_EQ("#error 1", format("  #  error   1"));
9227   EXPECT_EQ("#warning 1", format("  #  warning 1"));
9228 }
9229 
9230 TEST_F(FormatTest, FormatHashIfExpressions) {
9231   verifyFormat("#if AAAA && BBBB");
9232   verifyFormat("#if (AAAA && BBBB)");
9233   verifyFormat("#elif (AAAA && BBBB)");
9234   // FIXME: Come up with a better indentation for #elif.
9235   verifyFormat(
9236       "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) &&  \\\n"
9237       "    defined(BBBBBBBB)\n"
9238       "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) &&  \\\n"
9239       "    defined(BBBBBBBB)\n"
9240       "#endif",
9241       getLLVMStyleWithColumns(65));
9242 }
9243 
9244 TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
9245   FormatStyle AllowsMergedIf = getGoogleStyle();
9246   AllowsMergedIf.AllowShortIfStatementsOnASingleLine =
9247       FormatStyle::SIS_WithoutElse;
9248   verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
9249   verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
9250   verifyFormat("if (true)\n#error E\n  return 42;", AllowsMergedIf);
9251   EXPECT_EQ("if (true) return 42;",
9252             format("if (true)\nreturn 42;", AllowsMergedIf));
9253   FormatStyle ShortMergedIf = AllowsMergedIf;
9254   ShortMergedIf.ColumnLimit = 25;
9255   verifyFormat("#define A \\\n"
9256                "  if (true) return 42;",
9257                ShortMergedIf);
9258   verifyFormat("#define A \\\n"
9259                "  f();    \\\n"
9260                "  if (true)\n"
9261                "#define B",
9262                ShortMergedIf);
9263   verifyFormat("#define A \\\n"
9264                "  f();    \\\n"
9265                "  if (true)\n"
9266                "g();",
9267                ShortMergedIf);
9268   verifyFormat("{\n"
9269                "#ifdef A\n"
9270                "  // Comment\n"
9271                "  if (true) continue;\n"
9272                "#endif\n"
9273                "  // Comment\n"
9274                "  if (true) continue;\n"
9275                "}",
9276                ShortMergedIf);
9277   ShortMergedIf.ColumnLimit = 33;
9278   verifyFormat("#define A \\\n"
9279                "  if constexpr (true) return 42;",
9280                ShortMergedIf);
9281   verifyFormat("#define A \\\n"
9282                "  if CONSTEXPR (true) return 42;",
9283                ShortMergedIf);
9284   ShortMergedIf.ColumnLimit = 29;
9285   verifyFormat("#define A                   \\\n"
9286                "  if (aaaaaaaaaa) return 1; \\\n"
9287                "  return 2;",
9288                ShortMergedIf);
9289   ShortMergedIf.ColumnLimit = 28;
9290   verifyFormat("#define A         \\\n"
9291                "  if (aaaaaaaaaa) \\\n"
9292                "    return 1;     \\\n"
9293                "  return 2;",
9294                ShortMergedIf);
9295   verifyFormat("#define A                \\\n"
9296                "  if constexpr (aaaaaaa) \\\n"
9297                "    return 1;            \\\n"
9298                "  return 2;",
9299                ShortMergedIf);
9300   verifyFormat("#define A                \\\n"
9301                "  if CONSTEXPR (aaaaaaa) \\\n"
9302                "    return 1;            \\\n"
9303                "  return 2;",
9304                ShortMergedIf);
9305 }
9306 
9307 TEST_F(FormatTest, FormatStarDependingOnContext) {
9308   verifyFormat("void f(int *a);");
9309   verifyFormat("void f() { f(fint * b); }");
9310   verifyFormat("class A {\n  void f(int *a);\n};");
9311   verifyFormat("class A {\n  int *a;\n};");
9312   verifyFormat("namespace a {\n"
9313                "namespace b {\n"
9314                "class A {\n"
9315                "  void f() {}\n"
9316                "  int *a;\n"
9317                "};\n"
9318                "} // namespace b\n"
9319                "} // namespace a");
9320 }
9321 
9322 TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
9323   verifyFormat("while");
9324   verifyFormat("operator");
9325 }
9326 
9327 TEST_F(FormatTest, SkipsDeeplyNestedLines) {
9328   // This code would be painfully slow to format if we didn't skip it.
9329   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
9330                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
9331                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
9332                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
9333                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
9334                    "A(1, 1)\n"
9335                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
9336                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
9337                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
9338                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
9339                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
9340                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
9341                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
9342                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
9343                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
9344                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n");
9345   // Deeply nested part is untouched, rest is formatted.
9346   EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
9347             format(std::string("int    i;\n") + Code + "int    j;\n",
9348                    getLLVMStyle(), SC_ExpectIncomplete));
9349 }
9350 
9351 //===----------------------------------------------------------------------===//
9352 // Objective-C tests.
9353 //===----------------------------------------------------------------------===//
9354 
9355 TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
9356   verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
9357   EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
9358             format("-(NSUInteger)indexOfObject:(id)anObject;"));
9359   EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
9360   EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
9361   EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
9362             format("-(NSInteger)Method3:(id)anObject;"));
9363   EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
9364             format("-(NSInteger)Method4:(id)anObject;"));
9365   EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
9366             format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
9367   EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
9368             format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
9369   EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
9370             "forAllCells:(BOOL)flag;",
9371             format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
9372                    "forAllCells:(BOOL)flag;"));
9373 
9374   // Very long objectiveC method declaration.
9375   verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
9376                "    (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
9377   verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
9378                "                    inRange:(NSRange)range\n"
9379                "                   outRange:(NSRange)out_range\n"
9380                "                  outRange1:(NSRange)out_range1\n"
9381                "                  outRange2:(NSRange)out_range2\n"
9382                "                  outRange3:(NSRange)out_range3\n"
9383                "                  outRange4:(NSRange)out_range4\n"
9384                "                  outRange5:(NSRange)out_range5\n"
9385                "                  outRange6:(NSRange)out_range6\n"
9386                "                  outRange7:(NSRange)out_range7\n"
9387                "                  outRange8:(NSRange)out_range8\n"
9388                "                  outRange9:(NSRange)out_range9;");
9389 
9390   // When the function name has to be wrapped.
9391   FormatStyle Style = getLLVMStyle();
9392   // ObjC ignores IndentWrappedFunctionNames when wrapping methods
9393   // and always indents instead.
9394   Style.IndentWrappedFunctionNames = false;
9395   verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
9396                "    veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
9397                "               anotherName:(NSString)bbbbbbbbbbbbbb {\n"
9398                "}",
9399                Style);
9400   Style.IndentWrappedFunctionNames = true;
9401   verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
9402                "    veryLooooooooooongName:(NSString)cccccccccccccc\n"
9403                "               anotherName:(NSString)dddddddddddddd {\n"
9404                "}",
9405                Style);
9406 
9407   verifyFormat("- (int)sum:(vector<int>)numbers;");
9408   verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
9409   // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
9410   // protocol lists (but not for template classes):
9411   // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
9412 
9413   verifyFormat("- (int (*)())foo:(int (*)())f;");
9414   verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
9415 
9416   // If there's no return type (very rare in practice!), LLVM and Google style
9417   // agree.
9418   verifyFormat("- foo;");
9419   verifyFormat("- foo:(int)f;");
9420   verifyGoogleFormat("- foo:(int)foo;");
9421 }
9422 
9423 TEST_F(FormatTest, BreaksStringLiterals) {
9424   EXPECT_EQ("\"some text \"\n"
9425             "\"other\";",
9426             format("\"some text other\";", getLLVMStyleWithColumns(12)));
9427   EXPECT_EQ("\"some text \"\n"
9428             "\"other\";",
9429             format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
9430   EXPECT_EQ(
9431       "#define A  \\\n"
9432       "  \"some \"  \\\n"
9433       "  \"text \"  \\\n"
9434       "  \"other\";",
9435       format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
9436   EXPECT_EQ(
9437       "#define A  \\\n"
9438       "  \"so \"    \\\n"
9439       "  \"text \"  \\\n"
9440       "  \"other\";",
9441       format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
9442 
9443   EXPECT_EQ("\"some text\"",
9444             format("\"some text\"", getLLVMStyleWithColumns(1)));
9445   EXPECT_EQ("\"some text\"",
9446             format("\"some text\"", getLLVMStyleWithColumns(11)));
9447   EXPECT_EQ("\"some \"\n"
9448             "\"text\"",
9449             format("\"some text\"", getLLVMStyleWithColumns(10)));
9450   EXPECT_EQ("\"some \"\n"
9451             "\"text\"",
9452             format("\"some text\"", getLLVMStyleWithColumns(7)));
9453   EXPECT_EQ("\"some\"\n"
9454             "\" tex\"\n"
9455             "\"t\"",
9456             format("\"some text\"", getLLVMStyleWithColumns(6)));
9457   EXPECT_EQ("\"some\"\n"
9458             "\" tex\"\n"
9459             "\" and\"",
9460             format("\"some tex and\"", getLLVMStyleWithColumns(6)));
9461   EXPECT_EQ("\"some\"\n"
9462             "\"/tex\"\n"
9463             "\"/and\"",
9464             format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
9465 
9466   EXPECT_EQ("variable =\n"
9467             "    \"long string \"\n"
9468             "    \"literal\";",
9469             format("variable = \"long string literal\";",
9470                    getLLVMStyleWithColumns(20)));
9471 
9472   EXPECT_EQ("variable = f(\n"
9473             "    \"long string \"\n"
9474             "    \"literal\",\n"
9475             "    short,\n"
9476             "    loooooooooooooooooooong);",
9477             format("variable = f(\"long string literal\", short, "
9478                    "loooooooooooooooooooong);",
9479                    getLLVMStyleWithColumns(20)));
9480 
9481   EXPECT_EQ(
9482       "f(g(\"long string \"\n"
9483       "    \"literal\"),\n"
9484       "  b);",
9485       format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
9486   EXPECT_EQ("f(g(\"long string \"\n"
9487             "    \"literal\",\n"
9488             "    a),\n"
9489             "  b);",
9490             format("f(g(\"long string literal\", a), b);",
9491                    getLLVMStyleWithColumns(20)));
9492   EXPECT_EQ(
9493       "f(\"one two\".split(\n"
9494       "    variable));",
9495       format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
9496   EXPECT_EQ("f(\"one two three four five six \"\n"
9497             "  \"seven\".split(\n"
9498             "      really_looooong_variable));",
9499             format("f(\"one two three four five six seven\"."
9500                    "split(really_looooong_variable));",
9501                    getLLVMStyleWithColumns(33)));
9502 
9503   EXPECT_EQ("f(\"some \"\n"
9504             "  \"text\",\n"
9505             "  other);",
9506             format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
9507 
9508   // Only break as a last resort.
9509   verifyFormat(
9510       "aaaaaaaaaaaaaaaaaaaa(\n"
9511       "    aaaaaaaaaaaaaaaaaaaa,\n"
9512       "    aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
9513 
9514   EXPECT_EQ("\"splitmea\"\n"
9515             "\"trandomp\"\n"
9516             "\"oint\"",
9517             format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
9518 
9519   EXPECT_EQ("\"split/\"\n"
9520             "\"pathat/\"\n"
9521             "\"slashes\"",
9522             format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
9523 
9524   EXPECT_EQ("\"split/\"\n"
9525             "\"pathat/\"\n"
9526             "\"slashes\"",
9527             format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
9528   EXPECT_EQ("\"split at \"\n"
9529             "\"spaces/at/\"\n"
9530             "\"slashes.at.any$\"\n"
9531             "\"non-alphanumeric%\"\n"
9532             "\"1111111111characte\"\n"
9533             "\"rs\"",
9534             format("\"split at "
9535                    "spaces/at/"
9536                    "slashes.at."
9537                    "any$non-"
9538                    "alphanumeric%"
9539                    "1111111111characte"
9540                    "rs\"",
9541                    getLLVMStyleWithColumns(20)));
9542 
9543   // Verify that splitting the strings understands
9544   // Style::AlwaysBreakBeforeMultilineStrings.
9545   EXPECT_EQ("aaaaaaaaaaaa(\n"
9546             "    \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
9547             "    \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
9548             format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
9549                    "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
9550                    "aaaaaaaaaaaaaaaaaaaaaa\");",
9551                    getGoogleStyle()));
9552   EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
9553             "       \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
9554             format("return \"aaaaaaaaaaaaaaaaaaaaaa "
9555                    "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
9556                    "aaaaaaaaaaaaaaaaaaaaaa\";",
9557                    getGoogleStyle()));
9558   EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
9559             "                \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
9560             format("llvm::outs() << "
9561                    "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
9562                    "aaaaaaaaaaaaaaaaaaa\";"));
9563   EXPECT_EQ("ffff(\n"
9564             "    {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
9565             "     \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
9566             format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
9567                    "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
9568                    getGoogleStyle()));
9569 
9570   FormatStyle Style = getLLVMStyleWithColumns(12);
9571   Style.BreakStringLiterals = false;
9572   EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
9573 
9574   FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
9575   AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
9576   EXPECT_EQ("#define A \\\n"
9577             "  \"some \" \\\n"
9578             "  \"text \" \\\n"
9579             "  \"other\";",
9580             format("#define A \"some text other\";", AlignLeft));
9581 }
9582 
9583 TEST_F(FormatTest, BreaksStringLiteralsAtColumnLimit) {
9584   EXPECT_EQ("C a = \"some more \"\n"
9585             "      \"text\";",
9586             format("C a = \"some more text\";", getLLVMStyleWithColumns(18)));
9587 }
9588 
9589 TEST_F(FormatTest, FullyRemoveEmptyLines) {
9590   FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
9591   NoEmptyLines.MaxEmptyLinesToKeep = 0;
9592   EXPECT_EQ("int i = a(b());",
9593             format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
9594 }
9595 
9596 TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
9597   EXPECT_EQ(
9598       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
9599       "(\n"
9600       "    \"x\t\");",
9601       format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
9602              "aaaaaaa("
9603              "\"x\t\");"));
9604 }
9605 
9606 TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
9607   EXPECT_EQ(
9608       "u8\"utf8 string \"\n"
9609       "u8\"literal\";",
9610       format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
9611   EXPECT_EQ(
9612       "u\"utf16 string \"\n"
9613       "u\"literal\";",
9614       format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
9615   EXPECT_EQ(
9616       "U\"utf32 string \"\n"
9617       "U\"literal\";",
9618       format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
9619   EXPECT_EQ("L\"wide string \"\n"
9620             "L\"literal\";",
9621             format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
9622   EXPECT_EQ("@\"NSString \"\n"
9623             "@\"literal\";",
9624             format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
9625   verifyFormat(R"(NSString *s = @"那那那那";)", getLLVMStyleWithColumns(26));
9626 
9627   // This input makes clang-format try to split the incomplete unicode escape
9628   // sequence, which used to lead to a crasher.
9629   verifyNoCrash(
9630       "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
9631       getLLVMStyleWithColumns(60));
9632 }
9633 
9634 TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
9635   FormatStyle Style = getGoogleStyleWithColumns(15);
9636   EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
9637   EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
9638   EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
9639   EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
9640   EXPECT_EQ("u8R\"x(raw literal)x\";",
9641             format("u8R\"x(raw literal)x\";", Style));
9642 }
9643 
9644 TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
9645   FormatStyle Style = getLLVMStyleWithColumns(20);
9646   EXPECT_EQ(
9647       "_T(\"aaaaaaaaaaaaaa\")\n"
9648       "_T(\"aaaaaaaaaaaaaa\")\n"
9649       "_T(\"aaaaaaaaaaaa\")",
9650       format("  _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
9651   EXPECT_EQ("f(x,\n"
9652             "  _T(\"aaaaaaaaaaaa\")\n"
9653             "  _T(\"aaa\"),\n"
9654             "  z);",
9655             format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
9656 
9657   // FIXME: Handle embedded spaces in one iteration.
9658   //  EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
9659   //            "_T(\"aaaaaaaaaaaaa\")\n"
9660   //            "_T(\"aaaaaaaaaaaaa\")\n"
9661   //            "_T(\"a\")",
9662   //            format("  _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
9663   //                   getLLVMStyleWithColumns(20)));
9664   EXPECT_EQ(
9665       "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
9666       format("  _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
9667   EXPECT_EQ("f(\n"
9668             "#if !TEST\n"
9669             "    _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
9670             "#endif\n"
9671             ");",
9672             format("f(\n"
9673                    "#if !TEST\n"
9674                    "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
9675                    "#endif\n"
9676                    ");"));
9677   EXPECT_EQ("f(\n"
9678             "\n"
9679             "    _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
9680             format("f(\n"
9681                    "\n"
9682                    "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
9683 }
9684 
9685 TEST_F(FormatTest, BreaksStringLiteralOperands) {
9686   // In a function call with two operands, the second can be broken with no line
9687   // break before it.
9688   EXPECT_EQ(
9689       "func(a, \"long long \"\n"
9690       "        \"long long\");",
9691       format("func(a, \"long long long long\");", getLLVMStyleWithColumns(24)));
9692   // In a function call with three operands, the second must be broken with a
9693   // line break before it.
9694   EXPECT_EQ("func(a,\n"
9695             "     \"long long long \"\n"
9696             "     \"long\",\n"
9697             "     c);",
9698             format("func(a, \"long long long long\", c);",
9699                    getLLVMStyleWithColumns(24)));
9700   // In a function call with three operands, the third must be broken with a
9701   // line break before it.
9702   EXPECT_EQ("func(a, b,\n"
9703             "     \"long long long \"\n"
9704             "     \"long\");",
9705             format("func(a, b, \"long long long long\");",
9706                    getLLVMStyleWithColumns(24)));
9707   // In a function call with three operands, both the second and the third must
9708   // be broken with a line break before them.
9709   EXPECT_EQ("func(a,\n"
9710             "     \"long long long \"\n"
9711             "     \"long\",\n"
9712             "     \"long long long \"\n"
9713             "     \"long\");",
9714             format("func(a, \"long long long long\", \"long long long long\");",
9715                    getLLVMStyleWithColumns(24)));
9716   // In a chain of << with two operands, the second can be broken with no line
9717   // break before it.
9718   EXPECT_EQ("a << \"line line \"\n"
9719             "     \"line\";",
9720             format("a << \"line line line\";", getLLVMStyleWithColumns(20)));
9721   // In a chain of << with three operands, the second can be broken with no line
9722   // break before it.
9723   EXPECT_EQ(
9724       "abcde << \"line \"\n"
9725       "         \"line line\"\n"
9726       "      << c;",
9727       format("abcde << \"line line line\" << c;", getLLVMStyleWithColumns(20)));
9728   // In a chain of << with three operands, the third must be broken with a line
9729   // break before it.
9730   EXPECT_EQ(
9731       "a << b\n"
9732       "  << \"line line \"\n"
9733       "     \"line\";",
9734       format("a << b << \"line line line\";", getLLVMStyleWithColumns(20)));
9735   // In a chain of << with three operands, the second can be broken with no line
9736   // break before it and the third must be broken with a line break before it.
9737   EXPECT_EQ("abcd << \"line line \"\n"
9738             "        \"line\"\n"
9739             "     << \"line line \"\n"
9740             "        \"line\";",
9741             format("abcd << \"line line line\" << \"line line line\";",
9742                    getLLVMStyleWithColumns(20)));
9743   // In a chain of binary operators with two operands, the second can be broken
9744   // with no line break before it.
9745   EXPECT_EQ(
9746       "abcd + \"line line \"\n"
9747       "       \"line line\";",
9748       format("abcd + \"line line line line\";", getLLVMStyleWithColumns(20)));
9749   // In a chain of binary operators with three operands, the second must be
9750   // broken with a line break before it.
9751   EXPECT_EQ("abcd +\n"
9752             "    \"line line \"\n"
9753             "    \"line line\" +\n"
9754             "    e;",
9755             format("abcd + \"line line line line\" + e;",
9756                    getLLVMStyleWithColumns(20)));
9757   // In a function call with two operands, with AlignAfterOpenBracket enabled,
9758   // the first must be broken with a line break before it.
9759   FormatStyle Style = getLLVMStyleWithColumns(25);
9760   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
9761   EXPECT_EQ("someFunction(\n"
9762             "    \"long long long \"\n"
9763             "    \"long\",\n"
9764             "    a);",
9765             format("someFunction(\"long long long long\", a);", Style));
9766 }
9767 
9768 TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
9769   EXPECT_EQ(
9770       "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
9771       "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
9772       "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
9773       format("aaaaaaaaaaa  =  \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
9774              "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
9775              "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
9776 }
9777 
9778 TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
9779   EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
9780             format("f(g(R\"x(raw literal)x\",   a), b);", getGoogleStyle()));
9781   EXPECT_EQ("fffffffffff(g(R\"x(\n"
9782             "multiline raw string literal xxxxxxxxxxxxxx\n"
9783             ")x\",\n"
9784             "              a),\n"
9785             "            b);",
9786             format("fffffffffff(g(R\"x(\n"
9787                    "multiline raw string literal xxxxxxxxxxxxxx\n"
9788                    ")x\", a), b);",
9789                    getGoogleStyleWithColumns(20)));
9790   EXPECT_EQ("fffffffffff(\n"
9791             "    g(R\"x(qqq\n"
9792             "multiline raw string literal xxxxxxxxxxxxxx\n"
9793             ")x\",\n"
9794             "      a),\n"
9795             "    b);",
9796             format("fffffffffff(g(R\"x(qqq\n"
9797                    "multiline raw string literal xxxxxxxxxxxxxx\n"
9798                    ")x\", a), b);",
9799                    getGoogleStyleWithColumns(20)));
9800 
9801   EXPECT_EQ("fffffffffff(R\"x(\n"
9802             "multiline raw string literal xxxxxxxxxxxxxx\n"
9803             ")x\");",
9804             format("fffffffffff(R\"x(\n"
9805                    "multiline raw string literal xxxxxxxxxxxxxx\n"
9806                    ")x\");",
9807                    getGoogleStyleWithColumns(20)));
9808   EXPECT_EQ("fffffffffff(R\"x(\n"
9809             "multiline raw string literal xxxxxxxxxxxxxx\n"
9810             ")x\" + bbbbbb);",
9811             format("fffffffffff(R\"x(\n"
9812                    "multiline raw string literal xxxxxxxxxxxxxx\n"
9813                    ")x\" +   bbbbbb);",
9814                    getGoogleStyleWithColumns(20)));
9815   EXPECT_EQ("fffffffffff(\n"
9816             "    R\"x(\n"
9817             "multiline raw string literal xxxxxxxxxxxxxx\n"
9818             ")x\" +\n"
9819             "    bbbbbb);",
9820             format("fffffffffff(\n"
9821                    " R\"x(\n"
9822                    "multiline raw string literal xxxxxxxxxxxxxx\n"
9823                    ")x\" + bbbbbb);",
9824                    getGoogleStyleWithColumns(20)));
9825   EXPECT_EQ("fffffffffff(R\"(single line raw string)\" + bbbbbb);",
9826             format("fffffffffff(\n"
9827                    " R\"(single line raw string)\" + bbbbbb);"));
9828 }
9829 
9830 TEST_F(FormatTest, SkipsUnknownStringLiterals) {
9831   verifyFormat("string a = \"unterminated;");
9832   EXPECT_EQ("function(\"unterminated,\n"
9833             "         OtherParameter);",
9834             format("function(  \"unterminated,\n"
9835                    "    OtherParameter);"));
9836 }
9837 
9838 TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
9839   FormatStyle Style = getLLVMStyle();
9840   Style.Standard = FormatStyle::LS_Cpp03;
9841   EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
9842             format("#define x(_a) printf(\"foo\"_a);", Style));
9843 }
9844 
9845 TEST_F(FormatTest, CppLexVersion) {
9846   FormatStyle Style = getLLVMStyle();
9847   // Formatting of x * y differs if x is a type.
9848   verifyFormat("void foo() { MACRO(a * b); }", Style);
9849   verifyFormat("void foo() { MACRO(int *b); }", Style);
9850 
9851   // LLVM style uses latest lexer.
9852   verifyFormat("void foo() { MACRO(char8_t *b); }", Style);
9853   Style.Standard = FormatStyle::LS_Cpp17;
9854   // But in c++17, char8_t isn't a keyword.
9855   verifyFormat("void foo() { MACRO(char8_t * b); }", Style);
9856 }
9857 
9858 TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
9859 
9860 TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
9861   EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
9862             "             \"ddeeefff\");",
9863             format("someFunction(\"aaabbbcccdddeeefff\");",
9864                    getLLVMStyleWithColumns(25)));
9865   EXPECT_EQ("someFunction1234567890(\n"
9866             "    \"aaabbbcccdddeeefff\");",
9867             format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
9868                    getLLVMStyleWithColumns(26)));
9869   EXPECT_EQ("someFunction1234567890(\n"
9870             "    \"aaabbbcccdddeeeff\"\n"
9871             "    \"f\");",
9872             format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
9873                    getLLVMStyleWithColumns(25)));
9874   EXPECT_EQ("someFunction1234567890(\n"
9875             "    \"aaabbbcccdddeeeff\"\n"
9876             "    \"f\");",
9877             format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
9878                    getLLVMStyleWithColumns(24)));
9879   EXPECT_EQ("someFunction(\n"
9880             "    \"aaabbbcc ddde \"\n"
9881             "    \"efff\");",
9882             format("someFunction(\"aaabbbcc ddde efff\");",
9883                    getLLVMStyleWithColumns(25)));
9884   EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
9885             "             \"ddeeefff\");",
9886             format("someFunction(\"aaabbbccc ddeeefff\");",
9887                    getLLVMStyleWithColumns(25)));
9888   EXPECT_EQ("someFunction1234567890(\n"
9889             "    \"aaabb \"\n"
9890             "    \"cccdddeeefff\");",
9891             format("someFunction1234567890(\"aaabb cccdddeeefff\");",
9892                    getLLVMStyleWithColumns(25)));
9893   EXPECT_EQ("#define A          \\\n"
9894             "  string s =       \\\n"
9895             "      \"123456789\"  \\\n"
9896             "      \"0\";         \\\n"
9897             "  int i;",
9898             format("#define A string s = \"1234567890\"; int i;",
9899                    getLLVMStyleWithColumns(20)));
9900   EXPECT_EQ("someFunction(\n"
9901             "    \"aaabbbcc \"\n"
9902             "    \"dddeeefff\");",
9903             format("someFunction(\"aaabbbcc dddeeefff\");",
9904                    getLLVMStyleWithColumns(25)));
9905 }
9906 
9907 TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
9908   EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
9909   EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
9910   EXPECT_EQ("\"test\"\n"
9911             "\"\\n\"",
9912             format("\"test\\n\"", getLLVMStyleWithColumns(7)));
9913   EXPECT_EQ("\"tes\\\\\"\n"
9914             "\"n\"",
9915             format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
9916   EXPECT_EQ("\"\\\\\\\\\"\n"
9917             "\"\\n\"",
9918             format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
9919   EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
9920   EXPECT_EQ("\"\\uff01\"\n"
9921             "\"test\"",
9922             format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
9923   EXPECT_EQ("\"\\Uff01ff02\"",
9924             format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
9925   EXPECT_EQ("\"\\x000000000001\"\n"
9926             "\"next\"",
9927             format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
9928   EXPECT_EQ("\"\\x000000000001next\"",
9929             format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
9930   EXPECT_EQ("\"\\x000000000001\"",
9931             format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
9932   EXPECT_EQ("\"test\"\n"
9933             "\"\\000000\"\n"
9934             "\"000001\"",
9935             format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
9936   EXPECT_EQ("\"test\\000\"\n"
9937             "\"00000000\"\n"
9938             "\"1\"",
9939             format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
9940 }
9941 
9942 TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
9943   verifyFormat("void f() {\n"
9944                "  return g() {}\n"
9945                "  void h() {}");
9946   verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
9947                "g();\n"
9948                "}");
9949 }
9950 
9951 TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
9952   verifyFormat(
9953       "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
9954 }
9955 
9956 TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
9957   verifyFormat("class X {\n"
9958                "  void f() {\n"
9959                "  }\n"
9960                "};",
9961                getLLVMStyleWithColumns(12));
9962 }
9963 
9964 TEST_F(FormatTest, ConfigurableIndentWidth) {
9965   FormatStyle EightIndent = getLLVMStyleWithColumns(18);
9966   EightIndent.IndentWidth = 8;
9967   EightIndent.ContinuationIndentWidth = 8;
9968   verifyFormat("void f() {\n"
9969                "        someFunction();\n"
9970                "        if (true) {\n"
9971                "                f();\n"
9972                "        }\n"
9973                "}",
9974                EightIndent);
9975   verifyFormat("class X {\n"
9976                "        void f() {\n"
9977                "        }\n"
9978                "};",
9979                EightIndent);
9980   verifyFormat("int x[] = {\n"
9981                "        call(),\n"
9982                "        call()};",
9983                EightIndent);
9984 }
9985 
9986 TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
9987   verifyFormat("double\n"
9988                "f();",
9989                getLLVMStyleWithColumns(8));
9990 }
9991 
9992 TEST_F(FormatTest, ConfigurableUseOfTab) {
9993   FormatStyle Tab = getLLVMStyleWithColumns(42);
9994   Tab.IndentWidth = 8;
9995   Tab.UseTab = FormatStyle::UT_Always;
9996   Tab.AlignEscapedNewlines = FormatStyle::ENAS_Left;
9997 
9998   EXPECT_EQ("if (aaaaaaaa && // q\n"
9999             "    bb)\t\t// w\n"
10000             "\t;",
10001             format("if (aaaaaaaa &&// q\n"
10002                    "bb)// w\n"
10003                    ";",
10004                    Tab));
10005   EXPECT_EQ("if (aaa && bbb) // w\n"
10006             "\t;",
10007             format("if(aaa&&bbb)// w\n"
10008                    ";",
10009                    Tab));
10010 
10011   verifyFormat("class X {\n"
10012                "\tvoid f() {\n"
10013                "\t\tsomeFunction(parameter1,\n"
10014                "\t\t\t     parameter2);\n"
10015                "\t}\n"
10016                "};",
10017                Tab);
10018   verifyFormat("#define A                        \\\n"
10019                "\tvoid f() {               \\\n"
10020                "\t\tsomeFunction(    \\\n"
10021                "\t\t    parameter1,  \\\n"
10022                "\t\t    parameter2); \\\n"
10023                "\t}",
10024                Tab);
10025   verifyFormat("int a;\t      // x\n"
10026                "int bbbbbbbb; // x\n",
10027                Tab);
10028 
10029   Tab.TabWidth = 4;
10030   Tab.IndentWidth = 8;
10031   verifyFormat("class TabWidth4Indent8 {\n"
10032                "\t\tvoid f() {\n"
10033                "\t\t\t\tsomeFunction(parameter1,\n"
10034                "\t\t\t\t\t\t\t parameter2);\n"
10035                "\t\t}\n"
10036                "};",
10037                Tab);
10038 
10039   Tab.TabWidth = 4;
10040   Tab.IndentWidth = 4;
10041   verifyFormat("class TabWidth4Indent4 {\n"
10042                "\tvoid f() {\n"
10043                "\t\tsomeFunction(parameter1,\n"
10044                "\t\t\t\t\t parameter2);\n"
10045                "\t}\n"
10046                "};",
10047                Tab);
10048 
10049   Tab.TabWidth = 8;
10050   Tab.IndentWidth = 4;
10051   verifyFormat("class TabWidth8Indent4 {\n"
10052                "    void f() {\n"
10053                "\tsomeFunction(parameter1,\n"
10054                "\t\t     parameter2);\n"
10055                "    }\n"
10056                "};",
10057                Tab);
10058 
10059   Tab.TabWidth = 8;
10060   Tab.IndentWidth = 8;
10061   EXPECT_EQ("/*\n"
10062             "\t      a\t\tcomment\n"
10063             "\t      in multiple lines\n"
10064             "       */",
10065             format("   /*\t \t \n"
10066                    " \t \t a\t\tcomment\t \t\n"
10067                    " \t \t in multiple lines\t\n"
10068                    " \t  */",
10069                    Tab));
10070 
10071   Tab.UseTab = FormatStyle::UT_ForIndentation;
10072   verifyFormat("{\n"
10073                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10074                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10075                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10076                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10077                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10078                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10079                "};",
10080                Tab);
10081   verifyFormat("enum AA {\n"
10082                "\ta1, // Force multiple lines\n"
10083                "\ta2,\n"
10084                "\ta3\n"
10085                "};",
10086                Tab);
10087   EXPECT_EQ("if (aaaaaaaa && // q\n"
10088             "    bb)         // w\n"
10089             "\t;",
10090             format("if (aaaaaaaa &&// q\n"
10091                    "bb)// w\n"
10092                    ";",
10093                    Tab));
10094   verifyFormat("class X {\n"
10095                "\tvoid f() {\n"
10096                "\t\tsomeFunction(parameter1,\n"
10097                "\t\t             parameter2);\n"
10098                "\t}\n"
10099                "};",
10100                Tab);
10101   verifyFormat("{\n"
10102                "\tQ(\n"
10103                "\t    {\n"
10104                "\t\t    int a;\n"
10105                "\t\t    someFunction(aaaaaaaa,\n"
10106                "\t\t                 bbbbbbb);\n"
10107                "\t    },\n"
10108                "\t    p);\n"
10109                "}",
10110                Tab);
10111   EXPECT_EQ("{\n"
10112             "\t/* aaaa\n"
10113             "\t   bbbb */\n"
10114             "}",
10115             format("{\n"
10116                    "/* aaaa\n"
10117                    "   bbbb */\n"
10118                    "}",
10119                    Tab));
10120   EXPECT_EQ("{\n"
10121             "\t/*\n"
10122             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
10123             "\t  bbbbbbbbbbbbb\n"
10124             "\t*/\n"
10125             "}",
10126             format("{\n"
10127                    "/*\n"
10128                    "  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
10129                    "*/\n"
10130                    "}",
10131                    Tab));
10132   EXPECT_EQ("{\n"
10133             "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
10134             "\t// bbbbbbbbbbbbb\n"
10135             "}",
10136             format("{\n"
10137                    "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
10138                    "}",
10139                    Tab));
10140   EXPECT_EQ("{\n"
10141             "\t/*\n"
10142             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
10143             "\t  bbbbbbbbbbbbb\n"
10144             "\t*/\n"
10145             "}",
10146             format("{\n"
10147                    "\t/*\n"
10148                    "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
10149                    "\t*/\n"
10150                    "}",
10151                    Tab));
10152   EXPECT_EQ("{\n"
10153             "\t/*\n"
10154             "\n"
10155             "\t*/\n"
10156             "}",
10157             format("{\n"
10158                    "\t/*\n"
10159                    "\n"
10160                    "\t*/\n"
10161                    "}",
10162                    Tab));
10163   EXPECT_EQ("{\n"
10164             "\t/*\n"
10165             " asdf\n"
10166             "\t*/\n"
10167             "}",
10168             format("{\n"
10169                    "\t/*\n"
10170                    " asdf\n"
10171                    "\t*/\n"
10172                    "}",
10173                    Tab));
10174 
10175   Tab.UseTab = FormatStyle::UT_Never;
10176   EXPECT_EQ("/*\n"
10177             "              a\t\tcomment\n"
10178             "              in multiple lines\n"
10179             "       */",
10180             format("   /*\t \t \n"
10181                    " \t \t a\t\tcomment\t \t\n"
10182                    " \t \t in multiple lines\t\n"
10183                    " \t  */",
10184                    Tab));
10185   EXPECT_EQ("/* some\n"
10186             "   comment */",
10187             format(" \t \t /* some\n"
10188                    " \t \t    comment */",
10189                    Tab));
10190   EXPECT_EQ("int a; /* some\n"
10191             "   comment */",
10192             format(" \t \t int a; /* some\n"
10193                    " \t \t    comment */",
10194                    Tab));
10195 
10196   EXPECT_EQ("int a; /* some\n"
10197             "comment */",
10198             format(" \t \t int\ta; /* some\n"
10199                    " \t \t    comment */",
10200                    Tab));
10201   EXPECT_EQ("f(\"\t\t\"); /* some\n"
10202             "    comment */",
10203             format(" \t \t f(\"\t\t\"); /* some\n"
10204                    " \t \t    comment */",
10205                    Tab));
10206   EXPECT_EQ("{\n"
10207             "        /*\n"
10208             "         * Comment\n"
10209             "         */\n"
10210             "        int i;\n"
10211             "}",
10212             format("{\n"
10213                    "\t/*\n"
10214                    "\t * Comment\n"
10215                    "\t */\n"
10216                    "\t int i;\n"
10217                    "}",
10218                    Tab));
10219 
10220   Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
10221   Tab.TabWidth = 8;
10222   Tab.IndentWidth = 8;
10223   EXPECT_EQ("if (aaaaaaaa && // q\n"
10224             "    bb)         // w\n"
10225             "\t;",
10226             format("if (aaaaaaaa &&// q\n"
10227                    "bb)// w\n"
10228                    ";",
10229                    Tab));
10230   EXPECT_EQ("if (aaa && bbb) // w\n"
10231             "\t;",
10232             format("if(aaa&&bbb)// w\n"
10233                    ";",
10234                    Tab));
10235   verifyFormat("class X {\n"
10236                "\tvoid f() {\n"
10237                "\t\tsomeFunction(parameter1,\n"
10238                "\t\t\t     parameter2);\n"
10239                "\t}\n"
10240                "};",
10241                Tab);
10242   verifyFormat("#define A                        \\\n"
10243                "\tvoid f() {               \\\n"
10244                "\t\tsomeFunction(    \\\n"
10245                "\t\t    parameter1,  \\\n"
10246                "\t\t    parameter2); \\\n"
10247                "\t}",
10248                Tab);
10249   Tab.TabWidth = 4;
10250   Tab.IndentWidth = 8;
10251   verifyFormat("class TabWidth4Indent8 {\n"
10252                "\t\tvoid f() {\n"
10253                "\t\t\t\tsomeFunction(parameter1,\n"
10254                "\t\t\t\t\t\t\t parameter2);\n"
10255                "\t\t}\n"
10256                "};",
10257                Tab);
10258   Tab.TabWidth = 4;
10259   Tab.IndentWidth = 4;
10260   verifyFormat("class TabWidth4Indent4 {\n"
10261                "\tvoid f() {\n"
10262                "\t\tsomeFunction(parameter1,\n"
10263                "\t\t\t\t\t parameter2);\n"
10264                "\t}\n"
10265                "};",
10266                Tab);
10267   Tab.TabWidth = 8;
10268   Tab.IndentWidth = 4;
10269   verifyFormat("class TabWidth8Indent4 {\n"
10270                "    void f() {\n"
10271                "\tsomeFunction(parameter1,\n"
10272                "\t\t     parameter2);\n"
10273                "    }\n"
10274                "};",
10275                Tab);
10276   Tab.TabWidth = 8;
10277   Tab.IndentWidth = 8;
10278   EXPECT_EQ("/*\n"
10279             "\t      a\t\tcomment\n"
10280             "\t      in multiple lines\n"
10281             "       */",
10282             format("   /*\t \t \n"
10283                    " \t \t a\t\tcomment\t \t\n"
10284                    " \t \t in multiple lines\t\n"
10285                    " \t  */",
10286                    Tab));
10287   verifyFormat("{\n"
10288                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10289                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10290                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10291                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10292                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10293                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10294                "};",
10295                Tab);
10296   verifyFormat("enum AA {\n"
10297                "\ta1, // Force multiple lines\n"
10298                "\ta2,\n"
10299                "\ta3\n"
10300                "};",
10301                Tab);
10302   EXPECT_EQ("if (aaaaaaaa && // q\n"
10303             "    bb)         // w\n"
10304             "\t;",
10305             format("if (aaaaaaaa &&// q\n"
10306                    "bb)// w\n"
10307                    ";",
10308                    Tab));
10309   verifyFormat("class X {\n"
10310                "\tvoid f() {\n"
10311                "\t\tsomeFunction(parameter1,\n"
10312                "\t\t\t     parameter2);\n"
10313                "\t}\n"
10314                "};",
10315                Tab);
10316   verifyFormat("{\n"
10317                "\tQ(\n"
10318                "\t    {\n"
10319                "\t\t    int a;\n"
10320                "\t\t    someFunction(aaaaaaaa,\n"
10321                "\t\t\t\t bbbbbbb);\n"
10322                "\t    },\n"
10323                "\t    p);\n"
10324                "}",
10325                Tab);
10326   EXPECT_EQ("{\n"
10327             "\t/* aaaa\n"
10328             "\t   bbbb */\n"
10329             "}",
10330             format("{\n"
10331                    "/* aaaa\n"
10332                    "   bbbb */\n"
10333                    "}",
10334                    Tab));
10335   EXPECT_EQ("{\n"
10336             "\t/*\n"
10337             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
10338             "\t  bbbbbbbbbbbbb\n"
10339             "\t*/\n"
10340             "}",
10341             format("{\n"
10342                    "/*\n"
10343                    "  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
10344                    "*/\n"
10345                    "}",
10346                    Tab));
10347   EXPECT_EQ("{\n"
10348             "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
10349             "\t// bbbbbbbbbbbbb\n"
10350             "}",
10351             format("{\n"
10352                    "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
10353                    "}",
10354                    Tab));
10355   EXPECT_EQ("{\n"
10356             "\t/*\n"
10357             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
10358             "\t  bbbbbbbbbbbbb\n"
10359             "\t*/\n"
10360             "}",
10361             format("{\n"
10362                    "\t/*\n"
10363                    "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
10364                    "\t*/\n"
10365                    "}",
10366                    Tab));
10367   EXPECT_EQ("{\n"
10368             "\t/*\n"
10369             "\n"
10370             "\t*/\n"
10371             "}",
10372             format("{\n"
10373                    "\t/*\n"
10374                    "\n"
10375                    "\t*/\n"
10376                    "}",
10377                    Tab));
10378   EXPECT_EQ("{\n"
10379             "\t/*\n"
10380             " asdf\n"
10381             "\t*/\n"
10382             "}",
10383             format("{\n"
10384                    "\t/*\n"
10385                    " asdf\n"
10386                    "\t*/\n"
10387                    "}",
10388                    Tab));
10389   EXPECT_EQ("/* some\n"
10390             "   comment */",
10391             format(" \t \t /* some\n"
10392                    " \t \t    comment */",
10393                    Tab));
10394   EXPECT_EQ("int a; /* some\n"
10395             "   comment */",
10396             format(" \t \t int a; /* some\n"
10397                    " \t \t    comment */",
10398                    Tab));
10399   EXPECT_EQ("int a; /* some\n"
10400             "comment */",
10401             format(" \t \t int\ta; /* some\n"
10402                    " \t \t    comment */",
10403                    Tab));
10404   EXPECT_EQ("f(\"\t\t\"); /* some\n"
10405             "    comment */",
10406             format(" \t \t f(\"\t\t\"); /* some\n"
10407                    " \t \t    comment */",
10408                    Tab));
10409   EXPECT_EQ("{\n"
10410             "\t/*\n"
10411             "\t * Comment\n"
10412             "\t */\n"
10413             "\tint i;\n"
10414             "}",
10415             format("{\n"
10416                    "\t/*\n"
10417                    "\t * Comment\n"
10418                    "\t */\n"
10419                    "\t int i;\n"
10420                    "}",
10421                    Tab));
10422   Tab.TabWidth = 2;
10423   Tab.IndentWidth = 2;
10424   EXPECT_EQ("{\n"
10425             "\t/* aaaa\n"
10426             "\t\t bbbb */\n"
10427             "}",
10428             format("{\n"
10429                    "/* aaaa\n"
10430                    "\t bbbb */\n"
10431                    "}",
10432                    Tab));
10433   EXPECT_EQ("{\n"
10434             "\t/*\n"
10435             "\t\taaaaaaaaaaaaaaaaaaaaaaaaaa\n"
10436             "\t\tbbbbbbbbbbbbb\n"
10437             "\t*/\n"
10438             "}",
10439             format("{\n"
10440                    "/*\n"
10441                    "\taaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
10442                    "*/\n"
10443                    "}",
10444                    Tab));
10445   Tab.AlignConsecutiveAssignments = true;
10446   Tab.AlignConsecutiveDeclarations = true;
10447   Tab.TabWidth = 4;
10448   Tab.IndentWidth = 4;
10449   verifyFormat("class Assign {\n"
10450                "\tvoid f() {\n"
10451                "\t\tint         x      = 123;\n"
10452                "\t\tint         random = 4;\n"
10453                "\t\tstd::string alphabet =\n"
10454                "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
10455                "\t}\n"
10456                "};",
10457                Tab);
10458 
10459   Tab.UseTab = FormatStyle::UT_AlignWithSpaces;
10460   Tab.TabWidth = 8;
10461   Tab.IndentWidth = 8;
10462   EXPECT_EQ("if (aaaaaaaa && // q\n"
10463             "    bb)         // w\n"
10464             "\t;",
10465             format("if (aaaaaaaa &&// q\n"
10466                    "bb)// w\n"
10467                    ";",
10468                    Tab));
10469   EXPECT_EQ("if (aaa && bbb) // w\n"
10470             "\t;",
10471             format("if(aaa&&bbb)// w\n"
10472                    ";",
10473                    Tab));
10474   verifyFormat("class X {\n"
10475                "\tvoid f() {\n"
10476                "\t\tsomeFunction(parameter1,\n"
10477                "\t\t             parameter2);\n"
10478                "\t}\n"
10479                "};",
10480                Tab);
10481   verifyFormat("#define A                        \\\n"
10482                "\tvoid f() {               \\\n"
10483                "\t\tsomeFunction(    \\\n"
10484                "\t\t    parameter1,  \\\n"
10485                "\t\t    parameter2); \\\n"
10486                "\t}",
10487                Tab);
10488   Tab.TabWidth = 4;
10489   Tab.IndentWidth = 8;
10490   verifyFormat("class TabWidth4Indent8 {\n"
10491                "\t\tvoid f() {\n"
10492                "\t\t\t\tsomeFunction(parameter1,\n"
10493                "\t\t\t\t             parameter2);\n"
10494                "\t\t}\n"
10495                "};",
10496                Tab);
10497   Tab.TabWidth = 4;
10498   Tab.IndentWidth = 4;
10499   verifyFormat("class TabWidth4Indent4 {\n"
10500                "\tvoid f() {\n"
10501                "\t\tsomeFunction(parameter1,\n"
10502                "\t\t             parameter2);\n"
10503                "\t}\n"
10504                "};",
10505                Tab);
10506   Tab.TabWidth = 8;
10507   Tab.IndentWidth = 4;
10508   verifyFormat("class TabWidth8Indent4 {\n"
10509                "    void f() {\n"
10510                "\tsomeFunction(parameter1,\n"
10511                "\t             parameter2);\n"
10512                "    }\n"
10513                "};",
10514                Tab);
10515   Tab.TabWidth = 8;
10516   Tab.IndentWidth = 8;
10517   EXPECT_EQ("/*\n"
10518             "              a\t\tcomment\n"
10519             "              in multiple lines\n"
10520             "       */",
10521             format("   /*\t \t \n"
10522                    " \t \t a\t\tcomment\t \t\n"
10523                    " \t \t in multiple lines\t\n"
10524                    " \t  */",
10525                    Tab));
10526   verifyFormat("{\n"
10527                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10528                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10529                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10530                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10531                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10532                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
10533                "};",
10534                Tab);
10535   verifyFormat("enum AA {\n"
10536                "\ta1, // Force multiple lines\n"
10537                "\ta2,\n"
10538                "\ta3\n"
10539                "};",
10540                Tab);
10541   EXPECT_EQ("if (aaaaaaaa && // q\n"
10542             "    bb)         // w\n"
10543             "\t;",
10544             format("if (aaaaaaaa &&// q\n"
10545                    "bb)// w\n"
10546                    ";",
10547                    Tab));
10548   verifyFormat("class X {\n"
10549                "\tvoid f() {\n"
10550                "\t\tsomeFunction(parameter1,\n"
10551                "\t\t             parameter2);\n"
10552                "\t}\n"
10553                "};",
10554                Tab);
10555   verifyFormat("{\n"
10556                "\tQ(\n"
10557                "\t    {\n"
10558                "\t\t    int a;\n"
10559                "\t\t    someFunction(aaaaaaaa,\n"
10560                "\t\t                 bbbbbbb);\n"
10561                "\t    },\n"
10562                "\t    p);\n"
10563                "}",
10564                Tab);
10565   EXPECT_EQ("{\n"
10566             "\t/* aaaa\n"
10567             "\t   bbbb */\n"
10568             "}",
10569             format("{\n"
10570                    "/* aaaa\n"
10571                    "   bbbb */\n"
10572                    "}",
10573                    Tab));
10574   EXPECT_EQ("{\n"
10575             "\t/*\n"
10576             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
10577             "\t  bbbbbbbbbbbbb\n"
10578             "\t*/\n"
10579             "}",
10580             format("{\n"
10581                    "/*\n"
10582                    "  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
10583                    "*/\n"
10584                    "}",
10585                    Tab));
10586   EXPECT_EQ("{\n"
10587             "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
10588             "\t// bbbbbbbbbbbbb\n"
10589             "}",
10590             format("{\n"
10591                    "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
10592                    "}",
10593                    Tab));
10594   EXPECT_EQ("{\n"
10595             "\t/*\n"
10596             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
10597             "\t  bbbbbbbbbbbbb\n"
10598             "\t*/\n"
10599             "}",
10600             format("{\n"
10601                    "\t/*\n"
10602                    "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
10603                    "\t*/\n"
10604                    "}",
10605                    Tab));
10606   EXPECT_EQ("{\n"
10607             "\t/*\n"
10608             "\n"
10609             "\t*/\n"
10610             "}",
10611             format("{\n"
10612                    "\t/*\n"
10613                    "\n"
10614                    "\t*/\n"
10615                    "}",
10616                    Tab));
10617   EXPECT_EQ("{\n"
10618             "\t/*\n"
10619             " asdf\n"
10620             "\t*/\n"
10621             "}",
10622             format("{\n"
10623                    "\t/*\n"
10624                    " asdf\n"
10625                    "\t*/\n"
10626                    "}",
10627                    Tab));
10628   EXPECT_EQ("/* some\n"
10629             "   comment */",
10630             format(" \t \t /* some\n"
10631                    " \t \t    comment */",
10632                    Tab));
10633   EXPECT_EQ("int a; /* some\n"
10634             "   comment */",
10635             format(" \t \t int a; /* some\n"
10636                    " \t \t    comment */",
10637                    Tab));
10638   EXPECT_EQ("int a; /* some\n"
10639             "comment */",
10640             format(" \t \t int\ta; /* some\n"
10641                    " \t \t    comment */",
10642                    Tab));
10643   EXPECT_EQ("f(\"\t\t\"); /* some\n"
10644             "    comment */",
10645             format(" \t \t f(\"\t\t\"); /* some\n"
10646                    " \t \t    comment */",
10647                    Tab));
10648   EXPECT_EQ("{\n"
10649             "\t/*\n"
10650             "\t * Comment\n"
10651             "\t */\n"
10652             "\tint i;\n"
10653             "}",
10654             format("{\n"
10655                    "\t/*\n"
10656                    "\t * Comment\n"
10657                    "\t */\n"
10658                    "\t int i;\n"
10659                    "}",
10660                    Tab));
10661   Tab.TabWidth = 2;
10662   Tab.IndentWidth = 2;
10663   EXPECT_EQ("{\n"
10664             "\t/* aaaa\n"
10665             "\t   bbbb */\n"
10666             "}",
10667             format("{\n"
10668                    "/* aaaa\n"
10669                    "   bbbb */\n"
10670                    "}",
10671                    Tab));
10672   EXPECT_EQ("{\n"
10673             "\t/*\n"
10674             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
10675             "\t  bbbbbbbbbbbbb\n"
10676             "\t*/\n"
10677             "}",
10678             format("{\n"
10679                    "/*\n"
10680                    "  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
10681                    "*/\n"
10682                    "}",
10683                    Tab));
10684   Tab.AlignConsecutiveAssignments = true;
10685   Tab.AlignConsecutiveDeclarations = true;
10686   Tab.TabWidth = 4;
10687   Tab.IndentWidth = 4;
10688   verifyFormat("class Assign {\n"
10689                "\tvoid f() {\n"
10690                "\t\tint         x      = 123;\n"
10691                "\t\tint         random = 4;\n"
10692                "\t\tstd::string alphabet =\n"
10693                "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
10694                "\t}\n"
10695                "};",
10696                Tab);
10697 }
10698 
10699 TEST_F(FormatTest, ZeroTabWidth) {
10700   FormatStyle Tab = getLLVMStyleWithColumns(42);
10701   Tab.IndentWidth = 8;
10702   Tab.UseTab = FormatStyle::UT_Never;
10703   Tab.TabWidth = 0;
10704   EXPECT_EQ("void a(){\n"
10705             "    // line starts with '\t'\n"
10706             "};",
10707             format("void a(){\n"
10708                    "\t// line starts with '\t'\n"
10709                    "};",
10710                    Tab));
10711 
10712   EXPECT_EQ("void a(){\n"
10713             "    // line starts with '\t'\n"
10714             "};",
10715             format("void a(){\n"
10716                    "\t\t// line starts with '\t'\n"
10717                    "};",
10718                    Tab));
10719 
10720   Tab.UseTab = FormatStyle::UT_ForIndentation;
10721   EXPECT_EQ("void a(){\n"
10722             "    // line starts with '\t'\n"
10723             "};",
10724             format("void a(){\n"
10725                    "\t// line starts with '\t'\n"
10726                    "};",
10727                    Tab));
10728 
10729   EXPECT_EQ("void a(){\n"
10730             "    // line starts with '\t'\n"
10731             "};",
10732             format("void a(){\n"
10733                    "\t\t// line starts with '\t'\n"
10734                    "};",
10735                    Tab));
10736 
10737   Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
10738   EXPECT_EQ("void a(){\n"
10739             "    // line starts with '\t'\n"
10740             "};",
10741             format("void a(){\n"
10742                    "\t// line starts with '\t'\n"
10743                    "};",
10744                    Tab));
10745 
10746   EXPECT_EQ("void a(){\n"
10747             "    // line starts with '\t'\n"
10748             "};",
10749             format("void a(){\n"
10750                    "\t\t// line starts with '\t'\n"
10751                    "};",
10752                    Tab));
10753 
10754   Tab.UseTab = FormatStyle::UT_AlignWithSpaces;
10755   EXPECT_EQ("void a(){\n"
10756             "    // line starts with '\t'\n"
10757             "};",
10758             format("void a(){\n"
10759                    "\t// line starts with '\t'\n"
10760                    "};",
10761                    Tab));
10762 
10763   EXPECT_EQ("void a(){\n"
10764             "    // line starts with '\t'\n"
10765             "};",
10766             format("void a(){\n"
10767                    "\t\t// line starts with '\t'\n"
10768                    "};",
10769                    Tab));
10770 
10771   Tab.UseTab = FormatStyle::UT_Always;
10772   EXPECT_EQ("void a(){\n"
10773             "// line starts with '\t'\n"
10774             "};",
10775             format("void a(){\n"
10776                    "\t// line starts with '\t'\n"
10777                    "};",
10778                    Tab));
10779 
10780   EXPECT_EQ("void a(){\n"
10781             "// line starts with '\t'\n"
10782             "};",
10783             format("void a(){\n"
10784                    "\t\t// line starts with '\t'\n"
10785                    "};",
10786                    Tab));
10787 }
10788 
10789 TEST_F(FormatTest, CalculatesOriginalColumn) {
10790   EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
10791             "q\"; /* some\n"
10792             "       comment */",
10793             format("  \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
10794                    "q\"; /* some\n"
10795                    "       comment */",
10796                    getLLVMStyle()));
10797   EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
10798             "/* some\n"
10799             "   comment */",
10800             format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
10801                    " /* some\n"
10802                    "    comment */",
10803                    getLLVMStyle()));
10804   EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
10805             "qqq\n"
10806             "/* some\n"
10807             "   comment */",
10808             format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
10809                    "qqq\n"
10810                    " /* some\n"
10811                    "    comment */",
10812                    getLLVMStyle()));
10813   EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
10814             "wwww; /* some\n"
10815             "         comment */",
10816             format("  inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
10817                    "wwww; /* some\n"
10818                    "         comment */",
10819                    getLLVMStyle()));
10820 }
10821 
10822 TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
10823   FormatStyle NoSpace = getLLVMStyle();
10824   NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
10825 
10826   verifyFormat("while(true)\n"
10827                "  continue;",
10828                NoSpace);
10829   verifyFormat("for(;;)\n"
10830                "  continue;",
10831                NoSpace);
10832   verifyFormat("if(true)\n"
10833                "  f();\n"
10834                "else if(true)\n"
10835                "  f();",
10836                NoSpace);
10837   verifyFormat("do {\n"
10838                "  do_something();\n"
10839                "} while(something());",
10840                NoSpace);
10841   verifyFormat("switch(x) {\n"
10842                "default:\n"
10843                "  break;\n"
10844                "}",
10845                NoSpace);
10846   verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
10847   verifyFormat("size_t x = sizeof(x);", NoSpace);
10848   verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
10849   verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
10850   verifyFormat("alignas(128) char a[128];", NoSpace);
10851   verifyFormat("size_t x = alignof(MyType);", NoSpace);
10852   verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
10853   verifyFormat("int f() throw(Deprecated);", NoSpace);
10854   verifyFormat("typedef void (*cb)(int);", NoSpace);
10855   verifyFormat("T A::operator()();", NoSpace);
10856   verifyFormat("X A::operator++(T);", NoSpace);
10857   verifyFormat("auto lambda = []() { return 0; };", NoSpace);
10858 
10859   FormatStyle Space = getLLVMStyle();
10860   Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
10861 
10862   verifyFormat("int f ();", Space);
10863   verifyFormat("void f (int a, T b) {\n"
10864                "  while (true)\n"
10865                "    continue;\n"
10866                "}",
10867                Space);
10868   verifyFormat("if (true)\n"
10869                "  f ();\n"
10870                "else if (true)\n"
10871                "  f ();",
10872                Space);
10873   verifyFormat("do {\n"
10874                "  do_something ();\n"
10875                "} while (something ());",
10876                Space);
10877   verifyFormat("switch (x) {\n"
10878                "default:\n"
10879                "  break;\n"
10880                "}",
10881                Space);
10882   verifyFormat("A::A () : a (1) {}", Space);
10883   verifyFormat("void f () __attribute__ ((asdf));", Space);
10884   verifyFormat("*(&a + 1);\n"
10885                "&((&a)[1]);\n"
10886                "a[(b + c) * d];\n"
10887                "(((a + 1) * 2) + 3) * 4;",
10888                Space);
10889   verifyFormat("#define A(x) x", Space);
10890   verifyFormat("#define A (x) x", Space);
10891   verifyFormat("#if defined(x)\n"
10892                "#endif",
10893                Space);
10894   verifyFormat("auto i = std::make_unique<int> (5);", Space);
10895   verifyFormat("size_t x = sizeof (x);", Space);
10896   verifyFormat("auto f (int x) -> decltype (x);", Space);
10897   verifyFormat("int f (T x) noexcept (x.create ());", Space);
10898   verifyFormat("alignas (128) char a[128];", Space);
10899   verifyFormat("size_t x = alignof (MyType);", Space);
10900   verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
10901   verifyFormat("int f () throw (Deprecated);", Space);
10902   verifyFormat("typedef void (*cb) (int);", Space);
10903   verifyFormat("T A::operator() ();", Space);
10904   verifyFormat("X A::operator++ (T);", Space);
10905   verifyFormat("auto lambda = [] () { return 0; };", Space);
10906   verifyFormat("int x = int (y);", Space);
10907 
10908   FormatStyle SomeSpace = getLLVMStyle();
10909   SomeSpace.SpaceBeforeParens = FormatStyle::SBPO_NonEmptyParentheses;
10910 
10911   verifyFormat("[]() -> float {}", SomeSpace);
10912   verifyFormat("[] (auto foo) {}", SomeSpace);
10913   verifyFormat("[foo]() -> int {}", SomeSpace);
10914   verifyFormat("int f();", SomeSpace);
10915   verifyFormat("void f (int a, T b) {\n"
10916                "  while (true)\n"
10917                "    continue;\n"
10918                "}",
10919                SomeSpace);
10920   verifyFormat("if (true)\n"
10921                "  f();\n"
10922                "else if (true)\n"
10923                "  f();",
10924                SomeSpace);
10925   verifyFormat("do {\n"
10926                "  do_something();\n"
10927                "} while (something());",
10928                SomeSpace);
10929   verifyFormat("switch (x) {\n"
10930                "default:\n"
10931                "  break;\n"
10932                "}",
10933                SomeSpace);
10934   verifyFormat("A::A() : a (1) {}", SomeSpace);
10935   verifyFormat("void f() __attribute__ ((asdf));", SomeSpace);
10936   verifyFormat("*(&a + 1);\n"
10937                "&((&a)[1]);\n"
10938                "a[(b + c) * d];\n"
10939                "(((a + 1) * 2) + 3) * 4;",
10940                SomeSpace);
10941   verifyFormat("#define A(x) x", SomeSpace);
10942   verifyFormat("#define A (x) x", SomeSpace);
10943   verifyFormat("#if defined(x)\n"
10944                "#endif",
10945                SomeSpace);
10946   verifyFormat("auto i = std::make_unique<int> (5);", SomeSpace);
10947   verifyFormat("size_t x = sizeof (x);", SomeSpace);
10948   verifyFormat("auto f (int x) -> decltype (x);", SomeSpace);
10949   verifyFormat("int f (T x) noexcept (x.create());", SomeSpace);
10950   verifyFormat("alignas (128) char a[128];", SomeSpace);
10951   verifyFormat("size_t x = alignof (MyType);", SomeSpace);
10952   verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");",
10953                SomeSpace);
10954   verifyFormat("int f() throw (Deprecated);", SomeSpace);
10955   verifyFormat("typedef void (*cb) (int);", SomeSpace);
10956   verifyFormat("T A::operator()();", SomeSpace);
10957   verifyFormat("X A::operator++ (T);", SomeSpace);
10958   verifyFormat("int x = int (y);", SomeSpace);
10959   verifyFormat("auto lambda = []() { return 0; };", SomeSpace);
10960 }
10961 
10962 TEST_F(FormatTest, SpaceAfterLogicalNot) {
10963   FormatStyle Spaces = getLLVMStyle();
10964   Spaces.SpaceAfterLogicalNot = true;
10965 
10966   verifyFormat("bool x = ! y", Spaces);
10967   verifyFormat("if (! isFailure())", Spaces);
10968   verifyFormat("if (! (a && b))", Spaces);
10969   verifyFormat("\"Error!\"", Spaces);
10970   verifyFormat("! ! x", Spaces);
10971 }
10972 
10973 TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
10974   FormatStyle Spaces = getLLVMStyle();
10975 
10976   Spaces.SpacesInParentheses = true;
10977   verifyFormat("do_something( ::globalVar );", Spaces);
10978   verifyFormat("call( x, y, z );", Spaces);
10979   verifyFormat("call();", Spaces);
10980   verifyFormat("std::function<void( int, int )> callback;", Spaces);
10981   verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
10982                Spaces);
10983   verifyFormat("while ( (bool)1 )\n"
10984                "  continue;",
10985                Spaces);
10986   verifyFormat("for ( ;; )\n"
10987                "  continue;",
10988                Spaces);
10989   verifyFormat("if ( true )\n"
10990                "  f();\n"
10991                "else if ( true )\n"
10992                "  f();",
10993                Spaces);
10994   verifyFormat("do {\n"
10995                "  do_something( (int)i );\n"
10996                "} while ( something() );",
10997                Spaces);
10998   verifyFormat("switch ( x ) {\n"
10999                "default:\n"
11000                "  break;\n"
11001                "}",
11002                Spaces);
11003 
11004   Spaces.SpacesInParentheses = false;
11005   Spaces.SpacesInCStyleCastParentheses = true;
11006   verifyFormat("Type *A = ( Type * )P;", Spaces);
11007   verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
11008   verifyFormat("x = ( int32 )y;", Spaces);
11009   verifyFormat("int a = ( int )(2.0f);", Spaces);
11010   verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
11011   verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
11012   verifyFormat("#define x (( int )-1)", Spaces);
11013 
11014   // Run the first set of tests again with:
11015   Spaces.SpacesInParentheses = false;
11016   Spaces.SpaceInEmptyParentheses = true;
11017   Spaces.SpacesInCStyleCastParentheses = true;
11018   verifyFormat("call(x, y, z);", Spaces);
11019   verifyFormat("call( );", Spaces);
11020   verifyFormat("std::function<void(int, int)> callback;", Spaces);
11021   verifyFormat("while (( bool )1)\n"
11022                "  continue;",
11023                Spaces);
11024   verifyFormat("for (;;)\n"
11025                "  continue;",
11026                Spaces);
11027   verifyFormat("if (true)\n"
11028                "  f( );\n"
11029                "else if (true)\n"
11030                "  f( );",
11031                Spaces);
11032   verifyFormat("do {\n"
11033                "  do_something(( int )i);\n"
11034                "} while (something( ));",
11035                Spaces);
11036   verifyFormat("switch (x) {\n"
11037                "default:\n"
11038                "  break;\n"
11039                "}",
11040                Spaces);
11041 
11042   // Run the first set of tests again with:
11043   Spaces.SpaceAfterCStyleCast = true;
11044   verifyFormat("call(x, y, z);", Spaces);
11045   verifyFormat("call( );", Spaces);
11046   verifyFormat("std::function<void(int, int)> callback;", Spaces);
11047   verifyFormat("while (( bool ) 1)\n"
11048                "  continue;",
11049                Spaces);
11050   verifyFormat("for (;;)\n"
11051                "  continue;",
11052                Spaces);
11053   verifyFormat("if (true)\n"
11054                "  f( );\n"
11055                "else if (true)\n"
11056                "  f( );",
11057                Spaces);
11058   verifyFormat("do {\n"
11059                "  do_something(( int ) i);\n"
11060                "} while (something( ));",
11061                Spaces);
11062   verifyFormat("switch (x) {\n"
11063                "default:\n"
11064                "  break;\n"
11065                "}",
11066                Spaces);
11067 
11068   // Run subset of tests again with:
11069   Spaces.SpacesInCStyleCastParentheses = false;
11070   Spaces.SpaceAfterCStyleCast = true;
11071   verifyFormat("while ((bool) 1)\n"
11072                "  continue;",
11073                Spaces);
11074   verifyFormat("do {\n"
11075                "  do_something((int) i);\n"
11076                "} while (something( ));",
11077                Spaces);
11078 }
11079 
11080 TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
11081   verifyFormat("int a[5];");
11082   verifyFormat("a[3] += 42;");
11083 
11084   FormatStyle Spaces = getLLVMStyle();
11085   Spaces.SpacesInSquareBrackets = true;
11086   // Not lambdas.
11087   verifyFormat("int a[ 5 ];", Spaces);
11088   verifyFormat("a[ 3 ] += 42;", Spaces);
11089   verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
11090   verifyFormat("double &operator[](int i) { return 0; }\n"
11091                "int i;",
11092                Spaces);
11093   verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
11094   verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
11095   verifyFormat("int i = (*b)[ a ]->f();", Spaces);
11096   // Lambdas.
11097   verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
11098   verifyFormat("return [ i, args... ] {};", Spaces);
11099   verifyFormat("int foo = [ &bar ]() {};", Spaces);
11100   verifyFormat("int foo = [ = ]() {};", Spaces);
11101   verifyFormat("int foo = [ & ]() {};", Spaces);
11102   verifyFormat("int foo = [ =, &bar ]() {};", Spaces);
11103   verifyFormat("int foo = [ &bar, = ]() {};", Spaces);
11104 }
11105 
11106 TEST_F(FormatTest, ConfigurableSpaceBeforeBrackets) {
11107   FormatStyle NoSpaceStyle = getLLVMStyle();
11108   verifyFormat("int a[5];", NoSpaceStyle);
11109   verifyFormat("a[3] += 42;", NoSpaceStyle);
11110 
11111   verifyFormat("int a[1];", NoSpaceStyle);
11112   verifyFormat("int 1 [a];", NoSpaceStyle);
11113   verifyFormat("int a[1][2];", NoSpaceStyle);
11114   verifyFormat("a[7] = 5;", NoSpaceStyle);
11115   verifyFormat("int a = (f())[23];", NoSpaceStyle);
11116   verifyFormat("f([] {})", NoSpaceStyle);
11117 
11118   FormatStyle Space = getLLVMStyle();
11119   Space.SpaceBeforeSquareBrackets = true;
11120   verifyFormat("int c = []() -> int { return 2; }();\n", Space);
11121   verifyFormat("return [i, args...] {};", Space);
11122 
11123   verifyFormat("int a [5];", Space);
11124   verifyFormat("a [3] += 42;", Space);
11125   verifyFormat("constexpr char hello []{\"hello\"};", Space);
11126   verifyFormat("double &operator[](int i) { return 0; }\n"
11127                "int i;",
11128                Space);
11129   verifyFormat("std::unique_ptr<int []> foo() {}", Space);
11130   verifyFormat("int i = a [a][a]->f();", Space);
11131   verifyFormat("int i = (*b) [a]->f();", Space);
11132 
11133   verifyFormat("int a [1];", Space);
11134   verifyFormat("int 1 [a];", Space);
11135   verifyFormat("int a [1][2];", Space);
11136   verifyFormat("a [7] = 5;", Space);
11137   verifyFormat("int a = (f()) [23];", Space);
11138   verifyFormat("f([] {})", Space);
11139 }
11140 
11141 TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
11142   verifyFormat("int a = 5;");
11143   verifyFormat("a += 42;");
11144   verifyFormat("a or_eq 8;");
11145 
11146   FormatStyle Spaces = getLLVMStyle();
11147   Spaces.SpaceBeforeAssignmentOperators = false;
11148   verifyFormat("int a= 5;", Spaces);
11149   verifyFormat("a+= 42;", Spaces);
11150   verifyFormat("a or_eq 8;", Spaces);
11151 }
11152 
11153 TEST_F(FormatTest, ConfigurableSpaceBeforeColon) {
11154   verifyFormat("class Foo : public Bar {};");
11155   verifyFormat("Foo::Foo() : foo(1) {}");
11156   verifyFormat("for (auto a : b) {\n}");
11157   verifyFormat("int x = a ? b : c;");
11158   verifyFormat("{\n"
11159                "label0:\n"
11160                "  int x = 0;\n"
11161                "}");
11162   verifyFormat("switch (x) {\n"
11163                "case 1:\n"
11164                "default:\n"
11165                "}");
11166 
11167   FormatStyle CtorInitializerStyle = getLLVMStyleWithColumns(30);
11168   CtorInitializerStyle.SpaceBeforeCtorInitializerColon = false;
11169   verifyFormat("class Foo : public Bar {};", CtorInitializerStyle);
11170   verifyFormat("Foo::Foo(): foo(1) {}", CtorInitializerStyle);
11171   verifyFormat("for (auto a : b) {\n}", CtorInitializerStyle);
11172   verifyFormat("int x = a ? b : c;", CtorInitializerStyle);
11173   verifyFormat("{\n"
11174                "label1:\n"
11175                "  int x = 0;\n"
11176                "}",
11177                CtorInitializerStyle);
11178   verifyFormat("switch (x) {\n"
11179                "case 1:\n"
11180                "default:\n"
11181                "}",
11182                CtorInitializerStyle);
11183   CtorInitializerStyle.BreakConstructorInitializers =
11184       FormatStyle::BCIS_AfterColon;
11185   verifyFormat("Fooooooooooo::Fooooooooooo():\n"
11186                "    aaaaaaaaaaaaaaaa(1),\n"
11187                "    bbbbbbbbbbbbbbbb(2) {}",
11188                CtorInitializerStyle);
11189   CtorInitializerStyle.BreakConstructorInitializers =
11190       FormatStyle::BCIS_BeforeComma;
11191   verifyFormat("Fooooooooooo::Fooooooooooo()\n"
11192                "    : aaaaaaaaaaaaaaaa(1)\n"
11193                "    , bbbbbbbbbbbbbbbb(2) {}",
11194                CtorInitializerStyle);
11195   CtorInitializerStyle.BreakConstructorInitializers =
11196       FormatStyle::BCIS_BeforeColon;
11197   verifyFormat("Fooooooooooo::Fooooooooooo()\n"
11198                "    : aaaaaaaaaaaaaaaa(1),\n"
11199                "      bbbbbbbbbbbbbbbb(2) {}",
11200                CtorInitializerStyle);
11201   CtorInitializerStyle.ConstructorInitializerIndentWidth = 0;
11202   verifyFormat("Fooooooooooo::Fooooooooooo()\n"
11203                ": aaaaaaaaaaaaaaaa(1),\n"
11204                "  bbbbbbbbbbbbbbbb(2) {}",
11205                CtorInitializerStyle);
11206 
11207   FormatStyle InheritanceStyle = getLLVMStyleWithColumns(30);
11208   InheritanceStyle.SpaceBeforeInheritanceColon = false;
11209   verifyFormat("class Foo: public Bar {};", InheritanceStyle);
11210   verifyFormat("Foo::Foo() : foo(1) {}", InheritanceStyle);
11211   verifyFormat("for (auto a : b) {\n}", InheritanceStyle);
11212   verifyFormat("int x = a ? b : c;", InheritanceStyle);
11213   verifyFormat("{\n"
11214                "label2:\n"
11215                "  int x = 0;\n"
11216                "}",
11217                InheritanceStyle);
11218   verifyFormat("switch (x) {\n"
11219                "case 1:\n"
11220                "default:\n"
11221                "}",
11222                InheritanceStyle);
11223   InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_AfterColon;
11224   verifyFormat("class Foooooooooooooooooooooo:\n"
11225                "    public aaaaaaaaaaaaaaaaaa,\n"
11226                "    public bbbbbbbbbbbbbbbbbb {\n"
11227                "}",
11228                InheritanceStyle);
11229   InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeComma;
11230   verifyFormat("class Foooooooooooooooooooooo\n"
11231                "    : public aaaaaaaaaaaaaaaaaa\n"
11232                "    , public bbbbbbbbbbbbbbbbbb {\n"
11233                "}",
11234                InheritanceStyle);
11235   InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
11236   verifyFormat("class Foooooooooooooooooooooo\n"
11237                "    : public aaaaaaaaaaaaaaaaaa,\n"
11238                "      public bbbbbbbbbbbbbbbbbb {\n"
11239                "}",
11240                InheritanceStyle);
11241   InheritanceStyle.ConstructorInitializerIndentWidth = 0;
11242   verifyFormat("class Foooooooooooooooooooooo\n"
11243                ": public aaaaaaaaaaaaaaaaaa,\n"
11244                "  public bbbbbbbbbbbbbbbbbb {}",
11245                InheritanceStyle);
11246 
11247   FormatStyle ForLoopStyle = getLLVMStyle();
11248   ForLoopStyle.SpaceBeforeRangeBasedForLoopColon = false;
11249   verifyFormat("class Foo : public Bar {};", ForLoopStyle);
11250   verifyFormat("Foo::Foo() : foo(1) {}", ForLoopStyle);
11251   verifyFormat("for (auto a: b) {\n}", ForLoopStyle);
11252   verifyFormat("int x = a ? b : c;", ForLoopStyle);
11253   verifyFormat("{\n"
11254                "label2:\n"
11255                "  int x = 0;\n"
11256                "}",
11257                ForLoopStyle);
11258   verifyFormat("switch (x) {\n"
11259                "case 1:\n"
11260                "default:\n"
11261                "}",
11262                ForLoopStyle);
11263 
11264   FormatStyle NoSpaceStyle = getLLVMStyle();
11265   NoSpaceStyle.SpaceBeforeCtorInitializerColon = false;
11266   NoSpaceStyle.SpaceBeforeInheritanceColon = false;
11267   NoSpaceStyle.SpaceBeforeRangeBasedForLoopColon = false;
11268   verifyFormat("class Foo: public Bar {};", NoSpaceStyle);
11269   verifyFormat("Foo::Foo(): foo(1) {}", NoSpaceStyle);
11270   verifyFormat("for (auto a: b) {\n}", NoSpaceStyle);
11271   verifyFormat("int x = a ? b : c;", NoSpaceStyle);
11272   verifyFormat("{\n"
11273                "label3:\n"
11274                "  int x = 0;\n"
11275                "}",
11276                NoSpaceStyle);
11277   verifyFormat("switch (x) {\n"
11278                "case 1:\n"
11279                "default:\n"
11280                "}",
11281                NoSpaceStyle);
11282 }
11283 
11284 TEST_F(FormatTest, AlignConsecutiveMacros) {
11285   FormatStyle Style = getLLVMStyle();
11286   Style.AlignConsecutiveAssignments = true;
11287   Style.AlignConsecutiveDeclarations = true;
11288   Style.AlignConsecutiveMacros = false;
11289 
11290   verifyFormat("#define a 3\n"
11291                "#define bbbb 4\n"
11292                "#define ccc (5)",
11293                Style);
11294 
11295   verifyFormat("#define f(x) (x * x)\n"
11296                "#define fff(x, y, z) (x * y + z)\n"
11297                "#define ffff(x, y) (x - y)",
11298                Style);
11299 
11300   verifyFormat("#define foo(x, y) (x + y)\n"
11301                "#define bar (5, 6)(2 + 2)",
11302                Style);
11303 
11304   verifyFormat("#define a 3\n"
11305                "#define bbbb 4\n"
11306                "#define ccc (5)\n"
11307                "#define f(x) (x * x)\n"
11308                "#define fff(x, y, z) (x * y + z)\n"
11309                "#define ffff(x, y) (x - y)",
11310                Style);
11311 
11312   Style.AlignConsecutiveMacros = true;
11313   verifyFormat("#define a    3\n"
11314                "#define bbbb 4\n"
11315                "#define ccc  (5)",
11316                Style);
11317 
11318   verifyFormat("#define f(x)         (x * x)\n"
11319                "#define fff(x, y, z) (x * y + z)\n"
11320                "#define ffff(x, y)   (x - y)",
11321                Style);
11322 
11323   verifyFormat("#define foo(x, y) (x + y)\n"
11324                "#define bar       (5, 6)(2 + 2)",
11325                Style);
11326 
11327   verifyFormat("#define a            3\n"
11328                "#define bbbb         4\n"
11329                "#define ccc          (5)\n"
11330                "#define f(x)         (x * x)\n"
11331                "#define fff(x, y, z) (x * y + z)\n"
11332                "#define ffff(x, y)   (x - y)",
11333                Style);
11334 
11335   verifyFormat("#define a         5\n"
11336                "#define foo(x, y) (x + y)\n"
11337                "#define CCC       (6)\n"
11338                "auto lambda = []() {\n"
11339                "  auto  ii = 0;\n"
11340                "  float j  = 0;\n"
11341                "  return 0;\n"
11342                "};\n"
11343                "int   i  = 0;\n"
11344                "float i2 = 0;\n"
11345                "auto  v  = type{\n"
11346                "    i = 1,   //\n"
11347                "    (i = 2), //\n"
11348                "    i = 3    //\n"
11349                "};",
11350                Style);
11351 
11352   Style.AlignConsecutiveMacros = false;
11353   Style.ColumnLimit = 20;
11354 
11355   verifyFormat("#define a          \\\n"
11356                "  \"aabbbbbbbbbbbb\"\n"
11357                "#define D          \\\n"
11358                "  \"aabbbbbbbbbbbb\" \\\n"
11359                "  \"ccddeeeeeeeee\"\n"
11360                "#define B          \\\n"
11361                "  \"QQQQQQQQQQQQQ\"  \\\n"
11362                "  \"FFFFFFFFFFFFF\"  \\\n"
11363                "  \"LLLLLLLL\"\n",
11364                Style);
11365 
11366   Style.AlignConsecutiveMacros = true;
11367   verifyFormat("#define a          \\\n"
11368                "  \"aabbbbbbbbbbbb\"\n"
11369                "#define D          \\\n"
11370                "  \"aabbbbbbbbbbbb\" \\\n"
11371                "  \"ccddeeeeeeeee\"\n"
11372                "#define B          \\\n"
11373                "  \"QQQQQQQQQQQQQ\"  \\\n"
11374                "  \"FFFFFFFFFFFFF\"  \\\n"
11375                "  \"LLLLLLLL\"\n",
11376                Style);
11377 }
11378 
11379 TEST_F(FormatTest, AlignConsecutiveAssignments) {
11380   FormatStyle Alignment = getLLVMStyle();
11381   Alignment.AlignConsecutiveMacros = true;
11382   Alignment.AlignConsecutiveAssignments = false;
11383   verifyFormat("int a = 5;\n"
11384                "int oneTwoThree = 123;",
11385                Alignment);
11386   verifyFormat("int a = 5;\n"
11387                "int oneTwoThree = 123;",
11388                Alignment);
11389 
11390   Alignment.AlignConsecutiveAssignments = true;
11391   verifyFormat("int a           = 5;\n"
11392                "int oneTwoThree = 123;",
11393                Alignment);
11394   verifyFormat("int a           = method();\n"
11395                "int oneTwoThree = 133;",
11396                Alignment);
11397   verifyFormat("a &= 5;\n"
11398                "bcd *= 5;\n"
11399                "ghtyf += 5;\n"
11400                "dvfvdb -= 5;\n"
11401                "a /= 5;\n"
11402                "vdsvsv %= 5;\n"
11403                "sfdbddfbdfbb ^= 5;\n"
11404                "dvsdsv |= 5;\n"
11405                "int dsvvdvsdvvv = 123;",
11406                Alignment);
11407   verifyFormat("int i = 1, j = 10;\n"
11408                "something = 2000;",
11409                Alignment);
11410   verifyFormat("something = 2000;\n"
11411                "int i = 1, j = 10;\n",
11412                Alignment);
11413   verifyFormat("something = 2000;\n"
11414                "another   = 911;\n"
11415                "int i = 1, j = 10;\n"
11416                "oneMore = 1;\n"
11417                "i       = 2;",
11418                Alignment);
11419   verifyFormat("int a   = 5;\n"
11420                "int one = 1;\n"
11421                "method();\n"
11422                "int oneTwoThree = 123;\n"
11423                "int oneTwo      = 12;",
11424                Alignment);
11425   verifyFormat("int oneTwoThree = 123;\n"
11426                "int oneTwo      = 12;\n"
11427                "method();\n",
11428                Alignment);
11429   verifyFormat("int oneTwoThree = 123; // comment\n"
11430                "int oneTwo      = 12;  // comment",
11431                Alignment);
11432   EXPECT_EQ("int a = 5;\n"
11433             "\n"
11434             "int oneTwoThree = 123;",
11435             format("int a       = 5;\n"
11436                    "\n"
11437                    "int oneTwoThree= 123;",
11438                    Alignment));
11439   EXPECT_EQ("int a   = 5;\n"
11440             "int one = 1;\n"
11441             "\n"
11442             "int oneTwoThree = 123;",
11443             format("int a = 5;\n"
11444                    "int one = 1;\n"
11445                    "\n"
11446                    "int oneTwoThree = 123;",
11447                    Alignment));
11448   EXPECT_EQ("int a   = 5;\n"
11449             "int one = 1;\n"
11450             "\n"
11451             "int oneTwoThree = 123;\n"
11452             "int oneTwo      = 12;",
11453             format("int a = 5;\n"
11454                    "int one = 1;\n"
11455                    "\n"
11456                    "int oneTwoThree = 123;\n"
11457                    "int oneTwo = 12;",
11458                    Alignment));
11459   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
11460   verifyFormat("#define A \\\n"
11461                "  int aaaa       = 12; \\\n"
11462                "  int b          = 23; \\\n"
11463                "  int ccc        = 234; \\\n"
11464                "  int dddddddddd = 2345;",
11465                Alignment);
11466   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
11467   verifyFormat("#define A               \\\n"
11468                "  int aaaa       = 12;  \\\n"
11469                "  int b          = 23;  \\\n"
11470                "  int ccc        = 234; \\\n"
11471                "  int dddddddddd = 2345;",
11472                Alignment);
11473   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
11474   verifyFormat("#define A                                                      "
11475                "                \\\n"
11476                "  int aaaa       = 12;                                         "
11477                "                \\\n"
11478                "  int b          = 23;                                         "
11479                "                \\\n"
11480                "  int ccc        = 234;                                        "
11481                "                \\\n"
11482                "  int dddddddddd = 2345;",
11483                Alignment);
11484   verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
11485                "k = 4, int l = 5,\n"
11486                "                  int m = 6) {\n"
11487                "  int j      = 10;\n"
11488                "  otherThing = 1;\n"
11489                "}",
11490                Alignment);
11491   verifyFormat("void SomeFunction(int parameter = 0) {\n"
11492                "  int i   = 1;\n"
11493                "  int j   = 2;\n"
11494                "  int big = 10000;\n"
11495                "}",
11496                Alignment);
11497   verifyFormat("class C {\n"
11498                "public:\n"
11499                "  int i            = 1;\n"
11500                "  virtual void f() = 0;\n"
11501                "};",
11502                Alignment);
11503   verifyFormat("int i = 1;\n"
11504                "if (SomeType t = getSomething()) {\n"
11505                "}\n"
11506                "int j   = 2;\n"
11507                "int big = 10000;",
11508                Alignment);
11509   verifyFormat("int j = 7;\n"
11510                "for (int k = 0; k < N; ++k) {\n"
11511                "}\n"
11512                "int j   = 2;\n"
11513                "int big = 10000;\n"
11514                "}",
11515                Alignment);
11516   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
11517   verifyFormat("int i = 1;\n"
11518                "LooooooooooongType loooooooooooooooooooooongVariable\n"
11519                "    = someLooooooooooooooooongFunction();\n"
11520                "int j = 2;",
11521                Alignment);
11522   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
11523   verifyFormat("int i = 1;\n"
11524                "LooooooooooongType loooooooooooooooooooooongVariable =\n"
11525                "    someLooooooooooooooooongFunction();\n"
11526                "int j = 2;",
11527                Alignment);
11528 
11529   verifyFormat("auto lambda = []() {\n"
11530                "  auto i = 0;\n"
11531                "  return 0;\n"
11532                "};\n"
11533                "int i  = 0;\n"
11534                "auto v = type{\n"
11535                "    i = 1,   //\n"
11536                "    (i = 2), //\n"
11537                "    i = 3    //\n"
11538                "};",
11539                Alignment);
11540 
11541   verifyFormat(
11542       "int i      = 1;\n"
11543       "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
11544       "                          loooooooooooooooooooooongParameterB);\n"
11545       "int j      = 2;",
11546       Alignment);
11547 
11548   verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
11549                "          typename B   = very_long_type_name_1,\n"
11550                "          typename T_2 = very_long_type_name_2>\n"
11551                "auto foo() {}\n",
11552                Alignment);
11553   verifyFormat("int a, b = 1;\n"
11554                "int c  = 2;\n"
11555                "int dd = 3;\n",
11556                Alignment);
11557   verifyFormat("int aa       = ((1 > 2) ? 3 : 4);\n"
11558                "float b[1][] = {{3.f}};\n",
11559                Alignment);
11560   verifyFormat("for (int i = 0; i < 1; i++)\n"
11561                "  int x = 1;\n",
11562                Alignment);
11563   verifyFormat("for (i = 0; i < 1; i++)\n"
11564                "  x = 1;\n"
11565                "y = 1;\n",
11566                Alignment);
11567 }
11568 
11569 TEST_F(FormatTest, AlignConsecutiveDeclarations) {
11570   FormatStyle Alignment = getLLVMStyle();
11571   Alignment.AlignConsecutiveMacros = true;
11572   Alignment.AlignConsecutiveDeclarations = false;
11573   verifyFormat("float const a = 5;\n"
11574                "int oneTwoThree = 123;",
11575                Alignment);
11576   verifyFormat("int a = 5;\n"
11577                "float const oneTwoThree = 123;",
11578                Alignment);
11579 
11580   Alignment.AlignConsecutiveDeclarations = true;
11581   verifyFormat("float const a = 5;\n"
11582                "int         oneTwoThree = 123;",
11583                Alignment);
11584   verifyFormat("int         a = method();\n"
11585                "float const oneTwoThree = 133;",
11586                Alignment);
11587   verifyFormat("int i = 1, j = 10;\n"
11588                "something = 2000;",
11589                Alignment);
11590   verifyFormat("something = 2000;\n"
11591                "int i = 1, j = 10;\n",
11592                Alignment);
11593   verifyFormat("float      something = 2000;\n"
11594                "double     another = 911;\n"
11595                "int        i = 1, j = 10;\n"
11596                "const int *oneMore = 1;\n"
11597                "unsigned   i = 2;",
11598                Alignment);
11599   verifyFormat("float a = 5;\n"
11600                "int   one = 1;\n"
11601                "method();\n"
11602                "const double       oneTwoThree = 123;\n"
11603                "const unsigned int oneTwo = 12;",
11604                Alignment);
11605   verifyFormat("int      oneTwoThree{0}; // comment\n"
11606                "unsigned oneTwo;         // comment",
11607                Alignment);
11608   EXPECT_EQ("float const a = 5;\n"
11609             "\n"
11610             "int oneTwoThree = 123;",
11611             format("float const   a = 5;\n"
11612                    "\n"
11613                    "int           oneTwoThree= 123;",
11614                    Alignment));
11615   EXPECT_EQ("float a = 5;\n"
11616             "int   one = 1;\n"
11617             "\n"
11618             "unsigned oneTwoThree = 123;",
11619             format("float    a = 5;\n"
11620                    "int      one = 1;\n"
11621                    "\n"
11622                    "unsigned oneTwoThree = 123;",
11623                    Alignment));
11624   EXPECT_EQ("float a = 5;\n"
11625             "int   one = 1;\n"
11626             "\n"
11627             "unsigned oneTwoThree = 123;\n"
11628             "int      oneTwo = 12;",
11629             format("float    a = 5;\n"
11630                    "int one = 1;\n"
11631                    "\n"
11632                    "unsigned oneTwoThree = 123;\n"
11633                    "int oneTwo = 12;",
11634                    Alignment));
11635   // Function prototype alignment
11636   verifyFormat("int    a();\n"
11637                "double b();",
11638                Alignment);
11639   verifyFormat("int    a(int x);\n"
11640                "double b();",
11641                Alignment);
11642   unsigned OldColumnLimit = Alignment.ColumnLimit;
11643   // We need to set ColumnLimit to zero, in order to stress nested alignments,
11644   // otherwise the function parameters will be re-flowed onto a single line.
11645   Alignment.ColumnLimit = 0;
11646   EXPECT_EQ("int    a(int   x,\n"
11647             "         float y);\n"
11648             "double b(int    x,\n"
11649             "         double y);",
11650             format("int a(int x,\n"
11651                    " float y);\n"
11652                    "double b(int x,\n"
11653                    " double y);",
11654                    Alignment));
11655   // This ensures that function parameters of function declarations are
11656   // correctly indented when their owning functions are indented.
11657   // The failure case here is for 'double y' to not be indented enough.
11658   EXPECT_EQ("double a(int x);\n"
11659             "int    b(int    y,\n"
11660             "         double z);",
11661             format("double a(int x);\n"
11662                    "int b(int y,\n"
11663                    " double z);",
11664                    Alignment));
11665   // Set ColumnLimit low so that we induce wrapping immediately after
11666   // the function name and opening paren.
11667   Alignment.ColumnLimit = 13;
11668   verifyFormat("int function(\n"
11669                "    int  x,\n"
11670                "    bool y);",
11671                Alignment);
11672   Alignment.ColumnLimit = OldColumnLimit;
11673   // Ensure function pointers don't screw up recursive alignment
11674   verifyFormat("int    a(int x, void (*fp)(int y));\n"
11675                "double b();",
11676                Alignment);
11677   Alignment.AlignConsecutiveAssignments = true;
11678   // Ensure recursive alignment is broken by function braces, so that the
11679   // "a = 1" does not align with subsequent assignments inside the function
11680   // body.
11681   verifyFormat("int func(int a = 1) {\n"
11682                "  int b  = 2;\n"
11683                "  int cc = 3;\n"
11684                "}",
11685                Alignment);
11686   verifyFormat("float      something = 2000;\n"
11687                "double     another   = 911;\n"
11688                "int        i = 1, j = 10;\n"
11689                "const int *oneMore = 1;\n"
11690                "unsigned   i       = 2;",
11691                Alignment);
11692   verifyFormat("int      oneTwoThree = {0}; // comment\n"
11693                "unsigned oneTwo      = 0;   // comment",
11694                Alignment);
11695   // Make sure that scope is correctly tracked, in the absence of braces
11696   verifyFormat("for (int i = 0; i < n; i++)\n"
11697                "  j = i;\n"
11698                "double x = 1;\n",
11699                Alignment);
11700   verifyFormat("if (int i = 0)\n"
11701                "  j = i;\n"
11702                "double x = 1;\n",
11703                Alignment);
11704   // Ensure operator[] and operator() are comprehended
11705   verifyFormat("struct test {\n"
11706                "  long long int foo();\n"
11707                "  int           operator[](int a);\n"
11708                "  double        bar();\n"
11709                "};\n",
11710                Alignment);
11711   verifyFormat("struct test {\n"
11712                "  long long int foo();\n"
11713                "  int           operator()(int a);\n"
11714                "  double        bar();\n"
11715                "};\n",
11716                Alignment);
11717   EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
11718             "  int const i   = 1;\n"
11719             "  int *     j   = 2;\n"
11720             "  int       big = 10000;\n"
11721             "\n"
11722             "  unsigned oneTwoThree = 123;\n"
11723             "  int      oneTwo      = 12;\n"
11724             "  method();\n"
11725             "  float k  = 2;\n"
11726             "  int   ll = 10000;\n"
11727             "}",
11728             format("void SomeFunction(int parameter= 0) {\n"
11729                    " int const  i= 1;\n"
11730                    "  int *j=2;\n"
11731                    " int big  =  10000;\n"
11732                    "\n"
11733                    "unsigned oneTwoThree  =123;\n"
11734                    "int oneTwo = 12;\n"
11735                    "  method();\n"
11736                    "float k= 2;\n"
11737                    "int ll=10000;\n"
11738                    "}",
11739                    Alignment));
11740   Alignment.AlignConsecutiveAssignments = false;
11741   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
11742   verifyFormat("#define A \\\n"
11743                "  int       aaaa = 12; \\\n"
11744                "  float     b = 23; \\\n"
11745                "  const int ccc = 234; \\\n"
11746                "  unsigned  dddddddddd = 2345;",
11747                Alignment);
11748   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
11749   verifyFormat("#define A              \\\n"
11750                "  int       aaaa = 12; \\\n"
11751                "  float     b = 23;    \\\n"
11752                "  const int ccc = 234; \\\n"
11753                "  unsigned  dddddddddd = 2345;",
11754                Alignment);
11755   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
11756   Alignment.ColumnLimit = 30;
11757   verifyFormat("#define A                    \\\n"
11758                "  int       aaaa = 12;       \\\n"
11759                "  float     b = 23;          \\\n"
11760                "  const int ccc = 234;       \\\n"
11761                "  int       dddddddddd = 2345;",
11762                Alignment);
11763   Alignment.ColumnLimit = 80;
11764   verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
11765                "k = 4, int l = 5,\n"
11766                "                  int m = 6) {\n"
11767                "  const int j = 10;\n"
11768                "  otherThing = 1;\n"
11769                "}",
11770                Alignment);
11771   verifyFormat("void SomeFunction(int parameter = 0) {\n"
11772                "  int const i = 1;\n"
11773                "  int *     j = 2;\n"
11774                "  int       big = 10000;\n"
11775                "}",
11776                Alignment);
11777   verifyFormat("class C {\n"
11778                "public:\n"
11779                "  int          i = 1;\n"
11780                "  virtual void f() = 0;\n"
11781                "};",
11782                Alignment);
11783   verifyFormat("float i = 1;\n"
11784                "if (SomeType t = getSomething()) {\n"
11785                "}\n"
11786                "const unsigned j = 2;\n"
11787                "int            big = 10000;",
11788                Alignment);
11789   verifyFormat("float j = 7;\n"
11790                "for (int k = 0; k < N; ++k) {\n"
11791                "}\n"
11792                "unsigned j = 2;\n"
11793                "int      big = 10000;\n"
11794                "}",
11795                Alignment);
11796   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
11797   verifyFormat("float              i = 1;\n"
11798                "LooooooooooongType loooooooooooooooooooooongVariable\n"
11799                "    = someLooooooooooooooooongFunction();\n"
11800                "int j = 2;",
11801                Alignment);
11802   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
11803   verifyFormat("int                i = 1;\n"
11804                "LooooooooooongType loooooooooooooooooooooongVariable =\n"
11805                "    someLooooooooooooooooongFunction();\n"
11806                "int j = 2;",
11807                Alignment);
11808 
11809   Alignment.AlignConsecutiveAssignments = true;
11810   verifyFormat("auto lambda = []() {\n"
11811                "  auto  ii = 0;\n"
11812                "  float j  = 0;\n"
11813                "  return 0;\n"
11814                "};\n"
11815                "int   i  = 0;\n"
11816                "float i2 = 0;\n"
11817                "auto  v  = type{\n"
11818                "    i = 1,   //\n"
11819                "    (i = 2), //\n"
11820                "    i = 3    //\n"
11821                "};",
11822                Alignment);
11823   Alignment.AlignConsecutiveAssignments = false;
11824 
11825   verifyFormat(
11826       "int      i = 1;\n"
11827       "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
11828       "                          loooooooooooooooooooooongParameterB);\n"
11829       "int      j = 2;",
11830       Alignment);
11831 
11832   // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
11833   // We expect declarations and assignments to align, as long as it doesn't
11834   // exceed the column limit, starting a new alignment sequence whenever it
11835   // happens.
11836   Alignment.AlignConsecutiveAssignments = true;
11837   Alignment.ColumnLimit = 30;
11838   verifyFormat("float    ii              = 1;\n"
11839                "unsigned j               = 2;\n"
11840                "int someVerylongVariable = 1;\n"
11841                "AnotherLongType  ll = 123456;\n"
11842                "VeryVeryLongType k  = 2;\n"
11843                "int              myvar = 1;",
11844                Alignment);
11845   Alignment.ColumnLimit = 80;
11846   Alignment.AlignConsecutiveAssignments = false;
11847 
11848   verifyFormat(
11849       "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
11850       "          typename LongType, typename B>\n"
11851       "auto foo() {}\n",
11852       Alignment);
11853   verifyFormat("float a, b = 1;\n"
11854                "int   c = 2;\n"
11855                "int   dd = 3;\n",
11856                Alignment);
11857   verifyFormat("int   aa = ((1 > 2) ? 3 : 4);\n"
11858                "float b[1][] = {{3.f}};\n",
11859                Alignment);
11860   Alignment.AlignConsecutiveAssignments = true;
11861   verifyFormat("float a, b = 1;\n"
11862                "int   c  = 2;\n"
11863                "int   dd = 3;\n",
11864                Alignment);
11865   verifyFormat("int   aa     = ((1 > 2) ? 3 : 4);\n"
11866                "float b[1][] = {{3.f}};\n",
11867                Alignment);
11868   Alignment.AlignConsecutiveAssignments = false;
11869 
11870   Alignment.ColumnLimit = 30;
11871   Alignment.BinPackParameters = false;
11872   verifyFormat("void foo(float     a,\n"
11873                "         float     b,\n"
11874                "         int       c,\n"
11875                "         uint32_t *d) {\n"
11876                "  int *  e = 0;\n"
11877                "  float  f = 0;\n"
11878                "  double g = 0;\n"
11879                "}\n"
11880                "void bar(ino_t     a,\n"
11881                "         int       b,\n"
11882                "         uint32_t *c,\n"
11883                "         bool      d) {}\n",
11884                Alignment);
11885   Alignment.BinPackParameters = true;
11886   Alignment.ColumnLimit = 80;
11887 
11888   // Bug 33507
11889   Alignment.PointerAlignment = FormatStyle::PAS_Middle;
11890   verifyFormat(
11891       "auto found = range::find_if(vsProducts, [&](auto * aProduct) {\n"
11892       "  static const Version verVs2017;\n"
11893       "  return true;\n"
11894       "});\n",
11895       Alignment);
11896   Alignment.PointerAlignment = FormatStyle::PAS_Right;
11897 
11898   // See llvm.org/PR35641
11899   Alignment.AlignConsecutiveDeclarations = true;
11900   verifyFormat("int func() { //\n"
11901                "  int      b;\n"
11902                "  unsigned c;\n"
11903                "}",
11904                Alignment);
11905 
11906   // See PR37175
11907   FormatStyle Style = getMozillaStyle();
11908   Style.AlignConsecutiveDeclarations = true;
11909   EXPECT_EQ("DECOR1 /**/ int8_t /**/ DECOR2 /**/\n"
11910             "foo(int a);",
11911             format("DECOR1 /**/ int8_t /**/ DECOR2 /**/ foo (int a);", Style));
11912 }
11913 
11914 TEST_F(FormatTest, LinuxBraceBreaking) {
11915   FormatStyle LinuxBraceStyle = getLLVMStyle();
11916   LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
11917   verifyFormat("namespace a\n"
11918                "{\n"
11919                "class A\n"
11920                "{\n"
11921                "  void f()\n"
11922                "  {\n"
11923                "    if (true) {\n"
11924                "      a();\n"
11925                "      b();\n"
11926                "    } else {\n"
11927                "      a();\n"
11928                "    }\n"
11929                "  }\n"
11930                "  void g() { return; }\n"
11931                "};\n"
11932                "struct B {\n"
11933                "  int x;\n"
11934                "};\n"
11935                "} // namespace a\n",
11936                LinuxBraceStyle);
11937   verifyFormat("enum X {\n"
11938                "  Y = 0,\n"
11939                "}\n",
11940                LinuxBraceStyle);
11941   verifyFormat("struct S {\n"
11942                "  int Type;\n"
11943                "  union {\n"
11944                "    int x;\n"
11945                "    double y;\n"
11946                "  } Value;\n"
11947                "  class C\n"
11948                "  {\n"
11949                "    MyFavoriteType Value;\n"
11950                "  } Class;\n"
11951                "}\n",
11952                LinuxBraceStyle);
11953 }
11954 
11955 TEST_F(FormatTest, MozillaBraceBreaking) {
11956   FormatStyle MozillaBraceStyle = getLLVMStyle();
11957   MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
11958   MozillaBraceStyle.FixNamespaceComments = false;
11959   verifyFormat("namespace a {\n"
11960                "class A\n"
11961                "{\n"
11962                "  void f()\n"
11963                "  {\n"
11964                "    if (true) {\n"
11965                "      a();\n"
11966                "      b();\n"
11967                "    }\n"
11968                "  }\n"
11969                "  void g() { return; }\n"
11970                "};\n"
11971                "enum E\n"
11972                "{\n"
11973                "  A,\n"
11974                "  // foo\n"
11975                "  B,\n"
11976                "  C\n"
11977                "};\n"
11978                "struct B\n"
11979                "{\n"
11980                "  int x;\n"
11981                "};\n"
11982                "}\n",
11983                MozillaBraceStyle);
11984   verifyFormat("struct S\n"
11985                "{\n"
11986                "  int Type;\n"
11987                "  union\n"
11988                "  {\n"
11989                "    int x;\n"
11990                "    double y;\n"
11991                "  } Value;\n"
11992                "  class C\n"
11993                "  {\n"
11994                "    MyFavoriteType Value;\n"
11995                "  } Class;\n"
11996                "}\n",
11997                MozillaBraceStyle);
11998 }
11999 
12000 TEST_F(FormatTest, StroustrupBraceBreaking) {
12001   FormatStyle StroustrupBraceStyle = getLLVMStyle();
12002   StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
12003   verifyFormat("namespace a {\n"
12004                "class A {\n"
12005                "  void f()\n"
12006                "  {\n"
12007                "    if (true) {\n"
12008                "      a();\n"
12009                "      b();\n"
12010                "    }\n"
12011                "  }\n"
12012                "  void g() { return; }\n"
12013                "};\n"
12014                "struct B {\n"
12015                "  int x;\n"
12016                "};\n"
12017                "} // namespace a\n",
12018                StroustrupBraceStyle);
12019 
12020   verifyFormat("void foo()\n"
12021                "{\n"
12022                "  if (a) {\n"
12023                "    a();\n"
12024                "  }\n"
12025                "  else {\n"
12026                "    b();\n"
12027                "  }\n"
12028                "}\n",
12029                StroustrupBraceStyle);
12030 
12031   verifyFormat("#ifdef _DEBUG\n"
12032                "int foo(int i = 0)\n"
12033                "#else\n"
12034                "int foo(int i = 5)\n"
12035                "#endif\n"
12036                "{\n"
12037                "  return i;\n"
12038                "}",
12039                StroustrupBraceStyle);
12040 
12041   verifyFormat("void foo() {}\n"
12042                "void bar()\n"
12043                "#ifdef _DEBUG\n"
12044                "{\n"
12045                "  foo();\n"
12046                "}\n"
12047                "#else\n"
12048                "{\n"
12049                "}\n"
12050                "#endif",
12051                StroustrupBraceStyle);
12052 
12053   verifyFormat("void foobar() { int i = 5; }\n"
12054                "#ifdef _DEBUG\n"
12055                "void bar() {}\n"
12056                "#else\n"
12057                "void bar() { foobar(); }\n"
12058                "#endif",
12059                StroustrupBraceStyle);
12060 }
12061 
12062 TEST_F(FormatTest, AllmanBraceBreaking) {
12063   FormatStyle AllmanBraceStyle = getLLVMStyle();
12064   AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
12065 
12066   EXPECT_EQ("namespace a\n"
12067             "{\n"
12068             "void f();\n"
12069             "void g();\n"
12070             "} // namespace a\n",
12071             format("namespace a\n"
12072                    "{\n"
12073                    "void f();\n"
12074                    "void g();\n"
12075                    "}\n",
12076                    AllmanBraceStyle));
12077 
12078   verifyFormat("namespace a\n"
12079                "{\n"
12080                "class A\n"
12081                "{\n"
12082                "  void f()\n"
12083                "  {\n"
12084                "    if (true)\n"
12085                "    {\n"
12086                "      a();\n"
12087                "      b();\n"
12088                "    }\n"
12089                "  }\n"
12090                "  void g() { return; }\n"
12091                "};\n"
12092                "struct B\n"
12093                "{\n"
12094                "  int x;\n"
12095                "};\n"
12096                "union C\n"
12097                "{\n"
12098                "};\n"
12099                "} // namespace a",
12100                AllmanBraceStyle);
12101 
12102   verifyFormat("void f()\n"
12103                "{\n"
12104                "  if (true)\n"
12105                "  {\n"
12106                "    a();\n"
12107                "  }\n"
12108                "  else if (false)\n"
12109                "  {\n"
12110                "    b();\n"
12111                "  }\n"
12112                "  else\n"
12113                "  {\n"
12114                "    c();\n"
12115                "  }\n"
12116                "}\n",
12117                AllmanBraceStyle);
12118 
12119   verifyFormat("void f()\n"
12120                "{\n"
12121                "  for (int i = 0; i < 10; ++i)\n"
12122                "  {\n"
12123                "    a();\n"
12124                "  }\n"
12125                "  while (false)\n"
12126                "  {\n"
12127                "    b();\n"
12128                "  }\n"
12129                "  do\n"
12130                "  {\n"
12131                "    c();\n"
12132                "  } while (false)\n"
12133                "}\n",
12134                AllmanBraceStyle);
12135 
12136   verifyFormat("void f(int a)\n"
12137                "{\n"
12138                "  switch (a)\n"
12139                "  {\n"
12140                "  case 0:\n"
12141                "    break;\n"
12142                "  case 1:\n"
12143                "  {\n"
12144                "    break;\n"
12145                "  }\n"
12146                "  case 2:\n"
12147                "  {\n"
12148                "  }\n"
12149                "  break;\n"
12150                "  default:\n"
12151                "    break;\n"
12152                "  }\n"
12153                "}\n",
12154                AllmanBraceStyle);
12155 
12156   verifyFormat("enum X\n"
12157                "{\n"
12158                "  Y = 0,\n"
12159                "}\n",
12160                AllmanBraceStyle);
12161   verifyFormat("enum X\n"
12162                "{\n"
12163                "  Y = 0\n"
12164                "}\n",
12165                AllmanBraceStyle);
12166 
12167   verifyFormat("@interface BSApplicationController ()\n"
12168                "{\n"
12169                "@private\n"
12170                "  id _extraIvar;\n"
12171                "}\n"
12172                "@end\n",
12173                AllmanBraceStyle);
12174 
12175   verifyFormat("#ifdef _DEBUG\n"
12176                "int foo(int i = 0)\n"
12177                "#else\n"
12178                "int foo(int i = 5)\n"
12179                "#endif\n"
12180                "{\n"
12181                "  return i;\n"
12182                "}",
12183                AllmanBraceStyle);
12184 
12185   verifyFormat("void foo() {}\n"
12186                "void bar()\n"
12187                "#ifdef _DEBUG\n"
12188                "{\n"
12189                "  foo();\n"
12190                "}\n"
12191                "#else\n"
12192                "{\n"
12193                "}\n"
12194                "#endif",
12195                AllmanBraceStyle);
12196 
12197   verifyFormat("void foobar() { int i = 5; }\n"
12198                "#ifdef _DEBUG\n"
12199                "void bar() {}\n"
12200                "#else\n"
12201                "void bar() { foobar(); }\n"
12202                "#endif",
12203                AllmanBraceStyle);
12204 
12205   // This shouldn't affect ObjC blocks..
12206   verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
12207                "  // ...\n"
12208                "  int i;\n"
12209                "}];",
12210                AllmanBraceStyle);
12211   verifyFormat("void (^block)(void) = ^{\n"
12212                "  // ...\n"
12213                "  int i;\n"
12214                "};",
12215                AllmanBraceStyle);
12216   // .. or dict literals.
12217   verifyFormat("void f()\n"
12218                "{\n"
12219                "  // ...\n"
12220                "  [object someMethod:@{@\"a\" : @\"b\"}];\n"
12221                "}",
12222                AllmanBraceStyle);
12223   verifyFormat("void f()\n"
12224                "{\n"
12225                "  // ...\n"
12226                "  [object someMethod:@{a : @\"b\"}];\n"
12227                "}",
12228                AllmanBraceStyle);
12229   verifyFormat("int f()\n"
12230                "{ // comment\n"
12231                "  return 42;\n"
12232                "}",
12233                AllmanBraceStyle);
12234 
12235   AllmanBraceStyle.ColumnLimit = 19;
12236   verifyFormat("void f() { int i; }", AllmanBraceStyle);
12237   AllmanBraceStyle.ColumnLimit = 18;
12238   verifyFormat("void f()\n"
12239                "{\n"
12240                "  int i;\n"
12241                "}",
12242                AllmanBraceStyle);
12243   AllmanBraceStyle.ColumnLimit = 80;
12244 
12245   FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
12246   BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine =
12247       FormatStyle::SIS_WithoutElse;
12248   BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
12249   verifyFormat("void f(bool b)\n"
12250                "{\n"
12251                "  if (b)\n"
12252                "  {\n"
12253                "    return;\n"
12254                "  }\n"
12255                "}\n",
12256                BreakBeforeBraceShortIfs);
12257   verifyFormat("void f(bool b)\n"
12258                "{\n"
12259                "  if constexpr (b)\n"
12260                "  {\n"
12261                "    return;\n"
12262                "  }\n"
12263                "}\n",
12264                BreakBeforeBraceShortIfs);
12265   verifyFormat("void f(bool b)\n"
12266                "{\n"
12267                "  if CONSTEXPR (b)\n"
12268                "  {\n"
12269                "    return;\n"
12270                "  }\n"
12271                "}\n",
12272                BreakBeforeBraceShortIfs);
12273   verifyFormat("void f(bool b)\n"
12274                "{\n"
12275                "  if (b) return;\n"
12276                "}\n",
12277                BreakBeforeBraceShortIfs);
12278   verifyFormat("void f(bool b)\n"
12279                "{\n"
12280                "  if constexpr (b) return;\n"
12281                "}\n",
12282                BreakBeforeBraceShortIfs);
12283   verifyFormat("void f(bool b)\n"
12284                "{\n"
12285                "  if CONSTEXPR (b) return;\n"
12286                "}\n",
12287                BreakBeforeBraceShortIfs);
12288   verifyFormat("void f(bool b)\n"
12289                "{\n"
12290                "  while (b)\n"
12291                "  {\n"
12292                "    return;\n"
12293                "  }\n"
12294                "}\n",
12295                BreakBeforeBraceShortIfs);
12296 }
12297 
12298 TEST_F(FormatTest, WhitesmithsBraceBreaking) {
12299   FormatStyle WhitesmithsBraceStyle = getLLVMStyle();
12300   WhitesmithsBraceStyle.BreakBeforeBraces = FormatStyle::BS_Whitesmiths;
12301 
12302   // Make a few changes to the style for testing purposes
12303   WhitesmithsBraceStyle.AllowShortFunctionsOnASingleLine =
12304       FormatStyle::SFS_Empty;
12305   WhitesmithsBraceStyle.AllowShortLambdasOnASingleLine = FormatStyle::SLS_None;
12306   WhitesmithsBraceStyle.ColumnLimit = 0;
12307 
12308   // FIXME: this test case can't decide whether there should be a blank line
12309   // after the ~D() line or not. It adds one if one doesn't exist in the test
12310   // and it removes the line if one exists.
12311   /*
12312   verifyFormat("class A;\n"
12313                "namespace B\n"
12314                "  {\n"
12315                "class C;\n"
12316                "// Comment\n"
12317                "class D\n"
12318                "  {\n"
12319                "public:\n"
12320                "  D();\n"
12321                "  ~D() {}\n"
12322                "private:\n"
12323                "  enum E\n"
12324                "    {\n"
12325                "    F\n"
12326                "    }\n"
12327                "  };\n"
12328                "  } // namespace B\n",
12329                WhitesmithsBraceStyle);
12330   */
12331 
12332   verifyFormat("namespace a\n"
12333                "  {\n"
12334                "class A\n"
12335                "  {\n"
12336                "  void f()\n"
12337                "    {\n"
12338                "    if (true)\n"
12339                "      {\n"
12340                "      a();\n"
12341                "      b();\n"
12342                "      }\n"
12343                "    }\n"
12344                "  void g()\n"
12345                "    {\n"
12346                "    return;\n"
12347                "    }\n"
12348                "  };\n"
12349                "struct B\n"
12350                "  {\n"
12351                "  int x;\n"
12352                "  };\n"
12353                "  } // namespace a",
12354                WhitesmithsBraceStyle);
12355 
12356   verifyFormat("void f()\n"
12357                "  {\n"
12358                "  if (true)\n"
12359                "    {\n"
12360                "    a();\n"
12361                "    }\n"
12362                "  else if (false)\n"
12363                "    {\n"
12364                "    b();\n"
12365                "    }\n"
12366                "  else\n"
12367                "    {\n"
12368                "    c();\n"
12369                "    }\n"
12370                "  }\n",
12371                WhitesmithsBraceStyle);
12372 
12373   verifyFormat("void f()\n"
12374                "  {\n"
12375                "  for (int i = 0; i < 10; ++i)\n"
12376                "    {\n"
12377                "    a();\n"
12378                "    }\n"
12379                "  while (false)\n"
12380                "    {\n"
12381                "    b();\n"
12382                "    }\n"
12383                "  do\n"
12384                "    {\n"
12385                "    c();\n"
12386                "    } while (false)\n"
12387                "  }\n",
12388                WhitesmithsBraceStyle);
12389 
12390   // FIXME: the block and the break under case 2 in this test don't get indented
12391   // correctly
12392   /*
12393   verifyFormat("void switchTest1(int a)\n"
12394                "  {\n"
12395                "  switch (a)\n"
12396                "    {\n"
12397                "    case 2:\n"
12398                "      {\n"
12399                "      }\n"
12400                "      break;\n"
12401                "    }\n"
12402                "  }\n",
12403                WhitesmithsBraceStyle);
12404   */
12405 
12406   // FIXME: the block and the break under case 2 in this test don't get indented
12407   // correctly
12408   /*
12409   verifyFormat("void switchTest2(int a)\n"
12410                "  {\n"
12411                "  switch (a)\n"
12412                "    {\n"
12413                "  case 0:\n"
12414                "    break;\n"
12415                "  case 1:\n"
12416                "    {\n"
12417                "    break;\n"
12418                "    }\n"
12419                "  case 2:\n"
12420                "    {\n"
12421                "    }\n"
12422                "    break;\n"
12423                "  default:\n"
12424                "    break;\n"
12425                "    }\n"
12426                "  }\n",
12427                WhitesmithsBraceStyle);
12428   */
12429 
12430   verifyFormat("enum X\n"
12431                "  {\n"
12432                "  Y = 0, // testing\n"
12433                "  }\n",
12434                WhitesmithsBraceStyle);
12435 
12436   verifyFormat("enum X\n"
12437                "  {\n"
12438                "  Y = 0\n"
12439                "  }\n",
12440                WhitesmithsBraceStyle);
12441   verifyFormat("enum X\n"
12442                "  {\n"
12443                "  Y = 0,\n"
12444                "  Z = 1\n"
12445                "  };\n",
12446                WhitesmithsBraceStyle);
12447 
12448   verifyFormat("@interface BSApplicationController ()\n"
12449                "  {\n"
12450                "@private\n"
12451                "  id _extraIvar;\n"
12452                "  }\n"
12453                "@end\n",
12454                WhitesmithsBraceStyle);
12455 
12456   verifyFormat("#ifdef _DEBUG\n"
12457                "int foo(int i = 0)\n"
12458                "#else\n"
12459                "int foo(int i = 5)\n"
12460                "#endif\n"
12461                "  {\n"
12462                "  return i;\n"
12463                "  }",
12464                WhitesmithsBraceStyle);
12465 
12466   verifyFormat("void foo() {}\n"
12467                "void bar()\n"
12468                "#ifdef _DEBUG\n"
12469                "  {\n"
12470                "  foo();\n"
12471                "  }\n"
12472                "#else\n"
12473                "  {\n"
12474                "  }\n"
12475                "#endif",
12476                WhitesmithsBraceStyle);
12477 
12478   verifyFormat("void foobar()\n"
12479                "  {\n"
12480                "  int i = 5;\n"
12481                "  }\n"
12482                "#ifdef _DEBUG\n"
12483                "void bar()\n"
12484                "  {\n"
12485                "  }\n"
12486                "#else\n"
12487                "void bar()\n"
12488                "  {\n"
12489                "  foobar();\n"
12490                "  }\n"
12491                "#endif",
12492                WhitesmithsBraceStyle);
12493 
12494   // This shouldn't affect ObjC blocks..
12495   verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
12496                "  // ...\n"
12497                "  int i;\n"
12498                "}];",
12499                WhitesmithsBraceStyle);
12500   verifyFormat("void (^block)(void) = ^{\n"
12501                "  // ...\n"
12502                "  int i;\n"
12503                "};",
12504                WhitesmithsBraceStyle);
12505   // .. or dict literals.
12506   verifyFormat("void f()\n"
12507                "  {\n"
12508                "  [object someMethod:@{@\"a\" : @\"b\"}];\n"
12509                "  }",
12510                WhitesmithsBraceStyle);
12511 
12512   verifyFormat("int f()\n"
12513                "  { // comment\n"
12514                "  return 42;\n"
12515                "  }",
12516                WhitesmithsBraceStyle);
12517 
12518   FormatStyle BreakBeforeBraceShortIfs = WhitesmithsBraceStyle;
12519   BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine =
12520       FormatStyle::SIS_Always;
12521   BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
12522   verifyFormat("void f(bool b)\n"
12523                "  {\n"
12524                "  if (b)\n"
12525                "    {\n"
12526                "    return;\n"
12527                "    }\n"
12528                "  }\n",
12529                BreakBeforeBraceShortIfs);
12530   verifyFormat("void f(bool b)\n"
12531                "  {\n"
12532                "  if (b) return;\n"
12533                "  }\n",
12534                BreakBeforeBraceShortIfs);
12535   verifyFormat("void f(bool b)\n"
12536                "  {\n"
12537                "  while (b)\n"
12538                "    {\n"
12539                "    return;\n"
12540                "    }\n"
12541                "  }\n",
12542                BreakBeforeBraceShortIfs);
12543 }
12544 
12545 TEST_F(FormatTest, GNUBraceBreaking) {
12546   FormatStyle GNUBraceStyle = getLLVMStyle();
12547   GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
12548   verifyFormat("namespace a\n"
12549                "{\n"
12550                "class A\n"
12551                "{\n"
12552                "  void f()\n"
12553                "  {\n"
12554                "    int a;\n"
12555                "    {\n"
12556                "      int b;\n"
12557                "    }\n"
12558                "    if (true)\n"
12559                "      {\n"
12560                "        a();\n"
12561                "        b();\n"
12562                "      }\n"
12563                "  }\n"
12564                "  void g() { return; }\n"
12565                "}\n"
12566                "} // namespace a",
12567                GNUBraceStyle);
12568 
12569   verifyFormat("void f()\n"
12570                "{\n"
12571                "  if (true)\n"
12572                "    {\n"
12573                "      a();\n"
12574                "    }\n"
12575                "  else if (false)\n"
12576                "    {\n"
12577                "      b();\n"
12578                "    }\n"
12579                "  else\n"
12580                "    {\n"
12581                "      c();\n"
12582                "    }\n"
12583                "}\n",
12584                GNUBraceStyle);
12585 
12586   verifyFormat("void f()\n"
12587                "{\n"
12588                "  for (int i = 0; i < 10; ++i)\n"
12589                "    {\n"
12590                "      a();\n"
12591                "    }\n"
12592                "  while (false)\n"
12593                "    {\n"
12594                "      b();\n"
12595                "    }\n"
12596                "  do\n"
12597                "    {\n"
12598                "      c();\n"
12599                "    }\n"
12600                "  while (false);\n"
12601                "}\n",
12602                GNUBraceStyle);
12603 
12604   verifyFormat("void f(int a)\n"
12605                "{\n"
12606                "  switch (a)\n"
12607                "    {\n"
12608                "    case 0:\n"
12609                "      break;\n"
12610                "    case 1:\n"
12611                "      {\n"
12612                "        break;\n"
12613                "      }\n"
12614                "    case 2:\n"
12615                "      {\n"
12616                "      }\n"
12617                "      break;\n"
12618                "    default:\n"
12619                "      break;\n"
12620                "    }\n"
12621                "}\n",
12622                GNUBraceStyle);
12623 
12624   verifyFormat("enum X\n"
12625                "{\n"
12626                "  Y = 0,\n"
12627                "}\n",
12628                GNUBraceStyle);
12629 
12630   verifyFormat("@interface BSApplicationController ()\n"
12631                "{\n"
12632                "@private\n"
12633                "  id _extraIvar;\n"
12634                "}\n"
12635                "@end\n",
12636                GNUBraceStyle);
12637 
12638   verifyFormat("#ifdef _DEBUG\n"
12639                "int foo(int i = 0)\n"
12640                "#else\n"
12641                "int foo(int i = 5)\n"
12642                "#endif\n"
12643                "{\n"
12644                "  return i;\n"
12645                "}",
12646                GNUBraceStyle);
12647 
12648   verifyFormat("void foo() {}\n"
12649                "void bar()\n"
12650                "#ifdef _DEBUG\n"
12651                "{\n"
12652                "  foo();\n"
12653                "}\n"
12654                "#else\n"
12655                "{\n"
12656                "}\n"
12657                "#endif",
12658                GNUBraceStyle);
12659 
12660   verifyFormat("void foobar() { int i = 5; }\n"
12661                "#ifdef _DEBUG\n"
12662                "void bar() {}\n"
12663                "#else\n"
12664                "void bar() { foobar(); }\n"
12665                "#endif",
12666                GNUBraceStyle);
12667 }
12668 
12669 TEST_F(FormatTest, WebKitBraceBreaking) {
12670   FormatStyle WebKitBraceStyle = getLLVMStyle();
12671   WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
12672   WebKitBraceStyle.FixNamespaceComments = false;
12673   verifyFormat("namespace a {\n"
12674                "class A {\n"
12675                "  void f()\n"
12676                "  {\n"
12677                "    if (true) {\n"
12678                "      a();\n"
12679                "      b();\n"
12680                "    }\n"
12681                "  }\n"
12682                "  void g() { return; }\n"
12683                "};\n"
12684                "enum E {\n"
12685                "  A,\n"
12686                "  // foo\n"
12687                "  B,\n"
12688                "  C\n"
12689                "};\n"
12690                "struct B {\n"
12691                "  int x;\n"
12692                "};\n"
12693                "}\n",
12694                WebKitBraceStyle);
12695   verifyFormat("struct S {\n"
12696                "  int Type;\n"
12697                "  union {\n"
12698                "    int x;\n"
12699                "    double y;\n"
12700                "  } Value;\n"
12701                "  class C {\n"
12702                "    MyFavoriteType Value;\n"
12703                "  } Class;\n"
12704                "};\n",
12705                WebKitBraceStyle);
12706 }
12707 
12708 TEST_F(FormatTest, CatchExceptionReferenceBinding) {
12709   verifyFormat("void f() {\n"
12710                "  try {\n"
12711                "  } catch (const Exception &e) {\n"
12712                "  }\n"
12713                "}\n",
12714                getLLVMStyle());
12715 }
12716 
12717 TEST_F(FormatTest, UnderstandsPragmas) {
12718   verifyFormat("#pragma omp reduction(| : var)");
12719   verifyFormat("#pragma omp reduction(+ : var)");
12720 
12721   EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
12722             "(including parentheses).",
12723             format("#pragma    mark   Any non-hyphenated or hyphenated string "
12724                    "(including parentheses)."));
12725 }
12726 
12727 TEST_F(FormatTest, UnderstandPragmaOption) {
12728   verifyFormat("#pragma option -C -A");
12729 
12730   EXPECT_EQ("#pragma option -C -A", format("#pragma    option   -C   -A"));
12731 }
12732 
12733 TEST_F(FormatTest, OptimizeBreakPenaltyVsExcess) {
12734   FormatStyle Style = getLLVMStyle();
12735   Style.ColumnLimit = 20;
12736 
12737   // See PR41213
12738   EXPECT_EQ("/*\n"
12739             " *\t9012345\n"
12740             " * /8901\n"
12741             " */",
12742             format("/*\n"
12743                    " *\t9012345 /8901\n"
12744                    " */",
12745                    Style));
12746   EXPECT_EQ("/*\n"
12747             " *345678\n"
12748             " *\t/8901\n"
12749             " */",
12750             format("/*\n"
12751                    " *345678\t/8901\n"
12752                    " */",
12753                    Style));
12754 
12755   verifyFormat("int a; // the\n"
12756                "       // comment",
12757                Style);
12758   EXPECT_EQ("int a; /* first line\n"
12759             "        * second\n"
12760             "        * line third\n"
12761             "        * line\n"
12762             "        */",
12763             format("int a; /* first line\n"
12764                    "        * second\n"
12765                    "        * line third\n"
12766                    "        * line\n"
12767                    "        */",
12768                    Style));
12769   EXPECT_EQ("int a; // first line\n"
12770             "       // second\n"
12771             "       // line third\n"
12772             "       // line",
12773             format("int a; // first line\n"
12774                    "       // second line\n"
12775                    "       // third line",
12776                    Style));
12777 
12778   Style.PenaltyExcessCharacter = 90;
12779   verifyFormat("int a; // the comment", Style);
12780   EXPECT_EQ("int a; // the comment\n"
12781             "       // aaa",
12782             format("int a; // the comment aaa", Style));
12783   EXPECT_EQ("int a; /* first line\n"
12784             "        * second line\n"
12785             "        * third line\n"
12786             "        */",
12787             format("int a; /* first line\n"
12788                    "        * second line\n"
12789                    "        * third line\n"
12790                    "        */",
12791                    Style));
12792   EXPECT_EQ("int a; // first line\n"
12793             "       // second line\n"
12794             "       // third line",
12795             format("int a; // first line\n"
12796                    "       // second line\n"
12797                    "       // third line",
12798                    Style));
12799   // FIXME: Investigate why this is not getting the same layout as the test
12800   // above.
12801   EXPECT_EQ("int a; /* first line\n"
12802             "        * second line\n"
12803             "        * third line\n"
12804             "        */",
12805             format("int a; /* first line second line third line"
12806                    "\n*/",
12807                    Style));
12808 
12809   EXPECT_EQ("// foo bar baz bazfoo\n"
12810             "// foo bar foo bar\n",
12811             format("// foo bar baz bazfoo\n"
12812                    "// foo bar foo           bar\n",
12813                    Style));
12814   EXPECT_EQ("// foo bar baz bazfoo\n"
12815             "// foo bar foo bar\n",
12816             format("// foo bar baz      bazfoo\n"
12817                    "// foo            bar foo bar\n",
12818                    Style));
12819 
12820   // FIXME: Optimally, we'd keep bazfoo on the first line and reflow bar to the
12821   // next one.
12822   EXPECT_EQ("// foo bar baz bazfoo\n"
12823             "// bar foo bar\n",
12824             format("// foo bar baz      bazfoo bar\n"
12825                    "// foo            bar\n",
12826                    Style));
12827 
12828   EXPECT_EQ("// foo bar baz bazfoo\n"
12829             "// foo bar baz bazfoo\n"
12830             "// bar foo bar\n",
12831             format("// foo bar baz      bazfoo\n"
12832                    "// foo bar baz      bazfoo bar\n"
12833                    "// foo bar\n",
12834                    Style));
12835 
12836   EXPECT_EQ("// foo bar baz bazfoo\n"
12837             "// foo bar baz bazfoo\n"
12838             "// bar foo bar\n",
12839             format("// foo bar baz      bazfoo\n"
12840                    "// foo bar baz      bazfoo bar\n"
12841                    "// foo           bar\n",
12842                    Style));
12843 
12844   // Make sure we do not keep protruding characters if strict mode reflow is
12845   // cheaper than keeping protruding characters.
12846   Style.ColumnLimit = 21;
12847   EXPECT_EQ(
12848       "// foo foo foo foo\n"
12849       "// foo foo foo foo\n"
12850       "// foo foo foo foo\n",
12851       format("// foo foo foo foo foo foo foo foo foo foo foo foo\n", Style));
12852 
12853   EXPECT_EQ("int a = /* long block\n"
12854             "           comment */\n"
12855             "    42;",
12856             format("int a = /* long block comment */ 42;", Style));
12857 }
12858 
12859 #define EXPECT_ALL_STYLES_EQUAL(Styles)                                        \
12860   for (size_t i = 1; i < Styles.size(); ++i)                                   \
12861   EXPECT_EQ(Styles[0], Styles[i])                                              \
12862       << "Style #" << i << " of " << Styles.size() << " differs from Style #0"
12863 
12864 TEST_F(FormatTest, GetsPredefinedStyleByName) {
12865   SmallVector<FormatStyle, 3> Styles;
12866   Styles.resize(3);
12867 
12868   Styles[0] = getLLVMStyle();
12869   EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
12870   EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
12871   EXPECT_ALL_STYLES_EQUAL(Styles);
12872 
12873   Styles[0] = getGoogleStyle();
12874   EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
12875   EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
12876   EXPECT_ALL_STYLES_EQUAL(Styles);
12877 
12878   Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
12879   EXPECT_TRUE(
12880       getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
12881   EXPECT_TRUE(
12882       getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
12883   EXPECT_ALL_STYLES_EQUAL(Styles);
12884 
12885   Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
12886   EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
12887   EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
12888   EXPECT_ALL_STYLES_EQUAL(Styles);
12889 
12890   Styles[0] = getMozillaStyle();
12891   EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
12892   EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
12893   EXPECT_ALL_STYLES_EQUAL(Styles);
12894 
12895   Styles[0] = getWebKitStyle();
12896   EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
12897   EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
12898   EXPECT_ALL_STYLES_EQUAL(Styles);
12899 
12900   Styles[0] = getGNUStyle();
12901   EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
12902   EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
12903   EXPECT_ALL_STYLES_EQUAL(Styles);
12904 
12905   EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
12906 }
12907 
12908 TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
12909   SmallVector<FormatStyle, 8> Styles;
12910   Styles.resize(2);
12911 
12912   Styles[0] = getGoogleStyle();
12913   Styles[1] = getLLVMStyle();
12914   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
12915   EXPECT_ALL_STYLES_EQUAL(Styles);
12916 
12917   Styles.resize(5);
12918   Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
12919   Styles[1] = getLLVMStyle();
12920   Styles[1].Language = FormatStyle::LK_JavaScript;
12921   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
12922 
12923   Styles[2] = getLLVMStyle();
12924   Styles[2].Language = FormatStyle::LK_JavaScript;
12925   EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
12926                                   "BasedOnStyle: Google",
12927                                   &Styles[2])
12928                    .value());
12929 
12930   Styles[3] = getLLVMStyle();
12931   Styles[3].Language = FormatStyle::LK_JavaScript;
12932   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
12933                                   "Language: JavaScript",
12934                                   &Styles[3])
12935                    .value());
12936 
12937   Styles[4] = getLLVMStyle();
12938   Styles[4].Language = FormatStyle::LK_JavaScript;
12939   EXPECT_EQ(0, parseConfiguration("---\n"
12940                                   "BasedOnStyle: LLVM\n"
12941                                   "IndentWidth: 123\n"
12942                                   "---\n"
12943                                   "BasedOnStyle: Google\n"
12944                                   "Language: JavaScript",
12945                                   &Styles[4])
12946                    .value());
12947   EXPECT_ALL_STYLES_EQUAL(Styles);
12948 }
12949 
12950 #define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME)                             \
12951   Style.FIELD = false;                                                         \
12952   EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value());      \
12953   EXPECT_TRUE(Style.FIELD);                                                    \
12954   EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value());     \
12955   EXPECT_FALSE(Style.FIELD);
12956 
12957 #define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
12958 
12959 #define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME)              \
12960   Style.STRUCT.FIELD = false;                                                  \
12961   EXPECT_EQ(0,                                                                 \
12962             parseConfiguration(#STRUCT ":\n  " CONFIG_NAME ": true", &Style)   \
12963                 .value());                                                     \
12964   EXPECT_TRUE(Style.STRUCT.FIELD);                                             \
12965   EXPECT_EQ(0,                                                                 \
12966             parseConfiguration(#STRUCT ":\n  " CONFIG_NAME ": false", &Style)  \
12967                 .value());                                                     \
12968   EXPECT_FALSE(Style.STRUCT.FIELD);
12969 
12970 #define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD)                                 \
12971   CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
12972 
12973 #define CHECK_PARSE(TEXT, FIELD, VALUE)                                        \
12974   EXPECT_NE(VALUE, Style.FIELD);                                               \
12975   EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value());                      \
12976   EXPECT_EQ(VALUE, Style.FIELD)
12977 
12978 TEST_F(FormatTest, ParsesConfigurationBools) {
12979   FormatStyle Style = {};
12980   Style.Language = FormatStyle::LK_Cpp;
12981   CHECK_PARSE_BOOL(AlignOperands);
12982   CHECK_PARSE_BOOL(AlignTrailingComments);
12983   CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
12984   CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
12985   CHECK_PARSE_BOOL(AlignConsecutiveMacros);
12986   CHECK_PARSE_BOOL(AllowAllArgumentsOnNextLine);
12987   CHECK_PARSE_BOOL(AllowAllConstructorInitializersOnNextLine);
12988   CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
12989   CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
12990   CHECK_PARSE_BOOL(AllowShortEnumsOnASingleLine);
12991   CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
12992   CHECK_PARSE_BOOL(BinPackArguments);
12993   CHECK_PARSE_BOOL(BinPackParameters);
12994   CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
12995   CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
12996   CHECK_PARSE_BOOL(BreakStringLiterals);
12997   CHECK_PARSE_BOOL(CompactNamespaces);
12998   CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
12999   CHECK_PARSE_BOOL(DeriveLineEnding);
13000   CHECK_PARSE_BOOL(DerivePointerAlignment);
13001   CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
13002   CHECK_PARSE_BOOL(DisableFormat);
13003   CHECK_PARSE_BOOL(IndentCaseLabels);
13004   CHECK_PARSE_BOOL(IndentCaseBlocks);
13005   CHECK_PARSE_BOOL(IndentGotoLabels);
13006   CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
13007   CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
13008   CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
13009   CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
13010   CHECK_PARSE_BOOL(Cpp11BracedListStyle);
13011   CHECK_PARSE_BOOL(ReflowComments);
13012   CHECK_PARSE_BOOL(SortIncludes);
13013   CHECK_PARSE_BOOL(SortUsingDeclarations);
13014   CHECK_PARSE_BOOL(SpacesInParentheses);
13015   CHECK_PARSE_BOOL(SpacesInSquareBrackets);
13016   CHECK_PARSE_BOOL(SpacesInAngles);
13017   CHECK_PARSE_BOOL(SpacesInConditionalStatement);
13018   CHECK_PARSE_BOOL(SpaceInEmptyBlock);
13019   CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
13020   CHECK_PARSE_BOOL(SpacesInContainerLiterals);
13021   CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
13022   CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
13023   CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
13024   CHECK_PARSE_BOOL(SpaceAfterLogicalNot);
13025   CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
13026   CHECK_PARSE_BOOL(SpaceBeforeCpp11BracedList);
13027   CHECK_PARSE_BOOL(SpaceBeforeCtorInitializerColon);
13028   CHECK_PARSE_BOOL(SpaceBeforeInheritanceColon);
13029   CHECK_PARSE_BOOL(SpaceBeforeRangeBasedForLoopColon);
13030   CHECK_PARSE_BOOL(SpaceBeforeSquareBrackets);
13031   CHECK_PARSE_BOOL(UseCRLF);
13032 
13033   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterCaseLabel);
13034   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
13035   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
13036   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
13037   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
13038   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
13039   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
13040   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
13041   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterExternBlock);
13042   CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
13043   CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
13044   CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeLambdaBody);
13045   CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
13046   CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunction);
13047   CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyRecord);
13048   CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyNamespace);
13049 }
13050 
13051 #undef CHECK_PARSE_BOOL
13052 
13053 TEST_F(FormatTest, ParsesConfiguration) {
13054   FormatStyle Style = {};
13055   Style.Language = FormatStyle::LK_Cpp;
13056   CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
13057   CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
13058               ConstructorInitializerIndentWidth, 1234u);
13059   CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
13060   CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
13061   CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
13062   CHECK_PARSE("PenaltyBreakAssignment: 1234", PenaltyBreakAssignment, 1234u);
13063   CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
13064               PenaltyBreakBeforeFirstCallParameter, 1234u);
13065   CHECK_PARSE("PenaltyBreakTemplateDeclaration: 1234",
13066               PenaltyBreakTemplateDeclaration, 1234u);
13067   CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
13068   CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
13069               PenaltyReturnTypeOnItsOwnLine, 1234u);
13070   CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
13071               SpacesBeforeTrailingComments, 1234u);
13072   CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
13073   CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
13074   CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
13075 
13076   Style.PointerAlignment = FormatStyle::PAS_Middle;
13077   CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
13078               FormatStyle::PAS_Left);
13079   CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
13080               FormatStyle::PAS_Right);
13081   CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
13082               FormatStyle::PAS_Middle);
13083   // For backward compatibility:
13084   CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
13085               FormatStyle::PAS_Left);
13086   CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
13087               FormatStyle::PAS_Right);
13088   CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
13089               FormatStyle::PAS_Middle);
13090 
13091   Style.Standard = FormatStyle::LS_Auto;
13092   CHECK_PARSE("Standard: c++03", Standard, FormatStyle::LS_Cpp03);
13093   CHECK_PARSE("Standard: c++11", Standard, FormatStyle::LS_Cpp11);
13094   CHECK_PARSE("Standard: c++14", Standard, FormatStyle::LS_Cpp14);
13095   CHECK_PARSE("Standard: c++17", Standard, FormatStyle::LS_Cpp17);
13096   CHECK_PARSE("Standard: c++20", Standard, FormatStyle::LS_Cpp20);
13097   CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
13098   CHECK_PARSE("Standard: Latest", Standard, FormatStyle::LS_Latest);
13099   // Legacy aliases:
13100   CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
13101   CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Latest);
13102   CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
13103   CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
13104 
13105   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
13106   CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
13107               BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
13108   CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
13109               FormatStyle::BOS_None);
13110   CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
13111               FormatStyle::BOS_All);
13112   // For backward compatibility:
13113   CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
13114               FormatStyle::BOS_None);
13115   CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
13116               FormatStyle::BOS_All);
13117 
13118   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
13119   CHECK_PARSE("BreakConstructorInitializers: BeforeComma",
13120               BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
13121   CHECK_PARSE("BreakConstructorInitializers: AfterColon",
13122               BreakConstructorInitializers, FormatStyle::BCIS_AfterColon);
13123   CHECK_PARSE("BreakConstructorInitializers: BeforeColon",
13124               BreakConstructorInitializers, FormatStyle::BCIS_BeforeColon);
13125   // For backward compatibility:
13126   CHECK_PARSE("BreakConstructorInitializersBeforeComma: true",
13127               BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
13128 
13129   Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
13130   CHECK_PARSE("BreakInheritanceList: BeforeComma", BreakInheritanceList,
13131               FormatStyle::BILS_BeforeComma);
13132   CHECK_PARSE("BreakInheritanceList: AfterColon", BreakInheritanceList,
13133               FormatStyle::BILS_AfterColon);
13134   CHECK_PARSE("BreakInheritanceList: BeforeColon", BreakInheritanceList,
13135               FormatStyle::BILS_BeforeColon);
13136   // For backward compatibility:
13137   CHECK_PARSE("BreakBeforeInheritanceComma: true", BreakInheritanceList,
13138               FormatStyle::BILS_BeforeComma);
13139 
13140   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
13141   CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
13142               FormatStyle::BAS_Align);
13143   CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
13144               FormatStyle::BAS_DontAlign);
13145   CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
13146               FormatStyle::BAS_AlwaysBreak);
13147   // For backward compatibility:
13148   CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
13149               FormatStyle::BAS_DontAlign);
13150   CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
13151               FormatStyle::BAS_Align);
13152 
13153   Style.AlignEscapedNewlines = FormatStyle::ENAS_Left;
13154   CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines,
13155               FormatStyle::ENAS_DontAlign);
13156   CHECK_PARSE("AlignEscapedNewlines: Left", AlignEscapedNewlines,
13157               FormatStyle::ENAS_Left);
13158   CHECK_PARSE("AlignEscapedNewlines: Right", AlignEscapedNewlines,
13159               FormatStyle::ENAS_Right);
13160   // For backward compatibility:
13161   CHECK_PARSE("AlignEscapedNewlinesLeft: true", AlignEscapedNewlines,
13162               FormatStyle::ENAS_Left);
13163   CHECK_PARSE("AlignEscapedNewlinesLeft: false", AlignEscapedNewlines,
13164               FormatStyle::ENAS_Right);
13165 
13166   Style.UseTab = FormatStyle::UT_ForIndentation;
13167   CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
13168   CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
13169   CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
13170   CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
13171               FormatStyle::UT_ForContinuationAndIndentation);
13172   CHECK_PARSE("UseTab: AlignWithSpaces", UseTab,
13173               FormatStyle::UT_AlignWithSpaces);
13174   // For backward compatibility:
13175   CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
13176   CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
13177 
13178   Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Empty;
13179   CHECK_PARSE("AllowShortBlocksOnASingleLine: Never",
13180               AllowShortBlocksOnASingleLine, FormatStyle::SBS_Never);
13181   CHECK_PARSE("AllowShortBlocksOnASingleLine: Empty",
13182               AllowShortBlocksOnASingleLine, FormatStyle::SBS_Empty);
13183   CHECK_PARSE("AllowShortBlocksOnASingleLine: Always",
13184               AllowShortBlocksOnASingleLine, FormatStyle::SBS_Always);
13185   // For backward compatibility:
13186   CHECK_PARSE("AllowShortBlocksOnASingleLine: false",
13187               AllowShortBlocksOnASingleLine, FormatStyle::SBS_Never);
13188   CHECK_PARSE("AllowShortBlocksOnASingleLine: true",
13189               AllowShortBlocksOnASingleLine, FormatStyle::SBS_Always);
13190 
13191   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
13192   CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
13193               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
13194   CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
13195               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
13196   CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
13197               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
13198   CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
13199               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
13200   // For backward compatibility:
13201   CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
13202               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
13203   CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
13204               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
13205 
13206   Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
13207   CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
13208               FormatStyle::SBPO_Never);
13209   CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
13210               FormatStyle::SBPO_Always);
13211   CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
13212               FormatStyle::SBPO_ControlStatements);
13213   CHECK_PARSE("SpaceBeforeParens: NonEmptyParentheses", SpaceBeforeParens,
13214               FormatStyle::SBPO_NonEmptyParentheses);
13215   // For backward compatibility:
13216   CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
13217               FormatStyle::SBPO_Never);
13218   CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
13219               FormatStyle::SBPO_ControlStatements);
13220 
13221   Style.ColumnLimit = 123;
13222   FormatStyle BaseStyle = getLLVMStyle();
13223   CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
13224   CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
13225 
13226   Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
13227   CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
13228               FormatStyle::BS_Attach);
13229   CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
13230               FormatStyle::BS_Linux);
13231   CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
13232               FormatStyle::BS_Mozilla);
13233   CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
13234               FormatStyle::BS_Stroustrup);
13235   CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
13236               FormatStyle::BS_Allman);
13237   CHECK_PARSE("BreakBeforeBraces: Whitesmiths", BreakBeforeBraces,
13238               FormatStyle::BS_Whitesmiths);
13239   CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
13240   CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
13241               FormatStyle::BS_WebKit);
13242   CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
13243               FormatStyle::BS_Custom);
13244 
13245   Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Never;
13246   CHECK_PARSE("BraceWrapping:\n"
13247               "  AfterControlStatement: MultiLine",
13248               BraceWrapping.AfterControlStatement,
13249               FormatStyle::BWACS_MultiLine);
13250   CHECK_PARSE("BraceWrapping:\n"
13251               "  AfterControlStatement: Always",
13252               BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Always);
13253   CHECK_PARSE("BraceWrapping:\n"
13254               "  AfterControlStatement: Never",
13255               BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Never);
13256   // For backward compatibility:
13257   CHECK_PARSE("BraceWrapping:\n"
13258               "  AfterControlStatement: true",
13259               BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Always);
13260   CHECK_PARSE("BraceWrapping:\n"
13261               "  AfterControlStatement: false",
13262               BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Never);
13263 
13264   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
13265   CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
13266               FormatStyle::RTBS_None);
13267   CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
13268               FormatStyle::RTBS_All);
13269   CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
13270               AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
13271   CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
13272               AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
13273   CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
13274               AlwaysBreakAfterReturnType,
13275               FormatStyle::RTBS_TopLevelDefinitions);
13276 
13277   Style.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes;
13278   CHECK_PARSE("AlwaysBreakTemplateDeclarations: No",
13279               AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_No);
13280   CHECK_PARSE("AlwaysBreakTemplateDeclarations: MultiLine",
13281               AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_MultiLine);
13282   CHECK_PARSE("AlwaysBreakTemplateDeclarations: Yes",
13283               AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_Yes);
13284   CHECK_PARSE("AlwaysBreakTemplateDeclarations: false",
13285               AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_MultiLine);
13286   CHECK_PARSE("AlwaysBreakTemplateDeclarations: true",
13287               AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_Yes);
13288 
13289   Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
13290   CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
13291               AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
13292   CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
13293               AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
13294   CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
13295               AlwaysBreakAfterDefinitionReturnType,
13296               FormatStyle::DRTBS_TopLevel);
13297 
13298   Style.NamespaceIndentation = FormatStyle::NI_All;
13299   CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
13300               FormatStyle::NI_None);
13301   CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
13302               FormatStyle::NI_Inner);
13303   CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
13304               FormatStyle::NI_All);
13305 
13306   Style.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_Always;
13307   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Never",
13308               AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never);
13309   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: WithoutElse",
13310               AllowShortIfStatementsOnASingleLine,
13311               FormatStyle::SIS_WithoutElse);
13312   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Always",
13313               AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Always);
13314   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: false",
13315               AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never);
13316   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: true",
13317               AllowShortIfStatementsOnASingleLine,
13318               FormatStyle::SIS_WithoutElse);
13319 
13320   // FIXME: This is required because parsing a configuration simply overwrites
13321   // the first N elements of the list instead of resetting it.
13322   Style.ForEachMacros.clear();
13323   std::vector<std::string> BoostForeach;
13324   BoostForeach.push_back("BOOST_FOREACH");
13325   CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
13326   std::vector<std::string> BoostAndQForeach;
13327   BoostAndQForeach.push_back("BOOST_FOREACH");
13328   BoostAndQForeach.push_back("Q_FOREACH");
13329   CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
13330               BoostAndQForeach);
13331 
13332   Style.StatementMacros.clear();
13333   CHECK_PARSE("StatementMacros: [QUNUSED]", StatementMacros,
13334               std::vector<std::string>{"QUNUSED"});
13335   CHECK_PARSE("StatementMacros: [QUNUSED, QT_REQUIRE_VERSION]", StatementMacros,
13336               std::vector<std::string>({"QUNUSED", "QT_REQUIRE_VERSION"}));
13337 
13338   Style.NamespaceMacros.clear();
13339   CHECK_PARSE("NamespaceMacros: [TESTSUITE]", NamespaceMacros,
13340               std::vector<std::string>{"TESTSUITE"});
13341   CHECK_PARSE("NamespaceMacros: [TESTSUITE, SUITE]", NamespaceMacros,
13342               std::vector<std::string>({"TESTSUITE", "SUITE"}));
13343 
13344   Style.IncludeStyle.IncludeCategories.clear();
13345   std::vector<tooling::IncludeStyle::IncludeCategory> ExpectedCategories = {
13346       {"abc/.*", 2, 0}, {".*", 1, 0}};
13347   CHECK_PARSE("IncludeCategories:\n"
13348               "  - Regex: abc/.*\n"
13349               "    Priority: 2\n"
13350               "  - Regex: .*\n"
13351               "    Priority: 1",
13352               IncludeStyle.IncludeCategories, ExpectedCategories);
13353   CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeStyle.IncludeIsMainRegex,
13354               "abc$");
13355   CHECK_PARSE("IncludeIsMainSourceRegex: 'abc$'",
13356               IncludeStyle.IncludeIsMainSourceRegex, "abc$");
13357 
13358   Style.RawStringFormats.clear();
13359   std::vector<FormatStyle::RawStringFormat> ExpectedRawStringFormats = {
13360       {
13361           FormatStyle::LK_TextProto,
13362           {"pb", "proto"},
13363           {"PARSE_TEXT_PROTO"},
13364           /*CanonicalDelimiter=*/"",
13365           "llvm",
13366       },
13367       {
13368           FormatStyle::LK_Cpp,
13369           {"cc", "cpp"},
13370           {"C_CODEBLOCK", "CPPEVAL"},
13371           /*CanonicalDelimiter=*/"cc",
13372           /*BasedOnStyle=*/"",
13373       },
13374   };
13375 
13376   CHECK_PARSE("RawStringFormats:\n"
13377               "  - Language: TextProto\n"
13378               "    Delimiters:\n"
13379               "      - 'pb'\n"
13380               "      - 'proto'\n"
13381               "    EnclosingFunctions:\n"
13382               "      - 'PARSE_TEXT_PROTO'\n"
13383               "    BasedOnStyle: llvm\n"
13384               "  - Language: Cpp\n"
13385               "    Delimiters:\n"
13386               "      - 'cc'\n"
13387               "      - 'cpp'\n"
13388               "    EnclosingFunctions:\n"
13389               "      - 'C_CODEBLOCK'\n"
13390               "      - 'CPPEVAL'\n"
13391               "    CanonicalDelimiter: 'cc'",
13392               RawStringFormats, ExpectedRawStringFormats);
13393 }
13394 
13395 TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
13396   FormatStyle Style = {};
13397   Style.Language = FormatStyle::LK_Cpp;
13398   CHECK_PARSE("Language: Cpp\n"
13399               "IndentWidth: 12",
13400               IndentWidth, 12u);
13401   EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
13402                                "IndentWidth: 34",
13403                                &Style),
13404             ParseError::Unsuitable);
13405   FormatStyle BinPackedTCS = {};
13406   BinPackedTCS.Language = FormatStyle::LK_JavaScript;
13407   EXPECT_EQ(parseConfiguration("BinPackArguments: true\n"
13408                                "InsertTrailingCommas: Wrapped",
13409                                &BinPackedTCS),
13410             ParseError::BinPackTrailingCommaConflict);
13411   EXPECT_EQ(12u, Style.IndentWidth);
13412   CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
13413   EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
13414 
13415   Style.Language = FormatStyle::LK_JavaScript;
13416   CHECK_PARSE("Language: JavaScript\n"
13417               "IndentWidth: 12",
13418               IndentWidth, 12u);
13419   CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
13420   EXPECT_EQ(parseConfiguration("Language: Cpp\n"
13421                                "IndentWidth: 34",
13422                                &Style),
13423             ParseError::Unsuitable);
13424   EXPECT_EQ(23u, Style.IndentWidth);
13425   CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
13426   EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
13427 
13428   CHECK_PARSE("BasedOnStyle: LLVM\n"
13429               "IndentWidth: 67",
13430               IndentWidth, 67u);
13431 
13432   CHECK_PARSE("---\n"
13433               "Language: JavaScript\n"
13434               "IndentWidth: 12\n"
13435               "---\n"
13436               "Language: Cpp\n"
13437               "IndentWidth: 34\n"
13438               "...\n",
13439               IndentWidth, 12u);
13440 
13441   Style.Language = FormatStyle::LK_Cpp;
13442   CHECK_PARSE("---\n"
13443               "Language: JavaScript\n"
13444               "IndentWidth: 12\n"
13445               "---\n"
13446               "Language: Cpp\n"
13447               "IndentWidth: 34\n"
13448               "...\n",
13449               IndentWidth, 34u);
13450   CHECK_PARSE("---\n"
13451               "IndentWidth: 78\n"
13452               "---\n"
13453               "Language: JavaScript\n"
13454               "IndentWidth: 56\n"
13455               "...\n",
13456               IndentWidth, 78u);
13457 
13458   Style.ColumnLimit = 123;
13459   Style.IndentWidth = 234;
13460   Style.BreakBeforeBraces = FormatStyle::BS_Linux;
13461   Style.TabWidth = 345;
13462   EXPECT_FALSE(parseConfiguration("---\n"
13463                                   "IndentWidth: 456\n"
13464                                   "BreakBeforeBraces: Allman\n"
13465                                   "---\n"
13466                                   "Language: JavaScript\n"
13467                                   "IndentWidth: 111\n"
13468                                   "TabWidth: 111\n"
13469                                   "---\n"
13470                                   "Language: Cpp\n"
13471                                   "BreakBeforeBraces: Stroustrup\n"
13472                                   "TabWidth: 789\n"
13473                                   "...\n",
13474                                   &Style));
13475   EXPECT_EQ(123u, Style.ColumnLimit);
13476   EXPECT_EQ(456u, Style.IndentWidth);
13477   EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
13478   EXPECT_EQ(789u, Style.TabWidth);
13479 
13480   EXPECT_EQ(parseConfiguration("---\n"
13481                                "Language: JavaScript\n"
13482                                "IndentWidth: 56\n"
13483                                "---\n"
13484                                "IndentWidth: 78\n"
13485                                "...\n",
13486                                &Style),
13487             ParseError::Error);
13488   EXPECT_EQ(parseConfiguration("---\n"
13489                                "Language: JavaScript\n"
13490                                "IndentWidth: 56\n"
13491                                "---\n"
13492                                "Language: JavaScript\n"
13493                                "IndentWidth: 78\n"
13494                                "...\n",
13495                                &Style),
13496             ParseError::Error);
13497 
13498   EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
13499 }
13500 
13501 #undef CHECK_PARSE
13502 
13503 TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
13504   FormatStyle Style = {};
13505   Style.Language = FormatStyle::LK_JavaScript;
13506   Style.BreakBeforeTernaryOperators = true;
13507   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
13508   EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
13509 
13510   Style.BreakBeforeTernaryOperators = true;
13511   EXPECT_EQ(0, parseConfiguration("---\n"
13512                                   "BasedOnStyle: Google\n"
13513                                   "---\n"
13514                                   "Language: JavaScript\n"
13515                                   "IndentWidth: 76\n"
13516                                   "...\n",
13517                                   &Style)
13518                    .value());
13519   EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
13520   EXPECT_EQ(76u, Style.IndentWidth);
13521   EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
13522 }
13523 
13524 TEST_F(FormatTest, ConfigurationRoundTripTest) {
13525   FormatStyle Style = getLLVMStyle();
13526   std::string YAML = configurationAsText(Style);
13527   FormatStyle ParsedStyle = {};
13528   ParsedStyle.Language = FormatStyle::LK_Cpp;
13529   EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
13530   EXPECT_EQ(Style, ParsedStyle);
13531 }
13532 
13533 TEST_F(FormatTest, WorksFor8bitEncodings) {
13534   EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
13535             "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
13536             "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
13537             "\"\xef\xee\xf0\xf3...\"",
13538             format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
13539                    "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
13540                    "\xef\xee\xf0\xf3...\"",
13541                    getLLVMStyleWithColumns(12)));
13542 }
13543 
13544 TEST_F(FormatTest, HandlesUTF8BOM) {
13545   EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
13546   EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
13547             format("\xef\xbb\xbf#include <iostream>"));
13548   EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
13549             format("\xef\xbb\xbf\n#include <iostream>"));
13550 }
13551 
13552 // FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
13553 #if !defined(_MSC_VER)
13554 
13555 TEST_F(FormatTest, CountsUTF8CharactersProperly) {
13556   verifyFormat("\"Однажды в студёную зимнюю пору...\"",
13557                getLLVMStyleWithColumns(35));
13558   verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
13559                getLLVMStyleWithColumns(31));
13560   verifyFormat("// Однажды в студёную зимнюю пору...",
13561                getLLVMStyleWithColumns(36));
13562   verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
13563   verifyFormat("/* Однажды в студёную зимнюю пору... */",
13564                getLLVMStyleWithColumns(39));
13565   verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
13566                getLLVMStyleWithColumns(35));
13567 }
13568 
13569 TEST_F(FormatTest, SplitsUTF8Strings) {
13570   // Non-printable characters' width is currently considered to be the length in
13571   // bytes in UTF8. The characters can be displayed in very different manner
13572   // (zero-width, single width with a substitution glyph, expanded to their code
13573   // (e.g. "<8d>"), so there's no single correct way to handle them.
13574   EXPECT_EQ("\"aaaaÄ\"\n"
13575             "\"\xc2\x8d\";",
13576             format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
13577   EXPECT_EQ("\"aaaaaaaÄ\"\n"
13578             "\"\xc2\x8d\";",
13579             format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
13580   EXPECT_EQ("\"Однажды, в \"\n"
13581             "\"студёную \"\n"
13582             "\"зимнюю \"\n"
13583             "\"пору,\"",
13584             format("\"Однажды, в студёную зимнюю пору,\"",
13585                    getLLVMStyleWithColumns(13)));
13586   EXPECT_EQ(
13587       "\"一 二 三 \"\n"
13588       "\"四 五六 \"\n"
13589       "\"七 八 九 \"\n"
13590       "\"十\"",
13591       format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
13592   EXPECT_EQ("\"一\t\"\n"
13593             "\"二 \t\"\n"
13594             "\"三 四 \"\n"
13595             "\"五\t\"\n"
13596             "\"六 \t\"\n"
13597             "\"七 \"\n"
13598             "\"八九十\tqq\"",
13599             format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
13600                    getLLVMStyleWithColumns(11)));
13601 
13602   // UTF8 character in an escape sequence.
13603   EXPECT_EQ("\"aaaaaa\"\n"
13604             "\"\\\xC2\x8D\"",
13605             format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
13606 }
13607 
13608 TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
13609   EXPECT_EQ("const char *sssss =\n"
13610             "    \"一二三四五六七八\\\n"
13611             " 九 十\";",
13612             format("const char *sssss = \"一二三四五六七八\\\n"
13613                    " 九 十\";",
13614                    getLLVMStyleWithColumns(30)));
13615 }
13616 
13617 TEST_F(FormatTest, SplitsUTF8LineComments) {
13618   EXPECT_EQ("// aaaaÄ\xc2\x8d",
13619             format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
13620   EXPECT_EQ("// Я из лесу\n"
13621             "// вышел; был\n"
13622             "// сильный\n"
13623             "// мороз.",
13624             format("// Я из лесу вышел; был сильный мороз.",
13625                    getLLVMStyleWithColumns(13)));
13626   EXPECT_EQ("// 一二三\n"
13627             "// 四五六七\n"
13628             "// 八  九\n"
13629             "// 十",
13630             format("// 一二三 四五六七 八  九 十", getLLVMStyleWithColumns(9)));
13631 }
13632 
13633 TEST_F(FormatTest, SplitsUTF8BlockComments) {
13634   EXPECT_EQ("/* Гляжу,\n"
13635             " * поднимается\n"
13636             " * медленно в\n"
13637             " * гору\n"
13638             " * Лошадка,\n"
13639             " * везущая\n"
13640             " * хворосту\n"
13641             " * воз. */",
13642             format("/* Гляжу, поднимается медленно в гору\n"
13643                    " * Лошадка, везущая хворосту воз. */",
13644                    getLLVMStyleWithColumns(13)));
13645   EXPECT_EQ(
13646       "/* 一二三\n"
13647       " * 四五六七\n"
13648       " * 八  九\n"
13649       " * 十  */",
13650       format("/* 一二三 四五六七 八  九 十  */", getLLVMStyleWithColumns(9)));
13651   EXPECT_EQ("/* �������� ��������\n"
13652             " * ��������\n"
13653             " * ������-�� */",
13654             format("/* �������� �������� �������� ������-�� */", getLLVMStyleWithColumns(12)));
13655 }
13656 
13657 #endif // _MSC_VER
13658 
13659 TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
13660   FormatStyle Style = getLLVMStyle();
13661 
13662   Style.ConstructorInitializerIndentWidth = 4;
13663   verifyFormat(
13664       "SomeClass::Constructor()\n"
13665       "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
13666       "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
13667       Style);
13668 
13669   Style.ConstructorInitializerIndentWidth = 2;
13670   verifyFormat(
13671       "SomeClass::Constructor()\n"
13672       "  : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
13673       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
13674       Style);
13675 
13676   Style.ConstructorInitializerIndentWidth = 0;
13677   verifyFormat(
13678       "SomeClass::Constructor()\n"
13679       ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
13680       "  aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
13681       Style);
13682   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
13683   verifyFormat(
13684       "SomeLongTemplateVariableName<\n"
13685       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
13686       Style);
13687   verifyFormat("bool smaller = 1 < "
13688                "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
13689                "                       "
13690                "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
13691                Style);
13692 
13693   Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
13694   verifyFormat("SomeClass::Constructor() :\n"
13695                "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa),\n"
13696                "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa) {}",
13697                Style);
13698 }
13699 
13700 TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
13701   FormatStyle Style = getLLVMStyle();
13702   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
13703   Style.ConstructorInitializerIndentWidth = 4;
13704   verifyFormat("SomeClass::Constructor()\n"
13705                "    : a(a)\n"
13706                "    , b(b)\n"
13707                "    , c(c) {}",
13708                Style);
13709   verifyFormat("SomeClass::Constructor()\n"
13710                "    : a(a) {}",
13711                Style);
13712 
13713   Style.ColumnLimit = 0;
13714   verifyFormat("SomeClass::Constructor()\n"
13715                "    : a(a) {}",
13716                Style);
13717   verifyFormat("SomeClass::Constructor() noexcept\n"
13718                "    : a(a) {}",
13719                Style);
13720   verifyFormat("SomeClass::Constructor()\n"
13721                "    : a(a)\n"
13722                "    , b(b)\n"
13723                "    , c(c) {}",
13724                Style);
13725   verifyFormat("SomeClass::Constructor()\n"
13726                "    : a(a) {\n"
13727                "  foo();\n"
13728                "  bar();\n"
13729                "}",
13730                Style);
13731 
13732   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
13733   verifyFormat("SomeClass::Constructor()\n"
13734                "    : a(a)\n"
13735                "    , b(b)\n"
13736                "    , c(c) {\n}",
13737                Style);
13738   verifyFormat("SomeClass::Constructor()\n"
13739                "    : a(a) {\n}",
13740                Style);
13741 
13742   Style.ColumnLimit = 80;
13743   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
13744   Style.ConstructorInitializerIndentWidth = 2;
13745   verifyFormat("SomeClass::Constructor()\n"
13746                "  : a(a)\n"
13747                "  , b(b)\n"
13748                "  , c(c) {}",
13749                Style);
13750 
13751   Style.ConstructorInitializerIndentWidth = 0;
13752   verifyFormat("SomeClass::Constructor()\n"
13753                ": a(a)\n"
13754                ", b(b)\n"
13755                ", c(c) {}",
13756                Style);
13757 
13758   Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
13759   Style.ConstructorInitializerIndentWidth = 4;
13760   verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
13761   verifyFormat(
13762       "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
13763       Style);
13764   verifyFormat(
13765       "SomeClass::Constructor()\n"
13766       "    : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
13767       Style);
13768   Style.ConstructorInitializerIndentWidth = 4;
13769   Style.ColumnLimit = 60;
13770   verifyFormat("SomeClass::Constructor()\n"
13771                "    : aaaaaaaa(aaaaaaaa)\n"
13772                "    , aaaaaaaa(aaaaaaaa)\n"
13773                "    , aaaaaaaa(aaaaaaaa) {}",
13774                Style);
13775 }
13776 
13777 TEST_F(FormatTest, Destructors) {
13778   verifyFormat("void F(int &i) { i.~int(); }");
13779   verifyFormat("void F(int &i) { i->~int(); }");
13780 }
13781 
13782 TEST_F(FormatTest, FormatsWithWebKitStyle) {
13783   FormatStyle Style = getWebKitStyle();
13784 
13785   // Don't indent in outer namespaces.
13786   verifyFormat("namespace outer {\n"
13787                "int i;\n"
13788                "namespace inner {\n"
13789                "    int i;\n"
13790                "} // namespace inner\n"
13791                "} // namespace outer\n"
13792                "namespace other_outer {\n"
13793                "int i;\n"
13794                "}",
13795                Style);
13796 
13797   // Don't indent case labels.
13798   verifyFormat("switch (variable) {\n"
13799                "case 1:\n"
13800                "case 2:\n"
13801                "    doSomething();\n"
13802                "    break;\n"
13803                "default:\n"
13804                "    ++variable;\n"
13805                "}",
13806                Style);
13807 
13808   // Wrap before binary operators.
13809   EXPECT_EQ("void f()\n"
13810             "{\n"
13811             "    if (aaaaaaaaaaaaaaaa\n"
13812             "        && bbbbbbbbbbbbbbbbbbbbbbbb\n"
13813             "        && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
13814             "        return;\n"
13815             "}",
13816             format("void f() {\n"
13817                    "if (aaaaaaaaaaaaaaaa\n"
13818                    "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
13819                    "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
13820                    "return;\n"
13821                    "}",
13822                    Style));
13823 
13824   // Allow functions on a single line.
13825   verifyFormat("void f() { return; }", Style);
13826 
13827   // Allow empty blocks on a single line and insert a space in empty blocks.
13828   EXPECT_EQ("void f() { }", format("void f() {}", Style));
13829   EXPECT_EQ("while (true) { }", format("while (true) {}", Style));
13830   // However, don't merge non-empty short loops.
13831   EXPECT_EQ("while (true) {\n"
13832             "    continue;\n"
13833             "}",
13834             format("while (true) { continue; }", Style));
13835 
13836   // Constructor initializers are formatted one per line with the "," on the
13837   // new line.
13838   verifyFormat("Constructor()\n"
13839                "    : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
13840                "    , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
13841                "          aaaaaaaaaaaaaa)\n"
13842                "    , aaaaaaaaaaaaaaaaaaaaaaa()\n"
13843                "{\n"
13844                "}",
13845                Style);
13846   verifyFormat("SomeClass::Constructor()\n"
13847                "    : a(a)\n"
13848                "{\n"
13849                "}",
13850                Style);
13851   EXPECT_EQ("SomeClass::Constructor()\n"
13852             "    : a(a)\n"
13853             "{\n"
13854             "}",
13855             format("SomeClass::Constructor():a(a){}", Style));
13856   verifyFormat("SomeClass::Constructor()\n"
13857                "    : a(a)\n"
13858                "    , b(b)\n"
13859                "    , c(c)\n"
13860                "{\n"
13861                "}",
13862                Style);
13863   verifyFormat("SomeClass::Constructor()\n"
13864                "    : a(a)\n"
13865                "{\n"
13866                "    foo();\n"
13867                "    bar();\n"
13868                "}",
13869                Style);
13870 
13871   // Access specifiers should be aligned left.
13872   verifyFormat("class C {\n"
13873                "public:\n"
13874                "    int i;\n"
13875                "};",
13876                Style);
13877 
13878   // Do not align comments.
13879   verifyFormat("int a; // Do not\n"
13880                "double b; // align comments.",
13881                Style);
13882 
13883   // Do not align operands.
13884   EXPECT_EQ("ASSERT(aaaa\n"
13885             "    || bbbb);",
13886             format("ASSERT ( aaaa\n||bbbb);", Style));
13887 
13888   // Accept input's line breaks.
13889   EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
13890             "    || bbbbbbbbbbbbbbb) {\n"
13891             "    i++;\n"
13892             "}",
13893             format("if (aaaaaaaaaaaaaaa\n"
13894                    "|| bbbbbbbbbbbbbbb) { i++; }",
13895                    Style));
13896   EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
13897             "    i++;\n"
13898             "}",
13899             format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
13900 
13901   // Don't automatically break all macro definitions (llvm.org/PR17842).
13902   verifyFormat("#define aNumber 10", Style);
13903   // However, generally keep the line breaks that the user authored.
13904   EXPECT_EQ("#define aNumber \\\n"
13905             "    10",
13906             format("#define aNumber \\\n"
13907                    " 10",
13908                    Style));
13909 
13910   // Keep empty and one-element array literals on a single line.
13911   EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
13912             "                                  copyItems:YES];",
13913             format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
13914                    "copyItems:YES];",
13915                    Style));
13916   EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
13917             "                                  copyItems:YES];",
13918             format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
13919                    "             copyItems:YES];",
13920                    Style));
13921   // FIXME: This does not seem right, there should be more indentation before
13922   // the array literal's entries. Nested blocks have the same problem.
13923   EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
13924             "    @\"a\",\n"
13925             "    @\"a\"\n"
13926             "]\n"
13927             "                                  copyItems:YES];",
13928             format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
13929                    "     @\"a\",\n"
13930                    "     @\"a\"\n"
13931                    "     ]\n"
13932                    "       copyItems:YES];",
13933                    Style));
13934   EXPECT_EQ(
13935       "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
13936       "                                  copyItems:YES];",
13937       format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
13938              "   copyItems:YES];",
13939              Style));
13940 
13941   verifyFormat("[self.a b:c c:d];", Style);
13942   EXPECT_EQ("[self.a b:c\n"
13943             "        c:d];",
13944             format("[self.a b:c\n"
13945                    "c:d];",
13946                    Style));
13947 }
13948 
13949 TEST_F(FormatTest, FormatsLambdas) {
13950   verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
13951   verifyFormat(
13952       "int c = [b]() mutable noexcept { return [&b] { return b++; }(); }();\n");
13953   verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
13954   verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
13955   verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
13956   verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
13957   verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
13958   verifyFormat("auto c = [a = [b = 42] {}] {};\n");
13959   verifyFormat("auto c = [a = &i + 10, b = [] {}] {};\n");
13960   verifyFormat("int x = f(*+[] {});");
13961   verifyFormat("void f() {\n"
13962                "  other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
13963                "}\n");
13964   verifyFormat("void f() {\n"
13965                "  other(x.begin(), //\n"
13966                "        x.end(),   //\n"
13967                "        [&](int, int) { return 1; });\n"
13968                "}\n");
13969   verifyFormat("void f() {\n"
13970                "  other.other.other.other.other(\n"
13971                "      x.begin(), x.end(),\n"
13972                "      [something, rather](int, int, int, int, int, int, int) { "
13973                "return 1; });\n"
13974                "}\n");
13975   verifyFormat(
13976       "void f() {\n"
13977       "  other.other.other.other.other(\n"
13978       "      x.begin(), x.end(),\n"
13979       "      [something, rather](int, int, int, int, int, int, int) {\n"
13980       "        //\n"
13981       "      });\n"
13982       "}\n");
13983   verifyFormat("SomeFunction([]() { // A cool function...\n"
13984                "  return 43;\n"
13985                "});");
13986   EXPECT_EQ("SomeFunction([]() {\n"
13987             "#define A a\n"
13988             "  return 43;\n"
13989             "});",
13990             format("SomeFunction([](){\n"
13991                    "#define A a\n"
13992                    "return 43;\n"
13993                    "});"));
13994   verifyFormat("void f() {\n"
13995                "  SomeFunction([](decltype(x), A *a) {});\n"
13996                "}");
13997   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
13998                "    [](const aaaaaaaaaa &a) { return a; });");
13999   verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
14000                "  SomeOtherFunctioooooooooooooooooooooooooon();\n"
14001                "});");
14002   verifyFormat("Constructor()\n"
14003                "    : Field([] { // comment\n"
14004                "        int i;\n"
14005                "      }) {}");
14006   verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
14007                "  return some_parameter.size();\n"
14008                "};");
14009   verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
14010                "    [](const string &s) { return s; };");
14011   verifyFormat("int i = aaaaaa ? 1 //\n"
14012                "               : [] {\n"
14013                "                   return 2; //\n"
14014                "                 }();");
14015   verifyFormat("llvm::errs() << \"number of twos is \"\n"
14016                "             << std::count_if(v.begin(), v.end(), [](int x) {\n"
14017                "                  return x == 2; // force break\n"
14018                "                });");
14019   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
14020                "    [=](int iiiiiiiiiiii) {\n"
14021                "      return aaaaaaaaaaaaaaaaaaaaaaa !=\n"
14022                "             aaaaaaaaaaaaaaaaaaaaaaa;\n"
14023                "    });",
14024                getLLVMStyleWithColumns(60));
14025   verifyFormat("SomeFunction({[&] {\n"
14026                "                // comment\n"
14027                "              },\n"
14028                "              [&] {\n"
14029                "                // comment\n"
14030                "              }});");
14031   verifyFormat("SomeFunction({[&] {\n"
14032                "  // comment\n"
14033                "}});");
14034   verifyFormat(
14035       "virtual aaaaaaaaaaaaaaaa(\n"
14036       "    std::function<bool()> bbbbbbbbbbbb = [&]() { return true; },\n"
14037       "    aaaaa aaaaaaaaa);");
14038 
14039   // Lambdas with return types.
14040   verifyFormat("int c = []() -> int { return 2; }();\n");
14041   verifyFormat("int c = []() -> int * { return 2; }();\n");
14042   verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
14043   verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
14044   verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
14045   verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
14046   verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
14047   verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
14048   verifyFormat("[a, a]() -> a<1> {};");
14049   verifyFormat("[]() -> foo<5 + 2> { return {}; };");
14050   verifyFormat("[]() -> foo<5 - 2> { return {}; };");
14051   verifyFormat("[]() -> foo<5 / 2> { return {}; };");
14052   verifyFormat("[]() -> foo<5 * 2> { return {}; };");
14053   verifyFormat("[]() -> foo<5 % 2> { return {}; };");
14054   verifyFormat("[]() -> foo<5 << 2> { return {}; };");
14055   verifyFormat("[]() -> foo<!5> { return {}; };");
14056   verifyFormat("[]() -> foo<~5> { return {}; };");
14057   verifyFormat("[]() -> foo<5 | 2> { return {}; };");
14058   verifyFormat("[]() -> foo<5 || 2> { return {}; };");
14059   verifyFormat("[]() -> foo<5 & 2> { return {}; };");
14060   verifyFormat("[]() -> foo<5 && 2> { return {}; };");
14061   verifyFormat("[]() -> foo<5 == 2> { return {}; };");
14062   verifyFormat("[]() -> foo<5 != 2> { return {}; };");
14063   verifyFormat("[]() -> foo<5 >= 2> { return {}; };");
14064   verifyFormat("[]() -> foo<5 <= 2> { return {}; };");
14065   verifyFormat("[]() -> foo<5 < 2> { return {}; };");
14066   verifyFormat("[]() -> foo<2 ? 1 : 0> { return {}; };");
14067   verifyFormat("namespace bar {\n"
14068                "// broken:\n"
14069                "auto foo{[]() -> foo<5 + 2> { return {}; }};\n"
14070                "} // namespace bar");
14071   verifyFormat("namespace bar {\n"
14072                "// broken:\n"
14073                "auto foo{[]() -> foo<5 - 2> { return {}; }};\n"
14074                "} // namespace bar");
14075   verifyFormat("namespace bar {\n"
14076                "// broken:\n"
14077                "auto foo{[]() -> foo<5 / 2> { return {}; }};\n"
14078                "} // namespace bar");
14079   verifyFormat("namespace bar {\n"
14080                "// broken:\n"
14081                "auto foo{[]() -> foo<5 * 2> { return {}; }};\n"
14082                "} // namespace bar");
14083   verifyFormat("namespace bar {\n"
14084                "// broken:\n"
14085                "auto foo{[]() -> foo<5 % 2> { return {}; }};\n"
14086                "} // namespace bar");
14087   verifyFormat("namespace bar {\n"
14088                "// broken:\n"
14089                "auto foo{[]() -> foo<5 << 2> { return {}; }};\n"
14090                "} // namespace bar");
14091   verifyFormat("namespace bar {\n"
14092                "// broken:\n"
14093                "auto foo{[]() -> foo<!5> { return {}; }};\n"
14094                "} // namespace bar");
14095   verifyFormat("namespace bar {\n"
14096                "// broken:\n"
14097                "auto foo{[]() -> foo<~5> { return {}; }};\n"
14098                "} // namespace bar");
14099   verifyFormat("namespace bar {\n"
14100                "// broken:\n"
14101                "auto foo{[]() -> foo<5 | 2> { return {}; }};\n"
14102                "} // namespace bar");
14103   verifyFormat("namespace bar {\n"
14104                "// broken:\n"
14105                "auto foo{[]() -> foo<5 || 2> { return {}; }};\n"
14106                "} // namespace bar");
14107   verifyFormat("namespace bar {\n"
14108                "// broken:\n"
14109                "auto foo{[]() -> foo<5 & 2> { return {}; }};\n"
14110                "} // namespace bar");
14111   verifyFormat("namespace bar {\n"
14112                "// broken:\n"
14113                "auto foo{[]() -> foo<5 && 2> { return {}; }};\n"
14114                "} // namespace bar");
14115   verifyFormat("namespace bar {\n"
14116                "// broken:\n"
14117                "auto foo{[]() -> foo<5 == 2> { return {}; }};\n"
14118                "} // namespace bar");
14119   verifyFormat("namespace bar {\n"
14120                "// broken:\n"
14121                "auto foo{[]() -> foo<5 != 2> { return {}; }};\n"
14122                "} // namespace bar");
14123   verifyFormat("namespace bar {\n"
14124                "// broken:\n"
14125                "auto foo{[]() -> foo<5 >= 2> { return {}; }};\n"
14126                "} // namespace bar");
14127   verifyFormat("namespace bar {\n"
14128                "// broken:\n"
14129                "auto foo{[]() -> foo<5 <= 2> { return {}; }};\n"
14130                "} // namespace bar");
14131   verifyFormat("namespace bar {\n"
14132                "// broken:\n"
14133                "auto foo{[]() -> foo<5 < 2> { return {}; }};\n"
14134                "} // namespace bar");
14135   verifyFormat("namespace bar {\n"
14136                "// broken:\n"
14137                "auto foo{[]() -> foo<2 ? 1 : 0> { return {}; }};\n"
14138                "} // namespace bar");
14139   verifyFormat("[]() -> a<1> {};");
14140   verifyFormat("[]() -> a<1> { ; };");
14141   verifyFormat("[]() -> a<1> { ; }();");
14142   verifyFormat("[a, a]() -> a<true> {};");
14143   verifyFormat("[]() -> a<true> {};");
14144   verifyFormat("[]() -> a<true> { ; };");
14145   verifyFormat("[]() -> a<true> { ; }();");
14146   verifyFormat("[a, a]() -> a<false> {};");
14147   verifyFormat("[]() -> a<false> {};");
14148   verifyFormat("[]() -> a<false> { ; };");
14149   verifyFormat("[]() -> a<false> { ; }();");
14150   verifyFormat("auto foo{[]() -> foo<false> { ; }};");
14151   verifyFormat("namespace bar {\n"
14152                "auto foo{[]() -> foo<false> { ; }};\n"
14153                "} // namespace bar");
14154   verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
14155                "                   int j) -> int {\n"
14156                "  return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
14157                "};");
14158   verifyFormat(
14159       "aaaaaaaaaaaaaaaaaaaaaa(\n"
14160       "    [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
14161       "      return aaaaaaaaaaaaaaaaa;\n"
14162       "    });",
14163       getLLVMStyleWithColumns(70));
14164   verifyFormat("[]() //\n"
14165                "    -> int {\n"
14166                "  return 1; //\n"
14167                "};");
14168   verifyFormat("[]() -> Void<T...> {};");
14169   verifyFormat("[a, b]() -> Tuple<T...> { return {}; };");
14170 
14171   // Lambdas with explicit template argument lists.
14172   verifyFormat(
14173       "auto L = []<template <typename> class T, class U>(T<U> &&a) {};\n");
14174 
14175   // Multiple lambdas in the same parentheses change indentation rules. These
14176   // lambdas are forced to start on new lines.
14177   verifyFormat("SomeFunction(\n"
14178                "    []() {\n"
14179                "      //\n"
14180                "    },\n"
14181                "    []() {\n"
14182                "      //\n"
14183                "    });");
14184 
14185   // A lambda passed as arg0 is always pushed to the next line.
14186   verifyFormat("SomeFunction(\n"
14187                "    [this] {\n"
14188                "      //\n"
14189                "    },\n"
14190                "    1);\n");
14191 
14192   // A multi-line lambda passed as arg1 forces arg0 to be pushed out, just like
14193   // the arg0 case above.
14194   auto Style = getGoogleStyle();
14195   Style.BinPackArguments = false;
14196   verifyFormat("SomeFunction(\n"
14197                "    a,\n"
14198                "    [this] {\n"
14199                "      //\n"
14200                "    },\n"
14201                "    b);\n",
14202                Style);
14203   verifyFormat("SomeFunction(\n"
14204                "    a,\n"
14205                "    [this] {\n"
14206                "      //\n"
14207                "    },\n"
14208                "    b);\n");
14209 
14210   // A lambda with a very long line forces arg0 to be pushed out irrespective of
14211   // the BinPackArguments value (as long as the code is wide enough).
14212   verifyFormat(
14213       "something->SomeFunction(\n"
14214       "    a,\n"
14215       "    [this] {\n"
14216       "      "
14217       "D0000000000000000000000000000000000000000000000000000000000001();\n"
14218       "    },\n"
14219       "    b);\n");
14220 
14221   // A multi-line lambda is pulled up as long as the introducer fits on the
14222   // previous line and there are no further args.
14223   verifyFormat("function(1, [this, that] {\n"
14224                "  //\n"
14225                "});\n");
14226   verifyFormat("function([this, that] {\n"
14227                "  //\n"
14228                "});\n");
14229   // FIXME: this format is not ideal and we should consider forcing the first
14230   // arg onto its own line.
14231   verifyFormat("function(a, b, c, //\n"
14232                "         d, [this, that] {\n"
14233                "           //\n"
14234                "         });\n");
14235 
14236   // Multiple lambdas are treated correctly even when there is a short arg0.
14237   verifyFormat("SomeFunction(\n"
14238                "    1,\n"
14239                "    [this] {\n"
14240                "      //\n"
14241                "    },\n"
14242                "    [this] {\n"
14243                "      //\n"
14244                "    },\n"
14245                "    1);\n");
14246 
14247   // More complex introducers.
14248   verifyFormat("return [i, args...] {};");
14249 
14250   // Not lambdas.
14251   verifyFormat("constexpr char hello[]{\"hello\"};");
14252   verifyFormat("double &operator[](int i) { return 0; }\n"
14253                "int i;");
14254   verifyFormat("std::unique_ptr<int[]> foo() {}");
14255   verifyFormat("int i = a[a][a]->f();");
14256   verifyFormat("int i = (*b)[a]->f();");
14257 
14258   // Other corner cases.
14259   verifyFormat("void f() {\n"
14260                "  bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
14261                "  );\n"
14262                "}");
14263 
14264   // Lambdas created through weird macros.
14265   verifyFormat("void f() {\n"
14266                "  MACRO((const AA &a) { return 1; });\n"
14267                "  MACRO((AA &a) { return 1; });\n"
14268                "}");
14269 
14270   verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
14271                "      doo_dah();\n"
14272                "      doo_dah();\n"
14273                "    })) {\n"
14274                "}");
14275   verifyFormat("if constexpr (blah_blah(whatever, whatever, [] {\n"
14276                "                doo_dah();\n"
14277                "                doo_dah();\n"
14278                "              })) {\n"
14279                "}");
14280   verifyFormat("if CONSTEXPR (blah_blah(whatever, whatever, [] {\n"
14281                "                doo_dah();\n"
14282                "                doo_dah();\n"
14283                "              })) {\n"
14284                "}");
14285   verifyFormat("auto lambda = []() {\n"
14286                "  int a = 2\n"
14287                "#if A\n"
14288                "          + 2\n"
14289                "#endif\n"
14290                "      ;\n"
14291                "};");
14292 
14293   // Lambdas with complex multiline introducers.
14294   verifyFormat(
14295       "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
14296       "    [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n"
14297       "        -> ::std::unordered_set<\n"
14298       "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n"
14299       "      //\n"
14300       "    });");
14301 
14302   FormatStyle DoNotMerge = getLLVMStyle();
14303   DoNotMerge.AllowShortLambdasOnASingleLine = FormatStyle::SLS_None;
14304   verifyFormat("auto c = []() {\n"
14305                "  return b;\n"
14306                "};",
14307                "auto c = []() { return b; };", DoNotMerge);
14308   verifyFormat("auto c = []() {\n"
14309                "};",
14310                " auto c = []() {};", DoNotMerge);
14311 
14312   FormatStyle MergeEmptyOnly = getLLVMStyle();
14313   MergeEmptyOnly.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Empty;
14314   verifyFormat("auto c = []() {\n"
14315                "  return b;\n"
14316                "};",
14317                "auto c = []() {\n"
14318                "  return b;\n"
14319                " };",
14320                MergeEmptyOnly);
14321   verifyFormat("auto c = []() {};",
14322                "auto c = []() {\n"
14323                "};",
14324                MergeEmptyOnly);
14325 
14326   FormatStyle MergeInline = getLLVMStyle();
14327   MergeInline.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Inline;
14328   verifyFormat("auto c = []() {\n"
14329                "  return b;\n"
14330                "};",
14331                "auto c = []() { return b; };", MergeInline);
14332   verifyFormat("function([]() { return b; })", "function([]() { return b; })",
14333                MergeInline);
14334   verifyFormat("function([]() { return b; }, a)",
14335                "function([]() { return b; }, a)", MergeInline);
14336   verifyFormat("function(a, []() { return b; })",
14337                "function(a, []() { return b; })", MergeInline);
14338 
14339   // Check option "BraceWrapping.BeforeLambdaBody" and different state of
14340   // AllowShortLambdasOnASingleLine
14341   FormatStyle LLVMWithBeforeLambdaBody = getLLVMStyle();
14342   LLVMWithBeforeLambdaBody.BreakBeforeBraces = FormatStyle::BS_Custom;
14343   LLVMWithBeforeLambdaBody.BraceWrapping.BeforeLambdaBody = true;
14344   LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine =
14345       FormatStyle::ShortLambdaStyle::SLS_None;
14346   verifyFormat("FctWithOneNestedLambdaInline_SLS_None(\n"
14347                "    []()\n"
14348                "    {\n"
14349                "      return 17;\n"
14350                "    });",
14351                LLVMWithBeforeLambdaBody);
14352   verifyFormat("FctWithOneNestedLambdaEmpty_SLS_None(\n"
14353                "    []()\n"
14354                "    {\n"
14355                "    });",
14356                LLVMWithBeforeLambdaBody);
14357   verifyFormat("auto fct_SLS_None = []()\n"
14358                "{\n"
14359                "  return 17;\n"
14360                "};",
14361                LLVMWithBeforeLambdaBody);
14362   verifyFormat("TwoNestedLambdas_SLS_None(\n"
14363                "    []()\n"
14364                "    {\n"
14365                "      return Call(\n"
14366                "          []()\n"
14367                "          {\n"
14368                "            return 17;\n"
14369                "          });\n"
14370                "    });",
14371                LLVMWithBeforeLambdaBody);
14372   verifyFormat("void Fct()\n"
14373                "{\n"
14374                "  return {[]()\n"
14375                "          {\n"
14376                "            return 17;\n"
14377                "          }};\n"
14378                "}",
14379                LLVMWithBeforeLambdaBody);
14380 
14381   LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine =
14382       FormatStyle::ShortLambdaStyle::SLS_Empty;
14383   verifyFormat("FctWithOneNestedLambdaInline_SLS_Empty(\n"
14384                "    []()\n"
14385                "    {\n"
14386                "      return 17;\n"
14387                "    });",
14388                LLVMWithBeforeLambdaBody);
14389   verifyFormat("FctWithOneNestedLambdaEmpty_SLS_Empty([]() {});",
14390                LLVMWithBeforeLambdaBody);
14391   verifyFormat("FctWithOneNestedLambdaEmptyInsideAVeryVeryVeryVeryVeryVeryVeryL"
14392                "ongFunctionName_SLS_Empty(\n"
14393                "    []() {});",
14394                LLVMWithBeforeLambdaBody);
14395   verifyFormat("FctWithMultipleParams_SLS_Empty(A, B,\n"
14396                "                                []()\n"
14397                "                                {\n"
14398                "                                  return 17;\n"
14399                "                                });",
14400                LLVMWithBeforeLambdaBody);
14401   verifyFormat("auto fct_SLS_Empty = []()\n"
14402                "{\n"
14403                "  return 17;\n"
14404                "};",
14405                LLVMWithBeforeLambdaBody);
14406   verifyFormat("TwoNestedLambdas_SLS_Empty(\n"
14407                "    []()\n"
14408                "    {\n"
14409                "      return Call([]() {});\n"
14410                "    });",
14411                LLVMWithBeforeLambdaBody);
14412   verifyFormat("TwoNestedLambdas_SLS_Empty(A,\n"
14413                "                           []()\n"
14414                "                           {\n"
14415                "                             return Call([]() {});\n"
14416                "                           });",
14417                LLVMWithBeforeLambdaBody);
14418   verifyFormat(
14419       "FctWithLongLineInLambda_SLS_Empty(\n"
14420       "    []()\n"
14421       "    {\n"
14422       "      return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n"
14423       "                               AndShouldNotBeConsiderAsInline,\n"
14424       "                               LambdaBodyMustBeBreak);\n"
14425       "    });",
14426       LLVMWithBeforeLambdaBody);
14427 
14428   LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine =
14429       FormatStyle::ShortLambdaStyle::SLS_Inline;
14430   verifyFormat("FctWithOneNestedLambdaInline_SLS_Inline([]() { return 17; });",
14431                LLVMWithBeforeLambdaBody);
14432   verifyFormat("FctWithOneNestedLambdaEmpty_SLS_Inline([]() {});",
14433                LLVMWithBeforeLambdaBody);
14434   verifyFormat("auto fct_SLS_Inline = []()\n"
14435                "{\n"
14436                "  return 17;\n"
14437                "};",
14438                LLVMWithBeforeLambdaBody);
14439   verifyFormat("TwoNestedLambdas_SLS_Inline([]() { return Call([]() { return "
14440                "17; }); });",
14441                LLVMWithBeforeLambdaBody);
14442   verifyFormat(
14443       "FctWithLongLineInLambda_SLS_Inline(\n"
14444       "    []()\n"
14445       "    {\n"
14446       "      return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n"
14447       "                               AndShouldNotBeConsiderAsInline,\n"
14448       "                               LambdaBodyMustBeBreak);\n"
14449       "    });",
14450       LLVMWithBeforeLambdaBody);
14451   verifyFormat("FctWithMultipleParams_SLS_Inline("
14452                "VeryLongParameterThatShouldAskToBeOnMultiLine,\n"
14453                "                                 []() { return 17; });",
14454                LLVMWithBeforeLambdaBody);
14455   verifyFormat(
14456       "FctWithMultipleParams_SLS_Inline(FirstParam, []() { return 17; });",
14457       LLVMWithBeforeLambdaBody);
14458 
14459   LLVMWithBeforeLambdaBody.AllowShortLambdasOnASingleLine =
14460       FormatStyle::ShortLambdaStyle::SLS_All;
14461   verifyFormat("FctWithOneNestedLambdaInline_SLS_All([]() { return 17; });",
14462                LLVMWithBeforeLambdaBody);
14463   verifyFormat("FctWithOneNestedLambdaEmpty_SLS_All([]() {});",
14464                LLVMWithBeforeLambdaBody);
14465   verifyFormat("auto fct_SLS_All = []() { return 17; };",
14466                LLVMWithBeforeLambdaBody);
14467   verifyFormat("FctWithOneParam_SLS_All(\n"
14468                "    []()\n"
14469                "    {\n"
14470                "      // A cool function...\n"
14471                "      return 43;\n"
14472                "    });",
14473                LLVMWithBeforeLambdaBody);
14474   verifyFormat("FctWithMultipleParams_SLS_All("
14475                "VeryLongParameterThatShouldAskToBeOnMultiLine,\n"
14476                "                              []() { return 17; });",
14477                LLVMWithBeforeLambdaBody);
14478   verifyFormat("FctWithMultipleParams_SLS_All(A, []() { return 17; });",
14479                LLVMWithBeforeLambdaBody);
14480   verifyFormat("FctWithMultipleParams_SLS_All(A, B, []() { return 17; });",
14481                LLVMWithBeforeLambdaBody);
14482   verifyFormat(
14483       "FctWithLongLineInLambda_SLS_All(\n"
14484       "    []()\n"
14485       "    {\n"
14486       "      return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n"
14487       "                               AndShouldNotBeConsiderAsInline,\n"
14488       "                               LambdaBodyMustBeBreak);\n"
14489       "    });",
14490       LLVMWithBeforeLambdaBody);
14491   verifyFormat(
14492       "auto fct_SLS_All = []()\n"
14493       "{\n"
14494       "  return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n"
14495       "                           AndShouldNotBeConsiderAsInline,\n"
14496       "                           LambdaBodyMustBeBreak);\n"
14497       "};",
14498       LLVMWithBeforeLambdaBody);
14499   LLVMWithBeforeLambdaBody.BinPackParameters = false;
14500   verifyFormat("FctAllOnSameLine_SLS_All([]() { return S; }, Fst, Second);",
14501                LLVMWithBeforeLambdaBody);
14502   verifyFormat(
14503       "FctWithLongLineInLambda_SLS_All([]() { return SomeValueNotSoLong; },\n"
14504       "                                FirstParam,\n"
14505       "                                SecondParam,\n"
14506       "                                ThirdParam,\n"
14507       "                                FourthParam);",
14508       LLVMWithBeforeLambdaBody);
14509   verifyFormat("FctWithLongLineInLambda_SLS_All(\n"
14510                "    []() { return "
14511                "SomeValueVeryVeryVeryVeryVeryVeryVeryVeryVeryLong; },\n"
14512                "    FirstParam,\n"
14513                "    SecondParam,\n"
14514                "    ThirdParam,\n"
14515                "    FourthParam);",
14516                LLVMWithBeforeLambdaBody);
14517   verifyFormat(
14518       "FctWithLongLineInLambda_SLS_All(FirstParam,\n"
14519       "                                SecondParam,\n"
14520       "                                ThirdParam,\n"
14521       "                                FourthParam,\n"
14522       "                                []() { return SomeValueNotSoLong; });",
14523       LLVMWithBeforeLambdaBody);
14524   verifyFormat("FctWithLongLineInLambda_SLS_All(\n"
14525                "    []()\n"
14526                "    {\n"
14527                "      return "
14528                "HereAVeryLongLineThatWillBeFormattedOnMultipleLineAndShouldNotB"
14529                "eConsiderAsInline;\n"
14530                "    });",
14531                LLVMWithBeforeLambdaBody);
14532   verifyFormat(
14533       "FctWithLongLineInLambda_SLS_All(\n"
14534       "    []()\n"
14535       "    {\n"
14536       "      return HereAVeryLongLine(ThatWillBeFormatted, OnMultipleLine,\n"
14537       "                               AndShouldNotBeConsiderAsInline,\n"
14538       "                               LambdaBodyMustBeBreak);\n"
14539       "    });",
14540       LLVMWithBeforeLambdaBody);
14541   verifyFormat("FctWithTwoParams_SLS_All(\n"
14542                "    []()\n"
14543                "    {\n"
14544                "      // A cool function...\n"
14545                "      return 43;\n"
14546                "    },\n"
14547                "    87);",
14548                LLVMWithBeforeLambdaBody);
14549   verifyFormat("FctWithTwoParams_SLS_All([]() { return 43; }, 87);",
14550                LLVMWithBeforeLambdaBody);
14551   verifyFormat("FctWithOneNestedLambdas_SLS_All([]() { return 17; });",
14552                LLVMWithBeforeLambdaBody);
14553   verifyFormat(
14554       "TwoNestedLambdas_SLS_All([]() { return Call([]() { return 17; }); });",
14555       LLVMWithBeforeLambdaBody);
14556   verifyFormat("TwoNestedLambdas_SLS_All([]() { return Call([]() { return 17; "
14557                "}); }, x);",
14558                LLVMWithBeforeLambdaBody);
14559   verifyFormat("TwoNestedLambdas_SLS_All(\n"
14560                "    []()\n"
14561                "    {\n"
14562                "      // A cool function...\n"
14563                "      return Call([]() { return 17; });\n"
14564                "    });",
14565                LLVMWithBeforeLambdaBody);
14566   verifyFormat("TwoNestedLambdas_SLS_All(\n"
14567                "    []()\n"
14568                "    {\n"
14569                "      return Call(\n"
14570                "          []()\n"
14571                "          {\n"
14572                "            // A cool function...\n"
14573                "            return 17;\n"
14574                "          });\n"
14575                "    });",
14576                LLVMWithBeforeLambdaBody);
14577 }
14578 
14579 TEST_F(FormatTest, EmptyLinesInLambdas) {
14580   verifyFormat("auto lambda = []() {\n"
14581                "  x(); //\n"
14582                "};",
14583                "auto lambda = []() {\n"
14584                "\n"
14585                "  x(); //\n"
14586                "\n"
14587                "};");
14588 }
14589 
14590 TEST_F(FormatTest, FormatsBlocks) {
14591   FormatStyle ShortBlocks = getLLVMStyle();
14592   ShortBlocks.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always;
14593   verifyFormat("int (^Block)(int, int);", ShortBlocks);
14594   verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
14595   verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
14596   verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
14597   verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
14598   verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
14599 
14600   verifyFormat("foo(^{ bar(); });", ShortBlocks);
14601   verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
14602   verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
14603 
14604   verifyFormat("[operation setCompletionBlock:^{\n"
14605                "  [self onOperationDone];\n"
14606                "}];");
14607   verifyFormat("int i = {[operation setCompletionBlock:^{\n"
14608                "  [self onOperationDone];\n"
14609                "}]};");
14610   verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
14611                "  f();\n"
14612                "}];");
14613   verifyFormat("int a = [operation block:^int(int *i) {\n"
14614                "  return 1;\n"
14615                "}];");
14616   verifyFormat("[myObject doSomethingWith:arg1\n"
14617                "                      aaa:^int(int *a) {\n"
14618                "                        return 1;\n"
14619                "                      }\n"
14620                "                      bbb:f(a * bbbbbbbb)];");
14621 
14622   verifyFormat("[operation setCompletionBlock:^{\n"
14623                "  [self.delegate newDataAvailable];\n"
14624                "}];",
14625                getLLVMStyleWithColumns(60));
14626   verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
14627                "  NSString *path = [self sessionFilePath];\n"
14628                "  if (path) {\n"
14629                "    // ...\n"
14630                "  }\n"
14631                "});");
14632   verifyFormat("[[SessionService sharedService]\n"
14633                "    loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
14634                "      if (window) {\n"
14635                "        [self windowDidLoad:window];\n"
14636                "      } else {\n"
14637                "        [self errorLoadingWindow];\n"
14638                "      }\n"
14639                "    }];");
14640   verifyFormat("void (^largeBlock)(void) = ^{\n"
14641                "  // ...\n"
14642                "};\n",
14643                getLLVMStyleWithColumns(40));
14644   verifyFormat("[[SessionService sharedService]\n"
14645                "    loadWindowWithCompletionBlock: //\n"
14646                "        ^(SessionWindow *window) {\n"
14647                "          if (window) {\n"
14648                "            [self windowDidLoad:window];\n"
14649                "          } else {\n"
14650                "            [self errorLoadingWindow];\n"
14651                "          }\n"
14652                "        }];",
14653                getLLVMStyleWithColumns(60));
14654   verifyFormat("[myObject doSomethingWith:arg1\n"
14655                "    firstBlock:^(Foo *a) {\n"
14656                "      // ...\n"
14657                "      int i;\n"
14658                "    }\n"
14659                "    secondBlock:^(Bar *b) {\n"
14660                "      // ...\n"
14661                "      int i;\n"
14662                "    }\n"
14663                "    thirdBlock:^Foo(Bar *b) {\n"
14664                "      // ...\n"
14665                "      int i;\n"
14666                "    }];");
14667   verifyFormat("[myObject doSomethingWith:arg1\n"
14668                "               firstBlock:-1\n"
14669                "              secondBlock:^(Bar *b) {\n"
14670                "                // ...\n"
14671                "                int i;\n"
14672                "              }];");
14673 
14674   verifyFormat("f(^{\n"
14675                "  @autoreleasepool {\n"
14676                "    if (a) {\n"
14677                "      g();\n"
14678                "    }\n"
14679                "  }\n"
14680                "});");
14681   verifyFormat("Block b = ^int *(A *a, B *b) {}");
14682   verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
14683                "};");
14684 
14685   FormatStyle FourIndent = getLLVMStyle();
14686   FourIndent.ObjCBlockIndentWidth = 4;
14687   verifyFormat("[operation setCompletionBlock:^{\n"
14688                "    [self onOperationDone];\n"
14689                "}];",
14690                FourIndent);
14691 }
14692 
14693 TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
14694   FormatStyle ZeroColumn = getLLVMStyle();
14695   ZeroColumn.ColumnLimit = 0;
14696 
14697   verifyFormat("[[SessionService sharedService] "
14698                "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
14699                "  if (window) {\n"
14700                "    [self windowDidLoad:window];\n"
14701                "  } else {\n"
14702                "    [self errorLoadingWindow];\n"
14703                "  }\n"
14704                "}];",
14705                ZeroColumn);
14706   EXPECT_EQ("[[SessionService sharedService]\n"
14707             "    loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
14708             "      if (window) {\n"
14709             "        [self windowDidLoad:window];\n"
14710             "      } else {\n"
14711             "        [self errorLoadingWindow];\n"
14712             "      }\n"
14713             "    }];",
14714             format("[[SessionService sharedService]\n"
14715                    "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
14716                    "                if (window) {\n"
14717                    "    [self windowDidLoad:window];\n"
14718                    "  } else {\n"
14719                    "    [self errorLoadingWindow];\n"
14720                    "  }\n"
14721                    "}];",
14722                    ZeroColumn));
14723   verifyFormat("[myObject doSomethingWith:arg1\n"
14724                "    firstBlock:^(Foo *a) {\n"
14725                "      // ...\n"
14726                "      int i;\n"
14727                "    }\n"
14728                "    secondBlock:^(Bar *b) {\n"
14729                "      // ...\n"
14730                "      int i;\n"
14731                "    }\n"
14732                "    thirdBlock:^Foo(Bar *b) {\n"
14733                "      // ...\n"
14734                "      int i;\n"
14735                "    }];",
14736                ZeroColumn);
14737   verifyFormat("f(^{\n"
14738                "  @autoreleasepool {\n"
14739                "    if (a) {\n"
14740                "      g();\n"
14741                "    }\n"
14742                "  }\n"
14743                "});",
14744                ZeroColumn);
14745   verifyFormat("void (^largeBlock)(void) = ^{\n"
14746                "  // ...\n"
14747                "};",
14748                ZeroColumn);
14749 
14750   ZeroColumn.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Always;
14751   EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
14752             format("void   (^largeBlock)(void) = ^{ int   i; };", ZeroColumn));
14753   ZeroColumn.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Never;
14754   EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
14755             "  int i;\n"
14756             "};",
14757             format("void   (^largeBlock)(void) = ^{ int   i; };", ZeroColumn));
14758 }
14759 
14760 TEST_F(FormatTest, SupportsCRLF) {
14761   EXPECT_EQ("int a;\r\n"
14762             "int b;\r\n"
14763             "int c;\r\n",
14764             format("int a;\r\n"
14765                    "  int b;\r\n"
14766                    "    int c;\r\n",
14767                    getLLVMStyle()));
14768   EXPECT_EQ("int a;\r\n"
14769             "int b;\r\n"
14770             "int c;\r\n",
14771             format("int a;\r\n"
14772                    "  int b;\n"
14773                    "    int c;\r\n",
14774                    getLLVMStyle()));
14775   EXPECT_EQ("int a;\n"
14776             "int b;\n"
14777             "int c;\n",
14778             format("int a;\r\n"
14779                    "  int b;\n"
14780                    "    int c;\n",
14781                    getLLVMStyle()));
14782   EXPECT_EQ("\"aaaaaaa \"\r\n"
14783             "\"bbbbbbb\";\r\n",
14784             format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
14785   EXPECT_EQ("#define A \\\r\n"
14786             "  b;      \\\r\n"
14787             "  c;      \\\r\n"
14788             "  d;\r\n",
14789             format("#define A \\\r\n"
14790                    "  b; \\\r\n"
14791                    "  c; d; \r\n",
14792                    getGoogleStyle()));
14793 
14794   EXPECT_EQ("/*\r\n"
14795             "multi line block comments\r\n"
14796             "should not introduce\r\n"
14797             "an extra carriage return\r\n"
14798             "*/\r\n",
14799             format("/*\r\n"
14800                    "multi line block comments\r\n"
14801                    "should not introduce\r\n"
14802                    "an extra carriage return\r\n"
14803                    "*/\r\n"));
14804   EXPECT_EQ("/*\r\n"
14805             "\r\n"
14806             "*/",
14807             format("/*\r\n"
14808                    "    \r\r\r\n"
14809                    "*/"));
14810 
14811   FormatStyle style = getLLVMStyle();
14812 
14813   style.DeriveLineEnding = true;
14814   style.UseCRLF = false;
14815   EXPECT_EQ("union FooBarBazQux {\n"
14816             "  int foo;\n"
14817             "  int bar;\n"
14818             "  int baz;\n"
14819             "};",
14820             format("union FooBarBazQux {\r\n"
14821                    "  int foo;\n"
14822                    "  int bar;\r\n"
14823                    "  int baz;\n"
14824                    "};",
14825                    style));
14826   style.UseCRLF = true;
14827   EXPECT_EQ("union FooBarBazQux {\r\n"
14828             "  int foo;\r\n"
14829             "  int bar;\r\n"
14830             "  int baz;\r\n"
14831             "};",
14832             format("union FooBarBazQux {\r\n"
14833                    "  int foo;\n"
14834                    "  int bar;\r\n"
14835                    "  int baz;\n"
14836                    "};",
14837                    style));
14838 
14839   style.DeriveLineEnding = false;
14840   style.UseCRLF = false;
14841   EXPECT_EQ("union FooBarBazQux {\n"
14842             "  int foo;\n"
14843             "  int bar;\n"
14844             "  int baz;\n"
14845             "  int qux;\n"
14846             "};",
14847             format("union FooBarBazQux {\r\n"
14848                    "  int foo;\n"
14849                    "  int bar;\r\n"
14850                    "  int baz;\n"
14851                    "  int qux;\r\n"
14852                    "};",
14853                    style));
14854   style.UseCRLF = true;
14855   EXPECT_EQ("union FooBarBazQux {\r\n"
14856             "  int foo;\r\n"
14857             "  int bar;\r\n"
14858             "  int baz;\r\n"
14859             "  int qux;\r\n"
14860             "};",
14861             format("union FooBarBazQux {\r\n"
14862                    "  int foo;\n"
14863                    "  int bar;\r\n"
14864                    "  int baz;\n"
14865                    "  int qux;\n"
14866                    "};",
14867                    style));
14868 
14869   style.DeriveLineEnding = true;
14870   style.UseCRLF = false;
14871   EXPECT_EQ("union FooBarBazQux {\r\n"
14872             "  int foo;\r\n"
14873             "  int bar;\r\n"
14874             "  int baz;\r\n"
14875             "  int qux;\r\n"
14876             "};",
14877             format("union FooBarBazQux {\r\n"
14878                    "  int foo;\n"
14879                    "  int bar;\r\n"
14880                    "  int baz;\n"
14881                    "  int qux;\r\n"
14882                    "};",
14883                    style));
14884   style.UseCRLF = true;
14885   EXPECT_EQ("union FooBarBazQux {\n"
14886             "  int foo;\n"
14887             "  int bar;\n"
14888             "  int baz;\n"
14889             "  int qux;\n"
14890             "};",
14891             format("union FooBarBazQux {\r\n"
14892                    "  int foo;\n"
14893                    "  int bar;\r\n"
14894                    "  int baz;\n"
14895                    "  int qux;\n"
14896                    "};",
14897                    style));
14898 }
14899 
14900 TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
14901   verifyFormat("MY_CLASS(C) {\n"
14902                "  int i;\n"
14903                "  int j;\n"
14904                "};");
14905 }
14906 
14907 TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
14908   FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
14909   TwoIndent.ContinuationIndentWidth = 2;
14910 
14911   EXPECT_EQ("int i =\n"
14912             "  longFunction(\n"
14913             "    arg);",
14914             format("int i = longFunction(arg);", TwoIndent));
14915 
14916   FormatStyle SixIndent = getLLVMStyleWithColumns(20);
14917   SixIndent.ContinuationIndentWidth = 6;
14918 
14919   EXPECT_EQ("int i =\n"
14920             "      longFunction(\n"
14921             "            arg);",
14922             format("int i = longFunction(arg);", SixIndent));
14923 }
14924 
14925 TEST_F(FormatTest, WrappedClosingParenthesisIndent) {
14926   FormatStyle Style = getLLVMStyle();
14927   verifyFormat("int Foo::getter(\n"
14928                "    //\n"
14929                ") const {\n"
14930                "  return foo;\n"
14931                "}",
14932                Style);
14933   verifyFormat("void Foo::setter(\n"
14934                "    //\n"
14935                ") {\n"
14936                "  foo = 1;\n"
14937                "}",
14938                Style);
14939 }
14940 
14941 TEST_F(FormatTest, SpacesInAngles) {
14942   FormatStyle Spaces = getLLVMStyle();
14943   Spaces.SpacesInAngles = true;
14944 
14945   verifyFormat("static_cast< int >(arg);", Spaces);
14946   verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
14947   verifyFormat("f< int, float >();", Spaces);
14948   verifyFormat("template <> g() {}", Spaces);
14949   verifyFormat("template < std::vector< int > > f() {}", Spaces);
14950   verifyFormat("std::function< void(int, int) > fct;", Spaces);
14951   verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
14952                Spaces);
14953 
14954   Spaces.Standard = FormatStyle::LS_Cpp03;
14955   Spaces.SpacesInAngles = true;
14956   verifyFormat("A< A< int > >();", Spaces);
14957 
14958   Spaces.SpacesInAngles = false;
14959   verifyFormat("A<A<int> >();", Spaces);
14960 
14961   Spaces.Standard = FormatStyle::LS_Cpp11;
14962   Spaces.SpacesInAngles = true;
14963   verifyFormat("A< A< int > >();", Spaces);
14964 
14965   Spaces.SpacesInAngles = false;
14966   verifyFormat("A<A<int>>();", Spaces);
14967 }
14968 
14969 TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
14970   FormatStyle Style = getLLVMStyle();
14971   Style.SpaceAfterTemplateKeyword = false;
14972   verifyFormat("template<int> void foo();", Style);
14973 }
14974 
14975 TEST_F(FormatTest, TripleAngleBrackets) {
14976   verifyFormat("f<<<1, 1>>>();");
14977   verifyFormat("f<<<1, 1, 1, s>>>();");
14978   verifyFormat("f<<<a, b, c, d>>>();");
14979   EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
14980   verifyFormat("f<param><<<1, 1>>>();");
14981   verifyFormat("f<1><<<1, 1>>>();");
14982   EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
14983   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
14984                "aaaaaaaaaaa<<<\n    1, 1>>>();");
14985   verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
14986                "    <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
14987 }
14988 
14989 TEST_F(FormatTest, MergeLessLessAtEnd) {
14990   verifyFormat("<<");
14991   EXPECT_EQ("< < <", format("\\\n<<<"));
14992   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
14993                "aaallvm::outs() <<");
14994   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
14995                "aaaallvm::outs()\n    <<");
14996 }
14997 
14998 TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
14999   std::string code = "#if A\n"
15000                      "#if B\n"
15001                      "a.\n"
15002                      "#endif\n"
15003                      "    a = 1;\n"
15004                      "#else\n"
15005                      "#endif\n"
15006                      "#if C\n"
15007                      "#else\n"
15008                      "#endif\n";
15009   EXPECT_EQ(code, format(code));
15010 }
15011 
15012 TEST_F(FormatTest, HandleConflictMarkers) {
15013   // Git/SVN conflict markers.
15014   EXPECT_EQ("int a;\n"
15015             "void f() {\n"
15016             "  callme(some(parameter1,\n"
15017             "<<<<<<< text by the vcs\n"
15018             "              parameter2),\n"
15019             "||||||| text by the vcs\n"
15020             "              parameter2),\n"
15021             "         parameter3,\n"
15022             "======= text by the vcs\n"
15023             "              parameter2, parameter3),\n"
15024             ">>>>>>> text by the vcs\n"
15025             "         otherparameter);\n",
15026             format("int a;\n"
15027                    "void f() {\n"
15028                    "  callme(some(parameter1,\n"
15029                    "<<<<<<< text by the vcs\n"
15030                    "  parameter2),\n"
15031                    "||||||| text by the vcs\n"
15032                    "  parameter2),\n"
15033                    "  parameter3,\n"
15034                    "======= text by the vcs\n"
15035                    "  parameter2,\n"
15036                    "  parameter3),\n"
15037                    ">>>>>>> text by the vcs\n"
15038                    "  otherparameter);\n"));
15039 
15040   // Perforce markers.
15041   EXPECT_EQ("void f() {\n"
15042             "  function(\n"
15043             ">>>> text by the vcs\n"
15044             "      parameter,\n"
15045             "==== text by the vcs\n"
15046             "      parameter,\n"
15047             "==== text by the vcs\n"
15048             "      parameter,\n"
15049             "<<<< text by the vcs\n"
15050             "      parameter);\n",
15051             format("void f() {\n"
15052                    "  function(\n"
15053                    ">>>> text by the vcs\n"
15054                    "  parameter,\n"
15055                    "==== text by the vcs\n"
15056                    "  parameter,\n"
15057                    "==== text by the vcs\n"
15058                    "  parameter,\n"
15059                    "<<<< text by the vcs\n"
15060                    "  parameter);\n"));
15061 
15062   EXPECT_EQ("<<<<<<<\n"
15063             "|||||||\n"
15064             "=======\n"
15065             ">>>>>>>",
15066             format("<<<<<<<\n"
15067                    "|||||||\n"
15068                    "=======\n"
15069                    ">>>>>>>"));
15070 
15071   EXPECT_EQ("<<<<<<<\n"
15072             "|||||||\n"
15073             "int i;\n"
15074             "=======\n"
15075             ">>>>>>>",
15076             format("<<<<<<<\n"
15077                    "|||||||\n"
15078                    "int i;\n"
15079                    "=======\n"
15080                    ">>>>>>>"));
15081 
15082   // FIXME: Handle parsing of macros around conflict markers correctly:
15083   EXPECT_EQ("#define Macro \\\n"
15084             "<<<<<<<\n"
15085             "Something \\\n"
15086             "|||||||\n"
15087             "Else \\\n"
15088             "=======\n"
15089             "Other \\\n"
15090             ">>>>>>>\n"
15091             "    End int i;\n",
15092             format("#define Macro \\\n"
15093                    "<<<<<<<\n"
15094                    "  Something \\\n"
15095                    "|||||||\n"
15096                    "  Else \\\n"
15097                    "=======\n"
15098                    "  Other \\\n"
15099                    ">>>>>>>\n"
15100                    "  End\n"
15101                    "int i;\n"));
15102 }
15103 
15104 TEST_F(FormatTest, DisableRegions) {
15105   EXPECT_EQ("int i;\n"
15106             "// clang-format off\n"
15107             "  int j;\n"
15108             "// clang-format on\n"
15109             "int k;",
15110             format(" int  i;\n"
15111                    "   // clang-format off\n"
15112                    "  int j;\n"
15113                    " // clang-format on\n"
15114                    "   int   k;"));
15115   EXPECT_EQ("int i;\n"
15116             "/* clang-format off */\n"
15117             "  int j;\n"
15118             "/* clang-format on */\n"
15119             "int k;",
15120             format(" int  i;\n"
15121                    "   /* clang-format off */\n"
15122                    "  int j;\n"
15123                    " /* clang-format on */\n"
15124                    "   int   k;"));
15125 
15126   // Don't reflow comments within disabled regions.
15127   EXPECT_EQ("// clang-format off\n"
15128             "// long long long long long long line\n"
15129             "/* clang-format on */\n"
15130             "/* long long long\n"
15131             " * long long long\n"
15132             " * line */\n"
15133             "int i;\n"
15134             "/* clang-format off */\n"
15135             "/* long long long long long long line */\n",
15136             format("// clang-format off\n"
15137                    "// long long long long long long line\n"
15138                    "/* clang-format on */\n"
15139                    "/* long long long long long long line */\n"
15140                    "int i;\n"
15141                    "/* clang-format off */\n"
15142                    "/* long long long long long long line */\n",
15143                    getLLVMStyleWithColumns(20)));
15144 }
15145 
15146 TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
15147   format("? ) =");
15148   verifyNoCrash("#define a\\\n /**/}");
15149 }
15150 
15151 TEST_F(FormatTest, FormatsTableGenCode) {
15152   FormatStyle Style = getLLVMStyle();
15153   Style.Language = FormatStyle::LK_TableGen;
15154   verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
15155 }
15156 
15157 TEST_F(FormatTest, ArrayOfTemplates) {
15158   EXPECT_EQ("auto a = new unique_ptr<int>[10];",
15159             format("auto a = new unique_ptr<int > [ 10];"));
15160 
15161   FormatStyle Spaces = getLLVMStyle();
15162   Spaces.SpacesInSquareBrackets = true;
15163   EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
15164             format("auto a = new unique_ptr<int > [10];", Spaces));
15165 }
15166 
15167 TEST_F(FormatTest, ArrayAsTemplateType) {
15168   EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
15169             format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
15170 
15171   FormatStyle Spaces = getLLVMStyle();
15172   Spaces.SpacesInSquareBrackets = true;
15173   EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
15174             format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
15175 }
15176 
15177 TEST_F(FormatTest, NoSpaceAfterSuper) { verifyFormat("__super::FooBar();"); }
15178 
15179 TEST(FormatStyle, GetStyleWithEmptyFileName) {
15180   llvm::vfs::InMemoryFileSystem FS;
15181   auto Style1 = getStyle("file", "", "Google", "", &FS);
15182   ASSERT_TRUE((bool)Style1);
15183   ASSERT_EQ(*Style1, getGoogleStyle());
15184 }
15185 
15186 TEST(FormatStyle, GetStyleOfFile) {
15187   llvm::vfs::InMemoryFileSystem FS;
15188   // Test 1: format file in the same directory.
15189   ASSERT_TRUE(
15190       FS.addFile("/a/.clang-format", 0,
15191                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
15192   ASSERT_TRUE(
15193       FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
15194   auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
15195   ASSERT_TRUE((bool)Style1);
15196   ASSERT_EQ(*Style1, getLLVMStyle());
15197 
15198   // Test 2.1: fallback to default.
15199   ASSERT_TRUE(
15200       FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
15201   auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
15202   ASSERT_TRUE((bool)Style2);
15203   ASSERT_EQ(*Style2, getMozillaStyle());
15204 
15205   // Test 2.2: no format on 'none' fallback style.
15206   Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
15207   ASSERT_TRUE((bool)Style2);
15208   ASSERT_EQ(*Style2, getNoStyle());
15209 
15210   // Test 2.3: format if config is found with no based style while fallback is
15211   // 'none'.
15212   ASSERT_TRUE(FS.addFile("/b/.clang-format", 0,
15213                          llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2")));
15214   Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
15215   ASSERT_TRUE((bool)Style2);
15216   ASSERT_EQ(*Style2, getLLVMStyle());
15217 
15218   // Test 2.4: format if yaml with no based style, while fallback is 'none'.
15219   Style2 = getStyle("{}", "a.h", "none", "", &FS);
15220   ASSERT_TRUE((bool)Style2);
15221   ASSERT_EQ(*Style2, getLLVMStyle());
15222 
15223   // Test 3: format file in parent directory.
15224   ASSERT_TRUE(
15225       FS.addFile("/c/.clang-format", 0,
15226                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
15227   ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
15228                          llvm::MemoryBuffer::getMemBuffer("int i;")));
15229   auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
15230   ASSERT_TRUE((bool)Style3);
15231   ASSERT_EQ(*Style3, getGoogleStyle());
15232 
15233   // Test 4: error on invalid fallback style
15234   auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS);
15235   ASSERT_FALSE((bool)Style4);
15236   llvm::consumeError(Style4.takeError());
15237 
15238   // Test 5: error on invalid yaml on command line
15239   auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS);
15240   ASSERT_FALSE((bool)Style5);
15241   llvm::consumeError(Style5.takeError());
15242 
15243   // Test 6: error on invalid style
15244   auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS);
15245   ASSERT_FALSE((bool)Style6);
15246   llvm::consumeError(Style6.takeError());
15247 
15248   // Test 7: found config file, error on parsing it
15249   ASSERT_TRUE(
15250       FS.addFile("/d/.clang-format", 0,
15251                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n"
15252                                                   "InvalidKey: InvalidValue")));
15253   ASSERT_TRUE(
15254       FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
15255   auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS);
15256   ASSERT_FALSE((bool)Style7);
15257   llvm::consumeError(Style7.takeError());
15258 
15259   // Test 8: inferred per-language defaults apply.
15260   auto StyleTd = getStyle("file", "x.td", "llvm", "", &FS);
15261   ASSERT_TRUE((bool)StyleTd);
15262   ASSERT_EQ(*StyleTd, getLLVMStyle(FormatStyle::LK_TableGen));
15263 }
15264 
15265 TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
15266   // Column limit is 20.
15267   std::string Code = "Type *a =\n"
15268                      "    new Type();\n"
15269                      "g(iiiii, 0, jjjjj,\n"
15270                      "  0, kkkkk, 0, mm);\n"
15271                      "int  bad     = format   ;";
15272   std::string Expected = "auto a = new Type();\n"
15273                          "g(iiiii, nullptr,\n"
15274                          "  jjjjj, nullptr,\n"
15275                          "  kkkkk, nullptr,\n"
15276                          "  mm);\n"
15277                          "int  bad     = format   ;";
15278   FileID ID = Context.createInMemoryFile("format.cpp", Code);
15279   tooling::Replacements Replaces = toReplacements(
15280       {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
15281                             "auto "),
15282        tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
15283                             "nullptr"),
15284        tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
15285                             "nullptr"),
15286        tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
15287                             "nullptr")});
15288 
15289   format::FormatStyle Style = format::getLLVMStyle();
15290   Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
15291   auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
15292   EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
15293       << llvm::toString(FormattedReplaces.takeError()) << "\n";
15294   auto Result = applyAllReplacements(Code, *FormattedReplaces);
15295   EXPECT_TRUE(static_cast<bool>(Result));
15296   EXPECT_EQ(Expected, *Result);
15297 }
15298 
15299 TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
15300   std::string Code = "#include \"a.h\"\n"
15301                      "#include \"c.h\"\n"
15302                      "\n"
15303                      "int main() {\n"
15304                      "  return 0;\n"
15305                      "}";
15306   std::string Expected = "#include \"a.h\"\n"
15307                          "#include \"b.h\"\n"
15308                          "#include \"c.h\"\n"
15309                          "\n"
15310                          "int main() {\n"
15311                          "  return 0;\n"
15312                          "}";
15313   FileID ID = Context.createInMemoryFile("fix.cpp", Code);
15314   tooling::Replacements Replaces = toReplacements(
15315       {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
15316                             "#include \"b.h\"\n")});
15317 
15318   format::FormatStyle Style = format::getLLVMStyle();
15319   Style.SortIncludes = true;
15320   auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
15321   EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
15322       << llvm::toString(FormattedReplaces.takeError()) << "\n";
15323   auto Result = applyAllReplacements(Code, *FormattedReplaces);
15324   EXPECT_TRUE(static_cast<bool>(Result));
15325   EXPECT_EQ(Expected, *Result);
15326 }
15327 
15328 TEST_F(FormatTest, FormatSortsUsingDeclarations) {
15329   EXPECT_EQ("using std::cin;\n"
15330             "using std::cout;",
15331             format("using std::cout;\n"
15332                    "using std::cin;",
15333                    getGoogleStyle()));
15334 }
15335 
15336 TEST_F(FormatTest, UTF8CharacterLiteralCpp03) {
15337   format::FormatStyle Style = format::getLLVMStyle();
15338   Style.Standard = FormatStyle::LS_Cpp03;
15339   // cpp03 recognize this string as identifier u8 and literal character 'a'
15340   EXPECT_EQ("auto c = u8 'a';", format("auto c = u8'a';", Style));
15341 }
15342 
15343 TEST_F(FormatTest, UTF8CharacterLiteralCpp11) {
15344   // u8'a' is a C++17 feature, utf8 literal character, LS_Cpp11 covers
15345   // all modes, including C++11, C++14 and C++17
15346   EXPECT_EQ("auto c = u8'a';", format("auto c = u8'a';"));
15347 }
15348 
15349 TEST_F(FormatTest, DoNotFormatLikelyXml) {
15350   EXPECT_EQ("<!-- ;> -->", format("<!-- ;> -->", getGoogleStyle()));
15351   EXPECT_EQ(" <!-- >; -->", format(" <!-- >; -->", getGoogleStyle()));
15352 }
15353 
15354 TEST_F(FormatTest, StructuredBindings) {
15355   // Structured bindings is a C++17 feature.
15356   // all modes, including C++11, C++14 and C++17
15357   verifyFormat("auto [a, b] = f();");
15358   EXPECT_EQ("auto [a, b] = f();", format("auto[a, b] = f();"));
15359   EXPECT_EQ("const auto [a, b] = f();", format("const   auto[a, b] = f();"));
15360   EXPECT_EQ("auto const [a, b] = f();", format("auto  const[a, b] = f();"));
15361   EXPECT_EQ("auto const volatile [a, b] = f();",
15362             format("auto  const   volatile[a, b] = f();"));
15363   EXPECT_EQ("auto [a, b, c] = f();", format("auto   [  a  ,  b,c   ] = f();"));
15364   EXPECT_EQ("auto &[a, b, c] = f();",
15365             format("auto   &[  a  ,  b,c   ] = f();"));
15366   EXPECT_EQ("auto &&[a, b, c] = f();",
15367             format("auto   &&[  a  ,  b,c   ] = f();"));
15368   EXPECT_EQ("auto const &[a, b] = f();", format("auto  const&[a, b] = f();"));
15369   EXPECT_EQ("auto const volatile &&[a, b] = f();",
15370             format("auto  const  volatile  &&[a, b] = f();"));
15371   EXPECT_EQ("auto const &&[a, b] = f();",
15372             format("auto  const   &&  [a, b] = f();"));
15373   EXPECT_EQ("const auto &[a, b] = f();",
15374             format("const  auto  &  [a, b] = f();"));
15375   EXPECT_EQ("const auto volatile &&[a, b] = f();",
15376             format("const  auto   volatile  &&[a, b] = f();"));
15377   EXPECT_EQ("volatile const auto &&[a, b] = f();",
15378             format("volatile  const  auto   &&[a, b] = f();"));
15379   EXPECT_EQ("const auto &&[a, b] = f();",
15380             format("const  auto  &&  [a, b] = f();"));
15381 
15382   // Make sure we don't mistake structured bindings for lambdas.
15383   FormatStyle PointerMiddle = getLLVMStyle();
15384   PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
15385   verifyFormat("auto [a1, b]{A * i};", getGoogleStyle());
15386   verifyFormat("auto [a2, b]{A * i};", getLLVMStyle());
15387   verifyFormat("auto [a3, b]{A * i};", PointerMiddle);
15388   verifyFormat("auto const [a1, b]{A * i};", getGoogleStyle());
15389   verifyFormat("auto const [a2, b]{A * i};", getLLVMStyle());
15390   verifyFormat("auto const [a3, b]{A * i};", PointerMiddle);
15391   verifyFormat("auto const& [a1, b]{A * i};", getGoogleStyle());
15392   verifyFormat("auto const &[a2, b]{A * i};", getLLVMStyle());
15393   verifyFormat("auto const & [a3, b]{A * i};", PointerMiddle);
15394   verifyFormat("auto const&& [a1, b]{A * i};", getGoogleStyle());
15395   verifyFormat("auto const &&[a2, b]{A * i};", getLLVMStyle());
15396   verifyFormat("auto const && [a3, b]{A * i};", PointerMiddle);
15397 
15398   EXPECT_EQ("for (const auto &&[a, b] : some_range) {\n}",
15399             format("for (const auto   &&   [a, b] : some_range) {\n}"));
15400   EXPECT_EQ("for (const auto &[a, b] : some_range) {\n}",
15401             format("for (const auto   &   [a, b] : some_range) {\n}"));
15402   EXPECT_EQ("for (const auto [a, b] : some_range) {\n}",
15403             format("for (const auto[a, b] : some_range) {\n}"));
15404   EXPECT_EQ("auto [x, y](expr);", format("auto[x,y]  (expr);"));
15405   EXPECT_EQ("auto &[x, y](expr);", format("auto  &  [x,y]  (expr);"));
15406   EXPECT_EQ("auto &&[x, y](expr);", format("auto  &&  [x,y]  (expr);"));
15407   EXPECT_EQ("auto const &[x, y](expr);",
15408             format("auto  const  &  [x,y]  (expr);"));
15409   EXPECT_EQ("auto const &&[x, y](expr);",
15410             format("auto  const  &&  [x,y]  (expr);"));
15411   EXPECT_EQ("auto [x, y]{expr};", format("auto[x,y]     {expr};"));
15412   EXPECT_EQ("auto const &[x, y]{expr};",
15413             format("auto  const  &  [x,y]  {expr};"));
15414   EXPECT_EQ("auto const &&[x, y]{expr};",
15415             format("auto  const  &&  [x,y]  {expr};"));
15416 
15417   format::FormatStyle Spaces = format::getLLVMStyle();
15418   Spaces.SpacesInSquareBrackets = true;
15419   verifyFormat("auto [ a, b ] = f();", Spaces);
15420   verifyFormat("auto &&[ a, b ] = f();", Spaces);
15421   verifyFormat("auto &[ a, b ] = f();", Spaces);
15422   verifyFormat("auto const &&[ a, b ] = f();", Spaces);
15423   verifyFormat("auto const &[ a, b ] = f();", Spaces);
15424 }
15425 
15426 TEST_F(FormatTest, FileAndCode) {
15427   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.cc", ""));
15428   EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.m", ""));
15429   EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.mm", ""));
15430   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", ""));
15431   EXPECT_EQ(FormatStyle::LK_ObjC,
15432             guessLanguage("foo.h", "@interface Foo\n@end\n"));
15433   EXPECT_EQ(
15434       FormatStyle::LK_ObjC,
15435       guessLanguage("foo.h", "#define TRY(x, y) @try { x; } @finally { y; }"));
15436   EXPECT_EQ(FormatStyle::LK_ObjC,
15437             guessLanguage("foo.h", "#define AVAIL(x) @available(x, *))"));
15438   EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@class Foo;"));
15439   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo", ""));
15440   EXPECT_EQ(FormatStyle::LK_ObjC,
15441             guessLanguage("foo", "@interface Foo\n@end\n"));
15442   EXPECT_EQ(FormatStyle::LK_ObjC,
15443             guessLanguage("foo.h", "int DoStuff(CGRect rect);\n"));
15444   EXPECT_EQ(
15445       FormatStyle::LK_ObjC,
15446       guessLanguage("foo.h",
15447                     "#define MY_POINT_MAKE(x, y) CGPointMake((x), (y));\n"));
15448   EXPECT_EQ(
15449       FormatStyle::LK_Cpp,
15450       guessLanguage("foo.h", "#define FOO(...) auto bar = [] __VA_ARGS__;"));
15451 }
15452 
15453 TEST_F(FormatTest, GuessLanguageWithCpp11AttributeSpecifiers) {
15454   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[noreturn]];"));
15455   EXPECT_EQ(FormatStyle::LK_ObjC,
15456             guessLanguage("foo.h", "array[[calculator getIndex]];"));
15457   EXPECT_EQ(FormatStyle::LK_Cpp,
15458             guessLanguage("foo.h", "[[noreturn, deprecated(\"so sorry\")]];"));
15459   EXPECT_EQ(
15460       FormatStyle::LK_Cpp,
15461       guessLanguage("foo.h", "[[noreturn, deprecated(\"gone, sorry\")]];"));
15462   EXPECT_EQ(FormatStyle::LK_ObjC,
15463             guessLanguage("foo.h", "[[noreturn foo] bar];"));
15464   EXPECT_EQ(FormatStyle::LK_Cpp,
15465             guessLanguage("foo.h", "[[clang::fallthrough]];"));
15466   EXPECT_EQ(FormatStyle::LK_ObjC,
15467             guessLanguage("foo.h", "[[clang:fallthrough] foo];"));
15468   EXPECT_EQ(FormatStyle::LK_Cpp,
15469             guessLanguage("foo.h", "[[gsl::suppress(\"type\")]];"));
15470   EXPECT_EQ(FormatStyle::LK_Cpp,
15471             guessLanguage("foo.h", "[[using clang: fallthrough]];"));
15472   EXPECT_EQ(FormatStyle::LK_ObjC,
15473             guessLanguage("foo.h", "[[abusing clang:fallthrough] bar];"));
15474   EXPECT_EQ(FormatStyle::LK_Cpp,
15475             guessLanguage("foo.h", "[[using gsl: suppress(\"type\")]];"));
15476   EXPECT_EQ(
15477       FormatStyle::LK_Cpp,
15478       guessLanguage("foo.h", "for (auto &&[endpoint, stream] : streams_)"));
15479   EXPECT_EQ(
15480       FormatStyle::LK_Cpp,
15481       guessLanguage("foo.h",
15482                     "[[clang::callable_when(\"unconsumed\", \"unknown\")]]"));
15483   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[foo::bar, ...]]"));
15484 }
15485 
15486 TEST_F(FormatTest, GuessLanguageWithCaret) {
15487   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^);"));
15488   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^, Bar);"));
15489   EXPECT_EQ(FormatStyle::LK_ObjC,
15490             guessLanguage("foo.h", "int(^)(char, float);"));
15491   EXPECT_EQ(FormatStyle::LK_ObjC,
15492             guessLanguage("foo.h", "int(^foo)(char, float);"));
15493   EXPECT_EQ(FormatStyle::LK_ObjC,
15494             guessLanguage("foo.h", "int(^foo[10])(char, float);"));
15495   EXPECT_EQ(FormatStyle::LK_ObjC,
15496             guessLanguage("foo.h", "int(^foo[kNumEntries])(char, float);"));
15497   EXPECT_EQ(
15498       FormatStyle::LK_ObjC,
15499       guessLanguage("foo.h", "int(^foo[(kNumEntries + 10)])(char, float);"));
15500 }
15501 
15502 TEST_F(FormatTest, FormatsInlineAsmSymbolicNames) {
15503   // ASM symbolic names are identifiers that must be surrounded by [] without
15504   // space in between:
15505   // https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html#InputOperands
15506 
15507   // Example from https://bugs.llvm.org/show_bug.cgi?id=45108.
15508   verifyFormat(R"(//
15509 asm volatile("mrs %x[result], FPCR" : [result] "=r"(result));
15510 )");
15511 
15512   // A list of several ASM symbolic names.
15513   verifyFormat(R"(asm("mov %[e], %[d]" : [d] "=rm"(d), [e] "rm"(*e));)");
15514 
15515   // ASM symbolic names in inline ASM with inputs and outputs.
15516   verifyFormat(R"(//
15517 asm("cmoveq %1, %2, %[result]"
15518     : [result] "=r"(result)
15519     : "r"(test), "r"(new), "[result]"(old));
15520 )");
15521 
15522   // ASM symbolic names in inline ASM with no outputs.
15523   verifyFormat(R"(asm("mov %[e], %[d]" : : [d] "=rm"(d), [e] "rm"(*e));)");
15524 }
15525 
15526 TEST_F(FormatTest, GuessedLanguageWithInlineAsmClobbers) {
15527   EXPECT_EQ(FormatStyle::LK_Cpp,
15528             guessLanguage("foo.h", "void f() {\n"
15529                                    "  asm (\"mov %[e], %[d]\"\n"
15530                                    "     : [d] \"=rm\" (d)\n"
15531                                    "       [e] \"rm\" (*e));\n"
15532                                    "}"));
15533   EXPECT_EQ(FormatStyle::LK_Cpp,
15534             guessLanguage("foo.h", "void f() {\n"
15535                                    "  _asm (\"mov %[e], %[d]\"\n"
15536                                    "     : [d] \"=rm\" (d)\n"
15537                                    "       [e] \"rm\" (*e));\n"
15538                                    "}"));
15539   EXPECT_EQ(FormatStyle::LK_Cpp,
15540             guessLanguage("foo.h", "void f() {\n"
15541                                    "  __asm (\"mov %[e], %[d]\"\n"
15542                                    "     : [d] \"=rm\" (d)\n"
15543                                    "       [e] \"rm\" (*e));\n"
15544                                    "}"));
15545   EXPECT_EQ(FormatStyle::LK_Cpp,
15546             guessLanguage("foo.h", "void f() {\n"
15547                                    "  __asm__ (\"mov %[e], %[d]\"\n"
15548                                    "     : [d] \"=rm\" (d)\n"
15549                                    "       [e] \"rm\" (*e));\n"
15550                                    "}"));
15551   EXPECT_EQ(FormatStyle::LK_Cpp,
15552             guessLanguage("foo.h", "void f() {\n"
15553                                    "  asm (\"mov %[e], %[d]\"\n"
15554                                    "     : [d] \"=rm\" (d),\n"
15555                                    "       [e] \"rm\" (*e));\n"
15556                                    "}"));
15557   EXPECT_EQ(FormatStyle::LK_Cpp,
15558             guessLanguage("foo.h", "void f() {\n"
15559                                    "  asm volatile (\"mov %[e], %[d]\"\n"
15560                                    "     : [d] \"=rm\" (d)\n"
15561                                    "       [e] \"rm\" (*e));\n"
15562                                    "}"));
15563 }
15564 
15565 TEST_F(FormatTest, GuessLanguageWithChildLines) {
15566   EXPECT_EQ(FormatStyle::LK_Cpp,
15567             guessLanguage("foo.h", "#define FOO ({ std::string s; })"));
15568   EXPECT_EQ(FormatStyle::LK_ObjC,
15569             guessLanguage("foo.h", "#define FOO ({ NSString *s; })"));
15570   EXPECT_EQ(
15571       FormatStyle::LK_Cpp,
15572       guessLanguage("foo.h", "#define FOO ({ foo(); ({ std::string s; }) })"));
15573   EXPECT_EQ(
15574       FormatStyle::LK_ObjC,
15575       guessLanguage("foo.h", "#define FOO ({ foo(); ({ NSString *s; }) })"));
15576 }
15577 
15578 TEST_F(FormatTest, TypenameMacros) {
15579   std::vector<std::string> TypenameMacros = {"STACK_OF", "LIST", "TAILQ_ENTRY"};
15580 
15581   // Test case reported in https://bugs.llvm.org/show_bug.cgi?id=30353
15582   FormatStyle Google = getGoogleStyleWithColumns(0);
15583   Google.TypenameMacros = TypenameMacros;
15584   verifyFormat("struct foo {\n"
15585                "  int bar;\n"
15586                "  TAILQ_ENTRY(a) bleh;\n"
15587                "};",
15588                Google);
15589 
15590   FormatStyle Macros = getLLVMStyle();
15591   Macros.TypenameMacros = TypenameMacros;
15592 
15593   verifyFormat("STACK_OF(int) a;", Macros);
15594   verifyFormat("STACK_OF(int) *a;", Macros);
15595   verifyFormat("STACK_OF(int const *) *a;", Macros);
15596   verifyFormat("STACK_OF(int *const) *a;", Macros);
15597   verifyFormat("STACK_OF(int, string) a;", Macros);
15598   verifyFormat("STACK_OF(LIST(int)) a;", Macros);
15599   verifyFormat("STACK_OF(LIST(int)) a, b;", Macros);
15600   verifyFormat("for (LIST(int) *a = NULL; a;) {\n}", Macros);
15601   verifyFormat("STACK_OF(int) f(LIST(int) *arg);", Macros);
15602 
15603   Macros.PointerAlignment = FormatStyle::PAS_Left;
15604   verifyFormat("STACK_OF(int)* a;", Macros);
15605   verifyFormat("STACK_OF(int*)* a;", Macros);
15606 }
15607 
15608 TEST_F(FormatTest, AmbersandInLamda) {
15609   // Test case reported in https://bugs.llvm.org/show_bug.cgi?id=41899
15610   FormatStyle AlignStyle = getLLVMStyle();
15611   AlignStyle.PointerAlignment = FormatStyle::PAS_Left;
15612   verifyFormat("auto lambda = [&a = a]() { a = 2; };", AlignStyle);
15613   AlignStyle.PointerAlignment = FormatStyle::PAS_Right;
15614   verifyFormat("auto lambda = [&a = a]() { a = 2; };", AlignStyle);
15615 }
15616 
15617 TEST_F(FormatTest, SpacesInConditionalStatement) {
15618   FormatStyle Spaces = getLLVMStyle();
15619   Spaces.SpacesInConditionalStatement = true;
15620   verifyFormat("for ( int i = 0; i; i++ )\n  continue;", Spaces);
15621   verifyFormat("if ( !a )\n  return;", Spaces);
15622   verifyFormat("if ( a )\n  return;", Spaces);
15623   verifyFormat("if constexpr ( a )\n  return;", Spaces);
15624   verifyFormat("switch ( a )\ncase 1:\n  return;", Spaces);
15625   verifyFormat("while ( a )\n  return;", Spaces);
15626   verifyFormat("while ( (a && b) )\n  return;", Spaces);
15627   verifyFormat("do {\n} while ( 1 != 0 );", Spaces);
15628   verifyFormat("try {\n} catch ( const std::exception & ) {\n}", Spaces);
15629   // Check that space on the left of "::" is inserted as expected at beginning
15630   // of condition.
15631   verifyFormat("while ( ::func() )\n  return;", Spaces);
15632 }
15633 
15634 TEST_F(FormatTest, AlternativeOperators) {
15635   // Test case for ensuring alternate operators are not
15636   // combined with their right most neighbour.
15637   verifyFormat("int a and b;");
15638   verifyFormat("int a and_eq b;");
15639   verifyFormat("int a bitand b;");
15640   verifyFormat("int a bitor b;");
15641   verifyFormat("int a compl b;");
15642   verifyFormat("int a not b;");
15643   verifyFormat("int a not_eq b;");
15644   verifyFormat("int a or b;");
15645   verifyFormat("int a xor b;");
15646   verifyFormat("int a xor_eq b;");
15647   verifyFormat("return this not_eq bitand other;");
15648   verifyFormat("bool operator not_eq(const X bitand other)");
15649 
15650   verifyFormat("int a and 5;");
15651   verifyFormat("int a and_eq 5;");
15652   verifyFormat("int a bitand 5;");
15653   verifyFormat("int a bitor 5;");
15654   verifyFormat("int a compl 5;");
15655   verifyFormat("int a not 5;");
15656   verifyFormat("int a not_eq 5;");
15657   verifyFormat("int a or 5;");
15658   verifyFormat("int a xor 5;");
15659   verifyFormat("int a xor_eq 5;");
15660 
15661   verifyFormat("int a compl(5);");
15662   verifyFormat("int a not(5);");
15663 
15664   /* FIXME handle alternate tokens
15665    * https://en.cppreference.com/w/cpp/language/operator_alternative
15666   // alternative tokens
15667   verifyFormat("compl foo();");     //  ~foo();
15668   verifyFormat("foo() <%%>;");      // foo();
15669   verifyFormat("void foo() <%%>;"); // void foo(){}
15670   verifyFormat("int a <:1:>;");     // int a[1];[
15671   verifyFormat("%:define ABC abc"); // #define ABC abc
15672   verifyFormat("%:%:");             // ##
15673   */
15674 }
15675 
15676 TEST_F(FormatTest, STLWhileNotDefineChed) {
15677   verifyFormat("#if defined(while)\n"
15678                "#define while EMIT WARNING C4005\n"
15679                "#endif // while");
15680 }
15681 
15682 TEST_F(FormatTest, OperatorSpacing) {
15683   FormatStyle Style = getLLVMStyle();
15684   Style.PointerAlignment = FormatStyle::PAS_Right;
15685   verifyFormat("Foo::operator*();", Style);
15686   verifyFormat("Foo::operator void *();", Style);
15687   verifyFormat("Foo::operator void **();", Style);
15688   verifyFormat("Foo::operator()(void *);", Style);
15689   verifyFormat("Foo::operator*(void *);", Style);
15690   verifyFormat("Foo::operator*();", Style);
15691   verifyFormat("Foo::operator**();", Style);
15692   verifyFormat("Foo::operator&();", Style);
15693   verifyFormat("Foo::operator<int> *();", Style);
15694   verifyFormat("Foo::operator<Foo> *();", Style);
15695   verifyFormat("Foo::operator<int> **();", Style);
15696   verifyFormat("Foo::operator<Foo> **();", Style);
15697   verifyFormat("Foo::operator<int> &();", Style);
15698   verifyFormat("Foo::operator<Foo> &();", Style);
15699   verifyFormat("Foo::operator<int> &&();", Style);
15700   verifyFormat("Foo::operator<Foo> &&();", Style);
15701   verifyFormat("operator*(int (*)(), class Foo);", Style);
15702 
15703   verifyFormat("Foo::operator&();", Style);
15704   verifyFormat("Foo::operator void &();", Style);
15705   verifyFormat("Foo::operator()(void &);", Style);
15706   verifyFormat("Foo::operator&(void &);", Style);
15707   verifyFormat("Foo::operator&();", Style);
15708   verifyFormat("operator&(int (&)(), class Foo);", Style);
15709 
15710   verifyFormat("Foo::operator&&();", Style);
15711   verifyFormat("Foo::operator**();", Style);
15712   verifyFormat("Foo::operator void &&();", Style);
15713   verifyFormat("Foo::operator()(void &&);", Style);
15714   verifyFormat("Foo::operator&&(void &&);", Style);
15715   verifyFormat("Foo::operator&&();", Style);
15716   verifyFormat("operator&&(int(&&)(), class Foo);", Style);
15717   verifyFormat("operator const nsTArrayRight<E> &()", Style);
15718   verifyFormat("[[nodiscard]] operator const nsTArrayRight<E, Allocator> &()",
15719                Style);
15720   verifyFormat("operator void **()", Style);
15721   verifyFormat("operator const FooRight<Object> &()", Style);
15722   verifyFormat("operator const FooRight<Object> *()", Style);
15723   verifyFormat("operator const FooRight<Object> **()", Style);
15724 
15725   Style.PointerAlignment = FormatStyle::PAS_Left;
15726   verifyFormat("Foo::operator*();", Style);
15727   verifyFormat("Foo::operator**();", Style);
15728   verifyFormat("Foo::operator void*();", Style);
15729   verifyFormat("Foo::operator void**();", Style);
15730   verifyFormat("Foo::operator/*comment*/ void*();", Style);
15731   verifyFormat("Foo::operator/*a*/ const /*b*/ void*();", Style);
15732   verifyFormat("Foo::operator/*a*/ volatile /*b*/ void*();", Style);
15733   verifyFormat("Foo::operator()(void*);", Style);
15734   verifyFormat("Foo::operator*(void*);", Style);
15735   verifyFormat("Foo::operator*();", Style);
15736   verifyFormat("Foo::operator<int>*();", Style);
15737   verifyFormat("Foo::operator<Foo>*();", Style);
15738   verifyFormat("Foo::operator<int>**();", Style);
15739   verifyFormat("Foo::operator<Foo>**();", Style);
15740   verifyFormat("Foo::operator<int>&();", Style);
15741   verifyFormat("Foo::operator<Foo>&();", Style);
15742   verifyFormat("Foo::operator<int>&&();", Style);
15743   verifyFormat("Foo::operator<Foo>&&();", Style);
15744   verifyFormat("operator*(int (*)(), class Foo);", Style);
15745 
15746   verifyFormat("Foo::operator&();", Style);
15747   verifyFormat("Foo::operator void&();", Style);
15748   verifyFormat("Foo::operator/*comment*/ void&();", Style);
15749   verifyFormat("Foo::operator/*a*/ const /*b*/ void&();", Style);
15750   verifyFormat("Foo::operator/*a*/ volatile /*b*/ void&();", Style);
15751   verifyFormat("Foo::operator()(void&);", Style);
15752   verifyFormat("Foo::operator&(void&);", Style);
15753   verifyFormat("Foo::operator&();", Style);
15754   verifyFormat("operator&(int (&)(), class Foo);", Style);
15755 
15756   verifyFormat("Foo::operator&&();", Style);
15757   verifyFormat("Foo::operator void&&();", Style);
15758   verifyFormat("Foo::operator/*comment*/ void&&();", Style);
15759   verifyFormat("Foo::operator/*a*/ const /*b*/ void&&();", Style);
15760   verifyFormat("Foo::operator/*a*/ volatile /*b*/ void&&();", Style);
15761   verifyFormat("Foo::operator()(void&&);", Style);
15762   verifyFormat("Foo::operator&&(void&&);", Style);
15763   verifyFormat("Foo::operator&&();", Style);
15764   verifyFormat("operator&&(int(&&)(), class Foo);", Style);
15765   verifyFormat("operator const nsTArrayLeft<E>&()", Style);
15766   verifyFormat("[[nodiscard]] operator const nsTArrayLeft<E, Allocator>&()",
15767                Style);
15768   verifyFormat("operator void**()", Style);
15769   verifyFormat("operator const FooLeft<Object>&()", Style);
15770   verifyFormat("operator const FooLeft<Object>*()", Style);
15771   verifyFormat("operator const FooLeft<Object>**()", Style);
15772 
15773   // PR45107
15774   verifyFormat("operator Vector<String>&();", Style);
15775   verifyFormat("operator const Vector<String>&();", Style);
15776   verifyFormat("operator foo::Bar*();", Style);
15777   verifyFormat("operator const Foo<X>::Bar<Y>*();", Style);
15778   verifyFormat("operator/*a*/ const /*b*/ Foo /*c*/<X> /*d*/ ::Bar<Y>*();",
15779                Style);
15780 
15781   Style.PointerAlignment = FormatStyle::PAS_Middle;
15782   verifyFormat("Foo::operator*();", Style);
15783   verifyFormat("Foo::operator void *();", Style);
15784   verifyFormat("Foo::operator()(void *);", Style);
15785   verifyFormat("Foo::operator*(void *);", Style);
15786   verifyFormat("Foo::operator*();", Style);
15787   verifyFormat("operator*(int (*)(), class Foo);", Style);
15788 
15789   verifyFormat("Foo::operator&();", Style);
15790   verifyFormat("Foo::operator void &();", Style);
15791   verifyFormat("Foo::operator()(void &);", Style);
15792   verifyFormat("Foo::operator&(void &);", Style);
15793   verifyFormat("Foo::operator&();", Style);
15794   verifyFormat("operator&(int (&)(), class Foo);", Style);
15795 
15796   verifyFormat("Foo::operator&&();", Style);
15797   verifyFormat("Foo::operator void &&();", Style);
15798   verifyFormat("Foo::operator()(void &&);", Style);
15799   verifyFormat("Foo::operator&&(void &&);", Style);
15800   verifyFormat("Foo::operator&&();", Style);
15801   verifyFormat("operator&&(int(&&)(), class Foo);", Style);
15802 }
15803 
15804 } // namespace
15805 } // namespace format
15806 } // namespace clang
15807