1 //===- unittest/Format/FormatTest.cpp - Formatting unit tests -------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #include "clang/Format/Format.h"
11 
12 #include "../Tooling/ReplacementTest.h"
13 #include "FormatTestUtils.h"
14 
15 #include "clang/Frontend/TextDiagnosticPrinter.h"
16 #include "llvm/Support/Debug.h"
17 #include "llvm/Support/MemoryBuffer.h"
18 #include "gtest/gtest.h"
19 
20 #define DEBUG_TYPE "format-test"
21 
22 using clang::tooling::ReplacementTest;
23 using clang::tooling::toReplacements;
24 
25 namespace clang {
26 namespace format {
27 namespace {
28 
29 FormatStyle getGoogleStyle() { return getGoogleStyle(FormatStyle::LK_Cpp); }
30 
31 class FormatTest : public ::testing::Test {
32 protected:
33   enum StatusCheck {
34     SC_ExpectComplete,
35     SC_ExpectIncomplete,
36     SC_DoNotCheck
37   };
38 
39   std::string format(llvm::StringRef Code,
40                      const FormatStyle &Style = getLLVMStyle(),
41                      StatusCheck CheckComplete = SC_ExpectComplete) {
42     DEBUG(llvm::errs() << "---\n");
43     DEBUG(llvm::errs() << Code << "\n\n");
44     std::vector<tooling::Range> Ranges(1, tooling::Range(0, Code.size()));
45     FormattingAttemptStatus Status;
46     tooling::Replacements Replaces =
47         reformat(Style, Code, Ranges, "<stdin>", &Status);
48     if (CheckComplete != SC_DoNotCheck) {
49       bool ExpectedCompleteFormat = CheckComplete == SC_ExpectComplete;
50       EXPECT_EQ(ExpectedCompleteFormat, Status.FormatComplete)
51           << Code << "\n\n";
52     }
53     ReplacementCount = Replaces.size();
54     auto Result = applyAllReplacements(Code, Replaces);
55     EXPECT_TRUE(static_cast<bool>(Result));
56     DEBUG(llvm::errs() << "\n" << *Result << "\n\n");
57     return *Result;
58   }
59 
60   FormatStyle getStyleWithColumns(FormatStyle Style, unsigned ColumnLimit) {
61     Style.ColumnLimit = ColumnLimit;
62     return Style;
63   }
64 
65   FormatStyle getLLVMStyleWithColumns(unsigned ColumnLimit) {
66     return getStyleWithColumns(getLLVMStyle(), ColumnLimit);
67   }
68 
69   FormatStyle getGoogleStyleWithColumns(unsigned ColumnLimit) {
70     return getStyleWithColumns(getGoogleStyle(), ColumnLimit);
71   }
72 
73   void verifyFormat(llvm::StringRef Code,
74                     const FormatStyle &Style = getLLVMStyle()) {
75     EXPECT_EQ(Code.str(), format(test::messUp(Code), Style));
76     if (Style.Language == FormatStyle::LK_Cpp) {
77       // Objective-C++ is a superset of C++, so everything checked for C++
78       // needs to be checked for Objective-C++ as well.
79       FormatStyle ObjCStyle = Style;
80       ObjCStyle.Language = FormatStyle::LK_ObjC;
81       EXPECT_EQ(Code.str(), format(test::messUp(Code), ObjCStyle));
82     }
83   }
84 
85   void verifyIncompleteFormat(llvm::StringRef Code,
86                               const FormatStyle &Style = getLLVMStyle()) {
87     EXPECT_EQ(Code.str(),
88               format(test::messUp(Code), Style, SC_ExpectIncomplete));
89   }
90 
91   void verifyGoogleFormat(llvm::StringRef Code) {
92     verifyFormat(Code, getGoogleStyle());
93   }
94 
95   void verifyIndependentOfContext(llvm::StringRef text) {
96     verifyFormat(text);
97     verifyFormat(llvm::Twine("void f() { " + text + " }").str());
98   }
99 
100   /// \brief Verify that clang-format does not crash on the given input.
101   void verifyNoCrash(llvm::StringRef Code,
102                      const FormatStyle &Style = getLLVMStyle()) {
103     format(Code, Style, SC_DoNotCheck);
104   }
105 
106   int ReplacementCount;
107 };
108 
109 TEST_F(FormatTest, MessUp) {
110   EXPECT_EQ("1 2 3", test::messUp("1 2 3"));
111   EXPECT_EQ("1 2 3\n", test::messUp("1\n2\n3\n"));
112   EXPECT_EQ("a\n//b\nc", test::messUp("a\n//b\nc"));
113   EXPECT_EQ("a\n#b\nc", test::messUp("a\n#b\nc"));
114   EXPECT_EQ("a\n#b c d\ne", test::messUp("a\n#b\\\nc\\\nd\ne"));
115 }
116 
117 //===----------------------------------------------------------------------===//
118 // Basic function tests.
119 //===----------------------------------------------------------------------===//
120 
121 TEST_F(FormatTest, DoesNotChangeCorrectlyFormattedCode) {
122   EXPECT_EQ(";", format(";"));
123 }
124 
125 TEST_F(FormatTest, FormatsGlobalStatementsAt0) {
126   EXPECT_EQ("int i;", format("  int i;"));
127   EXPECT_EQ("\nint i;", format(" \n\t \v \f  int i;"));
128   EXPECT_EQ("int i;\nint j;", format("    int i; int j;"));
129   EXPECT_EQ("int i;\nint j;", format("    int i;\n  int j;"));
130 }
131 
132 TEST_F(FormatTest, FormatsUnwrappedLinesAtFirstFormat) {
133   EXPECT_EQ("int i;", format("int\ni;"));
134 }
135 
136 TEST_F(FormatTest, FormatsNestedBlockStatements) {
137   EXPECT_EQ("{\n  {\n    {}\n  }\n}", format("{{{}}}"));
138 }
139 
140 TEST_F(FormatTest, FormatsNestedCall) {
141   verifyFormat("Method(f1, f2(f3));");
142   verifyFormat("Method(f1(f2, f3()));");
143   verifyFormat("Method(f1(f2, (f3())));");
144 }
145 
146 TEST_F(FormatTest, NestedNameSpecifiers) {
147   verifyFormat("vector<::Type> v;");
148   verifyFormat("::ns::SomeFunction(::ns::SomeOtherFunction())");
149   verifyFormat("static constexpr bool Bar = decltype(bar())::value;");
150   verifyFormat("bool a = 2 < ::SomeFunction();");
151   verifyFormat("ALWAYS_INLINE ::std::string getName();");
152   verifyFormat("some::string getName();");
153 }
154 
155 TEST_F(FormatTest, OnlyGeneratesNecessaryReplacements) {
156   EXPECT_EQ("if (a) {\n"
157             "  f();\n"
158             "}",
159             format("if(a){f();}"));
160   EXPECT_EQ(4, ReplacementCount);
161   EXPECT_EQ("if (a) {\n"
162             "  f();\n"
163             "}",
164             format("if (a) {\n"
165                    "  f();\n"
166                    "}"));
167   EXPECT_EQ(0, ReplacementCount);
168   EXPECT_EQ("/*\r\n"
169             "\r\n"
170             "*/\r\n",
171             format("/*\r\n"
172                    "\r\n"
173                    "*/\r\n"));
174   EXPECT_EQ(0, ReplacementCount);
175 }
176 
177 TEST_F(FormatTest, RemovesEmptyLines) {
178   EXPECT_EQ("class C {\n"
179             "  int i;\n"
180             "};",
181             format("class C {\n"
182                    " int i;\n"
183                    "\n"
184                    "};"));
185 
186   // Don't remove empty lines at the start of namespaces or extern "C" blocks.
187   EXPECT_EQ("namespace N {\n"
188             "\n"
189             "int i;\n"
190             "}",
191             format("namespace N {\n"
192                    "\n"
193                    "int    i;\n"
194                    "}",
195                    getGoogleStyle()));
196   EXPECT_EQ("extern /**/ \"C\" /**/ {\n"
197             "\n"
198             "int i;\n"
199             "}",
200             format("extern /**/ \"C\" /**/ {\n"
201                    "\n"
202                    "int    i;\n"
203                    "}",
204                    getGoogleStyle()));
205 
206   // ...but do keep inlining and removing empty lines for non-block extern "C"
207   // functions.
208   verifyFormat("extern \"C\" int f() { return 42; }", getGoogleStyle());
209   EXPECT_EQ("extern \"C\" int f() {\n"
210             "  int i = 42;\n"
211             "  return i;\n"
212             "}",
213             format("extern \"C\" int f() {\n"
214                    "\n"
215                    "  int i = 42;\n"
216                    "  return i;\n"
217                    "}",
218                    getGoogleStyle()));
219 
220   // Remove empty lines at the beginning and end of blocks.
221   EXPECT_EQ("void f() {\n"
222             "\n"
223             "  if (a) {\n"
224             "\n"
225             "    f();\n"
226             "  }\n"
227             "}",
228             format("void f() {\n"
229                    "\n"
230                    "  if (a) {\n"
231                    "\n"
232                    "    f();\n"
233                    "\n"
234                    "  }\n"
235                    "\n"
236                    "}",
237                    getLLVMStyle()));
238   EXPECT_EQ("void f() {\n"
239             "  if (a) {\n"
240             "    f();\n"
241             "  }\n"
242             "}",
243             format("void f() {\n"
244                    "\n"
245                    "  if (a) {\n"
246                    "\n"
247                    "    f();\n"
248                    "\n"
249                    "  }\n"
250                    "\n"
251                    "}",
252                    getGoogleStyle()));
253 
254   // Don't remove empty lines in more complex control statements.
255   EXPECT_EQ("void f() {\n"
256             "  if (a) {\n"
257             "    f();\n"
258             "\n"
259             "  } else if (b) {\n"
260             "    f();\n"
261             "  }\n"
262             "}",
263             format("void f() {\n"
264                    "  if (a) {\n"
265                    "    f();\n"
266                    "\n"
267                    "  } else if (b) {\n"
268                    "    f();\n"
269                    "\n"
270                    "  }\n"
271                    "\n"
272                    "}"));
273 
274   // FIXME: This is slightly inconsistent.
275   FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle();
276   LLVMWithNoNamespaceFix.FixNamespaceComments = false;
277   EXPECT_EQ("namespace {\n"
278             "int i;\n"
279             "}",
280             format("namespace {\n"
281                    "int i;\n"
282                    "\n"
283                    "}", LLVMWithNoNamespaceFix));
284   EXPECT_EQ("namespace {\n"
285             "int i;\n"
286             "}",
287             format("namespace {\n"
288                    "int i;\n"
289                    "\n"
290                    "}"));
291   EXPECT_EQ("namespace {\n"
292             "int i;\n"
293             "\n"
294             "} // namespace",
295             format("namespace {\n"
296                    "int i;\n"
297                    "\n"
298                    "}  // namespace"));
299 
300   FormatStyle Style = getLLVMStyle();
301   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
302   Style.MaxEmptyLinesToKeep = 2;
303   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
304   Style.BraceWrapping.AfterClass = true;
305   Style.BraceWrapping.AfterFunction = true;
306   Style.KeepEmptyLinesAtTheStartOfBlocks = false;
307 
308   EXPECT_EQ("class Foo\n"
309             "{\n"
310             "  Foo() {}\n"
311             "\n"
312             "  void funk() {}\n"
313             "};",
314             format("class Foo\n"
315                    "{\n"
316                    "  Foo()\n"
317                    "  {\n"
318                    "  }\n"
319                    "\n"
320                    "  void funk() {}\n"
321                    "};",
322                    Style));
323 }
324 
325 TEST_F(FormatTest, RecognizesBinaryOperatorKeywords) {
326   verifyFormat("x = (a) and (b);");
327   verifyFormat("x = (a) or (b);");
328   verifyFormat("x = (a) bitand (b);");
329   verifyFormat("x = (a) bitor (b);");
330   verifyFormat("x = (a) not_eq (b);");
331   verifyFormat("x = (a) and_eq (b);");
332   verifyFormat("x = (a) or_eq (b);");
333   verifyFormat("x = (a) xor (b);");
334 }
335 
336 TEST_F(FormatTest, RecognizesUnaryOperatorKeywords) {
337   verifyFormat("x = compl(a);");
338   verifyFormat("x = not(a);");
339   verifyFormat("x = bitand(a);");
340   // Unary operator must not be merged with the next identifier
341   verifyFormat("x = compl a;");
342   verifyFormat("x = not a;");
343   verifyFormat("x = bitand a;");
344 }
345 
346 //===----------------------------------------------------------------------===//
347 // Tests for control statements.
348 //===----------------------------------------------------------------------===//
349 
350 TEST_F(FormatTest, FormatIfWithoutCompoundStatement) {
351   verifyFormat("if (true)\n  f();\ng();");
352   verifyFormat("if (a)\n  if (b)\n    if (c)\n      g();\nh();");
353   verifyFormat("if (a)\n  if (b) {\n    f();\n  }\ng();");
354   verifyFormat("if constexpr (true)\n"
355                "  f();\ng();");
356   verifyFormat("if constexpr (a)\n"
357                "  if constexpr (b)\n"
358                "    if constexpr (c)\n"
359                "      g();\n"
360                "h();");
361   verifyFormat("if constexpr (a)\n"
362                "  if constexpr (b) {\n"
363                "    f();\n"
364                "  }\n"
365                "g();");
366 
367   FormatStyle AllowsMergedIf = getLLVMStyle();
368   AllowsMergedIf.AlignEscapedNewlines = FormatStyle::ENAS_Left;
369   AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
370   verifyFormat("if (a)\n"
371                "  // comment\n"
372                "  f();",
373                AllowsMergedIf);
374   verifyFormat("{\n"
375                "  if (a)\n"
376                "  label:\n"
377                "    f();\n"
378                "}",
379                AllowsMergedIf);
380   verifyFormat("#define A \\\n"
381                "  if (a)  \\\n"
382                "  label:  \\\n"
383                "    f()",
384                AllowsMergedIf);
385   verifyFormat("if (a)\n"
386                "  ;",
387                AllowsMergedIf);
388   verifyFormat("if (a)\n"
389                "  if (b) return;",
390                AllowsMergedIf);
391 
392   verifyFormat("if (a) // Can't merge this\n"
393                "  f();\n",
394                AllowsMergedIf);
395   verifyFormat("if (a) /* still don't merge */\n"
396                "  f();",
397                AllowsMergedIf);
398   verifyFormat("if (a) { // Never merge this\n"
399                "  f();\n"
400                "}",
401                AllowsMergedIf);
402   verifyFormat("if (a) { /* Never merge this */\n"
403                "  f();\n"
404                "}",
405                AllowsMergedIf);
406 
407   AllowsMergedIf.ColumnLimit = 14;
408   verifyFormat("if (a) return;", AllowsMergedIf);
409   verifyFormat("if (aaaaaaaaa)\n"
410                "  return;",
411                AllowsMergedIf);
412 
413   AllowsMergedIf.ColumnLimit = 13;
414   verifyFormat("if (a)\n  return;", AllowsMergedIf);
415 }
416 
417 TEST_F(FormatTest, FormatLoopsWithoutCompoundStatement) {
418   FormatStyle AllowsMergedLoops = getLLVMStyle();
419   AllowsMergedLoops.AllowShortLoopsOnASingleLine = true;
420   verifyFormat("while (true) continue;", AllowsMergedLoops);
421   verifyFormat("for (;;) continue;", AllowsMergedLoops);
422   verifyFormat("for (int &v : vec) v *= 2;", AllowsMergedLoops);
423   verifyFormat("while (true)\n"
424                "  ;",
425                AllowsMergedLoops);
426   verifyFormat("for (;;)\n"
427                "  ;",
428                AllowsMergedLoops);
429   verifyFormat("for (;;)\n"
430                "  for (;;) continue;",
431                AllowsMergedLoops);
432   verifyFormat("for (;;) // Can't merge this\n"
433                "  continue;",
434                AllowsMergedLoops);
435   verifyFormat("for (;;) /* still don't merge */\n"
436                "  continue;",
437                AllowsMergedLoops);
438 }
439 
440 TEST_F(FormatTest, FormatShortBracedStatements) {
441   FormatStyle AllowSimpleBracedStatements = getLLVMStyle();
442   AllowSimpleBracedStatements.ColumnLimit = 40;
443   AllowSimpleBracedStatements.AllowShortBlocksOnASingleLine = true;
444 
445   AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = true;
446   AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true;
447 
448   AllowSimpleBracedStatements.BreakBeforeBraces = FormatStyle::BS_Custom;
449   AllowSimpleBracedStatements.BraceWrapping.AfterFunction = true;
450   AllowSimpleBracedStatements.BraceWrapping.SplitEmptyRecord = false;
451 
452   verifyFormat("if (true) {}", AllowSimpleBracedStatements);
453   verifyFormat("if constexpr (true) {}", AllowSimpleBracedStatements);
454   verifyFormat("while (true) {}", AllowSimpleBracedStatements);
455   verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
456   verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements);
457   verifyFormat("if constexpr (true) { f(); }", AllowSimpleBracedStatements);
458   verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements);
459   verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements);
460   verifyFormat("if (true) {\n"
461                "  ffffffffffffffffffffffffffffffffffffffffffffffffffffff();\n"
462                "}",
463                AllowSimpleBracedStatements);
464   verifyFormat("if (true) { //\n"
465                "  f();\n"
466                "}",
467                AllowSimpleBracedStatements);
468   verifyFormat("if (true) {\n"
469                "  f();\n"
470                "  f();\n"
471                "}",
472                AllowSimpleBracedStatements);
473   verifyFormat("if (true) {\n"
474                "  f();\n"
475                "} else {\n"
476                "  f();\n"
477                "}",
478                AllowSimpleBracedStatements);
479 
480   verifyFormat("struct A2 {\n"
481                "  int X;\n"
482                "};",
483                AllowSimpleBracedStatements);
484   verifyFormat("typedef struct A2 {\n"
485                "  int X;\n"
486                "} A2_t;",
487                AllowSimpleBracedStatements);
488   verifyFormat("template <int> struct A2 {\n"
489                "  struct B {};\n"
490                "};",
491                AllowSimpleBracedStatements);
492 
493   AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = false;
494   verifyFormat("if (true) {}", AllowSimpleBracedStatements);
495   verifyFormat("if (true) {\n"
496                "  f();\n"
497                "}",
498                AllowSimpleBracedStatements);
499   verifyFormat("if (true) {\n"
500                "  f();\n"
501                "} else {\n"
502                "  f();\n"
503                "}",
504                AllowSimpleBracedStatements);
505 
506   AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false;
507   verifyFormat("while (true) {}", AllowSimpleBracedStatements);
508   verifyFormat("while (true) {\n"
509                "  f();\n"
510                "}",
511                AllowSimpleBracedStatements);
512   verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
513   verifyFormat("for (;;) {\n"
514                "  f();\n"
515                "}",
516                AllowSimpleBracedStatements);
517 
518   AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = true;
519   AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true;
520   AllowSimpleBracedStatements.BraceWrapping.AfterControlStatement = true;
521 
522   verifyFormat("if (true) {}", AllowSimpleBracedStatements);
523   verifyFormat("if constexpr (true) {}", AllowSimpleBracedStatements);
524   verifyFormat("while (true) {}", AllowSimpleBracedStatements);
525   verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
526   verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements);
527   verifyFormat("if constexpr (true) { f(); }", AllowSimpleBracedStatements);
528   verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements);
529   verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements);
530   verifyFormat("if (true)\n"
531                "{\n"
532                "  ffffffffffffffffffffffffffffffffffffffffffffffffffffff();\n"
533                "}",
534                AllowSimpleBracedStatements);
535   verifyFormat("if (true)\n"
536                "{ //\n"
537                "  f();\n"
538                "}",
539                AllowSimpleBracedStatements);
540   verifyFormat("if (true)\n"
541                "{\n"
542                "  f();\n"
543                "  f();\n"
544                "}",
545                AllowSimpleBracedStatements);
546   verifyFormat("if (true)\n"
547                "{\n"
548                "  f();\n"
549                "} else\n"
550                "{\n"
551                "  f();\n"
552                "}",
553                AllowSimpleBracedStatements);
554 
555   AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = false;
556   verifyFormat("if (true) {}", AllowSimpleBracedStatements);
557   verifyFormat("if (true)\n"
558                "{\n"
559                "  f();\n"
560                "}",
561                AllowSimpleBracedStatements);
562   verifyFormat("if (true)\n"
563                "{\n"
564                "  f();\n"
565                "} else\n"
566                "{\n"
567                "  f();\n"
568                "}",
569                AllowSimpleBracedStatements);
570 
571   AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false;
572   verifyFormat("while (true) {}", AllowSimpleBracedStatements);
573   verifyFormat("while (true)\n"
574                "{\n"
575                "  f();\n"
576                "}",
577                AllowSimpleBracedStatements);
578   verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
579   verifyFormat("for (;;)\n"
580                "{\n"
581                "  f();\n"
582                "}",
583                AllowSimpleBracedStatements);
584 }
585 
586 TEST_F(FormatTest, ParseIfElse) {
587   verifyFormat("if (true)\n"
588                "  if (true)\n"
589                "    if (true)\n"
590                "      f();\n"
591                "    else\n"
592                "      g();\n"
593                "  else\n"
594                "    h();\n"
595                "else\n"
596                "  i();");
597   verifyFormat("if (true)\n"
598                "  if (true)\n"
599                "    if (true) {\n"
600                "      if (true)\n"
601                "        f();\n"
602                "    } else {\n"
603                "      g();\n"
604                "    }\n"
605                "  else\n"
606                "    h();\n"
607                "else {\n"
608                "  i();\n"
609                "}");
610   verifyFormat("if (true)\n"
611                "  if constexpr (true)\n"
612                "    if (true) {\n"
613                "      if constexpr (true)\n"
614                "        f();\n"
615                "    } else {\n"
616                "      g();\n"
617                "    }\n"
618                "  else\n"
619                "    h();\n"
620                "else {\n"
621                "  i();\n"
622                "}");
623   verifyFormat("void f() {\n"
624                "  if (a) {\n"
625                "  } else {\n"
626                "  }\n"
627                "}");
628 }
629 
630 TEST_F(FormatTest, ElseIf) {
631   verifyFormat("if (a) {\n} else if (b) {\n}");
632   verifyFormat("if (a)\n"
633                "  f();\n"
634                "else if (b)\n"
635                "  g();\n"
636                "else\n"
637                "  h();");
638   verifyFormat("if constexpr (a)\n"
639                "  f();\n"
640                "else if constexpr (b)\n"
641                "  g();\n"
642                "else\n"
643                "  h();");
644   verifyFormat("if (a) {\n"
645                "  f();\n"
646                "}\n"
647                "// or else ..\n"
648                "else {\n"
649                "  g()\n"
650                "}");
651 
652   verifyFormat("if (a) {\n"
653                "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
654                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
655                "}");
656   verifyFormat("if (a) {\n"
657                "} else if (\n"
658                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
659                "}",
660                getLLVMStyleWithColumns(62));
661   verifyFormat("if (a) {\n"
662                "} else if constexpr (\n"
663                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
664                "}",
665                getLLVMStyleWithColumns(62));
666 }
667 
668 TEST_F(FormatTest, FormatsForLoop) {
669   verifyFormat(
670       "for (int VeryVeryLongLoopVariable = 0; VeryVeryLongLoopVariable < 10;\n"
671       "     ++VeryVeryLongLoopVariable)\n"
672       "  ;");
673   verifyFormat("for (;;)\n"
674                "  f();");
675   verifyFormat("for (;;) {\n}");
676   verifyFormat("for (;;) {\n"
677                "  f();\n"
678                "}");
679   verifyFormat("for (int i = 0; (i < 10); ++i) {\n}");
680 
681   verifyFormat(
682       "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
683       "                                          E = UnwrappedLines.end();\n"
684       "     I != E; ++I) {\n}");
685 
686   verifyFormat(
687       "for (MachineFun::iterator IIII = PrevIt, EEEE = F.end(); IIII != EEEE;\n"
688       "     ++IIIII) {\n}");
689   verifyFormat("for (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaa =\n"
690                "         aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa;\n"
691                "     aaaaaaaaaaa != aaaaaaaaaaaaaaaaaaa; ++aaaaaaaaaaa) {\n}");
692   verifyFormat("for (llvm::ArrayRef<NamedDecl *>::iterator\n"
693                "         I = FD->getDeclsInPrototypeScope().begin(),\n"
694                "         E = FD->getDeclsInPrototypeScope().end();\n"
695                "     I != E; ++I) {\n}");
696   verifyFormat("for (SmallVectorImpl<TemplateIdAnnotationn *>::iterator\n"
697                "         I = Container.begin(),\n"
698                "         E = Container.end();\n"
699                "     I != E; ++I) {\n}",
700                getLLVMStyleWithColumns(76));
701 
702   verifyFormat(
703       "for (aaaaaaaaaaaaaaaaa aaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
704       "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa !=\n"
705       "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
706       "         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
707       "     ++aaaaaaaaaaa) {\n}");
708   verifyFormat("for (int i = 0; i < aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
709                "                bbbbbbbbbbbbbbbbbbbb < ccccccccccccccc;\n"
710                "     ++i) {\n}");
711   verifyFormat("for (int aaaaaaaaaaa = 1; aaaaaaaaaaa <= bbbbbbbbbbbbbbb;\n"
712                "     aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
713                "}");
714   verifyFormat("for (some_namespace::SomeIterator iter( // force break\n"
715                "         aaaaaaaaaa);\n"
716                "     iter; ++iter) {\n"
717                "}");
718   verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
719                "         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
720                "     aaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbbbbbbb;\n"
721                "     ++aaaaaaaaaaaaaaaaaaaaaaaaaaa) {");
722 
723   FormatStyle NoBinPacking = getLLVMStyle();
724   NoBinPacking.BinPackParameters = false;
725   verifyFormat("for (int aaaaaaaaaaa = 1;\n"
726                "     aaaaaaaaaaa <= aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa,\n"
727                "                                           aaaaaaaaaaaaaaaa,\n"
728                "                                           aaaaaaaaaaaaaaaa,\n"
729                "                                           aaaaaaaaaaaaaaaa);\n"
730                "     aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
731                "}",
732                NoBinPacking);
733   verifyFormat(
734       "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
735       "                                          E = UnwrappedLines.end();\n"
736       "     I != E;\n"
737       "     ++I) {\n}",
738       NoBinPacking);
739 
740   FormatStyle AlignLeft = getLLVMStyle();
741   AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
742   verifyFormat("for (A* a = start; a < end; ++a, ++value) {\n}", AlignLeft);
743 }
744 
745 TEST_F(FormatTest, RangeBasedForLoops) {
746   verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
747                "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
748   verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaa :\n"
749                "     aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa, aaaaaaaaaaaaa)) {\n}");
750   verifyFormat("for (const aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaa :\n"
751                "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
752   verifyFormat("for (aaaaaaaaa aaaaaaaaaaaaaaaaaaaaa :\n"
753                "     aaaaaaaaaaaa.aaaaaaaaaaaa().aaaaaaaaa().a()) {\n}");
754 }
755 
756 TEST_F(FormatTest, ForEachLoops) {
757   verifyFormat("void f() {\n"
758                "  foreach (Item *item, itemlist) {}\n"
759                "  Q_FOREACH (Item *item, itemlist) {}\n"
760                "  BOOST_FOREACH (Item *item, itemlist) {}\n"
761                "  UNKNOWN_FORACH(Item * item, itemlist) {}\n"
762                "}");
763 
764   // As function-like macros.
765   verifyFormat("#define foreach(x, y)\n"
766                "#define Q_FOREACH(x, y)\n"
767                "#define BOOST_FOREACH(x, y)\n"
768                "#define UNKNOWN_FOREACH(x, y)\n");
769 
770   // Not as function-like macros.
771   verifyFormat("#define foreach (x, y)\n"
772                "#define Q_FOREACH (x, y)\n"
773                "#define BOOST_FOREACH (x, y)\n"
774                "#define UNKNOWN_FOREACH (x, y)\n");
775 }
776 
777 TEST_F(FormatTest, FormatsWhileLoop) {
778   verifyFormat("while (true) {\n}");
779   verifyFormat("while (true)\n"
780                "  f();");
781   verifyFormat("while () {\n}");
782   verifyFormat("while () {\n"
783                "  f();\n"
784                "}");
785 }
786 
787 TEST_F(FormatTest, FormatsDoWhile) {
788   verifyFormat("do {\n"
789                "  do_something();\n"
790                "} while (something());");
791   verifyFormat("do\n"
792                "  do_something();\n"
793                "while (something());");
794 }
795 
796 TEST_F(FormatTest, FormatsSwitchStatement) {
797   verifyFormat("switch (x) {\n"
798                "case 1:\n"
799                "  f();\n"
800                "  break;\n"
801                "case kFoo:\n"
802                "case ns::kBar:\n"
803                "case kBaz:\n"
804                "  break;\n"
805                "default:\n"
806                "  g();\n"
807                "  break;\n"
808                "}");
809   verifyFormat("switch (x) {\n"
810                "case 1: {\n"
811                "  f();\n"
812                "  break;\n"
813                "}\n"
814                "case 2: {\n"
815                "  break;\n"
816                "}\n"
817                "}");
818   verifyFormat("switch (x) {\n"
819                "case 1: {\n"
820                "  f();\n"
821                "  {\n"
822                "    g();\n"
823                "    h();\n"
824                "  }\n"
825                "  break;\n"
826                "}\n"
827                "}");
828   verifyFormat("switch (x) {\n"
829                "case 1: {\n"
830                "  f();\n"
831                "  if (foo) {\n"
832                "    g();\n"
833                "    h();\n"
834                "  }\n"
835                "  break;\n"
836                "}\n"
837                "}");
838   verifyFormat("switch (x) {\n"
839                "case 1: {\n"
840                "  f();\n"
841                "  g();\n"
842                "} break;\n"
843                "}");
844   verifyFormat("switch (test)\n"
845                "  ;");
846   verifyFormat("switch (x) {\n"
847                "default: {\n"
848                "  // Do nothing.\n"
849                "}\n"
850                "}");
851   verifyFormat("switch (x) {\n"
852                "// comment\n"
853                "// if 1, do f()\n"
854                "case 1:\n"
855                "  f();\n"
856                "}");
857   verifyFormat("switch (x) {\n"
858                "case 1:\n"
859                "  // Do amazing stuff\n"
860                "  {\n"
861                "    f();\n"
862                "    g();\n"
863                "  }\n"
864                "  break;\n"
865                "}");
866   verifyFormat("#define A          \\\n"
867                "  switch (x) {     \\\n"
868                "  case a:          \\\n"
869                "    foo = b;       \\\n"
870                "  }",
871                getLLVMStyleWithColumns(20));
872   verifyFormat("#define OPERATION_CASE(name)           \\\n"
873                "  case OP_name:                        \\\n"
874                "    return operations::Operation##name\n",
875                getLLVMStyleWithColumns(40));
876   verifyFormat("switch (x) {\n"
877                "case 1:;\n"
878                "default:;\n"
879                "  int i;\n"
880                "}");
881 
882   verifyGoogleFormat("switch (x) {\n"
883                      "  case 1:\n"
884                      "    f();\n"
885                      "    break;\n"
886                      "  case kFoo:\n"
887                      "  case ns::kBar:\n"
888                      "  case kBaz:\n"
889                      "    break;\n"
890                      "  default:\n"
891                      "    g();\n"
892                      "    break;\n"
893                      "}");
894   verifyGoogleFormat("switch (x) {\n"
895                      "  case 1: {\n"
896                      "    f();\n"
897                      "    break;\n"
898                      "  }\n"
899                      "}");
900   verifyGoogleFormat("switch (test)\n"
901                      "  ;");
902 
903   verifyGoogleFormat("#define OPERATION_CASE(name) \\\n"
904                      "  case OP_name:              \\\n"
905                      "    return operations::Operation##name\n");
906   verifyGoogleFormat("Operation codeToOperation(OperationCode OpCode) {\n"
907                      "  // Get the correction operation class.\n"
908                      "  switch (OpCode) {\n"
909                      "    CASE(Add);\n"
910                      "    CASE(Subtract);\n"
911                      "    default:\n"
912                      "      return operations::Unknown;\n"
913                      "  }\n"
914                      "#undef OPERATION_CASE\n"
915                      "}");
916   verifyFormat("DEBUG({\n"
917                "  switch (x) {\n"
918                "  case A:\n"
919                "    f();\n"
920                "    break;\n"
921                "    // fallthrough\n"
922                "  case B:\n"
923                "    g();\n"
924                "    break;\n"
925                "  }\n"
926                "});");
927   EXPECT_EQ("DEBUG({\n"
928             "  switch (x) {\n"
929             "  case A:\n"
930             "    f();\n"
931             "    break;\n"
932             "  // On B:\n"
933             "  case B:\n"
934             "    g();\n"
935             "    break;\n"
936             "  }\n"
937             "});",
938             format("DEBUG({\n"
939                    "  switch (x) {\n"
940                    "  case A:\n"
941                    "    f();\n"
942                    "    break;\n"
943                    "  // On B:\n"
944                    "  case B:\n"
945                    "    g();\n"
946                    "    break;\n"
947                    "  }\n"
948                    "});",
949                    getLLVMStyle()));
950   verifyFormat("switch (a) {\n"
951                "case (b):\n"
952                "  return;\n"
953                "}");
954 
955   verifyFormat("switch (a) {\n"
956                "case some_namespace::\n"
957                "    some_constant:\n"
958                "  return;\n"
959                "}",
960                getLLVMStyleWithColumns(34));
961 }
962 
963 TEST_F(FormatTest, CaseRanges) {
964   verifyFormat("switch (x) {\n"
965                "case 'A' ... 'Z':\n"
966                "case 1 ... 5:\n"
967                "case a ... b:\n"
968                "  break;\n"
969                "}");
970 }
971 
972 TEST_F(FormatTest, ShortCaseLabels) {
973   FormatStyle Style = getLLVMStyle();
974   Style.AllowShortCaseLabelsOnASingleLine = true;
975   verifyFormat("switch (a) {\n"
976                "case 1: x = 1; break;\n"
977                "case 2: return;\n"
978                "case 3:\n"
979                "case 4:\n"
980                "case 5: return;\n"
981                "case 6: // comment\n"
982                "  return;\n"
983                "case 7:\n"
984                "  // comment\n"
985                "  return;\n"
986                "case 8:\n"
987                "  x = 8; // comment\n"
988                "  break;\n"
989                "default: y = 1; break;\n"
990                "}",
991                Style);
992   verifyFormat("switch (a) {\n"
993                "case 0: return; // comment\n"
994                "case 1: break;  // comment\n"
995                "case 2: return;\n"
996                "// comment\n"
997                "case 3: return;\n"
998                "// comment 1\n"
999                "// comment 2\n"
1000                "// comment 3\n"
1001                "case 4: break; /* comment */\n"
1002                "case 5:\n"
1003                "  // comment\n"
1004                "  break;\n"
1005                "case 6: /* comment */ x = 1; break;\n"
1006                "case 7: x = /* comment */ 1; break;\n"
1007                "case 8:\n"
1008                "  x = 1; /* comment */\n"
1009                "  break;\n"
1010                "case 9:\n"
1011                "  break; // comment line 1\n"
1012                "         // comment line 2\n"
1013                "}",
1014                Style);
1015   EXPECT_EQ("switch (a) {\n"
1016             "case 1:\n"
1017             "  x = 8;\n"
1018             "  // fall through\n"
1019             "case 2: x = 8;\n"
1020             "// comment\n"
1021             "case 3:\n"
1022             "  return; /* comment line 1\n"
1023             "           * comment line 2 */\n"
1024             "case 4: i = 8;\n"
1025             "// something else\n"
1026             "#if FOO\n"
1027             "case 5: break;\n"
1028             "#endif\n"
1029             "}",
1030             format("switch (a) {\n"
1031                    "case 1: x = 8;\n"
1032                    "  // fall through\n"
1033                    "case 2:\n"
1034                    "  x = 8;\n"
1035                    "// comment\n"
1036                    "case 3:\n"
1037                    "  return; /* comment line 1\n"
1038                    "           * comment line 2 */\n"
1039                    "case 4:\n"
1040                    "  i = 8;\n"
1041                    "// something else\n"
1042                    "#if FOO\n"
1043                    "case 5: break;\n"
1044                    "#endif\n"
1045                    "}",
1046                    Style));
1047   EXPECT_EQ("switch (a) {\n" "case 0:\n"
1048             "  return; // long long long long long long long long long long long long comment\n"
1049             "          // line\n" "}",
1050             format("switch (a) {\n"
1051                    "case 0: return; // long long long long long long long long long long long long comment line\n"
1052                    "}",
1053                    Style));
1054   EXPECT_EQ("switch (a) {\n"
1055             "case 0:\n"
1056             "  return; /* long long long long long long long long long long long long comment\n"
1057             "             line */\n"
1058             "}",
1059             format("switch (a) {\n"
1060                    "case 0: return; /* long long long long long long long long long long long long comment line */\n"
1061                    "}",
1062                    Style));
1063   verifyFormat("switch (a) {\n"
1064                "#if FOO\n"
1065                "case 0: return 0;\n"
1066                "#endif\n"
1067                "}",
1068                Style);
1069   verifyFormat("switch (a) {\n"
1070                "case 1: {\n"
1071                "}\n"
1072                "case 2: {\n"
1073                "  return;\n"
1074                "}\n"
1075                "case 3: {\n"
1076                "  x = 1;\n"
1077                "  return;\n"
1078                "}\n"
1079                "case 4:\n"
1080                "  if (x)\n"
1081                "    return;\n"
1082                "}",
1083                Style);
1084   Style.ColumnLimit = 21;
1085   verifyFormat("switch (a) {\n"
1086                "case 1: x = 1; break;\n"
1087                "case 2: return;\n"
1088                "case 3:\n"
1089                "case 4:\n"
1090                "case 5: return;\n"
1091                "default:\n"
1092                "  y = 1;\n"
1093                "  break;\n"
1094                "}",
1095                Style);
1096 }
1097 
1098 TEST_F(FormatTest, FormatsLabels) {
1099   verifyFormat("void f() {\n"
1100                "  some_code();\n"
1101                "test_label:\n"
1102                "  some_other_code();\n"
1103                "  {\n"
1104                "    some_more_code();\n"
1105                "  another_label:\n"
1106                "    some_more_code();\n"
1107                "  }\n"
1108                "}");
1109   verifyFormat("{\n"
1110                "  some_code();\n"
1111                "test_label:\n"
1112                "  some_other_code();\n"
1113                "}");
1114   verifyFormat("{\n"
1115                "  some_code();\n"
1116                "test_label:;\n"
1117                "  int i = 0;\n"
1118                "}");
1119 }
1120 
1121 //===----------------------------------------------------------------------===//
1122 // Tests for classes, namespaces, etc.
1123 //===----------------------------------------------------------------------===//
1124 
1125 TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) {
1126   verifyFormat("class A {};");
1127 }
1128 
1129 TEST_F(FormatTest, UnderstandsAccessSpecifiers) {
1130   verifyFormat("class A {\n"
1131                "public:\n"
1132                "public: // comment\n"
1133                "protected:\n"
1134                "private:\n"
1135                "  void f() {}\n"
1136                "};");
1137   verifyGoogleFormat("class A {\n"
1138                      " public:\n"
1139                      " protected:\n"
1140                      " private:\n"
1141                      "  void f() {}\n"
1142                      "};");
1143   verifyFormat("class A {\n"
1144                "public slots:\n"
1145                "  void f1() {}\n"
1146                "public Q_SLOTS:\n"
1147                "  void f2() {}\n"
1148                "protected slots:\n"
1149                "  void f3() {}\n"
1150                "protected Q_SLOTS:\n"
1151                "  void f4() {}\n"
1152                "private slots:\n"
1153                "  void f5() {}\n"
1154                "private Q_SLOTS:\n"
1155                "  void f6() {}\n"
1156                "signals:\n"
1157                "  void g1();\n"
1158                "Q_SIGNALS:\n"
1159                "  void g2();\n"
1160                "};");
1161 
1162   // Don't interpret 'signals' the wrong way.
1163   verifyFormat("signals.set();");
1164   verifyFormat("for (Signals signals : f()) {\n}");
1165   verifyFormat("{\n"
1166                "  signals.set(); // This needs indentation.\n"
1167                "}");
1168   verifyFormat("void f() {\n"
1169                "label:\n"
1170                "  signals.baz();\n"
1171                "}");
1172 }
1173 
1174 TEST_F(FormatTest, SeparatesLogicalBlocks) {
1175   EXPECT_EQ("class A {\n"
1176             "public:\n"
1177             "  void f();\n"
1178             "\n"
1179             "private:\n"
1180             "  void g() {}\n"
1181             "  // test\n"
1182             "protected:\n"
1183             "  int h;\n"
1184             "};",
1185             format("class A {\n"
1186                    "public:\n"
1187                    "void f();\n"
1188                    "private:\n"
1189                    "void g() {}\n"
1190                    "// test\n"
1191                    "protected:\n"
1192                    "int h;\n"
1193                    "};"));
1194   EXPECT_EQ("class A {\n"
1195             "protected:\n"
1196             "public:\n"
1197             "  void f();\n"
1198             "};",
1199             format("class A {\n"
1200                    "protected:\n"
1201                    "\n"
1202                    "public:\n"
1203                    "\n"
1204                    "  void f();\n"
1205                    "};"));
1206 
1207   // Even ensure proper spacing inside macros.
1208   EXPECT_EQ("#define B     \\\n"
1209             "  class A {   \\\n"
1210             "   protected: \\\n"
1211             "   public:    \\\n"
1212             "    void f(); \\\n"
1213             "  };",
1214             format("#define B     \\\n"
1215                    "  class A {   \\\n"
1216                    "   protected: \\\n"
1217                    "              \\\n"
1218                    "   public:    \\\n"
1219                    "              \\\n"
1220                    "    void f(); \\\n"
1221                    "  };",
1222                    getGoogleStyle()));
1223   // But don't remove empty lines after macros ending in access specifiers.
1224   EXPECT_EQ("#define A private:\n"
1225             "\n"
1226             "int i;",
1227             format("#define A         private:\n"
1228                    "\n"
1229                    "int              i;"));
1230 }
1231 
1232 TEST_F(FormatTest, FormatsClasses) {
1233   verifyFormat("class A : public B {};");
1234   verifyFormat("class A : public ::B {};");
1235 
1236   verifyFormat(
1237       "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
1238       "                             public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
1239   verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n"
1240                "    : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
1241                "      public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
1242   verifyFormat(
1243       "class A : public B, public C, public D, public E, public F {};");
1244   verifyFormat("class AAAAAAAAAAAA : public B,\n"
1245                "                     public C,\n"
1246                "                     public D,\n"
1247                "                     public E,\n"
1248                "                     public F,\n"
1249                "                     public G {};");
1250 
1251   verifyFormat("class\n"
1252                "    ReallyReallyLongClassName {\n"
1253                "  int i;\n"
1254                "};",
1255                getLLVMStyleWithColumns(32));
1256   verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n"
1257                "                           aaaaaaaaaaaaaaaa> {};");
1258   verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n"
1259                "    : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n"
1260                "                                 aaaaaaaaaaaaaaaaaaaaaa> {};");
1261   verifyFormat("template <class R, class C>\n"
1262                "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n"
1263                "    : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};");
1264   verifyFormat("class ::A::B {};");
1265 }
1266 
1267 TEST_F(FormatTest, BreakBeforeInheritanceComma) {
1268   FormatStyle StyleWithInheritanceBreak = getLLVMStyle();
1269   StyleWithInheritanceBreak.BreakBeforeInheritanceComma = true;
1270 
1271   verifyFormat("class MyClass : public X {};", StyleWithInheritanceBreak);
1272   verifyFormat("class MyClass\n"
1273                "    : public X\n"
1274                "    , public Y {};",
1275                StyleWithInheritanceBreak);
1276 }
1277 
1278 TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) {
1279   verifyFormat("class A {\n} a, b;");
1280   verifyFormat("struct A {\n} a, b;");
1281   verifyFormat("union A {\n} a;");
1282 }
1283 
1284 TEST_F(FormatTest, FormatsEnum) {
1285   verifyFormat("enum {\n"
1286                "  Zero,\n"
1287                "  One = 1,\n"
1288                "  Two = One + 1,\n"
1289                "  Three = (One + Two),\n"
1290                "  Four = (Zero && (One ^ Two)) | (One << Two),\n"
1291                "  Five = (One, Two, Three, Four, 5)\n"
1292                "};");
1293   verifyGoogleFormat("enum {\n"
1294                      "  Zero,\n"
1295                      "  One = 1,\n"
1296                      "  Two = One + 1,\n"
1297                      "  Three = (One + Two),\n"
1298                      "  Four = (Zero && (One ^ Two)) | (One << Two),\n"
1299                      "  Five = (One, Two, Three, Four, 5)\n"
1300                      "};");
1301   verifyFormat("enum Enum {};");
1302   verifyFormat("enum {};");
1303   verifyFormat("enum X E {} d;");
1304   verifyFormat("enum __attribute__((...)) E {} d;");
1305   verifyFormat("enum __declspec__((...)) E {} d;");
1306   verifyFormat("enum {\n"
1307                "  Bar = Foo<int, int>::value\n"
1308                "};",
1309                getLLVMStyleWithColumns(30));
1310 
1311   verifyFormat("enum ShortEnum { A, B, C };");
1312   verifyGoogleFormat("enum ShortEnum { A, B, C };");
1313 
1314   EXPECT_EQ("enum KeepEmptyLines {\n"
1315             "  ONE,\n"
1316             "\n"
1317             "  TWO,\n"
1318             "\n"
1319             "  THREE\n"
1320             "}",
1321             format("enum KeepEmptyLines {\n"
1322                    "  ONE,\n"
1323                    "\n"
1324                    "  TWO,\n"
1325                    "\n"
1326                    "\n"
1327                    "  THREE\n"
1328                    "}"));
1329   verifyFormat("enum E { // comment\n"
1330                "  ONE,\n"
1331                "  TWO\n"
1332                "};\n"
1333                "int i;");
1334   // Not enums.
1335   verifyFormat("enum X f() {\n"
1336                "  a();\n"
1337                "  return 42;\n"
1338                "}");
1339   verifyFormat("enum X Type::f() {\n"
1340                "  a();\n"
1341                "  return 42;\n"
1342                "}");
1343   verifyFormat("enum ::X f() {\n"
1344                "  a();\n"
1345                "  return 42;\n"
1346                "}");
1347   verifyFormat("enum ns::X f() {\n"
1348                "  a();\n"
1349                "  return 42;\n"
1350                "}");
1351 }
1352 
1353 TEST_F(FormatTest, FormatsEnumsWithErrors) {
1354   verifyFormat("enum Type {\n"
1355                "  One = 0; // These semicolons should be commas.\n"
1356                "  Two = 1;\n"
1357                "};");
1358   verifyFormat("namespace n {\n"
1359                "enum Type {\n"
1360                "  One,\n"
1361                "  Two, // missing };\n"
1362                "  int i;\n"
1363                "}\n"
1364                "void g() {}");
1365 }
1366 
1367 TEST_F(FormatTest, FormatsEnumStruct) {
1368   verifyFormat("enum struct {\n"
1369                "  Zero,\n"
1370                "  One = 1,\n"
1371                "  Two = One + 1,\n"
1372                "  Three = (One + Two),\n"
1373                "  Four = (Zero && (One ^ Two)) | (One << Two),\n"
1374                "  Five = (One, Two, Three, Four, 5)\n"
1375                "};");
1376   verifyFormat("enum struct Enum {};");
1377   verifyFormat("enum struct {};");
1378   verifyFormat("enum struct X E {} d;");
1379   verifyFormat("enum struct __attribute__((...)) E {} d;");
1380   verifyFormat("enum struct __declspec__((...)) E {} d;");
1381   verifyFormat("enum struct X f() {\n  a();\n  return 42;\n}");
1382 }
1383 
1384 TEST_F(FormatTest, FormatsEnumClass) {
1385   verifyFormat("enum class {\n"
1386                "  Zero,\n"
1387                "  One = 1,\n"
1388                "  Two = One + 1,\n"
1389                "  Three = (One + Two),\n"
1390                "  Four = (Zero && (One ^ Two)) | (One << Two),\n"
1391                "  Five = (One, Two, Three, Four, 5)\n"
1392                "};");
1393   verifyFormat("enum class Enum {};");
1394   verifyFormat("enum class {};");
1395   verifyFormat("enum class X E {} d;");
1396   verifyFormat("enum class __attribute__((...)) E {} d;");
1397   verifyFormat("enum class __declspec__((...)) E {} d;");
1398   verifyFormat("enum class X f() {\n  a();\n  return 42;\n}");
1399 }
1400 
1401 TEST_F(FormatTest, FormatsEnumTypes) {
1402   verifyFormat("enum X : int {\n"
1403                "  A, // Force multiple lines.\n"
1404                "  B\n"
1405                "};");
1406   verifyFormat("enum X : int { A, B };");
1407   verifyFormat("enum X : std::uint32_t { A, B };");
1408 }
1409 
1410 TEST_F(FormatTest, FormatsTypedefEnum) {
1411   FormatStyle Style = getLLVMStyle();
1412   Style.ColumnLimit = 40;
1413   verifyFormat("typedef enum {} EmptyEnum;");
1414   verifyFormat("typedef enum { A, B, C } ShortEnum;");
1415   verifyFormat("typedef enum {\n"
1416                "  ZERO = 0,\n"
1417                "  ONE = 1,\n"
1418                "  TWO = 2,\n"
1419                "  THREE = 3\n"
1420                "} LongEnum;",
1421                Style);
1422   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1423   Style.BraceWrapping.AfterEnum = true;
1424   verifyFormat("typedef enum {} EmptyEnum;");
1425   verifyFormat("typedef enum { A, B, C } ShortEnum;");
1426   verifyFormat("typedef enum\n"
1427                "{\n"
1428                "  ZERO = 0,\n"
1429                "  ONE = 1,\n"
1430                "  TWO = 2,\n"
1431                "  THREE = 3\n"
1432                "} LongEnum;",
1433                Style);
1434 }
1435 
1436 TEST_F(FormatTest, FormatsNSEnums) {
1437   verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }");
1438   verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n"
1439                      "  // Information about someDecentlyLongValue.\n"
1440                      "  someDecentlyLongValue,\n"
1441                      "  // Information about anotherDecentlyLongValue.\n"
1442                      "  anotherDecentlyLongValue,\n"
1443                      "  // Information about aThirdDecentlyLongValue.\n"
1444                      "  aThirdDecentlyLongValue\n"
1445                      "};");
1446   verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n"
1447                      "  a = 1,\n"
1448                      "  b = 2,\n"
1449                      "  c = 3,\n"
1450                      "};");
1451   verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n"
1452                      "  a = 1,\n"
1453                      "  b = 2,\n"
1454                      "  c = 3,\n"
1455                      "};");
1456   verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n"
1457                      "  a = 1,\n"
1458                      "  b = 2,\n"
1459                      "  c = 3,\n"
1460                      "};");
1461 }
1462 
1463 TEST_F(FormatTest, FormatsBitfields) {
1464   verifyFormat("struct Bitfields {\n"
1465                "  unsigned sClass : 8;\n"
1466                "  unsigned ValueKind : 2;\n"
1467                "};");
1468   verifyFormat("struct A {\n"
1469                "  int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n"
1470                "      bbbbbbbbbbbbbbbbbbbbbbbbb;\n"
1471                "};");
1472   verifyFormat("struct MyStruct {\n"
1473                "  uchar data;\n"
1474                "  uchar : 8;\n"
1475                "  uchar : 8;\n"
1476                "  uchar other;\n"
1477                "};");
1478 }
1479 
1480 TEST_F(FormatTest, FormatsNamespaces) {
1481   FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle();
1482   LLVMWithNoNamespaceFix.FixNamespaceComments = false;
1483 
1484   verifyFormat("namespace some_namespace {\n"
1485                "class A {};\n"
1486                "void f() { f(); }\n"
1487                "}",
1488                LLVMWithNoNamespaceFix);
1489   verifyFormat("namespace {\n"
1490                "class A {};\n"
1491                "void f() { f(); }\n"
1492                "}",
1493                LLVMWithNoNamespaceFix);
1494   verifyFormat("inline namespace X {\n"
1495                "class A {};\n"
1496                "void f() { f(); }\n"
1497                "}",
1498                LLVMWithNoNamespaceFix);
1499   verifyFormat("using namespace some_namespace;\n"
1500                "class A {};\n"
1501                "void f() { f(); }",
1502                LLVMWithNoNamespaceFix);
1503 
1504   // This code is more common than we thought; if we
1505   // layout this correctly the semicolon will go into
1506   // its own line, which is undesirable.
1507   verifyFormat("namespace {};",
1508                LLVMWithNoNamespaceFix);
1509   verifyFormat("namespace {\n"
1510                "class A {};\n"
1511                "};",
1512                LLVMWithNoNamespaceFix);
1513 
1514   verifyFormat("namespace {\n"
1515                "int SomeVariable = 0; // comment\n"
1516                "} // namespace",
1517                LLVMWithNoNamespaceFix);
1518   EXPECT_EQ("#ifndef HEADER_GUARD\n"
1519             "#define HEADER_GUARD\n"
1520             "namespace my_namespace {\n"
1521             "int i;\n"
1522             "} // my_namespace\n"
1523             "#endif // HEADER_GUARD",
1524             format("#ifndef HEADER_GUARD\n"
1525                    " #define HEADER_GUARD\n"
1526                    "   namespace my_namespace {\n"
1527                    "int i;\n"
1528                    "}    // my_namespace\n"
1529                    "#endif    // HEADER_GUARD",
1530                    LLVMWithNoNamespaceFix));
1531 
1532   EXPECT_EQ("namespace A::B {\n"
1533             "class C {};\n"
1534             "}",
1535             format("namespace A::B {\n"
1536                    "class C {};\n"
1537                    "}",
1538                    LLVMWithNoNamespaceFix));
1539 
1540   FormatStyle Style = getLLVMStyle();
1541   Style.NamespaceIndentation = FormatStyle::NI_All;
1542   EXPECT_EQ("namespace out {\n"
1543             "  int i;\n"
1544             "  namespace in {\n"
1545             "    int i;\n"
1546             "  } // namespace in\n"
1547             "} // namespace out",
1548             format("namespace out {\n"
1549                    "int i;\n"
1550                    "namespace in {\n"
1551                    "int i;\n"
1552                    "} // namespace in\n"
1553                    "} // namespace out",
1554                    Style));
1555 
1556   Style.NamespaceIndentation = FormatStyle::NI_Inner;
1557   EXPECT_EQ("namespace out {\n"
1558             "int i;\n"
1559             "namespace in {\n"
1560             "  int i;\n"
1561             "} // namespace in\n"
1562             "} // namespace out",
1563             format("namespace out {\n"
1564                    "int i;\n"
1565                    "namespace in {\n"
1566                    "int i;\n"
1567                    "} // namespace in\n"
1568                    "} // namespace out",
1569                    Style));
1570 }
1571 
1572 TEST_F(FormatTest, FormatsCompactNamespaces) {
1573   FormatStyle Style = getLLVMStyle();
1574   Style.CompactNamespaces = true;
1575 
1576   verifyFormat("namespace A { namespace B {\n"
1577 			   "}} // namespace A::B",
1578 			   Style);
1579 
1580   EXPECT_EQ("namespace out { namespace in {\n"
1581             "}} // namespace out::in",
1582             format("namespace out {\n"
1583                    "namespace in {\n"
1584                    "} // namespace in\n"
1585                    "} // namespace out",
1586                    Style));
1587 
1588   // Only namespaces which have both consecutive opening and end get compacted
1589   EXPECT_EQ("namespace out {\n"
1590             "namespace in1 {\n"
1591             "} // namespace in1\n"
1592             "namespace in2 {\n"
1593             "} // namespace in2\n"
1594             "} // namespace out",
1595             format("namespace out {\n"
1596                    "namespace in1 {\n"
1597                    "} // namespace in1\n"
1598                    "namespace in2 {\n"
1599                    "} // namespace in2\n"
1600                    "} // namespace out",
1601                    Style));
1602 
1603   EXPECT_EQ("namespace out {\n"
1604             "int i;\n"
1605             "namespace in {\n"
1606             "int j;\n"
1607             "} // namespace in\n"
1608             "int k;\n"
1609             "} // namespace out",
1610             format("namespace out { int i;\n"
1611                    "namespace in { int j; } // namespace in\n"
1612                    "int k; } // namespace out",
1613                    Style));
1614 
1615   EXPECT_EQ("namespace A { namespace B { namespace C {\n"
1616             "}}} // namespace A::B::C\n",
1617             format("namespace A { namespace B {\n"
1618                    "namespace C {\n"
1619                    "}} // namespace B::C\n"
1620                    "} // namespace A\n",
1621                    Style));
1622 
1623   Style.ColumnLimit = 40;
1624   EXPECT_EQ("namespace aaaaaaaaaa {\n"
1625             "namespace bbbbbbbbbb {\n"
1626             "}} // namespace aaaaaaaaaa::bbbbbbbbbb",
1627             format("namespace aaaaaaaaaa {\n"
1628                    "namespace bbbbbbbbbb {\n"
1629                    "} // namespace bbbbbbbbbb\n"
1630                    "} // namespace aaaaaaaaaa",
1631                    Style));
1632 
1633   EXPECT_EQ("namespace aaaaaa { namespace bbbbbb {\n"
1634             "namespace cccccc {\n"
1635             "}}} // namespace aaaaaa::bbbbbb::cccccc",
1636             format("namespace aaaaaa {\n"
1637                    "namespace bbbbbb {\n"
1638                    "namespace cccccc {\n"
1639                    "} // namespace cccccc\n"
1640                    "} // namespace bbbbbb\n"
1641                    "} // namespace aaaaaa",
1642                    Style));
1643   Style.ColumnLimit = 80;
1644 
1645   // Extra semicolon after 'inner' closing brace prevents merging
1646   EXPECT_EQ("namespace out { namespace in {\n"
1647             "}; } // namespace out::in",
1648             format("namespace out {\n"
1649                    "namespace in {\n"
1650                    "}; // namespace in\n"
1651                    "} // namespace out",
1652                    Style));
1653 
1654   // Extra semicolon after 'outer' closing brace is conserved
1655   EXPECT_EQ("namespace out { namespace in {\n"
1656             "}}; // namespace out::in",
1657             format("namespace out {\n"
1658                    "namespace in {\n"
1659                    "} // namespace in\n"
1660                    "}; // namespace out",
1661                    Style));
1662 
1663   Style.NamespaceIndentation = FormatStyle::NI_All;
1664   EXPECT_EQ("namespace out { namespace in {\n"
1665             "  int i;\n"
1666             "}} // namespace out::in",
1667             format("namespace out {\n"
1668                    "namespace in {\n"
1669                    "int i;\n"
1670                    "} // namespace in\n"
1671                    "} // namespace out",
1672                    Style));
1673   EXPECT_EQ("namespace out { namespace mid {\n"
1674             "  namespace in {\n"
1675             "    int j;\n"
1676             "  } // namespace in\n"
1677             "  int k;\n"
1678             "}} // namespace out::mid",
1679             format("namespace out { namespace mid {\n"
1680                    "namespace in { int j; } // namespace in\n"
1681                    "int k; }} // namespace out::mid",
1682                    Style));
1683 
1684   Style.NamespaceIndentation = FormatStyle::NI_Inner;
1685   EXPECT_EQ("namespace out { namespace in {\n"
1686             "  int i;\n"
1687             "}} // namespace out::in",
1688             format("namespace out {\n"
1689                    "namespace in {\n"
1690                    "int i;\n"
1691                    "} // namespace in\n"
1692                    "} // namespace out",
1693                    Style));
1694   EXPECT_EQ("namespace out { namespace mid { namespace in {\n"
1695             "  int i;\n"
1696             "}}} // namespace out::mid::in",
1697             format("namespace out {\n"
1698                    "namespace mid {\n"
1699                    "namespace in {\n"
1700                    "int i;\n"
1701                    "} // namespace in\n"
1702                    "} // namespace mid\n"
1703                    "} // namespace out",
1704                    Style));
1705 }
1706 
1707 TEST_F(FormatTest, FormatsExternC) {
1708   verifyFormat("extern \"C\" {\nint a;");
1709   verifyFormat("extern \"C\" {}");
1710   verifyFormat("extern \"C\" {\n"
1711                "int foo();\n"
1712                "}");
1713   verifyFormat("extern \"C\" int foo() {}");
1714   verifyFormat("extern \"C\" int foo();");
1715   verifyFormat("extern \"C\" int foo() {\n"
1716                "  int i = 42;\n"
1717                "  return i;\n"
1718                "}");
1719 
1720   FormatStyle Style = getLLVMStyle();
1721   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1722   Style.BraceWrapping.AfterFunction = true;
1723   verifyFormat("extern \"C\" int foo() {}", Style);
1724   verifyFormat("extern \"C\" int foo();", Style);
1725   verifyFormat("extern \"C\" int foo()\n"
1726                "{\n"
1727                "  int i = 42;\n"
1728                "  return i;\n"
1729                "}",
1730                Style);
1731 
1732   Style.BraceWrapping.AfterExternBlock = true;
1733   Style.BraceWrapping.SplitEmptyRecord = false;
1734   verifyFormat("extern \"C\"\n"
1735                "{}",
1736                Style);
1737   verifyFormat("extern \"C\"\n"
1738                "{\n"
1739                "  int foo();\n"
1740                "}",
1741                Style);
1742 }
1743 
1744 TEST_F(FormatTest, FormatsInlineASM) {
1745   verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));");
1746   verifyFormat("asm(\"nop\" ::: \"memory\");");
1747   verifyFormat(
1748       "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n"
1749       "    \"cpuid\\n\\t\"\n"
1750       "    \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n"
1751       "    : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n"
1752       "    : \"a\"(value));");
1753   EXPECT_EQ(
1754       "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
1755       "  __asm {\n"
1756       "        mov     edx,[that] // vtable in edx\n"
1757       "        mov     eax,methodIndex\n"
1758       "        call    [edx][eax*4] // stdcall\n"
1759       "  }\n"
1760       "}",
1761       format("void NS_InvokeByIndex(void *that,   unsigned int methodIndex) {\n"
1762              "    __asm {\n"
1763              "        mov     edx,[that] // vtable in edx\n"
1764              "        mov     eax,methodIndex\n"
1765              "        call    [edx][eax*4] // stdcall\n"
1766              "    }\n"
1767              "}"));
1768   EXPECT_EQ("_asm {\n"
1769             "  xor eax, eax;\n"
1770             "  cpuid;\n"
1771             "}",
1772             format("_asm {\n"
1773                    "  xor eax, eax;\n"
1774                    "  cpuid;\n"
1775                    "}"));
1776   verifyFormat("void function() {\n"
1777                "  // comment\n"
1778                "  asm(\"\");\n"
1779                "}");
1780   EXPECT_EQ("__asm {\n"
1781             "}\n"
1782             "int i;",
1783             format("__asm   {\n"
1784                    "}\n"
1785                    "int   i;"));
1786 }
1787 
1788 TEST_F(FormatTest, FormatTryCatch) {
1789   verifyFormat("try {\n"
1790                "  throw a * b;\n"
1791                "} catch (int a) {\n"
1792                "  // Do nothing.\n"
1793                "} catch (...) {\n"
1794                "  exit(42);\n"
1795                "}");
1796 
1797   // Function-level try statements.
1798   verifyFormat("int f() try { return 4; } catch (...) {\n"
1799                "  return 5;\n"
1800                "}");
1801   verifyFormat("class A {\n"
1802                "  int a;\n"
1803                "  A() try : a(0) {\n"
1804                "  } catch (...) {\n"
1805                "    throw;\n"
1806                "  }\n"
1807                "};\n");
1808 
1809   // Incomplete try-catch blocks.
1810   verifyIncompleteFormat("try {} catch (");
1811 }
1812 
1813 TEST_F(FormatTest, FormatSEHTryCatch) {
1814   verifyFormat("__try {\n"
1815                "  int a = b * c;\n"
1816                "} __except (EXCEPTION_EXECUTE_HANDLER) {\n"
1817                "  // Do nothing.\n"
1818                "}");
1819 
1820   verifyFormat("__try {\n"
1821                "  int a = b * c;\n"
1822                "} __finally {\n"
1823                "  // Do nothing.\n"
1824                "}");
1825 
1826   verifyFormat("DEBUG({\n"
1827                "  __try {\n"
1828                "  } __finally {\n"
1829                "  }\n"
1830                "});\n");
1831 }
1832 
1833 TEST_F(FormatTest, IncompleteTryCatchBlocks) {
1834   verifyFormat("try {\n"
1835                "  f();\n"
1836                "} catch {\n"
1837                "  g();\n"
1838                "}");
1839   verifyFormat("try {\n"
1840                "  f();\n"
1841                "} catch (A a) MACRO(x) {\n"
1842                "  g();\n"
1843                "} catch (B b) MACRO(x) {\n"
1844                "  g();\n"
1845                "}");
1846 }
1847 
1848 TEST_F(FormatTest, FormatTryCatchBraceStyles) {
1849   FormatStyle Style = getLLVMStyle();
1850   for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla,
1851                           FormatStyle::BS_WebKit}) {
1852     Style.BreakBeforeBraces = BraceStyle;
1853     verifyFormat("try {\n"
1854                  "  // something\n"
1855                  "} catch (...) {\n"
1856                  "  // something\n"
1857                  "}",
1858                  Style);
1859   }
1860   Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
1861   verifyFormat("try {\n"
1862                "  // something\n"
1863                "}\n"
1864                "catch (...) {\n"
1865                "  // something\n"
1866                "}",
1867                Style);
1868   verifyFormat("__try {\n"
1869                "  // something\n"
1870                "}\n"
1871                "__finally {\n"
1872                "  // something\n"
1873                "}",
1874                Style);
1875   verifyFormat("@try {\n"
1876                "  // something\n"
1877                "}\n"
1878                "@finally {\n"
1879                "  // something\n"
1880                "}",
1881                Style);
1882   Style.BreakBeforeBraces = FormatStyle::BS_Allman;
1883   verifyFormat("try\n"
1884                "{\n"
1885                "  // something\n"
1886                "}\n"
1887                "catch (...)\n"
1888                "{\n"
1889                "  // something\n"
1890                "}",
1891                Style);
1892   Style.BreakBeforeBraces = FormatStyle::BS_GNU;
1893   verifyFormat("try\n"
1894                "  {\n"
1895                "    // something\n"
1896                "  }\n"
1897                "catch (...)\n"
1898                "  {\n"
1899                "    // something\n"
1900                "  }",
1901                Style);
1902   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1903   Style.BraceWrapping.BeforeCatch = true;
1904   verifyFormat("try {\n"
1905                "  // something\n"
1906                "}\n"
1907                "catch (...) {\n"
1908                "  // something\n"
1909                "}",
1910                Style);
1911 }
1912 
1913 TEST_F(FormatTest, StaticInitializers) {
1914   verifyFormat("static SomeClass SC = {1, 'a'};");
1915 
1916   verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n"
1917                "    100000000, "
1918                "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};");
1919 
1920   // Here, everything other than the "}" would fit on a line.
1921   verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n"
1922                "    10000000000000000000000000};");
1923   EXPECT_EQ("S s = {a,\n"
1924             "\n"
1925             "       b};",
1926             format("S s = {\n"
1927                    "  a,\n"
1928                    "\n"
1929                    "  b\n"
1930                    "};"));
1931 
1932   // FIXME: This would fit into the column limit if we'd fit "{ {" on the first
1933   // line. However, the formatting looks a bit off and this probably doesn't
1934   // happen often in practice.
1935   verifyFormat("static int Variable[1] = {\n"
1936                "    {1000000000000000000000000000000000000}};",
1937                getLLVMStyleWithColumns(40));
1938 }
1939 
1940 TEST_F(FormatTest, DesignatedInitializers) {
1941   verifyFormat("const struct A a = {.a = 1, .b = 2};");
1942   verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n"
1943                "                    .bbbbbbbbbb = 2,\n"
1944                "                    .cccccccccc = 3,\n"
1945                "                    .dddddddddd = 4,\n"
1946                "                    .eeeeeeeeee = 5};");
1947   verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
1948                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n"
1949                "    .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n"
1950                "    .ccccccccccccccccccccccccccc = 3,\n"
1951                "    .ddddddddddddddddddddddddddd = 4,\n"
1952                "    .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};");
1953 
1954   verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};");
1955 
1956   verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
1957   verifyFormat("const struct A a = {[1] = aaaaaaaaaa,\n"
1958                "                    [2] = bbbbbbbbbb,\n"
1959                "                    [3] = cccccccccc,\n"
1960                "                    [4] = dddddddddd,\n"
1961                "                    [5] = eeeeeeeeee};");
1962   verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
1963                "    [1] = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
1964                "    [2] = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
1965                "    [3] = cccccccccccccccccccccccccccccccccccccc,\n"
1966                "    [4] = dddddddddddddddddddddddddddddddddddddd,\n"
1967                "    [5] = eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee};");
1968 }
1969 
1970 TEST_F(FormatTest, NestedStaticInitializers) {
1971   verifyFormat("static A x = {{{}}};\n");
1972   verifyFormat("static A x = {{{init1, init2, init3, init4},\n"
1973                "               {init1, init2, init3, init4}}};",
1974                getLLVMStyleWithColumns(50));
1975 
1976   verifyFormat("somes Status::global_reps[3] = {\n"
1977                "    {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
1978                "    {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
1979                "    {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};",
1980                getLLVMStyleWithColumns(60));
1981   verifyGoogleFormat("SomeType Status::global_reps[3] = {\n"
1982                      "    {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
1983                      "    {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
1984                      "    {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};");
1985   verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n"
1986                "                  {rect.fRight - rect.fLeft, rect.fBottom - "
1987                "rect.fTop}};");
1988 
1989   verifyFormat(
1990       "SomeArrayOfSomeType a = {\n"
1991       "    {{1, 2, 3},\n"
1992       "     {1, 2, 3},\n"
1993       "     {111111111111111111111111111111, 222222222222222222222222222222,\n"
1994       "      333333333333333333333333333333},\n"
1995       "     {1, 2, 3},\n"
1996       "     {1, 2, 3}}};");
1997   verifyFormat(
1998       "SomeArrayOfSomeType a = {\n"
1999       "    {{1, 2, 3}},\n"
2000       "    {{1, 2, 3}},\n"
2001       "    {{111111111111111111111111111111, 222222222222222222222222222222,\n"
2002       "      333333333333333333333333333333}},\n"
2003       "    {{1, 2, 3}},\n"
2004       "    {{1, 2, 3}}};");
2005 
2006   verifyFormat("struct {\n"
2007                "  unsigned bit;\n"
2008                "  const char *const name;\n"
2009                "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n"
2010                "                 {kOsWin, \"Windows\"},\n"
2011                "                 {kOsLinux, \"Linux\"},\n"
2012                "                 {kOsCrOS, \"Chrome OS\"}};");
2013   verifyFormat("struct {\n"
2014                "  unsigned bit;\n"
2015                "  const char *const name;\n"
2016                "} kBitsToOs[] = {\n"
2017                "    {kOsMac, \"Mac\"},\n"
2018                "    {kOsWin, \"Windows\"},\n"
2019                "    {kOsLinux, \"Linux\"},\n"
2020                "    {kOsCrOS, \"Chrome OS\"},\n"
2021                "};");
2022 }
2023 
2024 TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) {
2025   verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro("
2026                "                      \\\n"
2027                "    aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)");
2028 }
2029 
2030 TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) {
2031   verifyFormat("virtual void write(ELFWriter *writerrr,\n"
2032                "                   OwningPtr<FileOutputBuffer> &buffer) = 0;");
2033 
2034   // Do break defaulted and deleted functions.
2035   verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
2036                "    default;",
2037                getLLVMStyleWithColumns(40));
2038   verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
2039                "    delete;",
2040                getLLVMStyleWithColumns(40));
2041 }
2042 
2043 TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) {
2044   verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3",
2045                getLLVMStyleWithColumns(40));
2046   verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
2047                getLLVMStyleWithColumns(40));
2048   EXPECT_EQ("#define Q                              \\\n"
2049             "  \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\"    \\\n"
2050             "  \"aaaaaaaa.cpp\"",
2051             format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
2052                    getLLVMStyleWithColumns(40)));
2053 }
2054 
2055 TEST_F(FormatTest, UnderstandsLinePPDirective) {
2056   EXPECT_EQ("# 123 \"A string literal\"",
2057             format("   #     123    \"A string literal\""));
2058 }
2059 
2060 TEST_F(FormatTest, LayoutUnknownPPDirective) {
2061   EXPECT_EQ("#;", format("#;"));
2062   verifyFormat("#\n;\n;\n;");
2063 }
2064 
2065 TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) {
2066   EXPECT_EQ("#line 42 \"test\"\n",
2067             format("#  \\\n  line  \\\n  42  \\\n  \"test\"\n"));
2068   EXPECT_EQ("#define A B\n", format("#  \\\n define  \\\n    A  \\\n       B\n",
2069                                     getLLVMStyleWithColumns(12)));
2070 }
2071 
2072 TEST_F(FormatTest, EndOfFileEndsPPDirective) {
2073   EXPECT_EQ("#line 42 \"test\"",
2074             format("#  \\\n  line  \\\n  42  \\\n  \"test\""));
2075   EXPECT_EQ("#define A B", format("#  \\\n define  \\\n    A  \\\n       B"));
2076 }
2077 
2078 TEST_F(FormatTest, DoesntRemoveUnknownTokens) {
2079   verifyFormat("#define A \\x20");
2080   verifyFormat("#define A \\ x20");
2081   EXPECT_EQ("#define A \\ x20", format("#define A \\   x20"));
2082   verifyFormat("#define A ''");
2083   verifyFormat("#define A ''qqq");
2084   verifyFormat("#define A `qqq");
2085   verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");");
2086   EXPECT_EQ("const char *c = STRINGIFY(\n"
2087             "\\na : b);",
2088             format("const char * c = STRINGIFY(\n"
2089                    "\\na : b);"));
2090 
2091   verifyFormat("a\r\\");
2092   verifyFormat("a\v\\");
2093   verifyFormat("a\f\\");
2094 }
2095 
2096 TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) {
2097   verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13));
2098   verifyFormat("#define A( \\\n    BB)", getLLVMStyleWithColumns(12));
2099   verifyFormat("#define A( \\\n    A, B)", getLLVMStyleWithColumns(12));
2100   // FIXME: We never break before the macro name.
2101   verifyFormat("#define AA( \\\n    B)", getLLVMStyleWithColumns(12));
2102 
2103   verifyFormat("#define A A\n#define A A");
2104   verifyFormat("#define A(X) A\n#define A A");
2105 
2106   verifyFormat("#define Something Other", getLLVMStyleWithColumns(23));
2107   verifyFormat("#define Something    \\\n  Other", getLLVMStyleWithColumns(22));
2108 }
2109 
2110 TEST_F(FormatTest, HandlePreprocessorDirectiveContext) {
2111   EXPECT_EQ("// somecomment\n"
2112             "#include \"a.h\"\n"
2113             "#define A(  \\\n"
2114             "    A, B)\n"
2115             "#include \"b.h\"\n"
2116             "// somecomment\n",
2117             format("  // somecomment\n"
2118                    "  #include \"a.h\"\n"
2119                    "#define A(A,\\\n"
2120                    "    B)\n"
2121                    "    #include \"b.h\"\n"
2122                    " // somecomment\n",
2123                    getLLVMStyleWithColumns(13)));
2124 }
2125 
2126 TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); }
2127 
2128 TEST_F(FormatTest, LayoutCodeInMacroDefinitions) {
2129   EXPECT_EQ("#define A    \\\n"
2130             "  c;         \\\n"
2131             "  e;\n"
2132             "f;",
2133             format("#define A c; e;\n"
2134                    "f;",
2135                    getLLVMStyleWithColumns(14)));
2136 }
2137 
2138 TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); }
2139 
2140 TEST_F(FormatTest, MacroDefinitionInsideStatement) {
2141   EXPECT_EQ("int x,\n"
2142             "#define A\n"
2143             "    y;",
2144             format("int x,\n#define A\ny;"));
2145 }
2146 
2147 TEST_F(FormatTest, HashInMacroDefinition) {
2148   EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle()));
2149   verifyFormat("#define A \\\n  b #c;", getLLVMStyleWithColumns(11));
2150   verifyFormat("#define A  \\\n"
2151                "  {        \\\n"
2152                "    f(#c); \\\n"
2153                "  }",
2154                getLLVMStyleWithColumns(11));
2155 
2156   verifyFormat("#define A(X)         \\\n"
2157                "  void function##X()",
2158                getLLVMStyleWithColumns(22));
2159 
2160   verifyFormat("#define A(a, b, c)   \\\n"
2161                "  void a##b##c()",
2162                getLLVMStyleWithColumns(22));
2163 
2164   verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22));
2165 }
2166 
2167 TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) {
2168   EXPECT_EQ("#define A (x)", format("#define A (x)"));
2169   EXPECT_EQ("#define A(x)", format("#define A(x)"));
2170 }
2171 
2172 TEST_F(FormatTest, EmptyLinesInMacroDefinitions) {
2173   EXPECT_EQ("#define A b;", format("#define A \\\n"
2174                                    "          \\\n"
2175                                    "  b;",
2176                                    getLLVMStyleWithColumns(25)));
2177   EXPECT_EQ("#define A \\\n"
2178             "          \\\n"
2179             "  a;      \\\n"
2180             "  b;",
2181             format("#define A \\\n"
2182                    "          \\\n"
2183                    "  a;      \\\n"
2184                    "  b;",
2185                    getLLVMStyleWithColumns(11)));
2186   EXPECT_EQ("#define A \\\n"
2187             "  a;      \\\n"
2188             "          \\\n"
2189             "  b;",
2190             format("#define A \\\n"
2191                    "  a;      \\\n"
2192                    "          \\\n"
2193                    "  b;",
2194                    getLLVMStyleWithColumns(11)));
2195 }
2196 
2197 TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) {
2198   verifyIncompleteFormat("#define A :");
2199   verifyFormat("#define SOMECASES  \\\n"
2200                "  case 1:          \\\n"
2201                "  case 2\n",
2202                getLLVMStyleWithColumns(20));
2203   verifyFormat("#define MACRO(a) \\\n"
2204                "  if (a)         \\\n"
2205                "    f();         \\\n"
2206                "  else           \\\n"
2207                "    g()",
2208                getLLVMStyleWithColumns(18));
2209   verifyFormat("#define A template <typename T>");
2210   verifyIncompleteFormat("#define STR(x) #x\n"
2211                          "f(STR(this_is_a_string_literal{));");
2212   verifyFormat("#pragma omp threadprivate( \\\n"
2213                "    y)), // expected-warning",
2214                getLLVMStyleWithColumns(28));
2215   verifyFormat("#d, = };");
2216   verifyFormat("#if \"a");
2217   verifyIncompleteFormat("({\n"
2218                          "#define b     \\\n"
2219                          "  }           \\\n"
2220                          "  a\n"
2221                          "a",
2222                          getLLVMStyleWithColumns(15));
2223   verifyFormat("#define A     \\\n"
2224                "  {           \\\n"
2225                "    {\n"
2226                "#define B     \\\n"
2227                "  }           \\\n"
2228                "  }",
2229                getLLVMStyleWithColumns(15));
2230   verifyNoCrash("#if a\na(\n#else\n#endif\n{a");
2231   verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}");
2232   verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};");
2233   verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() {      \n)}");
2234 }
2235 
2236 TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) {
2237   verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline.
2238   EXPECT_EQ("class A : public QObject {\n"
2239             "  Q_OBJECT\n"
2240             "\n"
2241             "  A() {}\n"
2242             "};",
2243             format("class A  :  public QObject {\n"
2244                    "     Q_OBJECT\n"
2245                    "\n"
2246                    "  A() {\n}\n"
2247                    "}  ;"));
2248   EXPECT_EQ("MACRO\n"
2249             "/*static*/ int i;",
2250             format("MACRO\n"
2251                    " /*static*/ int   i;"));
2252   EXPECT_EQ("SOME_MACRO\n"
2253             "namespace {\n"
2254             "void f();\n"
2255             "} // namespace",
2256             format("SOME_MACRO\n"
2257                    "  namespace    {\n"
2258                    "void   f(  );\n"
2259                    "} // namespace"));
2260   // Only if the identifier contains at least 5 characters.
2261   EXPECT_EQ("HTTP f();", format("HTTP\nf();"));
2262   EXPECT_EQ("MACRO\nf();", format("MACRO\nf();"));
2263   // Only if everything is upper case.
2264   EXPECT_EQ("class A : public QObject {\n"
2265             "  Q_Object A() {}\n"
2266             "};",
2267             format("class A  :  public QObject {\n"
2268                    "     Q_Object\n"
2269                    "  A() {\n}\n"
2270                    "}  ;"));
2271 
2272   // Only if the next line can actually start an unwrapped line.
2273   EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;",
2274             format("SOME_WEIRD_LOG_MACRO\n"
2275                    "<< SomeThing;"));
2276 
2277   verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), "
2278                "(n, buffers))\n",
2279                getChromiumStyle(FormatStyle::LK_Cpp));
2280 }
2281 
2282 TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) {
2283   EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
2284             "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
2285             "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
2286             "class X {};\n"
2287             "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
2288             "int *createScopDetectionPass() { return 0; }",
2289             format("  INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
2290                    "  INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
2291                    "  INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
2292                    "  class X {};\n"
2293                    "  INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
2294                    "  int *createScopDetectionPass() { return 0; }"));
2295   // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as
2296   // braces, so that inner block is indented one level more.
2297   EXPECT_EQ("int q() {\n"
2298             "  IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2299             "  IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2300             "  IPC_END_MESSAGE_MAP()\n"
2301             "}",
2302             format("int q() {\n"
2303                    "  IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2304                    "    IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2305                    "  IPC_END_MESSAGE_MAP()\n"
2306                    "}"));
2307 
2308   // Same inside macros.
2309   EXPECT_EQ("#define LIST(L) \\\n"
2310             "  L(A)          \\\n"
2311             "  L(B)          \\\n"
2312             "  L(C)",
2313             format("#define LIST(L) \\\n"
2314                    "  L(A) \\\n"
2315                    "  L(B) \\\n"
2316                    "  L(C)",
2317                    getGoogleStyle()));
2318 
2319   // These must not be recognized as macros.
2320   EXPECT_EQ("int q() {\n"
2321             "  f(x);\n"
2322             "  f(x) {}\n"
2323             "  f(x)->g();\n"
2324             "  f(x)->*g();\n"
2325             "  f(x).g();\n"
2326             "  f(x) = x;\n"
2327             "  f(x) += x;\n"
2328             "  f(x) -= x;\n"
2329             "  f(x) *= x;\n"
2330             "  f(x) /= x;\n"
2331             "  f(x) %= x;\n"
2332             "  f(x) &= x;\n"
2333             "  f(x) |= x;\n"
2334             "  f(x) ^= x;\n"
2335             "  f(x) >>= x;\n"
2336             "  f(x) <<= x;\n"
2337             "  f(x)[y].z();\n"
2338             "  LOG(INFO) << x;\n"
2339             "  ifstream(x) >> x;\n"
2340             "}\n",
2341             format("int q() {\n"
2342                    "  f(x)\n;\n"
2343                    "  f(x)\n {}\n"
2344                    "  f(x)\n->g();\n"
2345                    "  f(x)\n->*g();\n"
2346                    "  f(x)\n.g();\n"
2347                    "  f(x)\n = x;\n"
2348                    "  f(x)\n += x;\n"
2349                    "  f(x)\n -= x;\n"
2350                    "  f(x)\n *= x;\n"
2351                    "  f(x)\n /= x;\n"
2352                    "  f(x)\n %= x;\n"
2353                    "  f(x)\n &= x;\n"
2354                    "  f(x)\n |= x;\n"
2355                    "  f(x)\n ^= x;\n"
2356                    "  f(x)\n >>= x;\n"
2357                    "  f(x)\n <<= x;\n"
2358                    "  f(x)\n[y].z();\n"
2359                    "  LOG(INFO)\n << x;\n"
2360                    "  ifstream(x)\n >> x;\n"
2361                    "}\n"));
2362   EXPECT_EQ("int q() {\n"
2363             "  F(x)\n"
2364             "  if (1) {\n"
2365             "  }\n"
2366             "  F(x)\n"
2367             "  while (1) {\n"
2368             "  }\n"
2369             "  F(x)\n"
2370             "  G(x);\n"
2371             "  F(x)\n"
2372             "  try {\n"
2373             "    Q();\n"
2374             "  } catch (...) {\n"
2375             "  }\n"
2376             "}\n",
2377             format("int q() {\n"
2378                    "F(x)\n"
2379                    "if (1) {}\n"
2380                    "F(x)\n"
2381                    "while (1) {}\n"
2382                    "F(x)\n"
2383                    "G(x);\n"
2384                    "F(x)\n"
2385                    "try { Q(); } catch (...) {}\n"
2386                    "}\n"));
2387   EXPECT_EQ("class A {\n"
2388             "  A() : t(0) {}\n"
2389             "  A(int i) noexcept() : {}\n"
2390             "  A(X x)\n" // FIXME: function-level try blocks are broken.
2391             "  try : t(0) {\n"
2392             "  } catch (...) {\n"
2393             "  }\n"
2394             "};",
2395             format("class A {\n"
2396                    "  A()\n : t(0) {}\n"
2397                    "  A(int i)\n noexcept() : {}\n"
2398                    "  A(X x)\n"
2399                    "  try : t(0) {} catch (...) {}\n"
2400                    "};"));
2401   EXPECT_EQ("class SomeClass {\n"
2402             "public:\n"
2403             "  SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2404             "};",
2405             format("class SomeClass {\n"
2406                    "public:\n"
2407                    "  SomeClass()\n"
2408                    "  EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2409                    "};"));
2410   EXPECT_EQ("class SomeClass {\n"
2411             "public:\n"
2412             "  SomeClass()\n"
2413             "      EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2414             "};",
2415             format("class SomeClass {\n"
2416                    "public:\n"
2417                    "  SomeClass()\n"
2418                    "  EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2419                    "};",
2420                    getLLVMStyleWithColumns(40)));
2421 
2422   verifyFormat("MACRO(>)");
2423 }
2424 
2425 TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) {
2426   verifyFormat("#define A \\\n"
2427                "  f({     \\\n"
2428                "    g();  \\\n"
2429                "  });",
2430                getLLVMStyleWithColumns(11));
2431 }
2432 
2433 TEST_F(FormatTest, IndentPreprocessorDirectives) {
2434   FormatStyle Style = getLLVMStyle();
2435   Style.IndentPPDirectives = FormatStyle::PPDIS_None;
2436   Style.ColumnLimit = 40;
2437   verifyFormat("#ifdef _WIN32\n"
2438                "#define A 0\n"
2439                "#ifdef VAR2\n"
2440                "#define B 1\n"
2441                "#include <someheader.h>\n"
2442                "#define MACRO                          \\\n"
2443                "  some_very_long_func_aaaaaaaaaa();\n"
2444                "#endif\n"
2445                "#else\n"
2446                "#define A 1\n"
2447                "#endif",
2448                Style);
2449   Style.IndentPPDirectives = FormatStyle::PPDIS_AfterHash;
2450   verifyFormat("#ifdef _WIN32\n"
2451                "#  define A 0\n"
2452                "#  ifdef VAR2\n"
2453                "#    define B 1\n"
2454                "#    include <someheader.h>\n"
2455                "#    define MACRO                      \\\n"
2456                "      some_very_long_func_aaaaaaaaaa();\n"
2457                "#  endif\n"
2458                "#else\n"
2459                "#  define A 1\n"
2460                "#endif",
2461                Style);
2462   verifyFormat("#if A\n"
2463                "#  define MACRO                        \\\n"
2464                "    void a(int x) {                    \\\n"
2465                "      b();                             \\\n"
2466                "      c();                             \\\n"
2467                "      d();                             \\\n"
2468                "      e();                             \\\n"
2469                "      f();                             \\\n"
2470                "    }\n"
2471                "#endif",
2472                Style);
2473   // Comments before include guard.
2474   verifyFormat("// file comment\n"
2475                "// file comment\n"
2476                "#ifndef HEADER_H\n"
2477                "#define HEADER_H\n"
2478                "code();\n"
2479                "#endif",
2480                Style);
2481   // Test with include guards.
2482   // EXPECT_EQ is used because verifyFormat() calls messUp() which incorrectly
2483   // merges lines.
2484   verifyFormat("#ifndef HEADER_H\n"
2485                "#define HEADER_H\n"
2486                "code();\n"
2487                "#endif",
2488                Style);
2489   // Include guards must have a #define with the same variable immediately
2490   // after #ifndef.
2491   verifyFormat("#ifndef NOT_GUARD\n"
2492                "#  define FOO\n"
2493                "code();\n"
2494                "#endif",
2495                Style);
2496 
2497   // Include guards must cover the entire file.
2498   verifyFormat("code();\n"
2499                "code();\n"
2500                "#ifndef NOT_GUARD\n"
2501                "#  define NOT_GUARD\n"
2502                "code();\n"
2503                "#endif",
2504                Style);
2505   verifyFormat("#ifndef NOT_GUARD\n"
2506                "#  define NOT_GUARD\n"
2507                "code();\n"
2508                "#endif\n"
2509                "code();",
2510                Style);
2511   // Test with trailing blank lines.
2512   verifyFormat("#ifndef HEADER_H\n"
2513                "#define HEADER_H\n"
2514                "code();\n"
2515                "#endif\n",
2516                Style);
2517   // Include guards don't have #else.
2518   verifyFormat("#ifndef NOT_GUARD\n"
2519                "#  define NOT_GUARD\n"
2520                "code();\n"
2521                "#else\n"
2522                "#endif",
2523                Style);
2524   verifyFormat("#ifndef NOT_GUARD\n"
2525                "#  define NOT_GUARD\n"
2526                "code();\n"
2527                "#elif FOO\n"
2528                "#endif",
2529                Style);
2530   // FIXME: This doesn't handle the case where there's code between the
2531   // #ifndef and #define but all other conditions hold. This is because when
2532   // the #define line is parsed, UnwrappedLineParser::Lines doesn't hold the
2533   // previous code line yet, so we can't detect it.
2534   EXPECT_EQ("#ifndef NOT_GUARD\n"
2535             "code();\n"
2536             "#define NOT_GUARD\n"
2537             "code();\n"
2538             "#endif",
2539             format("#ifndef NOT_GUARD\n"
2540                    "code();\n"
2541                    "#  define NOT_GUARD\n"
2542                    "code();\n"
2543                    "#endif",
2544                    Style));
2545   // FIXME: This doesn't handle cases where legitimate preprocessor lines may
2546   // be outside an include guard. Examples are #pragma once and
2547   // #pragma GCC diagnostic, or anything else that does not change the meaning
2548   // of the file if it's included multiple times.
2549   EXPECT_EQ("#ifdef WIN32\n"
2550             "#  pragma once\n"
2551             "#endif\n"
2552             "#ifndef HEADER_H\n"
2553             "#  define HEADER_H\n"
2554             "code();\n"
2555             "#endif",
2556             format("#ifdef WIN32\n"
2557                    "#  pragma once\n"
2558                    "#endif\n"
2559                    "#ifndef HEADER_H\n"
2560                    "#define HEADER_H\n"
2561                    "code();\n"
2562                    "#endif",
2563                    Style));
2564   // FIXME: This does not detect when there is a single non-preprocessor line
2565   // in front of an include-guard-like structure where other conditions hold
2566   // because ScopedLineState hides the line.
2567   EXPECT_EQ("code();\n"
2568             "#ifndef HEADER_H\n"
2569             "#define HEADER_H\n"
2570             "code();\n"
2571             "#endif",
2572             format("code();\n"
2573                    "#ifndef HEADER_H\n"
2574                    "#  define HEADER_H\n"
2575                    "code();\n"
2576                    "#endif",
2577                    Style));
2578   // FIXME: The comment indent corrector in TokenAnnotator gets thrown off by
2579   // preprocessor indentation.
2580   EXPECT_EQ("#if 1\n"
2581             "  // comment\n"
2582             "#  define A 0\n"
2583             "// comment\n"
2584             "#  define B 0\n"
2585             "#endif",
2586             format("#if 1\n"
2587                    "// comment\n"
2588                    "#  define A 0\n"
2589                    "   // comment\n"
2590                    "#  define B 0\n"
2591                    "#endif",
2592                    Style));
2593   // Test with tabs.
2594   Style.UseTab = FormatStyle::UT_Always;
2595   Style.IndentWidth = 8;
2596   Style.TabWidth = 8;
2597   verifyFormat("#ifdef _WIN32\n"
2598                "#\tdefine A 0\n"
2599                "#\tifdef VAR2\n"
2600                "#\t\tdefine B 1\n"
2601                "#\t\tinclude <someheader.h>\n"
2602                "#\t\tdefine MACRO          \\\n"
2603                "\t\t\tsome_very_long_func_aaaaaaaaaa();\n"
2604                "#\tendif\n"
2605                "#else\n"
2606                "#\tdefine A 1\n"
2607                "#endif",
2608                Style);
2609 
2610   // Regression test: Multiline-macro inside include guards.
2611   verifyFormat("#ifndef HEADER_H\n"
2612                "#define HEADER_H\n"
2613                "#define A()        \\\n"
2614                "  int i;           \\\n"
2615                "  int j;\n"
2616                "#endif // HEADER_H",
2617                getLLVMStyleWithColumns(20));
2618 }
2619 
2620 TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) {
2621   verifyFormat("{\n  { a #c; }\n}");
2622 }
2623 
2624 TEST_F(FormatTest, FormatUnbalancedStructuralElements) {
2625   EXPECT_EQ("#define A \\\n  {       \\\n    {\nint i;",
2626             format("#define A { {\nint i;", getLLVMStyleWithColumns(11)));
2627   EXPECT_EQ("#define A \\\n  }       \\\n  }\nint i;",
2628             format("#define A } }\nint i;", getLLVMStyleWithColumns(11)));
2629 }
2630 
2631 TEST_F(FormatTest, EscapedNewlines) {
2632   EXPECT_EQ(
2633       "#define A \\\n  int i;  \\\n  int j;",
2634       format("#define A \\\nint i;\\\n  int j;", getLLVMStyleWithColumns(11)));
2635   EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;"));
2636   EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
2637   EXPECT_EQ("/* \\  \\  \\\n */", format("\\\n/* \\  \\  \\\n */"));
2638   EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>"));
2639 
2640   FormatStyle DontAlign = getLLVMStyle();
2641   DontAlign.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
2642   DontAlign.MaxEmptyLinesToKeep = 3;
2643   // FIXME: can't use verifyFormat here because the newline before
2644   // "public:" is not inserted the first time it's reformatted
2645   EXPECT_EQ("#define A \\\n"
2646             "  class Foo { \\\n"
2647             "    void bar(); \\\n"
2648             "\\\n"
2649             "\\\n"
2650             "\\\n"
2651             "  public: \\\n"
2652             "    void baz(); \\\n"
2653             "  };",
2654             format("#define A \\\n"
2655                    "  class Foo { \\\n"
2656                    "    void bar(); \\\n"
2657                    "\\\n"
2658                    "\\\n"
2659                    "\\\n"
2660                    "  public: \\\n"
2661                    "    void baz(); \\\n"
2662                    "  };", DontAlign));
2663 }
2664 
2665 TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) {
2666   verifyFormat("#define A \\\n"
2667                "  int v(  \\\n"
2668                "      a); \\\n"
2669                "  int i;",
2670                getLLVMStyleWithColumns(11));
2671 }
2672 
2673 TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) {
2674   EXPECT_EQ(
2675       "#define ALooooooooooooooooooooooooooooooooooooooongMacro("
2676       "                      \\\n"
2677       "    aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
2678       "\n"
2679       "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
2680       "    aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n",
2681       format("  #define   ALooooooooooooooooooooooooooooooooooooooongMacro("
2682              "\\\n"
2683              "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
2684              "  \n"
2685              "   AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
2686              "  aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n"));
2687 }
2688 
2689 TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) {
2690   EXPECT_EQ("int\n"
2691             "#define A\n"
2692             "    a;",
2693             format("int\n#define A\na;"));
2694   verifyFormat("functionCallTo(\n"
2695                "    someOtherFunction(\n"
2696                "        withSomeParameters, whichInSequence,\n"
2697                "        areLongerThanALine(andAnotherCall,\n"
2698                "#define A B\n"
2699                "                           withMoreParamters,\n"
2700                "                           whichStronglyInfluenceTheLayout),\n"
2701                "        andMoreParameters),\n"
2702                "    trailing);",
2703                getLLVMStyleWithColumns(69));
2704   verifyFormat("Foo::Foo()\n"
2705                "#ifdef BAR\n"
2706                "    : baz(0)\n"
2707                "#endif\n"
2708                "{\n"
2709                "}");
2710   verifyFormat("void f() {\n"
2711                "  if (true)\n"
2712                "#ifdef A\n"
2713                "    f(42);\n"
2714                "  x();\n"
2715                "#else\n"
2716                "    g();\n"
2717                "  x();\n"
2718                "#endif\n"
2719                "}");
2720   verifyFormat("void f(param1, param2,\n"
2721                "       param3,\n"
2722                "#ifdef A\n"
2723                "       param4(param5,\n"
2724                "#ifdef A1\n"
2725                "              param6,\n"
2726                "#ifdef A2\n"
2727                "              param7),\n"
2728                "#else\n"
2729                "              param8),\n"
2730                "       param9,\n"
2731                "#endif\n"
2732                "       param10,\n"
2733                "#endif\n"
2734                "       param11)\n"
2735                "#else\n"
2736                "       param12)\n"
2737                "#endif\n"
2738                "{\n"
2739                "  x();\n"
2740                "}",
2741                getLLVMStyleWithColumns(28));
2742   verifyFormat("#if 1\n"
2743                "int i;");
2744   verifyFormat("#if 1\n"
2745                "#endif\n"
2746                "#if 1\n"
2747                "#else\n"
2748                "#endif\n");
2749   verifyFormat("DEBUG({\n"
2750                "  return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2751                "         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
2752                "});\n"
2753                "#if a\n"
2754                "#else\n"
2755                "#endif");
2756 
2757   verifyIncompleteFormat("void f(\n"
2758                          "#if A\n"
2759                          ");\n"
2760                          "#else\n"
2761                          "#endif");
2762 }
2763 
2764 TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) {
2765   verifyFormat("#endif\n"
2766                "#if B");
2767 }
2768 
2769 TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) {
2770   FormatStyle SingleLine = getLLVMStyle();
2771   SingleLine.AllowShortIfStatementsOnASingleLine = true;
2772   verifyFormat("#if 0\n"
2773                "#elif 1\n"
2774                "#endif\n"
2775                "void foo() {\n"
2776                "  if (test) foo2();\n"
2777                "}",
2778                SingleLine);
2779 }
2780 
2781 TEST_F(FormatTest, LayoutBlockInsideParens) {
2782   verifyFormat("functionCall({ int i; });");
2783   verifyFormat("functionCall({\n"
2784                "  int i;\n"
2785                "  int j;\n"
2786                "});");
2787   verifyFormat("functionCall(\n"
2788                "    {\n"
2789                "      int i;\n"
2790                "      int j;\n"
2791                "    },\n"
2792                "    aaaa, bbbb, cccc);");
2793   verifyFormat("functionA(functionB({\n"
2794                "            int i;\n"
2795                "            int j;\n"
2796                "          }),\n"
2797                "          aaaa, bbbb, cccc);");
2798   verifyFormat("functionCall(\n"
2799                "    {\n"
2800                "      int i;\n"
2801                "      int j;\n"
2802                "    },\n"
2803                "    aaaa, bbbb, // comment\n"
2804                "    cccc);");
2805   verifyFormat("functionA(functionB({\n"
2806                "            int i;\n"
2807                "            int j;\n"
2808                "          }),\n"
2809                "          aaaa, bbbb, // comment\n"
2810                "          cccc);");
2811   verifyFormat("functionCall(aaaa, bbbb, { int i; });");
2812   verifyFormat("functionCall(aaaa, bbbb, {\n"
2813                "  int i;\n"
2814                "  int j;\n"
2815                "});");
2816   verifyFormat(
2817       "Aaa(\n" // FIXME: There shouldn't be a linebreak here.
2818       "    {\n"
2819       "      int i; // break\n"
2820       "    },\n"
2821       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
2822       "                                     ccccccccccccccccc));");
2823   verifyFormat("DEBUG({\n"
2824                "  if (a)\n"
2825                "    f();\n"
2826                "});");
2827 }
2828 
2829 TEST_F(FormatTest, LayoutBlockInsideStatement) {
2830   EXPECT_EQ("SOME_MACRO { int i; }\n"
2831             "int i;",
2832             format("  SOME_MACRO  {int i;}  int i;"));
2833 }
2834 
2835 TEST_F(FormatTest, LayoutNestedBlocks) {
2836   verifyFormat("void AddOsStrings(unsigned bitmask) {\n"
2837                "  struct s {\n"
2838                "    int i;\n"
2839                "  };\n"
2840                "  s kBitsToOs[] = {{10}};\n"
2841                "  for (int i = 0; i < 10; ++i)\n"
2842                "    return;\n"
2843                "}");
2844   verifyFormat("call(parameter, {\n"
2845                "  something();\n"
2846                "  // Comment using all columns.\n"
2847                "  somethingelse();\n"
2848                "});",
2849                getLLVMStyleWithColumns(40));
2850   verifyFormat("DEBUG( //\n"
2851                "    { f(); }, a);");
2852   verifyFormat("DEBUG( //\n"
2853                "    {\n"
2854                "      f(); //\n"
2855                "    },\n"
2856                "    a);");
2857 
2858   EXPECT_EQ("call(parameter, {\n"
2859             "  something();\n"
2860             "  // Comment too\n"
2861             "  // looooooooooong.\n"
2862             "  somethingElse();\n"
2863             "});",
2864             format("call(parameter, {\n"
2865                    "  something();\n"
2866                    "  // Comment too looooooooooong.\n"
2867                    "  somethingElse();\n"
2868                    "});",
2869                    getLLVMStyleWithColumns(29)));
2870   EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int   i; });"));
2871   EXPECT_EQ("DEBUG({ // comment\n"
2872             "  int i;\n"
2873             "});",
2874             format("DEBUG({ // comment\n"
2875                    "int  i;\n"
2876                    "});"));
2877   EXPECT_EQ("DEBUG({\n"
2878             "  int i;\n"
2879             "\n"
2880             "  // comment\n"
2881             "  int j;\n"
2882             "});",
2883             format("DEBUG({\n"
2884                    "  int  i;\n"
2885                    "\n"
2886                    "  // comment\n"
2887                    "  int  j;\n"
2888                    "});"));
2889 
2890   verifyFormat("DEBUG({\n"
2891                "  if (a)\n"
2892                "    return;\n"
2893                "});");
2894   verifyGoogleFormat("DEBUG({\n"
2895                      "  if (a) return;\n"
2896                      "});");
2897   FormatStyle Style = getGoogleStyle();
2898   Style.ColumnLimit = 45;
2899   verifyFormat("Debug(aaaaa,\n"
2900                "      {\n"
2901                "        if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n"
2902                "      },\n"
2903                "      a);",
2904                Style);
2905 
2906   verifyFormat("SomeFunction({MACRO({ return output; }), b});");
2907 
2908   verifyNoCrash("^{v^{a}}");
2909 }
2910 
2911 TEST_F(FormatTest, FormatNestedBlocksInMacros) {
2912   EXPECT_EQ("#define MACRO()                     \\\n"
2913             "  Debug(aaa, /* force line break */ \\\n"
2914             "        {                           \\\n"
2915             "          int i;                    \\\n"
2916             "          int j;                    \\\n"
2917             "        })",
2918             format("#define   MACRO()   Debug(aaa,  /* force line break */ \\\n"
2919                    "          {  int   i;  int  j;   })",
2920                    getGoogleStyle()));
2921 
2922   EXPECT_EQ("#define A                                       \\\n"
2923             "  [] {                                          \\\n"
2924             "    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx(        \\\n"
2925             "        xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n"
2926             "  }",
2927             format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
2928                    "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }",
2929                    getGoogleStyle()));
2930 }
2931 
2932 TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) {
2933   EXPECT_EQ("{}", format("{}"));
2934   verifyFormat("enum E {};");
2935   verifyFormat("enum E {}");
2936 }
2937 
2938 TEST_F(FormatTest, FormatBeginBlockEndMacros) {
2939   FormatStyle Style = getLLVMStyle();
2940   Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$";
2941   Style.MacroBlockEnd = "^[A-Z_]+_END$";
2942   verifyFormat("FOO_BEGIN\n"
2943                "  FOO_ENTRY\n"
2944                "FOO_END", Style);
2945   verifyFormat("FOO_BEGIN\n"
2946                "  NESTED_FOO_BEGIN\n"
2947                "    NESTED_FOO_ENTRY\n"
2948                "  NESTED_FOO_END\n"
2949                "FOO_END", Style);
2950   verifyFormat("FOO_BEGIN(Foo, Bar)\n"
2951                "  int x;\n"
2952                "  x = 1;\n"
2953                "FOO_END(Baz)", Style);
2954 }
2955 
2956 //===----------------------------------------------------------------------===//
2957 // Line break tests.
2958 //===----------------------------------------------------------------------===//
2959 
2960 TEST_F(FormatTest, PreventConfusingIndents) {
2961   verifyFormat(
2962       "void f() {\n"
2963       "  SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
2964       "                         parameter, parameter, parameter)),\n"
2965       "                     SecondLongCall(parameter));\n"
2966       "}");
2967   verifyFormat(
2968       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2969       "    aaaaaaaaaaaaaaaaaaaaaaaa(\n"
2970       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
2971       "    aaaaaaaaaaaaaaaaaaaaaaaa);");
2972   verifyFormat(
2973       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2974       "    [aaaaaaaaaaaaaaaaaaaaaaaa\n"
2975       "         [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
2976       "         [aaaaaaaaaaaaaaaaaaaaaaaa]];");
2977   verifyFormat(
2978       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
2979       "    aaaaaaaaaaaaaaaaaaaaaaaa<\n"
2980       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n"
2981       "    aaaaaaaaaaaaaaaaaaaaaaaa>;");
2982   verifyFormat("int a = bbbb && ccc &&\n"
2983                "        fffff(\n"
2984                "#define A Just forcing a new line\n"
2985                "            ddd);");
2986 }
2987 
2988 TEST_F(FormatTest, LineBreakingInBinaryExpressions) {
2989   verifyFormat(
2990       "bool aaaaaaa =\n"
2991       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n"
2992       "    bbbbbbbb();");
2993   verifyFormat(
2994       "bool aaaaaaa =\n"
2995       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n"
2996       "    bbbbbbbb();");
2997 
2998   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
2999                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n"
3000                "    ccccccccc == ddddddddddd;");
3001   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3002                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n"
3003                "    ccccccccc == ddddddddddd;");
3004   verifyFormat(
3005       "bool aaaaaaaaaaaaaaaaaaaaa =\n"
3006       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n"
3007       "    ccccccccc == ddddddddddd;");
3008 
3009   verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3010                "                 aaaaaa) &&\n"
3011                "         bbbbbb && cccccc;");
3012   verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3013                "                 aaaaaa) >>\n"
3014                "         bbbbbb;");
3015   verifyFormat("aa = Whitespaces.addUntouchableComment(\n"
3016                "    SourceMgr.getSpellingColumnNumber(\n"
3017                "        TheLine.Last->FormatTok.Tok.getLocation()) -\n"
3018                "    1);");
3019 
3020   verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3021                "     bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n"
3022                "    cccccc) {\n}");
3023   verifyFormat("if constexpr ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3024                "               bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n"
3025                "              cccccc) {\n}");
3026   verifyFormat("b = a &&\n"
3027                "    // Comment\n"
3028                "    b.c && d;");
3029 
3030   // If the LHS of a comparison is not a binary expression itself, the
3031   // additional linebreak confuses many people.
3032   verifyFormat(
3033       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3034       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n"
3035       "}");
3036   verifyFormat(
3037       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3038       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3039       "}");
3040   verifyFormat(
3041       "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n"
3042       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3043       "}");
3044   // Even explicit parentheses stress the precedence enough to make the
3045   // additional break unnecessary.
3046   verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3047                "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3048                "}");
3049   // This cases is borderline, but with the indentation it is still readable.
3050   verifyFormat(
3051       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3052       "        aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3053       "                               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
3054       "}",
3055       getLLVMStyleWithColumns(75));
3056 
3057   // If the LHS is a binary expression, we should still use the additional break
3058   // as otherwise the formatting hides the operator precedence.
3059   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3060                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3061                "    5) {\n"
3062                "}");
3063 
3064   FormatStyle OnePerLine = getLLVMStyle();
3065   OnePerLine.BinPackParameters = false;
3066   verifyFormat(
3067       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3068       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3069       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}",
3070       OnePerLine);
3071 
3072   verifyFormat("int i = someFunction(aaaaaaa, 0)\n"
3073                "                .aaa(aaaaaaaaaaaaa) *\n"
3074                "            aaaaaaa +\n"
3075                "        aaaaaaa;",
3076                getLLVMStyleWithColumns(40));
3077 }
3078 
3079 TEST_F(FormatTest, ExpressionIndentation) {
3080   verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3081                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3082                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3083                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3084                "                         bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
3085                "                     bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n"
3086                "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3087                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n"
3088                "                 ccccccccccccccccccccccccccccccccccccccccc;");
3089   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3090                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3091                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3092                "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3093   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3094                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3095                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3096                "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3097   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3098                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3099                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3100                "        bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3101   verifyFormat("if () {\n"
3102                "} else if (aaaaa && bbbbb > // break\n"
3103                "                        ccccc) {\n"
3104                "}");
3105   verifyFormat("if () {\n"
3106                "} else if (aaaaa &&\n"
3107                "           bbbbb > // break\n"
3108                "               ccccc &&\n"
3109                "           ddddd) {\n"
3110                "}");
3111 
3112   // Presence of a trailing comment used to change indentation of b.
3113   verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n"
3114                "       b;\n"
3115                "return aaaaaaaaaaaaaaaaaaa +\n"
3116                "       b; //",
3117                getLLVMStyleWithColumns(30));
3118 }
3119 
3120 TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) {
3121   // Not sure what the best system is here. Like this, the LHS can be found
3122   // immediately above an operator (everything with the same or a higher
3123   // indent). The RHS is aligned right of the operator and so compasses
3124   // everything until something with the same indent as the operator is found.
3125   // FIXME: Is this a good system?
3126   FormatStyle Style = getLLVMStyle();
3127   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
3128   verifyFormat(
3129       "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3130       "                     + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3131       "                     + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3132       "                 == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3133       "                            * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3134       "                        + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3135       "             && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3136       "                        * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3137       "                    > ccccccccccccccccccccccccccccccccccccccccc;",
3138       Style);
3139   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3140                "            * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3141                "        + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3142                "    == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3143                Style);
3144   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3145                "        + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3146                "              * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3147                "    == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3148                Style);
3149   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3150                "    == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3151                "               * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3152                "           + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3153                Style);
3154   verifyFormat("if () {\n"
3155                "} else if (aaaaa\n"
3156                "           && bbbbb // break\n"
3157                "                  > ccccc) {\n"
3158                "}",
3159                Style);
3160   verifyFormat("return (a)\n"
3161                "       // comment\n"
3162                "       + b;",
3163                Style);
3164   verifyFormat(
3165       "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3166       "                 * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3167       "             + cc;",
3168       Style);
3169 
3170   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3171                "    = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
3172                Style);
3173 
3174   // Forced by comments.
3175   verifyFormat(
3176       "unsigned ContentSize =\n"
3177       "    sizeof(int16_t)   // DWARF ARange version number\n"
3178       "    + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
3179       "    + sizeof(int8_t)  // Pointer Size (in bytes)\n"
3180       "    + sizeof(int8_t); // Segment Size (in bytes)");
3181 
3182   verifyFormat("return boost::fusion::at_c<0>(iiii).second\n"
3183                "       == boost::fusion::at_c<1>(iiii).second;",
3184                Style);
3185 
3186   Style.ColumnLimit = 60;
3187   verifyFormat("zzzzzzzzzz\n"
3188                "    = bbbbbbbbbbbbbbbbb\n"
3189                "      >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);",
3190                Style);
3191 }
3192 
3193 TEST_F(FormatTest, EnforcedOperatorWraps) {
3194   // Here we'd like to wrap after the || operators, but a comment is forcing an
3195   // earlier wrap.
3196   verifyFormat("bool x = aaaaa //\n"
3197                "         || bbbbb\n"
3198                "         //\n"
3199                "         || cccc;");
3200 }
3201 
3202 TEST_F(FormatTest, NoOperandAlignment) {
3203   FormatStyle Style = getLLVMStyle();
3204   Style.AlignOperands = false;
3205   verifyFormat("aaaaaaaaaaaaaa(aaaaaaaaaaaa,\n"
3206                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3207                "                   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3208                Style);
3209   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
3210   verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3211                "            + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3212                "            + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3213                "        == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3214                "                * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3215                "            + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3216                "    && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3217                "            * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3218                "        > ccccccccccccccccccccccccccccccccccccccccc;",
3219                Style);
3220 
3221   verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3222                "        * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3223                "    + cc;",
3224                Style);
3225   verifyFormat("int a = aa\n"
3226                "    + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3227                "        * cccccccccccccccccccccccccccccccccccc;\n",
3228                Style);
3229 
3230   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
3231   verifyFormat("return (a > b\n"
3232                "    // comment1\n"
3233                "    // comment2\n"
3234                "    || c);",
3235                Style);
3236 }
3237 
3238 TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) {
3239   FormatStyle Style = getLLVMStyle();
3240   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
3241   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
3242                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3243                "    + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
3244                Style);
3245 }
3246 
3247 TEST_F(FormatTest, AllowBinPackingInsideArguments) {
3248   FormatStyle Style = getLLVMStyle();
3249   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
3250   Style.BinPackArguments = false;
3251   Style.ColumnLimit = 40;
3252   verifyFormat("void test() {\n"
3253                "  someFunction(\n"
3254                "      this + argument + is + quite\n"
3255                "      + long + so + it + gets + wrapped\n"
3256                "      + but + remains + bin - packed);\n"
3257                "}",
3258                Style);
3259   verifyFormat("void test() {\n"
3260                "  someFunction(arg1,\n"
3261                "               this + argument + is\n"
3262                "                   + quite + long + so\n"
3263                "                   + it + gets + wrapped\n"
3264                "                   + but + remains + bin\n"
3265                "                   - packed,\n"
3266                "               arg3);\n"
3267                "}",
3268                Style);
3269   verifyFormat("void test() {\n"
3270                "  someFunction(\n"
3271                "      arg1,\n"
3272                "      this + argument + has\n"
3273                "          + anotherFunc(nested,\n"
3274                "                        calls + whose\n"
3275                "                            + arguments\n"
3276                "                            + are + also\n"
3277                "                            + wrapped,\n"
3278                "                        in + addition)\n"
3279                "          + to + being + bin - packed,\n"
3280                "      arg3);\n"
3281                "}",
3282                Style);
3283 
3284   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
3285   verifyFormat("void test() {\n"
3286                "  someFunction(\n"
3287                "      arg1,\n"
3288                "      this + argument + has +\n"
3289                "          anotherFunc(nested,\n"
3290                "                      calls + whose +\n"
3291                "                          arguments +\n"
3292                "                          are + also +\n"
3293                "                          wrapped,\n"
3294                "                      in + addition) +\n"
3295                "          to + being + bin - packed,\n"
3296                "      arg3);\n"
3297                "}",
3298                Style);
3299 }
3300 
3301 TEST_F(FormatTest, ConstructorInitializers) {
3302   verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
3303   verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}",
3304                getLLVMStyleWithColumns(45));
3305   verifyFormat("Constructor()\n"
3306                "    : Inttializer(FitsOnTheLine) {}",
3307                getLLVMStyleWithColumns(44));
3308   verifyFormat("Constructor()\n"
3309                "    : Inttializer(FitsOnTheLine) {}",
3310                getLLVMStyleWithColumns(43));
3311 
3312   verifyFormat("template <typename T>\n"
3313                "Constructor() : Initializer(FitsOnTheLine) {}",
3314                getLLVMStyleWithColumns(45));
3315 
3316   verifyFormat(
3317       "SomeClass::Constructor()\n"
3318       "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
3319 
3320   verifyFormat(
3321       "SomeClass::Constructor()\n"
3322       "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3323       "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}");
3324   verifyFormat(
3325       "SomeClass::Constructor()\n"
3326       "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3327       "      aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
3328   verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3329                "            aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3330                "    : aaaaaaaaaa(aaaaaa) {}");
3331 
3332   verifyFormat("Constructor()\n"
3333                "    : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3334                "      aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3335                "                               aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3336                "      aaaaaaaaaaaaaaaaaaaaaaa() {}");
3337 
3338   verifyFormat("Constructor()\n"
3339                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3340                "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
3341 
3342   verifyFormat("Constructor(int Parameter = 0)\n"
3343                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
3344                "      aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}");
3345   verifyFormat("Constructor()\n"
3346                "    : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
3347                "}",
3348                getLLVMStyleWithColumns(60));
3349   verifyFormat("Constructor()\n"
3350                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3351                "          aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}");
3352 
3353   // Here a line could be saved by splitting the second initializer onto two
3354   // lines, but that is not desirable.
3355   verifyFormat("Constructor()\n"
3356                "    : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
3357                "      aaaaaaaaaaa(aaaaaaaaaaa),\n"
3358                "      aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
3359 
3360   FormatStyle OnePerLine = getLLVMStyle();
3361   OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
3362   OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
3363   verifyFormat("SomeClass::Constructor()\n"
3364                "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3365                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3366                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3367                OnePerLine);
3368   verifyFormat("SomeClass::Constructor()\n"
3369                "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
3370                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3371                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3372                OnePerLine);
3373   verifyFormat("MyClass::MyClass(int var)\n"
3374                "    : some_var_(var),            // 4 space indent\n"
3375                "      some_other_var_(var + 1) { // lined up\n"
3376                "}",
3377                OnePerLine);
3378   verifyFormat("Constructor()\n"
3379                "    : aaaaa(aaaaaa),\n"
3380                "      aaaaa(aaaaaa),\n"
3381                "      aaaaa(aaaaaa),\n"
3382                "      aaaaa(aaaaaa),\n"
3383                "      aaaaa(aaaaaa) {}",
3384                OnePerLine);
3385   verifyFormat("Constructor()\n"
3386                "    : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
3387                "            aaaaaaaaaaaaaaaaaaaaaa) {}",
3388                OnePerLine);
3389   OnePerLine.BinPackParameters = false;
3390   verifyFormat(
3391       "Constructor()\n"
3392       "    : aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3393       "          aaaaaaaaaaa().aaa(),\n"
3394       "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3395       OnePerLine);
3396   OnePerLine.ColumnLimit = 60;
3397   verifyFormat("Constructor()\n"
3398                "    : aaaaaaaaaaaaaaaaaaaa(a),\n"
3399                "      bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
3400                OnePerLine);
3401 
3402   EXPECT_EQ("Constructor()\n"
3403             "    : // Comment forcing unwanted break.\n"
3404             "      aaaa(aaaa) {}",
3405             format("Constructor() :\n"
3406                    "    // Comment forcing unwanted break.\n"
3407                    "    aaaa(aaaa) {}"));
3408 }
3409 
3410 TEST_F(FormatTest, BreakConstructorInitializersAfterColon) {
3411   FormatStyle Style = getLLVMStyle();
3412   Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
3413 
3414   verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
3415   verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}",
3416                getStyleWithColumns(Style, 45));
3417   verifyFormat("Constructor() :\n"
3418                "    Initializer(FitsOnTheLine) {}",
3419                getStyleWithColumns(Style, 44));
3420   verifyFormat("Constructor() :\n"
3421                "    Initializer(FitsOnTheLine) {}",
3422                getStyleWithColumns(Style, 43));
3423 
3424   verifyFormat("template <typename T>\n"
3425                "Constructor() : Initializer(FitsOnTheLine) {}",
3426                getStyleWithColumns(Style, 50));
3427 
3428   verifyFormat(
3429       "SomeClass::Constructor() :\n"
3430       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
3431 	  Style);
3432 
3433   verifyFormat(
3434       "SomeClass::Constructor() :\n"
3435       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3436       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3437 	  Style);
3438   verifyFormat(
3439       "SomeClass::Constructor() :\n"
3440       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3441       "    aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
3442 	  Style);
3443   verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3444                "            aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
3445                "    aaaaaaaaaa(aaaaaa) {}",
3446 			   Style);
3447 
3448   verifyFormat("Constructor() :\n"
3449                "    aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3450                "    aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3451                "                             aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3452                "    aaaaaaaaaaaaaaaaaaaaaaa() {}",
3453 			   Style);
3454 
3455   verifyFormat("Constructor() :\n"
3456                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3457                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3458 			   Style);
3459 
3460   verifyFormat("Constructor(int Parameter = 0) :\n"
3461                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
3462                "    aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}",
3463 			   Style);
3464   verifyFormat("Constructor() :\n"
3465                "    aaaaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
3466                "}",
3467                getStyleWithColumns(Style, 60));
3468   verifyFormat("Constructor() :\n"
3469                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3470                "        aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}",
3471 			   Style);
3472 
3473   // Here a line could be saved by splitting the second initializer onto two
3474   // lines, but that is not desirable.
3475   verifyFormat("Constructor() :\n"
3476                "    aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
3477                "    aaaaaaaaaaa(aaaaaaaaaaa),\n"
3478                "    aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3479 			   Style);
3480 
3481   FormatStyle OnePerLine = Style;
3482   OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
3483   OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
3484   verifyFormat("SomeClass::Constructor() :\n"
3485                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3486                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3487                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3488                OnePerLine);
3489   verifyFormat("SomeClass::Constructor() :\n"
3490                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
3491                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3492                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3493                OnePerLine);
3494   verifyFormat("MyClass::MyClass(int var) :\n"
3495                "    some_var_(var),            // 4 space indent\n"
3496                "    some_other_var_(var + 1) { // lined up\n"
3497                "}",
3498                OnePerLine);
3499   verifyFormat("Constructor() :\n"
3500                "    aaaaa(aaaaaa),\n"
3501                "    aaaaa(aaaaaa),\n"
3502                "    aaaaa(aaaaaa),\n"
3503                "    aaaaa(aaaaaa),\n"
3504                "    aaaaa(aaaaaa) {}",
3505                OnePerLine);
3506   verifyFormat("Constructor() :\n"
3507                "    aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
3508                "          aaaaaaaaaaaaaaaaaaaaaa) {}",
3509                OnePerLine);
3510   OnePerLine.BinPackParameters = false;
3511   verifyFormat(
3512       "Constructor() :\n"
3513       "    aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3514       "        aaaaaaaaaaa().aaa(),\n"
3515       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3516       OnePerLine);
3517   OnePerLine.ColumnLimit = 60;
3518   verifyFormat("Constructor() :\n"
3519                "    aaaaaaaaaaaaaaaaaaaa(a),\n"
3520                "    bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
3521                OnePerLine);
3522 
3523   EXPECT_EQ("Constructor() :\n"
3524             "    // Comment forcing unwanted break.\n"
3525             "    aaaa(aaaa) {}",
3526             format("Constructor() :\n"
3527                    "    // Comment forcing unwanted break.\n"
3528                    "    aaaa(aaaa) {}",
3529 				   Style));
3530 
3531   Style.ColumnLimit = 0;
3532   verifyFormat("SomeClass::Constructor() :\n"
3533                "    a(a) {}",
3534                Style);
3535   verifyFormat("SomeClass::Constructor() noexcept :\n"
3536                "    a(a) {}",
3537                Style);
3538   verifyFormat("SomeClass::Constructor() :\n"
3539 			   "    a(a), b(b), c(c) {}",
3540                Style);
3541   verifyFormat("SomeClass::Constructor() :\n"
3542                "    a(a) {\n"
3543                "  foo();\n"
3544                "  bar();\n"
3545                "}",
3546                Style);
3547 
3548   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
3549   verifyFormat("SomeClass::Constructor() :\n"
3550 			   "    a(a), b(b), c(c) {\n"
3551 			   "}",
3552                Style);
3553   verifyFormat("SomeClass::Constructor() :\n"
3554                "    a(a) {\n"
3555 			   "}",
3556                Style);
3557 
3558   Style.ColumnLimit = 80;
3559   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
3560   Style.ConstructorInitializerIndentWidth = 2;
3561   verifyFormat("SomeClass::Constructor() : a(a), b(b), c(c) {}",
3562                Style);
3563   verifyFormat("SomeClass::Constructor() :\n"
3564                "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3565                "  bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {}",
3566                Style);
3567 }
3568 
3569 #ifndef EXPENSIVE_CHECKS
3570 // Expensive checks enables libstdc++ checking which includes validating the
3571 // state of ranges used in std::priority_queue - this blows out the
3572 // runtime/scalability of the function and makes this test unacceptably slow.
3573 TEST_F(FormatTest, MemoizationTests) {
3574   // This breaks if the memoization lookup does not take \c Indent and
3575   // \c LastSpace into account.
3576   verifyFormat(
3577       "extern CFRunLoopTimerRef\n"
3578       "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n"
3579       "                     CFTimeInterval interval, CFOptionFlags flags,\n"
3580       "                     CFIndex order, CFRunLoopTimerCallBack callout,\n"
3581       "                     CFRunLoopTimerContext *context) {}");
3582 
3583   // Deep nesting somewhat works around our memoization.
3584   verifyFormat(
3585       "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3586       "    aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3587       "        aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3588       "            aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
3589       "                aaaaa())))))))))))))))))))))))))))))))))))))));",
3590       getLLVMStyleWithColumns(65));
3591   verifyFormat(
3592       "aaaaa(\n"
3593       "    aaaaa,\n"
3594       "    aaaaa(\n"
3595       "        aaaaa,\n"
3596       "        aaaaa(\n"
3597       "            aaaaa,\n"
3598       "            aaaaa(\n"
3599       "                aaaaa,\n"
3600       "                aaaaa(\n"
3601       "                    aaaaa,\n"
3602       "                    aaaaa(\n"
3603       "                        aaaaa,\n"
3604       "                        aaaaa(\n"
3605       "                            aaaaa,\n"
3606       "                            aaaaa(\n"
3607       "                                aaaaa,\n"
3608       "                                aaaaa(\n"
3609       "                                    aaaaa,\n"
3610       "                                    aaaaa(\n"
3611       "                                        aaaaa,\n"
3612       "                                        aaaaa(\n"
3613       "                                            aaaaa,\n"
3614       "                                            aaaaa(\n"
3615       "                                                aaaaa,\n"
3616       "                                                aaaaa))))))))))));",
3617       getLLVMStyleWithColumns(65));
3618   verifyFormat(
3619       "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"
3620       "                                  a),\n"
3621       "                                a),\n"
3622       "                              a),\n"
3623       "                            a),\n"
3624       "                          a),\n"
3625       "                        a),\n"
3626       "                      a),\n"
3627       "                    a),\n"
3628       "                  a),\n"
3629       "                a),\n"
3630       "              a),\n"
3631       "            a),\n"
3632       "          a),\n"
3633       "        a),\n"
3634       "      a),\n"
3635       "    a),\n"
3636       "  a)",
3637       getLLVMStyleWithColumns(65));
3638 
3639   // This test takes VERY long when memoization is broken.
3640   FormatStyle OnePerLine = getLLVMStyle();
3641   OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
3642   OnePerLine.BinPackParameters = false;
3643   std::string input = "Constructor()\n"
3644                       "    : aaaa(a,\n";
3645   for (unsigned i = 0, e = 80; i != e; ++i) {
3646     input += "           a,\n";
3647   }
3648   input += "           a) {}";
3649   verifyFormat(input, OnePerLine);
3650 }
3651 #endif
3652 
3653 TEST_F(FormatTest, BreaksAsHighAsPossible) {
3654   verifyFormat(
3655       "void f() {\n"
3656       "  if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
3657       "      (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
3658       "    f();\n"
3659       "}");
3660   verifyFormat("if (Intervals[i].getRange().getFirst() <\n"
3661                "    Intervals[i - 1].getRange().getLast()) {\n}");
3662 }
3663 
3664 TEST_F(FormatTest, BreaksFunctionDeclarations) {
3665   // Principially, we break function declarations in a certain order:
3666   // 1) break amongst arguments.
3667   verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n"
3668                "                              Cccccccccccccc cccccccccccccc);");
3669   verifyFormat("template <class TemplateIt>\n"
3670                "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n"
3671                "                            TemplateIt *stop) {}");
3672 
3673   // 2) break after return type.
3674   verifyFormat(
3675       "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3676       "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);",
3677       getGoogleStyle());
3678 
3679   // 3) break after (.
3680   verifyFormat(
3681       "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n"
3682       "    Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);",
3683       getGoogleStyle());
3684 
3685   // 4) break before after nested name specifiers.
3686   verifyFormat(
3687       "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3688       "SomeClasssssssssssssssssssssssssssssssssssssss::\n"
3689       "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);",
3690       getGoogleStyle());
3691 
3692   // However, there are exceptions, if a sufficient amount of lines can be
3693   // saved.
3694   // FIXME: The precise cut-offs wrt. the number of saved lines might need some
3695   // more adjusting.
3696   verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
3697                "                                  Cccccccccccccc cccccccccc,\n"
3698                "                                  Cccccccccccccc cccccccccc,\n"
3699                "                                  Cccccccccccccc cccccccccc,\n"
3700                "                                  Cccccccccccccc cccccccccc);");
3701   verifyFormat(
3702       "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3703       "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3704       "            Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3705       "            Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);",
3706       getGoogleStyle());
3707   verifyFormat(
3708       "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
3709       "                                          Cccccccccccccc cccccccccc,\n"
3710       "                                          Cccccccccccccc cccccccccc,\n"
3711       "                                          Cccccccccccccc cccccccccc,\n"
3712       "                                          Cccccccccccccc cccccccccc,\n"
3713       "                                          Cccccccccccccc cccccccccc,\n"
3714       "                                          Cccccccccccccc cccccccccc);");
3715   verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
3716                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3717                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3718                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
3719                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
3720 
3721   // Break after multi-line parameters.
3722   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3723                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3724                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3725                "    bbbb bbbb);");
3726   verifyFormat("void SomeLoooooooooooongFunction(\n"
3727                "    std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
3728                "        aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3729                "    int bbbbbbbbbbbbb);");
3730 
3731   // Treat overloaded operators like other functions.
3732   verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3733                "operator>(const SomeLoooooooooooooooooooooooooogType &other);");
3734   verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3735                "operator>>(const SomeLooooooooooooooooooooooooogType &other);");
3736   verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
3737                "operator<<(const SomeLooooooooooooooooooooooooogType &other);");
3738   verifyGoogleFormat(
3739       "SomeLoooooooooooooooooooooooooooooogType operator>>(\n"
3740       "    const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
3741   verifyGoogleFormat(
3742       "SomeLoooooooooooooooooooooooooooooogType operator<<(\n"
3743       "    const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
3744   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3745                "    int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);");
3746   verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n"
3747                "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);");
3748   verifyGoogleFormat(
3749       "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n"
3750       "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3751       "    bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}");
3752   verifyGoogleFormat(
3753       "template <typename T>\n"
3754       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3755       "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n"
3756       "    aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);");
3757 
3758   FormatStyle Style = getLLVMStyle();
3759   Style.PointerAlignment = FormatStyle::PAS_Left;
3760   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3761                "    aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}",
3762                Style);
3763   verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n"
3764                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3765                Style);
3766 }
3767 
3768 TEST_F(FormatTest, TrailingReturnType) {
3769   verifyFormat("auto foo() -> int;\n");
3770   verifyFormat("struct S {\n"
3771                "  auto bar() const -> int;\n"
3772                "};");
3773   verifyFormat("template <size_t Order, typename T>\n"
3774                "auto load_img(const std::string &filename)\n"
3775                "    -> alias::tensor<Order, T, mem::tag::cpu> {}");
3776   verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n"
3777                "    -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}");
3778   verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}");
3779   verifyFormat("template <typename T>\n"
3780                "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n"
3781                "    -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());");
3782 
3783   // Not trailing return types.
3784   verifyFormat("void f() { auto a = b->c(); }");
3785 }
3786 
3787 TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) {
3788   // Avoid breaking before trailing 'const' or other trailing annotations, if
3789   // they are not function-like.
3790   FormatStyle Style = getGoogleStyle();
3791   Style.ColumnLimit = 47;
3792   verifyFormat("void someLongFunction(\n"
3793                "    int someLoooooooooooooongParameter) const {\n}",
3794                getLLVMStyleWithColumns(47));
3795   verifyFormat("LoooooongReturnType\n"
3796                "someLoooooooongFunction() const {}",
3797                getLLVMStyleWithColumns(47));
3798   verifyFormat("LoooooongReturnType someLoooooooongFunction()\n"
3799                "    const {}",
3800                Style);
3801   verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3802                "                  aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;");
3803   verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3804                "                  aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;");
3805   verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
3806                "                  aaaaa aaaaaaaaaaaaaaaaaaaa) override final;");
3807   verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n"
3808                "                   aaaaaaaaaaa aaaaa) const override;");
3809   verifyGoogleFormat(
3810       "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3811       "    const override;");
3812 
3813   // Even if the first parameter has to be wrapped.
3814   verifyFormat("void someLongFunction(\n"
3815                "    int someLongParameter) const {}",
3816                getLLVMStyleWithColumns(46));
3817   verifyFormat("void someLongFunction(\n"
3818                "    int someLongParameter) const {}",
3819                Style);
3820   verifyFormat("void someLongFunction(\n"
3821                "    int someLongParameter) override {}",
3822                Style);
3823   verifyFormat("void someLongFunction(\n"
3824                "    int someLongParameter) OVERRIDE {}",
3825                Style);
3826   verifyFormat("void someLongFunction(\n"
3827                "    int someLongParameter) final {}",
3828                Style);
3829   verifyFormat("void someLongFunction(\n"
3830                "    int someLongParameter) FINAL {}",
3831                Style);
3832   verifyFormat("void someLongFunction(\n"
3833                "    int parameter) const override {}",
3834                Style);
3835 
3836   Style.BreakBeforeBraces = FormatStyle::BS_Allman;
3837   verifyFormat("void someLongFunction(\n"
3838                "    int someLongParameter) const\n"
3839                "{\n"
3840                "}",
3841                Style);
3842 
3843   // Unless these are unknown annotations.
3844   verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n"
3845                "                  aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3846                "    LONG_AND_UGLY_ANNOTATION;");
3847 
3848   // Breaking before function-like trailing annotations is fine to keep them
3849   // close to their arguments.
3850   verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3851                "    LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
3852   verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
3853                "    LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
3854   verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
3855                "    LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}");
3856   verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n"
3857                      "    AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);");
3858   verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});");
3859 
3860   verifyFormat(
3861       "void aaaaaaaaaaaaaaaaaa()\n"
3862       "    __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n"
3863       "                   aaaaaaaaaaaaaaaaaaaaaaaaa));");
3864   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3865                "    __attribute__((unused));");
3866   verifyGoogleFormat(
3867       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3868       "    GUARDED_BY(aaaaaaaaaaaa);");
3869   verifyGoogleFormat(
3870       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3871       "    GUARDED_BY(aaaaaaaaaaaa);");
3872   verifyGoogleFormat(
3873       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
3874       "    aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
3875   verifyGoogleFormat(
3876       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
3877       "    aaaaaaaaaaaaaaaaaaaaaaaaa;");
3878 }
3879 
3880 TEST_F(FormatTest, FunctionAnnotations) {
3881   verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
3882                "int OldFunction(const string &parameter) {}");
3883   verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
3884                "string OldFunction(const string &parameter) {}");
3885   verifyFormat("template <typename T>\n"
3886                "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
3887                "string OldFunction(const string &parameter) {}");
3888 
3889   // Not function annotations.
3890   verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3891                "                << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
3892   verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n"
3893                "       ThisIsATestWithAReallyReallyReallyReallyLongName) {}");
3894   verifyFormat("MACRO(abc).function() // wrap\n"
3895                "    << abc;");
3896   verifyFormat("MACRO(abc)->function() // wrap\n"
3897                "    << abc;");
3898   verifyFormat("MACRO(abc)::function() // wrap\n"
3899                "    << abc;");
3900 }
3901 
3902 TEST_F(FormatTest, BreaksDesireably) {
3903   verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
3904                "    aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
3905                "    aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
3906   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3907                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
3908                "}");
3909 
3910   verifyFormat(
3911       "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3912       "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
3913 
3914   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3915                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3916                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
3917 
3918   verifyFormat(
3919       "aaaaaaaa(aaaaaaaaaaaaa,\n"
3920       "         aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3921       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
3922       "         aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3923       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
3924 
3925   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3926                "    (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3927 
3928   verifyFormat(
3929       "void f() {\n"
3930       "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
3931       "                                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
3932       "}");
3933   verifyFormat(
3934       "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3935       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
3936   verifyFormat(
3937       "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3938       "                aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
3939   verifyFormat(
3940       "aaaaaa(aaa,\n"
3941       "       new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3942       "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3943       "       aaaa);");
3944   verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3945                "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3946                "                  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3947 
3948   // Indent consistently independent of call expression and unary operator.
3949   verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
3950                "    dddddddddddddddddddddddddddddd));");
3951   verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
3952                "    dddddddddddddddddddddddddddddd));");
3953   verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n"
3954                "    dddddddddddddddddddddddddddddd));");
3955 
3956   // This test case breaks on an incorrect memoization, i.e. an optimization not
3957   // taking into account the StopAt value.
3958   verifyFormat(
3959       "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
3960       "       aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
3961       "       aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
3962       "       (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3963 
3964   verifyFormat("{\n  {\n    {\n"
3965                "      Annotation.SpaceRequiredBefore =\n"
3966                "          Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
3967                "          Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
3968                "    }\n  }\n}");
3969 
3970   // Break on an outer level if there was a break on an inner level.
3971   EXPECT_EQ("f(g(h(a, // comment\n"
3972             "      b, c),\n"
3973             "    d, e),\n"
3974             "  x, y);",
3975             format("f(g(h(a, // comment\n"
3976                    "    b, c), d, e), x, y);"));
3977 
3978   // Prefer breaking similar line breaks.
3979   verifyFormat(
3980       "const int kTrackingOptions = NSTrackingMouseMoved |\n"
3981       "                             NSTrackingMouseEnteredAndExited |\n"
3982       "                             NSTrackingActiveAlways;");
3983 }
3984 
3985 TEST_F(FormatTest, FormatsDeclarationsOnePerLine) {
3986   FormatStyle NoBinPacking = getGoogleStyle();
3987   NoBinPacking.BinPackParameters = false;
3988   NoBinPacking.BinPackArguments = true;
3989   verifyFormat("void f() {\n"
3990                "  f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n"
3991                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
3992                "}",
3993                NoBinPacking);
3994   verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n"
3995                "       int aaaaaaaaaaaaaaaaaaaa,\n"
3996                "       int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3997                NoBinPacking);
3998 
3999   NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
4000   verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4001                "                        vector<int> bbbbbbbbbbbbbbb);",
4002                NoBinPacking);
4003   // FIXME: This behavior difference is probably not wanted. However, currently
4004   // we cannot distinguish BreakBeforeParameter being set because of the wrapped
4005   // template arguments from BreakBeforeParameter being set because of the
4006   // one-per-line formatting.
4007   verifyFormat(
4008       "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4009       "                                             aaaaaaaaaa> aaaaaaaaaa);",
4010       NoBinPacking);
4011   verifyFormat(
4012       "void fffffffffff(\n"
4013       "    aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n"
4014       "        aaaaaaaaaa);");
4015 }
4016 
4017 TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) {
4018   FormatStyle NoBinPacking = getGoogleStyle();
4019   NoBinPacking.BinPackParameters = false;
4020   NoBinPacking.BinPackArguments = false;
4021   verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n"
4022                "  aaaaaaaaaaaaaaaaaaaa,\n"
4023                "  aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);",
4024                NoBinPacking);
4025   verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n"
4026                "        aaaaaaaaaaaaa,\n"
4027                "        aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));",
4028                NoBinPacking);
4029   verifyFormat(
4030       "aaaaaaaa(aaaaaaaaaaaaa,\n"
4031       "         aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4032       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
4033       "         aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4034       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));",
4035       NoBinPacking);
4036   verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4037                "    .aaaaaaaaaaaaaaaaaa();",
4038                NoBinPacking);
4039   verifyFormat("void f() {\n"
4040                "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4041                "      aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n"
4042                "}",
4043                NoBinPacking);
4044 
4045   verifyFormat(
4046       "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4047       "             aaaaaaaaaaaa,\n"
4048       "             aaaaaaaaaaaa);",
4049       NoBinPacking);
4050   verifyFormat(
4051       "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n"
4052       "                               ddddddddddddddddddddddddddddd),\n"
4053       "             test);",
4054       NoBinPacking);
4055 
4056   verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4057                "            aaaaaaaaaaaaaaaaaaaaaaa,\n"
4058                "            aaaaaaaaaaaaaaaaaaaaaaa>\n"
4059                "    aaaaaaaaaaaaaaaaaa;",
4060                NoBinPacking);
4061   verifyFormat("a(\"a\"\n"
4062                "  \"a\",\n"
4063                "  a);");
4064 
4065   NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
4066   verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n"
4067                "                aaaaaaaaa,\n"
4068                "                aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4069                NoBinPacking);
4070   verifyFormat(
4071       "void f() {\n"
4072       "  aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4073       "      .aaaaaaa();\n"
4074       "}",
4075       NoBinPacking);
4076   verifyFormat(
4077       "template <class SomeType, class SomeOtherType>\n"
4078       "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}",
4079       NoBinPacking);
4080 }
4081 
4082 TEST_F(FormatTest, AdaptiveOnePerLineFormatting) {
4083   FormatStyle Style = getLLVMStyleWithColumns(15);
4084   Style.ExperimentalAutoDetectBinPacking = true;
4085   EXPECT_EQ("aaa(aaaa,\n"
4086             "    aaaa,\n"
4087             "    aaaa);\n"
4088             "aaa(aaaa,\n"
4089             "    aaaa,\n"
4090             "    aaaa);",
4091             format("aaa(aaaa,\n" // one-per-line
4092                    "  aaaa,\n"
4093                    "    aaaa  );\n"
4094                    "aaa(aaaa,  aaaa,  aaaa);", // inconclusive
4095                    Style));
4096   EXPECT_EQ("aaa(aaaa, aaaa,\n"
4097             "    aaaa);\n"
4098             "aaa(aaaa, aaaa,\n"
4099             "    aaaa);",
4100             format("aaa(aaaa,  aaaa,\n" // bin-packed
4101                    "    aaaa  );\n"
4102                    "aaa(aaaa,  aaaa,  aaaa);", // inconclusive
4103                    Style));
4104 }
4105 
4106 TEST_F(FormatTest, FormatsBuilderPattern) {
4107   verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n"
4108                "    .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n"
4109                "    .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n"
4110                "    .StartsWith(\".init\", ORDER_INIT)\n"
4111                "    .StartsWith(\".fini\", ORDER_FINI)\n"
4112                "    .StartsWith(\".hash\", ORDER_HASH)\n"
4113                "    .Default(ORDER_TEXT);\n");
4114 
4115   verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n"
4116                "       aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();");
4117   verifyFormat(
4118       "aaaaaaa->aaaaaaa\n"
4119       "    ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4120       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4121       "    ->aaaaaaaa(aaaaaaaaaaaaaaa);");
4122   verifyFormat(
4123       "aaaaaaa->aaaaaaa\n"
4124       "    ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4125       "    ->aaaaaaaa(aaaaaaaaaaaaaaa);");
4126   verifyFormat(
4127       "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"
4128       "    aaaaaaaaaaaaaa);");
4129   verifyFormat(
4130       "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n"
4131       "    aaaaaa->aaaaaaaaaaaa()\n"
4132       "        ->aaaaaaaaaaaaaaaa(\n"
4133       "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4134       "        ->aaaaaaaaaaaaaaaaa();");
4135   verifyGoogleFormat(
4136       "void f() {\n"
4137       "  someo->Add((new util::filetools::Handler(dir))\n"
4138       "                 ->OnEvent1(NewPermanentCallback(\n"
4139       "                     this, &HandlerHolderClass::EventHandlerCBA))\n"
4140       "                 ->OnEvent2(NewPermanentCallback(\n"
4141       "                     this, &HandlerHolderClass::EventHandlerCBB))\n"
4142       "                 ->OnEvent3(NewPermanentCallback(\n"
4143       "                     this, &HandlerHolderClass::EventHandlerCBC))\n"
4144       "                 ->OnEvent5(NewPermanentCallback(\n"
4145       "                     this, &HandlerHolderClass::EventHandlerCBD))\n"
4146       "                 ->OnEvent6(NewPermanentCallback(\n"
4147       "                     this, &HandlerHolderClass::EventHandlerCBE)));\n"
4148       "}");
4149 
4150   verifyFormat(
4151       "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();");
4152   verifyFormat("aaaaaaaaaaaaaaa()\n"
4153                "    .aaaaaaaaaaaaaaa()\n"
4154                "    .aaaaaaaaaaaaaaa()\n"
4155                "    .aaaaaaaaaaaaaaa()\n"
4156                "    .aaaaaaaaaaaaaaa();");
4157   verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4158                "    .aaaaaaaaaaaaaaa()\n"
4159                "    .aaaaaaaaaaaaaaa()\n"
4160                "    .aaaaaaaaaaaaaaa();");
4161   verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4162                "    .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4163                "    .aaaaaaaaaaaaaaa();");
4164   verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n"
4165                "    ->aaaaaaaaaaaaaae(0)\n"
4166                "    ->aaaaaaaaaaaaaaa();");
4167 
4168   // Don't linewrap after very short segments.
4169   verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4170                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4171                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4172   verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4173                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4174                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4175   verifyFormat("aaa()\n"
4176                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4177                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4178                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4179 
4180   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4181                "    .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4182                "    .has<bbbbbbbbbbbbbbbbbbbbb>();");
4183   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4184                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
4185                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();");
4186 
4187   // Prefer not to break after empty parentheses.
4188   verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n"
4189                "    First->LastNewlineOffset);");
4190 
4191   // Prefer not to create "hanging" indents.
4192   verifyFormat(
4193       "return !soooooooooooooome_map\n"
4194       "            .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4195       "            .second;");
4196   verifyFormat(
4197       "return aaaaaaaaaaaaaaaa\n"
4198       "    .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n"
4199       "    .aaaa(aaaaaaaaaaaaaa);");
4200   // No hanging indent here.
4201   verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n"
4202                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4203   verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n"
4204                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4205   verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4206                "    .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4207                getLLVMStyleWithColumns(60));
4208   verifyFormat("aaaaaaaaaaaaaaaaaa\n"
4209                "    .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
4210                "    .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4211                getLLVMStyleWithColumns(59));
4212   verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4213                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4214                "    .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4215 }
4216 
4217 TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
4218   verifyFormat(
4219       "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4220       "    bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
4221   verifyFormat(
4222       "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n"
4223       "    bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}");
4224 
4225   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
4226                "    ccccccccccccccccccccccccc) {\n}");
4227   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n"
4228                "    ccccccccccccccccccccccccc) {\n}");
4229 
4230   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
4231                "    ccccccccccccccccccccccccc) {\n}");
4232   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n"
4233                "    ccccccccccccccccccccccccc) {\n}");
4234 
4235   verifyFormat(
4236       "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
4237       "    ccccccccccccccccccccccccc) {\n}");
4238   verifyFormat(
4239       "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n"
4240       "    ccccccccccccccccccccccccc) {\n}");
4241 
4242   verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
4243                "       bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
4244                "       cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
4245                "       dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
4246   verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n"
4247                "       bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n"
4248                "       cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n"
4249                "       dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
4250 
4251   verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
4252                "     aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
4253                "    aaaaaaaaaaaaaaa != aa) {\n}");
4254   verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n"
4255                "     aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n"
4256                "    aaaaaaaaaaaaaaa != aa) {\n}");
4257 }
4258 
4259 TEST_F(FormatTest, BreaksAfterAssignments) {
4260   verifyFormat(
4261       "unsigned Cost =\n"
4262       "    TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
4263       "                        SI->getPointerAddressSpaceee());\n");
4264   verifyFormat(
4265       "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
4266       "    Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
4267 
4268   verifyFormat(
4269       "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n"
4270       "    aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
4271   verifyFormat("unsigned OriginalStartColumn =\n"
4272                "    SourceMgr.getSpellingColumnNumber(\n"
4273                "        Current.FormatTok.getStartOfNonWhitespace()) -\n"
4274                "    1;");
4275 }
4276 
4277 TEST_F(FormatTest, ConfigurableBreakAssignmentPenalty) {
4278   FormatStyle Style = getLLVMStyle();
4279   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4280                "    bbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccccccccccccc;",
4281                Style);
4282 
4283   Style.PenaltyBreakAssignment = 20;
4284   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
4285                "                                 cccccccccccccccccccccccccc;",
4286                Style);
4287 }
4288 
4289 TEST_F(FormatTest, AlignsAfterAssignments) {
4290   verifyFormat(
4291       "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4292       "             aaaaaaaaaaaaaaaaaaaaaaaaa;");
4293   verifyFormat(
4294       "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4295       "          aaaaaaaaaaaaaaaaaaaaaaaaa;");
4296   verifyFormat(
4297       "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4298       "           aaaaaaaaaaaaaaaaaaaaaaaaa;");
4299   verifyFormat(
4300       "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4301       "              aaaaaaaaaaaaaaaaaaaaaaaaa);");
4302   verifyFormat(
4303       "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4304       "                                            aaaaaaaaaaaaaaaaaaaaaaaa +\n"
4305       "                                            aaaaaaaaaaaaaaaaaaaaaaaa;");
4306 }
4307 
4308 TEST_F(FormatTest, AlignsAfterReturn) {
4309   verifyFormat(
4310       "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4311       "       aaaaaaaaaaaaaaaaaaaaaaaaa;");
4312   verifyFormat(
4313       "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4314       "        aaaaaaaaaaaaaaaaaaaaaaaaa);");
4315   verifyFormat(
4316       "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
4317       "       aaaaaaaaaaaaaaaaaaaaaa();");
4318   verifyFormat(
4319       "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
4320       "        aaaaaaaaaaaaaaaaaaaaaa());");
4321   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4322                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4323   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4324                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
4325                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4326   verifyFormat("return\n"
4327                "    // true if code is one of a or b.\n"
4328                "    code == a || code == b;");
4329 }
4330 
4331 TEST_F(FormatTest, AlignsAfterOpenBracket) {
4332   verifyFormat(
4333       "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
4334       "                                                aaaaaaaaa aaaaaaa) {}");
4335   verifyFormat(
4336       "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
4337       "                                               aaaaaaaaaaa aaaaaaaaa);");
4338   verifyFormat(
4339       "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
4340       "                                             aaaaaaaaaaaaaaaaaaaaa));");
4341   FormatStyle Style = getLLVMStyle();
4342   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
4343   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4344                "    aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",
4345                Style);
4346   verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
4347                "    aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);",
4348                Style);
4349   verifyFormat("SomeLongVariableName->someFunction(\n"
4350                "    foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));",
4351                Style);
4352   verifyFormat(
4353       "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
4354       "    aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4355       Style);
4356   verifyFormat(
4357       "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
4358       "    aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4359       Style);
4360   verifyFormat(
4361       "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
4362       "    aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
4363       Style);
4364 
4365   verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n"
4366                "    ccccccc(aaaaaaaaaaaaaaaaa,         //\n"
4367                "        b));",
4368                Style);
4369 
4370   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
4371   Style.BinPackArguments = false;
4372   Style.BinPackParameters = false;
4373   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4374                "    aaaaaaaaaaa aaaaaaaa,\n"
4375                "    aaaaaaaaa aaaaaaa,\n"
4376                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4377                Style);
4378   verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
4379                "    aaaaaaaaaaa aaaaaaaaa,\n"
4380                "    aaaaaaaaaaa aaaaaaaaa,\n"
4381                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4382                Style);
4383   verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n"
4384                "    aaaaaaaaaaaaaaa,\n"
4385                "    aaaaaaaaaaaaaaaaaaaaa,\n"
4386                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
4387                Style);
4388   verifyFormat(
4389       "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n"
4390       "    aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
4391       Style);
4392   verifyFormat(
4393       "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n"
4394       "    aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
4395       Style);
4396   verifyFormat(
4397       "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4398       "    aaaaaaaaaaaaaaaaaaaaa(\n"
4399       "        aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n"
4400       "    aaaaaaaaaaaaaaaa);",
4401       Style);
4402   verifyFormat(
4403       "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4404       "    aaaaaaaaaaaaaaaaaaaaa(\n"
4405       "        aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
4406       "    aaaaaaaaaaaaaaaa);",
4407       Style);
4408 }
4409 
4410 TEST_F(FormatTest, ParenthesesAndOperandAlignment) {
4411   FormatStyle Style = getLLVMStyleWithColumns(40);
4412   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4413                "          bbbbbbbbbbbbbbbbbbbbbb);",
4414                Style);
4415   Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
4416   Style.AlignOperands = false;
4417   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4418                "          bbbbbbbbbbbbbbbbbbbbbb);",
4419                Style);
4420   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
4421   Style.AlignOperands = true;
4422   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4423                "          bbbbbbbbbbbbbbbbbbbbbb);",
4424                Style);
4425   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
4426   Style.AlignOperands = false;
4427   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
4428                "    bbbbbbbbbbbbbbbbbbbbbb);",
4429                Style);
4430 }
4431 
4432 TEST_F(FormatTest, BreaksConditionalExpressions) {
4433   verifyFormat(
4434       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4435       "                               ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4436       "                               : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4437   verifyFormat(
4438       "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
4439       "     aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4440       "                                : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4441   verifyFormat(
4442       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4443       "                                   : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4444   verifyFormat(
4445       "aaaa(aaaaaaaaa, aaaaaaaaa,\n"
4446       "     aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4447       "             : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4448   verifyFormat(
4449       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
4450       "                                                    : aaaaaaaaaaaaa);");
4451   verifyFormat(
4452       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4453       "                   aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4454       "                                    : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4455       "                   aaaaaaaaaaaaa);");
4456   verifyFormat(
4457       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4458       "                   aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4459       "                   aaaaaaaaaaaaa);");
4460   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4461                "    ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4462                "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4463                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4464                "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4465   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4466                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4467                "           ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4468                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4469                "           : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4470                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4471                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4472   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4473                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4474                "           ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4475                "                  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4476                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4477   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4478                "    ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4479                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4480   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
4481                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4482                "        ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4483                "        : aaaaaaaaaaaaaaaa;");
4484   verifyFormat(
4485       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4486       "    ? aaaaaaaaaaaaaaa\n"
4487       "    : aaaaaaaaaaaaaaa;");
4488   verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
4489                "          aaaaaaaaa\n"
4490                "      ? b\n"
4491                "      : c);");
4492   verifyFormat("return aaaa == bbbb\n"
4493                "           // comment\n"
4494                "           ? aaaa\n"
4495                "           : bbbb;");
4496   verifyFormat("unsigned Indent =\n"
4497                "    format(TheLine.First,\n"
4498                "           IndentForLevel[TheLine.Level] >= 0\n"
4499                "               ? IndentForLevel[TheLine.Level]\n"
4500                "               : TheLine * 2,\n"
4501                "           TheLine.InPPDirective, PreviousEndOfLineColumn);",
4502                getLLVMStyleWithColumns(60));
4503   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
4504                "                  ? aaaaaaaaaaaaaaa\n"
4505                "                  : bbbbbbbbbbbbbbb //\n"
4506                "                        ? ccccccccccccccc\n"
4507                "                        : ddddddddddddddd;");
4508   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
4509                "                  ? aaaaaaaaaaaaaaa\n"
4510                "                  : (bbbbbbbbbbbbbbb //\n"
4511                "                         ? ccccccccccccccc\n"
4512                "                         : ddddddddddddddd);");
4513   verifyFormat(
4514       "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4515       "                                      ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4516       "                                            aaaaaaaaaaaaaaaaaaaaa +\n"
4517       "                                            aaaaaaaaaaaaaaaaaaaaa\n"
4518       "                                      : aaaaaaaaaa;");
4519   verifyFormat(
4520       "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4521       "                                   : aaaaaaaaaaaaaaaaaaaaaa\n"
4522       "                      : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4523 
4524   FormatStyle NoBinPacking = getLLVMStyle();
4525   NoBinPacking.BinPackArguments = false;
4526   verifyFormat(
4527       "void f() {\n"
4528       "  g(aaa,\n"
4529       "    aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
4530       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4531       "        ? aaaaaaaaaaaaaaa\n"
4532       "        : aaaaaaaaaaaaaaa);\n"
4533       "}",
4534       NoBinPacking);
4535   verifyFormat(
4536       "void f() {\n"
4537       "  g(aaa,\n"
4538       "    aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
4539       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4540       "        ?: aaaaaaaaaaaaaaa);\n"
4541       "}",
4542       NoBinPacking);
4543 
4544   verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n"
4545                "             // comment.\n"
4546                "             ccccccccccccccccccccccccccccccccccccccc\n"
4547                "                 ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4548                "                 : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);");
4549 
4550   // Assignments in conditional expressions. Apparently not uncommon :-(.
4551   verifyFormat("return a != b\n"
4552                "           // comment\n"
4553                "           ? a = b\n"
4554                "           : a = b;");
4555   verifyFormat("return a != b\n"
4556                "           // comment\n"
4557                "           ? a = a != b\n"
4558                "                     // comment\n"
4559                "                     ? a = b\n"
4560                "                     : a\n"
4561                "           : a;\n");
4562   verifyFormat("return a != b\n"
4563                "           // comment\n"
4564                "           ? a\n"
4565                "           : a = a != b\n"
4566                "                     // comment\n"
4567                "                     ? a = b\n"
4568                "                     : a;");
4569 }
4570 
4571 TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {
4572   FormatStyle Style = getLLVMStyle();
4573   Style.BreakBeforeTernaryOperators = false;
4574   Style.ColumnLimit = 70;
4575   verifyFormat(
4576       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4577       "                               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4578       "                               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4579       Style);
4580   verifyFormat(
4581       "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
4582       "     aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4583       "                                  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4584       Style);
4585   verifyFormat(
4586       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4587       "                                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4588       Style);
4589   verifyFormat(
4590       "aaaa(aaaaaaaa, aaaaaaaaaa,\n"
4591       "     aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4592       "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4593       Style);
4594   verifyFormat(
4595       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n"
4596       "                                                      aaaaaaaaaaaaa);",
4597       Style);
4598   verifyFormat(
4599       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4600       "                   aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4601       "                                      aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4602       "                   aaaaaaaaaaaaa);",
4603       Style);
4604   verifyFormat(
4605       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4606       "                   aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4607       "                   aaaaaaaaaaaaa);",
4608       Style);
4609   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4610                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4611                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4612                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4613                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4614                Style);
4615   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4616                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4617                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4618                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4619                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4620                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4621                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4622                Style);
4623   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4624                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n"
4625                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4626                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4627                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4628                Style);
4629   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4630                "    aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4631                "    aaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4632                Style);
4633   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
4634                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4635                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
4636                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4637                Style);
4638   verifyFormat(
4639       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4640       "    aaaaaaaaaaaaaaa :\n"
4641       "    aaaaaaaaaaaaaaa;",
4642       Style);
4643   verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
4644                "          aaaaaaaaa ?\n"
4645                "      b :\n"
4646                "      c);",
4647                Style);
4648   verifyFormat("unsigned Indent =\n"
4649                "    format(TheLine.First,\n"
4650                "           IndentForLevel[TheLine.Level] >= 0 ?\n"
4651                "               IndentForLevel[TheLine.Level] :\n"
4652                "               TheLine * 2,\n"
4653                "           TheLine.InPPDirective, PreviousEndOfLineColumn);",
4654                Style);
4655   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
4656                "                  aaaaaaaaaaaaaaa :\n"
4657                "                  bbbbbbbbbbbbbbb ? //\n"
4658                "                      ccccccccccccccc :\n"
4659                "                      ddddddddddddddd;",
4660                Style);
4661   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
4662                "                  aaaaaaaaaaaaaaa :\n"
4663                "                  (bbbbbbbbbbbbbbb ? //\n"
4664                "                       ccccccccccccccc :\n"
4665                "                       ddddddddddddddd);",
4666                Style);
4667   verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4668                "            /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n"
4669                "            ccccccccccccccccccccccccccc;",
4670                Style);
4671   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
4672                "           aaaaa :\n"
4673                "           bbbbbbbbbbbbbbb + cccccccccccccccc;",
4674                Style);
4675 }
4676 
4677 TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
4678   verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
4679                "     aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
4680   verifyFormat("bool a = true, b = false;");
4681 
4682   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4683                "         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
4684                "     bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
4685                "         bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
4686   verifyFormat(
4687       "bool aaaaaaaaaaaaaaaaaaaaa =\n"
4688       "         bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
4689       "     d = e && f;");
4690   verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
4691                "          c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
4692   verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
4693                "          *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
4694   verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
4695                "          ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
4696 
4697   FormatStyle Style = getGoogleStyle();
4698   Style.PointerAlignment = FormatStyle::PAS_Left;
4699   Style.DerivePointerAlignment = false;
4700   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4701                "    *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
4702                "    *b = bbbbbbbbbbbbbbbbbbb;",
4703                Style);
4704   verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
4705                "          *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;",
4706                Style);
4707   verifyFormat("vector<int*> a, b;", Style);
4708   verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style);
4709 }
4710 
4711 TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
4712   verifyFormat("arr[foo ? bar : baz];");
4713   verifyFormat("f()[foo ? bar : baz];");
4714   verifyFormat("(a + b)[foo ? bar : baz];");
4715   verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
4716 }
4717 
4718 TEST_F(FormatTest, AlignsStringLiterals) {
4719   verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
4720                "                                      \"short literal\");");
4721   verifyFormat(
4722       "looooooooooooooooooooooooongFunction(\n"
4723       "    \"short literal\"\n"
4724       "    \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
4725   verifyFormat("someFunction(\"Always break between multi-line\"\n"
4726                "             \" string literals\",\n"
4727                "             and, other, parameters);");
4728   EXPECT_EQ("fun + \"1243\" /* comment */\n"
4729             "      \"5678\";",
4730             format("fun + \"1243\" /* comment */\n"
4731                    "    \"5678\";",
4732                    getLLVMStyleWithColumns(28)));
4733   EXPECT_EQ(
4734       "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
4735       "         \"aaaaaaaaaaaaaaaaaaaaa\"\n"
4736       "         \"aaaaaaaaaaaaaaaa\";",
4737       format("aaaaaa ="
4738              "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
4739              "aaaaaaaaaaaaaaaaaaaaa\" "
4740              "\"aaaaaaaaaaaaaaaa\";"));
4741   verifyFormat("a = a + \"a\"\n"
4742                "        \"a\"\n"
4743                "        \"a\";");
4744   verifyFormat("f(\"a\", \"b\"\n"
4745                "       \"c\");");
4746 
4747   verifyFormat(
4748       "#define LL_FORMAT \"ll\"\n"
4749       "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
4750       "       \"d, ddddddddd: %\" LL_FORMAT \"d\");");
4751 
4752   verifyFormat("#define A(X)          \\\n"
4753                "  \"aaaaa\" #X \"bbbbbb\" \\\n"
4754                "  \"ccccc\"",
4755                getLLVMStyleWithColumns(23));
4756   verifyFormat("#define A \"def\"\n"
4757                "f(\"abc\" A \"ghi\"\n"
4758                "  \"jkl\");");
4759 
4760   verifyFormat("f(L\"a\"\n"
4761                "  L\"b\");");
4762   verifyFormat("#define A(X)            \\\n"
4763                "  L\"aaaaa\" #X L\"bbbbbb\" \\\n"
4764                "  L\"ccccc\"",
4765                getLLVMStyleWithColumns(25));
4766 
4767   verifyFormat("f(@\"a\"\n"
4768                "  @\"b\");");
4769   verifyFormat("NSString s = @\"a\"\n"
4770                "             @\"b\"\n"
4771                "             @\"c\";");
4772   verifyFormat("NSString s = @\"a\"\n"
4773                "              \"b\"\n"
4774                "              \"c\";");
4775 }
4776 
4777 TEST_F(FormatTest, ReturnTypeBreakingStyle) {
4778   FormatStyle Style = getLLVMStyle();
4779   // No declarations or definitions should be moved to own line.
4780   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;
4781   verifyFormat("class A {\n"
4782                "  int f() { return 1; }\n"
4783                "  int g();\n"
4784                "};\n"
4785                "int f() { return 1; }\n"
4786                "int g();\n",
4787                Style);
4788 
4789   // All declarations and definitions should have the return type moved to its
4790   // own
4791   // line.
4792   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
4793   verifyFormat("class E {\n"
4794                "  int\n"
4795                "  f() {\n"
4796                "    return 1;\n"
4797                "  }\n"
4798                "  int\n"
4799                "  g();\n"
4800                "};\n"
4801                "int\n"
4802                "f() {\n"
4803                "  return 1;\n"
4804                "}\n"
4805                "int\n"
4806                "g();\n",
4807                Style);
4808 
4809   // Top-level definitions, and no kinds of declarations should have the
4810   // return type moved to its own line.
4811   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions;
4812   verifyFormat("class B {\n"
4813                "  int f() { return 1; }\n"
4814                "  int g();\n"
4815                "};\n"
4816                "int\n"
4817                "f() {\n"
4818                "  return 1;\n"
4819                "}\n"
4820                "int g();\n",
4821                Style);
4822 
4823   // Top-level definitions and declarations should have the return type moved
4824   // to its own line.
4825   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;
4826   verifyFormat("class C {\n"
4827                "  int f() { return 1; }\n"
4828                "  int g();\n"
4829                "};\n"
4830                "int\n"
4831                "f() {\n"
4832                "  return 1;\n"
4833                "}\n"
4834                "int\n"
4835                "g();\n",
4836                Style);
4837 
4838   // All definitions should have the return type moved to its own line, but no
4839   // kinds of declarations.
4840   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
4841   verifyFormat("class D {\n"
4842                "  int\n"
4843                "  f() {\n"
4844                "    return 1;\n"
4845                "  }\n"
4846                "  int g();\n"
4847                "};\n"
4848                "int\n"
4849                "f() {\n"
4850                "  return 1;\n"
4851                "}\n"
4852                "int g();\n",
4853                Style);
4854   verifyFormat("const char *\n"
4855                "f(void) {\n" // Break here.
4856                "  return \"\";\n"
4857                "}\n"
4858                "const char *bar(void);\n", // No break here.
4859                Style);
4860   verifyFormat("template <class T>\n"
4861                "T *\n"
4862                "f(T &c) {\n" // Break here.
4863                "  return NULL;\n"
4864                "}\n"
4865                "template <class T> T *f(T &c);\n", // No break here.
4866                Style);
4867   verifyFormat("class C {\n"
4868                "  int\n"
4869                "  operator+() {\n"
4870                "    return 1;\n"
4871                "  }\n"
4872                "  int\n"
4873                "  operator()() {\n"
4874                "    return 1;\n"
4875                "  }\n"
4876                "};\n",
4877                Style);
4878   verifyFormat("void\n"
4879                "A::operator()() {}\n"
4880                "void\n"
4881                "A::operator>>() {}\n"
4882                "void\n"
4883                "A::operator+() {}\n",
4884                Style);
4885   verifyFormat("void *operator new(std::size_t s);", // No break here.
4886                Style);
4887   verifyFormat("void *\n"
4888                "operator new(std::size_t s) {}",
4889                Style);
4890   verifyFormat("void *\n"
4891                "operator delete[](void *ptr) {}",
4892                Style);
4893   Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
4894   verifyFormat("const char *\n"
4895                "f(void)\n" // Break here.
4896                "{\n"
4897                "  return \"\";\n"
4898                "}\n"
4899                "const char *bar(void);\n", // No break here.
4900                Style);
4901   verifyFormat("template <class T>\n"
4902                "T *\n"     // Problem here: no line break
4903                "f(T &c)\n" // Break here.
4904                "{\n"
4905                "  return NULL;\n"
4906                "}\n"
4907                "template <class T> T *f(T &c);\n", // No break here.
4908                Style);
4909 }
4910 
4911 TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
4912   FormatStyle NoBreak = getLLVMStyle();
4913   NoBreak.AlwaysBreakBeforeMultilineStrings = false;
4914   FormatStyle Break = getLLVMStyle();
4915   Break.AlwaysBreakBeforeMultilineStrings = true;
4916   verifyFormat("aaaa = \"bbbb\"\n"
4917                "       \"cccc\";",
4918                NoBreak);
4919   verifyFormat("aaaa =\n"
4920                "    \"bbbb\"\n"
4921                "    \"cccc\";",
4922                Break);
4923   verifyFormat("aaaa(\"bbbb\"\n"
4924                "     \"cccc\");",
4925                NoBreak);
4926   verifyFormat("aaaa(\n"
4927                "    \"bbbb\"\n"
4928                "    \"cccc\");",
4929                Break);
4930   verifyFormat("aaaa(qqq, \"bbbb\"\n"
4931                "          \"cccc\");",
4932                NoBreak);
4933   verifyFormat("aaaa(qqq,\n"
4934                "     \"bbbb\"\n"
4935                "     \"cccc\");",
4936                Break);
4937   verifyFormat("aaaa(qqq,\n"
4938                "     L\"bbbb\"\n"
4939                "     L\"cccc\");",
4940                Break);
4941   verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n"
4942                "                      \"bbbb\"));",
4943                Break);
4944   verifyFormat("string s = someFunction(\n"
4945                "    \"abc\"\n"
4946                "    \"abc\");",
4947                Break);
4948 
4949   // As we break before unary operators, breaking right after them is bad.
4950   verifyFormat("string foo = abc ? \"x\"\n"
4951                "                   \"blah blah blah blah blah blah\"\n"
4952                "                 : \"y\";",
4953                Break);
4954 
4955   // Don't break if there is no column gain.
4956   verifyFormat("f(\"aaaa\"\n"
4957                "  \"bbbb\");",
4958                Break);
4959 
4960   // Treat literals with escaped newlines like multi-line string literals.
4961   EXPECT_EQ("x = \"a\\\n"
4962             "b\\\n"
4963             "c\";",
4964             format("x = \"a\\\n"
4965                    "b\\\n"
4966                    "c\";",
4967                    NoBreak));
4968   EXPECT_EQ("xxxx =\n"
4969             "    \"a\\\n"
4970             "b\\\n"
4971             "c\";",
4972             format("xxxx = \"a\\\n"
4973                    "b\\\n"
4974                    "c\";",
4975                    Break));
4976 
4977   EXPECT_EQ("NSString *const kString =\n"
4978             "    @\"aaaa\"\n"
4979             "    @\"bbbb\";",
4980             format("NSString *const kString = @\"aaaa\"\n"
4981                    "@\"bbbb\";",
4982                    Break));
4983 
4984   Break.ColumnLimit = 0;
4985   verifyFormat("const char *hello = \"hello llvm\";", Break);
4986 }
4987 
4988 TEST_F(FormatTest, AlignsPipes) {
4989   verifyFormat(
4990       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4991       "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4992       "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4993   verifyFormat(
4994       "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
4995       "                     << aaaaaaaaaaaaaaaaaaaa;");
4996   verifyFormat(
4997       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4998       "                                 << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4999   verifyFormat(
5000       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5001       "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5002   verifyFormat(
5003       "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
5004       "                \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
5005       "             << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
5006   verifyFormat(
5007       "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5008       "                                 << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5009       "         << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5010   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5011                "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5012                "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5013                "             << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
5014   verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n"
5015                "             << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);");
5016   verifyFormat(
5017       "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5018       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5019   verifyFormat(
5020       "auto Diag = diag() << aaaaaaaaaaaaaaaa(aaaaaaaaaaaa, aaaaaaaaaaaaa,\n"
5021       "                                       aaaaaaaaaaaaaaaaaaaaaaaaaa);");
5022 
5023   verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n"
5024                "             << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();");
5025   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5026                "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5027                "                    aaaaaaaaaaaaaaaaaaaaa)\n"
5028                "             << aaaaaaaaaaaaaaaaaaaaaaaaaa;");
5029   verifyFormat("LOG_IF(aaa == //\n"
5030                "       bbb)\n"
5031                "    << a << b;");
5032 
5033   // But sometimes, breaking before the first "<<" is desirable.
5034   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5035                "    << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);");
5036   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n"
5037                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5038                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5039   verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n"
5040                "    << BEF << IsTemplate << Description << E->getType();");
5041   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5042                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5043                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5044   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5045                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5046                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5047                "    << aaa;");
5048 
5049   verifyFormat(
5050       "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5051       "                    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5052 
5053   // Incomplete string literal.
5054   EXPECT_EQ("llvm::errs() << \"\n"
5055             "             << a;",
5056             format("llvm::errs() << \"\n<<a;"));
5057 
5058   verifyFormat("void f() {\n"
5059                "  CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n"
5060                "      << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n"
5061                "}");
5062 
5063   // Handle 'endl'.
5064   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n"
5065                "             << bbbbbbbbbbbbbbbbbbbbbb << endl;");
5066   verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;");
5067 
5068   // Handle '\n'.
5069   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n"
5070                "             << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
5071   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n"
5072                "             << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';");
5073   verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n"
5074                "             << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";");
5075   verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
5076 }
5077 
5078 TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) {
5079   verifyFormat("return out << \"somepacket = {\\n\"\n"
5080                "           << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
5081                "           << \" bbbb = \" << pkt.bbbb << \"\\n\"\n"
5082                "           << \" cccccc = \" << pkt.cccccc << \"\\n\"\n"
5083                "           << \" ddd = [\" << pkt.ddd << \"]\\n\"\n"
5084                "           << \"}\";");
5085 
5086   verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5087                "             << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5088                "             << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;");
5089   verifyFormat(
5090       "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
5091       "             << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
5092       "             << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
5093       "             << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
5094       "             << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
5095   verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
5096                "             << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
5097   verifyFormat(
5098       "void f() {\n"
5099       "  llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n"
5100       "               << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
5101       "}");
5102 
5103   // Breaking before the first "<<" is generally not desirable.
5104   verifyFormat(
5105       "llvm::errs()\n"
5106       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5107       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5108       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5109       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5110       getLLVMStyleWithColumns(70));
5111   verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5112                "             << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5113                "             << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5114                "             << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5115                "             << \"aaaaaaaaaaaaaaaaaaa: \"\n"
5116                "             << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5117                getLLVMStyleWithColumns(70));
5118 
5119   verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5120                "           \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
5121                "           \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;");
5122   verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5123                "                  \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
5124                "                  \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);");
5125   verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n"
5126                "           (aaaa + aaaa);",
5127                getLLVMStyleWithColumns(40));
5128   verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n"
5129                "                  (aaaaaaa + aaaaa));",
5130                getLLVMStyleWithColumns(40));
5131   verifyFormat(
5132       "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n"
5133       "                  SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n"
5134       "                  bbbbbbbbbbbbbbbbbbbbbbb);");
5135 }
5136 
5137 TEST_F(FormatTest, UnderstandsEquals) {
5138   verifyFormat(
5139       "aaaaaaaaaaaaaaaaa =\n"
5140       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5141   verifyFormat(
5142       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5143       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
5144   verifyFormat(
5145       "if (a) {\n"
5146       "  f();\n"
5147       "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5148       "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
5149       "}");
5150 
5151   verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5152                "        100000000 + 10000000) {\n}");
5153 }
5154 
5155 TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
5156   verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5157                "    .looooooooooooooooooooooooooooooooooooooongFunction();");
5158 
5159   verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
5160                "    ->looooooooooooooooooooooooooooooooooooooongFunction();");
5161 
5162   verifyFormat(
5163       "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
5164       "                                                          Parameter2);");
5165 
5166   verifyFormat(
5167       "ShortObject->shortFunction(\n"
5168       "    LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
5169       "    LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
5170 
5171   verifyFormat("loooooooooooooongFunction(\n"
5172                "    LoooooooooooooongObject->looooooooooooooooongFunction());");
5173 
5174   verifyFormat(
5175       "function(LoooooooooooooooooooooooooooooooooooongObject\n"
5176       "             ->loooooooooooooooooooooooooooooooooooooooongFunction());");
5177 
5178   verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5179                "    .WillRepeatedly(Return(SomeValue));");
5180   verifyFormat("void f() {\n"
5181                "  EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
5182                "      .Times(2)\n"
5183                "      .WillRepeatedly(Return(SomeValue));\n"
5184                "}");
5185   verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n"
5186                "    ccccccccccccccccccccccc);");
5187   verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5188                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5189                "          .aaaaa(aaaaa),\n"
5190                "      aaaaaaaaaaaaaaaaaaaaa);");
5191   verifyFormat("void f() {\n"
5192                "  aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5193                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n"
5194                "}");
5195   verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5196                "      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5197                "    .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5198                "                        aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5199                "                        aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
5200   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5201                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5202                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5203                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
5204                "}");
5205 
5206   // Here, it is not necessary to wrap at "." or "->".
5207   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
5208                "    aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
5209   verifyFormat(
5210       "aaaaaaaaaaa->aaaaaaaaa(\n"
5211       "    aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5212       "    aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
5213 
5214   verifyFormat(
5215       "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5216       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
5217   verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
5218                "                         aaaaaaaaa()->aaaaaa()->aaaaa());");
5219   verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
5220                "                         aaaaaaaaa()->aaaaaa()->aaaaa());");
5221 
5222   verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5223                "      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5224                "    .a();");
5225 
5226   FormatStyle NoBinPacking = getLLVMStyle();
5227   NoBinPacking.BinPackParameters = false;
5228   verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5229                "    .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
5230                "    .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
5231                "                         aaaaaaaaaaaaaaaaaaa,\n"
5232                "                         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5233                NoBinPacking);
5234 
5235   // If there is a subsequent call, change to hanging indentation.
5236   verifyFormat(
5237       "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5238       "                         aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n"
5239       "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5240   verifyFormat(
5241       "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5242       "    aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));");
5243   verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5244                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5245                "                 .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5246   verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5247                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5248                "               .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
5249 }
5250 
5251 TEST_F(FormatTest, WrapsTemplateDeclarations) {
5252   verifyFormat("template <typename T>\n"
5253                "virtual void loooooooooooongFunction(int Param1, int Param2);");
5254   verifyFormat("template <typename T>\n"
5255                "// T should be one of {A, B}.\n"
5256                "virtual void loooooooooooongFunction(int Param1, int Param2);");
5257   verifyFormat(
5258       "template <typename T>\n"
5259       "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
5260   verifyFormat("template <typename T>\n"
5261                "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
5262                "       int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
5263   verifyFormat(
5264       "template <typename T>\n"
5265       "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
5266       "                                      int Paaaaaaaaaaaaaaaaaaaaram2);");
5267   verifyFormat(
5268       "template <typename T>\n"
5269       "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
5270       "                    aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
5271       "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5272   verifyFormat("template <typename T>\n"
5273                "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5274                "    int aaaaaaaaaaaaaaaaaaaaaa);");
5275   verifyFormat(
5276       "template <typename T1, typename T2 = char, typename T3 = char,\n"
5277       "          typename T4 = char>\n"
5278       "void f();");
5279   verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n"
5280                "          template <typename> class cccccccccccccccccccccc,\n"
5281                "          typename ddddddddddddd>\n"
5282                "class C {};");
5283   verifyFormat(
5284       "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
5285       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5286 
5287   verifyFormat("void f() {\n"
5288                "  a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
5289                "      a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n"
5290                "}");
5291 
5292   verifyFormat("template <typename T> class C {};");
5293   verifyFormat("template <typename T> void f();");
5294   verifyFormat("template <typename T> void f() {}");
5295   verifyFormat(
5296       "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5297       "              aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5298       "              aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n"
5299       "    new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
5300       "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5301       "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
5302       "        bbbbbbbbbbbbbbbbbbbbbbbb);",
5303       getLLVMStyleWithColumns(72));
5304   EXPECT_EQ("static_cast<A< //\n"
5305             "    B> *>(\n"
5306             "\n"
5307             ");",
5308             format("static_cast<A<//\n"
5309                    "    B>*>(\n"
5310                    "\n"
5311                    "    );"));
5312   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5313                "    const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);");
5314 
5315   FormatStyle AlwaysBreak = getLLVMStyle();
5316   AlwaysBreak.AlwaysBreakTemplateDeclarations = true;
5317   verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);
5318   verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);
5319   verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);
5320   verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5321                "                         bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
5322                "    ccccccccccccccccccccccccccccccccccccccccccccccc);");
5323   verifyFormat("template <template <typename> class Fooooooo,\n"
5324                "          template <typename> class Baaaaaaar>\n"
5325                "struct C {};",
5326                AlwaysBreak);
5327   verifyFormat("template <typename T> // T can be A, B or C.\n"
5328                "struct C {};",
5329                AlwaysBreak);
5330   verifyFormat("template <enum E> class A {\n"
5331                "public:\n"
5332                "  E *f();\n"
5333                "};");
5334 }
5335 
5336 TEST_F(FormatTest, WrapsTemplateParameters) {
5337   FormatStyle Style = getLLVMStyle();
5338   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5339   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
5340   verifyFormat(
5341       "template <typename... a> struct q {};\n"
5342       "extern q<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
5343       "    aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
5344       "    y;",
5345       Style);
5346   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5347   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
5348   verifyFormat(
5349       "template <typename... a> struct r {};\n"
5350       "extern r<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
5351       "    aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
5352       "    y;",
5353       Style);
5354   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5355   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
5356   verifyFormat(
5357       "template <typename... a> struct s {};\n"
5358       "extern s<\n"
5359       "    aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
5360       "    aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
5361       "    y;",
5362       Style);
5363   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5364   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
5365   verifyFormat(
5366       "template <typename... a> struct t {};\n"
5367       "extern t<\n"
5368       "    aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
5369       "    aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
5370       "    y;",
5371       Style);
5372 }
5373 
5374 TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
5375   verifyFormat(
5376       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5377       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5378   verifyFormat(
5379       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5380       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5381       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
5382 
5383   // FIXME: Should we have the extra indent after the second break?
5384   verifyFormat(
5385       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5386       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5387       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5388 
5389   verifyFormat(
5390       "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
5391       "                    cccccccccccccccccccccccccccccccccccccccccccccc());");
5392 
5393   // Breaking at nested name specifiers is generally not desirable.
5394   verifyFormat(
5395       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5396       "    aaaaaaaaaaaaaaaaaaaaaaa);");
5397 
5398   verifyFormat(
5399       "aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n"
5400       "                   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5401       "                       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5402       "                   aaaaaaaaaaaaaaaaaaaaa);",
5403       getLLVMStyleWithColumns(74));
5404 
5405   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
5406                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5407                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5408 }
5409 
5410 TEST_F(FormatTest, UnderstandsTemplateParameters) {
5411   verifyFormat("A<int> a;");
5412   verifyFormat("A<A<A<int>>> a;");
5413   verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
5414   verifyFormat("bool x = a < 1 || 2 > a;");
5415   verifyFormat("bool x = 5 < f<int>();");
5416   verifyFormat("bool x = f<int>() > 5;");
5417   verifyFormat("bool x = 5 < a<int>::x;");
5418   verifyFormat("bool x = a < 4 ? a > 2 : false;");
5419   verifyFormat("bool x = f() ? a < 2 : a > 2;");
5420 
5421   verifyGoogleFormat("A<A<int>> a;");
5422   verifyGoogleFormat("A<A<A<int>>> a;");
5423   verifyGoogleFormat("A<A<A<A<int>>>> a;");
5424   verifyGoogleFormat("A<A<int> > a;");
5425   verifyGoogleFormat("A<A<A<int> > > a;");
5426   verifyGoogleFormat("A<A<A<A<int> > > > a;");
5427   verifyGoogleFormat("A<::A<int>> a;");
5428   verifyGoogleFormat("A<::A> a;");
5429   verifyGoogleFormat("A< ::A> a;");
5430   verifyGoogleFormat("A< ::A<int> > a;");
5431   EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
5432   EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
5433   EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle()));
5434   EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle()));
5435   EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };",
5436             format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle()));
5437 
5438   verifyFormat("A<A>> a;", getChromiumStyle(FormatStyle::LK_Cpp));
5439 
5440   verifyFormat("test >> a >> b;");
5441   verifyFormat("test << a >> b;");
5442 
5443   verifyFormat("f<int>();");
5444   verifyFormat("template <typename T> void f() {}");
5445   verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;");
5446   verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : "
5447                "sizeof(char)>::type>;");
5448   verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};");
5449   verifyFormat("f(a.operator()<A>());");
5450   verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5451                "      .template operator()<A>());",
5452                getLLVMStyleWithColumns(35));
5453 
5454   // Not template parameters.
5455   verifyFormat("return a < b && c > d;");
5456   verifyFormat("void f() {\n"
5457                "  while (a < b && c > d) {\n"
5458                "  }\n"
5459                "}");
5460   verifyFormat("template <typename... Types>\n"
5461                "typename enable_if<0 < sizeof...(Types)>::type Foo() {}");
5462 
5463   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5464                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);",
5465                getLLVMStyleWithColumns(60));
5466   verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");");
5467   verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}");
5468   verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <");
5469 }
5470 
5471 TEST_F(FormatTest, BitshiftOperatorWidth) {
5472   EXPECT_EQ("int a = 1 << 2; /* foo\n"
5473             "                   bar */",
5474             format("int    a=1<<2;  /* foo\n"
5475                    "                   bar */"));
5476 
5477   EXPECT_EQ("int b = 256 >> 1; /* foo\n"
5478             "                     bar */",
5479             format("int  b  =256>>1 ;  /* foo\n"
5480                    "                      bar */"));
5481 }
5482 
5483 TEST_F(FormatTest, UnderstandsBinaryOperators) {
5484   verifyFormat("COMPARE(a, ==, b);");
5485   verifyFormat("auto s = sizeof...(Ts) - 1;");
5486 }
5487 
5488 TEST_F(FormatTest, UnderstandsPointersToMembers) {
5489   verifyFormat("int A::*x;");
5490   verifyFormat("int (S::*func)(void *);");
5491   verifyFormat("void f() { int (S::*func)(void *); }");
5492   verifyFormat("typedef bool *(Class::*Member)() const;");
5493   verifyFormat("void f() {\n"
5494                "  (a->*f)();\n"
5495                "  a->*x;\n"
5496                "  (a.*f)();\n"
5497                "  ((*a).*f)();\n"
5498                "  a.*x;\n"
5499                "}");
5500   verifyFormat("void f() {\n"
5501                "  (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
5502                "      aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
5503                "}");
5504   verifyFormat(
5505       "(aaaaaaaaaa->*bbbbbbb)(\n"
5506       "    aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
5507   FormatStyle Style = getLLVMStyle();
5508   Style.PointerAlignment = FormatStyle::PAS_Left;
5509   verifyFormat("typedef bool* (Class::*Member)() const;", Style);
5510 }
5511 
5512 TEST_F(FormatTest, UnderstandsUnaryOperators) {
5513   verifyFormat("int a = -2;");
5514   verifyFormat("f(-1, -2, -3);");
5515   verifyFormat("a[-1] = 5;");
5516   verifyFormat("int a = 5 + -2;");
5517   verifyFormat("if (i == -1) {\n}");
5518   verifyFormat("if (i != -1) {\n}");
5519   verifyFormat("if (i > -1) {\n}");
5520   verifyFormat("if (i < -1) {\n}");
5521   verifyFormat("++(a->f());");
5522   verifyFormat("--(a->f());");
5523   verifyFormat("(a->f())++;");
5524   verifyFormat("a[42]++;");
5525   verifyFormat("if (!(a->f())) {\n}");
5526 
5527   verifyFormat("a-- > b;");
5528   verifyFormat("b ? -a : c;");
5529   verifyFormat("n * sizeof char16;");
5530   verifyFormat("n * alignof char16;", getGoogleStyle());
5531   verifyFormat("sizeof(char);");
5532   verifyFormat("alignof(char);", getGoogleStyle());
5533 
5534   verifyFormat("return -1;");
5535   verifyFormat("switch (a) {\n"
5536                "case -1:\n"
5537                "  break;\n"
5538                "}");
5539   verifyFormat("#define X -1");
5540   verifyFormat("#define X -kConstant");
5541 
5542   verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};");
5543   verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};");
5544 
5545   verifyFormat("int a = /* confusing comment */ -1;");
5546   // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
5547   verifyFormat("int a = i /* confusing comment */++;");
5548 }
5549 
5550 TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) {
5551   verifyFormat("if (!aaaaaaaaaa( // break\n"
5552                "        aaaaa)) {\n"
5553                "}");
5554   verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
5555                "    aaaaa));");
5556   verifyFormat("*aaa = aaaaaaa( // break\n"
5557                "    bbbbbb);");
5558 }
5559 
5560 TEST_F(FormatTest, UnderstandsOverloadedOperators) {
5561   verifyFormat("bool operator<();");
5562   verifyFormat("bool operator>();");
5563   verifyFormat("bool operator=();");
5564   verifyFormat("bool operator==();");
5565   verifyFormat("bool operator!=();");
5566   verifyFormat("int operator+();");
5567   verifyFormat("int operator++();");
5568   verifyFormat("bool operator,();");
5569   verifyFormat("bool operator();");
5570   verifyFormat("bool operator()();");
5571   verifyFormat("bool operator[]();");
5572   verifyFormat("operator bool();");
5573   verifyFormat("operator int();");
5574   verifyFormat("operator void *();");
5575   verifyFormat("operator SomeType<int>();");
5576   verifyFormat("operator SomeType<int, int>();");
5577   verifyFormat("operator SomeType<SomeType<int>>();");
5578   verifyFormat("void *operator new(std::size_t size);");
5579   verifyFormat("void *operator new[](std::size_t size);");
5580   verifyFormat("void operator delete(void *ptr);");
5581   verifyFormat("void operator delete[](void *ptr);");
5582   verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
5583                "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
5584   verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n"
5585                "    aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;");
5586 
5587   verifyFormat(
5588       "ostream &operator<<(ostream &OutputStream,\n"
5589       "                    SomeReallyLongType WithSomeReallyLongValue);");
5590   verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
5591                "               const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
5592                "  return left.group < right.group;\n"
5593                "}");
5594   verifyFormat("SomeType &operator=(const SomeType &S);");
5595   verifyFormat("f.template operator()<int>();");
5596 
5597   verifyGoogleFormat("operator void*();");
5598   verifyGoogleFormat("operator SomeType<SomeType<int>>();");
5599   verifyGoogleFormat("operator ::A();");
5600 
5601   verifyFormat("using A::operator+;");
5602   verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n"
5603                "int i;");
5604 }
5605 
5606 TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
5607   verifyFormat("Deleted &operator=(const Deleted &) & = default;");
5608   verifyFormat("Deleted &operator=(const Deleted &) && = delete;");
5609   verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;");
5610   verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;");
5611   verifyFormat("Deleted &operator=(const Deleted &) &;");
5612   verifyFormat("Deleted &operator=(const Deleted &) &&;");
5613   verifyFormat("SomeType MemberFunction(const Deleted &) &;");
5614   verifyFormat("SomeType MemberFunction(const Deleted &) &&;");
5615   verifyFormat("SomeType MemberFunction(const Deleted &) && {}");
5616   verifyFormat("SomeType MemberFunction(const Deleted &) && final {}");
5617   verifyFormat("SomeType MemberFunction(const Deleted &) && override {}");
5618   verifyFormat("void Fn(T const &) const &;");
5619   verifyFormat("void Fn(T const volatile &&) const volatile &&;");
5620   verifyFormat("template <typename T>\n"
5621                "void F(T) && = delete;",
5622                getGoogleStyle());
5623 
5624   FormatStyle AlignLeft = getLLVMStyle();
5625   AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
5626   verifyFormat("void A::b() && {}", AlignLeft);
5627   verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
5628   verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
5629                AlignLeft);
5630   verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
5631   verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
5632   verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
5633   verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
5634   verifyFormat("auto Function(T) & -> void {}", AlignLeft);
5635   verifyFormat("auto Function(T) & -> void;", AlignLeft);
5636   verifyFormat("void Fn(T const&) const&;", AlignLeft);
5637   verifyFormat("void Fn(T const volatile&&) const volatile&&;", AlignLeft);
5638 
5639   FormatStyle Spaces = getLLVMStyle();
5640   Spaces.SpacesInCStyleCastParentheses = true;
5641   verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
5642   verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
5643   verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
5644   verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
5645 
5646   Spaces.SpacesInCStyleCastParentheses = false;
5647   Spaces.SpacesInParentheses = true;
5648   verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
5649   verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", Spaces);
5650   verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
5651   verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
5652 }
5653 
5654 TEST_F(FormatTest, UnderstandsNewAndDelete) {
5655   verifyFormat("void f() {\n"
5656                "  A *a = new A;\n"
5657                "  A *a = new (placement) A;\n"
5658                "  delete a;\n"
5659                "  delete (A *)a;\n"
5660                "}");
5661   verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
5662                "    typename aaaaaaaaaaaaaaaaaaaaaaaa();");
5663   verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5664                "    new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
5665                "        typename aaaaaaaaaaaaaaaaaaaaaaaa();");
5666   verifyFormat("delete[] h->p;");
5667 }
5668 
5669 TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
5670   verifyFormat("int *f(int *a) {}");
5671   verifyFormat("int main(int argc, char **argv) {}");
5672   verifyFormat("Test::Test(int b) : a(b * b) {}");
5673   verifyIndependentOfContext("f(a, *a);");
5674   verifyFormat("void g() { f(*a); }");
5675   verifyIndependentOfContext("int a = b * 10;");
5676   verifyIndependentOfContext("int a = 10 * b;");
5677   verifyIndependentOfContext("int a = b * c;");
5678   verifyIndependentOfContext("int a += b * c;");
5679   verifyIndependentOfContext("int a -= b * c;");
5680   verifyIndependentOfContext("int a *= b * c;");
5681   verifyIndependentOfContext("int a /= b * c;");
5682   verifyIndependentOfContext("int a = *b;");
5683   verifyIndependentOfContext("int a = *b * c;");
5684   verifyIndependentOfContext("int a = b * *c;");
5685   verifyIndependentOfContext("int a = b * (10);");
5686   verifyIndependentOfContext("S << b * (10);");
5687   verifyIndependentOfContext("return 10 * b;");
5688   verifyIndependentOfContext("return *b * *c;");
5689   verifyIndependentOfContext("return a & ~b;");
5690   verifyIndependentOfContext("f(b ? *c : *d);");
5691   verifyIndependentOfContext("int a = b ? *c : *d;");
5692   verifyIndependentOfContext("*b = a;");
5693   verifyIndependentOfContext("a * ~b;");
5694   verifyIndependentOfContext("a * !b;");
5695   verifyIndependentOfContext("a * +b;");
5696   verifyIndependentOfContext("a * -b;");
5697   verifyIndependentOfContext("a * ++b;");
5698   verifyIndependentOfContext("a * --b;");
5699   verifyIndependentOfContext("a[4] * b;");
5700   verifyIndependentOfContext("a[a * a] = 1;");
5701   verifyIndependentOfContext("f() * b;");
5702   verifyIndependentOfContext("a * [self dostuff];");
5703   verifyIndependentOfContext("int x = a * (a + b);");
5704   verifyIndependentOfContext("(a *)(a + b);");
5705   verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
5706   verifyIndependentOfContext("int *pa = (int *)&a;");
5707   verifyIndependentOfContext("return sizeof(int **);");
5708   verifyIndependentOfContext("return sizeof(int ******);");
5709   verifyIndependentOfContext("return (int **&)a;");
5710   verifyIndependentOfContext("f((*PointerToArray)[10]);");
5711   verifyFormat("void f(Type (*parameter)[10]) {}");
5712   verifyFormat("void f(Type (&parameter)[10]) {}");
5713   verifyGoogleFormat("return sizeof(int**);");
5714   verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
5715   verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
5716   verifyFormat("auto a = [](int **&, int ***) {};");
5717   verifyFormat("auto PointerBinding = [](const char *S) {};");
5718   verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
5719   verifyFormat("[](const decltype(*a) &value) {}");
5720   verifyFormat("decltype(a * b) F();");
5721   verifyFormat("#define MACRO() [](A *a) { return 1; }");
5722   verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
5723   verifyIndependentOfContext("typedef void (*f)(int *a);");
5724   verifyIndependentOfContext("int i{a * b};");
5725   verifyIndependentOfContext("aaa && aaa->f();");
5726   verifyIndependentOfContext("int x = ~*p;");
5727   verifyFormat("Constructor() : a(a), area(width * height) {}");
5728   verifyFormat("Constructor() : a(a), area(a, width * height) {}");
5729   verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
5730   verifyFormat("void f() { f(a, c * d); }");
5731   verifyFormat("void f() { f(new a(), c * d); }");
5732   verifyFormat("void f(const MyOverride &override);");
5733   verifyFormat("void f(const MyFinal &final);");
5734   verifyIndependentOfContext("bool a = f() && override.f();");
5735   verifyIndependentOfContext("bool a = f() && final.f();");
5736 
5737   verifyIndependentOfContext("InvalidRegions[*R] = 0;");
5738 
5739   verifyIndependentOfContext("A<int *> a;");
5740   verifyIndependentOfContext("A<int **> a;");
5741   verifyIndependentOfContext("A<int *, int *> a;");
5742   verifyIndependentOfContext("A<int *[]> a;");
5743   verifyIndependentOfContext(
5744       "const char *const p = reinterpret_cast<const char *const>(q);");
5745   verifyIndependentOfContext("A<int **, int **> a;");
5746   verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
5747   verifyFormat("for (char **a = b; *a; ++a) {\n}");
5748   verifyFormat("for (; a && b;) {\n}");
5749   verifyFormat("bool foo = true && [] { return false; }();");
5750 
5751   verifyFormat(
5752       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5753       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5754 
5755   verifyGoogleFormat("int const* a = &b;");
5756   verifyGoogleFormat("**outparam = 1;");
5757   verifyGoogleFormat("*outparam = a * b;");
5758   verifyGoogleFormat("int main(int argc, char** argv) {}");
5759   verifyGoogleFormat("A<int*> a;");
5760   verifyGoogleFormat("A<int**> a;");
5761   verifyGoogleFormat("A<int*, int*> a;");
5762   verifyGoogleFormat("A<int**, int**> a;");
5763   verifyGoogleFormat("f(b ? *c : *d);");
5764   verifyGoogleFormat("int a = b ? *c : *d;");
5765   verifyGoogleFormat("Type* t = **x;");
5766   verifyGoogleFormat("Type* t = *++*x;");
5767   verifyGoogleFormat("*++*x;");
5768   verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
5769   verifyGoogleFormat("Type* t = x++ * y;");
5770   verifyGoogleFormat(
5771       "const char* const p = reinterpret_cast<const char* const>(q);");
5772   verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
5773   verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
5774   verifyGoogleFormat("template <typename T>\n"
5775                      "void f(int i = 0, SomeType** temps = NULL);");
5776 
5777   FormatStyle Left = getLLVMStyle();
5778   Left.PointerAlignment = FormatStyle::PAS_Left;
5779   verifyFormat("x = *a(x) = *a(y);", Left);
5780   verifyFormat("for (;; *a = b) {\n}", Left);
5781   verifyFormat("return *this += 1;", Left);
5782   verifyFormat("throw *x;", Left);
5783   verifyFormat("delete *x;", Left);
5784   verifyFormat("typedef typeof(int(int, int))* MyFuncPtr;", Left);
5785   verifyFormat("[](const decltype(*a)* ptr) {}", Left);
5786   verifyFormat("typedef typeof /*comment*/ (int(int, int))* MyFuncPtr;", Left);
5787 
5788   verifyIndependentOfContext("a = *(x + y);");
5789   verifyIndependentOfContext("a = &(x + y);");
5790   verifyIndependentOfContext("*(x + y).call();");
5791   verifyIndependentOfContext("&(x + y)->call();");
5792   verifyFormat("void f() { &(*I).first; }");
5793 
5794   verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
5795   verifyFormat(
5796       "int *MyValues = {\n"
5797       "    *A, // Operator detection might be confused by the '{'\n"
5798       "    *BB // Operator detection might be confused by previous comment\n"
5799       "};");
5800 
5801   verifyIndependentOfContext("if (int *a = &b)");
5802   verifyIndependentOfContext("if (int &a = *b)");
5803   verifyIndependentOfContext("if (a & b[i])");
5804   verifyIndependentOfContext("if (a::b::c::d & b[i])");
5805   verifyIndependentOfContext("if (*b[i])");
5806   verifyIndependentOfContext("if (int *a = (&b))");
5807   verifyIndependentOfContext("while (int *a = &b)");
5808   verifyIndependentOfContext("size = sizeof *a;");
5809   verifyIndependentOfContext("if (a && (b = c))");
5810   verifyFormat("void f() {\n"
5811                "  for (const int &v : Values) {\n"
5812                "  }\n"
5813                "}");
5814   verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
5815   verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
5816   verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
5817 
5818   verifyFormat("#define A (!a * b)");
5819   verifyFormat("#define MACRO     \\\n"
5820                "  int *i = a * b; \\\n"
5821                "  void f(a *b);",
5822                getLLVMStyleWithColumns(19));
5823 
5824   verifyIndependentOfContext("A = new SomeType *[Length];");
5825   verifyIndependentOfContext("A = new SomeType *[Length]();");
5826   verifyIndependentOfContext("T **t = new T *;");
5827   verifyIndependentOfContext("T **t = new T *();");
5828   verifyGoogleFormat("A = new SomeType*[Length]();");
5829   verifyGoogleFormat("A = new SomeType*[Length];");
5830   verifyGoogleFormat("T** t = new T*;");
5831   verifyGoogleFormat("T** t = new T*();");
5832 
5833   verifyFormat("STATIC_ASSERT((a & b) == 0);");
5834   verifyFormat("STATIC_ASSERT(0 == (a & b));");
5835   verifyFormat("template <bool a, bool b> "
5836                "typename t::if<x && y>::type f() {}");
5837   verifyFormat("template <int *y> f() {}");
5838   verifyFormat("vector<int *> v;");
5839   verifyFormat("vector<int *const> v;");
5840   verifyFormat("vector<int *const **const *> v;");
5841   verifyFormat("vector<int *volatile> v;");
5842   verifyFormat("vector<a * b> v;");
5843   verifyFormat("foo<b && false>();");
5844   verifyFormat("foo<b & 1>();");
5845   verifyFormat("decltype(*::std::declval<const T &>()) void F();");
5846   verifyFormat(
5847       "template <class T, class = typename std::enable_if<\n"
5848       "                       std::is_integral<T>::value &&\n"
5849       "                       (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
5850       "void F();",
5851       getLLVMStyleWithColumns(70));
5852   verifyFormat(
5853       "template <class T,\n"
5854       "          class = typename std::enable_if<\n"
5855       "              std::is_integral<T>::value &&\n"
5856       "              (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n"
5857       "          class U>\n"
5858       "void F();",
5859       getLLVMStyleWithColumns(70));
5860   verifyFormat(
5861       "template <class T,\n"
5862       "          class = typename ::std::enable_if<\n"
5863       "              ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
5864       "void F();",
5865       getGoogleStyleWithColumns(68));
5866 
5867   verifyIndependentOfContext("MACRO(int *i);");
5868   verifyIndependentOfContext("MACRO(auto *a);");
5869   verifyIndependentOfContext("MACRO(const A *a);");
5870   verifyIndependentOfContext("MACRO(A *const a);");
5871   verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
5872   verifyFormat("void f() { f(float{1}, a * a); }");
5873   // FIXME: Is there a way to make this work?
5874   // verifyIndependentOfContext("MACRO(A *a);");
5875 
5876   verifyFormat("DatumHandle const *operator->() const { return input_; }");
5877   verifyFormat("return options != nullptr && operator==(*options);");
5878 
5879   EXPECT_EQ("#define OP(x)                                    \\\n"
5880             "  ostream &operator<<(ostream &s, const A &a) {  \\\n"
5881             "    return s << a.DebugString();                 \\\n"
5882             "  }",
5883             format("#define OP(x) \\\n"
5884                    "  ostream &operator<<(ostream &s, const A &a) { \\\n"
5885                    "    return s << a.DebugString(); \\\n"
5886                    "  }",
5887                    getLLVMStyleWithColumns(50)));
5888 
5889   // FIXME: We cannot handle this case yet; we might be able to figure out that
5890   // foo<x> d > v; doesn't make sense.
5891   verifyFormat("foo<a<b && c> d> v;");
5892 
5893   FormatStyle PointerMiddle = getLLVMStyle();
5894   PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
5895   verifyFormat("delete *x;", PointerMiddle);
5896   verifyFormat("int * x;", PointerMiddle);
5897   verifyFormat("template <int * y> f() {}", PointerMiddle);
5898   verifyFormat("int * f(int * a) {}", PointerMiddle);
5899   verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
5900   verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
5901   verifyFormat("A<int *> a;", PointerMiddle);
5902   verifyFormat("A<int **> a;", PointerMiddle);
5903   verifyFormat("A<int *, int *> a;", PointerMiddle);
5904   verifyFormat("A<int * []> a;", PointerMiddle);
5905   verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
5906   verifyFormat("A = new SomeType *[Length];", PointerMiddle);
5907   verifyFormat("T ** t = new T *;", PointerMiddle);
5908 
5909   // Member function reference qualifiers aren't binary operators.
5910   verifyFormat("string // break\n"
5911                "operator()() & {}");
5912   verifyFormat("string // break\n"
5913                "operator()() && {}");
5914   verifyGoogleFormat("template <typename T>\n"
5915                      "auto x() & -> int {}");
5916 }
5917 
5918 TEST_F(FormatTest, UnderstandsAttributes) {
5919   verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
5920   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
5921                "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
5922   FormatStyle AfterType = getLLVMStyle();
5923   AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
5924   verifyFormat("__attribute__((nodebug)) void\n"
5925                "foo() {}\n",
5926                AfterType);
5927 }
5928 
5929 TEST_F(FormatTest, UnderstandsEllipsis) {
5930   verifyFormat("int printf(const char *fmt, ...);");
5931   verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
5932   verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
5933 
5934   FormatStyle PointersLeft = getLLVMStyle();
5935   PointersLeft.PointerAlignment = FormatStyle::PAS_Left;
5936   verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
5937 }
5938 
5939 TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
5940   EXPECT_EQ("int *a;\n"
5941             "int *a;\n"
5942             "int *a;",
5943             format("int *a;\n"
5944                    "int* a;\n"
5945                    "int *a;",
5946                    getGoogleStyle()));
5947   EXPECT_EQ("int* a;\n"
5948             "int* a;\n"
5949             "int* a;",
5950             format("int* a;\n"
5951                    "int* a;\n"
5952                    "int *a;",
5953                    getGoogleStyle()));
5954   EXPECT_EQ("int *a;\n"
5955             "int *a;\n"
5956             "int *a;",
5957             format("int *a;\n"
5958                    "int * a;\n"
5959                    "int *  a;",
5960                    getGoogleStyle()));
5961   EXPECT_EQ("auto x = [] {\n"
5962             "  int *a;\n"
5963             "  int *a;\n"
5964             "  int *a;\n"
5965             "};",
5966             format("auto x=[]{int *a;\n"
5967                    "int * a;\n"
5968                    "int *  a;};",
5969                    getGoogleStyle()));
5970 }
5971 
5972 TEST_F(FormatTest, UnderstandsRvalueReferences) {
5973   verifyFormat("int f(int &&a) {}");
5974   verifyFormat("int f(int a, char &&b) {}");
5975   verifyFormat("void f() { int &&a = b; }");
5976   verifyGoogleFormat("int f(int a, char&& b) {}");
5977   verifyGoogleFormat("void f() { int&& a = b; }");
5978 
5979   verifyIndependentOfContext("A<int &&> a;");
5980   verifyIndependentOfContext("A<int &&, int &&> a;");
5981   verifyGoogleFormat("A<int&&> a;");
5982   verifyGoogleFormat("A<int&&, int&&> a;");
5983 
5984   // Not rvalue references:
5985   verifyFormat("template <bool B, bool C> class A {\n"
5986                "  static_assert(B && C, \"Something is wrong\");\n"
5987                "};");
5988   verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
5989   verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
5990   verifyFormat("#define A(a, b) (a && b)");
5991 }
5992 
5993 TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
5994   verifyFormat("void f() {\n"
5995                "  x[aaaaaaaaa -\n"
5996                "    b] = 23;\n"
5997                "}",
5998                getLLVMStyleWithColumns(15));
5999 }
6000 
6001 TEST_F(FormatTest, FormatsCasts) {
6002   verifyFormat("Type *A = static_cast<Type *>(P);");
6003   verifyFormat("Type *A = (Type *)P;");
6004   verifyFormat("Type *A = (vector<Type *, int *>)P;");
6005   verifyFormat("int a = (int)(2.0f);");
6006   verifyFormat("int a = (int)2.0f;");
6007   verifyFormat("x[(int32)y];");
6008   verifyFormat("x = (int32)y;");
6009   verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
6010   verifyFormat("int a = (int)*b;");
6011   verifyFormat("int a = (int)2.0f;");
6012   verifyFormat("int a = (int)~0;");
6013   verifyFormat("int a = (int)++a;");
6014   verifyFormat("int a = (int)sizeof(int);");
6015   verifyFormat("int a = (int)+2;");
6016   verifyFormat("my_int a = (my_int)2.0f;");
6017   verifyFormat("my_int a = (my_int)sizeof(int);");
6018   verifyFormat("return (my_int)aaa;");
6019   verifyFormat("#define x ((int)-1)");
6020   verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
6021   verifyFormat("#define p(q) ((int *)&q)");
6022   verifyFormat("fn(a)(b) + 1;");
6023 
6024   verifyFormat("void f() { my_int a = (my_int)*b; }");
6025   verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
6026   verifyFormat("my_int a = (my_int)~0;");
6027   verifyFormat("my_int a = (my_int)++a;");
6028   verifyFormat("my_int a = (my_int)-2;");
6029   verifyFormat("my_int a = (my_int)1;");
6030   verifyFormat("my_int a = (my_int *)1;");
6031   verifyFormat("my_int a = (const my_int)-1;");
6032   verifyFormat("my_int a = (const my_int *)-1;");
6033   verifyFormat("my_int a = (my_int)(my_int)-1;");
6034   verifyFormat("my_int a = (ns::my_int)-2;");
6035   verifyFormat("case (my_int)ONE:");
6036   verifyFormat("auto x = (X)this;");
6037 
6038   // FIXME: single value wrapped with paren will be treated as cast.
6039   verifyFormat("void f(int i = (kValue)*kMask) {}");
6040 
6041   verifyFormat("{ (void)F; }");
6042 
6043   // Don't break after a cast's
6044   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6045                "    (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
6046                "                                   bbbbbbbbbbbbbbbbbbbbbb);");
6047 
6048   // These are not casts.
6049   verifyFormat("void f(int *) {}");
6050   verifyFormat("f(foo)->b;");
6051   verifyFormat("f(foo).b;");
6052   verifyFormat("f(foo)(b);");
6053   verifyFormat("f(foo)[b];");
6054   verifyFormat("[](foo) { return 4; }(bar);");
6055   verifyFormat("(*funptr)(foo)[4];");
6056   verifyFormat("funptrs[4](foo)[4];");
6057   verifyFormat("void f(int *);");
6058   verifyFormat("void f(int *) = 0;");
6059   verifyFormat("void f(SmallVector<int>) {}");
6060   verifyFormat("void f(SmallVector<int>);");
6061   verifyFormat("void f(SmallVector<int>) = 0;");
6062   verifyFormat("void f(int i = (kA * kB) & kMask) {}");
6063   verifyFormat("int a = sizeof(int) * b;");
6064   verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
6065   verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
6066   verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
6067   verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
6068 
6069   // These are not casts, but at some point were confused with casts.
6070   verifyFormat("virtual void foo(int *) override;");
6071   verifyFormat("virtual void foo(char &) const;");
6072   verifyFormat("virtual void foo(int *a, char *) const;");
6073   verifyFormat("int a = sizeof(int *) + b;");
6074   verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
6075   verifyFormat("bool b = f(g<int>) && c;");
6076   verifyFormat("typedef void (*f)(int i) func;");
6077 
6078   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
6079                "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
6080   // FIXME: The indentation here is not ideal.
6081   verifyFormat(
6082       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6083       "    [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
6084       "        [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
6085 }
6086 
6087 TEST_F(FormatTest, FormatsFunctionTypes) {
6088   verifyFormat("A<bool()> a;");
6089   verifyFormat("A<SomeType()> a;");
6090   verifyFormat("A<void (*)(int, std::string)> a;");
6091   verifyFormat("A<void *(int)>;");
6092   verifyFormat("void *(*a)(int *, SomeType *);");
6093   verifyFormat("int (*func)(void *);");
6094   verifyFormat("void f() { int (*func)(void *); }");
6095   verifyFormat("template <class CallbackClass>\n"
6096                "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
6097 
6098   verifyGoogleFormat("A<void*(int*, SomeType*)>;");
6099   verifyGoogleFormat("void* (*a)(int);");
6100   verifyGoogleFormat(
6101       "template <class CallbackClass>\n"
6102       "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
6103 
6104   // Other constructs can look somewhat like function types:
6105   verifyFormat("A<sizeof(*x)> a;");
6106   verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
6107   verifyFormat("some_var = function(*some_pointer_var)[0];");
6108   verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
6109   verifyFormat("int x = f(&h)();");
6110   verifyFormat("returnsFunction(&param1, &param2)(param);");
6111   verifyFormat("std::function<\n"
6112                "    LooooooooooongTemplatedType<\n"
6113                "        SomeType>*(\n"
6114                "        LooooooooooooooooongType type)>\n"
6115                "    function;",
6116                getGoogleStyleWithColumns(40));
6117 }
6118 
6119 TEST_F(FormatTest, FormatsPointersToArrayTypes) {
6120   verifyFormat("A (*foo_)[6];");
6121   verifyFormat("vector<int> (*foo_)[6];");
6122 }
6123 
6124 TEST_F(FormatTest, BreaksLongVariableDeclarations) {
6125   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6126                "    LoooooooooooooooooooooooooooooooooooooooongVariable;");
6127   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
6128                "    LoooooooooooooooooooooooooooooooooooooooongVariable;");
6129   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6130                "    *LoooooooooooooooooooooooooooooooooooooooongVariable;");
6131 
6132   // Different ways of ()-initializiation.
6133   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6134                "    LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
6135   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6136                "    LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
6137   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6138                "    LoooooooooooooooooooooooooooooooooooooooongVariable({});");
6139   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
6140                "    LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
6141 
6142   // Lambdas should not confuse the variable declaration heuristic.
6143   verifyFormat("LooooooooooooooooongType\n"
6144                "    variable(nullptr, [](A *a) {});",
6145                getLLVMStyleWithColumns(40));
6146 }
6147 
6148 TEST_F(FormatTest, BreaksLongDeclarations) {
6149   verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
6150                "    AnotherNameForTheLongType;");
6151   verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
6152                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
6153   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6154                "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
6155   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
6156                "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
6157   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6158                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
6159   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
6160                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
6161   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6162                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
6163   verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6164                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
6165   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6166                "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
6167   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6168                "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
6169   FormatStyle Indented = getLLVMStyle();
6170   Indented.IndentWrappedFunctionNames = true;
6171   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6172                "    LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
6173                Indented);
6174   verifyFormat(
6175       "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
6176       "    LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6177       Indented);
6178   verifyFormat(
6179       "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
6180       "    LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6181       Indented);
6182   verifyFormat(
6183       "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
6184       "    LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
6185       Indented);
6186 
6187   // FIXME: Without the comment, this breaks after "(".
6188   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType  // break\n"
6189                "    (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
6190                getGoogleStyle());
6191 
6192   verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
6193                "                  int LoooooooooooooooooooongParam2) {}");
6194   verifyFormat(
6195       "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
6196       "                                   SourceLocation L, IdentifierIn *II,\n"
6197       "                                   Type *T) {}");
6198   verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
6199                "ReallyReaaallyLongFunctionName(\n"
6200                "    const std::string &SomeParameter,\n"
6201                "    const SomeType<string, SomeOtherTemplateParameter>\n"
6202                "        &ReallyReallyLongParameterName,\n"
6203                "    const SomeType<string, SomeOtherTemplateParameter>\n"
6204                "        &AnotherLongParameterName) {}");
6205   verifyFormat("template <typename A>\n"
6206                "SomeLoooooooooooooooooooooongType<\n"
6207                "    typename some_namespace::SomeOtherType<A>::Type>\n"
6208                "Function() {}");
6209 
6210   verifyGoogleFormat(
6211       "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
6212       "    aaaaaaaaaaaaaaaaaaaaaaa;");
6213   verifyGoogleFormat(
6214       "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
6215       "                                   SourceLocation L) {}");
6216   verifyGoogleFormat(
6217       "some_namespace::LongReturnType\n"
6218       "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
6219       "    int first_long_parameter, int second_parameter) {}");
6220 
6221   verifyGoogleFormat("template <typename T>\n"
6222                      "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
6223                      "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
6224   verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6225                      "                   int aaaaaaaaaaaaaaaaaaaaaaa);");
6226 
6227   verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
6228                "    const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6229                "        *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6230   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6231                "    vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
6232                "        aaaaaaaaaaaaaaaaaaaaaaaa);");
6233   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6234                "    vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
6235                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
6236                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6237 
6238   verifyFormat("template <typename T> // Templates on own line.\n"
6239                "static int            // Some comment.\n"
6240                "MyFunction(int a);",
6241                getLLVMStyle());
6242 }
6243 
6244 TEST_F(FormatTest, FormatsArrays) {
6245   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6246                "                         [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
6247   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
6248                "                         [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
6249   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
6250                "    aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
6251   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6252                "    [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6253   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6254                "    [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
6255   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6256                "    [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6257                "    [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
6258   verifyFormat(
6259       "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
6260       "             << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
6261       "                                  [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
6262   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
6263                "    .aaaaaaaaaaaaaaaaaaaaaa();");
6264 
6265   verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
6266                      "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
6267   verifyFormat(
6268       "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
6269       "                                  .aaaaaaa[0]\n"
6270       "                                  .aaaaaaaaaaaaaaaaaaaaaa();");
6271   verifyFormat("a[::b::c];");
6272 
6273   verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
6274 
6275   FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
6276   verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
6277 }
6278 
6279 TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
6280   verifyFormat("(a)->b();");
6281   verifyFormat("--a;");
6282 }
6283 
6284 TEST_F(FormatTest, HandlesIncludeDirectives) {
6285   verifyFormat("#include <string>\n"
6286                "#include <a/b/c.h>\n"
6287                "#include \"a/b/string\"\n"
6288                "#include \"string.h\"\n"
6289                "#include \"string.h\"\n"
6290                "#include <a-a>\n"
6291                "#include < path with space >\n"
6292                "#include_next <test.h>"
6293                "#include \"abc.h\" // this is included for ABC\n"
6294                "#include \"some long include\" // with a comment\n"
6295                "#include \"some very long include paaaaaaaaaaaaaaaaaaaaaaath\"",
6296                getLLVMStyleWithColumns(35));
6297   EXPECT_EQ("#include \"a.h\"", format("#include  \"a.h\""));
6298   EXPECT_EQ("#include <a>", format("#include<a>"));
6299 
6300   verifyFormat("#import <string>");
6301   verifyFormat("#import <a/b/c.h>");
6302   verifyFormat("#import \"a/b/string\"");
6303   verifyFormat("#import \"string.h\"");
6304   verifyFormat("#import \"string.h\"");
6305   verifyFormat("#if __has_include(<strstream>)\n"
6306                "#include <strstream>\n"
6307                "#endif");
6308 
6309   verifyFormat("#define MY_IMPORT <a/b>");
6310 
6311   verifyFormat("#if __has_include(<a/b>)");
6312   verifyFormat("#if __has_include_next(<a/b>)");
6313   verifyFormat("#define F __has_include(<a/b>)");
6314   verifyFormat("#define F __has_include_next(<a/b>)");
6315 
6316   // Protocol buffer definition or missing "#".
6317   verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
6318                getLLVMStyleWithColumns(30));
6319 
6320   FormatStyle Style = getLLVMStyle();
6321   Style.AlwaysBreakBeforeMultilineStrings = true;
6322   Style.ColumnLimit = 0;
6323   verifyFormat("#import \"abc.h\"", Style);
6324 
6325   // But 'import' might also be a regular C++ namespace.
6326   verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6327                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6328 }
6329 
6330 //===----------------------------------------------------------------------===//
6331 // Error recovery tests.
6332 //===----------------------------------------------------------------------===//
6333 
6334 TEST_F(FormatTest, IncompleteParameterLists) {
6335   FormatStyle NoBinPacking = getLLVMStyle();
6336   NoBinPacking.BinPackParameters = false;
6337   verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
6338                "                        double *min_x,\n"
6339                "                        double *max_x,\n"
6340                "                        double *min_y,\n"
6341                "                        double *max_y,\n"
6342                "                        double *min_z,\n"
6343                "                        double *max_z, ) {}",
6344                NoBinPacking);
6345 }
6346 
6347 TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
6348   verifyFormat("void f() { return; }\n42");
6349   verifyFormat("void f() {\n"
6350                "  if (0)\n"
6351                "    return;\n"
6352                "}\n"
6353                "42");
6354   verifyFormat("void f() { return }\n42");
6355   verifyFormat("void f() {\n"
6356                "  if (0)\n"
6357                "    return\n"
6358                "}\n"
6359                "42");
6360 }
6361 
6362 TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
6363   EXPECT_EQ("void f() { return }", format("void  f ( )  {  return  }"));
6364   EXPECT_EQ("void f() {\n"
6365             "  if (a)\n"
6366             "    return\n"
6367             "}",
6368             format("void  f  (  )  {  if  ( a )  return  }"));
6369   EXPECT_EQ("namespace N {\n"
6370             "void f()\n"
6371             "}",
6372             format("namespace  N  {  void f()  }"));
6373   EXPECT_EQ("namespace N {\n"
6374             "void f() {}\n"
6375             "void g()\n"
6376             "} // namespace N",
6377             format("namespace N  { void f( ) { } void g( ) }"));
6378 }
6379 
6380 TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
6381   verifyFormat("int aaaaaaaa =\n"
6382                "    // Overlylongcomment\n"
6383                "    b;",
6384                getLLVMStyleWithColumns(20));
6385   verifyFormat("function(\n"
6386                "    ShortArgument,\n"
6387                "    LoooooooooooongArgument);\n",
6388                getLLVMStyleWithColumns(20));
6389 }
6390 
6391 TEST_F(FormatTest, IncorrectAccessSpecifier) {
6392   verifyFormat("public:");
6393   verifyFormat("class A {\n"
6394                "public\n"
6395                "  void f() {}\n"
6396                "};");
6397   verifyFormat("public\n"
6398                "int qwerty;");
6399   verifyFormat("public\n"
6400                "B {}");
6401   verifyFormat("public\n"
6402                "{}");
6403   verifyFormat("public\n"
6404                "B { int x; }");
6405 }
6406 
6407 TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
6408   verifyFormat("{");
6409   verifyFormat("#})");
6410   verifyNoCrash("(/**/[:!] ?[).");
6411 }
6412 
6413 TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
6414   verifyFormat("do {\n}");
6415   verifyFormat("do {\n}\n"
6416                "f();");
6417   verifyFormat("do {\n}\n"
6418                "wheeee(fun);");
6419   verifyFormat("do {\n"
6420                "  f();\n"
6421                "}");
6422 }
6423 
6424 TEST_F(FormatTest, IncorrectCodeMissingParens) {
6425   verifyFormat("if {\n  foo;\n  foo();\n}");
6426   verifyFormat("switch {\n  foo;\n  foo();\n}");
6427   verifyIncompleteFormat("for {\n  foo;\n  foo();\n}");
6428   verifyFormat("while {\n  foo;\n  foo();\n}");
6429   verifyFormat("do {\n  foo;\n  foo();\n} while;");
6430 }
6431 
6432 TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
6433   verifyIncompleteFormat("namespace {\n"
6434                          "class Foo { Foo (\n"
6435                          "};\n"
6436                          "} // namespace");
6437 }
6438 
6439 TEST_F(FormatTest, IncorrectCodeErrorDetection) {
6440   EXPECT_EQ("{\n  {}\n", format("{\n{\n}\n"));
6441   EXPECT_EQ("{\n  {}\n", format("{\n  {\n}\n"));
6442   EXPECT_EQ("{\n  {}\n", format("{\n  {\n  }\n"));
6443   EXPECT_EQ("{\n  {}\n}\n}\n", format("{\n  {\n    }\n  }\n}\n"));
6444 
6445   EXPECT_EQ("{\n"
6446             "  {\n"
6447             "    breakme(\n"
6448             "        qwe);\n"
6449             "  }\n",
6450             format("{\n"
6451                    "    {\n"
6452                    " breakme(qwe);\n"
6453                    "}\n",
6454                    getLLVMStyleWithColumns(10)));
6455 }
6456 
6457 TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
6458   verifyFormat("int x = {\n"
6459                "    avariable,\n"
6460                "    b(alongervariable)};",
6461                getLLVMStyleWithColumns(25));
6462 }
6463 
6464 TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
6465   verifyFormat("return (a)(b){1, 2, 3};");
6466 }
6467 
6468 TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
6469   verifyFormat("vector<int> x{1, 2, 3, 4};");
6470   verifyFormat("vector<int> x{\n"
6471                "    1,\n"
6472                "    2,\n"
6473                "    3,\n"
6474                "    4,\n"
6475                "};");
6476   verifyFormat("vector<T> x{{}, {}, {}, {}};");
6477   verifyFormat("f({1, 2});");
6478   verifyFormat("auto v = Foo{-1};");
6479   verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
6480   verifyFormat("Class::Class : member{1, 2, 3} {}");
6481   verifyFormat("new vector<int>{1, 2, 3};");
6482   verifyFormat("new int[3]{1, 2, 3};");
6483   verifyFormat("new int{1};");
6484   verifyFormat("return {arg1, arg2};");
6485   verifyFormat("return {arg1, SomeType{parameter}};");
6486   verifyFormat("int count = set<int>{f(), g(), h()}.size();");
6487   verifyFormat("new T{arg1, arg2};");
6488   verifyFormat("f(MyMap[{composite, key}]);");
6489   verifyFormat("class Class {\n"
6490                "  T member = {arg1, arg2};\n"
6491                "};");
6492   verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
6493   verifyFormat("const struct A a = {.a = 1, .b = 2};");
6494   verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
6495   verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
6496   verifyFormat("int a = std::is_integral<int>{} + 0;");
6497 
6498   verifyFormat("int foo(int i) { return fo1{}(i); }");
6499   verifyFormat("int foo(int i) { return fo1{}(i); }");
6500   verifyFormat("auto i = decltype(x){};");
6501   verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
6502   verifyFormat("Node n{1, Node{1000}, //\n"
6503                "       2};");
6504   verifyFormat("Aaaa aaaaaaa{\n"
6505                "    {\n"
6506                "        aaaa,\n"
6507                "    },\n"
6508                "};");
6509   verifyFormat("class C : public D {\n"
6510                "  SomeClass SC{2};\n"
6511                "};");
6512   verifyFormat("class C : public A {\n"
6513                "  class D : public B {\n"
6514                "    void f() { int i{2}; }\n"
6515                "  };\n"
6516                "};");
6517   verifyFormat("#define A {a, a},");
6518 
6519   // Binpacking only if there is no trailing comma
6520   verifyFormat("const Aaaaaa aaaaa = {aaaaaaaaaa, bbbbbbbbbb,\n"
6521                "                      cccccccccc, dddddddddd};",
6522 			   getLLVMStyleWithColumns(50));
6523   verifyFormat("const Aaaaaa aaaaa = {\n"
6524                "    aaaaaaaaaaa,\n"
6525                "    bbbbbbbbbbb,\n"
6526                "    ccccccccccc,\n"
6527                "    ddddddddddd,\n"
6528                "};", getLLVMStyleWithColumns(50));
6529 
6530   // Cases where distinguising braced lists and blocks is hard.
6531   verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
6532   verifyFormat("void f() {\n"
6533                "  return; // comment\n"
6534                "}\n"
6535                "SomeType t;");
6536   verifyFormat("void f() {\n"
6537                "  if (a) {\n"
6538                "    f();\n"
6539                "  }\n"
6540                "}\n"
6541                "SomeType t;");
6542 
6543   // In combination with BinPackArguments = false.
6544   FormatStyle NoBinPacking = getLLVMStyle();
6545   NoBinPacking.BinPackArguments = false;
6546   verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
6547                "                      bbbbb,\n"
6548                "                      ccccc,\n"
6549                "                      ddddd,\n"
6550                "                      eeeee,\n"
6551                "                      ffffff,\n"
6552                "                      ggggg,\n"
6553                "                      hhhhhh,\n"
6554                "                      iiiiii,\n"
6555                "                      jjjjjj,\n"
6556                "                      kkkkkk};",
6557                NoBinPacking);
6558   verifyFormat("const Aaaaaa aaaaa = {\n"
6559                "    aaaaa,\n"
6560                "    bbbbb,\n"
6561                "    ccccc,\n"
6562                "    ddddd,\n"
6563                "    eeeee,\n"
6564                "    ffffff,\n"
6565                "    ggggg,\n"
6566                "    hhhhhh,\n"
6567                "    iiiiii,\n"
6568                "    jjjjjj,\n"
6569                "    kkkkkk,\n"
6570                "};",
6571                NoBinPacking);
6572   verifyFormat(
6573       "const Aaaaaa aaaaa = {\n"
6574       "    aaaaa,  bbbbb,  ccccc,  ddddd,  eeeee,  ffffff, ggggg, hhhhhh,\n"
6575       "    iiiiii, jjjjjj, kkkkkk, aaaaa,  bbbbb,  ccccc,  ddddd, eeeee,\n"
6576       "    ffffff, ggggg,  hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
6577       "};",
6578       NoBinPacking);
6579 
6580   // FIXME: The alignment of these trailing comments might be bad. Then again,
6581   // this might be utterly useless in real code.
6582   verifyFormat("Constructor::Constructor()\n"
6583                "    : some_value{         //\n"
6584                "                 aaaaaaa, //\n"
6585                "                 bbbbbbb} {}");
6586 
6587   // In braced lists, the first comment is always assumed to belong to the
6588   // first element. Thus, it can be moved to the next or previous line as
6589   // appropriate.
6590   EXPECT_EQ("function({// First element:\n"
6591             "          1,\n"
6592             "          // Second element:\n"
6593             "          2});",
6594             format("function({\n"
6595                    "    // First element:\n"
6596                    "    1,\n"
6597                    "    // Second element:\n"
6598                    "    2});"));
6599   EXPECT_EQ("std::vector<int> MyNumbers{\n"
6600             "    // First element:\n"
6601             "    1,\n"
6602             "    // Second element:\n"
6603             "    2};",
6604             format("std::vector<int> MyNumbers{// First element:\n"
6605                    "                           1,\n"
6606                    "                           // Second element:\n"
6607                    "                           2};",
6608                    getLLVMStyleWithColumns(30)));
6609   // A trailing comma should still lead to an enforced line break and no
6610   // binpacking.
6611   EXPECT_EQ("vector<int> SomeVector = {\n"
6612             "    // aaa\n"
6613             "    1,\n"
6614             "    2,\n"
6615             "};",
6616             format("vector<int> SomeVector = { // aaa\n"
6617                    "    1, 2, };"));
6618 
6619   FormatStyle ExtraSpaces = getLLVMStyle();
6620   ExtraSpaces.Cpp11BracedListStyle = false;
6621   ExtraSpaces.ColumnLimit = 75;
6622   verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
6623   verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
6624   verifyFormat("f({ 1, 2 });", ExtraSpaces);
6625   verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
6626   verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
6627   verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
6628   verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
6629   verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
6630   verifyFormat("return { arg1, arg2 };", ExtraSpaces);
6631   verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
6632   verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
6633   verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
6634   verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
6635   verifyFormat("class Class {\n"
6636                "  T member = { arg1, arg2 };\n"
6637                "};",
6638                ExtraSpaces);
6639   verifyFormat(
6640       "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6641       "                                 aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
6642       "                  : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
6643       "                                 bbbbbbbbbbbbbbbbbbbb, bbbbb };",
6644       ExtraSpaces);
6645   verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
6646   verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
6647                ExtraSpaces);
6648   verifyFormat(
6649       "someFunction(OtherParam,\n"
6650       "             BracedList{ // comment 1 (Forcing interesting break)\n"
6651       "                         param1, param2,\n"
6652       "                         // comment 2\n"
6653       "                         param3, param4 });",
6654       ExtraSpaces);
6655   verifyFormat(
6656       "std::this_thread::sleep_for(\n"
6657       "    std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
6658       ExtraSpaces);
6659   verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n"
6660                "    aaaaaaa,\n"
6661                "    aaaaaaaaaa,\n"
6662                "    aaaaa,\n"
6663                "    aaaaaaaaaaaaaaa,\n"
6664                "    aaa,\n"
6665                "    aaaaaaaaaa,\n"
6666                "    a,\n"
6667                "    aaaaaaaaaaaaaaaaaaaaa,\n"
6668                "    aaaaaaaaaaaa,\n"
6669                "    aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
6670                "    aaaaaaa,\n"
6671                "    a};");
6672   verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
6673   verifyFormat("const struct A a = { .a = 1, .b = 2 };", ExtraSpaces);
6674   verifyFormat("const struct A a = { [0] = 1, [1] = 2 };", ExtraSpaces);
6675 }
6676 
6677 TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
6678   verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6679                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6680                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6681                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6682                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6683                "                 1, 22, 333, 4444, 55555, 666666, 7777777};");
6684   verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
6685                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6686                "                 1, 22, 333, 4444, 55555, //\n"
6687                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6688                "                 1, 22, 333, 4444, 55555, 666666, 7777777};");
6689   verifyFormat(
6690       "vector<int> x = {1,       22, 333, 4444, 55555, 666666, 7777777,\n"
6691       "                 1,       22, 333, 4444, 55555, 666666, 7777777,\n"
6692       "                 1,       22, 333, 4444, 55555, 666666, // comment\n"
6693       "                 7777777, 1,  22,  333,  4444,  55555,  666666,\n"
6694       "                 7777777, 1,  22,  333,  4444,  55555,  666666,\n"
6695       "                 7777777, 1,  22,  333,  4444,  55555,  666666,\n"
6696       "                 7777777};");
6697   verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
6698                "    X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6699                "    X86::R8,  X86::R9,  X86::R10, X86::R11, 0};");
6700   verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
6701                "    X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6702                "    // Separating comment.\n"
6703                "    X86::R8, X86::R9, X86::R10, X86::R11, 0};");
6704   verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
6705                "    // Leading comment\n"
6706                "    X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
6707                "    X86::R8,  X86::R9,  X86::R10, X86::R11, 0};");
6708   verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6709                "                 1, 1, 1, 1};",
6710                getLLVMStyleWithColumns(39));
6711   verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6712                "                 1, 1, 1, 1};",
6713                getLLVMStyleWithColumns(38));
6714   verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
6715                "    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
6716                getLLVMStyleWithColumns(43));
6717   verifyFormat(
6718       "static unsigned SomeValues[10][3] = {\n"
6719       "    {1, 4, 0},  {4, 9, 0},  {4, 5, 9},  {8, 5, 4}, {1, 8, 4},\n"
6720       "    {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
6721   verifyFormat("static auto fields = new vector<string>{\n"
6722                "    \"aaaaaaaaaaaaa\",\n"
6723                "    \"aaaaaaaaaaaaa\",\n"
6724                "    \"aaaaaaaaaaaa\",\n"
6725                "    \"aaaaaaaaaaaaaa\",\n"
6726                "    \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
6727                "    \"aaaaaaaaaaaa\",\n"
6728                "    \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
6729                "};");
6730   verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
6731   verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
6732                "                 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
6733                "                 3, cccccccccccccccccccccc};",
6734                getLLVMStyleWithColumns(60));
6735 
6736   // Trailing commas.
6737   verifyFormat("vector<int> x = {\n"
6738                "    1, 1, 1, 1, 1, 1, 1, 1,\n"
6739                "};",
6740                getLLVMStyleWithColumns(39));
6741   verifyFormat("vector<int> x = {\n"
6742                "    1, 1, 1, 1, 1, 1, 1, 1, //\n"
6743                "};",
6744                getLLVMStyleWithColumns(39));
6745   verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
6746                "                 1, 1, 1, 1,\n"
6747                "                 /**/ /**/};",
6748                getLLVMStyleWithColumns(39));
6749 
6750   // Trailing comment in the first line.
6751   verifyFormat("vector<int> iiiiiiiiiiiiiii = {                      //\n"
6752                "    1111111111, 2222222222, 33333333333, 4444444444, //\n"
6753                "    111111111,  222222222,  3333333333,  444444444,  //\n"
6754                "    11111111,   22222222,   333333333,   44444444};");
6755   // Trailing comment in the last line.
6756   verifyFormat("int aaaaa[] = {\n"
6757                "    1, 2, 3, // comment\n"
6758                "    4, 5, 6  // comment\n"
6759                "};");
6760 
6761   // With nested lists, we should either format one item per line or all nested
6762   // lists one on line.
6763   // FIXME: For some nested lists, we can do better.
6764   verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
6765                "        {aaaaaaaaaaaaaaaaaaa},\n"
6766                "        {aaaaaaaaaaaaaaaaaaaaa},\n"
6767                "        {aaaaaaaaaaaaaaaaa}};",
6768                getLLVMStyleWithColumns(60));
6769   verifyFormat(
6770       "SomeStruct my_struct_array = {\n"
6771       "    {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
6772       "     aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
6773       "    {aaa, aaa},\n"
6774       "    {aaa, aaa},\n"
6775       "    {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
6776       "    {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
6777       "     aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
6778 
6779   // No column layout should be used here.
6780   verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
6781                "                   bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
6782 
6783   verifyNoCrash("a<,");
6784 
6785   // No braced initializer here.
6786   verifyFormat("void f() {\n"
6787                "  struct Dummy {};\n"
6788                "  f(v);\n"
6789                "}");
6790 
6791   // Long lists should be formatted in columns even if they are nested.
6792   verifyFormat(
6793       "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6794       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6795       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6796       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6797       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
6798       "                          1, 22, 333, 4444, 55555, 666666, 7777777});");
6799 
6800   // Allow "single-column" layout even if that violates the column limit. There
6801   // isn't going to be a better way.
6802   verifyFormat("std::vector<int> a = {\n"
6803                "    aaaaaaaa,\n"
6804                "    aaaaaaaa,\n"
6805                "    aaaaaaaa,\n"
6806                "    aaaaaaaa,\n"
6807                "    aaaaaaaaaa,\n"
6808                "    aaaaaaaa,\n"
6809                "    aaaaaaaaaaaaaaaaaaaaaaaaaaa};",
6810                getLLVMStyleWithColumns(30));
6811   verifyFormat("vector<int> aaaa = {\n"
6812                "    aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6813                "    aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6814                "    aaaaaa.aaaaaaa,\n"
6815                "    aaaaaa.aaaaaaa,\n"
6816                "    aaaaaa.aaaaaaa,\n"
6817                "    aaaaaa.aaaaaaa,\n"
6818                "};");
6819 
6820   // Don't create hanging lists.
6821   verifyFormat("someFunction(Param, {List1, List2,\n"
6822                "                     List3});",
6823                getLLVMStyleWithColumns(35));
6824   verifyFormat("someFunction(Param, Param,\n"
6825                "             {List1, List2,\n"
6826                "              List3});",
6827                getLLVMStyleWithColumns(35));
6828   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n"
6829                "                               aaaaaaaaaaaaaaaaaaaaaaa);");
6830 }
6831 
6832 TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
6833   FormatStyle DoNotMerge = getLLVMStyle();
6834   DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
6835 
6836   verifyFormat("void f() { return 42; }");
6837   verifyFormat("void f() {\n"
6838                "  return 42;\n"
6839                "}",
6840                DoNotMerge);
6841   verifyFormat("void f() {\n"
6842                "  // Comment\n"
6843                "}");
6844   verifyFormat("{\n"
6845                "#error {\n"
6846                "  int a;\n"
6847                "}");
6848   verifyFormat("{\n"
6849                "  int a;\n"
6850                "#error {\n"
6851                "}");
6852   verifyFormat("void f() {} // comment");
6853   verifyFormat("void f() { int a; } // comment");
6854   verifyFormat("void f() {\n"
6855                "} // comment",
6856                DoNotMerge);
6857   verifyFormat("void f() {\n"
6858                "  int a;\n"
6859                "} // comment",
6860                DoNotMerge);
6861   verifyFormat("void f() {\n"
6862                "} // comment",
6863                getLLVMStyleWithColumns(15));
6864 
6865   verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
6866   verifyFormat("void f() {\n  return 42;\n}", getLLVMStyleWithColumns(22));
6867 
6868   verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
6869   verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
6870   verifyFormat("class C {\n"
6871                "  C()\n"
6872                "      : iiiiiiii(nullptr),\n"
6873                "        kkkkkkk(nullptr),\n"
6874                "        mmmmmmm(nullptr),\n"
6875                "        nnnnnnn(nullptr) {}\n"
6876                "};",
6877                getGoogleStyle());
6878 
6879   FormatStyle NoColumnLimit = getLLVMStyle();
6880   NoColumnLimit.ColumnLimit = 0;
6881   EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
6882   EXPECT_EQ("class C {\n"
6883             "  A() : b(0) {}\n"
6884             "};",
6885             format("class C{A():b(0){}};", NoColumnLimit));
6886   EXPECT_EQ("A()\n"
6887             "    : b(0) {\n"
6888             "}",
6889             format("A()\n:b(0)\n{\n}", NoColumnLimit));
6890 
6891   FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
6892   DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
6893       FormatStyle::SFS_None;
6894   EXPECT_EQ("A()\n"
6895             "    : b(0) {\n"
6896             "}",
6897             format("A():b(0){}", DoNotMergeNoColumnLimit));
6898   EXPECT_EQ("A()\n"
6899             "    : b(0) {\n"
6900             "}",
6901             format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
6902 
6903   verifyFormat("#define A          \\\n"
6904                "  void f() {       \\\n"
6905                "    int i;         \\\n"
6906                "  }",
6907                getLLVMStyleWithColumns(20));
6908   verifyFormat("#define A           \\\n"
6909                "  void f() { int i; }",
6910                getLLVMStyleWithColumns(21));
6911   verifyFormat("#define A            \\\n"
6912                "  void f() {         \\\n"
6913                "    int i;           \\\n"
6914                "  }                  \\\n"
6915                "  int j;",
6916                getLLVMStyleWithColumns(22));
6917   verifyFormat("#define A             \\\n"
6918                "  void f() { int i; } \\\n"
6919                "  int j;",
6920                getLLVMStyleWithColumns(23));
6921 }
6922 
6923 TEST_F(FormatTest, PullEmptyFunctionDefinitionsIntoSingleLine) {
6924   FormatStyle MergeEmptyOnly = getLLVMStyle();
6925   MergeEmptyOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
6926   verifyFormat("class C {\n"
6927                "  int f() {}\n"
6928                "};",
6929                MergeEmptyOnly);
6930   verifyFormat("class C {\n"
6931                "  int f() {\n"
6932                "    return 42;\n"
6933                "  }\n"
6934                "};",
6935                MergeEmptyOnly);
6936   verifyFormat("int f() {}", MergeEmptyOnly);
6937   verifyFormat("int f() {\n"
6938                "  return 42;\n"
6939                "}",
6940                MergeEmptyOnly);
6941 
6942   // Also verify behavior when BraceWrapping.AfterFunction = true
6943   MergeEmptyOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
6944   MergeEmptyOnly.BraceWrapping.AfterFunction = true;
6945   verifyFormat("int f() {}", MergeEmptyOnly);
6946   verifyFormat("class C {\n"
6947                "  int f() {}\n"
6948                "};",
6949                MergeEmptyOnly);
6950 }
6951 
6952 TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
6953   FormatStyle MergeInlineOnly = getLLVMStyle();
6954   MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
6955   verifyFormat("class C {\n"
6956                "  int f() { return 42; }\n"
6957                "};",
6958                MergeInlineOnly);
6959   verifyFormat("int f() {\n"
6960                "  return 42;\n"
6961                "}",
6962                MergeInlineOnly);
6963 
6964   // SFS_Inline implies SFS_Empty
6965   verifyFormat("class C {\n"
6966                "  int f() {}\n"
6967                "};",
6968                MergeInlineOnly);
6969   verifyFormat("int f() {}", MergeInlineOnly);
6970 
6971   // Also verify behavior when BraceWrapping.AfterFunction = true
6972   MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
6973   MergeInlineOnly.BraceWrapping.AfterFunction = true;
6974   verifyFormat("class C {\n"
6975                "  int f() { return 42; }\n"
6976                "};",
6977                MergeInlineOnly);
6978   verifyFormat("int f()\n"
6979                "{\n"
6980                "  return 42;\n"
6981                "}",
6982                MergeInlineOnly);
6983 
6984   // SFS_Inline implies SFS_Empty
6985   verifyFormat("int f() {}", MergeInlineOnly);
6986   verifyFormat("class C {\n"
6987                "  int f() {}\n"
6988                "};",
6989                MergeInlineOnly);
6990 }
6991 
6992 TEST_F(FormatTest, PullInlineOnlyFunctionDefinitionsIntoSingleLine) {
6993   FormatStyle MergeInlineOnly = getLLVMStyle();
6994   MergeInlineOnly.AllowShortFunctionsOnASingleLine =
6995       FormatStyle::SFS_InlineOnly;
6996   verifyFormat("class C {\n"
6997                "  int f() { return 42; }\n"
6998                "};",
6999                MergeInlineOnly);
7000   verifyFormat("int f() {\n"
7001                "  return 42;\n"
7002                "}",
7003                MergeInlineOnly);
7004 
7005   // SFS_InlineOnly does not imply SFS_Empty
7006   verifyFormat("class C {\n"
7007                "  int f() {}\n"
7008                "};",
7009                MergeInlineOnly);
7010   verifyFormat("int f() {\n"
7011                "}",
7012                MergeInlineOnly);
7013 
7014   // Also verify behavior when BraceWrapping.AfterFunction = true
7015   MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
7016   MergeInlineOnly.BraceWrapping.AfterFunction = true;
7017   verifyFormat("class C {\n"
7018                "  int f() { return 42; }\n"
7019                "};",
7020                MergeInlineOnly);
7021   verifyFormat("int f()\n"
7022                "{\n"
7023                "  return 42;\n"
7024                "}",
7025                MergeInlineOnly);
7026 
7027   // SFS_InlineOnly does not imply SFS_Empty
7028   verifyFormat("int f()\n"
7029                "{\n"
7030                "}",
7031                MergeInlineOnly);
7032   verifyFormat("class C {\n"
7033                "  int f() {}\n"
7034                "};",
7035                MergeInlineOnly);
7036 }
7037 
7038 TEST_F(FormatTest, SplitEmptyFunction) {
7039   FormatStyle Style = getLLVMStyle();
7040   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
7041   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7042   Style.BraceWrapping.AfterFunction = true;
7043   Style.BraceWrapping.SplitEmptyFunction = false;
7044   Style.ColumnLimit = 40;
7045 
7046   verifyFormat("int f()\n"
7047                "{}",
7048                Style);
7049   verifyFormat("int f()\n"
7050                "{\n"
7051                "  return 42;\n"
7052                "}",
7053                Style);
7054   verifyFormat("int f()\n"
7055                "{\n"
7056                "  // some comment\n"
7057                "}",
7058                Style);
7059 
7060   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
7061   verifyFormat("int f() {}", Style);
7062   verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7063                "{}",
7064                Style);
7065   verifyFormat("int f()\n"
7066                "{\n"
7067                "  return 0;\n"
7068                "}",
7069                Style);
7070 
7071   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
7072   verifyFormat("class Foo {\n"
7073                "  int f() {}\n"
7074                "};\n",
7075                Style);
7076   verifyFormat("class Foo {\n"
7077                "  int f() { return 0; }\n"
7078                "};\n",
7079                Style);
7080   verifyFormat("class Foo {\n"
7081                "  int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7082                "  {}\n"
7083                "};\n",
7084                Style);
7085   verifyFormat("class Foo {\n"
7086                "  int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7087                "  {\n"
7088                "    return 0;\n"
7089                "  }\n"
7090                "};\n",
7091                Style);
7092 
7093   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
7094   verifyFormat("int f() {}", Style);
7095   verifyFormat("int f() { return 0; }", Style);
7096   verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7097                "{}",
7098                Style);
7099   verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
7100                "{\n"
7101                "  return 0;\n"
7102                "}",
7103                Style);
7104 }
7105 
7106 TEST_F(FormatTest, SplitEmptyClass) {
7107   FormatStyle Style = getLLVMStyle();
7108   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7109   Style.BraceWrapping.AfterClass = true;
7110   Style.BraceWrapping.SplitEmptyRecord = false;
7111 
7112   verifyFormat("class Foo\n"
7113                "{};",
7114                Style);
7115   verifyFormat("/* something */ class Foo\n"
7116                "{};",
7117                Style);
7118   verifyFormat("template <typename X> class Foo\n"
7119                "{};",
7120                Style);
7121   verifyFormat("class Foo\n"
7122                "{\n"
7123                "  Foo();\n"
7124                "};",
7125                Style);
7126   verifyFormat("typedef class Foo\n"
7127                "{\n"
7128                "} Foo_t;",
7129                Style);
7130 }
7131 
7132 TEST_F(FormatTest, SplitEmptyStruct) {
7133   FormatStyle Style = getLLVMStyle();
7134   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7135   Style.BraceWrapping.AfterStruct = true;
7136   Style.BraceWrapping.SplitEmptyRecord = false;
7137 
7138   verifyFormat("struct Foo\n"
7139                "{};",
7140                Style);
7141   verifyFormat("/* something */ struct Foo\n"
7142                "{};",
7143                Style);
7144   verifyFormat("template <typename X> struct Foo\n"
7145                "{};",
7146                Style);
7147   verifyFormat("struct Foo\n"
7148                "{\n"
7149                "  Foo();\n"
7150                "};",
7151                Style);
7152   verifyFormat("typedef struct Foo\n"
7153                "{\n"
7154                "} Foo_t;",
7155                Style);
7156   //typedef struct Bar {} Bar_t;
7157 }
7158 
7159 TEST_F(FormatTest, SplitEmptyUnion) {
7160   FormatStyle Style = getLLVMStyle();
7161   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7162   Style.BraceWrapping.AfterUnion = true;
7163   Style.BraceWrapping.SplitEmptyRecord = false;
7164 
7165   verifyFormat("union Foo\n"
7166                "{};",
7167                Style);
7168   verifyFormat("/* something */ union Foo\n"
7169                "{};",
7170                Style);
7171   verifyFormat("union Foo\n"
7172                "{\n"
7173                "  A,\n"
7174                "};",
7175                Style);
7176   verifyFormat("typedef union Foo\n"
7177                "{\n"
7178                "} Foo_t;",
7179                Style);
7180 }
7181 
7182 TEST_F(FormatTest, SplitEmptyNamespace) {
7183   FormatStyle Style = getLLVMStyle();
7184   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7185   Style.BraceWrapping.AfterNamespace = true;
7186   Style.BraceWrapping.SplitEmptyNamespace = false;
7187 
7188   verifyFormat("namespace Foo\n"
7189                "{};",
7190                Style);
7191   verifyFormat("/* something */ namespace Foo\n"
7192                "{};",
7193                Style);
7194   verifyFormat("inline namespace Foo\n"
7195                "{};",
7196                Style);
7197   verifyFormat("namespace Foo\n"
7198                "{\n"
7199                "void Bar();\n"
7200                "};",
7201                Style);
7202 }
7203 
7204 TEST_F(FormatTest, NeverMergeShortRecords) {
7205   FormatStyle Style = getLLVMStyle();
7206 
7207   verifyFormat("class Foo {\n"
7208                "  Foo();\n"
7209                "};",
7210                Style);
7211   verifyFormat("typedef class Foo {\n"
7212                "  Foo();\n"
7213                "} Foo_t;",
7214                Style);
7215   verifyFormat("struct Foo {\n"
7216                "  Foo();\n"
7217                "};",
7218                Style);
7219   verifyFormat("typedef struct Foo {\n"
7220                "  Foo();\n"
7221                "} Foo_t;",
7222                Style);
7223   verifyFormat("union Foo {\n"
7224                "  A,\n"
7225                "};",
7226                Style);
7227   verifyFormat("typedef union Foo {\n"
7228                "  A,\n"
7229                "} Foo_t;",
7230                Style);
7231   verifyFormat("namespace Foo {\n"
7232                "void Bar();\n"
7233                "};",
7234                Style);
7235 
7236   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
7237   Style.BraceWrapping.AfterClass = true;
7238   Style.BraceWrapping.AfterStruct = true;
7239   Style.BraceWrapping.AfterUnion = true;
7240   Style.BraceWrapping.AfterNamespace = true;
7241   verifyFormat("class Foo\n"
7242                "{\n"
7243                "  Foo();\n"
7244                "};",
7245                Style);
7246   verifyFormat("typedef class Foo\n"
7247                "{\n"
7248                "  Foo();\n"
7249                "} Foo_t;",
7250                Style);
7251   verifyFormat("struct Foo\n"
7252                "{\n"
7253                "  Foo();\n"
7254                "};",
7255                Style);
7256   verifyFormat("typedef struct Foo\n"
7257                "{\n"
7258                "  Foo();\n"
7259                "} Foo_t;",
7260                Style);
7261   verifyFormat("union Foo\n"
7262                "{\n"
7263                "  A,\n"
7264                "};",
7265                Style);
7266   verifyFormat("typedef union Foo\n"
7267                "{\n"
7268                "  A,\n"
7269                "} Foo_t;",
7270                Style);
7271   verifyFormat("namespace Foo\n"
7272                "{\n"
7273                "void Bar();\n"
7274                "};",
7275                Style);
7276 }
7277 
7278 TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
7279   // Elaborate type variable declarations.
7280   verifyFormat("struct foo a = {bar};\nint n;");
7281   verifyFormat("class foo a = {bar};\nint n;");
7282   verifyFormat("union foo a = {bar};\nint n;");
7283 
7284   // Elaborate types inside function definitions.
7285   verifyFormat("struct foo f() {}\nint n;");
7286   verifyFormat("class foo f() {}\nint n;");
7287   verifyFormat("union foo f() {}\nint n;");
7288 
7289   // Templates.
7290   verifyFormat("template <class X> void f() {}\nint n;");
7291   verifyFormat("template <struct X> void f() {}\nint n;");
7292   verifyFormat("template <union X> void f() {}\nint n;");
7293 
7294   // Actual definitions...
7295   verifyFormat("struct {\n} n;");
7296   verifyFormat(
7297       "template <template <class T, class Y>, class Z> class X {\n} n;");
7298   verifyFormat("union Z {\n  int n;\n} x;");
7299   verifyFormat("class MACRO Z {\n} n;");
7300   verifyFormat("class MACRO(X) Z {\n} n;");
7301   verifyFormat("class __attribute__(X) Z {\n} n;");
7302   verifyFormat("class __declspec(X) Z {\n} n;");
7303   verifyFormat("class A##B##C {\n} n;");
7304   verifyFormat("class alignas(16) Z {\n} n;");
7305   verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
7306   verifyFormat("class MACROA MACRO(X) Z {\n} n;");
7307 
7308   // Redefinition from nested context:
7309   verifyFormat("class A::B::C {\n} n;");
7310 
7311   // Template definitions.
7312   verifyFormat(
7313       "template <typename F>\n"
7314       "Matcher(const Matcher<F> &Other,\n"
7315       "        typename enable_if_c<is_base_of<F, T>::value &&\n"
7316       "                             !is_same<F, T>::value>::type * = 0)\n"
7317       "    : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
7318 
7319   // FIXME: This is still incorrectly handled at the formatter side.
7320   verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
7321   verifyFormat("int i = SomeFunction(a<b, a> b);");
7322 
7323   // FIXME:
7324   // This now gets parsed incorrectly as class definition.
7325   // verifyFormat("class A<int> f() {\n}\nint n;");
7326 
7327   // Elaborate types where incorrectly parsing the structural element would
7328   // break the indent.
7329   verifyFormat("if (true)\n"
7330                "  class X x;\n"
7331                "else\n"
7332                "  f();\n");
7333 
7334   // This is simply incomplete. Formatting is not important, but must not crash.
7335   verifyFormat("class A:");
7336 }
7337 
7338 TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
7339   EXPECT_EQ("#error Leave     all         white!!!!! space* alone!\n",
7340             format("#error Leave     all         white!!!!! space* alone!\n"));
7341   EXPECT_EQ(
7342       "#warning Leave     all         white!!!!! space* alone!\n",
7343       format("#warning Leave     all         white!!!!! space* alone!\n"));
7344   EXPECT_EQ("#error 1", format("  #  error   1"));
7345   EXPECT_EQ("#warning 1", format("  #  warning 1"));
7346 }
7347 
7348 TEST_F(FormatTest, FormatHashIfExpressions) {
7349   verifyFormat("#if AAAA && BBBB");
7350   verifyFormat("#if (AAAA && BBBB)");
7351   verifyFormat("#elif (AAAA && BBBB)");
7352   // FIXME: Come up with a better indentation for #elif.
7353   verifyFormat(
7354       "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) &&  \\\n"
7355       "    defined(BBBBBBBB)\n"
7356       "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) &&  \\\n"
7357       "    defined(BBBBBBBB)\n"
7358       "#endif",
7359       getLLVMStyleWithColumns(65));
7360 }
7361 
7362 TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
7363   FormatStyle AllowsMergedIf = getGoogleStyle();
7364   AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
7365   verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
7366   verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
7367   verifyFormat("if (true)\n#error E\n  return 42;", AllowsMergedIf);
7368   EXPECT_EQ("if (true) return 42;",
7369             format("if (true)\nreturn 42;", AllowsMergedIf));
7370   FormatStyle ShortMergedIf = AllowsMergedIf;
7371   ShortMergedIf.ColumnLimit = 25;
7372   verifyFormat("#define A \\\n"
7373                "  if (true) return 42;",
7374                ShortMergedIf);
7375   verifyFormat("#define A \\\n"
7376                "  f();    \\\n"
7377                "  if (true)\n"
7378                "#define B",
7379                ShortMergedIf);
7380   verifyFormat("#define A \\\n"
7381                "  f();    \\\n"
7382                "  if (true)\n"
7383                "g();",
7384                ShortMergedIf);
7385   verifyFormat("{\n"
7386                "#ifdef A\n"
7387                "  // Comment\n"
7388                "  if (true) continue;\n"
7389                "#endif\n"
7390                "  // Comment\n"
7391                "  if (true) continue;\n"
7392                "}",
7393                ShortMergedIf);
7394   ShortMergedIf.ColumnLimit = 33;
7395   verifyFormat("#define A \\\n"
7396                "  if constexpr (true) return 42;",
7397                ShortMergedIf);
7398   ShortMergedIf.ColumnLimit = 29;
7399   verifyFormat("#define A                   \\\n"
7400                "  if (aaaaaaaaaa) return 1; \\\n"
7401                "  return 2;",
7402                ShortMergedIf);
7403   ShortMergedIf.ColumnLimit = 28;
7404   verifyFormat("#define A         \\\n"
7405                "  if (aaaaaaaaaa) \\\n"
7406                "    return 1;     \\\n"
7407                "  return 2;",
7408                ShortMergedIf);
7409   verifyFormat("#define A                \\\n"
7410                "  if constexpr (aaaaaaa) \\\n"
7411                "    return 1;            \\\n"
7412                "  return 2;",
7413                ShortMergedIf);
7414 }
7415 
7416 TEST_F(FormatTest, FormatStarDependingOnContext) {
7417   verifyFormat("void f(int *a);");
7418   verifyFormat("void f() { f(fint * b); }");
7419   verifyFormat("class A {\n  void f(int *a);\n};");
7420   verifyFormat("class A {\n  int *a;\n};");
7421   verifyFormat("namespace a {\n"
7422                "namespace b {\n"
7423                "class A {\n"
7424                "  void f() {}\n"
7425                "  int *a;\n"
7426                "};\n"
7427                "} // namespace b\n"
7428                "} // namespace a");
7429 }
7430 
7431 TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
7432   verifyFormat("while");
7433   verifyFormat("operator");
7434 }
7435 
7436 TEST_F(FormatTest, SkipsDeeplyNestedLines) {
7437   // This code would be painfully slow to format if we didn't skip it.
7438   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
7439                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7440                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7441                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7442                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
7443                    "A(1, 1)\n"
7444                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
7445                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7446                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7447                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7448                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7449                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7450                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7451                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7452                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
7453                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n");
7454   // Deeply nested part is untouched, rest is formatted.
7455   EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
7456             format(std::string("int    i;\n") + Code + "int    j;\n",
7457                    getLLVMStyle(), SC_ExpectIncomplete));
7458 }
7459 
7460 //===----------------------------------------------------------------------===//
7461 // Objective-C tests.
7462 //===----------------------------------------------------------------------===//
7463 
7464 TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
7465   verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
7466   EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
7467             format("-(NSUInteger)indexOfObject:(id)anObject;"));
7468   EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
7469   EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
7470   EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
7471             format("-(NSInteger)Method3:(id)anObject;"));
7472   EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
7473             format("-(NSInteger)Method4:(id)anObject;"));
7474   EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
7475             format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
7476   EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
7477             format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
7478   EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7479             "forAllCells:(BOOL)flag;",
7480             format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
7481                    "forAllCells:(BOOL)flag;"));
7482 
7483   // Very long objectiveC method declaration.
7484   verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
7485                "    (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
7486   verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
7487                "                    inRange:(NSRange)range\n"
7488                "                   outRange:(NSRange)out_range\n"
7489                "                  outRange1:(NSRange)out_range1\n"
7490                "                  outRange2:(NSRange)out_range2\n"
7491                "                  outRange3:(NSRange)out_range3\n"
7492                "                  outRange4:(NSRange)out_range4\n"
7493                "                  outRange5:(NSRange)out_range5\n"
7494                "                  outRange6:(NSRange)out_range6\n"
7495                "                  outRange7:(NSRange)out_range7\n"
7496                "                  outRange8:(NSRange)out_range8\n"
7497                "                  outRange9:(NSRange)out_range9;");
7498 
7499   // When the function name has to be wrapped.
7500   FormatStyle Style = getLLVMStyle();
7501   Style.IndentWrappedFunctionNames = false;
7502   verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
7503                "veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7504                "           anotherName:(NSString)bbbbbbbbbbbbbb {\n"
7505                "}",
7506                Style);
7507   Style.IndentWrappedFunctionNames = true;
7508   verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
7509                "    veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
7510                "               anotherName:(NSString)bbbbbbbbbbbbbb {\n"
7511                "}",
7512                Style);
7513 
7514   verifyFormat("- (int)sum:(vector<int>)numbers;");
7515   verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
7516   // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
7517   // protocol lists (but not for template classes):
7518   // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
7519 
7520   verifyFormat("- (int (*)())foo:(int (*)())f;");
7521   verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
7522 
7523   // If there's no return type (very rare in practice!), LLVM and Google style
7524   // agree.
7525   verifyFormat("- foo;");
7526   verifyFormat("- foo:(int)f;");
7527   verifyGoogleFormat("- foo:(int)foo;");
7528 }
7529 
7530 
7531 TEST_F(FormatTest, BreaksStringLiterals) {
7532   EXPECT_EQ("\"some text \"\n"
7533             "\"other\";",
7534             format("\"some text other\";", getLLVMStyleWithColumns(12)));
7535   EXPECT_EQ("\"some text \"\n"
7536             "\"other\";",
7537             format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
7538   EXPECT_EQ(
7539       "#define A  \\\n"
7540       "  \"some \"  \\\n"
7541       "  \"text \"  \\\n"
7542       "  \"other\";",
7543       format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
7544   EXPECT_EQ(
7545       "#define A  \\\n"
7546       "  \"so \"    \\\n"
7547       "  \"text \"  \\\n"
7548       "  \"other\";",
7549       format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
7550 
7551   EXPECT_EQ("\"some text\"",
7552             format("\"some text\"", getLLVMStyleWithColumns(1)));
7553   EXPECT_EQ("\"some text\"",
7554             format("\"some text\"", getLLVMStyleWithColumns(11)));
7555   EXPECT_EQ("\"some \"\n"
7556             "\"text\"",
7557             format("\"some text\"", getLLVMStyleWithColumns(10)));
7558   EXPECT_EQ("\"some \"\n"
7559             "\"text\"",
7560             format("\"some text\"", getLLVMStyleWithColumns(7)));
7561   EXPECT_EQ("\"some\"\n"
7562             "\" tex\"\n"
7563             "\"t\"",
7564             format("\"some text\"", getLLVMStyleWithColumns(6)));
7565   EXPECT_EQ("\"some\"\n"
7566             "\" tex\"\n"
7567             "\" and\"",
7568             format("\"some tex and\"", getLLVMStyleWithColumns(6)));
7569   EXPECT_EQ("\"some\"\n"
7570             "\"/tex\"\n"
7571             "\"/and\"",
7572             format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
7573 
7574   EXPECT_EQ("variable =\n"
7575             "    \"long string \"\n"
7576             "    \"literal\";",
7577             format("variable = \"long string literal\";",
7578                    getLLVMStyleWithColumns(20)));
7579 
7580   EXPECT_EQ("variable = f(\n"
7581             "    \"long string \"\n"
7582             "    \"literal\",\n"
7583             "    short,\n"
7584             "    loooooooooooooooooooong);",
7585             format("variable = f(\"long string literal\", short, "
7586                    "loooooooooooooooooooong);",
7587                    getLLVMStyleWithColumns(20)));
7588 
7589   EXPECT_EQ(
7590       "f(g(\"long string \"\n"
7591       "    \"literal\"),\n"
7592       "  b);",
7593       format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
7594   EXPECT_EQ("f(g(\"long string \"\n"
7595             "    \"literal\",\n"
7596             "    a),\n"
7597             "  b);",
7598             format("f(g(\"long string literal\", a), b);",
7599                    getLLVMStyleWithColumns(20)));
7600   EXPECT_EQ(
7601       "f(\"one two\".split(\n"
7602       "    variable));",
7603       format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
7604   EXPECT_EQ("f(\"one two three four five six \"\n"
7605             "  \"seven\".split(\n"
7606             "      really_looooong_variable));",
7607             format("f(\"one two three four five six seven\"."
7608                    "split(really_looooong_variable));",
7609                    getLLVMStyleWithColumns(33)));
7610 
7611   EXPECT_EQ("f(\"some \"\n"
7612             "  \"text\",\n"
7613             "  other);",
7614             format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
7615 
7616   // Only break as a last resort.
7617   verifyFormat(
7618       "aaaaaaaaaaaaaaaaaaaa(\n"
7619       "    aaaaaaaaaaaaaaaaaaaa,\n"
7620       "    aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
7621 
7622   EXPECT_EQ("\"splitmea\"\n"
7623             "\"trandomp\"\n"
7624             "\"oint\"",
7625             format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
7626 
7627   EXPECT_EQ("\"split/\"\n"
7628             "\"pathat/\"\n"
7629             "\"slashes\"",
7630             format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
7631 
7632   EXPECT_EQ("\"split/\"\n"
7633             "\"pathat/\"\n"
7634             "\"slashes\"",
7635             format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
7636   EXPECT_EQ("\"split at \"\n"
7637             "\"spaces/at/\"\n"
7638             "\"slashes.at.any$\"\n"
7639             "\"non-alphanumeric%\"\n"
7640             "\"1111111111characte\"\n"
7641             "\"rs\"",
7642             format("\"split at "
7643                    "spaces/at/"
7644                    "slashes.at."
7645                    "any$non-"
7646                    "alphanumeric%"
7647                    "1111111111characte"
7648                    "rs\"",
7649                    getLLVMStyleWithColumns(20)));
7650 
7651   // Verify that splitting the strings understands
7652   // Style::AlwaysBreakBeforeMultilineStrings.
7653   EXPECT_EQ(
7654       "aaaaaaaaaaaa(\n"
7655       "    \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
7656       "    \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
7657       format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
7658              "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
7659              "aaaaaaaaaaaaaaaaaaaaaa\");",
7660              getGoogleStyle()));
7661   EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7662             "       \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
7663             format("return \"aaaaaaaaaaaaaaaaaaaaaa "
7664                    "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
7665                    "aaaaaaaaaaaaaaaaaaaaaa\";",
7666                    getGoogleStyle()));
7667   EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7668             "                \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
7669             format("llvm::outs() << "
7670                    "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
7671                    "aaaaaaaaaaaaaaaaaaa\";"));
7672   EXPECT_EQ("ffff(\n"
7673             "    {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
7674             "     \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
7675             format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
7676                    "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
7677                    getGoogleStyle()));
7678 
7679   FormatStyle Style = getLLVMStyleWithColumns(12);
7680   Style.BreakStringLiterals = false;
7681   EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
7682 
7683   FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
7684   AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
7685   EXPECT_EQ("#define A \\\n"
7686             "  \"some \" \\\n"
7687             "  \"text \" \\\n"
7688             "  \"other\";",
7689             format("#define A \"some text other\";", AlignLeft));
7690 }
7691 
7692 TEST_F(FormatTest, FullyRemoveEmptyLines) {
7693   FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
7694   NoEmptyLines.MaxEmptyLinesToKeep = 0;
7695   EXPECT_EQ("int i = a(b());",
7696             format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
7697 }
7698 
7699 TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
7700   EXPECT_EQ(
7701       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
7702       "(\n"
7703       "    \"x\t\");",
7704       format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
7705              "aaaaaaa("
7706              "\"x\t\");"));
7707 }
7708 
7709 TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
7710   EXPECT_EQ(
7711       "u8\"utf8 string \"\n"
7712       "u8\"literal\";",
7713       format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
7714   EXPECT_EQ(
7715       "u\"utf16 string \"\n"
7716       "u\"literal\";",
7717       format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
7718   EXPECT_EQ(
7719       "U\"utf32 string \"\n"
7720       "U\"literal\";",
7721       format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
7722   EXPECT_EQ("L\"wide string \"\n"
7723             "L\"literal\";",
7724             format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
7725   EXPECT_EQ("@\"NSString \"\n"
7726             "@\"literal\";",
7727             format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
7728   verifyFormat(R"(NSString *s = @"那那那那";)", getLLVMStyleWithColumns(26));
7729 
7730   // This input makes clang-format try to split the incomplete unicode escape
7731   // sequence, which used to lead to a crasher.
7732   verifyNoCrash(
7733       "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
7734       getLLVMStyleWithColumns(60));
7735 }
7736 
7737 TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
7738   FormatStyle Style = getGoogleStyleWithColumns(15);
7739   EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
7740   EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
7741   EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
7742   EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
7743   EXPECT_EQ("u8R\"x(raw literal)x\";",
7744             format("u8R\"x(raw literal)x\";", Style));
7745 }
7746 
7747 TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
7748   FormatStyle Style = getLLVMStyleWithColumns(20);
7749   EXPECT_EQ(
7750       "_T(\"aaaaaaaaaaaaaa\")\n"
7751       "_T(\"aaaaaaaaaaaaaa\")\n"
7752       "_T(\"aaaaaaaaaaaa\")",
7753       format("  _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
7754   EXPECT_EQ("f(x,\n"
7755             "  _T(\"aaaaaaaaaaaa\")\n"
7756             "  _T(\"aaa\"),\n"
7757             "  z);",
7758             format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
7759 
7760   // FIXME: Handle embedded spaces in one iteration.
7761   //  EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
7762   //            "_T(\"aaaaaaaaaaaaa\")\n"
7763   //            "_T(\"aaaaaaaaaaaaa\")\n"
7764   //            "_T(\"a\")",
7765   //            format("  _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
7766   //                   getLLVMStyleWithColumns(20)));
7767   EXPECT_EQ(
7768       "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
7769       format("  _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
7770   EXPECT_EQ("f(\n"
7771             "#if !TEST\n"
7772             "    _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
7773             "#endif\n"
7774             ");",
7775             format("f(\n"
7776                    "#if !TEST\n"
7777                    "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
7778                    "#endif\n"
7779                    ");"));
7780   EXPECT_EQ("f(\n"
7781             "\n"
7782             "    _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
7783             format("f(\n"
7784                    "\n"
7785                    "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
7786 }
7787 
7788 TEST_F(FormatTest, BreaksStringLiteralOperands) {
7789   // In a function call with two operands, the second can be broken with no line
7790   // break before it.
7791   EXPECT_EQ("func(a, \"long long \"\n"
7792             "        \"long long\");",
7793             format("func(a, \"long long long long\");",
7794                    getLLVMStyleWithColumns(24)));
7795   // In a function call with three operands, the second must be broken with a
7796   // line break before it.
7797   EXPECT_EQ("func(a,\n"
7798             "     \"long long long \"\n"
7799             "     \"long\",\n"
7800             "     c);",
7801             format("func(a, \"long long long long\", c);",
7802                    getLLVMStyleWithColumns(24)));
7803   // In a function call with three operands, the third must be broken with a
7804   // line break before it.
7805   EXPECT_EQ("func(a, b,\n"
7806             "     \"long long long \"\n"
7807             "     \"long\");",
7808             format("func(a, b, \"long long long long\");",
7809                    getLLVMStyleWithColumns(24)));
7810   // In a function call with three operands, both the second and the third must
7811   // be broken with a line break before them.
7812   EXPECT_EQ("func(a,\n"
7813             "     \"long long long \"\n"
7814             "     \"long\",\n"
7815             "     \"long long long \"\n"
7816             "     \"long\");",
7817             format("func(a, \"long long long long\", \"long long long long\");",
7818                    getLLVMStyleWithColumns(24)));
7819   // In a chain of << with two operands, the second can be broken with no line
7820   // break before it.
7821   EXPECT_EQ("a << \"line line \"\n"
7822             "     \"line\";",
7823             format("a << \"line line line\";",
7824                    getLLVMStyleWithColumns(20)));
7825   // In a chain of << with three operands, the second can be broken with no line
7826   // break before it.
7827   EXPECT_EQ("abcde << \"line \"\n"
7828             "         \"line line\"\n"
7829             "      << c;",
7830             format("abcde << \"line line line\" << c;",
7831                    getLLVMStyleWithColumns(20)));
7832   // In a chain of << with three operands, the third must be broken with a line
7833   // break before it.
7834   EXPECT_EQ("a << b\n"
7835             "  << \"line line \"\n"
7836             "     \"line\";",
7837             format("a << b << \"line line line\";",
7838                    getLLVMStyleWithColumns(20)));
7839   // In a chain of << with three operands, the second can be broken with no line
7840   // break before it and the third must be broken with a line break before it.
7841   EXPECT_EQ("abcd << \"line line \"\n"
7842             "        \"line\"\n"
7843             "     << \"line line \"\n"
7844             "        \"line\";",
7845             format("abcd << \"line line line\" << \"line line line\";",
7846                    getLLVMStyleWithColumns(20)));
7847   // In a chain of binary operators with two operands, the second can be broken
7848   // with no line break before it.
7849   EXPECT_EQ("abcd + \"line line \"\n"
7850             "       \"line line\";",
7851             format("abcd + \"line line line line\";",
7852                    getLLVMStyleWithColumns(20)));
7853   // In a chain of binary operators with three operands, the second must be
7854   // broken with a line break before it.
7855   EXPECT_EQ("abcd +\n"
7856             "    \"line line \"\n"
7857             "    \"line line\" +\n"
7858             "    e;",
7859             format("abcd + \"line line line line\" + e;",
7860                    getLLVMStyleWithColumns(20)));
7861   // In a function call with two operands, with AlignAfterOpenBracket enabled,
7862   // the first must be broken with a line break before it.
7863   FormatStyle Style = getLLVMStyleWithColumns(25);
7864   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
7865   EXPECT_EQ("someFunction(\n"
7866             "    \"long long long \"\n"
7867             "    \"long\",\n"
7868             "    a);",
7869             format("someFunction(\"long long long long\", a);", Style));
7870 }
7871 
7872 TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
7873   EXPECT_EQ(
7874       "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
7875       "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
7876       "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
7877       format("aaaaaaaaaaa  =  \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
7878              "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
7879              "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
7880 }
7881 
7882 TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
7883   EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
7884             format("f(g(R\"x(raw literal)x\",   a), b);", getGoogleStyle()));
7885   EXPECT_EQ("fffffffffff(g(R\"x(\n"
7886             "multiline raw string literal xxxxxxxxxxxxxx\n"
7887             ")x\",\n"
7888             "              a),\n"
7889             "            b);",
7890             format("fffffffffff(g(R\"x(\n"
7891                    "multiline raw string literal xxxxxxxxxxxxxx\n"
7892                    ")x\", a), b);",
7893                    getGoogleStyleWithColumns(20)));
7894   EXPECT_EQ("fffffffffff(\n"
7895             "    g(R\"x(qqq\n"
7896             "multiline raw string literal xxxxxxxxxxxxxx\n"
7897             ")x\",\n"
7898             "      a),\n"
7899             "    b);",
7900             format("fffffffffff(g(R\"x(qqq\n"
7901                    "multiline raw string literal xxxxxxxxxxxxxx\n"
7902                    ")x\", a), b);",
7903                    getGoogleStyleWithColumns(20)));
7904 
7905   EXPECT_EQ("fffffffffff(R\"x(\n"
7906             "multiline raw string literal xxxxxxxxxxxxxx\n"
7907             ")x\");",
7908             format("fffffffffff(R\"x(\n"
7909                    "multiline raw string literal xxxxxxxxxxxxxx\n"
7910                    ")x\");",
7911                    getGoogleStyleWithColumns(20)));
7912   EXPECT_EQ("fffffffffff(R\"x(\n"
7913             "multiline raw string literal xxxxxxxxxxxxxx\n"
7914             ")x\" + bbbbbb);",
7915             format("fffffffffff(R\"x(\n"
7916                    "multiline raw string literal xxxxxxxxxxxxxx\n"
7917                    ")x\" +   bbbbbb);",
7918                    getGoogleStyleWithColumns(20)));
7919   EXPECT_EQ("fffffffffff(\n"
7920             "    R\"x(\n"
7921             "multiline raw string literal xxxxxxxxxxxxxx\n"
7922             ")x\" +\n"
7923             "    bbbbbb);",
7924             format("fffffffffff(\n"
7925                    " R\"x(\n"
7926                    "multiline raw string literal xxxxxxxxxxxxxx\n"
7927                    ")x\" + bbbbbb);",
7928                    getGoogleStyleWithColumns(20)));
7929 }
7930 
7931 TEST_F(FormatTest, SkipsUnknownStringLiterals) {
7932   verifyFormat("string a = \"unterminated;");
7933   EXPECT_EQ("function(\"unterminated,\n"
7934             "         OtherParameter);",
7935             format("function(  \"unterminated,\n"
7936                    "    OtherParameter);"));
7937 }
7938 
7939 TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
7940   FormatStyle Style = getLLVMStyle();
7941   Style.Standard = FormatStyle::LS_Cpp03;
7942   EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
7943             format("#define x(_a) printf(\"foo\"_a);", Style));
7944 }
7945 
7946 TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
7947 
7948 TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
7949   EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
7950             "             \"ddeeefff\");",
7951             format("someFunction(\"aaabbbcccdddeeefff\");",
7952                    getLLVMStyleWithColumns(25)));
7953   EXPECT_EQ("someFunction1234567890(\n"
7954             "    \"aaabbbcccdddeeefff\");",
7955             format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
7956                    getLLVMStyleWithColumns(26)));
7957   EXPECT_EQ("someFunction1234567890(\n"
7958             "    \"aaabbbcccdddeeeff\"\n"
7959             "    \"f\");",
7960             format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
7961                    getLLVMStyleWithColumns(25)));
7962   EXPECT_EQ("someFunction1234567890(\n"
7963             "    \"aaabbbcccdddeeeff\"\n"
7964             "    \"f\");",
7965             format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
7966                    getLLVMStyleWithColumns(24)));
7967   EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
7968             "             \"ddde \"\n"
7969             "             \"efff\");",
7970             format("someFunction(\"aaabbbcc ddde efff\");",
7971                    getLLVMStyleWithColumns(25)));
7972   EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
7973             "             \"ddeeefff\");",
7974             format("someFunction(\"aaabbbccc ddeeefff\");",
7975                    getLLVMStyleWithColumns(25)));
7976   EXPECT_EQ("someFunction1234567890(\n"
7977             "    \"aaabb \"\n"
7978             "    \"cccdddeeefff\");",
7979             format("someFunction1234567890(\"aaabb cccdddeeefff\");",
7980                    getLLVMStyleWithColumns(25)));
7981   EXPECT_EQ("#define A          \\\n"
7982             "  string s =       \\\n"
7983             "      \"123456789\"  \\\n"
7984             "      \"0\";         \\\n"
7985             "  int i;",
7986             format("#define A string s = \"1234567890\"; int i;",
7987                    getLLVMStyleWithColumns(20)));
7988   // FIXME: Put additional penalties on breaking at non-whitespace locations.
7989   EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
7990             "             \"dddeeeff\"\n"
7991             "             \"f\");",
7992             format("someFunction(\"aaabbbcc dddeeefff\");",
7993                    getLLVMStyleWithColumns(25)));
7994 }
7995 
7996 TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
7997   EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
7998   EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
7999   EXPECT_EQ("\"test\"\n"
8000             "\"\\n\"",
8001             format("\"test\\n\"", getLLVMStyleWithColumns(7)));
8002   EXPECT_EQ("\"tes\\\\\"\n"
8003             "\"n\"",
8004             format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
8005   EXPECT_EQ("\"\\\\\\\\\"\n"
8006             "\"\\n\"",
8007             format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
8008   EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
8009   EXPECT_EQ("\"\\uff01\"\n"
8010             "\"test\"",
8011             format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
8012   EXPECT_EQ("\"\\Uff01ff02\"",
8013             format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
8014   EXPECT_EQ("\"\\x000000000001\"\n"
8015             "\"next\"",
8016             format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
8017   EXPECT_EQ("\"\\x000000000001next\"",
8018             format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
8019   EXPECT_EQ("\"\\x000000000001\"",
8020             format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
8021   EXPECT_EQ("\"test\"\n"
8022             "\"\\000000\"\n"
8023             "\"000001\"",
8024             format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
8025   EXPECT_EQ("\"test\\000\"\n"
8026             "\"00000000\"\n"
8027             "\"1\"",
8028             format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
8029 }
8030 
8031 TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
8032   verifyFormat("void f() {\n"
8033                "  return g() {}\n"
8034                "  void h() {}");
8035   verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
8036                "g();\n"
8037                "}");
8038 }
8039 
8040 TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
8041   verifyFormat(
8042       "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
8043 }
8044 
8045 TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
8046   verifyFormat("class X {\n"
8047                "  void f() {\n"
8048                "  }\n"
8049                "};",
8050                getLLVMStyleWithColumns(12));
8051 }
8052 
8053 TEST_F(FormatTest, ConfigurableIndentWidth) {
8054   FormatStyle EightIndent = getLLVMStyleWithColumns(18);
8055   EightIndent.IndentWidth = 8;
8056   EightIndent.ContinuationIndentWidth = 8;
8057   verifyFormat("void f() {\n"
8058                "        someFunction();\n"
8059                "        if (true) {\n"
8060                "                f();\n"
8061                "        }\n"
8062                "}",
8063                EightIndent);
8064   verifyFormat("class X {\n"
8065                "        void f() {\n"
8066                "        }\n"
8067                "};",
8068                EightIndent);
8069   verifyFormat("int x[] = {\n"
8070                "        call(),\n"
8071                "        call()};",
8072                EightIndent);
8073 }
8074 
8075 TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
8076   verifyFormat("double\n"
8077                "f();",
8078                getLLVMStyleWithColumns(8));
8079 }
8080 
8081 TEST_F(FormatTest, ConfigurableUseOfTab) {
8082   FormatStyle Tab = getLLVMStyleWithColumns(42);
8083   Tab.IndentWidth = 8;
8084   Tab.UseTab = FormatStyle::UT_Always;
8085   Tab.AlignEscapedNewlines = FormatStyle::ENAS_Left;
8086 
8087   EXPECT_EQ("if (aaaaaaaa && // q\n"
8088             "    bb)\t\t// w\n"
8089             "\t;",
8090             format("if (aaaaaaaa &&// q\n"
8091                    "bb)// w\n"
8092                    ";",
8093                    Tab));
8094   EXPECT_EQ("if (aaa && bbb) // w\n"
8095             "\t;",
8096             format("if(aaa&&bbb)// w\n"
8097                    ";",
8098                    Tab));
8099 
8100   verifyFormat("class X {\n"
8101                "\tvoid f() {\n"
8102                "\t\tsomeFunction(parameter1,\n"
8103                "\t\t\t     parameter2);\n"
8104                "\t}\n"
8105                "};",
8106                Tab);
8107   verifyFormat("#define A                        \\\n"
8108                "\tvoid f() {               \\\n"
8109                "\t\tsomeFunction(    \\\n"
8110                "\t\t    parameter1,  \\\n"
8111                "\t\t    parameter2); \\\n"
8112                "\t}",
8113                Tab);
8114 
8115   Tab.TabWidth = 4;
8116   Tab.IndentWidth = 8;
8117   verifyFormat("class TabWidth4Indent8 {\n"
8118                "\t\tvoid f() {\n"
8119                "\t\t\t\tsomeFunction(parameter1,\n"
8120                "\t\t\t\t\t\t\t parameter2);\n"
8121                "\t\t}\n"
8122                "};",
8123                Tab);
8124 
8125   Tab.TabWidth = 4;
8126   Tab.IndentWidth = 4;
8127   verifyFormat("class TabWidth4Indent4 {\n"
8128                "\tvoid f() {\n"
8129                "\t\tsomeFunction(parameter1,\n"
8130                "\t\t\t\t\t parameter2);\n"
8131                "\t}\n"
8132                "};",
8133                Tab);
8134 
8135   Tab.TabWidth = 8;
8136   Tab.IndentWidth = 4;
8137   verifyFormat("class TabWidth8Indent4 {\n"
8138                "    void f() {\n"
8139                "\tsomeFunction(parameter1,\n"
8140                "\t\t     parameter2);\n"
8141                "    }\n"
8142                "};",
8143                Tab);
8144 
8145   Tab.TabWidth = 8;
8146   Tab.IndentWidth = 8;
8147   EXPECT_EQ("/*\n"
8148             "\t      a\t\tcomment\n"
8149             "\t      in multiple lines\n"
8150             "       */",
8151             format("   /*\t \t \n"
8152                    " \t \t a\t\tcomment\t \t\n"
8153                    " \t \t in multiple lines\t\n"
8154                    " \t  */",
8155                    Tab));
8156 
8157   Tab.UseTab = FormatStyle::UT_ForIndentation;
8158   verifyFormat("{\n"
8159                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8160                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8161                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8162                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8163                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8164                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8165                "};",
8166                Tab);
8167   verifyFormat("enum AA {\n"
8168                "\ta1, // Force multiple lines\n"
8169                "\ta2,\n"
8170                "\ta3\n"
8171                "};",
8172                Tab);
8173   EXPECT_EQ("if (aaaaaaaa && // q\n"
8174             "    bb)         // w\n"
8175             "\t;",
8176             format("if (aaaaaaaa &&// q\n"
8177                    "bb)// w\n"
8178                    ";",
8179                    Tab));
8180   verifyFormat("class X {\n"
8181                "\tvoid f() {\n"
8182                "\t\tsomeFunction(parameter1,\n"
8183                "\t\t             parameter2);\n"
8184                "\t}\n"
8185                "};",
8186                Tab);
8187   verifyFormat("{\n"
8188                "\tQ(\n"
8189                "\t    {\n"
8190                "\t\t    int a;\n"
8191                "\t\t    someFunction(aaaaaaaa,\n"
8192                "\t\t                 bbbbbbb);\n"
8193                "\t    },\n"
8194                "\t    p);\n"
8195                "}",
8196                Tab);
8197   EXPECT_EQ("{\n"
8198             "\t/* aaaa\n"
8199             "\t   bbbb */\n"
8200             "}",
8201             format("{\n"
8202                    "/* aaaa\n"
8203                    "   bbbb */\n"
8204                    "}",
8205                    Tab));
8206   EXPECT_EQ("{\n"
8207             "\t/*\n"
8208             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8209             "\t  bbbbbbbbbbbbb\n"
8210             "\t*/\n"
8211             "}",
8212             format("{\n"
8213                    "/*\n"
8214                    "  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8215                    "*/\n"
8216                    "}",
8217                    Tab));
8218   EXPECT_EQ("{\n"
8219             "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8220             "\t// bbbbbbbbbbbbb\n"
8221             "}",
8222             format("{\n"
8223                    "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8224                    "}",
8225                    Tab));
8226   EXPECT_EQ("{\n"
8227             "\t/*\n"
8228             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8229             "\t  bbbbbbbbbbbbb\n"
8230             "\t*/\n"
8231             "}",
8232             format("{\n"
8233                    "\t/*\n"
8234                    "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8235                    "\t*/\n"
8236                    "}",
8237                    Tab));
8238   EXPECT_EQ("{\n"
8239             "\t/*\n"
8240             "\n"
8241             "\t*/\n"
8242             "}",
8243             format("{\n"
8244                    "\t/*\n"
8245                    "\n"
8246                    "\t*/\n"
8247                    "}",
8248                    Tab));
8249   EXPECT_EQ("{\n"
8250             "\t/*\n"
8251             " asdf\n"
8252             "\t*/\n"
8253             "}",
8254             format("{\n"
8255                    "\t/*\n"
8256                    " asdf\n"
8257                    "\t*/\n"
8258                    "}",
8259                    Tab));
8260 
8261   Tab.UseTab = FormatStyle::UT_Never;
8262   EXPECT_EQ("/*\n"
8263             "              a\t\tcomment\n"
8264             "              in multiple lines\n"
8265             "       */",
8266             format("   /*\t \t \n"
8267                    " \t \t a\t\tcomment\t \t\n"
8268                    " \t \t in multiple lines\t\n"
8269                    " \t  */",
8270                    Tab));
8271   EXPECT_EQ("/* some\n"
8272             "   comment */",
8273             format(" \t \t /* some\n"
8274                    " \t \t    comment */",
8275                    Tab));
8276   EXPECT_EQ("int a; /* some\n"
8277             "   comment */",
8278             format(" \t \t int a; /* some\n"
8279                    " \t \t    comment */",
8280                    Tab));
8281 
8282   EXPECT_EQ("int a; /* some\n"
8283             "comment */",
8284             format(" \t \t int\ta; /* some\n"
8285                    " \t \t    comment */",
8286                    Tab));
8287   EXPECT_EQ("f(\"\t\t\"); /* some\n"
8288             "    comment */",
8289             format(" \t \t f(\"\t\t\"); /* some\n"
8290                    " \t \t    comment */",
8291                    Tab));
8292   EXPECT_EQ("{\n"
8293             "  /*\n"
8294             "   * Comment\n"
8295             "   */\n"
8296             "  int i;\n"
8297             "}",
8298             format("{\n"
8299                    "\t/*\n"
8300                    "\t * Comment\n"
8301                    "\t */\n"
8302                    "\t int i;\n"
8303                    "}"));
8304 
8305   Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
8306   Tab.TabWidth = 8;
8307   Tab.IndentWidth = 8;
8308   EXPECT_EQ("if (aaaaaaaa && // q\n"
8309             "    bb)         // w\n"
8310             "\t;",
8311             format("if (aaaaaaaa &&// q\n"
8312                    "bb)// w\n"
8313                    ";",
8314                    Tab));
8315   EXPECT_EQ("if (aaa && bbb) // w\n"
8316             "\t;",
8317             format("if(aaa&&bbb)// w\n"
8318                    ";",
8319                    Tab));
8320   verifyFormat("class X {\n"
8321                "\tvoid f() {\n"
8322                "\t\tsomeFunction(parameter1,\n"
8323                "\t\t\t     parameter2);\n"
8324                "\t}\n"
8325                "};",
8326                Tab);
8327   verifyFormat("#define A                        \\\n"
8328                "\tvoid f() {               \\\n"
8329                "\t\tsomeFunction(    \\\n"
8330                "\t\t    parameter1,  \\\n"
8331                "\t\t    parameter2); \\\n"
8332                "\t}",
8333                Tab);
8334   Tab.TabWidth = 4;
8335   Tab.IndentWidth = 8;
8336   verifyFormat("class TabWidth4Indent8 {\n"
8337                "\t\tvoid f() {\n"
8338                "\t\t\t\tsomeFunction(parameter1,\n"
8339                "\t\t\t\t\t\t\t parameter2);\n"
8340                "\t\t}\n"
8341                "};",
8342                Tab);
8343   Tab.TabWidth = 4;
8344   Tab.IndentWidth = 4;
8345   verifyFormat("class TabWidth4Indent4 {\n"
8346                "\tvoid f() {\n"
8347                "\t\tsomeFunction(parameter1,\n"
8348                "\t\t\t\t\t parameter2);\n"
8349                "\t}\n"
8350                "};",
8351                Tab);
8352   Tab.TabWidth = 8;
8353   Tab.IndentWidth = 4;
8354   verifyFormat("class TabWidth8Indent4 {\n"
8355                "    void f() {\n"
8356                "\tsomeFunction(parameter1,\n"
8357                "\t\t     parameter2);\n"
8358                "    }\n"
8359                "};",
8360                Tab);
8361   Tab.TabWidth = 8;
8362   Tab.IndentWidth = 8;
8363   EXPECT_EQ("/*\n"
8364             "\t      a\t\tcomment\n"
8365             "\t      in multiple lines\n"
8366             "       */",
8367             format("   /*\t \t \n"
8368                    " \t \t a\t\tcomment\t \t\n"
8369                    " \t \t in multiple lines\t\n"
8370                    " \t  */",
8371                    Tab));
8372   verifyFormat("{\n"
8373                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8374                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8375                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8376                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8377                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8378                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
8379                "};",
8380                Tab);
8381   verifyFormat("enum AA {\n"
8382                "\ta1, // Force multiple lines\n"
8383                "\ta2,\n"
8384                "\ta3\n"
8385                "};",
8386                Tab);
8387   EXPECT_EQ("if (aaaaaaaa && // q\n"
8388             "    bb)         // w\n"
8389             "\t;",
8390             format("if (aaaaaaaa &&// q\n"
8391                    "bb)// w\n"
8392                    ";",
8393                    Tab));
8394   verifyFormat("class X {\n"
8395                "\tvoid f() {\n"
8396                "\t\tsomeFunction(parameter1,\n"
8397                "\t\t\t     parameter2);\n"
8398                "\t}\n"
8399                "};",
8400                Tab);
8401   verifyFormat("{\n"
8402                "\tQ(\n"
8403                "\t    {\n"
8404                "\t\t    int a;\n"
8405                "\t\t    someFunction(aaaaaaaa,\n"
8406                "\t\t\t\t bbbbbbb);\n"
8407                "\t    },\n"
8408                "\t    p);\n"
8409                "}",
8410                Tab);
8411   EXPECT_EQ("{\n"
8412             "\t/* aaaa\n"
8413             "\t   bbbb */\n"
8414             "}",
8415             format("{\n"
8416                    "/* aaaa\n"
8417                    "   bbbb */\n"
8418                    "}",
8419                    Tab));
8420   EXPECT_EQ("{\n"
8421             "\t/*\n"
8422             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8423             "\t  bbbbbbbbbbbbb\n"
8424             "\t*/\n"
8425             "}",
8426             format("{\n"
8427                    "/*\n"
8428                    "  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8429                    "*/\n"
8430                    "}",
8431                    Tab));
8432   EXPECT_EQ("{\n"
8433             "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8434             "\t// bbbbbbbbbbbbb\n"
8435             "}",
8436             format("{\n"
8437                    "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8438                    "}",
8439                    Tab));
8440   EXPECT_EQ("{\n"
8441             "\t/*\n"
8442             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
8443             "\t  bbbbbbbbbbbbb\n"
8444             "\t*/\n"
8445             "}",
8446             format("{\n"
8447                    "\t/*\n"
8448                    "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
8449                    "\t*/\n"
8450                    "}",
8451                    Tab));
8452   EXPECT_EQ("{\n"
8453             "\t/*\n"
8454             "\n"
8455             "\t*/\n"
8456             "}",
8457             format("{\n"
8458                    "\t/*\n"
8459                    "\n"
8460                    "\t*/\n"
8461                    "}",
8462                    Tab));
8463   EXPECT_EQ("{\n"
8464             "\t/*\n"
8465             " asdf\n"
8466             "\t*/\n"
8467             "}",
8468             format("{\n"
8469                    "\t/*\n"
8470                    " asdf\n"
8471                    "\t*/\n"
8472                    "}",
8473                    Tab));
8474   EXPECT_EQ("/*\n"
8475             "\t      a\t\tcomment\n"
8476             "\t      in multiple lines\n"
8477             "       */",
8478             format("   /*\t \t \n"
8479                    " \t \t a\t\tcomment\t \t\n"
8480                    " \t \t in multiple lines\t\n"
8481                    " \t  */",
8482                    Tab));
8483   EXPECT_EQ("/* some\n"
8484             "   comment */",
8485             format(" \t \t /* some\n"
8486                    " \t \t    comment */",
8487                    Tab));
8488   EXPECT_EQ("int a; /* some\n"
8489             "   comment */",
8490             format(" \t \t int a; /* some\n"
8491                    " \t \t    comment */",
8492                    Tab));
8493   EXPECT_EQ("int a; /* some\n"
8494             "comment */",
8495             format(" \t \t int\ta; /* some\n"
8496                    " \t \t    comment */",
8497                    Tab));
8498   EXPECT_EQ("f(\"\t\t\"); /* some\n"
8499             "    comment */",
8500             format(" \t \t f(\"\t\t\"); /* some\n"
8501                    " \t \t    comment */",
8502                    Tab));
8503   EXPECT_EQ("{\n"
8504             "  /*\n"
8505             "   * Comment\n"
8506             "   */\n"
8507             "  int i;\n"
8508             "}",
8509             format("{\n"
8510                    "\t/*\n"
8511                    "\t * Comment\n"
8512                    "\t */\n"
8513                    "\t int i;\n"
8514                    "}"));
8515   Tab.AlignConsecutiveAssignments = true;
8516   Tab.AlignConsecutiveDeclarations = true;
8517   Tab.TabWidth = 4;
8518   Tab.IndentWidth = 4;
8519   verifyFormat("class Assign {\n"
8520                "\tvoid f() {\n"
8521                "\t\tint         x      = 123;\n"
8522                "\t\tint         random = 4;\n"
8523                "\t\tstd::string alphabet =\n"
8524                "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
8525                "\t}\n"
8526                "};",
8527                Tab);
8528 }
8529 
8530 TEST_F(FormatTest, CalculatesOriginalColumn) {
8531   EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8532             "q\"; /* some\n"
8533             "       comment */",
8534             format("  \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8535                    "q\"; /* some\n"
8536                    "       comment */",
8537                    getLLVMStyle()));
8538   EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8539             "/* some\n"
8540             "   comment */",
8541             format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
8542                    " /* some\n"
8543                    "    comment */",
8544                    getLLVMStyle()));
8545   EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8546             "qqq\n"
8547             "/* some\n"
8548             "   comment */",
8549             format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8550                    "qqq\n"
8551                    " /* some\n"
8552                    "    comment */",
8553                    getLLVMStyle()));
8554   EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8555             "wwww; /* some\n"
8556             "         comment */",
8557             format("  inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
8558                    "wwww; /* some\n"
8559                    "         comment */",
8560                    getLLVMStyle()));
8561 }
8562 
8563 TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
8564   FormatStyle NoSpace = getLLVMStyle();
8565   NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
8566 
8567   verifyFormat("while(true)\n"
8568                "  continue;",
8569                NoSpace);
8570   verifyFormat("for(;;)\n"
8571                "  continue;",
8572                NoSpace);
8573   verifyFormat("if(true)\n"
8574                "  f();\n"
8575                "else if(true)\n"
8576                "  f();",
8577                NoSpace);
8578   verifyFormat("do {\n"
8579                "  do_something();\n"
8580                "} while(something());",
8581                NoSpace);
8582   verifyFormat("switch(x) {\n"
8583                "default:\n"
8584                "  break;\n"
8585                "}",
8586                NoSpace);
8587   verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
8588   verifyFormat("size_t x = sizeof(x);", NoSpace);
8589   verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
8590   verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
8591   verifyFormat("alignas(128) char a[128];", NoSpace);
8592   verifyFormat("size_t x = alignof(MyType);", NoSpace);
8593   verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
8594   verifyFormat("int f() throw(Deprecated);", NoSpace);
8595   verifyFormat("typedef void (*cb)(int);", NoSpace);
8596   verifyFormat("T A::operator()();", NoSpace);
8597   verifyFormat("X A::operator++(T);", NoSpace);
8598 
8599   FormatStyle Space = getLLVMStyle();
8600   Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
8601 
8602   verifyFormat("int f ();", Space);
8603   verifyFormat("void f (int a, T b) {\n"
8604                "  while (true)\n"
8605                "    continue;\n"
8606                "}",
8607                Space);
8608   verifyFormat("if (true)\n"
8609                "  f ();\n"
8610                "else if (true)\n"
8611                "  f ();",
8612                Space);
8613   verifyFormat("do {\n"
8614                "  do_something ();\n"
8615                "} while (something ());",
8616                Space);
8617   verifyFormat("switch (x) {\n"
8618                "default:\n"
8619                "  break;\n"
8620                "}",
8621                Space);
8622   verifyFormat("A::A () : a (1) {}", Space);
8623   verifyFormat("void f () __attribute__ ((asdf));", Space);
8624   verifyFormat("*(&a + 1);\n"
8625                "&((&a)[1]);\n"
8626                "a[(b + c) * d];\n"
8627                "(((a + 1) * 2) + 3) * 4;",
8628                Space);
8629   verifyFormat("#define A(x) x", Space);
8630   verifyFormat("#define A (x) x", Space);
8631   verifyFormat("#if defined(x)\n"
8632                "#endif",
8633                Space);
8634   verifyFormat("auto i = std::make_unique<int> (5);", Space);
8635   verifyFormat("size_t x = sizeof (x);", Space);
8636   verifyFormat("auto f (int x) -> decltype (x);", Space);
8637   verifyFormat("int f (T x) noexcept (x.create ());", Space);
8638   verifyFormat("alignas (128) char a[128];", Space);
8639   verifyFormat("size_t x = alignof (MyType);", Space);
8640   verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
8641   verifyFormat("int f () throw (Deprecated);", Space);
8642   verifyFormat("typedef void (*cb) (int);", Space);
8643   verifyFormat("T A::operator() ();", Space);
8644   verifyFormat("X A::operator++ (T);", Space);
8645 }
8646 
8647 TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
8648   FormatStyle Spaces = getLLVMStyle();
8649 
8650   Spaces.SpacesInParentheses = true;
8651   verifyFormat("call( x, y, z );", Spaces);
8652   verifyFormat("call();", Spaces);
8653   verifyFormat("std::function<void( int, int )> callback;", Spaces);
8654   verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
8655                Spaces);
8656   verifyFormat("while ( (bool)1 )\n"
8657                "  continue;",
8658                Spaces);
8659   verifyFormat("for ( ;; )\n"
8660                "  continue;",
8661                Spaces);
8662   verifyFormat("if ( true )\n"
8663                "  f();\n"
8664                "else if ( true )\n"
8665                "  f();",
8666                Spaces);
8667   verifyFormat("do {\n"
8668                "  do_something( (int)i );\n"
8669                "} while ( something() );",
8670                Spaces);
8671   verifyFormat("switch ( x ) {\n"
8672                "default:\n"
8673                "  break;\n"
8674                "}",
8675                Spaces);
8676 
8677   Spaces.SpacesInParentheses = false;
8678   Spaces.SpacesInCStyleCastParentheses = true;
8679   verifyFormat("Type *A = ( Type * )P;", Spaces);
8680   verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
8681   verifyFormat("x = ( int32 )y;", Spaces);
8682   verifyFormat("int a = ( int )(2.0f);", Spaces);
8683   verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
8684   verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
8685   verifyFormat("#define x (( int )-1)", Spaces);
8686 
8687   // Run the first set of tests again with:
8688   Spaces.SpacesInParentheses = false;
8689   Spaces.SpaceInEmptyParentheses = true;
8690   Spaces.SpacesInCStyleCastParentheses = true;
8691   verifyFormat("call(x, y, z);", Spaces);
8692   verifyFormat("call( );", Spaces);
8693   verifyFormat("std::function<void(int, int)> callback;", Spaces);
8694   verifyFormat("while (( bool )1)\n"
8695                "  continue;",
8696                Spaces);
8697   verifyFormat("for (;;)\n"
8698                "  continue;",
8699                Spaces);
8700   verifyFormat("if (true)\n"
8701                "  f( );\n"
8702                "else if (true)\n"
8703                "  f( );",
8704                Spaces);
8705   verifyFormat("do {\n"
8706                "  do_something(( int )i);\n"
8707                "} while (something( ));",
8708                Spaces);
8709   verifyFormat("switch (x) {\n"
8710                "default:\n"
8711                "  break;\n"
8712                "}",
8713                Spaces);
8714 
8715   // Run the first set of tests again with:
8716   Spaces.SpaceAfterCStyleCast = true;
8717   verifyFormat("call(x, y, z);", Spaces);
8718   verifyFormat("call( );", Spaces);
8719   verifyFormat("std::function<void(int, int)> callback;", Spaces);
8720   verifyFormat("while (( bool ) 1)\n"
8721                "  continue;",
8722                Spaces);
8723   verifyFormat("for (;;)\n"
8724                "  continue;",
8725                Spaces);
8726   verifyFormat("if (true)\n"
8727                "  f( );\n"
8728                "else if (true)\n"
8729                "  f( );",
8730                Spaces);
8731   verifyFormat("do {\n"
8732                "  do_something(( int ) i);\n"
8733                "} while (something( ));",
8734                Spaces);
8735   verifyFormat("switch (x) {\n"
8736                "default:\n"
8737                "  break;\n"
8738                "}",
8739                Spaces);
8740 
8741   // Run subset of tests again with:
8742   Spaces.SpacesInCStyleCastParentheses = false;
8743   Spaces.SpaceAfterCStyleCast = true;
8744   verifyFormat("while ((bool) 1)\n"
8745                "  continue;",
8746                Spaces);
8747   verifyFormat("do {\n"
8748                "  do_something((int) i);\n"
8749                "} while (something( ));",
8750                Spaces);
8751 }
8752 
8753 TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
8754   verifyFormat("int a[5];");
8755   verifyFormat("a[3] += 42;");
8756 
8757   FormatStyle Spaces = getLLVMStyle();
8758   Spaces.SpacesInSquareBrackets = true;
8759   // Lambdas unchanged.
8760   verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
8761   verifyFormat("return [i, args...] {};", Spaces);
8762 
8763   // Not lambdas.
8764   verifyFormat("int a[ 5 ];", Spaces);
8765   verifyFormat("a[ 3 ] += 42;", Spaces);
8766   verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
8767   verifyFormat("double &operator[](int i) { return 0; }\n"
8768                "int i;",
8769                Spaces);
8770   verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
8771   verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
8772   verifyFormat("int i = (*b)[ a ]->f();", Spaces);
8773 }
8774 
8775 TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
8776   verifyFormat("int a = 5;");
8777   verifyFormat("a += 42;");
8778   verifyFormat("a or_eq 8;");
8779 
8780   FormatStyle Spaces = getLLVMStyle();
8781   Spaces.SpaceBeforeAssignmentOperators = false;
8782   verifyFormat("int a= 5;", Spaces);
8783   verifyFormat("a+= 42;", Spaces);
8784   verifyFormat("a or_eq 8;", Spaces);
8785 }
8786 
8787 TEST_F(FormatTest, AlignConsecutiveAssignments) {
8788   FormatStyle Alignment = getLLVMStyle();
8789   Alignment.AlignConsecutiveAssignments = false;
8790   verifyFormat("int a = 5;\n"
8791                "int oneTwoThree = 123;",
8792                Alignment);
8793   verifyFormat("int a = 5;\n"
8794                "int oneTwoThree = 123;",
8795                Alignment);
8796 
8797   Alignment.AlignConsecutiveAssignments = true;
8798   verifyFormat("int a           = 5;\n"
8799                "int oneTwoThree = 123;",
8800                Alignment);
8801   verifyFormat("int a           = method();\n"
8802                "int oneTwoThree = 133;",
8803                Alignment);
8804   verifyFormat("a &= 5;\n"
8805                "bcd *= 5;\n"
8806                "ghtyf += 5;\n"
8807                "dvfvdb -= 5;\n"
8808                "a /= 5;\n"
8809                "vdsvsv %= 5;\n"
8810                "sfdbddfbdfbb ^= 5;\n"
8811                "dvsdsv |= 5;\n"
8812                "int dsvvdvsdvvv = 123;",
8813                Alignment);
8814   verifyFormat("int i = 1, j = 10;\n"
8815                "something = 2000;",
8816                Alignment);
8817   verifyFormat("something = 2000;\n"
8818                "int i = 1, j = 10;\n",
8819                Alignment);
8820   verifyFormat("something = 2000;\n"
8821                "another   = 911;\n"
8822                "int i = 1, j = 10;\n"
8823                "oneMore = 1;\n"
8824                "i       = 2;",
8825                Alignment);
8826   verifyFormat("int a   = 5;\n"
8827                "int one = 1;\n"
8828                "method();\n"
8829                "int oneTwoThree = 123;\n"
8830                "int oneTwo      = 12;",
8831                Alignment);
8832   verifyFormat("int oneTwoThree = 123;\n"
8833                "int oneTwo      = 12;\n"
8834                "method();\n",
8835                Alignment);
8836   verifyFormat("int oneTwoThree = 123; // comment\n"
8837                "int oneTwo      = 12;  // comment",
8838                Alignment);
8839   EXPECT_EQ("int a = 5;\n"
8840             "\n"
8841             "int oneTwoThree = 123;",
8842             format("int a       = 5;\n"
8843                    "\n"
8844                    "int oneTwoThree= 123;",
8845                    Alignment));
8846   EXPECT_EQ("int a   = 5;\n"
8847             "int one = 1;\n"
8848             "\n"
8849             "int oneTwoThree = 123;",
8850             format("int a = 5;\n"
8851                    "int one = 1;\n"
8852                    "\n"
8853                    "int oneTwoThree = 123;",
8854                    Alignment));
8855   EXPECT_EQ("int a   = 5;\n"
8856             "int one = 1;\n"
8857             "\n"
8858             "int oneTwoThree = 123;\n"
8859             "int oneTwo      = 12;",
8860             format("int a = 5;\n"
8861                    "int one = 1;\n"
8862                    "\n"
8863                    "int oneTwoThree = 123;\n"
8864                    "int oneTwo = 12;",
8865                    Alignment));
8866   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
8867   verifyFormat("#define A \\\n"
8868                "  int aaaa       = 12; \\\n"
8869                "  int b          = 23; \\\n"
8870                "  int ccc        = 234; \\\n"
8871                "  int dddddddddd = 2345;",
8872                Alignment);
8873   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
8874   verifyFormat("#define A               \\\n"
8875                "  int aaaa       = 12;  \\\n"
8876                "  int b          = 23;  \\\n"
8877                "  int ccc        = 234; \\\n"
8878                "  int dddddddddd = 2345;",
8879                Alignment);
8880   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
8881   verifyFormat("#define A                                                      "
8882                "                \\\n"
8883                "  int aaaa       = 12;                                         "
8884                "                \\\n"
8885                "  int b          = 23;                                         "
8886                "                \\\n"
8887                "  int ccc        = 234;                                        "
8888                "                \\\n"
8889                "  int dddddddddd = 2345;",
8890                Alignment);
8891   verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
8892                "k = 4, int l = 5,\n"
8893                "                  int m = 6) {\n"
8894                "  int j      = 10;\n"
8895                "  otherThing = 1;\n"
8896                "}",
8897                Alignment);
8898   verifyFormat("void SomeFunction(int parameter = 0) {\n"
8899                "  int i   = 1;\n"
8900                "  int j   = 2;\n"
8901                "  int big = 10000;\n"
8902                "}",
8903                Alignment);
8904   verifyFormat("class C {\n"
8905                "public:\n"
8906                "  int i            = 1;\n"
8907                "  virtual void f() = 0;\n"
8908                "};",
8909                Alignment);
8910   verifyFormat("int i = 1;\n"
8911                "if (SomeType t = getSomething()) {\n"
8912                "}\n"
8913                "int j   = 2;\n"
8914                "int big = 10000;",
8915                Alignment);
8916   verifyFormat("int j = 7;\n"
8917                "for (int k = 0; k < N; ++k) {\n"
8918                "}\n"
8919                "int j   = 2;\n"
8920                "int big = 10000;\n"
8921                "}",
8922                Alignment);
8923   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
8924   verifyFormat("int i = 1;\n"
8925                "LooooooooooongType loooooooooooooooooooooongVariable\n"
8926                "    = someLooooooooooooooooongFunction();\n"
8927                "int j = 2;",
8928                Alignment);
8929   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
8930   verifyFormat("int i = 1;\n"
8931                "LooooooooooongType loooooooooooooooooooooongVariable =\n"
8932                "    someLooooooooooooooooongFunction();\n"
8933                "int j = 2;",
8934                Alignment);
8935 
8936   verifyFormat("auto lambda = []() {\n"
8937                "  auto i = 0;\n"
8938                "  return 0;\n"
8939                "};\n"
8940                "int i  = 0;\n"
8941                "auto v = type{\n"
8942                "    i = 1,   //\n"
8943                "    (i = 2), //\n"
8944                "    i = 3    //\n"
8945                "};",
8946                Alignment);
8947 
8948   verifyFormat(
8949       "int i      = 1;\n"
8950       "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
8951       "                          loooooooooooooooooooooongParameterB);\n"
8952       "int j      = 2;",
8953       Alignment);
8954 
8955   verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
8956                "          typename B   = very_long_type_name_1,\n"
8957                "          typename T_2 = very_long_type_name_2>\n"
8958                "auto foo() {}\n",
8959                Alignment);
8960   verifyFormat("int a, b = 1;\n"
8961                "int c  = 2;\n"
8962                "int dd = 3;\n",
8963                Alignment);
8964   verifyFormat("int aa       = ((1 > 2) ? 3 : 4);\n"
8965                "float b[1][] = {{3.f}};\n",
8966                Alignment);
8967   verifyFormat("for (int i = 0; i < 1; i++)\n"
8968                "  int x = 1;\n",
8969                Alignment);
8970   verifyFormat("for (i = 0; i < 1; i++)\n"
8971                "  x = 1;\n"
8972                "y = 1;\n",
8973                Alignment);
8974 }
8975 
8976 TEST_F(FormatTest, AlignConsecutiveDeclarations) {
8977   FormatStyle Alignment = getLLVMStyle();
8978   Alignment.AlignConsecutiveDeclarations = false;
8979   verifyFormat("float const a = 5;\n"
8980                "int oneTwoThree = 123;",
8981                Alignment);
8982   verifyFormat("int a = 5;\n"
8983                "float const oneTwoThree = 123;",
8984                Alignment);
8985 
8986   Alignment.AlignConsecutiveDeclarations = true;
8987   verifyFormat("float const a = 5;\n"
8988                "int         oneTwoThree = 123;",
8989                Alignment);
8990   verifyFormat("int         a = method();\n"
8991                "float const oneTwoThree = 133;",
8992                Alignment);
8993   verifyFormat("int i = 1, j = 10;\n"
8994                "something = 2000;",
8995                Alignment);
8996   verifyFormat("something = 2000;\n"
8997                "int i = 1, j = 10;\n",
8998                Alignment);
8999   verifyFormat("float      something = 2000;\n"
9000                "double     another = 911;\n"
9001                "int        i = 1, j = 10;\n"
9002                "const int *oneMore = 1;\n"
9003                "unsigned   i = 2;",
9004                Alignment);
9005   verifyFormat("float a = 5;\n"
9006                "int   one = 1;\n"
9007                "method();\n"
9008                "const double       oneTwoThree = 123;\n"
9009                "const unsigned int oneTwo = 12;",
9010                Alignment);
9011   verifyFormat("int      oneTwoThree{0}; // comment\n"
9012                "unsigned oneTwo;         // comment",
9013                Alignment);
9014   EXPECT_EQ("float const a = 5;\n"
9015             "\n"
9016             "int oneTwoThree = 123;",
9017             format("float const   a = 5;\n"
9018                    "\n"
9019                    "int           oneTwoThree= 123;",
9020                    Alignment));
9021   EXPECT_EQ("float a = 5;\n"
9022             "int   one = 1;\n"
9023             "\n"
9024             "unsigned oneTwoThree = 123;",
9025             format("float    a = 5;\n"
9026                    "int      one = 1;\n"
9027                    "\n"
9028                    "unsigned oneTwoThree = 123;",
9029                    Alignment));
9030   EXPECT_EQ("float a = 5;\n"
9031             "int   one = 1;\n"
9032             "\n"
9033             "unsigned oneTwoThree = 123;\n"
9034             "int      oneTwo = 12;",
9035             format("float    a = 5;\n"
9036                    "int one = 1;\n"
9037                    "\n"
9038                    "unsigned oneTwoThree = 123;\n"
9039                    "int oneTwo = 12;",
9040                    Alignment));
9041   // Function prototype alignment
9042   verifyFormat("int    a();\n"
9043                "double b();",
9044                Alignment);
9045   verifyFormat("int    a(int x);\n"
9046                "double b();",
9047                Alignment);
9048   unsigned OldColumnLimit = Alignment.ColumnLimit;
9049   // We need to set ColumnLimit to zero, in order to stress nested alignments,
9050   // otherwise the function parameters will be re-flowed onto a single line.
9051   Alignment.ColumnLimit = 0;
9052   EXPECT_EQ("int    a(int   x,\n"
9053             "         float y);\n"
9054             "double b(int    x,\n"
9055             "         double y);",
9056             format("int a(int x,\n"
9057                    " float y);\n"
9058                    "double b(int x,\n"
9059                    " double y);",
9060                    Alignment));
9061   // This ensures that function parameters of function declarations are
9062   // correctly indented when their owning functions are indented.
9063   // The failure case here is for 'double y' to not be indented enough.
9064   EXPECT_EQ("double a(int x);\n"
9065             "int    b(int    y,\n"
9066             "         double z);",
9067             format("double a(int x);\n"
9068                    "int b(int y,\n"
9069                    " double z);",
9070                    Alignment));
9071   // Set ColumnLimit low so that we induce wrapping immediately after
9072   // the function name and opening paren.
9073   Alignment.ColumnLimit = 13;
9074   verifyFormat("int function(\n"
9075                "    int  x,\n"
9076                "    bool y);",
9077                Alignment);
9078   Alignment.ColumnLimit = OldColumnLimit;
9079   // Ensure function pointers don't screw up recursive alignment
9080   verifyFormat("int    a(int x, void (*fp)(int y));\n"
9081                "double b();",
9082                Alignment);
9083   Alignment.AlignConsecutiveAssignments = true;
9084   // Ensure recursive alignment is broken by function braces, so that the
9085   // "a = 1" does not align with subsequent assignments inside the function
9086   // body.
9087   verifyFormat("int func(int a = 1) {\n"
9088                "  int b  = 2;\n"
9089                "  int cc = 3;\n"
9090                "}",
9091                Alignment);
9092   verifyFormat("float      something = 2000;\n"
9093                "double     another   = 911;\n"
9094                "int        i = 1, j = 10;\n"
9095                "const int *oneMore = 1;\n"
9096                "unsigned   i       = 2;",
9097                Alignment);
9098   verifyFormat("int      oneTwoThree = {0}; // comment\n"
9099                "unsigned oneTwo      = 0;   // comment",
9100                Alignment);
9101   // Make sure that scope is correctly tracked, in the absence of braces
9102   verifyFormat("for (int i = 0; i < n; i++)\n"
9103                "  j = i;\n"
9104                "double x = 1;\n",
9105                Alignment);
9106   verifyFormat("if (int i = 0)\n"
9107                "  j = i;\n"
9108                "double x = 1;\n",
9109                Alignment);
9110   // Ensure operator[] and operator() are comprehended
9111   verifyFormat("struct test {\n"
9112                "  long long int foo();\n"
9113                "  int           operator[](int a);\n"
9114                "  double        bar();\n"
9115                "};\n",
9116                Alignment);
9117   verifyFormat("struct test {\n"
9118                "  long long int foo();\n"
9119                "  int           operator()(int a);\n"
9120                "  double        bar();\n"
9121                "};\n",
9122                Alignment);
9123   EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
9124             "  int const i   = 1;\n"
9125             "  int *     j   = 2;\n"
9126             "  int       big = 10000;\n"
9127             "\n"
9128             "  unsigned oneTwoThree = 123;\n"
9129             "  int      oneTwo      = 12;\n"
9130             "  method();\n"
9131             "  float k  = 2;\n"
9132             "  int   ll = 10000;\n"
9133             "}",
9134             format("void SomeFunction(int parameter= 0) {\n"
9135                    " int const  i= 1;\n"
9136                    "  int *j=2;\n"
9137                    " int big  =  10000;\n"
9138                    "\n"
9139                    "unsigned oneTwoThree  =123;\n"
9140                    "int oneTwo = 12;\n"
9141                    "  method();\n"
9142                    "float k= 2;\n"
9143                    "int ll=10000;\n"
9144                    "}",
9145                    Alignment));
9146   Alignment.AlignConsecutiveAssignments = false;
9147   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
9148   verifyFormat("#define A \\\n"
9149                "  int       aaaa = 12; \\\n"
9150                "  float     b = 23; \\\n"
9151                "  const int ccc = 234; \\\n"
9152                "  unsigned  dddddddddd = 2345;",
9153                Alignment);
9154   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
9155   verifyFormat("#define A              \\\n"
9156                "  int       aaaa = 12; \\\n"
9157                "  float     b = 23;    \\\n"
9158                "  const int ccc = 234; \\\n"
9159                "  unsigned  dddddddddd = 2345;",
9160                Alignment);
9161   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
9162   Alignment.ColumnLimit = 30;
9163   verifyFormat("#define A                    \\\n"
9164                "  int       aaaa = 12;       \\\n"
9165                "  float     b = 23;          \\\n"
9166                "  const int ccc = 234;       \\\n"
9167                "  int       dddddddddd = 2345;",
9168                Alignment);
9169   Alignment.ColumnLimit = 80;
9170   verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
9171                "k = 4, int l = 5,\n"
9172                "                  int m = 6) {\n"
9173                "  const int j = 10;\n"
9174                "  otherThing = 1;\n"
9175                "}",
9176                Alignment);
9177   verifyFormat("void SomeFunction(int parameter = 0) {\n"
9178                "  int const i = 1;\n"
9179                "  int *     j = 2;\n"
9180                "  int       big = 10000;\n"
9181                "}",
9182                Alignment);
9183   verifyFormat("class C {\n"
9184                "public:\n"
9185                "  int          i = 1;\n"
9186                "  virtual void f() = 0;\n"
9187                "};",
9188                Alignment);
9189   verifyFormat("float i = 1;\n"
9190                "if (SomeType t = getSomething()) {\n"
9191                "}\n"
9192                "const unsigned j = 2;\n"
9193                "int            big = 10000;",
9194                Alignment);
9195   verifyFormat("float j = 7;\n"
9196                "for (int k = 0; k < N; ++k) {\n"
9197                "}\n"
9198                "unsigned j = 2;\n"
9199                "int      big = 10000;\n"
9200                "}",
9201                Alignment);
9202   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
9203   verifyFormat("float              i = 1;\n"
9204                "LooooooooooongType loooooooooooooooooooooongVariable\n"
9205                "    = someLooooooooooooooooongFunction();\n"
9206                "int j = 2;",
9207                Alignment);
9208   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
9209   verifyFormat("int                i = 1;\n"
9210                "LooooooooooongType loooooooooooooooooooooongVariable =\n"
9211                "    someLooooooooooooooooongFunction();\n"
9212                "int j = 2;",
9213                Alignment);
9214 
9215   Alignment.AlignConsecutiveAssignments = true;
9216   verifyFormat("auto lambda = []() {\n"
9217                "  auto  ii = 0;\n"
9218                "  float j  = 0;\n"
9219                "  return 0;\n"
9220                "};\n"
9221                "int   i  = 0;\n"
9222                "float i2 = 0;\n"
9223                "auto  v  = type{\n"
9224                "    i = 1,   //\n"
9225                "    (i = 2), //\n"
9226                "    i = 3    //\n"
9227                "};",
9228                Alignment);
9229   Alignment.AlignConsecutiveAssignments = false;
9230 
9231   verifyFormat(
9232       "int      i = 1;\n"
9233       "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
9234       "                          loooooooooooooooooooooongParameterB);\n"
9235       "int      j = 2;",
9236       Alignment);
9237 
9238   // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
9239   // We expect declarations and assignments to align, as long as it doesn't
9240   // exceed the column limit, starting a new alignment sequence whenever it
9241   // happens.
9242   Alignment.AlignConsecutiveAssignments = true;
9243   Alignment.ColumnLimit = 30;
9244   verifyFormat("float    ii              = 1;\n"
9245                "unsigned j               = 2;\n"
9246                "int someVerylongVariable = 1;\n"
9247                "AnotherLongType  ll = 123456;\n"
9248                "VeryVeryLongType k  = 2;\n"
9249                "int              myvar = 1;",
9250                Alignment);
9251   Alignment.ColumnLimit = 80;
9252   Alignment.AlignConsecutiveAssignments = false;
9253 
9254   verifyFormat(
9255       "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
9256       "          typename LongType, typename B>\n"
9257       "auto foo() {}\n",
9258       Alignment);
9259   verifyFormat("float a, b = 1;\n"
9260                "int   c = 2;\n"
9261                "int   dd = 3;\n",
9262                Alignment);
9263   verifyFormat("int   aa = ((1 > 2) ? 3 : 4);\n"
9264                "float b[1][] = {{3.f}};\n",
9265                Alignment);
9266   Alignment.AlignConsecutiveAssignments = true;
9267   verifyFormat("float a, b = 1;\n"
9268                "int   c  = 2;\n"
9269                "int   dd = 3;\n",
9270                Alignment);
9271   verifyFormat("int   aa     = ((1 > 2) ? 3 : 4);\n"
9272                "float b[1][] = {{3.f}};\n",
9273                Alignment);
9274   Alignment.AlignConsecutiveAssignments = false;
9275 
9276   Alignment.ColumnLimit = 30;
9277   Alignment.BinPackParameters = false;
9278   verifyFormat("void foo(float     a,\n"
9279                "         float     b,\n"
9280                "         int       c,\n"
9281                "         uint32_t *d) {\n"
9282                "  int *  e = 0;\n"
9283                "  float  f = 0;\n"
9284                "  double g = 0;\n"
9285                "}\n"
9286                "void bar(ino_t     a,\n"
9287                "         int       b,\n"
9288                "         uint32_t *c,\n"
9289                "         bool      d) {}\n",
9290                Alignment);
9291   Alignment.BinPackParameters = true;
9292   Alignment.ColumnLimit = 80;
9293 
9294   // Bug 33507
9295   Alignment.PointerAlignment = FormatStyle::PAS_Middle;
9296   verifyFormat(
9297       "auto found = range::find_if(vsProducts, [&](auto * aProduct) {\n"
9298       "  static const Version verVs2017;\n"
9299       "  return true;\n"
9300       "});\n",
9301       Alignment);
9302   Alignment.PointerAlignment = FormatStyle::PAS_Right;
9303 }
9304 
9305 TEST_F(FormatTest, LinuxBraceBreaking) {
9306   FormatStyle LinuxBraceStyle = getLLVMStyle();
9307   LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
9308   verifyFormat("namespace a\n"
9309                "{\n"
9310                "class A\n"
9311                "{\n"
9312                "  void f()\n"
9313                "  {\n"
9314                "    if (true) {\n"
9315                "      a();\n"
9316                "      b();\n"
9317                "    } else {\n"
9318                "      a();\n"
9319                "    }\n"
9320                "  }\n"
9321                "  void g() { return; }\n"
9322                "};\n"
9323                "struct B {\n"
9324                "  int x;\n"
9325                "};\n"
9326                "}\n",
9327                LinuxBraceStyle);
9328   verifyFormat("enum X {\n"
9329                "  Y = 0,\n"
9330                "}\n",
9331                LinuxBraceStyle);
9332   verifyFormat("struct S {\n"
9333                "  int Type;\n"
9334                "  union {\n"
9335                "    int x;\n"
9336                "    double y;\n"
9337                "  } Value;\n"
9338                "  class C\n"
9339                "  {\n"
9340                "    MyFavoriteType Value;\n"
9341                "  } Class;\n"
9342                "}\n",
9343                LinuxBraceStyle);
9344 }
9345 
9346 TEST_F(FormatTest, MozillaBraceBreaking) {
9347   FormatStyle MozillaBraceStyle = getLLVMStyle();
9348   MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
9349   MozillaBraceStyle.FixNamespaceComments = false;
9350   verifyFormat("namespace a {\n"
9351                "class A\n"
9352                "{\n"
9353                "  void f()\n"
9354                "  {\n"
9355                "    if (true) {\n"
9356                "      a();\n"
9357                "      b();\n"
9358                "    }\n"
9359                "  }\n"
9360                "  void g() { return; }\n"
9361                "};\n"
9362                "enum E\n"
9363                "{\n"
9364                "  A,\n"
9365                "  // foo\n"
9366                "  B,\n"
9367                "  C\n"
9368                "};\n"
9369                "struct B\n"
9370                "{\n"
9371                "  int x;\n"
9372                "};\n"
9373                "}\n",
9374                MozillaBraceStyle);
9375   verifyFormat("struct S\n"
9376                "{\n"
9377                "  int Type;\n"
9378                "  union\n"
9379                "  {\n"
9380                "    int x;\n"
9381                "    double y;\n"
9382                "  } Value;\n"
9383                "  class C\n"
9384                "  {\n"
9385                "    MyFavoriteType Value;\n"
9386                "  } Class;\n"
9387                "}\n",
9388                MozillaBraceStyle);
9389 }
9390 
9391 TEST_F(FormatTest, StroustrupBraceBreaking) {
9392   FormatStyle StroustrupBraceStyle = getLLVMStyle();
9393   StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
9394   verifyFormat("namespace a {\n"
9395                "class A {\n"
9396                "  void f()\n"
9397                "  {\n"
9398                "    if (true) {\n"
9399                "      a();\n"
9400                "      b();\n"
9401                "    }\n"
9402                "  }\n"
9403                "  void g() { return; }\n"
9404                "};\n"
9405                "struct B {\n"
9406                "  int x;\n"
9407                "};\n"
9408                "} // namespace a\n",
9409                StroustrupBraceStyle);
9410 
9411   verifyFormat("void foo()\n"
9412                "{\n"
9413                "  if (a) {\n"
9414                "    a();\n"
9415                "  }\n"
9416                "  else {\n"
9417                "    b();\n"
9418                "  }\n"
9419                "}\n",
9420                StroustrupBraceStyle);
9421 
9422   verifyFormat("#ifdef _DEBUG\n"
9423                "int foo(int i = 0)\n"
9424                "#else\n"
9425                "int foo(int i = 5)\n"
9426                "#endif\n"
9427                "{\n"
9428                "  return i;\n"
9429                "}",
9430                StroustrupBraceStyle);
9431 
9432   verifyFormat("void foo() {}\n"
9433                "void bar()\n"
9434                "#ifdef _DEBUG\n"
9435                "{\n"
9436                "  foo();\n"
9437                "}\n"
9438                "#else\n"
9439                "{\n"
9440                "}\n"
9441                "#endif",
9442                StroustrupBraceStyle);
9443 
9444   verifyFormat("void foobar() { int i = 5; }\n"
9445                "#ifdef _DEBUG\n"
9446                "void bar() {}\n"
9447                "#else\n"
9448                "void bar() { foobar(); }\n"
9449                "#endif",
9450                StroustrupBraceStyle);
9451 }
9452 
9453 TEST_F(FormatTest, AllmanBraceBreaking) {
9454   FormatStyle AllmanBraceStyle = getLLVMStyle();
9455   AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
9456   verifyFormat("namespace a\n"
9457                "{\n"
9458                "class A\n"
9459                "{\n"
9460                "  void f()\n"
9461                "  {\n"
9462                "    if (true)\n"
9463                "    {\n"
9464                "      a();\n"
9465                "      b();\n"
9466                "    }\n"
9467                "  }\n"
9468                "  void g() { return; }\n"
9469                "};\n"
9470                "struct B\n"
9471                "{\n"
9472                "  int x;\n"
9473                "};\n"
9474                "}",
9475                AllmanBraceStyle);
9476 
9477   verifyFormat("void f()\n"
9478                "{\n"
9479                "  if (true)\n"
9480                "  {\n"
9481                "    a();\n"
9482                "  }\n"
9483                "  else if (false)\n"
9484                "  {\n"
9485                "    b();\n"
9486                "  }\n"
9487                "  else\n"
9488                "  {\n"
9489                "    c();\n"
9490                "  }\n"
9491                "}\n",
9492                AllmanBraceStyle);
9493 
9494   verifyFormat("void f()\n"
9495                "{\n"
9496                "  for (int i = 0; i < 10; ++i)\n"
9497                "  {\n"
9498                "    a();\n"
9499                "  }\n"
9500                "  while (false)\n"
9501                "  {\n"
9502                "    b();\n"
9503                "  }\n"
9504                "  do\n"
9505                "  {\n"
9506                "    c();\n"
9507                "  } while (false)\n"
9508                "}\n",
9509                AllmanBraceStyle);
9510 
9511   verifyFormat("void f(int a)\n"
9512                "{\n"
9513                "  switch (a)\n"
9514                "  {\n"
9515                "  case 0:\n"
9516                "    break;\n"
9517                "  case 1:\n"
9518                "  {\n"
9519                "    break;\n"
9520                "  }\n"
9521                "  case 2:\n"
9522                "  {\n"
9523                "  }\n"
9524                "  break;\n"
9525                "  default:\n"
9526                "    break;\n"
9527                "  }\n"
9528                "}\n",
9529                AllmanBraceStyle);
9530 
9531   verifyFormat("enum X\n"
9532                "{\n"
9533                "  Y = 0,\n"
9534                "}\n",
9535                AllmanBraceStyle);
9536   verifyFormat("enum X\n"
9537                "{\n"
9538                "  Y = 0\n"
9539                "}\n",
9540                AllmanBraceStyle);
9541 
9542   verifyFormat("@interface BSApplicationController ()\n"
9543                "{\n"
9544                "@private\n"
9545                "  id _extraIvar;\n"
9546                "}\n"
9547                "@end\n",
9548                AllmanBraceStyle);
9549 
9550   verifyFormat("#ifdef _DEBUG\n"
9551                "int foo(int i = 0)\n"
9552                "#else\n"
9553                "int foo(int i = 5)\n"
9554                "#endif\n"
9555                "{\n"
9556                "  return i;\n"
9557                "}",
9558                AllmanBraceStyle);
9559 
9560   verifyFormat("void foo() {}\n"
9561                "void bar()\n"
9562                "#ifdef _DEBUG\n"
9563                "{\n"
9564                "  foo();\n"
9565                "}\n"
9566                "#else\n"
9567                "{\n"
9568                "}\n"
9569                "#endif",
9570                AllmanBraceStyle);
9571 
9572   verifyFormat("void foobar() { int i = 5; }\n"
9573                "#ifdef _DEBUG\n"
9574                "void bar() {}\n"
9575                "#else\n"
9576                "void bar() { foobar(); }\n"
9577                "#endif",
9578                AllmanBraceStyle);
9579 
9580   // This shouldn't affect ObjC blocks..
9581   verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
9582                "  // ...\n"
9583                "  int i;\n"
9584                "}];",
9585                AllmanBraceStyle);
9586   verifyFormat("void (^block)(void) = ^{\n"
9587                "  // ...\n"
9588                "  int i;\n"
9589                "};",
9590                AllmanBraceStyle);
9591   // .. or dict literals.
9592   verifyFormat("void f()\n"
9593                "{\n"
9594                "  // ...\n"
9595                "  [object someMethod:@{@\"a\" : @\"b\"}];\n"
9596                "}",
9597                AllmanBraceStyle);
9598   verifyFormat("void f()\n"
9599                "{\n"
9600                "  // ...\n"
9601                "  [object someMethod:@{a : @\"b\"}];\n"
9602                "}",
9603                AllmanBraceStyle);
9604   verifyFormat("int f()\n"
9605                "{ // comment\n"
9606                "  return 42;\n"
9607                "}",
9608                AllmanBraceStyle);
9609 
9610   AllmanBraceStyle.ColumnLimit = 19;
9611   verifyFormat("void f() { int i; }", AllmanBraceStyle);
9612   AllmanBraceStyle.ColumnLimit = 18;
9613   verifyFormat("void f()\n"
9614                "{\n"
9615                "  int i;\n"
9616                "}",
9617                AllmanBraceStyle);
9618   AllmanBraceStyle.ColumnLimit = 80;
9619 
9620   FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
9621   BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = true;
9622   BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
9623   verifyFormat("void f(bool b)\n"
9624                "{\n"
9625                "  if (b)\n"
9626                "  {\n"
9627                "    return;\n"
9628                "  }\n"
9629                "}\n",
9630                BreakBeforeBraceShortIfs);
9631   verifyFormat("void f(bool b)\n"
9632                "{\n"
9633                "  if constexpr (b)\n"
9634                "  {\n"
9635                "    return;\n"
9636                "  }\n"
9637                "}\n",
9638                BreakBeforeBraceShortIfs);
9639   verifyFormat("void f(bool b)\n"
9640                "{\n"
9641                "  if (b) return;\n"
9642                "}\n",
9643                BreakBeforeBraceShortIfs);
9644   verifyFormat("void f(bool b)\n"
9645                "{\n"
9646                "  if constexpr (b) return;\n"
9647                "}\n",
9648                BreakBeforeBraceShortIfs);
9649   verifyFormat("void f(bool b)\n"
9650                "{\n"
9651                "  while (b)\n"
9652                "  {\n"
9653                "    return;\n"
9654                "  }\n"
9655                "}\n",
9656                BreakBeforeBraceShortIfs);
9657 }
9658 
9659 TEST_F(FormatTest, GNUBraceBreaking) {
9660   FormatStyle GNUBraceStyle = getLLVMStyle();
9661   GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
9662   verifyFormat("namespace a\n"
9663                "{\n"
9664                "class A\n"
9665                "{\n"
9666                "  void f()\n"
9667                "  {\n"
9668                "    int a;\n"
9669                "    {\n"
9670                "      int b;\n"
9671                "    }\n"
9672                "    if (true)\n"
9673                "      {\n"
9674                "        a();\n"
9675                "        b();\n"
9676                "      }\n"
9677                "  }\n"
9678                "  void g() { return; }\n"
9679                "}\n"
9680                "}",
9681                GNUBraceStyle);
9682 
9683   verifyFormat("void f()\n"
9684                "{\n"
9685                "  if (true)\n"
9686                "    {\n"
9687                "      a();\n"
9688                "    }\n"
9689                "  else if (false)\n"
9690                "    {\n"
9691                "      b();\n"
9692                "    }\n"
9693                "  else\n"
9694                "    {\n"
9695                "      c();\n"
9696                "    }\n"
9697                "}\n",
9698                GNUBraceStyle);
9699 
9700   verifyFormat("void f()\n"
9701                "{\n"
9702                "  for (int i = 0; i < 10; ++i)\n"
9703                "    {\n"
9704                "      a();\n"
9705                "    }\n"
9706                "  while (false)\n"
9707                "    {\n"
9708                "      b();\n"
9709                "    }\n"
9710                "  do\n"
9711                "    {\n"
9712                "      c();\n"
9713                "    }\n"
9714                "  while (false);\n"
9715                "}\n",
9716                GNUBraceStyle);
9717 
9718   verifyFormat("void f(int a)\n"
9719                "{\n"
9720                "  switch (a)\n"
9721                "    {\n"
9722                "    case 0:\n"
9723                "      break;\n"
9724                "    case 1:\n"
9725                "      {\n"
9726                "        break;\n"
9727                "      }\n"
9728                "    case 2:\n"
9729                "      {\n"
9730                "      }\n"
9731                "      break;\n"
9732                "    default:\n"
9733                "      break;\n"
9734                "    }\n"
9735                "}\n",
9736                GNUBraceStyle);
9737 
9738   verifyFormat("enum X\n"
9739                "{\n"
9740                "  Y = 0,\n"
9741                "}\n",
9742                GNUBraceStyle);
9743 
9744   verifyFormat("@interface BSApplicationController ()\n"
9745                "{\n"
9746                "@private\n"
9747                "  id _extraIvar;\n"
9748                "}\n"
9749                "@end\n",
9750                GNUBraceStyle);
9751 
9752   verifyFormat("#ifdef _DEBUG\n"
9753                "int foo(int i = 0)\n"
9754                "#else\n"
9755                "int foo(int i = 5)\n"
9756                "#endif\n"
9757                "{\n"
9758                "  return i;\n"
9759                "}",
9760                GNUBraceStyle);
9761 
9762   verifyFormat("void foo() {}\n"
9763                "void bar()\n"
9764                "#ifdef _DEBUG\n"
9765                "{\n"
9766                "  foo();\n"
9767                "}\n"
9768                "#else\n"
9769                "{\n"
9770                "}\n"
9771                "#endif",
9772                GNUBraceStyle);
9773 
9774   verifyFormat("void foobar() { int i = 5; }\n"
9775                "#ifdef _DEBUG\n"
9776                "void bar() {}\n"
9777                "#else\n"
9778                "void bar() { foobar(); }\n"
9779                "#endif",
9780                GNUBraceStyle);
9781 }
9782 
9783 TEST_F(FormatTest, WebKitBraceBreaking) {
9784   FormatStyle WebKitBraceStyle = getLLVMStyle();
9785   WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
9786   WebKitBraceStyle.FixNamespaceComments = false;
9787   verifyFormat("namespace a {\n"
9788                "class A {\n"
9789                "  void f()\n"
9790                "  {\n"
9791                "    if (true) {\n"
9792                "      a();\n"
9793                "      b();\n"
9794                "    }\n"
9795                "  }\n"
9796                "  void g() { return; }\n"
9797                "};\n"
9798                "enum E {\n"
9799                "  A,\n"
9800                "  // foo\n"
9801                "  B,\n"
9802                "  C\n"
9803                "};\n"
9804                "struct B {\n"
9805                "  int x;\n"
9806                "};\n"
9807                "}\n",
9808                WebKitBraceStyle);
9809   verifyFormat("struct S {\n"
9810                "  int Type;\n"
9811                "  union {\n"
9812                "    int x;\n"
9813                "    double y;\n"
9814                "  } Value;\n"
9815                "  class C {\n"
9816                "    MyFavoriteType Value;\n"
9817                "  } Class;\n"
9818                "};\n",
9819                WebKitBraceStyle);
9820 }
9821 
9822 TEST_F(FormatTest, CatchExceptionReferenceBinding) {
9823   verifyFormat("void f() {\n"
9824                "  try {\n"
9825                "  } catch (const Exception &e) {\n"
9826                "  }\n"
9827                "}\n",
9828                getLLVMStyle());
9829 }
9830 
9831 TEST_F(FormatTest, UnderstandsPragmas) {
9832   verifyFormat("#pragma omp reduction(| : var)");
9833   verifyFormat("#pragma omp reduction(+ : var)");
9834 
9835   EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
9836             "(including parentheses).",
9837             format("#pragma    mark   Any non-hyphenated or hyphenated string "
9838                    "(including parentheses)."));
9839 }
9840 
9841 TEST_F(FormatTest, UnderstandPragmaOption) {
9842   verifyFormat("#pragma option -C -A");
9843 
9844   EXPECT_EQ("#pragma option -C -A", format("#pragma    option   -C   -A"));
9845 }
9846 
9847 #define EXPECT_ALL_STYLES_EQUAL(Styles)                                        \
9848   for (size_t i = 1; i < Styles.size(); ++i)                                   \
9849   EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \
9850                                   << " differs from Style #0"
9851 
9852 TEST_F(FormatTest, GetsPredefinedStyleByName) {
9853   SmallVector<FormatStyle, 3> Styles;
9854   Styles.resize(3);
9855 
9856   Styles[0] = getLLVMStyle();
9857   EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
9858   EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
9859   EXPECT_ALL_STYLES_EQUAL(Styles);
9860 
9861   Styles[0] = getGoogleStyle();
9862   EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
9863   EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
9864   EXPECT_ALL_STYLES_EQUAL(Styles);
9865 
9866   Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
9867   EXPECT_TRUE(
9868       getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
9869   EXPECT_TRUE(
9870       getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
9871   EXPECT_ALL_STYLES_EQUAL(Styles);
9872 
9873   Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
9874   EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
9875   EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
9876   EXPECT_ALL_STYLES_EQUAL(Styles);
9877 
9878   Styles[0] = getMozillaStyle();
9879   EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
9880   EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
9881   EXPECT_ALL_STYLES_EQUAL(Styles);
9882 
9883   Styles[0] = getWebKitStyle();
9884   EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
9885   EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
9886   EXPECT_ALL_STYLES_EQUAL(Styles);
9887 
9888   Styles[0] = getGNUStyle();
9889   EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
9890   EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
9891   EXPECT_ALL_STYLES_EQUAL(Styles);
9892 
9893   EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
9894 }
9895 
9896 TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
9897   SmallVector<FormatStyle, 8> Styles;
9898   Styles.resize(2);
9899 
9900   Styles[0] = getGoogleStyle();
9901   Styles[1] = getLLVMStyle();
9902   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
9903   EXPECT_ALL_STYLES_EQUAL(Styles);
9904 
9905   Styles.resize(5);
9906   Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
9907   Styles[1] = getLLVMStyle();
9908   Styles[1].Language = FormatStyle::LK_JavaScript;
9909   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
9910 
9911   Styles[2] = getLLVMStyle();
9912   Styles[2].Language = FormatStyle::LK_JavaScript;
9913   EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
9914                                   "BasedOnStyle: Google",
9915                                   &Styles[2])
9916                    .value());
9917 
9918   Styles[3] = getLLVMStyle();
9919   Styles[3].Language = FormatStyle::LK_JavaScript;
9920   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
9921                                   "Language: JavaScript",
9922                                   &Styles[3])
9923                    .value());
9924 
9925   Styles[4] = getLLVMStyle();
9926   Styles[4].Language = FormatStyle::LK_JavaScript;
9927   EXPECT_EQ(0, parseConfiguration("---\n"
9928                                   "BasedOnStyle: LLVM\n"
9929                                   "IndentWidth: 123\n"
9930                                   "---\n"
9931                                   "BasedOnStyle: Google\n"
9932                                   "Language: JavaScript",
9933                                   &Styles[4])
9934                    .value());
9935   EXPECT_ALL_STYLES_EQUAL(Styles);
9936 }
9937 
9938 #define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME)                             \
9939   Style.FIELD = false;                                                         \
9940   EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value());      \
9941   EXPECT_TRUE(Style.FIELD);                                                    \
9942   EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value());     \
9943   EXPECT_FALSE(Style.FIELD);
9944 
9945 #define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
9946 
9947 #define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME)              \
9948   Style.STRUCT.FIELD = false;                                                  \
9949   EXPECT_EQ(0,                                                                 \
9950             parseConfiguration(#STRUCT ":\n  " CONFIG_NAME ": true", &Style)   \
9951                 .value());                                                     \
9952   EXPECT_TRUE(Style.STRUCT.FIELD);                                             \
9953   EXPECT_EQ(0,                                                                 \
9954             parseConfiguration(#STRUCT ":\n  " CONFIG_NAME ": false", &Style)  \
9955                 .value());                                                     \
9956   EXPECT_FALSE(Style.STRUCT.FIELD);
9957 
9958 #define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD)                                 \
9959   CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
9960 
9961 #define CHECK_PARSE(TEXT, FIELD, VALUE)                                        \
9962   EXPECT_NE(VALUE, Style.FIELD);                                               \
9963   EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value());                      \
9964   EXPECT_EQ(VALUE, Style.FIELD)
9965 
9966 TEST_F(FormatTest, ParsesConfigurationBools) {
9967   FormatStyle Style = {};
9968   Style.Language = FormatStyle::LK_Cpp;
9969   CHECK_PARSE_BOOL(AlignOperands);
9970   CHECK_PARSE_BOOL(AlignTrailingComments);
9971   CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
9972   CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
9973   CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
9974   CHECK_PARSE_BOOL(AllowShortBlocksOnASingleLine);
9975   CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
9976   CHECK_PARSE_BOOL(AllowShortIfStatementsOnASingleLine);
9977   CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
9978   CHECK_PARSE_BOOL(AlwaysBreakTemplateDeclarations);
9979   CHECK_PARSE_BOOL(BinPackArguments);
9980   CHECK_PARSE_BOOL(BinPackParameters);
9981   CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
9982   CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
9983   CHECK_PARSE_BOOL(BreakStringLiterals);
9984   CHECK_PARSE_BOOL(BreakBeforeInheritanceComma)
9985   CHECK_PARSE_BOOL(CompactNamespaces);
9986   CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
9987   CHECK_PARSE_BOOL(DerivePointerAlignment);
9988   CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
9989   CHECK_PARSE_BOOL(DisableFormat);
9990   CHECK_PARSE_BOOL(IndentCaseLabels);
9991   CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
9992   CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
9993   CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
9994   CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
9995   CHECK_PARSE_BOOL(Cpp11BracedListStyle);
9996   CHECK_PARSE_BOOL(ReflowComments);
9997   CHECK_PARSE_BOOL(SortIncludes);
9998   CHECK_PARSE_BOOL(SortUsingDeclarations);
9999   CHECK_PARSE_BOOL(SpacesInParentheses);
10000   CHECK_PARSE_BOOL(SpacesInSquareBrackets);
10001   CHECK_PARSE_BOOL(SpacesInAngles);
10002   CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
10003   CHECK_PARSE_BOOL(SpacesInContainerLiterals);
10004   CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
10005   CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
10006   CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
10007   CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
10008 
10009   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
10010   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement);
10011   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
10012   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
10013   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
10014   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
10015   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
10016   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
10017   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterExternBlock);
10018   CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
10019   CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
10020   CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
10021   CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunction);
10022   CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyRecord);
10023   CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyNamespace);
10024 }
10025 
10026 #undef CHECK_PARSE_BOOL
10027 
10028 TEST_F(FormatTest, ParsesConfiguration) {
10029   FormatStyle Style = {};
10030   Style.Language = FormatStyle::LK_Cpp;
10031   CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
10032   CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
10033               ConstructorInitializerIndentWidth, 1234u);
10034   CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
10035   CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
10036   CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
10037   CHECK_PARSE("PenaltyBreakAssignment: 1234",
10038               PenaltyBreakAssignment, 1234u);
10039   CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
10040               PenaltyBreakBeforeFirstCallParameter, 1234u);
10041   CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
10042   CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
10043               PenaltyReturnTypeOnItsOwnLine, 1234u);
10044   CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
10045               SpacesBeforeTrailingComments, 1234u);
10046   CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
10047   CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
10048   CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
10049 
10050   Style.PointerAlignment = FormatStyle::PAS_Middle;
10051   CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
10052               FormatStyle::PAS_Left);
10053   CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
10054               FormatStyle::PAS_Right);
10055   CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
10056               FormatStyle::PAS_Middle);
10057   // For backward compatibility:
10058   CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
10059               FormatStyle::PAS_Left);
10060   CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
10061               FormatStyle::PAS_Right);
10062   CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
10063               FormatStyle::PAS_Middle);
10064 
10065   Style.Standard = FormatStyle::LS_Auto;
10066   CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
10067   CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11);
10068   CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
10069   CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
10070   CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
10071 
10072   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
10073   CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
10074               BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
10075   CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
10076               FormatStyle::BOS_None);
10077   CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
10078               FormatStyle::BOS_All);
10079   // For backward compatibility:
10080   CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
10081               FormatStyle::BOS_None);
10082   CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
10083               FormatStyle::BOS_All);
10084 
10085   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
10086   CHECK_PARSE("BreakConstructorInitializers: BeforeComma",
10087               BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
10088   CHECK_PARSE("BreakConstructorInitializers: AfterColon",
10089               BreakConstructorInitializers, FormatStyle::BCIS_AfterColon);
10090   CHECK_PARSE("BreakConstructorInitializers: BeforeColon",
10091               BreakConstructorInitializers, FormatStyle::BCIS_BeforeColon);
10092   // For backward compatibility:
10093   CHECK_PARSE("BreakConstructorInitializersBeforeComma: true",
10094               BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
10095 
10096   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10097   CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
10098               FormatStyle::BAS_Align);
10099   CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
10100               FormatStyle::BAS_DontAlign);
10101   CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
10102               FormatStyle::BAS_AlwaysBreak);
10103   // For backward compatibility:
10104   CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
10105               FormatStyle::BAS_DontAlign);
10106   CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
10107               FormatStyle::BAS_Align);
10108 
10109   Style.AlignEscapedNewlines = FormatStyle::ENAS_Left;
10110   CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines,
10111               FormatStyle::ENAS_DontAlign);
10112   CHECK_PARSE("AlignEscapedNewlines: Left", AlignEscapedNewlines,
10113               FormatStyle::ENAS_Left);
10114   CHECK_PARSE("AlignEscapedNewlines: Right", AlignEscapedNewlines,
10115               FormatStyle::ENAS_Right);
10116   // For backward compatibility:
10117   CHECK_PARSE("AlignEscapedNewlinesLeft: true", AlignEscapedNewlines,
10118               FormatStyle::ENAS_Left);
10119   CHECK_PARSE("AlignEscapedNewlinesLeft: false", AlignEscapedNewlines,
10120               FormatStyle::ENAS_Right);
10121 
10122   Style.UseTab = FormatStyle::UT_ForIndentation;
10123   CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
10124   CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
10125   CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
10126   CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
10127               FormatStyle::UT_ForContinuationAndIndentation);
10128   // For backward compatibility:
10129   CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
10130   CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
10131 
10132   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
10133   CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
10134               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10135   CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
10136               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
10137   CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
10138               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
10139   CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
10140               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
10141   // For backward compatibility:
10142   CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
10143               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
10144   CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
10145               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
10146 
10147   Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
10148   CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
10149               FormatStyle::SBPO_Never);
10150   CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
10151               FormatStyle::SBPO_Always);
10152   CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
10153               FormatStyle::SBPO_ControlStatements);
10154   // For backward compatibility:
10155   CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
10156               FormatStyle::SBPO_Never);
10157   CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
10158               FormatStyle::SBPO_ControlStatements);
10159 
10160   Style.ColumnLimit = 123;
10161   FormatStyle BaseStyle = getLLVMStyle();
10162   CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
10163   CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
10164 
10165   Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
10166   CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
10167               FormatStyle::BS_Attach);
10168   CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
10169               FormatStyle::BS_Linux);
10170   CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
10171               FormatStyle::BS_Mozilla);
10172   CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
10173               FormatStyle::BS_Stroustrup);
10174   CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
10175               FormatStyle::BS_Allman);
10176   CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
10177   CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
10178               FormatStyle::BS_WebKit);
10179   CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
10180               FormatStyle::BS_Custom);
10181 
10182   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
10183   CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
10184               FormatStyle::RTBS_None);
10185   CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
10186               FormatStyle::RTBS_All);
10187   CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
10188               AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
10189   CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
10190               AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
10191   CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
10192               AlwaysBreakAfterReturnType,
10193               FormatStyle::RTBS_TopLevelDefinitions);
10194 
10195   Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
10196   CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
10197               AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
10198   CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
10199               AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
10200   CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
10201               AlwaysBreakAfterDefinitionReturnType,
10202               FormatStyle::DRTBS_TopLevel);
10203 
10204   Style.NamespaceIndentation = FormatStyle::NI_All;
10205   CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
10206               FormatStyle::NI_None);
10207   CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
10208               FormatStyle::NI_Inner);
10209   CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
10210               FormatStyle::NI_All);
10211 
10212   // FIXME: This is required because parsing a configuration simply overwrites
10213   // the first N elements of the list instead of resetting it.
10214   Style.ForEachMacros.clear();
10215   std::vector<std::string> BoostForeach;
10216   BoostForeach.push_back("BOOST_FOREACH");
10217   CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
10218   std::vector<std::string> BoostAndQForeach;
10219   BoostAndQForeach.push_back("BOOST_FOREACH");
10220   BoostAndQForeach.push_back("Q_FOREACH");
10221   CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
10222               BoostAndQForeach);
10223 
10224   Style.IncludeCategories.clear();
10225   std::vector<FormatStyle::IncludeCategory> ExpectedCategories = {{"abc/.*", 2},
10226                                                                   {".*", 1}};
10227   CHECK_PARSE("IncludeCategories:\n"
10228               "  - Regex: abc/.*\n"
10229               "    Priority: 2\n"
10230               "  - Regex: .*\n"
10231               "    Priority: 1",
10232               IncludeCategories, ExpectedCategories);
10233   CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeIsMainRegex, "abc$");
10234 }
10235 
10236 TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
10237   FormatStyle Style = {};
10238   Style.Language = FormatStyle::LK_Cpp;
10239   CHECK_PARSE("Language: Cpp\n"
10240               "IndentWidth: 12",
10241               IndentWidth, 12u);
10242   EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
10243                                "IndentWidth: 34",
10244                                &Style),
10245             ParseError::Unsuitable);
10246   EXPECT_EQ(12u, Style.IndentWidth);
10247   CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
10248   EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
10249 
10250   Style.Language = FormatStyle::LK_JavaScript;
10251   CHECK_PARSE("Language: JavaScript\n"
10252               "IndentWidth: 12",
10253               IndentWidth, 12u);
10254   CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
10255   EXPECT_EQ(parseConfiguration("Language: Cpp\n"
10256                                "IndentWidth: 34",
10257                                &Style),
10258             ParseError::Unsuitable);
10259   EXPECT_EQ(23u, Style.IndentWidth);
10260   CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
10261   EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
10262 
10263   CHECK_PARSE("BasedOnStyle: LLVM\n"
10264               "IndentWidth: 67",
10265               IndentWidth, 67u);
10266 
10267   CHECK_PARSE("---\n"
10268               "Language: JavaScript\n"
10269               "IndentWidth: 12\n"
10270               "---\n"
10271               "Language: Cpp\n"
10272               "IndentWidth: 34\n"
10273               "...\n",
10274               IndentWidth, 12u);
10275 
10276   Style.Language = FormatStyle::LK_Cpp;
10277   CHECK_PARSE("---\n"
10278               "Language: JavaScript\n"
10279               "IndentWidth: 12\n"
10280               "---\n"
10281               "Language: Cpp\n"
10282               "IndentWidth: 34\n"
10283               "...\n",
10284               IndentWidth, 34u);
10285   CHECK_PARSE("---\n"
10286               "IndentWidth: 78\n"
10287               "---\n"
10288               "Language: JavaScript\n"
10289               "IndentWidth: 56\n"
10290               "...\n",
10291               IndentWidth, 78u);
10292 
10293   Style.ColumnLimit = 123;
10294   Style.IndentWidth = 234;
10295   Style.BreakBeforeBraces = FormatStyle::BS_Linux;
10296   Style.TabWidth = 345;
10297   EXPECT_FALSE(parseConfiguration("---\n"
10298                                   "IndentWidth: 456\n"
10299                                   "BreakBeforeBraces: Allman\n"
10300                                   "---\n"
10301                                   "Language: JavaScript\n"
10302                                   "IndentWidth: 111\n"
10303                                   "TabWidth: 111\n"
10304                                   "---\n"
10305                                   "Language: Cpp\n"
10306                                   "BreakBeforeBraces: Stroustrup\n"
10307                                   "TabWidth: 789\n"
10308                                   "...\n",
10309                                   &Style));
10310   EXPECT_EQ(123u, Style.ColumnLimit);
10311   EXPECT_EQ(456u, Style.IndentWidth);
10312   EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
10313   EXPECT_EQ(789u, Style.TabWidth);
10314 
10315   EXPECT_EQ(parseConfiguration("---\n"
10316                                "Language: JavaScript\n"
10317                                "IndentWidth: 56\n"
10318                                "---\n"
10319                                "IndentWidth: 78\n"
10320                                "...\n",
10321                                &Style),
10322             ParseError::Error);
10323   EXPECT_EQ(parseConfiguration("---\n"
10324                                "Language: JavaScript\n"
10325                                "IndentWidth: 56\n"
10326                                "---\n"
10327                                "Language: JavaScript\n"
10328                                "IndentWidth: 78\n"
10329                                "...\n",
10330                                &Style),
10331             ParseError::Error);
10332 
10333   EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
10334 }
10335 
10336 #undef CHECK_PARSE
10337 
10338 TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
10339   FormatStyle Style = {};
10340   Style.Language = FormatStyle::LK_JavaScript;
10341   Style.BreakBeforeTernaryOperators = true;
10342   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
10343   EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
10344 
10345   Style.BreakBeforeTernaryOperators = true;
10346   EXPECT_EQ(0, parseConfiguration("---\n"
10347                                   "BasedOnStyle: Google\n"
10348                                   "---\n"
10349                                   "Language: JavaScript\n"
10350                                   "IndentWidth: 76\n"
10351                                   "...\n",
10352                                   &Style)
10353                    .value());
10354   EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
10355   EXPECT_EQ(76u, Style.IndentWidth);
10356   EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
10357 }
10358 
10359 TEST_F(FormatTest, ConfigurationRoundTripTest) {
10360   FormatStyle Style = getLLVMStyle();
10361   std::string YAML = configurationAsText(Style);
10362   FormatStyle ParsedStyle = {};
10363   ParsedStyle.Language = FormatStyle::LK_Cpp;
10364   EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
10365   EXPECT_EQ(Style, ParsedStyle);
10366 }
10367 
10368 TEST_F(FormatTest, WorksFor8bitEncodings) {
10369   EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
10370             "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
10371             "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
10372             "\"\xef\xee\xf0\xf3...\"",
10373             format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
10374                    "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
10375                    "\xef\xee\xf0\xf3...\"",
10376                    getLLVMStyleWithColumns(12)));
10377 }
10378 
10379 TEST_F(FormatTest, HandlesUTF8BOM) {
10380   EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
10381   EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
10382             format("\xef\xbb\xbf#include <iostream>"));
10383   EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
10384             format("\xef\xbb\xbf\n#include <iostream>"));
10385 }
10386 
10387 // FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
10388 #if !defined(_MSC_VER)
10389 
10390 TEST_F(FormatTest, CountsUTF8CharactersProperly) {
10391   verifyFormat("\"Однажды в студёную зимнюю пору...\"",
10392                getLLVMStyleWithColumns(35));
10393   verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
10394                getLLVMStyleWithColumns(31));
10395   verifyFormat("// Однажды в студёную зимнюю пору...",
10396                getLLVMStyleWithColumns(36));
10397   verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
10398   verifyFormat("/* Однажды в студёную зимнюю пору... */",
10399                getLLVMStyleWithColumns(39));
10400   verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
10401                getLLVMStyleWithColumns(35));
10402 }
10403 
10404 TEST_F(FormatTest, SplitsUTF8Strings) {
10405   // Non-printable characters' width is currently considered to be the length in
10406   // bytes in UTF8. The characters can be displayed in very different manner
10407   // (zero-width, single width with a substitution glyph, expanded to their code
10408   // (e.g. "<8d>"), so there's no single correct way to handle them.
10409   EXPECT_EQ("\"aaaaÄ\"\n"
10410             "\"\xc2\x8d\";",
10411             format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
10412   EXPECT_EQ("\"aaaaaaaÄ\"\n"
10413             "\"\xc2\x8d\";",
10414             format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
10415   EXPECT_EQ("\"Однажды, в \"\n"
10416             "\"студёную \"\n"
10417             "\"зимнюю \"\n"
10418             "\"пору,\"",
10419             format("\"Однажды, в студёную зимнюю пору,\"",
10420                    getLLVMStyleWithColumns(13)));
10421   EXPECT_EQ(
10422       "\"一 二 三 \"\n"
10423       "\"四 五六 \"\n"
10424       "\"七 八 九 \"\n"
10425       "\"十\"",
10426       format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
10427   EXPECT_EQ("\"一\t二 \"\n"
10428             "\"\t三 \"\n"
10429             "\"四 五\t六 \"\n"
10430             "\"\t七 \"\n"
10431             "\"八九十\tqq\"",
10432             format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
10433                    getLLVMStyleWithColumns(11)));
10434 
10435   // UTF8 character in an escape sequence.
10436   EXPECT_EQ("\"aaaaaa\"\n"
10437             "\"\\\xC2\x8D\"",
10438             format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
10439 }
10440 
10441 TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
10442   EXPECT_EQ("const char *sssss =\n"
10443             "    \"一二三四五六七八\\\n"
10444             " 九 十\";",
10445             format("const char *sssss = \"一二三四五六七八\\\n"
10446                    " 九 十\";",
10447                    getLLVMStyleWithColumns(30)));
10448 }
10449 
10450 TEST_F(FormatTest, SplitsUTF8LineComments) {
10451   EXPECT_EQ("// aaaaÄ\xc2\x8d",
10452             format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
10453   EXPECT_EQ("// Я из лесу\n"
10454             "// вышел; был\n"
10455             "// сильный\n"
10456             "// мороз.",
10457             format("// Я из лесу вышел; был сильный мороз.",
10458                    getLLVMStyleWithColumns(13)));
10459   EXPECT_EQ("// 一二三\n"
10460             "// 四五六七\n"
10461             "// 八  九\n"
10462             "// 十",
10463             format("// 一二三 四五六七 八  九 十", getLLVMStyleWithColumns(9)));
10464 }
10465 
10466 TEST_F(FormatTest, SplitsUTF8BlockComments) {
10467   EXPECT_EQ("/* Гляжу,\n"
10468             " * поднимается\n"
10469             " * медленно в\n"
10470             " * гору\n"
10471             " * Лошадка,\n"
10472             " * везущая\n"
10473             " * хворосту\n"
10474             " * воз. */",
10475             format("/* Гляжу, поднимается медленно в гору\n"
10476                    " * Лошадка, везущая хворосту воз. */",
10477                    getLLVMStyleWithColumns(13)));
10478   EXPECT_EQ(
10479       "/* 一二三\n"
10480       " * 四五六七\n"
10481       " * 八  九\n"
10482       " * 十  */",
10483       format("/* 一二三 四五六七 八  九 十  */", getLLVMStyleWithColumns(9)));
10484   EXPECT_EQ("/* �������� ��������\n"
10485             " * ��������\n"
10486             " * ������-�� */",
10487             format("/* �������� �������� �������� ������-�� */", getLLVMStyleWithColumns(12)));
10488 }
10489 
10490 #endif // _MSC_VER
10491 
10492 TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
10493   FormatStyle Style = getLLVMStyle();
10494 
10495   Style.ConstructorInitializerIndentWidth = 4;
10496   verifyFormat(
10497       "SomeClass::Constructor()\n"
10498       "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10499       "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10500       Style);
10501 
10502   Style.ConstructorInitializerIndentWidth = 2;
10503   verifyFormat(
10504       "SomeClass::Constructor()\n"
10505       "  : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10506       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10507       Style);
10508 
10509   Style.ConstructorInitializerIndentWidth = 0;
10510   verifyFormat(
10511       "SomeClass::Constructor()\n"
10512       ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
10513       "  aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
10514       Style);
10515   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
10516   verifyFormat(
10517       "SomeLongTemplateVariableName<\n"
10518       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
10519       Style);
10520   verifyFormat(
10521       "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
10522       "                       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
10523       Style);
10524 }
10525 
10526 TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
10527   FormatStyle Style = getLLVMStyle();
10528   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
10529   Style.ConstructorInitializerIndentWidth = 4;
10530   verifyFormat("SomeClass::Constructor()\n"
10531                "    : a(a)\n"
10532                "    , b(b)\n"
10533                "    , c(c) {}",
10534                Style);
10535   verifyFormat("SomeClass::Constructor()\n"
10536                "    : a(a) {}",
10537                Style);
10538 
10539   Style.ColumnLimit = 0;
10540   verifyFormat("SomeClass::Constructor()\n"
10541                "    : a(a) {}",
10542                Style);
10543   verifyFormat("SomeClass::Constructor() noexcept\n"
10544                "    : a(a) {}",
10545                Style);
10546   verifyFormat("SomeClass::Constructor()\n"
10547                "    : a(a)\n"
10548                "    , b(b)\n"
10549                "    , c(c) {}",
10550                Style);
10551   verifyFormat("SomeClass::Constructor()\n"
10552                "    : a(a) {\n"
10553                "  foo();\n"
10554                "  bar();\n"
10555                "}",
10556                Style);
10557 
10558   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
10559   verifyFormat("SomeClass::Constructor()\n"
10560                "    : a(a)\n"
10561                "    , b(b)\n"
10562                "    , c(c) {\n}",
10563                Style);
10564   verifyFormat("SomeClass::Constructor()\n"
10565                "    : a(a) {\n}",
10566                Style);
10567 
10568   Style.ColumnLimit = 80;
10569   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
10570   Style.ConstructorInitializerIndentWidth = 2;
10571   verifyFormat("SomeClass::Constructor()\n"
10572                "  : a(a)\n"
10573                "  , b(b)\n"
10574                "  , c(c) {}",
10575                Style);
10576 
10577   Style.ConstructorInitializerIndentWidth = 0;
10578   verifyFormat("SomeClass::Constructor()\n"
10579                ": a(a)\n"
10580                ", b(b)\n"
10581                ", c(c) {}",
10582                Style);
10583 
10584   Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
10585   Style.ConstructorInitializerIndentWidth = 4;
10586   verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
10587   verifyFormat(
10588       "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
10589       Style);
10590   verifyFormat(
10591       "SomeClass::Constructor()\n"
10592       "    : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
10593       Style);
10594   Style.ConstructorInitializerIndentWidth = 4;
10595   Style.ColumnLimit = 60;
10596   verifyFormat("SomeClass::Constructor()\n"
10597                "    : aaaaaaaa(aaaaaaaa)\n"
10598                "    , aaaaaaaa(aaaaaaaa)\n"
10599                "    , aaaaaaaa(aaaaaaaa) {}",
10600                Style);
10601 }
10602 
10603 TEST_F(FormatTest, Destructors) {
10604   verifyFormat("void F(int &i) { i.~int(); }");
10605   verifyFormat("void F(int &i) { i->~int(); }");
10606 }
10607 
10608 TEST_F(FormatTest, FormatsWithWebKitStyle) {
10609   FormatStyle Style = getWebKitStyle();
10610 
10611   // Don't indent in outer namespaces.
10612   verifyFormat("namespace outer {\n"
10613                "int i;\n"
10614                "namespace inner {\n"
10615                "    int i;\n"
10616                "} // namespace inner\n"
10617                "} // namespace outer\n"
10618                "namespace other_outer {\n"
10619                "int i;\n"
10620                "}",
10621                Style);
10622 
10623   // Don't indent case labels.
10624   verifyFormat("switch (variable) {\n"
10625                "case 1:\n"
10626                "case 2:\n"
10627                "    doSomething();\n"
10628                "    break;\n"
10629                "default:\n"
10630                "    ++variable;\n"
10631                "}",
10632                Style);
10633 
10634   // Wrap before binary operators.
10635   EXPECT_EQ("void f()\n"
10636             "{\n"
10637             "    if (aaaaaaaaaaaaaaaa\n"
10638             "        && bbbbbbbbbbbbbbbbbbbbbbbb\n"
10639             "        && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
10640             "        return;\n"
10641             "}",
10642             format("void f() {\n"
10643                    "if (aaaaaaaaaaaaaaaa\n"
10644                    "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
10645                    "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
10646                    "return;\n"
10647                    "}",
10648                    Style));
10649 
10650   // Allow functions on a single line.
10651   verifyFormat("void f() { return; }", Style);
10652 
10653   // Constructor initializers are formatted one per line with the "," on the
10654   // new line.
10655   verifyFormat("Constructor()\n"
10656                "    : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
10657                "    , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
10658                "          aaaaaaaaaaaaaa)\n"
10659                "    , aaaaaaaaaaaaaaaaaaaaaaa()\n"
10660                "{\n"
10661                "}",
10662                Style);
10663   verifyFormat("SomeClass::Constructor()\n"
10664                "    : a(a)\n"
10665                "{\n"
10666                "}",
10667                Style);
10668   EXPECT_EQ("SomeClass::Constructor()\n"
10669             "    : a(a)\n"
10670             "{\n"
10671             "}",
10672             format("SomeClass::Constructor():a(a){}", Style));
10673   verifyFormat("SomeClass::Constructor()\n"
10674                "    : a(a)\n"
10675                "    , b(b)\n"
10676                "    , c(c)\n"
10677                "{\n"
10678                "}",
10679                Style);
10680   verifyFormat("SomeClass::Constructor()\n"
10681                "    : a(a)\n"
10682                "{\n"
10683                "    foo();\n"
10684                "    bar();\n"
10685                "}",
10686                Style);
10687 
10688   // Access specifiers should be aligned left.
10689   verifyFormat("class C {\n"
10690                "public:\n"
10691                "    int i;\n"
10692                "};",
10693                Style);
10694 
10695   // Do not align comments.
10696   verifyFormat("int a; // Do not\n"
10697                "double b; // align comments.",
10698                Style);
10699 
10700   // Do not align operands.
10701   EXPECT_EQ("ASSERT(aaaa\n"
10702             "    || bbbb);",
10703             format("ASSERT ( aaaa\n||bbbb);", Style));
10704 
10705   // Accept input's line breaks.
10706   EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
10707             "    || bbbbbbbbbbbbbbb) {\n"
10708             "    i++;\n"
10709             "}",
10710             format("if (aaaaaaaaaaaaaaa\n"
10711                    "|| bbbbbbbbbbbbbbb) { i++; }",
10712                    Style));
10713   EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
10714             "    i++;\n"
10715             "}",
10716             format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
10717 
10718   // Don't automatically break all macro definitions (llvm.org/PR17842).
10719   verifyFormat("#define aNumber 10", Style);
10720   // However, generally keep the line breaks that the user authored.
10721   EXPECT_EQ("#define aNumber \\\n"
10722             "    10",
10723             format("#define aNumber \\\n"
10724                    " 10",
10725                    Style));
10726 
10727   // Keep empty and one-element array literals on a single line.
10728   EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
10729             "                                  copyItems:YES];",
10730             format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
10731                    "copyItems:YES];",
10732                    Style));
10733   EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
10734             "                                  copyItems:YES];",
10735             format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
10736                    "             copyItems:YES];",
10737                    Style));
10738   // FIXME: This does not seem right, there should be more indentation before
10739   // the array literal's entries. Nested blocks have the same problem.
10740   EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
10741             "    @\"a\",\n"
10742             "    @\"a\"\n"
10743             "]\n"
10744             "                                  copyItems:YES];",
10745             format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
10746                    "     @\"a\",\n"
10747                    "     @\"a\"\n"
10748                    "     ]\n"
10749                    "       copyItems:YES];",
10750                    Style));
10751   EXPECT_EQ(
10752       "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
10753       "                                  copyItems:YES];",
10754       format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
10755              "   copyItems:YES];",
10756              Style));
10757 
10758   verifyFormat("[self.a b:c c:d];", Style);
10759   EXPECT_EQ("[self.a b:c\n"
10760             "        c:d];",
10761             format("[self.a b:c\n"
10762                    "c:d];",
10763                    Style));
10764 }
10765 
10766 TEST_F(FormatTest, FormatsLambdas) {
10767   verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
10768   verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
10769   verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
10770   verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
10771   verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
10772   verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
10773   verifyFormat("auto c = [a = [b = 42] {}] {};\n");
10774   verifyFormat("auto c = [a = &i + 10, b = [] {}] {};\n");
10775   verifyFormat("int x = f(*+[] {});");
10776   verifyFormat("void f() {\n"
10777                "  other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
10778                "}\n");
10779   verifyFormat("void f() {\n"
10780                "  other(x.begin(), //\n"
10781                "        x.end(),   //\n"
10782                "        [&](int, int) { return 1; });\n"
10783                "}\n");
10784   verifyFormat("SomeFunction([]() { // A cool function...\n"
10785                "  return 43;\n"
10786                "});");
10787   EXPECT_EQ("SomeFunction([]() {\n"
10788             "#define A a\n"
10789             "  return 43;\n"
10790             "});",
10791             format("SomeFunction([](){\n"
10792                    "#define A a\n"
10793                    "return 43;\n"
10794                    "});"));
10795   verifyFormat("void f() {\n"
10796                "  SomeFunction([](decltype(x), A *a) {});\n"
10797                "}");
10798   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
10799                "    [](const aaaaaaaaaa &a) { return a; });");
10800   verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
10801                "  SomeOtherFunctioooooooooooooooooooooooooon();\n"
10802                "});");
10803   verifyFormat("Constructor()\n"
10804                "    : Field([] { // comment\n"
10805                "        int i;\n"
10806                "      }) {}");
10807   verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
10808                "  return some_parameter.size();\n"
10809                "};");
10810   verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
10811                "    [](const string &s) { return s; };");
10812   verifyFormat("int i = aaaaaa ? 1 //\n"
10813                "               : [] {\n"
10814                "                   return 2; //\n"
10815                "                 }();");
10816   verifyFormat("llvm::errs() << \"number of twos is \"\n"
10817                "             << std::count_if(v.begin(), v.end(), [](int x) {\n"
10818                "                  return x == 2; // force break\n"
10819                "                });");
10820   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
10821                "    [=](int iiiiiiiiiiii) {\n"
10822                "      return aaaaaaaaaaaaaaaaaaaaaaa !=\n"
10823                "             aaaaaaaaaaaaaaaaaaaaaaa;\n"
10824                "    });",
10825                getLLVMStyleWithColumns(60));
10826   verifyFormat("SomeFunction({[&] {\n"
10827                "                // comment\n"
10828                "              },\n"
10829                "              [&] {\n"
10830                "                // comment\n"
10831                "              }});");
10832   verifyFormat("SomeFunction({[&] {\n"
10833                "  // comment\n"
10834                "}});");
10835   verifyFormat("virtual aaaaaaaaaaaaaaaa(std::function<bool()> bbbbbbbbbbbb =\n"
10836                "                             [&]() { return true; },\n"
10837                "                         aaaaa aaaaaaaaa);");
10838 
10839   // Lambdas with return types.
10840   verifyFormat("int c = []() -> int { return 2; }();\n");
10841   verifyFormat("int c = []() -> int * { return 2; }();\n");
10842   verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
10843   verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
10844   verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
10845   verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
10846   verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
10847   verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
10848   verifyFormat("[a, a]() -> a<1> {};");
10849   verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
10850                "                   int j) -> int {\n"
10851                "  return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
10852                "};");
10853   verifyFormat(
10854       "aaaaaaaaaaaaaaaaaaaaaa(\n"
10855       "    [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
10856       "      return aaaaaaaaaaaaaaaaa;\n"
10857       "    });",
10858       getLLVMStyleWithColumns(70));
10859   verifyFormat("[]() //\n"
10860                "    -> int {\n"
10861                "  return 1; //\n"
10862                "};");
10863 
10864   // Multiple lambdas in the same parentheses change indentation rules.
10865   verifyFormat("SomeFunction(\n"
10866                "    []() {\n"
10867                "      int i = 42;\n"
10868                "      return i;\n"
10869                "    },\n"
10870                "    []() {\n"
10871                "      int j = 43;\n"
10872                "      return j;\n"
10873                "    });");
10874 
10875   // More complex introducers.
10876   verifyFormat("return [i, args...] {};");
10877 
10878   // Not lambdas.
10879   verifyFormat("constexpr char hello[]{\"hello\"};");
10880   verifyFormat("double &operator[](int i) { return 0; }\n"
10881                "int i;");
10882   verifyFormat("std::unique_ptr<int[]> foo() {}");
10883   verifyFormat("int i = a[a][a]->f();");
10884   verifyFormat("int i = (*b)[a]->f();");
10885 
10886   // Other corner cases.
10887   verifyFormat("void f() {\n"
10888                "  bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
10889                "  );\n"
10890                "}");
10891 
10892   // Lambdas created through weird macros.
10893   verifyFormat("void f() {\n"
10894                "  MACRO((const AA &a) { return 1; });\n"
10895                "  MACRO((AA &a) { return 1; });\n"
10896                "}");
10897 
10898   verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
10899                "      doo_dah();\n"
10900                "      doo_dah();\n"
10901                "    })) {\n"
10902                "}");
10903   verifyFormat("if constexpr (blah_blah(whatever, whatever, [] {\n"
10904                "                doo_dah();\n"
10905                "                doo_dah();\n"
10906                "              })) {\n"
10907                "}");
10908   verifyFormat("auto lambda = []() {\n"
10909                "  int a = 2\n"
10910                "#if A\n"
10911                "          + 2\n"
10912                "#endif\n"
10913                "      ;\n"
10914                "};");
10915 
10916   // Lambdas with complex multiline introducers.
10917   verifyFormat(
10918       "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
10919       "    [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n"
10920       "        -> ::std::unordered_set<\n"
10921       "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n"
10922       "      //\n"
10923       "    });");
10924 }
10925 
10926 TEST_F(FormatTest, FormatsBlocks) {
10927   FormatStyle ShortBlocks = getLLVMStyle();
10928   ShortBlocks.AllowShortBlocksOnASingleLine = true;
10929   verifyFormat("int (^Block)(int, int);", ShortBlocks);
10930   verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
10931   verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
10932   verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
10933   verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
10934   verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
10935 
10936   verifyFormat("foo(^{ bar(); });", ShortBlocks);
10937   verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
10938   verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
10939 
10940   verifyFormat("[operation setCompletionBlock:^{\n"
10941                "  [self onOperationDone];\n"
10942                "}];");
10943   verifyFormat("int i = {[operation setCompletionBlock:^{\n"
10944                "  [self onOperationDone];\n"
10945                "}]};");
10946   verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
10947                "  f();\n"
10948                "}];");
10949   verifyFormat("int a = [operation block:^int(int *i) {\n"
10950                "  return 1;\n"
10951                "}];");
10952   verifyFormat("[myObject doSomethingWith:arg1\n"
10953                "                      aaa:^int(int *a) {\n"
10954                "                        return 1;\n"
10955                "                      }\n"
10956                "                      bbb:f(a * bbbbbbbb)];");
10957 
10958   verifyFormat("[operation setCompletionBlock:^{\n"
10959                "  [self.delegate newDataAvailable];\n"
10960                "}];",
10961                getLLVMStyleWithColumns(60));
10962   verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
10963                "  NSString *path = [self sessionFilePath];\n"
10964                "  if (path) {\n"
10965                "    // ...\n"
10966                "  }\n"
10967                "});");
10968   verifyFormat("[[SessionService sharedService]\n"
10969                "    loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
10970                "      if (window) {\n"
10971                "        [self windowDidLoad:window];\n"
10972                "      } else {\n"
10973                "        [self errorLoadingWindow];\n"
10974                "      }\n"
10975                "    }];");
10976   verifyFormat("void (^largeBlock)(void) = ^{\n"
10977                "  // ...\n"
10978                "};\n",
10979                getLLVMStyleWithColumns(40));
10980   verifyFormat("[[SessionService sharedService]\n"
10981                "    loadWindowWithCompletionBlock: //\n"
10982                "        ^(SessionWindow *window) {\n"
10983                "          if (window) {\n"
10984                "            [self windowDidLoad:window];\n"
10985                "          } else {\n"
10986                "            [self errorLoadingWindow];\n"
10987                "          }\n"
10988                "        }];",
10989                getLLVMStyleWithColumns(60));
10990   verifyFormat("[myObject doSomethingWith:arg1\n"
10991                "    firstBlock:^(Foo *a) {\n"
10992                "      // ...\n"
10993                "      int i;\n"
10994                "    }\n"
10995                "    secondBlock:^(Bar *b) {\n"
10996                "      // ...\n"
10997                "      int i;\n"
10998                "    }\n"
10999                "    thirdBlock:^Foo(Bar *b) {\n"
11000                "      // ...\n"
11001                "      int i;\n"
11002                "    }];");
11003   verifyFormat("[myObject doSomethingWith:arg1\n"
11004                "               firstBlock:-1\n"
11005                "              secondBlock:^(Bar *b) {\n"
11006                "                // ...\n"
11007                "                int i;\n"
11008                "              }];");
11009 
11010   verifyFormat("f(^{\n"
11011                "  @autoreleasepool {\n"
11012                "    if (a) {\n"
11013                "      g();\n"
11014                "    }\n"
11015                "  }\n"
11016                "});");
11017   verifyFormat("Block b = ^int *(A *a, B *b) {}");
11018   verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
11019                "};");
11020 
11021   FormatStyle FourIndent = getLLVMStyle();
11022   FourIndent.ObjCBlockIndentWidth = 4;
11023   verifyFormat("[operation setCompletionBlock:^{\n"
11024                "    [self onOperationDone];\n"
11025                "}];",
11026                FourIndent);
11027 }
11028 
11029 TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
11030   FormatStyle ZeroColumn = getLLVMStyle();
11031   ZeroColumn.ColumnLimit = 0;
11032 
11033   verifyFormat("[[SessionService sharedService] "
11034                "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11035                "  if (window) {\n"
11036                "    [self windowDidLoad:window];\n"
11037                "  } else {\n"
11038                "    [self errorLoadingWindow];\n"
11039                "  }\n"
11040                "}];",
11041                ZeroColumn);
11042   EXPECT_EQ("[[SessionService sharedService]\n"
11043             "    loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11044             "      if (window) {\n"
11045             "        [self windowDidLoad:window];\n"
11046             "      } else {\n"
11047             "        [self errorLoadingWindow];\n"
11048             "      }\n"
11049             "    }];",
11050             format("[[SessionService sharedService]\n"
11051                    "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
11052                    "                if (window) {\n"
11053                    "    [self windowDidLoad:window];\n"
11054                    "  } else {\n"
11055                    "    [self errorLoadingWindow];\n"
11056                    "  }\n"
11057                    "}];",
11058                    ZeroColumn));
11059   verifyFormat("[myObject doSomethingWith:arg1\n"
11060                "    firstBlock:^(Foo *a) {\n"
11061                "      // ...\n"
11062                "      int i;\n"
11063                "    }\n"
11064                "    secondBlock:^(Bar *b) {\n"
11065                "      // ...\n"
11066                "      int i;\n"
11067                "    }\n"
11068                "    thirdBlock:^Foo(Bar *b) {\n"
11069                "      // ...\n"
11070                "      int i;\n"
11071                "    }];",
11072                ZeroColumn);
11073   verifyFormat("f(^{\n"
11074                "  @autoreleasepool {\n"
11075                "    if (a) {\n"
11076                "      g();\n"
11077                "    }\n"
11078                "  }\n"
11079                "});",
11080                ZeroColumn);
11081   verifyFormat("void (^largeBlock)(void) = ^{\n"
11082                "  // ...\n"
11083                "};",
11084                ZeroColumn);
11085 
11086   ZeroColumn.AllowShortBlocksOnASingleLine = true;
11087   EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
11088             format("void   (^largeBlock)(void) = ^{ int   i; };", ZeroColumn));
11089   ZeroColumn.AllowShortBlocksOnASingleLine = false;
11090   EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
11091             "  int i;\n"
11092             "};",
11093             format("void   (^largeBlock)(void) = ^{ int   i; };", ZeroColumn));
11094 }
11095 
11096 TEST_F(FormatTest, SupportsCRLF) {
11097   EXPECT_EQ("int a;\r\n"
11098             "int b;\r\n"
11099             "int c;\r\n",
11100             format("int a;\r\n"
11101                    "  int b;\r\n"
11102                    "    int c;\r\n",
11103                    getLLVMStyle()));
11104   EXPECT_EQ("int a;\r\n"
11105             "int b;\r\n"
11106             "int c;\r\n",
11107             format("int a;\r\n"
11108                    "  int b;\n"
11109                    "    int c;\r\n",
11110                    getLLVMStyle()));
11111   EXPECT_EQ("int a;\n"
11112             "int b;\n"
11113             "int c;\n",
11114             format("int a;\r\n"
11115                    "  int b;\n"
11116                    "    int c;\n",
11117                    getLLVMStyle()));
11118   EXPECT_EQ("\"aaaaaaa \"\r\n"
11119             "\"bbbbbbb\";\r\n",
11120             format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
11121   EXPECT_EQ("#define A \\\r\n"
11122             "  b;      \\\r\n"
11123             "  c;      \\\r\n"
11124             "  d;\r\n",
11125             format("#define A \\\r\n"
11126                    "  b; \\\r\n"
11127                    "  c; d; \r\n",
11128                    getGoogleStyle()));
11129 
11130   EXPECT_EQ("/*\r\n"
11131             "multi line block comments\r\n"
11132             "should not introduce\r\n"
11133             "an extra carriage return\r\n"
11134             "*/\r\n",
11135             format("/*\r\n"
11136                    "multi line block comments\r\n"
11137                    "should not introduce\r\n"
11138                    "an extra carriage return\r\n"
11139                    "*/\r\n"));
11140 }
11141 
11142 TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
11143   verifyFormat("MY_CLASS(C) {\n"
11144                "  int i;\n"
11145                "  int j;\n"
11146                "};");
11147 }
11148 
11149 TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
11150   FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
11151   TwoIndent.ContinuationIndentWidth = 2;
11152 
11153   EXPECT_EQ("int i =\n"
11154             "  longFunction(\n"
11155             "    arg);",
11156             format("int i = longFunction(arg);", TwoIndent));
11157 
11158   FormatStyle SixIndent = getLLVMStyleWithColumns(20);
11159   SixIndent.ContinuationIndentWidth = 6;
11160 
11161   EXPECT_EQ("int i =\n"
11162             "      longFunction(\n"
11163             "            arg);",
11164             format("int i = longFunction(arg);", SixIndent));
11165 }
11166 
11167 TEST_F(FormatTest, SpacesInAngles) {
11168   FormatStyle Spaces = getLLVMStyle();
11169   Spaces.SpacesInAngles = true;
11170 
11171   verifyFormat("static_cast< int >(arg);", Spaces);
11172   verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
11173   verifyFormat("f< int, float >();", Spaces);
11174   verifyFormat("template <> g() {}", Spaces);
11175   verifyFormat("template < std::vector< int > > f() {}", Spaces);
11176   verifyFormat("std::function< void(int, int) > fct;", Spaces);
11177   verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
11178                Spaces);
11179 
11180   Spaces.Standard = FormatStyle::LS_Cpp03;
11181   Spaces.SpacesInAngles = true;
11182   verifyFormat("A< A< int > >();", Spaces);
11183 
11184   Spaces.SpacesInAngles = false;
11185   verifyFormat("A<A<int> >();", Spaces);
11186 
11187   Spaces.Standard = FormatStyle::LS_Cpp11;
11188   Spaces.SpacesInAngles = true;
11189   verifyFormat("A< A< int > >();", Spaces);
11190 
11191   Spaces.SpacesInAngles = false;
11192   verifyFormat("A<A<int>>();", Spaces);
11193 }
11194 
11195 TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
11196   FormatStyle Style = getLLVMStyle();
11197   Style.SpaceAfterTemplateKeyword = false;
11198   verifyFormat("template<int> void foo();", Style);
11199 }
11200 
11201 TEST_F(FormatTest, TripleAngleBrackets) {
11202   verifyFormat("f<<<1, 1>>>();");
11203   verifyFormat("f<<<1, 1, 1, s>>>();");
11204   verifyFormat("f<<<a, b, c, d>>>();");
11205   EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
11206   verifyFormat("f<param><<<1, 1>>>();");
11207   verifyFormat("f<1><<<1, 1>>>();");
11208   EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
11209   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11210                "aaaaaaaaaaa<<<\n    1, 1>>>();");
11211   verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
11212                "    <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
11213 }
11214 
11215 TEST_F(FormatTest, MergeLessLessAtEnd) {
11216   verifyFormat("<<");
11217   EXPECT_EQ("< < <", format("\\\n<<<"));
11218   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11219                "aaallvm::outs() <<");
11220   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
11221                "aaaallvm::outs()\n    <<");
11222 }
11223 
11224 TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
11225   std::string code = "#if A\n"
11226                      "#if B\n"
11227                      "a.\n"
11228                      "#endif\n"
11229                      "    a = 1;\n"
11230                      "#else\n"
11231                      "#endif\n"
11232                      "#if C\n"
11233                      "#else\n"
11234                      "#endif\n";
11235   EXPECT_EQ(code, format(code));
11236 }
11237 
11238 TEST_F(FormatTest, HandleConflictMarkers) {
11239   // Git/SVN conflict markers.
11240   EXPECT_EQ("int a;\n"
11241             "void f() {\n"
11242             "  callme(some(parameter1,\n"
11243             "<<<<<<< text by the vcs\n"
11244             "              parameter2),\n"
11245             "||||||| text by the vcs\n"
11246             "              parameter2),\n"
11247             "         parameter3,\n"
11248             "======= text by the vcs\n"
11249             "              parameter2, parameter3),\n"
11250             ">>>>>>> text by the vcs\n"
11251             "         otherparameter);\n",
11252             format("int a;\n"
11253                    "void f() {\n"
11254                    "  callme(some(parameter1,\n"
11255                    "<<<<<<< text by the vcs\n"
11256                    "  parameter2),\n"
11257                    "||||||| text by the vcs\n"
11258                    "  parameter2),\n"
11259                    "  parameter3,\n"
11260                    "======= text by the vcs\n"
11261                    "  parameter2,\n"
11262                    "  parameter3),\n"
11263                    ">>>>>>> text by the vcs\n"
11264                    "  otherparameter);\n"));
11265 
11266   // Perforce markers.
11267   EXPECT_EQ("void f() {\n"
11268             "  function(\n"
11269             ">>>> text by the vcs\n"
11270             "      parameter,\n"
11271             "==== text by the vcs\n"
11272             "      parameter,\n"
11273             "==== text by the vcs\n"
11274             "      parameter,\n"
11275             "<<<< text by the vcs\n"
11276             "      parameter);\n",
11277             format("void f() {\n"
11278                    "  function(\n"
11279                    ">>>> text by the vcs\n"
11280                    "  parameter,\n"
11281                    "==== text by the vcs\n"
11282                    "  parameter,\n"
11283                    "==== text by the vcs\n"
11284                    "  parameter,\n"
11285                    "<<<< text by the vcs\n"
11286                    "  parameter);\n"));
11287 
11288   EXPECT_EQ("<<<<<<<\n"
11289             "|||||||\n"
11290             "=======\n"
11291             ">>>>>>>",
11292             format("<<<<<<<\n"
11293                    "|||||||\n"
11294                    "=======\n"
11295                    ">>>>>>>"));
11296 
11297   EXPECT_EQ("<<<<<<<\n"
11298             "|||||||\n"
11299             "int i;\n"
11300             "=======\n"
11301             ">>>>>>>",
11302             format("<<<<<<<\n"
11303                    "|||||||\n"
11304                    "int i;\n"
11305                    "=======\n"
11306                    ">>>>>>>"));
11307 
11308   // FIXME: Handle parsing of macros around conflict markers correctly:
11309   EXPECT_EQ("#define Macro \\\n"
11310             "<<<<<<<\n"
11311             "Something \\\n"
11312             "|||||||\n"
11313             "Else \\\n"
11314             "=======\n"
11315             "Other \\\n"
11316             ">>>>>>>\n"
11317             "    End int i;\n",
11318             format("#define Macro \\\n"
11319                    "<<<<<<<\n"
11320                    "  Something \\\n"
11321                    "|||||||\n"
11322                    "  Else \\\n"
11323                    "=======\n"
11324                    "  Other \\\n"
11325                    ">>>>>>>\n"
11326                    "  End\n"
11327                    "int i;\n"));
11328 }
11329 
11330 TEST_F(FormatTest, DisableRegions) {
11331   EXPECT_EQ("int i;\n"
11332             "// clang-format off\n"
11333             "  int j;\n"
11334             "// clang-format on\n"
11335             "int k;",
11336             format(" int  i;\n"
11337                    "   // clang-format off\n"
11338                    "  int j;\n"
11339                    " // clang-format on\n"
11340                    "   int   k;"));
11341   EXPECT_EQ("int i;\n"
11342             "/* clang-format off */\n"
11343             "  int j;\n"
11344             "/* clang-format on */\n"
11345             "int k;",
11346             format(" int  i;\n"
11347                    "   /* clang-format off */\n"
11348                    "  int j;\n"
11349                    " /* clang-format on */\n"
11350                    "   int   k;"));
11351 
11352   // Don't reflow comments within disabled regions.
11353   EXPECT_EQ(
11354       "// clang-format off\n"
11355       "// long long long long long long line\n"
11356       "/* clang-format on */\n"
11357       "/* long long long\n"
11358       " * long long long\n"
11359       " * line */\n"
11360       "int i;\n"
11361       "/* clang-format off */\n"
11362       "/* long long long long long long line */\n",
11363       format("// clang-format off\n"
11364              "// long long long long long long line\n"
11365              "/* clang-format on */\n"
11366              "/* long long long long long long line */\n"
11367              "int i;\n"
11368              "/* clang-format off */\n"
11369              "/* long long long long long long line */\n",
11370              getLLVMStyleWithColumns(20)));
11371 }
11372 
11373 TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
11374   format("? ) =");
11375   verifyNoCrash("#define a\\\n /**/}");
11376 }
11377 
11378 TEST_F(FormatTest, FormatsTableGenCode) {
11379   FormatStyle Style = getLLVMStyle();
11380   Style.Language = FormatStyle::LK_TableGen;
11381   verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
11382 }
11383 
11384 TEST_F(FormatTest, ArrayOfTemplates) {
11385   EXPECT_EQ("auto a = new unique_ptr<int>[10];",
11386             format("auto a = new unique_ptr<int > [ 10];"));
11387 
11388   FormatStyle Spaces = getLLVMStyle();
11389   Spaces.SpacesInSquareBrackets = true;
11390   EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
11391             format("auto a = new unique_ptr<int > [10];", Spaces));
11392 }
11393 
11394 TEST_F(FormatTest, ArrayAsTemplateType) {
11395   EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
11396             format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
11397 
11398   FormatStyle Spaces = getLLVMStyle();
11399   Spaces.SpacesInSquareBrackets = true;
11400   EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
11401             format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
11402 }
11403 
11404 TEST_F(FormatTest, NoSpaceAfterSuper) {
11405     verifyFormat("__super::FooBar();");
11406 }
11407 
11408 TEST(FormatStyle, GetStyleOfFile) {
11409   vfs::InMemoryFileSystem FS;
11410   // Test 1: format file in the same directory.
11411   ASSERT_TRUE(
11412       FS.addFile("/a/.clang-format", 0,
11413                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
11414   ASSERT_TRUE(
11415       FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
11416   auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
11417   ASSERT_TRUE((bool)Style1);
11418   ASSERT_EQ(*Style1, getLLVMStyle());
11419 
11420   // Test 2.1: fallback to default.
11421   ASSERT_TRUE(
11422       FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
11423   auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
11424   ASSERT_TRUE((bool)Style2);
11425   ASSERT_EQ(*Style2, getMozillaStyle());
11426 
11427   // Test 2.2: no format on 'none' fallback style.
11428   Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
11429   ASSERT_TRUE((bool)Style2);
11430   ASSERT_EQ(*Style2, getNoStyle());
11431 
11432   // Test 2.3: format if config is found with no based style while fallback is
11433   // 'none'.
11434   ASSERT_TRUE(FS.addFile("/b/.clang-format", 0,
11435                          llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2")));
11436   Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
11437   ASSERT_TRUE((bool)Style2);
11438   ASSERT_EQ(*Style2, getLLVMStyle());
11439 
11440   // Test 2.4: format if yaml with no based style, while fallback is 'none'.
11441   Style2 = getStyle("{}", "a.h", "none", "", &FS);
11442   ASSERT_TRUE((bool)Style2);
11443   ASSERT_EQ(*Style2, getLLVMStyle());
11444 
11445   // Test 3: format file in parent directory.
11446   ASSERT_TRUE(
11447       FS.addFile("/c/.clang-format", 0,
11448                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
11449   ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
11450                          llvm::MemoryBuffer::getMemBuffer("int i;")));
11451   auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
11452   ASSERT_TRUE((bool)Style3);
11453   ASSERT_EQ(*Style3, getGoogleStyle());
11454 
11455   // Test 4: error on invalid fallback style
11456   auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS);
11457   ASSERT_FALSE((bool)Style4);
11458   llvm::consumeError(Style4.takeError());
11459 
11460   // Test 5: error on invalid yaml on command line
11461   auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS);
11462   ASSERT_FALSE((bool)Style5);
11463   llvm::consumeError(Style5.takeError());
11464 
11465   // Test 6: error on invalid style
11466   auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS);
11467   ASSERT_FALSE((bool)Style6);
11468   llvm::consumeError(Style6.takeError());
11469 
11470   // Test 7: found config file, error on parsing it
11471   ASSERT_TRUE(
11472       FS.addFile("/d/.clang-format", 0,
11473                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n"
11474                                                   "InvalidKey: InvalidValue")));
11475   ASSERT_TRUE(
11476       FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
11477   auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS);
11478   ASSERT_FALSE((bool)Style7);
11479   llvm::consumeError(Style7.takeError());
11480 }
11481 
11482 TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
11483   // Column limit is 20.
11484   std::string Code = "Type *a =\n"
11485                      "    new Type();\n"
11486                      "g(iiiii, 0, jjjjj,\n"
11487                      "  0, kkkkk, 0, mm);\n"
11488                      "int  bad     = format   ;";
11489   std::string Expected = "auto a = new Type();\n"
11490                          "g(iiiii, nullptr,\n"
11491                          "  jjjjj, nullptr,\n"
11492                          "  kkkkk, nullptr,\n"
11493                          "  mm);\n"
11494                          "int  bad     = format   ;";
11495   FileID ID = Context.createInMemoryFile("format.cpp", Code);
11496   tooling::Replacements Replaces = toReplacements(
11497       {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
11498                             "auto "),
11499        tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
11500                             "nullptr"),
11501        tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
11502                             "nullptr"),
11503        tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
11504                             "nullptr")});
11505 
11506   format::FormatStyle Style = format::getLLVMStyle();
11507   Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
11508   auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11509   EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11510       << llvm::toString(FormattedReplaces.takeError()) << "\n";
11511   auto Result = applyAllReplacements(Code, *FormattedReplaces);
11512   EXPECT_TRUE(static_cast<bool>(Result));
11513   EXPECT_EQ(Expected, *Result);
11514 }
11515 
11516 TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
11517   std::string Code = "#include \"a.h\"\n"
11518                      "#include \"c.h\"\n"
11519                      "\n"
11520                      "int main() {\n"
11521                      "  return 0;\n"
11522                      "}";
11523   std::string Expected = "#include \"a.h\"\n"
11524                          "#include \"b.h\"\n"
11525                          "#include \"c.h\"\n"
11526                          "\n"
11527                          "int main() {\n"
11528                          "  return 0;\n"
11529                          "}";
11530   FileID ID = Context.createInMemoryFile("fix.cpp", Code);
11531   tooling::Replacements Replaces = toReplacements(
11532       {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
11533                             "#include \"b.h\"\n")});
11534 
11535   format::FormatStyle Style = format::getLLVMStyle();
11536   Style.SortIncludes = true;
11537   auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
11538   EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
11539       << llvm::toString(FormattedReplaces.takeError()) << "\n";
11540   auto Result = applyAllReplacements(Code, *FormattedReplaces);
11541   EXPECT_TRUE(static_cast<bool>(Result));
11542   EXPECT_EQ(Expected, *Result);
11543 }
11544 
11545 TEST_F(FormatTest, FormatSortsUsingDeclarations) {
11546   EXPECT_EQ("using std::cin;\n"
11547             "using std::cout;",
11548             format("using std::cout;\n"
11549                    "using std::cin;", getGoogleStyle()));
11550 }
11551 
11552 TEST_F(FormatTest, UTF8CharacterLiteralCpp03) {
11553   format::FormatStyle Style = format::getLLVMStyle();
11554   Style.Standard = FormatStyle::LS_Cpp03;
11555   // cpp03 recognize this string as identifier u8 and literal character 'a'
11556   EXPECT_EQ("auto c = u8 'a';", format("auto c = u8'a';", Style));
11557 }
11558 
11559 TEST_F(FormatTest, UTF8CharacterLiteralCpp11) {
11560   // u8'a' is a C++17 feature, utf8 literal character, LS_Cpp11 covers
11561   // all modes, including C++11, C++14 and C++17
11562   EXPECT_EQ("auto c = u8'a';", format("auto c = u8'a';"));
11563 }
11564 
11565 TEST_F(FormatTest, DoNotFormatLikelyXml) {
11566   EXPECT_EQ("<!-- ;> -->",
11567             format("<!-- ;> -->", getGoogleStyle()));
11568   EXPECT_EQ(" <!-- >; -->",
11569             format(" <!-- >; -->", getGoogleStyle()));
11570 }
11571 
11572 TEST_F(FormatTest, StructuredBindings) {
11573   // Structured bindings is a C++17 feature.
11574   // all modes, including C++11, C++14 and C++17
11575   verifyFormat("auto [a, b] = f();");
11576   EXPECT_EQ("auto [a, b] = f();", format("auto[a, b] = f();"));
11577   EXPECT_EQ("const auto [a, b] = f();", format("const   auto[a, b] = f();"));
11578   EXPECT_EQ("auto const [a, b] = f();", format("auto  const[a, b] = f();"));
11579   EXPECT_EQ("auto const volatile [a, b] = f();",
11580             format("auto  const   volatile[a, b] = f();"));
11581   EXPECT_EQ("auto [a, b, c] = f();", format("auto   [  a  ,  b,c   ] = f();"));
11582   EXPECT_EQ("auto & [a, b, c] = f();",
11583             format("auto   &[  a  ,  b,c   ] = f();"));
11584   EXPECT_EQ("auto && [a, b, c] = f();",
11585             format("auto   &&[  a  ,  b,c   ] = f();"));
11586   EXPECT_EQ("auto const & [a, b] = f();", format("auto  const&[a, b] = f();"));
11587   EXPECT_EQ("auto const volatile && [a, b] = f();",
11588             format("auto  const  volatile  &&[a, b] = f();"));
11589   EXPECT_EQ("auto && [a, b] = f();", format("auto  &&[a, b] = f();"));
11590 
11591   format::FormatStyle Spaces = format::getLLVMStyle();
11592   Spaces.SpacesInSquareBrackets = true;
11593   verifyFormat("auto [ a, b ] = f();", Spaces);
11594   verifyFormat("auto && [ a, b ] = f();", Spaces);
11595 }
11596 
11597 } // end namespace
11598 } // end namespace format
11599 } // end namespace clang
11600