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 IncompleteCheck {
34     IC_ExpectComplete,
35     IC_ExpectIncomplete,
36     IC_DoNotCheck
37   };
38 
39   std::string format(llvm::StringRef Code,
40                      const FormatStyle &Style = getLLVMStyle(),
41                      IncompleteCheck CheckIncomplete = IC_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     bool IncompleteFormat = false;
46     tooling::Replacements Replaces =
47         reformat(Style, Code, Ranges, "<stdin>", &IncompleteFormat);
48     if (CheckIncomplete != IC_DoNotCheck) {
49       bool ExpectedIncompleteFormat = CheckIncomplete == IC_ExpectIncomplete;
50       EXPECT_EQ(ExpectedIncompleteFormat, IncompleteFormat) << Code << "\n\n";
51     }
52     ReplacementCount = Replaces.size();
53     auto Result = applyAllReplacements(Code, Replaces);
54     EXPECT_TRUE(static_cast<bool>(Result));
55     DEBUG(llvm::errs() << "\n" << *Result << "\n\n");
56     return *Result;
57   }
58 
59   FormatStyle getLLVMStyleWithColumns(unsigned ColumnLimit) {
60     FormatStyle Style = getLLVMStyle();
61     Style.ColumnLimit = ColumnLimit;
62     return Style;
63   }
64 
65   FormatStyle getGoogleStyleWithColumns(unsigned ColumnLimit) {
66     FormatStyle Style = getGoogleStyle();
67     Style.ColumnLimit = ColumnLimit;
68     return Style;
69   }
70 
71   void verifyFormat(llvm::StringRef Code,
72                     const FormatStyle &Style = getLLVMStyle()) {
73     EXPECT_EQ(Code.str(), format(test::messUp(Code), Style));
74   }
75 
76   void verifyIncompleteFormat(llvm::StringRef Code,
77                               const FormatStyle &Style = getLLVMStyle()) {
78     EXPECT_EQ(Code.str(),
79               format(test::messUp(Code), Style, IC_ExpectIncomplete));
80   }
81 
82   void verifyGoogleFormat(llvm::StringRef Code) {
83     verifyFormat(Code, getGoogleStyle());
84   }
85 
86   void verifyIndependentOfContext(llvm::StringRef text) {
87     verifyFormat(text);
88     verifyFormat(llvm::Twine("void f() { " + text + " }").str());
89   }
90 
91   /// \brief Verify that clang-format does not crash on the given input.
92   void verifyNoCrash(llvm::StringRef Code,
93                      const FormatStyle &Style = getLLVMStyle()) {
94     format(Code, Style, IC_DoNotCheck);
95   }
96 
97   int ReplacementCount;
98 };
99 
100 TEST_F(FormatTest, MessUp) {
101   EXPECT_EQ("1 2 3", test::messUp("1 2 3"));
102   EXPECT_EQ("1 2 3\n", test::messUp("1\n2\n3\n"));
103   EXPECT_EQ("a\n//b\nc", test::messUp("a\n//b\nc"));
104   EXPECT_EQ("a\n#b\nc", test::messUp("a\n#b\nc"));
105   EXPECT_EQ("a\n#b c d\ne", test::messUp("a\n#b\\\nc\\\nd\ne"));
106 }
107 
108 //===----------------------------------------------------------------------===//
109 // Basic function tests.
110 //===----------------------------------------------------------------------===//
111 
112 TEST_F(FormatTest, DoesNotChangeCorrectlyFormattedCode) {
113   EXPECT_EQ(";", format(";"));
114 }
115 
116 TEST_F(FormatTest, FormatsGlobalStatementsAt0) {
117   EXPECT_EQ("int i;", format("  int i;"));
118   EXPECT_EQ("\nint i;", format(" \n\t \v \f  int i;"));
119   EXPECT_EQ("int i;\nint j;", format("    int i; int j;"));
120   EXPECT_EQ("int i;\nint j;", format("    int i;\n  int j;"));
121 }
122 
123 TEST_F(FormatTest, FormatsUnwrappedLinesAtFirstFormat) {
124   EXPECT_EQ("int i;", format("int\ni;"));
125 }
126 
127 TEST_F(FormatTest, FormatsNestedBlockStatements) {
128   EXPECT_EQ("{\n  {\n    {}\n  }\n}", format("{{{}}}"));
129 }
130 
131 TEST_F(FormatTest, FormatsNestedCall) {
132   verifyFormat("Method(f1, f2(f3));");
133   verifyFormat("Method(f1(f2, f3()));");
134   verifyFormat("Method(f1(f2, (f3())));");
135 }
136 
137 TEST_F(FormatTest, NestedNameSpecifiers) {
138   verifyFormat("vector<::Type> v;");
139   verifyFormat("::ns::SomeFunction(::ns::SomeOtherFunction())");
140   verifyFormat("static constexpr bool Bar = decltype(bar())::value;");
141   verifyFormat("bool a = 2 < ::SomeFunction();");
142   verifyFormat("ALWAYS_INLINE ::std::string getName();");
143   verifyFormat("some::string getName();");
144 }
145 
146 TEST_F(FormatTest, OnlyGeneratesNecessaryReplacements) {
147   EXPECT_EQ("if (a) {\n"
148             "  f();\n"
149             "}",
150             format("if(a){f();}"));
151   EXPECT_EQ(4, ReplacementCount);
152   EXPECT_EQ("if (a) {\n"
153             "  f();\n"
154             "}",
155             format("if (a) {\n"
156                    "  f();\n"
157                    "}"));
158   EXPECT_EQ(0, ReplacementCount);
159   EXPECT_EQ("/*\r\n"
160             "\r\n"
161             "*/\r\n",
162             format("/*\r\n"
163                    "\r\n"
164                    "*/\r\n"));
165   EXPECT_EQ(0, ReplacementCount);
166 }
167 
168 TEST_F(FormatTest, RemovesEmptyLines) {
169   EXPECT_EQ("class C {\n"
170             "  int i;\n"
171             "};",
172             format("class C {\n"
173                    " int i;\n"
174                    "\n"
175                    "};"));
176 
177   // Don't remove empty lines at the start of namespaces or extern "C" blocks.
178   EXPECT_EQ("namespace N {\n"
179             "\n"
180             "int i;\n"
181             "}",
182             format("namespace N {\n"
183                    "\n"
184                    "int    i;\n"
185                    "}",
186                    getGoogleStyle()));
187   EXPECT_EQ("extern /**/ \"C\" /**/ {\n"
188             "\n"
189             "int i;\n"
190             "}",
191             format("extern /**/ \"C\" /**/ {\n"
192                    "\n"
193                    "int    i;\n"
194                    "}",
195                    getGoogleStyle()));
196 
197   // ...but do keep inlining and removing empty lines for non-block extern "C"
198   // functions.
199   verifyFormat("extern \"C\" int f() { return 42; }", getGoogleStyle());
200   EXPECT_EQ("extern \"C\" int f() {\n"
201             "  int i = 42;\n"
202             "  return i;\n"
203             "}",
204             format("extern \"C\" int f() {\n"
205                    "\n"
206                    "  int i = 42;\n"
207                    "  return i;\n"
208                    "}",
209                    getGoogleStyle()));
210 
211   // Remove empty lines at the beginning and end of blocks.
212   EXPECT_EQ("void f() {\n"
213             "\n"
214             "  if (a) {\n"
215             "\n"
216             "    f();\n"
217             "  }\n"
218             "}",
219             format("void f() {\n"
220                    "\n"
221                    "  if (a) {\n"
222                    "\n"
223                    "    f();\n"
224                    "\n"
225                    "  }\n"
226                    "\n"
227                    "}",
228                    getLLVMStyle()));
229   EXPECT_EQ("void f() {\n"
230             "  if (a) {\n"
231             "    f();\n"
232             "  }\n"
233             "}",
234             format("void f() {\n"
235                    "\n"
236                    "  if (a) {\n"
237                    "\n"
238                    "    f();\n"
239                    "\n"
240                    "  }\n"
241                    "\n"
242                    "}",
243                    getGoogleStyle()));
244 
245   // Don't remove empty lines in more complex control statements.
246   EXPECT_EQ("void f() {\n"
247             "  if (a) {\n"
248             "    f();\n"
249             "\n"
250             "  } else if (b) {\n"
251             "    f();\n"
252             "  }\n"
253             "}",
254             format("void f() {\n"
255                    "  if (a) {\n"
256                    "    f();\n"
257                    "\n"
258                    "  } else if (b) {\n"
259                    "    f();\n"
260                    "\n"
261                    "  }\n"
262                    "\n"
263                    "}"));
264 
265   // FIXME: This is slightly inconsistent.
266   EXPECT_EQ("namespace {\n"
267             "int i;\n"
268             "}",
269             format("namespace {\n"
270                    "int i;\n"
271                    "\n"
272                    "}"));
273   EXPECT_EQ("namespace {\n"
274             "int i;\n"
275             "\n"
276             "} // namespace",
277             format("namespace {\n"
278                    "int i;\n"
279                    "\n"
280                    "}  // namespace"));
281 
282   FormatStyle Style = getLLVMStyle();
283   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
284   Style.MaxEmptyLinesToKeep = 2;
285   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
286   Style.BraceWrapping.AfterClass = true;
287   Style.BraceWrapping.AfterFunction = true;
288   Style.KeepEmptyLinesAtTheStartOfBlocks = false;
289 
290   EXPECT_EQ("class Foo\n"
291             "{\n"
292             "  Foo() {}\n"
293             "\n"
294             "  void funk() {}\n"
295             "};",
296             format("class Foo\n"
297                    "{\n"
298                    "  Foo()\n"
299                    "  {\n"
300                    "  }\n"
301                    "\n"
302                    "  void funk() {}\n"
303                    "};",
304                    Style));
305 }
306 
307 TEST_F(FormatTest, RecognizesBinaryOperatorKeywords) {
308   verifyFormat("x = (a) and (b);");
309   verifyFormat("x = (a) or (b);");
310   verifyFormat("x = (a) bitand (b);");
311   verifyFormat("x = (a) bitor (b);");
312   verifyFormat("x = (a) not_eq (b);");
313   verifyFormat("x = (a) and_eq (b);");
314   verifyFormat("x = (a) or_eq (b);");
315   verifyFormat("x = (a) xor (b);");
316 }
317 
318 //===----------------------------------------------------------------------===//
319 // Tests for control statements.
320 //===----------------------------------------------------------------------===//
321 
322 TEST_F(FormatTest, FormatIfWithoutCompoundStatement) {
323   verifyFormat("if (true)\n  f();\ng();");
324   verifyFormat("if (a)\n  if (b)\n    if (c)\n      g();\nh();");
325   verifyFormat("if (a)\n  if (b) {\n    f();\n  }\ng();");
326 
327   FormatStyle AllowsMergedIf = getLLVMStyle();
328   AllowsMergedIf.AlignEscapedNewlinesLeft = true;
329   AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
330   verifyFormat("if (a)\n"
331                "  // comment\n"
332                "  f();",
333                AllowsMergedIf);
334   verifyFormat("{\n"
335                "  if (a)\n"
336                "  label:\n"
337                "    f();\n"
338                "}",
339                AllowsMergedIf);
340   verifyFormat("#define A \\\n"
341                "  if (a)  \\\n"
342                "  label:  \\\n"
343                "    f()",
344                AllowsMergedIf);
345   verifyFormat("if (a)\n"
346                "  ;",
347                AllowsMergedIf);
348   verifyFormat("if (a)\n"
349                "  if (b) return;",
350                AllowsMergedIf);
351 
352   verifyFormat("if (a) // Can't merge this\n"
353                "  f();\n",
354                AllowsMergedIf);
355   verifyFormat("if (a) /* still don't merge */\n"
356                "  f();",
357                AllowsMergedIf);
358   verifyFormat("if (a) { // Never merge this\n"
359                "  f();\n"
360                "}",
361                AllowsMergedIf);
362   verifyFormat("if (a) { /* Never merge this */\n"
363                "  f();\n"
364                "}",
365                AllowsMergedIf);
366 
367   AllowsMergedIf.ColumnLimit = 14;
368   verifyFormat("if (a) return;", AllowsMergedIf);
369   verifyFormat("if (aaaaaaaaa)\n"
370                "  return;",
371                AllowsMergedIf);
372 
373   AllowsMergedIf.ColumnLimit = 13;
374   verifyFormat("if (a)\n  return;", AllowsMergedIf);
375 }
376 
377 TEST_F(FormatTest, FormatLoopsWithoutCompoundStatement) {
378   FormatStyle AllowsMergedLoops = getLLVMStyle();
379   AllowsMergedLoops.AllowShortLoopsOnASingleLine = true;
380   verifyFormat("while (true) continue;", AllowsMergedLoops);
381   verifyFormat("for (;;) continue;", AllowsMergedLoops);
382   verifyFormat("for (int &v : vec) v *= 2;", AllowsMergedLoops);
383   verifyFormat("while (true)\n"
384                "  ;",
385                AllowsMergedLoops);
386   verifyFormat("for (;;)\n"
387                "  ;",
388                AllowsMergedLoops);
389   verifyFormat("for (;;)\n"
390                "  for (;;) continue;",
391                AllowsMergedLoops);
392   verifyFormat("for (;;) // Can't merge this\n"
393                "  continue;",
394                AllowsMergedLoops);
395   verifyFormat("for (;;) /* still don't merge */\n"
396                "  continue;",
397                AllowsMergedLoops);
398 }
399 
400 TEST_F(FormatTest, FormatShortBracedStatements) {
401   FormatStyle AllowSimpleBracedStatements = getLLVMStyle();
402   AllowSimpleBracedStatements.AllowShortBlocksOnASingleLine = true;
403 
404   AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = true;
405   AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true;
406 
407   verifyFormat("if (true) {}", AllowSimpleBracedStatements);
408   verifyFormat("while (true) {}", AllowSimpleBracedStatements);
409   verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
410   verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements);
411   verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements);
412   verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements);
413   verifyFormat("if (true) { //\n"
414                "  f();\n"
415                "}",
416                AllowSimpleBracedStatements);
417   verifyFormat("if (true) {\n"
418                "  f();\n"
419                "  f();\n"
420                "}",
421                AllowSimpleBracedStatements);
422   verifyFormat("if (true) {\n"
423                "  f();\n"
424                "} else {\n"
425                "  f();\n"
426                "}",
427                AllowSimpleBracedStatements);
428 
429   verifyFormat("template <int> struct A2 {\n"
430                "  struct B {};\n"
431                "};",
432                AllowSimpleBracedStatements);
433 
434   AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine = false;
435   verifyFormat("if (true) {\n"
436                "  f();\n"
437                "}",
438                AllowSimpleBracedStatements);
439   verifyFormat("if (true) {\n"
440                "  f();\n"
441                "} else {\n"
442                "  f();\n"
443                "}",
444                AllowSimpleBracedStatements);
445 
446   AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false;
447   verifyFormat("while (true) {\n"
448                "  f();\n"
449                "}",
450                AllowSimpleBracedStatements);
451   verifyFormat("for (;;) {\n"
452                "  f();\n"
453                "}",
454                AllowSimpleBracedStatements);
455 }
456 
457 TEST_F(FormatTest, ParseIfElse) {
458   verifyFormat("if (true)\n"
459                "  if (true)\n"
460                "    if (true)\n"
461                "      f();\n"
462                "    else\n"
463                "      g();\n"
464                "  else\n"
465                "    h();\n"
466                "else\n"
467                "  i();");
468   verifyFormat("if (true)\n"
469                "  if (true)\n"
470                "    if (true) {\n"
471                "      if (true)\n"
472                "        f();\n"
473                "    } else {\n"
474                "      g();\n"
475                "    }\n"
476                "  else\n"
477                "    h();\n"
478                "else {\n"
479                "  i();\n"
480                "}");
481   verifyFormat("void f() {\n"
482                "  if (a) {\n"
483                "  } else {\n"
484                "  }\n"
485                "}");
486 }
487 
488 TEST_F(FormatTest, ElseIf) {
489   verifyFormat("if (a) {\n} else if (b) {\n}");
490   verifyFormat("if (a)\n"
491                "  f();\n"
492                "else if (b)\n"
493                "  g();\n"
494                "else\n"
495                "  h();");
496   verifyFormat("if (a) {\n"
497                "  f();\n"
498                "}\n"
499                "// or else ..\n"
500                "else {\n"
501                "  g()\n"
502                "}");
503 
504   verifyFormat("if (a) {\n"
505                "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
506                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
507                "}");
508   verifyFormat("if (a) {\n"
509                "} else if (\n"
510                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
511                "}",
512                getLLVMStyleWithColumns(62));
513 }
514 
515 TEST_F(FormatTest, FormatsForLoop) {
516   verifyFormat(
517       "for (int VeryVeryLongLoopVariable = 0; VeryVeryLongLoopVariable < 10;\n"
518       "     ++VeryVeryLongLoopVariable)\n"
519       "  ;");
520   verifyFormat("for (;;)\n"
521                "  f();");
522   verifyFormat("for (;;) {\n}");
523   verifyFormat("for (;;) {\n"
524                "  f();\n"
525                "}");
526   verifyFormat("for (int i = 0; (i < 10); ++i) {\n}");
527 
528   verifyFormat(
529       "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
530       "                                          E = UnwrappedLines.end();\n"
531       "     I != E; ++I) {\n}");
532 
533   verifyFormat(
534       "for (MachineFun::iterator IIII = PrevIt, EEEE = F.end(); IIII != EEEE;\n"
535       "     ++IIIII) {\n}");
536   verifyFormat("for (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaa =\n"
537                "         aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa;\n"
538                "     aaaaaaaaaaa != aaaaaaaaaaaaaaaaaaa; ++aaaaaaaaaaa) {\n}");
539   verifyFormat("for (llvm::ArrayRef<NamedDecl *>::iterator\n"
540                "         I = FD->getDeclsInPrototypeScope().begin(),\n"
541                "         E = FD->getDeclsInPrototypeScope().end();\n"
542                "     I != E; ++I) {\n}");
543   verifyFormat("for (SmallVectorImpl<TemplateIdAnnotationn *>::iterator\n"
544                "         I = Container.begin(),\n"
545                "         E = Container.end();\n"
546                "     I != E; ++I) {\n}",
547                getLLVMStyleWithColumns(76));
548 
549   verifyFormat(
550       "for (aaaaaaaaaaaaaaaaa aaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
551       "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa !=\n"
552       "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
553       "         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
554       "     ++aaaaaaaaaaa) {\n}");
555   verifyFormat("for (int i = 0; i < aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
556                "                bbbbbbbbbbbbbbbbbbbb < ccccccccccccccc;\n"
557                "     ++i) {\n}");
558   verifyFormat("for (int aaaaaaaaaaa = 1; aaaaaaaaaaa <= bbbbbbbbbbbbbbb;\n"
559                "     aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
560                "}");
561   verifyFormat("for (some_namespace::SomeIterator iter( // force break\n"
562                "         aaaaaaaaaa);\n"
563                "     iter; ++iter) {\n"
564                "}");
565   verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
566                "         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
567                "     aaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbbbbbbb;\n"
568                "     ++aaaaaaaaaaaaaaaaaaaaaaaaaaa) {");
569 
570   FormatStyle NoBinPacking = getLLVMStyle();
571   NoBinPacking.BinPackParameters = false;
572   verifyFormat("for (int aaaaaaaaaaa = 1;\n"
573                "     aaaaaaaaaaa <= aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa,\n"
574                "                                           aaaaaaaaaaaaaaaa,\n"
575                "                                           aaaaaaaaaaaaaaaa,\n"
576                "                                           aaaaaaaaaaaaaaaa);\n"
577                "     aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
578                "}",
579                NoBinPacking);
580   verifyFormat(
581       "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
582       "                                          E = UnwrappedLines.end();\n"
583       "     I != E;\n"
584       "     ++I) {\n}",
585       NoBinPacking);
586 }
587 
588 TEST_F(FormatTest, RangeBasedForLoops) {
589   verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
590                "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
591   verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaa :\n"
592                "     aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa, aaaaaaaaaaaaa)) {\n}");
593   verifyFormat("for (const aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaa :\n"
594                "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
595   verifyFormat("for (aaaaaaaaa aaaaaaaaaaaaaaaaaaaaa :\n"
596                "     aaaaaaaaaaaa.aaaaaaaaaaaa().aaaaaaaaa().a()) {\n}");
597 }
598 
599 TEST_F(FormatTest, ForEachLoops) {
600   verifyFormat("void f() {\n"
601                "  foreach (Item *item, itemlist) {}\n"
602                "  Q_FOREACH (Item *item, itemlist) {}\n"
603                "  BOOST_FOREACH (Item *item, itemlist) {}\n"
604                "  UNKNOWN_FORACH(Item * item, itemlist) {}\n"
605                "}");
606 
607   // As function-like macros.
608   verifyFormat("#define foreach(x, y)\n"
609                "#define Q_FOREACH(x, y)\n"
610                "#define BOOST_FOREACH(x, y)\n"
611                "#define UNKNOWN_FOREACH(x, y)\n");
612 
613   // Not as function-like macros.
614   verifyFormat("#define foreach (x, y)\n"
615                "#define Q_FOREACH (x, y)\n"
616                "#define BOOST_FOREACH (x, y)\n"
617                "#define UNKNOWN_FOREACH (x, y)\n");
618 }
619 
620 TEST_F(FormatTest, FormatsWhileLoop) {
621   verifyFormat("while (true) {\n}");
622   verifyFormat("while (true)\n"
623                "  f();");
624   verifyFormat("while () {\n}");
625   verifyFormat("while () {\n"
626                "  f();\n"
627                "}");
628 }
629 
630 TEST_F(FormatTest, FormatsDoWhile) {
631   verifyFormat("do {\n"
632                "  do_something();\n"
633                "} while (something());");
634   verifyFormat("do\n"
635                "  do_something();\n"
636                "while (something());");
637 }
638 
639 TEST_F(FormatTest, FormatsSwitchStatement) {
640   verifyFormat("switch (x) {\n"
641                "case 1:\n"
642                "  f();\n"
643                "  break;\n"
644                "case kFoo:\n"
645                "case ns::kBar:\n"
646                "case kBaz:\n"
647                "  break;\n"
648                "default:\n"
649                "  g();\n"
650                "  break;\n"
651                "}");
652   verifyFormat("switch (x) {\n"
653                "case 1: {\n"
654                "  f();\n"
655                "  break;\n"
656                "}\n"
657                "case 2: {\n"
658                "  break;\n"
659                "}\n"
660                "}");
661   verifyFormat("switch (x) {\n"
662                "case 1: {\n"
663                "  f();\n"
664                "  {\n"
665                "    g();\n"
666                "    h();\n"
667                "  }\n"
668                "  break;\n"
669                "}\n"
670                "}");
671   verifyFormat("switch (x) {\n"
672                "case 1: {\n"
673                "  f();\n"
674                "  if (foo) {\n"
675                "    g();\n"
676                "    h();\n"
677                "  }\n"
678                "  break;\n"
679                "}\n"
680                "}");
681   verifyFormat("switch (x) {\n"
682                "case 1: {\n"
683                "  f();\n"
684                "  g();\n"
685                "} break;\n"
686                "}");
687   verifyFormat("switch (test)\n"
688                "  ;");
689   verifyFormat("switch (x) {\n"
690                "default: {\n"
691                "  // Do nothing.\n"
692                "}\n"
693                "}");
694   verifyFormat("switch (x) {\n"
695                "// comment\n"
696                "// if 1, do f()\n"
697                "case 1:\n"
698                "  f();\n"
699                "}");
700   verifyFormat("switch (x) {\n"
701                "case 1:\n"
702                "  // Do amazing stuff\n"
703                "  {\n"
704                "    f();\n"
705                "    g();\n"
706                "  }\n"
707                "  break;\n"
708                "}");
709   verifyFormat("#define A          \\\n"
710                "  switch (x) {     \\\n"
711                "  case a:          \\\n"
712                "    foo = b;       \\\n"
713                "  }",
714                getLLVMStyleWithColumns(20));
715   verifyFormat("#define OPERATION_CASE(name)           \\\n"
716                "  case OP_name:                        \\\n"
717                "    return operations::Operation##name\n",
718                getLLVMStyleWithColumns(40));
719   verifyFormat("switch (x) {\n"
720                "case 1:;\n"
721                "default:;\n"
722                "  int i;\n"
723                "}");
724 
725   verifyGoogleFormat("switch (x) {\n"
726                      "  case 1:\n"
727                      "    f();\n"
728                      "    break;\n"
729                      "  case kFoo:\n"
730                      "  case ns::kBar:\n"
731                      "  case kBaz:\n"
732                      "    break;\n"
733                      "  default:\n"
734                      "    g();\n"
735                      "    break;\n"
736                      "}");
737   verifyGoogleFormat("switch (x) {\n"
738                      "  case 1: {\n"
739                      "    f();\n"
740                      "    break;\n"
741                      "  }\n"
742                      "}");
743   verifyGoogleFormat("switch (test)\n"
744                      "  ;");
745 
746   verifyGoogleFormat("#define OPERATION_CASE(name) \\\n"
747                      "  case OP_name:              \\\n"
748                      "    return operations::Operation##name\n");
749   verifyGoogleFormat("Operation codeToOperation(OperationCode OpCode) {\n"
750                      "  // Get the correction operation class.\n"
751                      "  switch (OpCode) {\n"
752                      "    CASE(Add);\n"
753                      "    CASE(Subtract);\n"
754                      "    default:\n"
755                      "      return operations::Unknown;\n"
756                      "  }\n"
757                      "#undef OPERATION_CASE\n"
758                      "}");
759   verifyFormat("DEBUG({\n"
760                "  switch (x) {\n"
761                "  case A:\n"
762                "    f();\n"
763                "    break;\n"
764                "  // On B:\n"
765                "  case B:\n"
766                "    g();\n"
767                "    break;\n"
768                "  }\n"
769                "});");
770   verifyFormat("switch (a) {\n"
771                "case (b):\n"
772                "  return;\n"
773                "}");
774 
775   verifyFormat("switch (a) {\n"
776                "case some_namespace::\n"
777                "    some_constant:\n"
778                "  return;\n"
779                "}",
780                getLLVMStyleWithColumns(34));
781 }
782 
783 TEST_F(FormatTest, CaseRanges) {
784   verifyFormat("switch (x) {\n"
785                "case 'A' ... 'Z':\n"
786                "case 1 ... 5:\n"
787                "case a ... b:\n"
788                "  break;\n"
789                "}");
790 }
791 
792 TEST_F(FormatTest, ShortCaseLabels) {
793   FormatStyle Style = getLLVMStyle();
794   Style.AllowShortCaseLabelsOnASingleLine = true;
795   verifyFormat("switch (a) {\n"
796                "case 1: x = 1; break;\n"
797                "case 2: return;\n"
798                "case 3:\n"
799                "case 4:\n"
800                "case 5: return;\n"
801                "case 6: // comment\n"
802                "  return;\n"
803                "case 7:\n"
804                "  // comment\n"
805                "  return;\n"
806                "case 8:\n"
807                "  x = 8; // comment\n"
808                "  break;\n"
809                "default: y = 1; break;\n"
810                "}",
811                Style);
812   verifyFormat("switch (a) {\n"
813                "#if FOO\n"
814                "case 0: return 0;\n"
815                "#endif\n"
816                "}",
817                Style);
818   verifyFormat("switch (a) {\n"
819                "case 1: {\n"
820                "}\n"
821                "case 2: {\n"
822                "  return;\n"
823                "}\n"
824                "case 3: {\n"
825                "  x = 1;\n"
826                "  return;\n"
827                "}\n"
828                "case 4:\n"
829                "  if (x)\n"
830                "    return;\n"
831                "}",
832                Style);
833   Style.ColumnLimit = 21;
834   verifyFormat("switch (a) {\n"
835                "case 1: x = 1; break;\n"
836                "case 2: return;\n"
837                "case 3:\n"
838                "case 4:\n"
839                "case 5: return;\n"
840                "default:\n"
841                "  y = 1;\n"
842                "  break;\n"
843                "}",
844                Style);
845 }
846 
847 TEST_F(FormatTest, FormatsLabels) {
848   verifyFormat("void f() {\n"
849                "  some_code();\n"
850                "test_label:\n"
851                "  some_other_code();\n"
852                "  {\n"
853                "    some_more_code();\n"
854                "  another_label:\n"
855                "    some_more_code();\n"
856                "  }\n"
857                "}");
858   verifyFormat("{\n"
859                "  some_code();\n"
860                "test_label:\n"
861                "  some_other_code();\n"
862                "}");
863   verifyFormat("{\n"
864                "  some_code();\n"
865                "test_label:;\n"
866                "  int i = 0;\n"
867                "}");
868 }
869 
870 //===----------------------------------------------------------------------===//
871 // Tests for classes, namespaces, etc.
872 //===----------------------------------------------------------------------===//
873 
874 TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) {
875   verifyFormat("class A {};");
876 }
877 
878 TEST_F(FormatTest, UnderstandsAccessSpecifiers) {
879   verifyFormat("class A {\n"
880                "public:\n"
881                "public: // comment\n"
882                "protected:\n"
883                "private:\n"
884                "  void f() {}\n"
885                "};");
886   verifyGoogleFormat("class A {\n"
887                      " public:\n"
888                      " protected:\n"
889                      " private:\n"
890                      "  void f() {}\n"
891                      "};");
892   verifyFormat("class A {\n"
893                "public slots:\n"
894                "  void f1() {}\n"
895                "public Q_SLOTS:\n"
896                "  void f2() {}\n"
897                "protected slots:\n"
898                "  void f3() {}\n"
899                "protected Q_SLOTS:\n"
900                "  void f4() {}\n"
901                "private slots:\n"
902                "  void f5() {}\n"
903                "private Q_SLOTS:\n"
904                "  void f6() {}\n"
905                "signals:\n"
906                "  void g1();\n"
907                "Q_SIGNALS:\n"
908                "  void g2();\n"
909                "};");
910 
911   // Don't interpret 'signals' the wrong way.
912   verifyFormat("signals.set();");
913   verifyFormat("for (Signals signals : f()) {\n}");
914   verifyFormat("{\n"
915                "  signals.set(); // This needs indentation.\n"
916                "}");
917   verifyFormat("void f() {\n"
918                "label:\n"
919                "  signals.baz();\n"
920                "}");
921 }
922 
923 TEST_F(FormatTest, SeparatesLogicalBlocks) {
924   EXPECT_EQ("class A {\n"
925             "public:\n"
926             "  void f();\n"
927             "\n"
928             "private:\n"
929             "  void g() {}\n"
930             "  // test\n"
931             "protected:\n"
932             "  int h;\n"
933             "};",
934             format("class A {\n"
935                    "public:\n"
936                    "void f();\n"
937                    "private:\n"
938                    "void g() {}\n"
939                    "// test\n"
940                    "protected:\n"
941                    "int h;\n"
942                    "};"));
943   EXPECT_EQ("class A {\n"
944             "protected:\n"
945             "public:\n"
946             "  void f();\n"
947             "};",
948             format("class A {\n"
949                    "protected:\n"
950                    "\n"
951                    "public:\n"
952                    "\n"
953                    "  void f();\n"
954                    "};"));
955 
956   // Even ensure proper spacing inside macros.
957   EXPECT_EQ("#define B     \\\n"
958             "  class A {   \\\n"
959             "   protected: \\\n"
960             "   public:    \\\n"
961             "    void f(); \\\n"
962             "  };",
963             format("#define B     \\\n"
964                    "  class A {   \\\n"
965                    "   protected: \\\n"
966                    "              \\\n"
967                    "   public:    \\\n"
968                    "              \\\n"
969                    "    void f(); \\\n"
970                    "  };",
971                    getGoogleStyle()));
972   // But don't remove empty lines after macros ending in access specifiers.
973   EXPECT_EQ("#define A private:\n"
974             "\n"
975             "int i;",
976             format("#define A         private:\n"
977                    "\n"
978                    "int              i;"));
979 }
980 
981 TEST_F(FormatTest, FormatsClasses) {
982   verifyFormat("class A : public B {};");
983   verifyFormat("class A : public ::B {};");
984 
985   verifyFormat(
986       "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
987       "                             public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
988   verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n"
989                "    : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
990                "      public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
991   verifyFormat(
992       "class A : public B, public C, public D, public E, public F {};");
993   verifyFormat("class AAAAAAAAAAAA : public B,\n"
994                "                     public C,\n"
995                "                     public D,\n"
996                "                     public E,\n"
997                "                     public F,\n"
998                "                     public G {};");
999 
1000   verifyFormat("class\n"
1001                "    ReallyReallyLongClassName {\n"
1002                "  int i;\n"
1003                "};",
1004                getLLVMStyleWithColumns(32));
1005   verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n"
1006                "                           aaaaaaaaaaaaaaaa> {};");
1007   verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n"
1008                "    : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n"
1009                "                                 aaaaaaaaaaaaaaaaaaaaaa> {};");
1010   verifyFormat("template <class R, class C>\n"
1011                "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n"
1012                "    : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};");
1013   verifyFormat("class ::A::B {};");
1014 }
1015 
1016 TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) {
1017   verifyFormat("class A {\n} a, b;");
1018   verifyFormat("struct A {\n} a, b;");
1019   verifyFormat("union A {\n} a;");
1020 }
1021 
1022 TEST_F(FormatTest, FormatsEnum) {
1023   verifyFormat("enum {\n"
1024                "  Zero,\n"
1025                "  One = 1,\n"
1026                "  Two = One + 1,\n"
1027                "  Three = (One + Two),\n"
1028                "  Four = (Zero && (One ^ Two)) | (One << Two),\n"
1029                "  Five = (One, Two, Three, Four, 5)\n"
1030                "};");
1031   verifyGoogleFormat("enum {\n"
1032                      "  Zero,\n"
1033                      "  One = 1,\n"
1034                      "  Two = One + 1,\n"
1035                      "  Three = (One + Two),\n"
1036                      "  Four = (Zero && (One ^ Two)) | (One << Two),\n"
1037                      "  Five = (One, Two, Three, Four, 5)\n"
1038                      "};");
1039   verifyFormat("enum Enum {};");
1040   verifyFormat("enum {};");
1041   verifyFormat("enum X E {} d;");
1042   verifyFormat("enum __attribute__((...)) E {} d;");
1043   verifyFormat("enum __declspec__((...)) E {} d;");
1044   verifyFormat("enum {\n"
1045                "  Bar = Foo<int, int>::value\n"
1046                "};",
1047                getLLVMStyleWithColumns(30));
1048 
1049   verifyFormat("enum ShortEnum { A, B, C };");
1050   verifyGoogleFormat("enum ShortEnum { A, B, C };");
1051 
1052   EXPECT_EQ("enum KeepEmptyLines {\n"
1053             "  ONE,\n"
1054             "\n"
1055             "  TWO,\n"
1056             "\n"
1057             "  THREE\n"
1058             "}",
1059             format("enum KeepEmptyLines {\n"
1060                    "  ONE,\n"
1061                    "\n"
1062                    "  TWO,\n"
1063                    "\n"
1064                    "\n"
1065                    "  THREE\n"
1066                    "}"));
1067   verifyFormat("enum E { // comment\n"
1068                "  ONE,\n"
1069                "  TWO\n"
1070                "};\n"
1071                "int i;");
1072   // Not enums.
1073   verifyFormat("enum X f() {\n"
1074                "  a();\n"
1075                "  return 42;\n"
1076                "}");
1077   verifyFormat("enum X Type::f() {\n"
1078                "  a();\n"
1079                "  return 42;\n"
1080                "}");
1081   verifyFormat("enum ::X f() {\n"
1082                "  a();\n"
1083                "  return 42;\n"
1084                "}");
1085   verifyFormat("enum ns::X f() {\n"
1086                "  a();\n"
1087                "  return 42;\n"
1088                "}");
1089 }
1090 
1091 TEST_F(FormatTest, FormatsEnumsWithErrors) {
1092   verifyFormat("enum Type {\n"
1093                "  One = 0; // These semicolons should be commas.\n"
1094                "  Two = 1;\n"
1095                "};");
1096   verifyFormat("namespace n {\n"
1097                "enum Type {\n"
1098                "  One,\n"
1099                "  Two, // missing };\n"
1100                "  int i;\n"
1101                "}\n"
1102                "void g() {}");
1103 }
1104 
1105 TEST_F(FormatTest, FormatsEnumStruct) {
1106   verifyFormat("enum struct {\n"
1107                "  Zero,\n"
1108                "  One = 1,\n"
1109                "  Two = One + 1,\n"
1110                "  Three = (One + Two),\n"
1111                "  Four = (Zero && (One ^ Two)) | (One << Two),\n"
1112                "  Five = (One, Two, Three, Four, 5)\n"
1113                "};");
1114   verifyFormat("enum struct Enum {};");
1115   verifyFormat("enum struct {};");
1116   verifyFormat("enum struct X E {} d;");
1117   verifyFormat("enum struct __attribute__((...)) E {} d;");
1118   verifyFormat("enum struct __declspec__((...)) E {} d;");
1119   verifyFormat("enum struct X f() {\n  a();\n  return 42;\n}");
1120 }
1121 
1122 TEST_F(FormatTest, FormatsEnumClass) {
1123   verifyFormat("enum class {\n"
1124                "  Zero,\n"
1125                "  One = 1,\n"
1126                "  Two = One + 1,\n"
1127                "  Three = (One + Two),\n"
1128                "  Four = (Zero && (One ^ Two)) | (One << Two),\n"
1129                "  Five = (One, Two, Three, Four, 5)\n"
1130                "};");
1131   verifyFormat("enum class Enum {};");
1132   verifyFormat("enum class {};");
1133   verifyFormat("enum class X E {} d;");
1134   verifyFormat("enum class __attribute__((...)) E {} d;");
1135   verifyFormat("enum class __declspec__((...)) E {} d;");
1136   verifyFormat("enum class X f() {\n  a();\n  return 42;\n}");
1137 }
1138 
1139 TEST_F(FormatTest, FormatsEnumTypes) {
1140   verifyFormat("enum X : int {\n"
1141                "  A, // Force multiple lines.\n"
1142                "  B\n"
1143                "};");
1144   verifyFormat("enum X : int { A, B };");
1145   verifyFormat("enum X : std::uint32_t { A, B };");
1146 }
1147 
1148 TEST_F(FormatTest, FormatsNSEnums) {
1149   verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }");
1150   verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n"
1151                      "  // Information about someDecentlyLongValue.\n"
1152                      "  someDecentlyLongValue,\n"
1153                      "  // Information about anotherDecentlyLongValue.\n"
1154                      "  anotherDecentlyLongValue,\n"
1155                      "  // Information about aThirdDecentlyLongValue.\n"
1156                      "  aThirdDecentlyLongValue\n"
1157                      "};");
1158   verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n"
1159                      "  a = 1,\n"
1160                      "  b = 2,\n"
1161                      "  c = 3,\n"
1162                      "};");
1163   verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n"
1164                      "  a = 1,\n"
1165                      "  b = 2,\n"
1166                      "  c = 3,\n"
1167                      "};");
1168   verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n"
1169                      "  a = 1,\n"
1170                      "  b = 2,\n"
1171                      "  c = 3,\n"
1172                      "};");
1173 }
1174 
1175 TEST_F(FormatTest, FormatsBitfields) {
1176   verifyFormat("struct Bitfields {\n"
1177                "  unsigned sClass : 8;\n"
1178                "  unsigned ValueKind : 2;\n"
1179                "};");
1180   verifyFormat("struct A {\n"
1181                "  int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n"
1182                "      bbbbbbbbbbbbbbbbbbbbbbbbb;\n"
1183                "};");
1184   verifyFormat("struct MyStruct {\n"
1185                "  uchar data;\n"
1186                "  uchar : 8;\n"
1187                "  uchar : 8;\n"
1188                "  uchar other;\n"
1189                "};");
1190 }
1191 
1192 TEST_F(FormatTest, FormatsNamespaces) {
1193   verifyFormat("namespace some_namespace {\n"
1194                "class A {};\n"
1195                "void f() { f(); }\n"
1196                "}");
1197   verifyFormat("namespace {\n"
1198                "class A {};\n"
1199                "void f() { f(); }\n"
1200                "}");
1201   verifyFormat("inline namespace X {\n"
1202                "class A {};\n"
1203                "void f() { f(); }\n"
1204                "}");
1205   verifyFormat("using namespace some_namespace;\n"
1206                "class A {};\n"
1207                "void f() { f(); }");
1208 
1209   // This code is more common than we thought; if we
1210   // layout this correctly the semicolon will go into
1211   // its own line, which is undesirable.
1212   verifyFormat("namespace {};");
1213   verifyFormat("namespace {\n"
1214                "class A {};\n"
1215                "};");
1216 
1217   verifyFormat("namespace {\n"
1218                "int SomeVariable = 0; // comment\n"
1219                "} // namespace");
1220   EXPECT_EQ("#ifndef HEADER_GUARD\n"
1221             "#define HEADER_GUARD\n"
1222             "namespace my_namespace {\n"
1223             "int i;\n"
1224             "} // my_namespace\n"
1225             "#endif // HEADER_GUARD",
1226             format("#ifndef HEADER_GUARD\n"
1227                    " #define HEADER_GUARD\n"
1228                    "   namespace my_namespace {\n"
1229                    "int i;\n"
1230                    "}    // my_namespace\n"
1231                    "#endif    // HEADER_GUARD"));
1232 
1233   EXPECT_EQ("namespace A::B {\n"
1234             "class C {};\n"
1235             "}",
1236             format("namespace A::B {\n"
1237                    "class C {};\n"
1238                    "}"));
1239 
1240   FormatStyle Style = getLLVMStyle();
1241   Style.NamespaceIndentation = FormatStyle::NI_All;
1242   EXPECT_EQ("namespace out {\n"
1243             "  int i;\n"
1244             "  namespace in {\n"
1245             "    int i;\n"
1246             "  } // namespace\n"
1247             "} // namespace",
1248             format("namespace out {\n"
1249                    "int i;\n"
1250                    "namespace in {\n"
1251                    "int i;\n"
1252                    "} // namespace\n"
1253                    "} // namespace",
1254                    Style));
1255 
1256   Style.NamespaceIndentation = FormatStyle::NI_Inner;
1257   EXPECT_EQ("namespace out {\n"
1258             "int i;\n"
1259             "namespace in {\n"
1260             "  int i;\n"
1261             "} // namespace\n"
1262             "} // namespace",
1263             format("namespace out {\n"
1264                    "int i;\n"
1265                    "namespace in {\n"
1266                    "int i;\n"
1267                    "} // namespace\n"
1268                    "} // namespace",
1269                    Style));
1270 }
1271 
1272 TEST_F(FormatTest, FormatsExternC) { verifyFormat("extern \"C\" {\nint a;"); }
1273 
1274 TEST_F(FormatTest, FormatsInlineASM) {
1275   verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));");
1276   verifyFormat("asm(\"nop\" ::: \"memory\");");
1277   verifyFormat(
1278       "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n"
1279       "    \"cpuid\\n\\t\"\n"
1280       "    \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n"
1281       "    : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n"
1282       "    : \"a\"(value));");
1283   EXPECT_EQ(
1284       "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
1285       "  __asm {\n"
1286       "        mov     edx,[that] // vtable in edx\n"
1287       "        mov     eax,methodIndex\n"
1288       "        call    [edx][eax*4] // stdcall\n"
1289       "  }\n"
1290       "}",
1291       format("void NS_InvokeByIndex(void *that,   unsigned int methodIndex) {\n"
1292              "    __asm {\n"
1293              "        mov     edx,[that] // vtable in edx\n"
1294              "        mov     eax,methodIndex\n"
1295              "        call    [edx][eax*4] // stdcall\n"
1296              "    }\n"
1297              "}"));
1298   EXPECT_EQ("_asm {\n"
1299             "  xor eax, eax;\n"
1300             "  cpuid;\n"
1301             "}",
1302             format("_asm {\n"
1303                    "  xor eax, eax;\n"
1304                    "  cpuid;\n"
1305                    "}"));
1306   verifyFormat("void function() {\n"
1307                "  // comment\n"
1308                "  asm(\"\");\n"
1309                "}");
1310   EXPECT_EQ("__asm {\n"
1311             "}\n"
1312             "int i;",
1313             format("__asm   {\n"
1314                    "}\n"
1315                    "int   i;"));
1316 }
1317 
1318 TEST_F(FormatTest, FormatTryCatch) {
1319   verifyFormat("try {\n"
1320                "  throw a * b;\n"
1321                "} catch (int a) {\n"
1322                "  // Do nothing.\n"
1323                "} catch (...) {\n"
1324                "  exit(42);\n"
1325                "}");
1326 
1327   // Function-level try statements.
1328   verifyFormat("int f() try { return 4; } catch (...) {\n"
1329                "  return 5;\n"
1330                "}");
1331   verifyFormat("class A {\n"
1332                "  int a;\n"
1333                "  A() try : a(0) {\n"
1334                "  } catch (...) {\n"
1335                "    throw;\n"
1336                "  }\n"
1337                "};\n");
1338 
1339   // Incomplete try-catch blocks.
1340   verifyIncompleteFormat("try {} catch (");
1341 }
1342 
1343 TEST_F(FormatTest, FormatSEHTryCatch) {
1344   verifyFormat("__try {\n"
1345                "  int a = b * c;\n"
1346                "} __except (EXCEPTION_EXECUTE_HANDLER) {\n"
1347                "  // Do nothing.\n"
1348                "}");
1349 
1350   verifyFormat("__try {\n"
1351                "  int a = b * c;\n"
1352                "} __finally {\n"
1353                "  // Do nothing.\n"
1354                "}");
1355 
1356   verifyFormat("DEBUG({\n"
1357                "  __try {\n"
1358                "  } __finally {\n"
1359                "  }\n"
1360                "});\n");
1361 }
1362 
1363 TEST_F(FormatTest, IncompleteTryCatchBlocks) {
1364   verifyFormat("try {\n"
1365                "  f();\n"
1366                "} catch {\n"
1367                "  g();\n"
1368                "}");
1369   verifyFormat("try {\n"
1370                "  f();\n"
1371                "} catch (A a) MACRO(x) {\n"
1372                "  g();\n"
1373                "} catch (B b) MACRO(x) {\n"
1374                "  g();\n"
1375                "}");
1376 }
1377 
1378 TEST_F(FormatTest, FormatTryCatchBraceStyles) {
1379   FormatStyle Style = getLLVMStyle();
1380   for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla,
1381                           FormatStyle::BS_WebKit}) {
1382     Style.BreakBeforeBraces = BraceStyle;
1383     verifyFormat("try {\n"
1384                  "  // something\n"
1385                  "} catch (...) {\n"
1386                  "  // something\n"
1387                  "}",
1388                  Style);
1389   }
1390   Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
1391   verifyFormat("try {\n"
1392                "  // something\n"
1393                "}\n"
1394                "catch (...) {\n"
1395                "  // something\n"
1396                "}",
1397                Style);
1398   verifyFormat("__try {\n"
1399                "  // something\n"
1400                "}\n"
1401                "__finally {\n"
1402                "  // something\n"
1403                "}",
1404                Style);
1405   verifyFormat("@try {\n"
1406                "  // something\n"
1407                "}\n"
1408                "@finally {\n"
1409                "  // something\n"
1410                "}",
1411                Style);
1412   Style.BreakBeforeBraces = FormatStyle::BS_Allman;
1413   verifyFormat("try\n"
1414                "{\n"
1415                "  // something\n"
1416                "}\n"
1417                "catch (...)\n"
1418                "{\n"
1419                "  // something\n"
1420                "}",
1421                Style);
1422   Style.BreakBeforeBraces = FormatStyle::BS_GNU;
1423   verifyFormat("try\n"
1424                "  {\n"
1425                "    // something\n"
1426                "  }\n"
1427                "catch (...)\n"
1428                "  {\n"
1429                "    // something\n"
1430                "  }",
1431                Style);
1432   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1433   Style.BraceWrapping.BeforeCatch = true;
1434   verifyFormat("try {\n"
1435                "  // something\n"
1436                "}\n"
1437                "catch (...) {\n"
1438                "  // something\n"
1439                "}",
1440                Style);
1441 }
1442 
1443 TEST_F(FormatTest, StaticInitializers) {
1444   verifyFormat("static SomeClass SC = {1, 'a'};");
1445 
1446   verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n"
1447                "    100000000, "
1448                "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};");
1449 
1450   // Here, everything other than the "}" would fit on a line.
1451   verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n"
1452                "    10000000000000000000000000};");
1453   EXPECT_EQ("S s = {a,\n"
1454             "\n"
1455             "       b};",
1456             format("S s = {\n"
1457                    "  a,\n"
1458                    "\n"
1459                    "  b\n"
1460                    "};"));
1461 
1462   // FIXME: This would fit into the column limit if we'd fit "{ {" on the first
1463   // line. However, the formatting looks a bit off and this probably doesn't
1464   // happen often in practice.
1465   verifyFormat("static int Variable[1] = {\n"
1466                "    {1000000000000000000000000000000000000}};",
1467                getLLVMStyleWithColumns(40));
1468 }
1469 
1470 TEST_F(FormatTest, DesignatedInitializers) {
1471   verifyFormat("const struct A a = {.a = 1, .b = 2};");
1472   verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n"
1473                "                    .bbbbbbbbbb = 2,\n"
1474                "                    .cccccccccc = 3,\n"
1475                "                    .dddddddddd = 4,\n"
1476                "                    .eeeeeeeeee = 5};");
1477   verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
1478                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n"
1479                "    .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n"
1480                "    .ccccccccccccccccccccccccccc = 3,\n"
1481                "    .ddddddddddddddddddddddddddd = 4,\n"
1482                "    .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};");
1483 
1484   verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};");
1485 }
1486 
1487 TEST_F(FormatTest, NestedStaticInitializers) {
1488   verifyFormat("static A x = {{{}}};\n");
1489   verifyFormat("static A x = {{{init1, init2, init3, init4},\n"
1490                "               {init1, init2, init3, init4}}};",
1491                getLLVMStyleWithColumns(50));
1492 
1493   verifyFormat("somes Status::global_reps[3] = {\n"
1494                "    {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
1495                "    {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
1496                "    {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};",
1497                getLLVMStyleWithColumns(60));
1498   verifyGoogleFormat("SomeType Status::global_reps[3] = {\n"
1499                      "    {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
1500                      "    {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
1501                      "    {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};");
1502   verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n"
1503                "                  {rect.fRight - rect.fLeft, rect.fBottom - "
1504                "rect.fTop}};");
1505 
1506   verifyFormat(
1507       "SomeArrayOfSomeType a = {\n"
1508       "    {{1, 2, 3},\n"
1509       "     {1, 2, 3},\n"
1510       "     {111111111111111111111111111111, 222222222222222222222222222222,\n"
1511       "      333333333333333333333333333333},\n"
1512       "     {1, 2, 3},\n"
1513       "     {1, 2, 3}}};");
1514   verifyFormat(
1515       "SomeArrayOfSomeType a = {\n"
1516       "    {{1, 2, 3}},\n"
1517       "    {{1, 2, 3}},\n"
1518       "    {{111111111111111111111111111111, 222222222222222222222222222222,\n"
1519       "      333333333333333333333333333333}},\n"
1520       "    {{1, 2, 3}},\n"
1521       "    {{1, 2, 3}}};");
1522 
1523   verifyFormat("struct {\n"
1524                "  unsigned bit;\n"
1525                "  const char *const name;\n"
1526                "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n"
1527                "                 {kOsWin, \"Windows\"},\n"
1528                "                 {kOsLinux, \"Linux\"},\n"
1529                "                 {kOsCrOS, \"Chrome OS\"}};");
1530   verifyFormat("struct {\n"
1531                "  unsigned bit;\n"
1532                "  const char *const name;\n"
1533                "} kBitsToOs[] = {\n"
1534                "    {kOsMac, \"Mac\"},\n"
1535                "    {kOsWin, \"Windows\"},\n"
1536                "    {kOsLinux, \"Linux\"},\n"
1537                "    {kOsCrOS, \"Chrome OS\"},\n"
1538                "};");
1539 }
1540 
1541 TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) {
1542   verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro("
1543                "                      \\\n"
1544                "    aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)");
1545 }
1546 
1547 TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) {
1548   verifyFormat("virtual void write(ELFWriter *writerrr,\n"
1549                "                   OwningPtr<FileOutputBuffer> &buffer) = 0;");
1550 
1551   // Do break defaulted and deleted functions.
1552   verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
1553                "    default;",
1554                getLLVMStyleWithColumns(40));
1555   verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
1556                "    delete;",
1557                getLLVMStyleWithColumns(40));
1558 }
1559 
1560 TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) {
1561   verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3",
1562                getLLVMStyleWithColumns(40));
1563   verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
1564                getLLVMStyleWithColumns(40));
1565   EXPECT_EQ("#define Q                              \\\n"
1566             "  \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\"    \\\n"
1567             "  \"aaaaaaaa.cpp\"",
1568             format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
1569                    getLLVMStyleWithColumns(40)));
1570 }
1571 
1572 TEST_F(FormatTest, UnderstandsLinePPDirective) {
1573   EXPECT_EQ("# 123 \"A string literal\"",
1574             format("   #     123    \"A string literal\""));
1575 }
1576 
1577 TEST_F(FormatTest, LayoutUnknownPPDirective) {
1578   EXPECT_EQ("#;", format("#;"));
1579   verifyFormat("#\n;\n;\n;");
1580 }
1581 
1582 TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) {
1583   EXPECT_EQ("#line 42 \"test\"\n",
1584             format("#  \\\n  line  \\\n  42  \\\n  \"test\"\n"));
1585   EXPECT_EQ("#define A B\n", format("#  \\\n define  \\\n    A  \\\n       B\n",
1586                                     getLLVMStyleWithColumns(12)));
1587 }
1588 
1589 TEST_F(FormatTest, EndOfFileEndsPPDirective) {
1590   EXPECT_EQ("#line 42 \"test\"",
1591             format("#  \\\n  line  \\\n  42  \\\n  \"test\""));
1592   EXPECT_EQ("#define A B", format("#  \\\n define  \\\n    A  \\\n       B"));
1593 }
1594 
1595 TEST_F(FormatTest, DoesntRemoveUnknownTokens) {
1596   verifyFormat("#define A \\x20");
1597   verifyFormat("#define A \\ x20");
1598   EXPECT_EQ("#define A \\ x20", format("#define A \\   x20"));
1599   verifyFormat("#define A ''");
1600   verifyFormat("#define A ''qqq");
1601   verifyFormat("#define A `qqq");
1602   verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");");
1603   EXPECT_EQ("const char *c = STRINGIFY(\n"
1604             "\\na : b);",
1605             format("const char * c = STRINGIFY(\n"
1606                    "\\na : b);"));
1607 
1608   verifyFormat("a\r\\");
1609   verifyFormat("a\v\\");
1610   verifyFormat("a\f\\");
1611 }
1612 
1613 TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) {
1614   verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13));
1615   verifyFormat("#define A( \\\n    BB)", getLLVMStyleWithColumns(12));
1616   verifyFormat("#define A( \\\n    A, B)", getLLVMStyleWithColumns(12));
1617   // FIXME: We never break before the macro name.
1618   verifyFormat("#define AA( \\\n    B)", getLLVMStyleWithColumns(12));
1619 
1620   verifyFormat("#define A A\n#define A A");
1621   verifyFormat("#define A(X) A\n#define A A");
1622 
1623   verifyFormat("#define Something Other", getLLVMStyleWithColumns(23));
1624   verifyFormat("#define Something    \\\n  Other", getLLVMStyleWithColumns(22));
1625 }
1626 
1627 TEST_F(FormatTest, HandlePreprocessorDirectiveContext) {
1628   EXPECT_EQ("// somecomment\n"
1629             "#include \"a.h\"\n"
1630             "#define A(  \\\n"
1631             "    A, B)\n"
1632             "#include \"b.h\"\n"
1633             "// somecomment\n",
1634             format("  // somecomment\n"
1635                    "  #include \"a.h\"\n"
1636                    "#define A(A,\\\n"
1637                    "    B)\n"
1638                    "    #include \"b.h\"\n"
1639                    " // somecomment\n",
1640                    getLLVMStyleWithColumns(13)));
1641 }
1642 
1643 TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); }
1644 
1645 TEST_F(FormatTest, LayoutCodeInMacroDefinitions) {
1646   EXPECT_EQ("#define A    \\\n"
1647             "  c;         \\\n"
1648             "  e;\n"
1649             "f;",
1650             format("#define A c; e;\n"
1651                    "f;",
1652                    getLLVMStyleWithColumns(14)));
1653 }
1654 
1655 TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); }
1656 
1657 TEST_F(FormatTest, MacroDefinitionInsideStatement) {
1658   EXPECT_EQ("int x,\n"
1659             "#define A\n"
1660             "    y;",
1661             format("int x,\n#define A\ny;"));
1662 }
1663 
1664 TEST_F(FormatTest, HashInMacroDefinition) {
1665   EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle()));
1666   verifyFormat("#define A \\\n  b #c;", getLLVMStyleWithColumns(11));
1667   verifyFormat("#define A  \\\n"
1668                "  {        \\\n"
1669                "    f(#c); \\\n"
1670                "  }",
1671                getLLVMStyleWithColumns(11));
1672 
1673   verifyFormat("#define A(X)         \\\n"
1674                "  void function##X()",
1675                getLLVMStyleWithColumns(22));
1676 
1677   verifyFormat("#define A(a, b, c)   \\\n"
1678                "  void a##b##c()",
1679                getLLVMStyleWithColumns(22));
1680 
1681   verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22));
1682 }
1683 
1684 TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) {
1685   EXPECT_EQ("#define A (x)", format("#define A (x)"));
1686   EXPECT_EQ("#define A(x)", format("#define A(x)"));
1687 }
1688 
1689 TEST_F(FormatTest, EmptyLinesInMacroDefinitions) {
1690   EXPECT_EQ("#define A b;", format("#define A \\\n"
1691                                    "          \\\n"
1692                                    "  b;",
1693                                    getLLVMStyleWithColumns(25)));
1694   EXPECT_EQ("#define A \\\n"
1695             "          \\\n"
1696             "  a;      \\\n"
1697             "  b;",
1698             format("#define A \\\n"
1699                    "          \\\n"
1700                    "  a;      \\\n"
1701                    "  b;",
1702                    getLLVMStyleWithColumns(11)));
1703   EXPECT_EQ("#define A \\\n"
1704             "  a;      \\\n"
1705             "          \\\n"
1706             "  b;",
1707             format("#define A \\\n"
1708                    "  a;      \\\n"
1709                    "          \\\n"
1710                    "  b;",
1711                    getLLVMStyleWithColumns(11)));
1712 }
1713 
1714 TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) {
1715   verifyIncompleteFormat("#define A :");
1716   verifyFormat("#define SOMECASES  \\\n"
1717                "  case 1:          \\\n"
1718                "  case 2\n",
1719                getLLVMStyleWithColumns(20));
1720   verifyFormat("#define MACRO(a) \\\n"
1721                "  if (a)         \\\n"
1722                "    f();         \\\n"
1723                "  else           \\\n"
1724                "    g()",
1725                getLLVMStyleWithColumns(18));
1726   verifyFormat("#define A template <typename T>");
1727   verifyIncompleteFormat("#define STR(x) #x\n"
1728                          "f(STR(this_is_a_string_literal{));");
1729   verifyFormat("#pragma omp threadprivate( \\\n"
1730                "    y)), // expected-warning",
1731                getLLVMStyleWithColumns(28));
1732   verifyFormat("#d, = };");
1733   verifyFormat("#if \"a");
1734   verifyIncompleteFormat("({\n"
1735                          "#define b     \\\n"
1736                          "  }           \\\n"
1737                          "  a\n"
1738                          "a",
1739                          getLLVMStyleWithColumns(15));
1740   verifyFormat("#define A     \\\n"
1741                "  {           \\\n"
1742                "    {\n"
1743                "#define B     \\\n"
1744                "  }           \\\n"
1745                "  }",
1746                getLLVMStyleWithColumns(15));
1747   verifyNoCrash("#if a\na(\n#else\n#endif\n{a");
1748   verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}");
1749   verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};");
1750   verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() {      \n)}");
1751 }
1752 
1753 TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) {
1754   verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline.
1755   EXPECT_EQ("class A : public QObject {\n"
1756             "  Q_OBJECT\n"
1757             "\n"
1758             "  A() {}\n"
1759             "};",
1760             format("class A  :  public QObject {\n"
1761                    "     Q_OBJECT\n"
1762                    "\n"
1763                    "  A() {\n}\n"
1764                    "}  ;"));
1765   EXPECT_EQ("MACRO\n"
1766             "/*static*/ int i;",
1767             format("MACRO\n"
1768                    " /*static*/ int   i;"));
1769   EXPECT_EQ("SOME_MACRO\n"
1770             "namespace {\n"
1771             "void f();\n"
1772             "}",
1773             format("SOME_MACRO\n"
1774                    "  namespace    {\n"
1775                    "void   f(  );\n"
1776                    "}"));
1777   // Only if the identifier contains at least 5 characters.
1778   EXPECT_EQ("HTTP f();", format("HTTP\nf();"));
1779   EXPECT_EQ("MACRO\nf();", format("MACRO\nf();"));
1780   // Only if everything is upper case.
1781   EXPECT_EQ("class A : public QObject {\n"
1782             "  Q_Object A() {}\n"
1783             "};",
1784             format("class A  :  public QObject {\n"
1785                    "     Q_Object\n"
1786                    "  A() {\n}\n"
1787                    "}  ;"));
1788 
1789   // Only if the next line can actually start an unwrapped line.
1790   EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;",
1791             format("SOME_WEIRD_LOG_MACRO\n"
1792                    "<< SomeThing;"));
1793 
1794   verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), "
1795                "(n, buffers))\n",
1796                getChromiumStyle(FormatStyle::LK_Cpp));
1797 }
1798 
1799 TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) {
1800   EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
1801             "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
1802             "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
1803             "class X {};\n"
1804             "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
1805             "int *createScopDetectionPass() { return 0; }",
1806             format("  INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
1807                    "  INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
1808                    "  INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
1809                    "  class X {};\n"
1810                    "  INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
1811                    "  int *createScopDetectionPass() { return 0; }"));
1812   // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as
1813   // braces, so that inner block is indented one level more.
1814   EXPECT_EQ("int q() {\n"
1815             "  IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
1816             "  IPC_MESSAGE_HANDLER(xxx, qqq)\n"
1817             "  IPC_END_MESSAGE_MAP()\n"
1818             "}",
1819             format("int q() {\n"
1820                    "  IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
1821                    "    IPC_MESSAGE_HANDLER(xxx, qqq)\n"
1822                    "  IPC_END_MESSAGE_MAP()\n"
1823                    "}"));
1824 
1825   // Same inside macros.
1826   EXPECT_EQ("#define LIST(L) \\\n"
1827             "  L(A)          \\\n"
1828             "  L(B)          \\\n"
1829             "  L(C)",
1830             format("#define LIST(L) \\\n"
1831                    "  L(A) \\\n"
1832                    "  L(B) \\\n"
1833                    "  L(C)",
1834                    getGoogleStyle()));
1835 
1836   // These must not be recognized as macros.
1837   EXPECT_EQ("int q() {\n"
1838             "  f(x);\n"
1839             "  f(x) {}\n"
1840             "  f(x)->g();\n"
1841             "  f(x)->*g();\n"
1842             "  f(x).g();\n"
1843             "  f(x) = x;\n"
1844             "  f(x) += x;\n"
1845             "  f(x) -= x;\n"
1846             "  f(x) *= x;\n"
1847             "  f(x) /= x;\n"
1848             "  f(x) %= x;\n"
1849             "  f(x) &= x;\n"
1850             "  f(x) |= x;\n"
1851             "  f(x) ^= x;\n"
1852             "  f(x) >>= x;\n"
1853             "  f(x) <<= x;\n"
1854             "  f(x)[y].z();\n"
1855             "  LOG(INFO) << x;\n"
1856             "  ifstream(x) >> x;\n"
1857             "}\n",
1858             format("int q() {\n"
1859                    "  f(x)\n;\n"
1860                    "  f(x)\n {}\n"
1861                    "  f(x)\n->g();\n"
1862                    "  f(x)\n->*g();\n"
1863                    "  f(x)\n.g();\n"
1864                    "  f(x)\n = x;\n"
1865                    "  f(x)\n += x;\n"
1866                    "  f(x)\n -= x;\n"
1867                    "  f(x)\n *= x;\n"
1868                    "  f(x)\n /= x;\n"
1869                    "  f(x)\n %= x;\n"
1870                    "  f(x)\n &= x;\n"
1871                    "  f(x)\n |= x;\n"
1872                    "  f(x)\n ^= x;\n"
1873                    "  f(x)\n >>= x;\n"
1874                    "  f(x)\n <<= x;\n"
1875                    "  f(x)\n[y].z();\n"
1876                    "  LOG(INFO)\n << x;\n"
1877                    "  ifstream(x)\n >> x;\n"
1878                    "}\n"));
1879   EXPECT_EQ("int q() {\n"
1880             "  F(x)\n"
1881             "  if (1) {\n"
1882             "  }\n"
1883             "  F(x)\n"
1884             "  while (1) {\n"
1885             "  }\n"
1886             "  F(x)\n"
1887             "  G(x);\n"
1888             "  F(x)\n"
1889             "  try {\n"
1890             "    Q();\n"
1891             "  } catch (...) {\n"
1892             "  }\n"
1893             "}\n",
1894             format("int q() {\n"
1895                    "F(x)\n"
1896                    "if (1) {}\n"
1897                    "F(x)\n"
1898                    "while (1) {}\n"
1899                    "F(x)\n"
1900                    "G(x);\n"
1901                    "F(x)\n"
1902                    "try { Q(); } catch (...) {}\n"
1903                    "}\n"));
1904   EXPECT_EQ("class A {\n"
1905             "  A() : t(0) {}\n"
1906             "  A(int i) noexcept() : {}\n"
1907             "  A(X x)\n" // FIXME: function-level try blocks are broken.
1908             "  try : t(0) {\n"
1909             "  } catch (...) {\n"
1910             "  }\n"
1911             "};",
1912             format("class A {\n"
1913                    "  A()\n : t(0) {}\n"
1914                    "  A(int i)\n noexcept() : {}\n"
1915                    "  A(X x)\n"
1916                    "  try : t(0) {} catch (...) {}\n"
1917                    "};"));
1918   EXPECT_EQ("class SomeClass {\n"
1919             "public:\n"
1920             "  SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
1921             "};",
1922             format("class SomeClass {\n"
1923                    "public:\n"
1924                    "  SomeClass()\n"
1925                    "  EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
1926                    "};"));
1927   EXPECT_EQ("class SomeClass {\n"
1928             "public:\n"
1929             "  SomeClass()\n"
1930             "      EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
1931             "};",
1932             format("class SomeClass {\n"
1933                    "public:\n"
1934                    "  SomeClass()\n"
1935                    "  EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
1936                    "};",
1937                    getLLVMStyleWithColumns(40)));
1938 
1939   verifyFormat("MACRO(>)");
1940 }
1941 
1942 TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) {
1943   verifyFormat("#define A \\\n"
1944                "  f({     \\\n"
1945                "    g();  \\\n"
1946                "  });",
1947                getLLVMStyleWithColumns(11));
1948 }
1949 
1950 TEST_F(FormatTest, IndentPreprocessorDirectivesAtZero) {
1951   EXPECT_EQ("{\n  {\n#define A\n  }\n}", format("{{\n#define A\n}}"));
1952 }
1953 
1954 TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) {
1955   verifyFormat("{\n  { a #c; }\n}");
1956 }
1957 
1958 TEST_F(FormatTest, FormatUnbalancedStructuralElements) {
1959   EXPECT_EQ("#define A \\\n  {       \\\n    {\nint i;",
1960             format("#define A { {\nint i;", getLLVMStyleWithColumns(11)));
1961   EXPECT_EQ("#define A \\\n  }       \\\n  }\nint i;",
1962             format("#define A } }\nint i;", getLLVMStyleWithColumns(11)));
1963 }
1964 
1965 TEST_F(FormatTest, EscapedNewlines) {
1966   EXPECT_EQ(
1967       "#define A \\\n  int i;  \\\n  int j;",
1968       format("#define A \\\nint i;\\\n  int j;", getLLVMStyleWithColumns(11)));
1969   EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;"));
1970   EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
1971   EXPECT_EQ("/* \\  \\  \\\n */", format("\\\n/* \\  \\  \\\n */"));
1972   EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>"));
1973 }
1974 
1975 TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) {
1976   verifyFormat("#define A \\\n"
1977                "  int v(  \\\n"
1978                "      a); \\\n"
1979                "  int i;",
1980                getLLVMStyleWithColumns(11));
1981 }
1982 
1983 TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) {
1984   EXPECT_EQ(
1985       "#define ALooooooooooooooooooooooooooooooooooooooongMacro("
1986       "                      \\\n"
1987       "    aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
1988       "\n"
1989       "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
1990       "    aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n",
1991       format("  #define   ALooooooooooooooooooooooooooooooooooooooongMacro("
1992              "\\\n"
1993              "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
1994              "  \n"
1995              "   AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
1996              "  aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n"));
1997 }
1998 
1999 TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) {
2000   EXPECT_EQ("int\n"
2001             "#define A\n"
2002             "    a;",
2003             format("int\n#define A\na;"));
2004   verifyFormat("functionCallTo(\n"
2005                "    someOtherFunction(\n"
2006                "        withSomeParameters, whichInSequence,\n"
2007                "        areLongerThanALine(andAnotherCall,\n"
2008                "#define A B\n"
2009                "                           withMoreParamters,\n"
2010                "                           whichStronglyInfluenceTheLayout),\n"
2011                "        andMoreParameters),\n"
2012                "    trailing);",
2013                getLLVMStyleWithColumns(69));
2014   verifyFormat("Foo::Foo()\n"
2015                "#ifdef BAR\n"
2016                "    : baz(0)\n"
2017                "#endif\n"
2018                "{\n"
2019                "}");
2020   verifyFormat("void f() {\n"
2021                "  if (true)\n"
2022                "#ifdef A\n"
2023                "    f(42);\n"
2024                "  x();\n"
2025                "#else\n"
2026                "    g();\n"
2027                "  x();\n"
2028                "#endif\n"
2029                "}");
2030   verifyFormat("void f(param1, param2,\n"
2031                "       param3,\n"
2032                "#ifdef A\n"
2033                "       param4(param5,\n"
2034                "#ifdef A1\n"
2035                "              param6,\n"
2036                "#ifdef A2\n"
2037                "              param7),\n"
2038                "#else\n"
2039                "              param8),\n"
2040                "       param9,\n"
2041                "#endif\n"
2042                "       param10,\n"
2043                "#endif\n"
2044                "       param11)\n"
2045                "#else\n"
2046                "       param12)\n"
2047                "#endif\n"
2048                "{\n"
2049                "  x();\n"
2050                "}",
2051                getLLVMStyleWithColumns(28));
2052   verifyFormat("#if 1\n"
2053                "int i;");
2054   verifyFormat("#if 1\n"
2055                "#endif\n"
2056                "#if 1\n"
2057                "#else\n"
2058                "#endif\n");
2059   verifyFormat("DEBUG({\n"
2060                "  return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2061                "         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
2062                "});\n"
2063                "#if a\n"
2064                "#else\n"
2065                "#endif");
2066 
2067   verifyIncompleteFormat("void f(\n"
2068                          "#if A\n"
2069                          "    );\n"
2070                          "#else\n"
2071                          "#endif");
2072 }
2073 
2074 TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) {
2075   verifyFormat("#endif\n"
2076                "#if B");
2077 }
2078 
2079 TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) {
2080   FormatStyle SingleLine = getLLVMStyle();
2081   SingleLine.AllowShortIfStatementsOnASingleLine = true;
2082   verifyFormat("#if 0\n"
2083                "#elif 1\n"
2084                "#endif\n"
2085                "void foo() {\n"
2086                "  if (test) foo2();\n"
2087                "}",
2088                SingleLine);
2089 }
2090 
2091 TEST_F(FormatTest, LayoutBlockInsideParens) {
2092   verifyFormat("functionCall({ int i; });");
2093   verifyFormat("functionCall({\n"
2094                "  int i;\n"
2095                "  int j;\n"
2096                "});");
2097   verifyFormat("functionCall(\n"
2098                "    {\n"
2099                "      int i;\n"
2100                "      int j;\n"
2101                "    },\n"
2102                "    aaaa, bbbb, cccc);");
2103   verifyFormat("functionA(functionB({\n"
2104                "            int i;\n"
2105                "            int j;\n"
2106                "          }),\n"
2107                "          aaaa, bbbb, cccc);");
2108   verifyFormat("functionCall(\n"
2109                "    {\n"
2110                "      int i;\n"
2111                "      int j;\n"
2112                "    },\n"
2113                "    aaaa, bbbb, // comment\n"
2114                "    cccc);");
2115   verifyFormat("functionA(functionB({\n"
2116                "            int i;\n"
2117                "            int j;\n"
2118                "          }),\n"
2119                "          aaaa, bbbb, // comment\n"
2120                "          cccc);");
2121   verifyFormat("functionCall(aaaa, bbbb, { int i; });");
2122   verifyFormat("functionCall(aaaa, bbbb, {\n"
2123                "  int i;\n"
2124                "  int j;\n"
2125                "});");
2126   verifyFormat(
2127       "Aaa(\n" // FIXME: There shouldn't be a linebreak here.
2128       "    {\n"
2129       "      int i; // break\n"
2130       "    },\n"
2131       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
2132       "                                     ccccccccccccccccc));");
2133   verifyFormat("DEBUG({\n"
2134                "  if (a)\n"
2135                "    f();\n"
2136                "});");
2137 }
2138 
2139 TEST_F(FormatTest, LayoutBlockInsideStatement) {
2140   EXPECT_EQ("SOME_MACRO { int i; }\n"
2141             "int i;",
2142             format("  SOME_MACRO  {int i;}  int i;"));
2143 }
2144 
2145 TEST_F(FormatTest, LayoutNestedBlocks) {
2146   verifyFormat("void AddOsStrings(unsigned bitmask) {\n"
2147                "  struct s {\n"
2148                "    int i;\n"
2149                "  };\n"
2150                "  s kBitsToOs[] = {{10}};\n"
2151                "  for (int i = 0; i < 10; ++i)\n"
2152                "    return;\n"
2153                "}");
2154   verifyFormat("call(parameter, {\n"
2155                "  something();\n"
2156                "  // Comment using all columns.\n"
2157                "  somethingelse();\n"
2158                "});",
2159                getLLVMStyleWithColumns(40));
2160   verifyFormat("DEBUG( //\n"
2161                "    { f(); }, a);");
2162   verifyFormat("DEBUG( //\n"
2163                "    {\n"
2164                "      f(); //\n"
2165                "    },\n"
2166                "    a);");
2167 
2168   EXPECT_EQ("call(parameter, {\n"
2169             "  something();\n"
2170             "  // Comment too\n"
2171             "  // looooooooooong.\n"
2172             "  somethingElse();\n"
2173             "});",
2174             format("call(parameter, {\n"
2175                    "  something();\n"
2176                    "  // Comment too looooooooooong.\n"
2177                    "  somethingElse();\n"
2178                    "});",
2179                    getLLVMStyleWithColumns(29)));
2180   EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int   i; });"));
2181   EXPECT_EQ("DEBUG({ // comment\n"
2182             "  int i;\n"
2183             "});",
2184             format("DEBUG({ // comment\n"
2185                    "int  i;\n"
2186                    "});"));
2187   EXPECT_EQ("DEBUG({\n"
2188             "  int i;\n"
2189             "\n"
2190             "  // comment\n"
2191             "  int j;\n"
2192             "});",
2193             format("DEBUG({\n"
2194                    "  int  i;\n"
2195                    "\n"
2196                    "  // comment\n"
2197                    "  int  j;\n"
2198                    "});"));
2199 
2200   verifyFormat("DEBUG({\n"
2201                "  if (a)\n"
2202                "    return;\n"
2203                "});");
2204   verifyGoogleFormat("DEBUG({\n"
2205                      "  if (a) return;\n"
2206                      "});");
2207   FormatStyle Style = getGoogleStyle();
2208   Style.ColumnLimit = 45;
2209   verifyFormat("Debug(aaaaa,\n"
2210                "      {\n"
2211                "        if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n"
2212                "      },\n"
2213                "      a);",
2214                Style);
2215 
2216   verifyFormat("SomeFunction({MACRO({ return output; }), b});");
2217 
2218   verifyNoCrash("^{v^{a}}");
2219 }
2220 
2221 TEST_F(FormatTest, FormatNestedBlocksInMacros) {
2222   EXPECT_EQ("#define MACRO()                     \\\n"
2223             "  Debug(aaa, /* force line break */ \\\n"
2224             "        {                           \\\n"
2225             "          int i;                    \\\n"
2226             "          int j;                    \\\n"
2227             "        })",
2228             format("#define   MACRO()   Debug(aaa,  /* force line break */ \\\n"
2229                    "          {  int   i;  int  j;   })",
2230                    getGoogleStyle()));
2231 
2232   EXPECT_EQ("#define A                                       \\\n"
2233             "  [] {                                          \\\n"
2234             "    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx(        \\\n"
2235             "        xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n"
2236             "  }",
2237             format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
2238                    "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }",
2239                    getGoogleStyle()));
2240 }
2241 
2242 TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) {
2243   EXPECT_EQ("{}", format("{}"));
2244   verifyFormat("enum E {};");
2245   verifyFormat("enum E {}");
2246 }
2247 
2248 TEST_F(FormatTest, FormatBeginBlockEndMacros) {
2249   FormatStyle Style = getLLVMStyle();
2250   Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$";
2251   Style.MacroBlockEnd = "^[A-Z_]+_END$";
2252   verifyFormat("FOO_BEGIN\n"
2253                "  FOO_ENTRY\n"
2254                "FOO_END", Style);
2255   verifyFormat("FOO_BEGIN\n"
2256                "  NESTED_FOO_BEGIN\n"
2257                "    NESTED_FOO_ENTRY\n"
2258                "  NESTED_FOO_END\n"
2259                "FOO_END", Style);
2260   verifyFormat("FOO_BEGIN(Foo, Bar)\n"
2261                "  int x;\n"
2262                "  x = 1;\n"
2263                "FOO_END(Baz)", Style);
2264 }
2265 
2266 //===----------------------------------------------------------------------===//
2267 // Line break tests.
2268 //===----------------------------------------------------------------------===//
2269 
2270 TEST_F(FormatTest, PreventConfusingIndents) {
2271   verifyFormat(
2272       "void f() {\n"
2273       "  SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
2274       "                         parameter, parameter, parameter)),\n"
2275       "                     SecondLongCall(parameter));\n"
2276       "}");
2277   verifyFormat(
2278       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2279       "    aaaaaaaaaaaaaaaaaaaaaaaa(\n"
2280       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
2281       "    aaaaaaaaaaaaaaaaaaaaaaaa);");
2282   verifyFormat(
2283       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2284       "    [aaaaaaaaaaaaaaaaaaaaaaaa\n"
2285       "         [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
2286       "         [aaaaaaaaaaaaaaaaaaaaaaaa]];");
2287   verifyFormat(
2288       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
2289       "    aaaaaaaaaaaaaaaaaaaaaaaa<\n"
2290       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n"
2291       "    aaaaaaaaaaaaaaaaaaaaaaaa>;");
2292   verifyFormat("int a = bbbb && ccc &&\n"
2293                "        fffff(\n"
2294                "#define A Just forcing a new line\n"
2295                "            ddd);");
2296 }
2297 
2298 TEST_F(FormatTest, LineBreakingInBinaryExpressions) {
2299   verifyFormat(
2300       "bool aaaaaaa =\n"
2301       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n"
2302       "    bbbbbbbb();");
2303   verifyFormat(
2304       "bool aaaaaaa =\n"
2305       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n"
2306       "    bbbbbbbb();");
2307 
2308   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
2309                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n"
2310                "    ccccccccc == ddddddddddd;");
2311   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
2312                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n"
2313                "    ccccccccc == ddddddddddd;");
2314   verifyFormat(
2315       "bool aaaaaaaaaaaaaaaaaaaaa =\n"
2316       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n"
2317       "    ccccccccc == ddddddddddd;");
2318 
2319   verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
2320                "                 aaaaaa) &&\n"
2321                "         bbbbbb && cccccc;");
2322   verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
2323                "                 aaaaaa) >>\n"
2324                "         bbbbbb;");
2325   verifyFormat("aa = Whitespaces.addUntouchableComment(\n"
2326                "    SourceMgr.getSpellingColumnNumber(\n"
2327                "        TheLine.Last->FormatTok.Tok.getLocation()) -\n"
2328                "    1);");
2329 
2330   verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
2331                "     bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n"
2332                "    cccccc) {\n}");
2333   verifyFormat("b = a &&\n"
2334                "    // Comment\n"
2335                "    b.c && d;");
2336 
2337   // If the LHS of a comparison is not a binary expression itself, the
2338   // additional linebreak confuses many people.
2339   verifyFormat(
2340       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2341       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n"
2342       "}");
2343   verifyFormat(
2344       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2345       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
2346       "}");
2347   verifyFormat(
2348       "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n"
2349       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
2350       "}");
2351   // Even explicit parentheses stress the precedence enough to make the
2352   // additional break unnecessary.
2353   verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2354                "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
2355                "}");
2356   // This cases is borderline, but with the indentation it is still readable.
2357   verifyFormat(
2358       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2359       "        aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2360       "                               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
2361       "}",
2362       getLLVMStyleWithColumns(75));
2363 
2364   // If the LHS is a binary expression, we should still use the additional break
2365   // as otherwise the formatting hides the operator precedence.
2366   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2367                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2368                "    5) {\n"
2369                "}");
2370 
2371   FormatStyle OnePerLine = getLLVMStyle();
2372   OnePerLine.BinPackParameters = false;
2373   verifyFormat(
2374       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
2375       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
2376       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}",
2377       OnePerLine);
2378 
2379   verifyFormat("int i = someFunction(aaaaaaa, 0)\n"
2380                "                .aaa(aaaaaaaaaaaaa) *\n"
2381                "            aaaaaaa +\n"
2382                "        aaaaaaa;",
2383                getLLVMStyleWithColumns(40));
2384 }
2385 
2386 TEST_F(FormatTest, ExpressionIndentation) {
2387   verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2388                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2389                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2390                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2391                "                         bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
2392                "                     bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n"
2393                "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2394                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n"
2395                "                 ccccccccccccccccccccccccccccccccccccccccc;");
2396   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2397                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2398                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2399                "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
2400   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2401                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2402                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2403                "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
2404   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
2405                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
2406                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2407                "        bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
2408   verifyFormat("if () {\n"
2409                "} else if (aaaaa && bbbbb > // break\n"
2410                "                        ccccc) {\n"
2411                "}");
2412   verifyFormat("if () {\n"
2413                "} else if (aaaaa &&\n"
2414                "           bbbbb > // break\n"
2415                "               ccccc &&\n"
2416                "           ddddd) {\n"
2417                "}");
2418 
2419   // Presence of a trailing comment used to change indentation of b.
2420   verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n"
2421                "       b;\n"
2422                "return aaaaaaaaaaaaaaaaaaa +\n"
2423                "       b; //",
2424                getLLVMStyleWithColumns(30));
2425 }
2426 
2427 TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) {
2428   // Not sure what the best system is here. Like this, the LHS can be found
2429   // immediately above an operator (everything with the same or a higher
2430   // indent). The RHS is aligned right of the operator and so compasses
2431   // everything until something with the same indent as the operator is found.
2432   // FIXME: Is this a good system?
2433   FormatStyle Style = getLLVMStyle();
2434   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
2435   verifyFormat(
2436       "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2437       "                     + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2438       "                     + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2439       "                 == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2440       "                            * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2441       "                        + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2442       "             && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2443       "                        * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2444       "                    > ccccccccccccccccccccccccccccccccccccccccc;",
2445       Style);
2446   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2447                "            * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2448                "        + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2449                "    == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
2450                Style);
2451   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2452                "        + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2453                "              * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2454                "    == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
2455                Style);
2456   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2457                "    == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2458                "               * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2459                "           + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
2460                Style);
2461   verifyFormat("if () {\n"
2462                "} else if (aaaaa\n"
2463                "           && bbbbb // break\n"
2464                "                  > ccccc) {\n"
2465                "}",
2466                Style);
2467   verifyFormat("return (a)\n"
2468                "       // comment\n"
2469                "       + b;",
2470                Style);
2471   verifyFormat(
2472       "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2473       "                 * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2474       "             + cc;",
2475       Style);
2476 
2477   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2478                "    = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
2479                Style);
2480 
2481   // Forced by comments.
2482   verifyFormat(
2483       "unsigned ContentSize =\n"
2484       "    sizeof(int16_t)   // DWARF ARange version number\n"
2485       "    + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
2486       "    + sizeof(int8_t)  // Pointer Size (in bytes)\n"
2487       "    + sizeof(int8_t); // Segment Size (in bytes)");
2488 
2489   verifyFormat("return boost::fusion::at_c<0>(iiii).second\n"
2490                "       == boost::fusion::at_c<1>(iiii).second;",
2491                Style);
2492 
2493   Style.ColumnLimit = 60;
2494   verifyFormat("zzzzzzzzzz\n"
2495                "    = bbbbbbbbbbbbbbbbb\n"
2496                "      >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);",
2497                Style);
2498 }
2499 
2500 TEST_F(FormatTest, EnforcedOperatorWraps) {
2501   // Here we'd like to wrap after the || operators, but a comment is forcing an
2502   // earlier wrap.
2503   verifyFormat("bool x = aaaaa //\n"
2504                "         || bbbbb\n"
2505                "         //\n"
2506                "         || cccc;");
2507 }
2508 
2509 TEST_F(FormatTest, NoOperandAlignment) {
2510   FormatStyle Style = getLLVMStyle();
2511   Style.AlignOperands = false;
2512   verifyFormat("aaaaaaaaaaaaaa(aaaaaaaaaaaa,\n"
2513                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
2514                "                   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
2515                Style);
2516   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
2517   verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2518                "            + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2519                "            + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2520                "        == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2521                "                * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2522                "            + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2523                "    && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2524                "            * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2525                "        > ccccccccccccccccccccccccccccccccccccccccc;",
2526                Style);
2527 
2528   verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2529                "        * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2530                "    + cc;",
2531                Style);
2532   verifyFormat("int a = aa\n"
2533                "    + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
2534                "        * cccccccccccccccccccccccccccccccccccc;\n",
2535                Style);
2536 
2537   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
2538   verifyFormat("return (a > b\n"
2539                "    // comment1\n"
2540                "    // comment2\n"
2541                "    || c);",
2542                Style);
2543 }
2544 
2545 TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) {
2546   FormatStyle Style = getLLVMStyle();
2547   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
2548   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
2549                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2550                "    + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
2551                Style);
2552 }
2553 
2554 TEST_F(FormatTest, ConstructorInitializers) {
2555   verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
2556   verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}",
2557                getLLVMStyleWithColumns(45));
2558   verifyFormat("Constructor()\n"
2559                "    : Inttializer(FitsOnTheLine) {}",
2560                getLLVMStyleWithColumns(44));
2561   verifyFormat("Constructor()\n"
2562                "    : Inttializer(FitsOnTheLine) {}",
2563                getLLVMStyleWithColumns(43));
2564 
2565   verifyFormat("template <typename T>\n"
2566                "Constructor() : Initializer(FitsOnTheLine) {}",
2567                getLLVMStyleWithColumns(45));
2568 
2569   verifyFormat(
2570       "SomeClass::Constructor()\n"
2571       "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
2572 
2573   verifyFormat(
2574       "SomeClass::Constructor()\n"
2575       "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
2576       "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}");
2577   verifyFormat(
2578       "SomeClass::Constructor()\n"
2579       "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
2580       "      aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
2581   verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2582                "            aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
2583                "    : aaaaaaaaaa(aaaaaa) {}");
2584 
2585   verifyFormat("Constructor()\n"
2586                "    : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
2587                "      aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2588                "                               aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
2589                "      aaaaaaaaaaaaaaaaaaaaaaa() {}");
2590 
2591   verifyFormat("Constructor()\n"
2592                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2593                "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
2594 
2595   verifyFormat("Constructor(int Parameter = 0)\n"
2596                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
2597                "      aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}");
2598   verifyFormat("Constructor()\n"
2599                "    : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
2600                "}",
2601                getLLVMStyleWithColumns(60));
2602   verifyFormat("Constructor()\n"
2603                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2604                "          aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}");
2605 
2606   // Here a line could be saved by splitting the second initializer onto two
2607   // lines, but that is not desirable.
2608   verifyFormat("Constructor()\n"
2609                "    : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
2610                "      aaaaaaaaaaa(aaaaaaaaaaa),\n"
2611                "      aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
2612 
2613   FormatStyle OnePerLine = getLLVMStyle();
2614   OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
2615   OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
2616   verifyFormat("SomeClass::Constructor()\n"
2617                "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
2618                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
2619                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
2620                OnePerLine);
2621   verifyFormat("SomeClass::Constructor()\n"
2622                "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
2623                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
2624                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
2625                OnePerLine);
2626   verifyFormat("MyClass::MyClass(int var)\n"
2627                "    : some_var_(var),            // 4 space indent\n"
2628                "      some_other_var_(var + 1) { // lined up\n"
2629                "}",
2630                OnePerLine);
2631   verifyFormat("Constructor()\n"
2632                "    : aaaaa(aaaaaa),\n"
2633                "      aaaaa(aaaaaa),\n"
2634                "      aaaaa(aaaaaa),\n"
2635                "      aaaaa(aaaaaa),\n"
2636                "      aaaaa(aaaaaa) {}",
2637                OnePerLine);
2638   verifyFormat("Constructor()\n"
2639                "    : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
2640                "            aaaaaaaaaaaaaaaaaaaaaa) {}",
2641                OnePerLine);
2642   OnePerLine.BinPackParameters = false;
2643   verifyFormat(
2644       "Constructor()\n"
2645       "    : aaaaaaaaaaaaaaaaaaaaaaaa(\n"
2646       "          aaaaaaaaaaa().aaa(),\n"
2647       "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
2648       OnePerLine);
2649   OnePerLine.ColumnLimit = 60;
2650   verifyFormat("Constructor()\n"
2651                "    : aaaaaaaaaaaaaaaaaaaa(a),\n"
2652                "      bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
2653                OnePerLine);
2654 
2655   EXPECT_EQ("Constructor()\n"
2656             "    : // Comment forcing unwanted break.\n"
2657             "      aaaa(aaaa) {}",
2658             format("Constructor() :\n"
2659                    "    // Comment forcing unwanted break.\n"
2660                    "    aaaa(aaaa) {}"));
2661 }
2662 
2663 TEST_F(FormatTest, MemoizationTests) {
2664   // This breaks if the memoization lookup does not take \c Indent and
2665   // \c LastSpace into account.
2666   verifyFormat(
2667       "extern CFRunLoopTimerRef\n"
2668       "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n"
2669       "                     CFTimeInterval interval, CFOptionFlags flags,\n"
2670       "                     CFIndex order, CFRunLoopTimerCallBack callout,\n"
2671       "                     CFRunLoopTimerContext *context) {}");
2672 
2673   // Deep nesting somewhat works around our memoization.
2674   verifyFormat(
2675       "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
2676       "    aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
2677       "        aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
2678       "            aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
2679       "                aaaaa())))))))))))))))))))))))))))))))))))))));",
2680       getLLVMStyleWithColumns(65));
2681   verifyFormat(
2682       "aaaaa(\n"
2683       "    aaaaa,\n"
2684       "    aaaaa(\n"
2685       "        aaaaa,\n"
2686       "        aaaaa(\n"
2687       "            aaaaa,\n"
2688       "            aaaaa(\n"
2689       "                aaaaa,\n"
2690       "                aaaaa(\n"
2691       "                    aaaaa,\n"
2692       "                    aaaaa(\n"
2693       "                        aaaaa,\n"
2694       "                        aaaaa(\n"
2695       "                            aaaaa,\n"
2696       "                            aaaaa(\n"
2697       "                                aaaaa,\n"
2698       "                                aaaaa(\n"
2699       "                                    aaaaa,\n"
2700       "                                    aaaaa(\n"
2701       "                                        aaaaa,\n"
2702       "                                        aaaaa(\n"
2703       "                                            aaaaa,\n"
2704       "                                            aaaaa(\n"
2705       "                                                aaaaa,\n"
2706       "                                                aaaaa))))))))))));",
2707       getLLVMStyleWithColumns(65));
2708   verifyFormat(
2709       "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"
2710       "                                  a),\n"
2711       "                                a),\n"
2712       "                              a),\n"
2713       "                            a),\n"
2714       "                          a),\n"
2715       "                        a),\n"
2716       "                      a),\n"
2717       "                    a),\n"
2718       "                  a),\n"
2719       "                a),\n"
2720       "              a),\n"
2721       "            a),\n"
2722       "          a),\n"
2723       "        a),\n"
2724       "      a),\n"
2725       "    a),\n"
2726       "  a)",
2727       getLLVMStyleWithColumns(65));
2728 
2729   // This test takes VERY long when memoization is broken.
2730   FormatStyle OnePerLine = getLLVMStyle();
2731   OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
2732   OnePerLine.BinPackParameters = false;
2733   std::string input = "Constructor()\n"
2734                       "    : aaaa(a,\n";
2735   for (unsigned i = 0, e = 80; i != e; ++i) {
2736     input += "           a,\n";
2737   }
2738   input += "           a) {}";
2739   verifyFormat(input, OnePerLine);
2740 }
2741 
2742 TEST_F(FormatTest, BreaksAsHighAsPossible) {
2743   verifyFormat(
2744       "void f() {\n"
2745       "  if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
2746       "      (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
2747       "    f();\n"
2748       "}");
2749   verifyFormat("if (Intervals[i].getRange().getFirst() <\n"
2750                "    Intervals[i - 1].getRange().getLast()) {\n}");
2751 }
2752 
2753 TEST_F(FormatTest, BreaksFunctionDeclarations) {
2754   // Principially, we break function declarations in a certain order:
2755   // 1) break amongst arguments.
2756   verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n"
2757                "                              Cccccccccccccc cccccccccccccc);");
2758   verifyFormat("template <class TemplateIt>\n"
2759                "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n"
2760                "                            TemplateIt *stop) {}");
2761 
2762   // 2) break after return type.
2763   verifyFormat(
2764       "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2765       "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);",
2766       getGoogleStyle());
2767 
2768   // 3) break after (.
2769   verifyFormat(
2770       "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n"
2771       "    Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);",
2772       getGoogleStyle());
2773 
2774   // 4) break before after nested name specifiers.
2775   verifyFormat(
2776       "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2777       "SomeClasssssssssssssssssssssssssssssssssssssss::\n"
2778       "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);",
2779       getGoogleStyle());
2780 
2781   // However, there are exceptions, if a sufficient amount of lines can be
2782   // saved.
2783   // FIXME: The precise cut-offs wrt. the number of saved lines might need some
2784   // more adjusting.
2785   verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
2786                "                                  Cccccccccccccc cccccccccc,\n"
2787                "                                  Cccccccccccccc cccccccccc,\n"
2788                "                                  Cccccccccccccc cccccccccc,\n"
2789                "                                  Cccccccccccccc cccccccccc);");
2790   verifyFormat(
2791       "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2792       "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
2793       "            Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
2794       "            Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);",
2795       getGoogleStyle());
2796   verifyFormat(
2797       "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
2798       "                                          Cccccccccccccc cccccccccc,\n"
2799       "                                          Cccccccccccccc cccccccccc,\n"
2800       "                                          Cccccccccccccc cccccccccc,\n"
2801       "                                          Cccccccccccccc cccccccccc,\n"
2802       "                                          Cccccccccccccc cccccccccc,\n"
2803       "                                          Cccccccccccccc cccccccccc);");
2804   verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
2805                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
2806                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
2807                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
2808                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
2809 
2810   // Break after multi-line parameters.
2811   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2812                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2813                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2814                "    bbbb bbbb);");
2815   verifyFormat("void SomeLoooooooooooongFunction(\n"
2816                "    std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
2817                "        aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2818                "    int bbbbbbbbbbbbb);");
2819 
2820   // Treat overloaded operators like other functions.
2821   verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
2822                "operator>(const SomeLoooooooooooooooooooooooooogType &other);");
2823   verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
2824                "operator>>(const SomeLooooooooooooooooooooooooogType &other);");
2825   verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
2826                "operator<<(const SomeLooooooooooooooooooooooooogType &other);");
2827   verifyGoogleFormat(
2828       "SomeLoooooooooooooooooooooooooooooogType operator>>(\n"
2829       "    const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
2830   verifyGoogleFormat(
2831       "SomeLoooooooooooooooooooooooooooooogType operator<<(\n"
2832       "    const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
2833   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2834                "    int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);");
2835   verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n"
2836                "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);");
2837   verifyGoogleFormat(
2838       "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n"
2839       "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2840       "    bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}");
2841   verifyGoogleFormat(
2842       "template <typename T>\n"
2843       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2844       "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n"
2845       "    aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);");
2846 
2847   FormatStyle Style = getLLVMStyle();
2848   Style.PointerAlignment = FormatStyle::PAS_Left;
2849   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2850                "    aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}",
2851                Style);
2852   verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n"
2853                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
2854                Style);
2855 }
2856 
2857 TEST_F(FormatTest, TrailingReturnType) {
2858   verifyFormat("auto foo() -> int;\n");
2859   verifyFormat("struct S {\n"
2860                "  auto bar() const -> int;\n"
2861                "};");
2862   verifyFormat("template <size_t Order, typename T>\n"
2863                "auto load_img(const std::string &filename)\n"
2864                "    -> alias::tensor<Order, T, mem::tag::cpu> {}");
2865   verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n"
2866                "    -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}");
2867   verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}");
2868   verifyFormat("template <typename T>\n"
2869                "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n"
2870                "    -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());");
2871 
2872   // Not trailing return types.
2873   verifyFormat("void f() { auto a = b->c(); }");
2874 }
2875 
2876 TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) {
2877   // Avoid breaking before trailing 'const' or other trailing annotations, if
2878   // they are not function-like.
2879   FormatStyle Style = getGoogleStyle();
2880   Style.ColumnLimit = 47;
2881   verifyFormat("void someLongFunction(\n"
2882                "    int someLoooooooooooooongParameter) const {\n}",
2883                getLLVMStyleWithColumns(47));
2884   verifyFormat("LoooooongReturnType\n"
2885                "someLoooooooongFunction() const {}",
2886                getLLVMStyleWithColumns(47));
2887   verifyFormat("LoooooongReturnType someLoooooooongFunction()\n"
2888                "    const {}",
2889                Style);
2890   verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
2891                "                  aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;");
2892   verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
2893                "                  aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;");
2894   verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
2895                "                  aaaaa aaaaaaaaaaaaaaaaaaaa) override final;");
2896   verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n"
2897                "                   aaaaaaaaaaa aaaaa) const override;");
2898   verifyGoogleFormat(
2899       "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
2900       "    const override;");
2901 
2902   // Even if the first parameter has to be wrapped.
2903   verifyFormat("void someLongFunction(\n"
2904                "    int someLongParameter) const {}",
2905                getLLVMStyleWithColumns(46));
2906   verifyFormat("void someLongFunction(\n"
2907                "    int someLongParameter) const {}",
2908                Style);
2909   verifyFormat("void someLongFunction(\n"
2910                "    int someLongParameter) override {}",
2911                Style);
2912   verifyFormat("void someLongFunction(\n"
2913                "    int someLongParameter) OVERRIDE {}",
2914                Style);
2915   verifyFormat("void someLongFunction(\n"
2916                "    int someLongParameter) final {}",
2917                Style);
2918   verifyFormat("void someLongFunction(\n"
2919                "    int someLongParameter) FINAL {}",
2920                Style);
2921   verifyFormat("void someLongFunction(\n"
2922                "    int parameter) const override {}",
2923                Style);
2924 
2925   Style.BreakBeforeBraces = FormatStyle::BS_Allman;
2926   verifyFormat("void someLongFunction(\n"
2927                "    int someLongParameter) const\n"
2928                "{\n"
2929                "}",
2930                Style);
2931 
2932   // Unless these are unknown annotations.
2933   verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n"
2934                "                  aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
2935                "    LONG_AND_UGLY_ANNOTATION;");
2936 
2937   // Breaking before function-like trailing annotations is fine to keep them
2938   // close to their arguments.
2939   verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
2940                "    LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
2941   verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
2942                "    LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
2943   verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
2944                "    LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}");
2945   verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n"
2946                      "    AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);");
2947   verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});");
2948 
2949   verifyFormat(
2950       "void aaaaaaaaaaaaaaaaaa()\n"
2951       "    __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n"
2952       "                   aaaaaaaaaaaaaaaaaaaaaaaaa));");
2953   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2954                "    __attribute__((unused));");
2955   verifyGoogleFormat(
2956       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2957       "    GUARDED_BY(aaaaaaaaaaaa);");
2958   verifyGoogleFormat(
2959       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2960       "    GUARDED_BY(aaaaaaaaaaaa);");
2961   verifyGoogleFormat(
2962       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
2963       "    aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
2964   verifyGoogleFormat(
2965       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
2966       "    aaaaaaaaaaaaaaaaaaaaaaaaa;");
2967 }
2968 
2969 TEST_F(FormatTest, FunctionAnnotations) {
2970   verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
2971                "int OldFunction(const string &parameter) {}");
2972   verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
2973                "string OldFunction(const string &parameter) {}");
2974   verifyFormat("template <typename T>\n"
2975                "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
2976                "string OldFunction(const string &parameter) {}");
2977 
2978   // Not function annotations.
2979   verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
2980                "                << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
2981   verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n"
2982                "       ThisIsATestWithAReallyReallyReallyReallyLongName) {}");
2983   verifyFormat("MACRO(abc).function() // wrap\n"
2984                "    << abc;");
2985   verifyFormat("MACRO(abc)->function() // wrap\n"
2986                "    << abc;");
2987   verifyFormat("MACRO(abc)::function() // wrap\n"
2988                "    << abc;");
2989 }
2990 
2991 TEST_F(FormatTest, BreaksDesireably) {
2992   verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
2993                "    aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
2994                "    aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
2995   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
2996                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
2997                "}");
2998 
2999   verifyFormat(
3000       "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3001       "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
3002 
3003   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3004                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3005                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
3006 
3007   verifyFormat(
3008       "aaaaaaaa(aaaaaaaaaaaaa,\n"
3009       "         aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3010       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
3011       "         aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3012       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
3013 
3014   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3015                "    (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3016 
3017   verifyFormat(
3018       "void f() {\n"
3019       "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
3020       "                                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
3021       "}");
3022   verifyFormat(
3023       "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3024       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
3025   verifyFormat(
3026       "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3027       "                aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
3028   verifyFormat(
3029       "aaaaaa(aaa,\n"
3030       "       new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3031       "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3032       "       aaaa);");
3033   verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3034                "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3035                "                  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3036 
3037   // Indent consistently independent of call expression and unary operator.
3038   verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
3039                "    dddddddddddddddddddddddddddddd));");
3040   verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
3041                "    dddddddddddddddddddddddddddddd));");
3042   verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n"
3043                "    dddddddddddddddddddddddddddddd));");
3044 
3045   // This test case breaks on an incorrect memoization, i.e. an optimization not
3046   // taking into account the StopAt value.
3047   verifyFormat(
3048       "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
3049       "       aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
3050       "       aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
3051       "       (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3052 
3053   verifyFormat("{\n  {\n    {\n"
3054                "      Annotation.SpaceRequiredBefore =\n"
3055                "          Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
3056                "          Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
3057                "    }\n  }\n}");
3058 
3059   // Break on an outer level if there was a break on an inner level.
3060   EXPECT_EQ("f(g(h(a, // comment\n"
3061             "      b, c),\n"
3062             "    d, e),\n"
3063             "  x, y);",
3064             format("f(g(h(a, // comment\n"
3065                    "    b, c), d, e), x, y);"));
3066 
3067   // Prefer breaking similar line breaks.
3068   verifyFormat(
3069       "const int kTrackingOptions = NSTrackingMouseMoved |\n"
3070       "                             NSTrackingMouseEnteredAndExited |\n"
3071       "                             NSTrackingActiveAlways;");
3072 }
3073 
3074 TEST_F(FormatTest, FormatsDeclarationsOnePerLine) {
3075   FormatStyle NoBinPacking = getGoogleStyle();
3076   NoBinPacking.BinPackParameters = false;
3077   NoBinPacking.BinPackArguments = true;
3078   verifyFormat("void f() {\n"
3079                "  f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n"
3080                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
3081                "}",
3082                NoBinPacking);
3083   verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n"
3084                "       int aaaaaaaaaaaaaaaaaaaa,\n"
3085                "       int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3086                NoBinPacking);
3087 
3088   NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
3089   verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3090                "                        vector<int> bbbbbbbbbbbbbbb);",
3091                NoBinPacking);
3092   // FIXME: This behavior difference is probably not wanted. However, currently
3093   // we cannot distinguish BreakBeforeParameter being set because of the wrapped
3094   // template arguments from BreakBeforeParameter being set because of the
3095   // one-per-line formatting.
3096   verifyFormat(
3097       "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n"
3098       "                                             aaaaaaaaaa> aaaaaaaaaa);",
3099       NoBinPacking);
3100   verifyFormat(
3101       "void fffffffffff(\n"
3102       "    aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n"
3103       "        aaaaaaaaaa);");
3104 }
3105 
3106 TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) {
3107   FormatStyle NoBinPacking = getGoogleStyle();
3108   NoBinPacking.BinPackParameters = false;
3109   NoBinPacking.BinPackArguments = false;
3110   verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n"
3111                "  aaaaaaaaaaaaaaaaaaaa,\n"
3112                "  aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);",
3113                NoBinPacking);
3114   verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n"
3115                "        aaaaaaaaaaaaa,\n"
3116                "        aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));",
3117                NoBinPacking);
3118   verifyFormat(
3119       "aaaaaaaa(aaaaaaaaaaaaa,\n"
3120       "         aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3121       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
3122       "         aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3123       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));",
3124       NoBinPacking);
3125   verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
3126                "    .aaaaaaaaaaaaaaaaaa();",
3127                NoBinPacking);
3128   verifyFormat("void f() {\n"
3129                "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3130                "      aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n"
3131                "}",
3132                NoBinPacking);
3133 
3134   verifyFormat(
3135       "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3136       "             aaaaaaaaaaaa,\n"
3137       "             aaaaaaaaaaaa);",
3138       NoBinPacking);
3139   verifyFormat(
3140       "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n"
3141       "                               ddddddddddddddddddddddddddddd),\n"
3142       "             test);",
3143       NoBinPacking);
3144 
3145   verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n"
3146                "            aaaaaaaaaaaaaaaaaaaaaaa,\n"
3147                "            aaaaaaaaaaaaaaaaaaaaaaa>\n"
3148                "    aaaaaaaaaaaaaaaaaa;",
3149                NoBinPacking);
3150   verifyFormat("a(\"a\"\n"
3151                "  \"a\",\n"
3152                "  a);");
3153 
3154   NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
3155   verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n"
3156                "                aaaaaaaaa,\n"
3157                "                aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3158                NoBinPacking);
3159   verifyFormat(
3160       "void f() {\n"
3161       "  aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
3162       "      .aaaaaaa();\n"
3163       "}",
3164       NoBinPacking);
3165   verifyFormat(
3166       "template <class SomeType, class SomeOtherType>\n"
3167       "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}",
3168       NoBinPacking);
3169 }
3170 
3171 TEST_F(FormatTest, AdaptiveOnePerLineFormatting) {
3172   FormatStyle Style = getLLVMStyleWithColumns(15);
3173   Style.ExperimentalAutoDetectBinPacking = true;
3174   EXPECT_EQ("aaa(aaaa,\n"
3175             "    aaaa,\n"
3176             "    aaaa);\n"
3177             "aaa(aaaa,\n"
3178             "    aaaa,\n"
3179             "    aaaa);",
3180             format("aaa(aaaa,\n" // one-per-line
3181                    "  aaaa,\n"
3182                    "    aaaa  );\n"
3183                    "aaa(aaaa,  aaaa,  aaaa);", // inconclusive
3184                    Style));
3185   EXPECT_EQ("aaa(aaaa, aaaa,\n"
3186             "    aaaa);\n"
3187             "aaa(aaaa, aaaa,\n"
3188             "    aaaa);",
3189             format("aaa(aaaa,  aaaa,\n" // bin-packed
3190                    "    aaaa  );\n"
3191                    "aaa(aaaa,  aaaa,  aaaa);", // inconclusive
3192                    Style));
3193 }
3194 
3195 TEST_F(FormatTest, FormatsBuilderPattern) {
3196   verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n"
3197                "    .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n"
3198                "    .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n"
3199                "    .StartsWith(\".init\", ORDER_INIT)\n"
3200                "    .StartsWith(\".fini\", ORDER_FINI)\n"
3201                "    .StartsWith(\".hash\", ORDER_HASH)\n"
3202                "    .Default(ORDER_TEXT);\n");
3203 
3204   verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n"
3205                "       aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();");
3206   verifyFormat(
3207       "aaaaaaa->aaaaaaa\n"
3208       "    ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3209       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3210       "    ->aaaaaaaa(aaaaaaaaaaaaaaa);");
3211   verifyFormat(
3212       "aaaaaaa->aaaaaaa\n"
3213       "    ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3214       "    ->aaaaaaaa(aaaaaaaaaaaaaaa);");
3215   verifyFormat(
3216       "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"
3217       "    aaaaaaaaaaaaaa);");
3218   verifyFormat(
3219       "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n"
3220       "    aaaaaa->aaaaaaaaaaaa()\n"
3221       "        ->aaaaaaaaaaaaaaaa(\n"
3222       "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3223       "        ->aaaaaaaaaaaaaaaaa();");
3224   verifyGoogleFormat(
3225       "void f() {\n"
3226       "  someo->Add((new util::filetools::Handler(dir))\n"
3227       "                 ->OnEvent1(NewPermanentCallback(\n"
3228       "                     this, &HandlerHolderClass::EventHandlerCBA))\n"
3229       "                 ->OnEvent2(NewPermanentCallback(\n"
3230       "                     this, &HandlerHolderClass::EventHandlerCBB))\n"
3231       "                 ->OnEvent3(NewPermanentCallback(\n"
3232       "                     this, &HandlerHolderClass::EventHandlerCBC))\n"
3233       "                 ->OnEvent5(NewPermanentCallback(\n"
3234       "                     this, &HandlerHolderClass::EventHandlerCBD))\n"
3235       "                 ->OnEvent6(NewPermanentCallback(\n"
3236       "                     this, &HandlerHolderClass::EventHandlerCBE)));\n"
3237       "}");
3238 
3239   verifyFormat(
3240       "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();");
3241   verifyFormat("aaaaaaaaaaaaaaa()\n"
3242                "    .aaaaaaaaaaaaaaa()\n"
3243                "    .aaaaaaaaaaaaaaa()\n"
3244                "    .aaaaaaaaaaaaaaa()\n"
3245                "    .aaaaaaaaaaaaaaa();");
3246   verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
3247                "    .aaaaaaaaaaaaaaa()\n"
3248                "    .aaaaaaaaaaaaaaa()\n"
3249                "    .aaaaaaaaaaaaaaa();");
3250   verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
3251                "    .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
3252                "    .aaaaaaaaaaaaaaa();");
3253   verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n"
3254                "    ->aaaaaaaaaaaaaae(0)\n"
3255                "    ->aaaaaaaaaaaaaaa();");
3256 
3257   // Don't linewrap after very short segments.
3258   verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3259                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3260                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
3261   verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3262                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3263                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
3264   verifyFormat("aaa()\n"
3265                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3266                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3267                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
3268 
3269   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
3270                "    .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
3271                "    .has<bbbbbbbbbbbbbbbbbbbbb>();");
3272   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
3273                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
3274                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();");
3275 
3276   // Prefer not to break after empty parentheses.
3277   verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n"
3278                "    First->LastNewlineOffset);");
3279 
3280   // Prefer not to create "hanging" indents.
3281   verifyFormat(
3282       "return !soooooooooooooome_map\n"
3283       "            .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3284       "            .second;");
3285   verifyFormat(
3286       "return aaaaaaaaaaaaaaaa\n"
3287       "    .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n"
3288       "    .aaaa(aaaaaaaaaaaaaa);");
3289   // No hanging indent here.
3290   verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n"
3291                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3292   verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n"
3293                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3294   verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
3295                "    .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3296                getLLVMStyleWithColumns(60));
3297   verifyFormat("aaaaaaaaaaaaaaaaaa\n"
3298                "    .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
3299                "    .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3300                getLLVMStyleWithColumns(59));
3301   verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3302                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3303                "    .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3304 }
3305 
3306 TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
3307   verifyFormat(
3308       "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3309       "    bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
3310   verifyFormat(
3311       "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n"
3312       "    bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}");
3313 
3314   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
3315                "    ccccccccccccccccccccccccc) {\n}");
3316   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n"
3317                "    ccccccccccccccccccccccccc) {\n}");
3318 
3319   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
3320                "    ccccccccccccccccccccccccc) {\n}");
3321   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n"
3322                "    ccccccccccccccccccccccccc) {\n}");
3323 
3324   verifyFormat(
3325       "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
3326       "    ccccccccccccccccccccccccc) {\n}");
3327   verifyFormat(
3328       "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n"
3329       "    ccccccccccccccccccccccccc) {\n}");
3330 
3331   verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
3332                "       bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
3333                "       cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
3334                "       dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
3335   verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n"
3336                "       bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n"
3337                "       cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n"
3338                "       dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
3339 
3340   verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
3341                "     aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
3342                "    aaaaaaaaaaaaaaa != aa) {\n}");
3343   verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n"
3344                "     aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n"
3345                "    aaaaaaaaaaaaaaa != aa) {\n}");
3346 }
3347 
3348 TEST_F(FormatTest, BreaksAfterAssignments) {
3349   verifyFormat(
3350       "unsigned Cost =\n"
3351       "    TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
3352       "                        SI->getPointerAddressSpaceee());\n");
3353   verifyFormat(
3354       "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
3355       "    Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
3356 
3357   verifyFormat(
3358       "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n"
3359       "    aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
3360   verifyFormat("unsigned OriginalStartColumn =\n"
3361                "    SourceMgr.getSpellingColumnNumber(\n"
3362                "        Current.FormatTok.getStartOfNonWhitespace()) -\n"
3363                "    1;");
3364 }
3365 
3366 TEST_F(FormatTest, AlignsAfterAssignments) {
3367   verifyFormat(
3368       "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3369       "             aaaaaaaaaaaaaaaaaaaaaaaaa;");
3370   verifyFormat(
3371       "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3372       "          aaaaaaaaaaaaaaaaaaaaaaaaa;");
3373   verifyFormat(
3374       "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3375       "           aaaaaaaaaaaaaaaaaaaaaaaaa;");
3376   verifyFormat(
3377       "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3378       "              aaaaaaaaaaaaaaaaaaaaaaaaa);");
3379   verifyFormat(
3380       "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n"
3381       "                                            aaaaaaaaaaaaaaaaaaaaaaaa +\n"
3382       "                                            aaaaaaaaaaaaaaaaaaaaaaaa;");
3383 }
3384 
3385 TEST_F(FormatTest, AlignsAfterReturn) {
3386   verifyFormat(
3387       "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3388       "       aaaaaaaaaaaaaaaaaaaaaaaaa;");
3389   verifyFormat(
3390       "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3391       "        aaaaaaaaaaaaaaaaaaaaaaaaa);");
3392   verifyFormat(
3393       "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
3394       "       aaaaaaaaaaaaaaaaaaaaaa();");
3395   verifyFormat(
3396       "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
3397       "        aaaaaaaaaaaaaaaaaaaaaa());");
3398   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3399                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3400   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3401                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
3402                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
3403   verifyFormat("return\n"
3404                "    // true if code is one of a or b.\n"
3405                "    code == a || code == b;");
3406 }
3407 
3408 TEST_F(FormatTest, AlignsAfterOpenBracket) {
3409   verifyFormat(
3410       "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
3411       "                                                aaaaaaaaa aaaaaaa) {}");
3412   verifyFormat(
3413       "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
3414       "                                               aaaaaaaaaaa aaaaaaaaa);");
3415   verifyFormat(
3416       "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
3417       "                                             aaaaaaaaaaaaaaaaaaaaa));");
3418   FormatStyle Style = getLLVMStyle();
3419   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
3420   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3421                "    aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",
3422                Style);
3423   verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
3424                "    aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);",
3425                Style);
3426   verifyFormat("SomeLongVariableName->someFunction(\n"
3427                "    foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));",
3428                Style);
3429   verifyFormat(
3430       "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
3431       "    aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3432       Style);
3433   verifyFormat(
3434       "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
3435       "    aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3436       Style);
3437   verifyFormat(
3438       "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
3439       "    aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
3440       Style);
3441 
3442   verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n"
3443                "    ccccccc(aaaaaaaaaaaaaaaaa,         //\n"
3444                "        b));",
3445                Style);
3446 
3447   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
3448   Style.BinPackArguments = false;
3449   Style.BinPackParameters = false;
3450   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3451                "    aaaaaaaaaaa aaaaaaaa,\n"
3452                "    aaaaaaaaa aaaaaaa,\n"
3453                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3454                Style);
3455   verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
3456                "    aaaaaaaaaaa aaaaaaaaa,\n"
3457                "    aaaaaaaaaaa aaaaaaaaa,\n"
3458                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3459                Style);
3460   verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n"
3461                "    aaaaaaaaaaaaaaa,\n"
3462                "    aaaaaaaaaaaaaaaaaaaaa,\n"
3463                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
3464                Style);
3465   verifyFormat(
3466       "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n"
3467       "    aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
3468       Style);
3469   verifyFormat(
3470       "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n"
3471       "    aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
3472       Style);
3473   verifyFormat(
3474       "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3475       "    aaaaaaaaaaaaaaaaaaaaa(\n"
3476       "        aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n"
3477       "    aaaaaaaaaaaaaaaa);",
3478       Style);
3479   verifyFormat(
3480       "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3481       "    aaaaaaaaaaaaaaaaaaaaa(\n"
3482       "        aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
3483       "    aaaaaaaaaaaaaaaa);",
3484       Style);
3485 }
3486 
3487 TEST_F(FormatTest, ParenthesesAndOperandAlignment) {
3488   FormatStyle Style = getLLVMStyleWithColumns(40);
3489   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
3490                "          bbbbbbbbbbbbbbbbbbbbbb);",
3491                Style);
3492   Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
3493   Style.AlignOperands = false;
3494   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
3495                "          bbbbbbbbbbbbbbbbbbbbbb);",
3496                Style);
3497   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
3498   Style.AlignOperands = true;
3499   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
3500                "          bbbbbbbbbbbbbbbbbbbbbb);",
3501                Style);
3502   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
3503   Style.AlignOperands = false;
3504   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
3505                "    bbbbbbbbbbbbbbbbbbbbbb);",
3506                Style);
3507 }
3508 
3509 TEST_F(FormatTest, BreaksConditionalExpressions) {
3510   verifyFormat(
3511       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3512       "                               ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3513       "                               : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3514   verifyFormat(
3515       "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
3516       "     aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3517       "                                : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3518   verifyFormat(
3519       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3520       "                                   : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3521   verifyFormat(
3522       "aaaa(aaaaaaaaa, aaaaaaaaa,\n"
3523       "     aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3524       "             : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3525   verifyFormat(
3526       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
3527       "                                                    : aaaaaaaaaaaaa);");
3528   verifyFormat(
3529       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3530       "                   aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3531       "                                    : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3532       "                   aaaaaaaaaaaaa);");
3533   verifyFormat(
3534       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3535       "                   aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3536       "                   aaaaaaaaaaaaa);");
3537   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3538                "    ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3539                "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3540                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3541                "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3542   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3543                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3544                "           ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3545                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3546                "           : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3547                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3548                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3549   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3550                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3551                "           ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3552                "                  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3553                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
3554   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3555                "    ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3556                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
3557   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
3558                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3559                "        ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3560                "        : aaaaaaaaaaaaaaaa;");
3561   verifyFormat(
3562       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3563       "    ? aaaaaaaaaaaaaaa\n"
3564       "    : aaaaaaaaaaaaaaa;");
3565   verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
3566                "          aaaaaaaaa\n"
3567                "      ? b\n"
3568                "      : c);");
3569   verifyFormat("return aaaa == bbbb\n"
3570                "           // comment\n"
3571                "           ? aaaa\n"
3572                "           : bbbb;");
3573   verifyFormat("unsigned Indent =\n"
3574                "    format(TheLine.First,\n"
3575                "           IndentForLevel[TheLine.Level] >= 0\n"
3576                "               ? IndentForLevel[TheLine.Level]\n"
3577                "               : TheLine * 2,\n"
3578                "           TheLine.InPPDirective, PreviousEndOfLineColumn);",
3579                getLLVMStyleWithColumns(60));
3580   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
3581                "                  ? aaaaaaaaaaaaaaa\n"
3582                "                  : bbbbbbbbbbbbbbb //\n"
3583                "                        ? ccccccccccccccc\n"
3584                "                        : ddddddddddddddd;");
3585   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
3586                "                  ? aaaaaaaaaaaaaaa\n"
3587                "                  : (bbbbbbbbbbbbbbb //\n"
3588                "                         ? ccccccccccccccc\n"
3589                "                         : ddddddddddddddd);");
3590   verifyFormat(
3591       "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3592       "                                      ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3593       "                                            aaaaaaaaaaaaaaaaaaaaa +\n"
3594       "                                            aaaaaaaaaaaaaaaaaaaaa\n"
3595       "                                      : aaaaaaaaaa;");
3596   verifyFormat(
3597       "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3598       "                                   : aaaaaaaaaaaaaaaaaaaaaa\n"
3599       "                      : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
3600 
3601   FormatStyle NoBinPacking = getLLVMStyle();
3602   NoBinPacking.BinPackArguments = false;
3603   verifyFormat(
3604       "void f() {\n"
3605       "  g(aaa,\n"
3606       "    aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
3607       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3608       "        ? aaaaaaaaaaaaaaa\n"
3609       "        : aaaaaaaaaaaaaaa);\n"
3610       "}",
3611       NoBinPacking);
3612   verifyFormat(
3613       "void f() {\n"
3614       "  g(aaa,\n"
3615       "    aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
3616       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3617       "        ?: aaaaaaaaaaaaaaa);\n"
3618       "}",
3619       NoBinPacking);
3620 
3621   verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n"
3622                "             // comment.\n"
3623                "             ccccccccccccccccccccccccccccccccccccccc\n"
3624                "                 ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3625                "                 : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);");
3626 
3627   // Assignments in conditional expressions. Apparently not uncommon :-(.
3628   verifyFormat("return a != b\n"
3629                "           // comment\n"
3630                "           ? a = b\n"
3631                "           : a = b;");
3632   verifyFormat("return a != b\n"
3633                "           // comment\n"
3634                "           ? a = a != b\n"
3635                "                     // comment\n"
3636                "                     ? a = b\n"
3637                "                     : a\n"
3638                "           : a;\n");
3639   verifyFormat("return a != b\n"
3640                "           // comment\n"
3641                "           ? a\n"
3642                "           : a = a != b\n"
3643                "                     // comment\n"
3644                "                     ? a = b\n"
3645                "                     : a;");
3646 }
3647 
3648 TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {
3649   FormatStyle Style = getLLVMStyle();
3650   Style.BreakBeforeTernaryOperators = false;
3651   Style.ColumnLimit = 70;
3652   verifyFormat(
3653       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
3654       "                               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
3655       "                               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3656       Style);
3657   verifyFormat(
3658       "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
3659       "     aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
3660       "                                  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3661       Style);
3662   verifyFormat(
3663       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
3664       "                                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3665       Style);
3666   verifyFormat(
3667       "aaaa(aaaaaaaa, aaaaaaaaaa,\n"
3668       "     aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
3669       "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3670       Style);
3671   verifyFormat(
3672       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n"
3673       "                                                      aaaaaaaaaaaaa);",
3674       Style);
3675   verifyFormat(
3676       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3677       "                   aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
3678       "                                      aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3679       "                   aaaaaaaaaaaaa);",
3680       Style);
3681   verifyFormat(
3682       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3683       "                   aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3684       "                   aaaaaaaaaaaaa);",
3685       Style);
3686   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
3687                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3688                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
3689                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3690                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3691                Style);
3692   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3693                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
3694                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3695                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
3696                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3697                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3698                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3699                Style);
3700   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3701                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n"
3702                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3703                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3704                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3705                Style);
3706   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
3707                "    aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
3708                "    aaaaaaaaaaaaaaaaaaaaaaaaaaa;",
3709                Style);
3710   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
3711                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
3712                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
3713                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
3714                Style);
3715   verifyFormat(
3716       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
3717       "    aaaaaaaaaaaaaaa :\n"
3718       "    aaaaaaaaaaaaaaa;",
3719       Style);
3720   verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
3721                "          aaaaaaaaa ?\n"
3722                "      b :\n"
3723                "      c);",
3724                Style);
3725   verifyFormat("unsigned Indent =\n"
3726                "    format(TheLine.First,\n"
3727                "           IndentForLevel[TheLine.Level] >= 0 ?\n"
3728                "               IndentForLevel[TheLine.Level] :\n"
3729                "               TheLine * 2,\n"
3730                "           TheLine.InPPDirective, PreviousEndOfLineColumn);",
3731                Style);
3732   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
3733                "                  aaaaaaaaaaaaaaa :\n"
3734                "                  bbbbbbbbbbbbbbb ? //\n"
3735                "                      ccccccccccccccc :\n"
3736                "                      ddddddddddddddd;",
3737                Style);
3738   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
3739                "                  aaaaaaaaaaaaaaa :\n"
3740                "                  (bbbbbbbbbbbbbbb ? //\n"
3741                "                       ccccccccccccccc :\n"
3742                "                       ddddddddddddddd);",
3743                Style);
3744   verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
3745                "            /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n"
3746                "            ccccccccccccccccccccccccccc;",
3747                Style);
3748   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
3749                "           aaaaa :\n"
3750                "           bbbbbbbbbbbbbbb + cccccccccccccccc;",
3751                Style);
3752 }
3753 
3754 TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
3755   verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
3756                "     aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
3757   verifyFormat("bool a = true, b = false;");
3758 
3759   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
3760                "         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
3761                "     bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
3762                "         bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
3763   verifyFormat(
3764       "bool aaaaaaaaaaaaaaaaaaaaa =\n"
3765       "         bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
3766       "     d = e && f;");
3767   verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
3768                "          c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
3769   verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
3770                "          *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
3771   verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
3772                "          ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
3773 
3774   FormatStyle Style = getGoogleStyle();
3775   Style.PointerAlignment = FormatStyle::PAS_Left;
3776   Style.DerivePointerAlignment = false;
3777   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3778                "    *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
3779                "    *b = bbbbbbbbbbbbbbbbbbb;",
3780                Style);
3781   verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
3782                "          *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;",
3783                Style);
3784   verifyFormat("vector<int*> a, b;", Style);
3785   verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style);
3786 }
3787 
3788 TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
3789   verifyFormat("arr[foo ? bar : baz];");
3790   verifyFormat("f()[foo ? bar : baz];");
3791   verifyFormat("(a + b)[foo ? bar : baz];");
3792   verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
3793 }
3794 
3795 TEST_F(FormatTest, AlignsStringLiterals) {
3796   verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
3797                "                                      \"short literal\");");
3798   verifyFormat(
3799       "looooooooooooooooooooooooongFunction(\n"
3800       "    \"short literal\"\n"
3801       "    \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
3802   verifyFormat("someFunction(\"Always break between multi-line\"\n"
3803                "             \" string literals\",\n"
3804                "             and, other, parameters);");
3805   EXPECT_EQ("fun + \"1243\" /* comment */\n"
3806             "      \"5678\";",
3807             format("fun + \"1243\" /* comment */\n"
3808                    "    \"5678\";",
3809                    getLLVMStyleWithColumns(28)));
3810   EXPECT_EQ(
3811       "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
3812       "         \"aaaaaaaaaaaaaaaaaaaaa\"\n"
3813       "         \"aaaaaaaaaaaaaaaa\";",
3814       format("aaaaaa ="
3815              "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
3816              "aaaaaaaaaaaaaaaaaaaaa\" "
3817              "\"aaaaaaaaaaaaaaaa\";"));
3818   verifyFormat("a = a + \"a\"\n"
3819                "        \"a\"\n"
3820                "        \"a\";");
3821   verifyFormat("f(\"a\", \"b\"\n"
3822                "       \"c\");");
3823 
3824   verifyFormat(
3825       "#define LL_FORMAT \"ll\"\n"
3826       "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
3827       "       \"d, ddddddddd: %\" LL_FORMAT \"d\");");
3828 
3829   verifyFormat("#define A(X)          \\\n"
3830                "  \"aaaaa\" #X \"bbbbbb\" \\\n"
3831                "  \"ccccc\"",
3832                getLLVMStyleWithColumns(23));
3833   verifyFormat("#define A \"def\"\n"
3834                "f(\"abc\" A \"ghi\"\n"
3835                "  \"jkl\");");
3836 
3837   verifyFormat("f(L\"a\"\n"
3838                "  L\"b\");");
3839   verifyFormat("#define A(X)            \\\n"
3840                "  L\"aaaaa\" #X L\"bbbbbb\" \\\n"
3841                "  L\"ccccc\"",
3842                getLLVMStyleWithColumns(25));
3843 
3844   verifyFormat("f(@\"a\"\n"
3845                "  @\"b\");");
3846   verifyFormat("NSString s = @\"a\"\n"
3847                "             @\"b\"\n"
3848                "             @\"c\";");
3849   verifyFormat("NSString s = @\"a\"\n"
3850                "              \"b\"\n"
3851                "              \"c\";");
3852 }
3853 
3854 TEST_F(FormatTest, ReturnTypeBreakingStyle) {
3855   FormatStyle Style = getLLVMStyle();
3856   // No declarations or definitions should be moved to own line.
3857   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;
3858   verifyFormat("class A {\n"
3859                "  int f() { return 1; }\n"
3860                "  int g();\n"
3861                "};\n"
3862                "int f() { return 1; }\n"
3863                "int g();\n",
3864                Style);
3865 
3866   // All declarations and definitions should have the return type moved to its
3867   // own
3868   // line.
3869   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
3870   verifyFormat("class E {\n"
3871                "  int\n"
3872                "  f() {\n"
3873                "    return 1;\n"
3874                "  }\n"
3875                "  int\n"
3876                "  g();\n"
3877                "};\n"
3878                "int\n"
3879                "f() {\n"
3880                "  return 1;\n"
3881                "}\n"
3882                "int\n"
3883                "g();\n",
3884                Style);
3885 
3886   // Top-level definitions, and no kinds of declarations should have the
3887   // return type moved to its own line.
3888   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions;
3889   verifyFormat("class B {\n"
3890                "  int f() { return 1; }\n"
3891                "  int g();\n"
3892                "};\n"
3893                "int\n"
3894                "f() {\n"
3895                "  return 1;\n"
3896                "}\n"
3897                "int g();\n",
3898                Style);
3899 
3900   // Top-level definitions and declarations should have the return type moved
3901   // to its own line.
3902   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;
3903   verifyFormat("class C {\n"
3904                "  int f() { return 1; }\n"
3905                "  int g();\n"
3906                "};\n"
3907                "int\n"
3908                "f() {\n"
3909                "  return 1;\n"
3910                "}\n"
3911                "int\n"
3912                "g();\n",
3913                Style);
3914 
3915   // All definitions should have the return type moved to its own line, but no
3916   // kinds of declarations.
3917   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
3918   verifyFormat("class D {\n"
3919                "  int\n"
3920                "  f() {\n"
3921                "    return 1;\n"
3922                "  }\n"
3923                "  int g();\n"
3924                "};\n"
3925                "int\n"
3926                "f() {\n"
3927                "  return 1;\n"
3928                "}\n"
3929                "int g();\n",
3930                Style);
3931   verifyFormat("const char *\n"
3932                "f(void) {\n" // Break here.
3933                "  return \"\";\n"
3934                "}\n"
3935                "const char *bar(void);\n", // No break here.
3936                Style);
3937   verifyFormat("template <class T>\n"
3938                "T *\n"
3939                "f(T &c) {\n" // Break here.
3940                "  return NULL;\n"
3941                "}\n"
3942                "template <class T> T *f(T &c);\n", // No break here.
3943                Style);
3944   verifyFormat("class C {\n"
3945                "  int\n"
3946                "  operator+() {\n"
3947                "    return 1;\n"
3948                "  }\n"
3949                "  int\n"
3950                "  operator()() {\n"
3951                "    return 1;\n"
3952                "  }\n"
3953                "};\n",
3954                Style);
3955   verifyFormat("void\n"
3956                "A::operator()() {}\n"
3957                "void\n"
3958                "A::operator>>() {}\n"
3959                "void\n"
3960                "A::operator+() {}\n",
3961                Style);
3962   verifyFormat("void *operator new(std::size_t s);", // No break here.
3963                Style);
3964   verifyFormat("void *\n"
3965                "operator new(std::size_t s) {}",
3966                Style);
3967   verifyFormat("void *\n"
3968                "operator delete[](void *ptr) {}",
3969                Style);
3970   Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
3971   verifyFormat("const char *\n"
3972                "f(void)\n" // Break here.
3973                "{\n"
3974                "  return \"\";\n"
3975                "}\n"
3976                "const char *bar(void);\n", // No break here.
3977                Style);
3978   verifyFormat("template <class T>\n"
3979                "T *\n"     // Problem here: no line break
3980                "f(T &c)\n" // Break here.
3981                "{\n"
3982                "  return NULL;\n"
3983                "}\n"
3984                "template <class T> T *f(T &c);\n", // No break here.
3985                Style);
3986 }
3987 
3988 TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
3989   FormatStyle NoBreak = getLLVMStyle();
3990   NoBreak.AlwaysBreakBeforeMultilineStrings = false;
3991   FormatStyle Break = getLLVMStyle();
3992   Break.AlwaysBreakBeforeMultilineStrings = true;
3993   verifyFormat("aaaa = \"bbbb\"\n"
3994                "       \"cccc\";",
3995                NoBreak);
3996   verifyFormat("aaaa =\n"
3997                "    \"bbbb\"\n"
3998                "    \"cccc\";",
3999                Break);
4000   verifyFormat("aaaa(\"bbbb\"\n"
4001                "     \"cccc\");",
4002                NoBreak);
4003   verifyFormat("aaaa(\n"
4004                "    \"bbbb\"\n"
4005                "    \"cccc\");",
4006                Break);
4007   verifyFormat("aaaa(qqq, \"bbbb\"\n"
4008                "          \"cccc\");",
4009                NoBreak);
4010   verifyFormat("aaaa(qqq,\n"
4011                "     \"bbbb\"\n"
4012                "     \"cccc\");",
4013                Break);
4014   verifyFormat("aaaa(qqq,\n"
4015                "     L\"bbbb\"\n"
4016                "     L\"cccc\");",
4017                Break);
4018   verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n"
4019                "                      \"bbbb\"));",
4020                Break);
4021   verifyFormat("string s = someFunction(\n"
4022                "    \"abc\"\n"
4023                "    \"abc\");",
4024                Break);
4025 
4026   // As we break before unary operators, breaking right after them is bad.
4027   verifyFormat("string foo = abc ? \"x\"\n"
4028                "                   \"blah blah blah blah blah blah\"\n"
4029                "                 : \"y\";",
4030                Break);
4031 
4032   // Don't break if there is no column gain.
4033   verifyFormat("f(\"aaaa\"\n"
4034                "  \"bbbb\");",
4035                Break);
4036 
4037   // Treat literals with escaped newlines like multi-line string literals.
4038   EXPECT_EQ("x = \"a\\\n"
4039             "b\\\n"
4040             "c\";",
4041             format("x = \"a\\\n"
4042                    "b\\\n"
4043                    "c\";",
4044                    NoBreak));
4045   EXPECT_EQ("xxxx =\n"
4046             "    \"a\\\n"
4047             "b\\\n"
4048             "c\";",
4049             format("xxxx = \"a\\\n"
4050                    "b\\\n"
4051                    "c\";",
4052                    Break));
4053 
4054   // Exempt ObjC strings for now.
4055   EXPECT_EQ("NSString *const kString = @\"aaaa\"\n"
4056             "                          @\"bbbb\";",
4057             format("NSString *const kString = @\"aaaa\"\n"
4058                    "@\"bbbb\";",
4059                    Break));
4060 
4061   Break.ColumnLimit = 0;
4062   verifyFormat("const char *hello = \"hello llvm\";", Break);
4063 }
4064 
4065 TEST_F(FormatTest, AlignsPipes) {
4066   verifyFormat(
4067       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4068       "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4069       "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4070   verifyFormat(
4071       "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
4072       "                     << aaaaaaaaaaaaaaaaaaaa;");
4073   verifyFormat(
4074       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4075       "                                 << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4076   verifyFormat(
4077       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4078       "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4079   verifyFormat(
4080       "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
4081       "                \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
4082       "             << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
4083   verifyFormat(
4084       "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4085       "                                 << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4086       "         << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4087   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4088                "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4089                "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4090                "             << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
4091   verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n"
4092                "             << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);");
4093   verifyFormat(
4094       "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4095       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4096 
4097   verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n"
4098                "             << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();");
4099   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4100                "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4101                "                    aaaaaaaaaaaaaaaaaaaaa)\n"
4102                "             << aaaaaaaaaaaaaaaaaaaaaaaaaa;");
4103   verifyFormat("LOG_IF(aaa == //\n"
4104                "       bbb)\n"
4105                "    << a << b;");
4106 
4107   // But sometimes, breaking before the first "<<" is desirable.
4108   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
4109                "    << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);");
4110   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n"
4111                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4112                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4113   verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n"
4114                "    << BEF << IsTemplate << Description << E->getType();");
4115   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
4116                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4117                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4118   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
4119                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4120                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4121                "    << aaa;");
4122 
4123   verifyFormat(
4124       "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4125       "                    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4126 
4127   // Incomplete string literal.
4128   EXPECT_EQ("llvm::errs() << \"\n"
4129             "             << a;",
4130             format("llvm::errs() << \"\n<<a;"));
4131 
4132   verifyFormat("void f() {\n"
4133                "  CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n"
4134                "      << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n"
4135                "}");
4136 
4137   // Handle 'endl'.
4138   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n"
4139                "             << bbbbbbbbbbbbbbbbbbbbbb << endl;");
4140   verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;");
4141 
4142   // Handle '\n'.
4143   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n"
4144                "             << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
4145   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n"
4146                "             << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';");
4147   verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n"
4148                "             << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";");
4149   verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
4150 }
4151 
4152 TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) {
4153   verifyFormat("return out << \"somepacket = {\\n\"\n"
4154                "           << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
4155                "           << \" bbbb = \" << pkt.bbbb << \"\\n\"\n"
4156                "           << \" cccccc = \" << pkt.cccccc << \"\\n\"\n"
4157                "           << \" ddd = [\" << pkt.ddd << \"]\\n\"\n"
4158                "           << \"}\";");
4159 
4160   verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
4161                "             << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
4162                "             << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;");
4163   verifyFormat(
4164       "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
4165       "             << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
4166       "             << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
4167       "             << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
4168       "             << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
4169   verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
4170                "             << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
4171   verifyFormat(
4172       "void f() {\n"
4173       "  llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n"
4174       "               << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4175       "}");
4176 
4177   // Breaking before the first "<<" is generally not desirable.
4178   verifyFormat(
4179       "llvm::errs()\n"
4180       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4181       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4182       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4183       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4184       getLLVMStyleWithColumns(70));
4185   verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n"
4186                "             << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4187                "             << \"aaaaaaaaaaaaaaaaaaa: \"\n"
4188                "             << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4189                "             << \"aaaaaaaaaaaaaaaaaaa: \"\n"
4190                "             << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
4191                getLLVMStyleWithColumns(70));
4192 
4193   verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
4194                "           \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
4195                "           \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;");
4196   verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
4197                "                  \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
4198                "                  \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);");
4199   verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n"
4200                "           (aaaa + aaaa);",
4201                getLLVMStyleWithColumns(40));
4202   verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n"
4203                "                  (aaaaaaa + aaaaa));",
4204                getLLVMStyleWithColumns(40));
4205   verifyFormat(
4206       "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n"
4207       "                  SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n"
4208       "                  bbbbbbbbbbbbbbbbbbbbbbb);");
4209 }
4210 
4211 TEST_F(FormatTest, UnderstandsEquals) {
4212   verifyFormat(
4213       "aaaaaaaaaaaaaaaaa =\n"
4214       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4215   verifyFormat(
4216       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4217       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
4218   verifyFormat(
4219       "if (a) {\n"
4220       "  f();\n"
4221       "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4222       "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
4223       "}");
4224 
4225   verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4226                "        100000000 + 10000000) {\n}");
4227 }
4228 
4229 TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
4230   verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
4231                "    .looooooooooooooooooooooooooooooooooooooongFunction();");
4232 
4233   verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
4234                "    ->looooooooooooooooooooooooooooooooooooooongFunction();");
4235 
4236   verifyFormat(
4237       "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
4238       "                                                          Parameter2);");
4239 
4240   verifyFormat(
4241       "ShortObject->shortFunction(\n"
4242       "    LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
4243       "    LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
4244 
4245   verifyFormat("loooooooooooooongFunction(\n"
4246                "    LoooooooooooooongObject->looooooooooooooooongFunction());");
4247 
4248   verifyFormat(
4249       "function(LoooooooooooooooooooooooooooooooooooongObject\n"
4250       "             ->loooooooooooooooooooooooooooooooooooooooongFunction());");
4251 
4252   verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
4253                "    .WillRepeatedly(Return(SomeValue));");
4254   verifyFormat("void f() {\n"
4255                "  EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
4256                "      .Times(2)\n"
4257                "      .WillRepeatedly(Return(SomeValue));\n"
4258                "}");
4259   verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n"
4260                "    ccccccccccccccccccccccc);");
4261   verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4262                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4263                "          .aaaaa(aaaaa),\n"
4264                "      aaaaaaaaaaaaaaaaaaaaa);");
4265   verifyFormat("void f() {\n"
4266                "  aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4267                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n"
4268                "}");
4269   verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4270                "      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4271                "    .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4272                "                        aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4273                "                        aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4274   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4275                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4276                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4277                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
4278                "}");
4279 
4280   // Here, it is not necessary to wrap at "." or "->".
4281   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
4282                "    aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
4283   verifyFormat(
4284       "aaaaaaaaaaa->aaaaaaaaa(\n"
4285       "    aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4286       "    aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
4287 
4288   verifyFormat(
4289       "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4290       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
4291   verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
4292                "                         aaaaaaaaa()->aaaaaa()->aaaaa());");
4293   verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
4294                "                         aaaaaaaaa()->aaaaaa()->aaaaa());");
4295 
4296   verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4297                "      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4298                "    .a();");
4299 
4300   FormatStyle NoBinPacking = getLLVMStyle();
4301   NoBinPacking.BinPackParameters = false;
4302   verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
4303                "    .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
4304                "    .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
4305                "                         aaaaaaaaaaaaaaaaaaa,\n"
4306                "                         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4307                NoBinPacking);
4308 
4309   // If there is a subsequent call, change to hanging indentation.
4310   verifyFormat(
4311       "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4312       "                         aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n"
4313       "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4314   verifyFormat(
4315       "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4316       "    aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));");
4317   verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4318                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4319                "                 .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4320   verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4321                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4322                "               .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
4323 }
4324 
4325 TEST_F(FormatTest, WrapsTemplateDeclarations) {
4326   verifyFormat("template <typename T>\n"
4327                "virtual void loooooooooooongFunction(int Param1, int Param2);");
4328   verifyFormat("template <typename T>\n"
4329                "// T should be one of {A, B}.\n"
4330                "virtual void loooooooooooongFunction(int Param1, int Param2);");
4331   verifyFormat(
4332       "template <typename T>\n"
4333       "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
4334   verifyFormat("template <typename T>\n"
4335                "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
4336                "       int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
4337   verifyFormat(
4338       "template <typename T>\n"
4339       "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
4340       "                                      int Paaaaaaaaaaaaaaaaaaaaram2);");
4341   verifyFormat(
4342       "template <typename T>\n"
4343       "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
4344       "                    aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
4345       "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4346   verifyFormat("template <typename T>\n"
4347                "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4348                "    int aaaaaaaaaaaaaaaaaaaaaa);");
4349   verifyFormat(
4350       "template <typename T1, typename T2 = char, typename T3 = char,\n"
4351       "          typename T4 = char>\n"
4352       "void f();");
4353   verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n"
4354                "          template <typename> class cccccccccccccccccccccc,\n"
4355                "          typename ddddddddddddd>\n"
4356                "class C {};");
4357   verifyFormat(
4358       "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
4359       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4360 
4361   verifyFormat("void f() {\n"
4362                "  a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
4363                "      a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n"
4364                "}");
4365 
4366   verifyFormat("template <typename T> class C {};");
4367   verifyFormat("template <typename T> void f();");
4368   verifyFormat("template <typename T> void f() {}");
4369   verifyFormat(
4370       "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
4371       "              aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4372       "              aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n"
4373       "    new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
4374       "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4375       "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
4376       "        bbbbbbbbbbbbbbbbbbbbbbbb);",
4377       getLLVMStyleWithColumns(72));
4378   EXPECT_EQ("static_cast<A< //\n"
4379             "    B> *>(\n"
4380             "\n"
4381             "    );",
4382             format("static_cast<A<//\n"
4383                    "    B>*>(\n"
4384                    "\n"
4385                    "    );"));
4386   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4387                "    const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);");
4388 
4389   FormatStyle AlwaysBreak = getLLVMStyle();
4390   AlwaysBreak.AlwaysBreakTemplateDeclarations = true;
4391   verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);
4392   verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);
4393   verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);
4394   verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4395                "                         bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
4396                "    ccccccccccccccccccccccccccccccccccccccccccccccc);");
4397   verifyFormat("template <template <typename> class Fooooooo,\n"
4398                "          template <typename> class Baaaaaaar>\n"
4399                "struct C {};",
4400                AlwaysBreak);
4401   verifyFormat("template <typename T> // T can be A, B or C.\n"
4402                "struct C {};",
4403                AlwaysBreak);
4404   verifyFormat("template <enum E> class A {\n"
4405                "public:\n"
4406                "  E *f();\n"
4407                "};");
4408 }
4409 
4410 TEST_F(FormatTest, WrapsTemplateParameters) {
4411   FormatStyle Style = getLLVMStyle();
4412   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
4413   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
4414   verifyFormat(
4415       "template <typename... a> struct q {};\n"
4416       "extern q<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
4417       "    aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
4418       "    y;",
4419       Style);
4420   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
4421   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
4422   verifyFormat(
4423       "template <typename... a> struct r {};\n"
4424       "extern r<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
4425       "    aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
4426       "    y;",
4427       Style);
4428   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
4429   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
4430   verifyFormat(
4431       "template <typename... a> struct s {};\n"
4432       "extern s<\n"
4433       "    aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
4434       "    aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
4435       "    y;",
4436       Style);
4437   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
4438   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
4439   verifyFormat(
4440       "template <typename... a> struct t {};\n"
4441       "extern t<\n"
4442       "    aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
4443       "    aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
4444       "    y;",
4445       Style);
4446 }
4447 
4448 TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
4449   verifyFormat(
4450       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
4451       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4452   verifyFormat(
4453       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
4454       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4455       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
4456 
4457   // FIXME: Should we have the extra indent after the second break?
4458   verifyFormat(
4459       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
4460       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
4461       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4462 
4463   verifyFormat(
4464       "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
4465       "                    cccccccccccccccccccccccccccccccccccccccccccccc());");
4466 
4467   // Breaking at nested name specifiers is generally not desirable.
4468   verifyFormat(
4469       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4470       "    aaaaaaaaaaaaaaaaaaaaaaa);");
4471 
4472   verifyFormat(
4473       "aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n"
4474       "                   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
4475       "                       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4476       "                   aaaaaaaaaaaaaaaaaaaaa);",
4477       getLLVMStyleWithColumns(74));
4478 
4479   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
4480                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4481                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4482 }
4483 
4484 TEST_F(FormatTest, UnderstandsTemplateParameters) {
4485   verifyFormat("A<int> a;");
4486   verifyFormat("A<A<A<int>>> a;");
4487   verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
4488   verifyFormat("bool x = a < 1 || 2 > a;");
4489   verifyFormat("bool x = 5 < f<int>();");
4490   verifyFormat("bool x = f<int>() > 5;");
4491   verifyFormat("bool x = 5 < a<int>::x;");
4492   verifyFormat("bool x = a < 4 ? a > 2 : false;");
4493   verifyFormat("bool x = f() ? a < 2 : a > 2;");
4494 
4495   verifyGoogleFormat("A<A<int>> a;");
4496   verifyGoogleFormat("A<A<A<int>>> a;");
4497   verifyGoogleFormat("A<A<A<A<int>>>> a;");
4498   verifyGoogleFormat("A<A<int> > a;");
4499   verifyGoogleFormat("A<A<A<int> > > a;");
4500   verifyGoogleFormat("A<A<A<A<int> > > > a;");
4501   verifyGoogleFormat("A<::A<int>> a;");
4502   verifyGoogleFormat("A<::A> a;");
4503   verifyGoogleFormat("A< ::A> a;");
4504   verifyGoogleFormat("A< ::A<int> > a;");
4505   EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
4506   EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
4507   EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle()));
4508   EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle()));
4509   EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };",
4510             format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle()));
4511 
4512   verifyFormat("A<A>> a;", getChromiumStyle(FormatStyle::LK_Cpp));
4513 
4514   verifyFormat("test >> a >> b;");
4515   verifyFormat("test << a >> b;");
4516 
4517   verifyFormat("f<int>();");
4518   verifyFormat("template <typename T> void f() {}");
4519   verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;");
4520   verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : "
4521                "sizeof(char)>::type>;");
4522   verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};");
4523   verifyFormat("f(a.operator()<A>());");
4524   verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4525                "      .template operator()<A>());",
4526                getLLVMStyleWithColumns(35));
4527 
4528   // Not template parameters.
4529   verifyFormat("return a < b && c > d;");
4530   verifyFormat("void f() {\n"
4531                "  while (a < b && c > d) {\n"
4532                "  }\n"
4533                "}");
4534   verifyFormat("template <typename... Types>\n"
4535                "typename enable_if<0 < sizeof...(Types)>::type Foo() {}");
4536 
4537   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4538                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);",
4539                getLLVMStyleWithColumns(60));
4540   verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");");
4541   verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}");
4542   verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <");
4543 }
4544 
4545 TEST_F(FormatTest, BitshiftOperatorWidth) {
4546   EXPECT_EQ("int a = 1 << 2; /* foo\n"
4547             "                   bar */",
4548             format("int    a=1<<2;  /* foo\n"
4549                    "                   bar */"));
4550 
4551   EXPECT_EQ("int b = 256 >> 1; /* foo\n"
4552             "                     bar */",
4553             format("int  b  =256>>1 ;  /* foo\n"
4554                    "                      bar */"));
4555 }
4556 
4557 TEST_F(FormatTest, UnderstandsBinaryOperators) {
4558   verifyFormat("COMPARE(a, ==, b);");
4559   verifyFormat("auto s = sizeof...(Ts) - 1;");
4560 }
4561 
4562 TEST_F(FormatTest, UnderstandsPointersToMembers) {
4563   verifyFormat("int A::*x;");
4564   verifyFormat("int (S::*func)(void *);");
4565   verifyFormat("void f() { int (S::*func)(void *); }");
4566   verifyFormat("typedef bool *(Class::*Member)() const;");
4567   verifyFormat("void f() {\n"
4568                "  (a->*f)();\n"
4569                "  a->*x;\n"
4570                "  (a.*f)();\n"
4571                "  ((*a).*f)();\n"
4572                "  a.*x;\n"
4573                "}");
4574   verifyFormat("void f() {\n"
4575                "  (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
4576                "      aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
4577                "}");
4578   verifyFormat(
4579       "(aaaaaaaaaa->*bbbbbbb)(\n"
4580       "    aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4581   FormatStyle Style = getLLVMStyle();
4582   Style.PointerAlignment = FormatStyle::PAS_Left;
4583   verifyFormat("typedef bool* (Class::*Member)() const;", Style);
4584 }
4585 
4586 TEST_F(FormatTest, UnderstandsUnaryOperators) {
4587   verifyFormat("int a = -2;");
4588   verifyFormat("f(-1, -2, -3);");
4589   verifyFormat("a[-1] = 5;");
4590   verifyFormat("int a = 5 + -2;");
4591   verifyFormat("if (i == -1) {\n}");
4592   verifyFormat("if (i != -1) {\n}");
4593   verifyFormat("if (i > -1) {\n}");
4594   verifyFormat("if (i < -1) {\n}");
4595   verifyFormat("++(a->f());");
4596   verifyFormat("--(a->f());");
4597   verifyFormat("(a->f())++;");
4598   verifyFormat("a[42]++;");
4599   verifyFormat("if (!(a->f())) {\n}");
4600 
4601   verifyFormat("a-- > b;");
4602   verifyFormat("b ? -a : c;");
4603   verifyFormat("n * sizeof char16;");
4604   verifyFormat("n * alignof char16;", getGoogleStyle());
4605   verifyFormat("sizeof(char);");
4606   verifyFormat("alignof(char);", getGoogleStyle());
4607 
4608   verifyFormat("return -1;");
4609   verifyFormat("switch (a) {\n"
4610                "case -1:\n"
4611                "  break;\n"
4612                "}");
4613   verifyFormat("#define X -1");
4614   verifyFormat("#define X -kConstant");
4615 
4616   verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};");
4617   verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};");
4618 
4619   verifyFormat("int a = /* confusing comment */ -1;");
4620   // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
4621   verifyFormat("int a = i /* confusing comment */++;");
4622 }
4623 
4624 TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) {
4625   verifyFormat("if (!aaaaaaaaaa( // break\n"
4626                "        aaaaa)) {\n"
4627                "}");
4628   verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
4629                "    aaaaa));");
4630   verifyFormat("*aaa = aaaaaaa( // break\n"
4631                "    bbbbbb);");
4632 }
4633 
4634 TEST_F(FormatTest, UnderstandsOverloadedOperators) {
4635   verifyFormat("bool operator<();");
4636   verifyFormat("bool operator>();");
4637   verifyFormat("bool operator=();");
4638   verifyFormat("bool operator==();");
4639   verifyFormat("bool operator!=();");
4640   verifyFormat("int operator+();");
4641   verifyFormat("int operator++();");
4642   verifyFormat("bool operator,();");
4643   verifyFormat("bool operator();");
4644   verifyFormat("bool operator()();");
4645   verifyFormat("bool operator[]();");
4646   verifyFormat("operator bool();");
4647   verifyFormat("operator int();");
4648   verifyFormat("operator void *();");
4649   verifyFormat("operator SomeType<int>();");
4650   verifyFormat("operator SomeType<int, int>();");
4651   verifyFormat("operator SomeType<SomeType<int>>();");
4652   verifyFormat("void *operator new(std::size_t size);");
4653   verifyFormat("void *operator new[](std::size_t size);");
4654   verifyFormat("void operator delete(void *ptr);");
4655   verifyFormat("void operator delete[](void *ptr);");
4656   verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
4657                "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
4658   verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n"
4659                "    aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;");
4660 
4661   verifyFormat(
4662       "ostream &operator<<(ostream &OutputStream,\n"
4663       "                    SomeReallyLongType WithSomeReallyLongValue);");
4664   verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
4665                "               const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
4666                "  return left.group < right.group;\n"
4667                "}");
4668   verifyFormat("SomeType &operator=(const SomeType &S);");
4669   verifyFormat("f.template operator()<int>();");
4670 
4671   verifyGoogleFormat("operator void*();");
4672   verifyGoogleFormat("operator SomeType<SomeType<int>>();");
4673   verifyGoogleFormat("operator ::A();");
4674 
4675   verifyFormat("using A::operator+;");
4676   verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n"
4677                "int i;");
4678 }
4679 
4680 TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
4681   verifyFormat("Deleted &operator=(const Deleted &) & = default;");
4682   verifyFormat("Deleted &operator=(const Deleted &) && = delete;");
4683   verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;");
4684   verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;");
4685   verifyFormat("Deleted &operator=(const Deleted &) &;");
4686   verifyFormat("Deleted &operator=(const Deleted &) &&;");
4687   verifyFormat("SomeType MemberFunction(const Deleted &) &;");
4688   verifyFormat("SomeType MemberFunction(const Deleted &) &&;");
4689   verifyFormat("SomeType MemberFunction(const Deleted &) && {}");
4690   verifyFormat("SomeType MemberFunction(const Deleted &) && final {}");
4691   verifyFormat("SomeType MemberFunction(const Deleted &) && override {}");
4692   verifyFormat("SomeType MemberFunction(const Deleted &) const &;");
4693   verifyFormat("template <typename T>\n"
4694                "void F(T) && = delete;",
4695                getGoogleStyle());
4696 
4697   FormatStyle AlignLeft = getLLVMStyle();
4698   AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
4699   verifyFormat("void A::b() && {}", AlignLeft);
4700   verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
4701   verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
4702                AlignLeft);
4703   verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
4704   verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
4705   verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
4706   verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
4707   verifyFormat("auto Function(T) & -> void {}", AlignLeft);
4708   verifyFormat("auto Function(T) & -> void;", AlignLeft);
4709   verifyFormat("SomeType MemberFunction(const Deleted&) const &;", AlignLeft);
4710 
4711   FormatStyle Spaces = getLLVMStyle();
4712   Spaces.SpacesInCStyleCastParentheses = true;
4713   verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
4714   verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
4715   verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
4716   verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
4717 
4718   Spaces.SpacesInCStyleCastParentheses = false;
4719   Spaces.SpacesInParentheses = true;
4720   verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
4721   verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", Spaces);
4722   verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
4723   verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
4724 }
4725 
4726 TEST_F(FormatTest, UnderstandsNewAndDelete) {
4727   verifyFormat("void f() {\n"
4728                "  A *a = new A;\n"
4729                "  A *a = new (placement) A;\n"
4730                "  delete a;\n"
4731                "  delete (A *)a;\n"
4732                "}");
4733   verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
4734                "    typename aaaaaaaaaaaaaaaaaaaaaaaa();");
4735   verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
4736                "    new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
4737                "        typename aaaaaaaaaaaaaaaaaaaaaaaa();");
4738   verifyFormat("delete[] h->p;");
4739 }
4740 
4741 TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
4742   verifyFormat("int *f(int *a) {}");
4743   verifyFormat("int main(int argc, char **argv) {}");
4744   verifyFormat("Test::Test(int b) : a(b * b) {}");
4745   verifyIndependentOfContext("f(a, *a);");
4746   verifyFormat("void g() { f(*a); }");
4747   verifyIndependentOfContext("int a = b * 10;");
4748   verifyIndependentOfContext("int a = 10 * b;");
4749   verifyIndependentOfContext("int a = b * c;");
4750   verifyIndependentOfContext("int a += b * c;");
4751   verifyIndependentOfContext("int a -= b * c;");
4752   verifyIndependentOfContext("int a *= b * c;");
4753   verifyIndependentOfContext("int a /= b * c;");
4754   verifyIndependentOfContext("int a = *b;");
4755   verifyIndependentOfContext("int a = *b * c;");
4756   verifyIndependentOfContext("int a = b * *c;");
4757   verifyIndependentOfContext("int a = b * (10);");
4758   verifyIndependentOfContext("S << b * (10);");
4759   verifyIndependentOfContext("return 10 * b;");
4760   verifyIndependentOfContext("return *b * *c;");
4761   verifyIndependentOfContext("return a & ~b;");
4762   verifyIndependentOfContext("f(b ? *c : *d);");
4763   verifyIndependentOfContext("int a = b ? *c : *d;");
4764   verifyIndependentOfContext("*b = a;");
4765   verifyIndependentOfContext("a * ~b;");
4766   verifyIndependentOfContext("a * !b;");
4767   verifyIndependentOfContext("a * +b;");
4768   verifyIndependentOfContext("a * -b;");
4769   verifyIndependentOfContext("a * ++b;");
4770   verifyIndependentOfContext("a * --b;");
4771   verifyIndependentOfContext("a[4] * b;");
4772   verifyIndependentOfContext("a[a * a] = 1;");
4773   verifyIndependentOfContext("f() * b;");
4774   verifyIndependentOfContext("a * [self dostuff];");
4775   verifyIndependentOfContext("int x = a * (a + b);");
4776   verifyIndependentOfContext("(a *)(a + b);");
4777   verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
4778   verifyIndependentOfContext("int *pa = (int *)&a;");
4779   verifyIndependentOfContext("return sizeof(int **);");
4780   verifyIndependentOfContext("return sizeof(int ******);");
4781   verifyIndependentOfContext("return (int **&)a;");
4782   verifyIndependentOfContext("f((*PointerToArray)[10]);");
4783   verifyFormat("void f(Type (*parameter)[10]) {}");
4784   verifyFormat("void f(Type (&parameter)[10]) {}");
4785   verifyGoogleFormat("return sizeof(int**);");
4786   verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
4787   verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
4788   verifyFormat("auto a = [](int **&, int ***) {};");
4789   verifyFormat("auto PointerBinding = [](const char *S) {};");
4790   verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
4791   verifyFormat("[](const decltype(*a) &value) {}");
4792   verifyFormat("decltype(a * b) F();");
4793   verifyFormat("#define MACRO() [](A *a) { return 1; }");
4794   verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
4795   verifyIndependentOfContext("typedef void (*f)(int *a);");
4796   verifyIndependentOfContext("int i{a * b};");
4797   verifyIndependentOfContext("aaa && aaa->f();");
4798   verifyIndependentOfContext("int x = ~*p;");
4799   verifyFormat("Constructor() : a(a), area(width * height) {}");
4800   verifyFormat("Constructor() : a(a), area(a, width * height) {}");
4801   verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
4802   verifyFormat("void f() { f(a, c * d); }");
4803   verifyFormat("void f() { f(new a(), c * d); }");
4804   verifyFormat("void f(const MyOverride &override);");
4805   verifyFormat("void f(const MyFinal &final);");
4806   verifyIndependentOfContext("bool a = f() && override.f();");
4807   verifyIndependentOfContext("bool a = f() && final.f();");
4808 
4809   verifyIndependentOfContext("InvalidRegions[*R] = 0;");
4810 
4811   verifyIndependentOfContext("A<int *> a;");
4812   verifyIndependentOfContext("A<int **> a;");
4813   verifyIndependentOfContext("A<int *, int *> a;");
4814   verifyIndependentOfContext("A<int *[]> a;");
4815   verifyIndependentOfContext(
4816       "const char *const p = reinterpret_cast<const char *const>(q);");
4817   verifyIndependentOfContext("A<int **, int **> a;");
4818   verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
4819   verifyFormat("for (char **a = b; *a; ++a) {\n}");
4820   verifyFormat("for (; a && b;) {\n}");
4821   verifyFormat("bool foo = true && [] { return false; }();");
4822 
4823   verifyFormat(
4824       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4825       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4826 
4827   verifyGoogleFormat("int const* a = &b;");
4828   verifyGoogleFormat("**outparam = 1;");
4829   verifyGoogleFormat("*outparam = a * b;");
4830   verifyGoogleFormat("int main(int argc, char** argv) {}");
4831   verifyGoogleFormat("A<int*> a;");
4832   verifyGoogleFormat("A<int**> a;");
4833   verifyGoogleFormat("A<int*, int*> a;");
4834   verifyGoogleFormat("A<int**, int**> a;");
4835   verifyGoogleFormat("f(b ? *c : *d);");
4836   verifyGoogleFormat("int a = b ? *c : *d;");
4837   verifyGoogleFormat("Type* t = **x;");
4838   verifyGoogleFormat("Type* t = *++*x;");
4839   verifyGoogleFormat("*++*x;");
4840   verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
4841   verifyGoogleFormat("Type* t = x++ * y;");
4842   verifyGoogleFormat(
4843       "const char* const p = reinterpret_cast<const char* const>(q);");
4844   verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
4845   verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
4846   verifyGoogleFormat("template <typename T>\n"
4847                      "void f(int i = 0, SomeType** temps = NULL);");
4848 
4849   FormatStyle Left = getLLVMStyle();
4850   Left.PointerAlignment = FormatStyle::PAS_Left;
4851   verifyFormat("x = *a(x) = *a(y);", Left);
4852   verifyFormat("for (;; *a = b) {\n}", Left);
4853   verifyFormat("return *this += 1;", Left);
4854 
4855   verifyIndependentOfContext("a = *(x + y);");
4856   verifyIndependentOfContext("a = &(x + y);");
4857   verifyIndependentOfContext("*(x + y).call();");
4858   verifyIndependentOfContext("&(x + y)->call();");
4859   verifyFormat("void f() { &(*I).first; }");
4860 
4861   verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
4862   verifyFormat(
4863       "int *MyValues = {\n"
4864       "    *A, // Operator detection might be confused by the '{'\n"
4865       "    *BB // Operator detection might be confused by previous comment\n"
4866       "};");
4867 
4868   verifyIndependentOfContext("if (int *a = &b)");
4869   verifyIndependentOfContext("if (int &a = *b)");
4870   verifyIndependentOfContext("if (a & b[i])");
4871   verifyIndependentOfContext("if (a::b::c::d & b[i])");
4872   verifyIndependentOfContext("if (*b[i])");
4873   verifyIndependentOfContext("if (int *a = (&b))");
4874   verifyIndependentOfContext("while (int *a = &b)");
4875   verifyIndependentOfContext("size = sizeof *a;");
4876   verifyIndependentOfContext("if (a && (b = c))");
4877   verifyFormat("void f() {\n"
4878                "  for (const int &v : Values) {\n"
4879                "  }\n"
4880                "}");
4881   verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
4882   verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
4883   verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
4884 
4885   verifyFormat("#define A (!a * b)");
4886   verifyFormat("#define MACRO     \\\n"
4887                "  int *i = a * b; \\\n"
4888                "  void f(a *b);",
4889                getLLVMStyleWithColumns(19));
4890 
4891   verifyIndependentOfContext("A = new SomeType *[Length];");
4892   verifyIndependentOfContext("A = new SomeType *[Length]();");
4893   verifyIndependentOfContext("T **t = new T *;");
4894   verifyIndependentOfContext("T **t = new T *();");
4895   verifyGoogleFormat("A = new SomeType*[Length]();");
4896   verifyGoogleFormat("A = new SomeType*[Length];");
4897   verifyGoogleFormat("T** t = new T*;");
4898   verifyGoogleFormat("T** t = new T*();");
4899 
4900   FormatStyle PointerLeft = getLLVMStyle();
4901   PointerLeft.PointerAlignment = FormatStyle::PAS_Left;
4902   verifyFormat("delete *x;", PointerLeft);
4903   verifyFormat("STATIC_ASSERT((a & b) == 0);");
4904   verifyFormat("STATIC_ASSERT(0 == (a & b));");
4905   verifyFormat("template <bool a, bool b> "
4906                "typename t::if<x && y>::type f() {}");
4907   verifyFormat("template <int *y> f() {}");
4908   verifyFormat("vector<int *> v;");
4909   verifyFormat("vector<int *const> v;");
4910   verifyFormat("vector<int *const **const *> v;");
4911   verifyFormat("vector<int *volatile> v;");
4912   verifyFormat("vector<a * b> v;");
4913   verifyFormat("foo<b && false>();");
4914   verifyFormat("foo<b & 1>();");
4915   verifyFormat("decltype(*::std::declval<const T &>()) void F();");
4916   verifyFormat(
4917       "template <class T, class = typename std::enable_if<\n"
4918       "                       std::is_integral<T>::value &&\n"
4919       "                       (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
4920       "void F();",
4921       getLLVMStyleWithColumns(70));
4922   verifyFormat(
4923       "template <class T,\n"
4924       "          class = typename std::enable_if<\n"
4925       "              std::is_integral<T>::value &&\n"
4926       "              (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n"
4927       "          class U>\n"
4928       "void F();",
4929       getLLVMStyleWithColumns(70));
4930   verifyFormat(
4931       "template <class T,\n"
4932       "          class = typename ::std::enable_if<\n"
4933       "              ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
4934       "void F();",
4935       getGoogleStyleWithColumns(68));
4936 
4937   verifyIndependentOfContext("MACRO(int *i);");
4938   verifyIndependentOfContext("MACRO(auto *a);");
4939   verifyIndependentOfContext("MACRO(const A *a);");
4940   verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
4941   verifyFormat("void f() { f(float{1}, a * a); }");
4942   // FIXME: Is there a way to make this work?
4943   // verifyIndependentOfContext("MACRO(A *a);");
4944 
4945   verifyFormat("DatumHandle const *operator->() const { return input_; }");
4946   verifyFormat("return options != nullptr && operator==(*options);");
4947 
4948   EXPECT_EQ("#define OP(x)                                    \\\n"
4949             "  ostream &operator<<(ostream &s, const A &a) {  \\\n"
4950             "    return s << a.DebugString();                 \\\n"
4951             "  }",
4952             format("#define OP(x) \\\n"
4953                    "  ostream &operator<<(ostream &s, const A &a) { \\\n"
4954                    "    return s << a.DebugString(); \\\n"
4955                    "  }",
4956                    getLLVMStyleWithColumns(50)));
4957 
4958   // FIXME: We cannot handle this case yet; we might be able to figure out that
4959   // foo<x> d > v; doesn't make sense.
4960   verifyFormat("foo<a<b && c> d> v;");
4961 
4962   FormatStyle PointerMiddle = getLLVMStyle();
4963   PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
4964   verifyFormat("delete *x;", PointerMiddle);
4965   verifyFormat("int * x;", PointerMiddle);
4966   verifyFormat("template <int * y> f() {}", PointerMiddle);
4967   verifyFormat("int * f(int * a) {}", PointerMiddle);
4968   verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
4969   verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
4970   verifyFormat("A<int *> a;", PointerMiddle);
4971   verifyFormat("A<int **> a;", PointerMiddle);
4972   verifyFormat("A<int *, int *> a;", PointerMiddle);
4973   verifyFormat("A<int * []> a;", PointerMiddle);
4974   verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
4975   verifyFormat("A = new SomeType *[Length];", PointerMiddle);
4976   verifyFormat("T ** t = new T *;", PointerMiddle);
4977 
4978   // Member function reference qualifiers aren't binary operators.
4979   verifyFormat("string // break\n"
4980                "operator()() & {}");
4981   verifyFormat("string // break\n"
4982                "operator()() && {}");
4983   verifyGoogleFormat("template <typename T>\n"
4984                      "auto x() & -> int {}");
4985 }
4986 
4987 TEST_F(FormatTest, UnderstandsAttributes) {
4988   verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
4989   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
4990                "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
4991   FormatStyle AfterType = getLLVMStyle();
4992   AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
4993   verifyFormat("__attribute__((nodebug)) void\n"
4994                "foo() {}\n",
4995                AfterType);
4996 }
4997 
4998 TEST_F(FormatTest, UnderstandsEllipsis) {
4999   verifyFormat("int printf(const char *fmt, ...);");
5000   verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
5001   verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
5002 
5003   FormatStyle PointersLeft = getLLVMStyle();
5004   PointersLeft.PointerAlignment = FormatStyle::PAS_Left;
5005   verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
5006 }
5007 
5008 TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
5009   EXPECT_EQ("int *a;\n"
5010             "int *a;\n"
5011             "int *a;",
5012             format("int *a;\n"
5013                    "int* a;\n"
5014                    "int *a;",
5015                    getGoogleStyle()));
5016   EXPECT_EQ("int* a;\n"
5017             "int* a;\n"
5018             "int* a;",
5019             format("int* a;\n"
5020                    "int* a;\n"
5021                    "int *a;",
5022                    getGoogleStyle()));
5023   EXPECT_EQ("int *a;\n"
5024             "int *a;\n"
5025             "int *a;",
5026             format("int *a;\n"
5027                    "int * a;\n"
5028                    "int *  a;",
5029                    getGoogleStyle()));
5030   EXPECT_EQ("auto x = [] {\n"
5031             "  int *a;\n"
5032             "  int *a;\n"
5033             "  int *a;\n"
5034             "};",
5035             format("auto x=[]{int *a;\n"
5036                    "int * a;\n"
5037                    "int *  a;};",
5038                    getGoogleStyle()));
5039 }
5040 
5041 TEST_F(FormatTest, UnderstandsRvalueReferences) {
5042   verifyFormat("int f(int &&a) {}");
5043   verifyFormat("int f(int a, char &&b) {}");
5044   verifyFormat("void f() { int &&a = b; }");
5045   verifyGoogleFormat("int f(int a, char&& b) {}");
5046   verifyGoogleFormat("void f() { int&& a = b; }");
5047 
5048   verifyIndependentOfContext("A<int &&> a;");
5049   verifyIndependentOfContext("A<int &&, int &&> a;");
5050   verifyGoogleFormat("A<int&&> a;");
5051   verifyGoogleFormat("A<int&&, int&&> a;");
5052 
5053   // Not rvalue references:
5054   verifyFormat("template <bool B, bool C> class A {\n"
5055                "  static_assert(B && C, \"Something is wrong\");\n"
5056                "};");
5057   verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
5058   verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
5059   verifyFormat("#define A(a, b) (a && b)");
5060 }
5061 
5062 TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
5063   verifyFormat("void f() {\n"
5064                "  x[aaaaaaaaa -\n"
5065                "    b] = 23;\n"
5066                "}",
5067                getLLVMStyleWithColumns(15));
5068 }
5069 
5070 TEST_F(FormatTest, FormatsCasts) {
5071   verifyFormat("Type *A = static_cast<Type *>(P);");
5072   verifyFormat("Type *A = (Type *)P;");
5073   verifyFormat("Type *A = (vector<Type *, int *>)P;");
5074   verifyFormat("int a = (int)(2.0f);");
5075   verifyFormat("int a = (int)2.0f;");
5076   verifyFormat("x[(int32)y];");
5077   verifyFormat("x = (int32)y;");
5078   verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
5079   verifyFormat("int a = (int)*b;");
5080   verifyFormat("int a = (int)2.0f;");
5081   verifyFormat("int a = (int)~0;");
5082   verifyFormat("int a = (int)++a;");
5083   verifyFormat("int a = (int)sizeof(int);");
5084   verifyFormat("int a = (int)+2;");
5085   verifyFormat("my_int a = (my_int)2.0f;");
5086   verifyFormat("my_int a = (my_int)sizeof(int);");
5087   verifyFormat("return (my_int)aaa;");
5088   verifyFormat("#define x ((int)-1)");
5089   verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
5090   verifyFormat("#define p(q) ((int *)&q)");
5091   verifyFormat("fn(a)(b) + 1;");
5092 
5093   verifyFormat("void f() { my_int a = (my_int)*b; }");
5094   verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
5095   verifyFormat("my_int a = (my_int)~0;");
5096   verifyFormat("my_int a = (my_int)++a;");
5097   verifyFormat("my_int a = (my_int)-2;");
5098   verifyFormat("my_int a = (my_int)1;");
5099   verifyFormat("my_int a = (my_int *)1;");
5100   verifyFormat("my_int a = (const my_int)-1;");
5101   verifyFormat("my_int a = (const my_int *)-1;");
5102   verifyFormat("my_int a = (my_int)(my_int)-1;");
5103   verifyFormat("my_int a = (ns::my_int)-2;");
5104   verifyFormat("case (my_int)ONE:");
5105   verifyFormat("auto x = (X)this;");
5106 
5107   // FIXME: single value wrapped with paren will be treated as cast.
5108   verifyFormat("void f(int i = (kValue)*kMask) {}");
5109 
5110   verifyFormat("{ (void)F; }");
5111 
5112   // Don't break after a cast's
5113   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5114                "    (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
5115                "                                   bbbbbbbbbbbbbbbbbbbbbb);");
5116 
5117   // These are not casts.
5118   verifyFormat("void f(int *) {}");
5119   verifyFormat("f(foo)->b;");
5120   verifyFormat("f(foo).b;");
5121   verifyFormat("f(foo)(b);");
5122   verifyFormat("f(foo)[b];");
5123   verifyFormat("[](foo) { return 4; }(bar);");
5124   verifyFormat("(*funptr)(foo)[4];");
5125   verifyFormat("funptrs[4](foo)[4];");
5126   verifyFormat("void f(int *);");
5127   verifyFormat("void f(int *) = 0;");
5128   verifyFormat("void f(SmallVector<int>) {}");
5129   verifyFormat("void f(SmallVector<int>);");
5130   verifyFormat("void f(SmallVector<int>) = 0;");
5131   verifyFormat("void f(int i = (kA * kB) & kMask) {}");
5132   verifyFormat("int a = sizeof(int) * b;");
5133   verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
5134   verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
5135   verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
5136   verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
5137 
5138   // These are not casts, but at some point were confused with casts.
5139   verifyFormat("virtual void foo(int *) override;");
5140   verifyFormat("virtual void foo(char &) const;");
5141   verifyFormat("virtual void foo(int *a, char *) const;");
5142   verifyFormat("int a = sizeof(int *) + b;");
5143   verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
5144   verifyFormat("bool b = f(g<int>) && c;");
5145   verifyFormat("typedef void (*f)(int i) func;");
5146 
5147   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
5148                "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
5149   // FIXME: The indentation here is not ideal.
5150   verifyFormat(
5151       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5152       "    [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
5153       "        [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
5154 }
5155 
5156 TEST_F(FormatTest, FormatsFunctionTypes) {
5157   verifyFormat("A<bool()> a;");
5158   verifyFormat("A<SomeType()> a;");
5159   verifyFormat("A<void (*)(int, std::string)> a;");
5160   verifyFormat("A<void *(int)>;");
5161   verifyFormat("void *(*a)(int *, SomeType *);");
5162   verifyFormat("int (*func)(void *);");
5163   verifyFormat("void f() { int (*func)(void *); }");
5164   verifyFormat("template <class CallbackClass>\n"
5165                "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
5166 
5167   verifyGoogleFormat("A<void*(int*, SomeType*)>;");
5168   verifyGoogleFormat("void* (*a)(int);");
5169   verifyGoogleFormat(
5170       "template <class CallbackClass>\n"
5171       "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
5172 
5173   // Other constructs can look somewhat like function types:
5174   verifyFormat("A<sizeof(*x)> a;");
5175   verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
5176   verifyFormat("some_var = function(*some_pointer_var)[0];");
5177   verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
5178   verifyFormat("int x = f(&h)();");
5179   verifyFormat("returnsFunction(&param1, &param2)(param);");
5180 }
5181 
5182 TEST_F(FormatTest, FormatsPointersToArrayTypes) {
5183   verifyFormat("A (*foo_)[6];");
5184   verifyFormat("vector<int> (*foo_)[6];");
5185 }
5186 
5187 TEST_F(FormatTest, BreaksLongVariableDeclarations) {
5188   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5189                "    LoooooooooooooooooooooooooooooooooooooooongVariable;");
5190   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
5191                "    LoooooooooooooooooooooooooooooooooooooooongVariable;");
5192   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5193                "    *LoooooooooooooooooooooooooooooooooooooooongVariable;");
5194 
5195   // Different ways of ()-initializiation.
5196   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5197                "    LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
5198   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5199                "    LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
5200   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5201                "    LoooooooooooooooooooooooooooooooooooooooongVariable({});");
5202   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
5203                "    LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
5204 
5205   // Lambdas should not confuse the variable declaration heuristic.
5206   verifyFormat("LooooooooooooooooongType\n"
5207                "    variable(nullptr, [](A *a) {});",
5208                getLLVMStyleWithColumns(40));
5209 }
5210 
5211 TEST_F(FormatTest, BreaksLongDeclarations) {
5212   verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
5213                "    AnotherNameForTheLongType;");
5214   verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
5215                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5216   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
5217                "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
5218   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
5219                "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
5220   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
5221                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
5222   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
5223                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
5224   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
5225                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
5226   verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
5227                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
5228   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
5229                "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
5230   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
5231                "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
5232   FormatStyle Indented = getLLVMStyle();
5233   Indented.IndentWrappedFunctionNames = true;
5234   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
5235                "    LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
5236                Indented);
5237   verifyFormat(
5238       "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
5239       "    LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
5240       Indented);
5241   verifyFormat(
5242       "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
5243       "    LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
5244       Indented);
5245   verifyFormat(
5246       "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
5247       "    LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
5248       Indented);
5249 
5250   // FIXME: Without the comment, this breaks after "(".
5251   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType  // break\n"
5252                "    (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
5253                getGoogleStyle());
5254 
5255   verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
5256                "                  int LoooooooooooooooooooongParam2) {}");
5257   verifyFormat(
5258       "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
5259       "                                   SourceLocation L, IdentifierIn *II,\n"
5260       "                                   Type *T) {}");
5261   verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
5262                "ReallyReaaallyLongFunctionName(\n"
5263                "    const std::string &SomeParameter,\n"
5264                "    const SomeType<string, SomeOtherTemplateParameter>\n"
5265                "        &ReallyReallyLongParameterName,\n"
5266                "    const SomeType<string, SomeOtherTemplateParameter>\n"
5267                "        &AnotherLongParameterName) {}");
5268   verifyFormat("template <typename A>\n"
5269                "SomeLoooooooooooooooooooooongType<\n"
5270                "    typename some_namespace::SomeOtherType<A>::Type>\n"
5271                "Function() {}");
5272 
5273   verifyGoogleFormat(
5274       "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
5275       "    aaaaaaaaaaaaaaaaaaaaaaa;");
5276   verifyGoogleFormat(
5277       "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
5278       "                                   SourceLocation L) {}");
5279   verifyGoogleFormat(
5280       "some_namespace::LongReturnType\n"
5281       "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
5282       "    int first_long_parameter, int second_parameter) {}");
5283 
5284   verifyGoogleFormat("template <typename T>\n"
5285                      "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
5286                      "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
5287   verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5288                      "                   int aaaaaaaaaaaaaaaaaaaaaaa);");
5289 
5290   verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
5291                "    const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5292                "        *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5293   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5294                "    vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
5295                "        aaaaaaaaaaaaaaaaaaaaaaaa);");
5296   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5297                "    vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
5298                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
5299                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5300 }
5301 
5302 TEST_F(FormatTest, FormatsArrays) {
5303   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
5304                "                         [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
5305   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
5306                "                         [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
5307   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
5308                "    aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
5309   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5310                "    [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
5311   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5312                "    [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
5313   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5314                "    [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
5315                "    [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
5316   verifyFormat(
5317       "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
5318       "             << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
5319       "                                  [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
5320   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
5321                "    .aaaaaaaaaaaaaaaaaaaaaa();");
5322 
5323   verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
5324                      "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
5325   verifyFormat(
5326       "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
5327       "                                  .aaaaaaa[0]\n"
5328       "                                  .aaaaaaaaaaaaaaaaaaaaaa();");
5329   verifyFormat("a[::b::c];");
5330 
5331   verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
5332 
5333   FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
5334   verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
5335 }
5336 
5337 TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
5338   verifyFormat("(a)->b();");
5339   verifyFormat("--a;");
5340 }
5341 
5342 TEST_F(FormatTest, HandlesIncludeDirectives) {
5343   verifyFormat("#include <string>\n"
5344                "#include <a/b/c.h>\n"
5345                "#include \"a/b/string\"\n"
5346                "#include \"string.h\"\n"
5347                "#include \"string.h\"\n"
5348                "#include <a-a>\n"
5349                "#include < path with space >\n"
5350                "#include_next <test.h>"
5351                "#include \"abc.h\" // this is included for ABC\n"
5352                "#include \"some long include\" // with a comment\n"
5353                "#include \"some very long include paaaaaaaaaaaaaaaaaaaaaaath\"",
5354                getLLVMStyleWithColumns(35));
5355   EXPECT_EQ("#include \"a.h\"", format("#include  \"a.h\""));
5356   EXPECT_EQ("#include <a>", format("#include<a>"));
5357 
5358   verifyFormat("#import <string>");
5359   verifyFormat("#import <a/b/c.h>");
5360   verifyFormat("#import \"a/b/string\"");
5361   verifyFormat("#import \"string.h\"");
5362   verifyFormat("#import \"string.h\"");
5363   verifyFormat("#if __has_include(<strstream>)\n"
5364                "#include <strstream>\n"
5365                "#endif");
5366 
5367   verifyFormat("#define MY_IMPORT <a/b>");
5368 
5369   verifyFormat("#if __has_include(<a/b>)");
5370   verifyFormat("#if __has_include_next(<a/b>)");
5371   verifyFormat("#define F __has_include(<a/b>)");
5372   verifyFormat("#define F __has_include_next(<a/b>)");
5373 
5374   // Protocol buffer definition or missing "#".
5375   verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
5376                getLLVMStyleWithColumns(30));
5377 
5378   FormatStyle Style = getLLVMStyle();
5379   Style.AlwaysBreakBeforeMultilineStrings = true;
5380   Style.ColumnLimit = 0;
5381   verifyFormat("#import \"abc.h\"", Style);
5382 
5383   // But 'import' might also be a regular C++ namespace.
5384   verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5385                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5386 }
5387 
5388 //===----------------------------------------------------------------------===//
5389 // Error recovery tests.
5390 //===----------------------------------------------------------------------===//
5391 
5392 TEST_F(FormatTest, IncompleteParameterLists) {
5393   FormatStyle NoBinPacking = getLLVMStyle();
5394   NoBinPacking.BinPackParameters = false;
5395   verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
5396                "                        double *min_x,\n"
5397                "                        double *max_x,\n"
5398                "                        double *min_y,\n"
5399                "                        double *max_y,\n"
5400                "                        double *min_z,\n"
5401                "                        double *max_z, ) {}",
5402                NoBinPacking);
5403 }
5404 
5405 TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
5406   verifyFormat("void f() { return; }\n42");
5407   verifyFormat("void f() {\n"
5408                "  if (0)\n"
5409                "    return;\n"
5410                "}\n"
5411                "42");
5412   verifyFormat("void f() { return }\n42");
5413   verifyFormat("void f() {\n"
5414                "  if (0)\n"
5415                "    return\n"
5416                "}\n"
5417                "42");
5418 }
5419 
5420 TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
5421   EXPECT_EQ("void f() { return }", format("void  f ( )  {  return  }"));
5422   EXPECT_EQ("void f() {\n"
5423             "  if (a)\n"
5424             "    return\n"
5425             "}",
5426             format("void  f  (  )  {  if  ( a )  return  }"));
5427   EXPECT_EQ("namespace N {\n"
5428             "void f()\n"
5429             "}",
5430             format("namespace  N  {  void f()  }"));
5431   EXPECT_EQ("namespace N {\n"
5432             "void f() {}\n"
5433             "void g()\n"
5434             "}",
5435             format("namespace N  { void f( ) { } void g( ) }"));
5436 }
5437 
5438 TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
5439   verifyFormat("int aaaaaaaa =\n"
5440                "    // Overlylongcomment\n"
5441                "    b;",
5442                getLLVMStyleWithColumns(20));
5443   verifyFormat("function(\n"
5444                "    ShortArgument,\n"
5445                "    LoooooooooooongArgument);\n",
5446                getLLVMStyleWithColumns(20));
5447 }
5448 
5449 TEST_F(FormatTest, IncorrectAccessSpecifier) {
5450   verifyFormat("public:");
5451   verifyFormat("class A {\n"
5452                "public\n"
5453                "  void f() {}\n"
5454                "};");
5455   verifyFormat("public\n"
5456                "int qwerty;");
5457   verifyFormat("public\n"
5458                "B {}");
5459   verifyFormat("public\n"
5460                "{}");
5461   verifyFormat("public\n"
5462                "B { int x; }");
5463 }
5464 
5465 TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
5466   verifyFormat("{");
5467   verifyFormat("#})");
5468   verifyNoCrash("(/**/[:!] ?[).");
5469 }
5470 
5471 TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
5472   verifyFormat("do {\n}");
5473   verifyFormat("do {\n}\n"
5474                "f();");
5475   verifyFormat("do {\n}\n"
5476                "wheeee(fun);");
5477   verifyFormat("do {\n"
5478                "  f();\n"
5479                "}");
5480 }
5481 
5482 TEST_F(FormatTest, IncorrectCodeMissingParens) {
5483   verifyFormat("if {\n  foo;\n  foo();\n}");
5484   verifyFormat("switch {\n  foo;\n  foo();\n}");
5485   verifyIncompleteFormat("for {\n  foo;\n  foo();\n}");
5486   verifyFormat("while {\n  foo;\n  foo();\n}");
5487   verifyFormat("do {\n  foo;\n  foo();\n} while;");
5488 }
5489 
5490 TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
5491   verifyIncompleteFormat("namespace {\n"
5492                          "class Foo { Foo (\n"
5493                          "};\n"
5494                          "} // comment");
5495 }
5496 
5497 TEST_F(FormatTest, IncorrectCodeErrorDetection) {
5498   EXPECT_EQ("{\n  {}\n", format("{\n{\n}\n"));
5499   EXPECT_EQ("{\n  {}\n", format("{\n  {\n}\n"));
5500   EXPECT_EQ("{\n  {}\n", format("{\n  {\n  }\n"));
5501   EXPECT_EQ("{\n  {}\n}\n}\n", format("{\n  {\n    }\n  }\n}\n"));
5502 
5503   EXPECT_EQ("{\n"
5504             "  {\n"
5505             "    breakme(\n"
5506             "        qwe);\n"
5507             "  }\n",
5508             format("{\n"
5509                    "    {\n"
5510                    " breakme(qwe);\n"
5511                    "}\n",
5512                    getLLVMStyleWithColumns(10)));
5513 }
5514 
5515 TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
5516   verifyFormat("int x = {\n"
5517                "    avariable,\n"
5518                "    b(alongervariable)};",
5519                getLLVMStyleWithColumns(25));
5520 }
5521 
5522 TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
5523   verifyFormat("return (a)(b){1, 2, 3};");
5524 }
5525 
5526 TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
5527   verifyFormat("vector<int> x{1, 2, 3, 4};");
5528   verifyFormat("vector<int> x{\n"
5529                "    1, 2, 3, 4,\n"
5530                "};");
5531   verifyFormat("vector<T> x{{}, {}, {}, {}};");
5532   verifyFormat("f({1, 2});");
5533   verifyFormat("auto v = Foo{-1};");
5534   verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
5535   verifyFormat("Class::Class : member{1, 2, 3} {}");
5536   verifyFormat("new vector<int>{1, 2, 3};");
5537   verifyFormat("new int[3]{1, 2, 3};");
5538   verifyFormat("new int{1};");
5539   verifyFormat("return {arg1, arg2};");
5540   verifyFormat("return {arg1, SomeType{parameter}};");
5541   verifyFormat("int count = set<int>{f(), g(), h()}.size();");
5542   verifyFormat("new T{arg1, arg2};");
5543   verifyFormat("f(MyMap[{composite, key}]);");
5544   verifyFormat("class Class {\n"
5545                "  T member = {arg1, arg2};\n"
5546                "};");
5547   verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
5548   verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
5549   verifyFormat("int a = std::is_integral<int>{} + 0;");
5550 
5551   verifyFormat("int foo(int i) { return fo1{}(i); }");
5552   verifyFormat("int foo(int i) { return fo1{}(i); }");
5553   verifyFormat("auto i = decltype(x){};");
5554   verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
5555   verifyFormat("Node n{1, Node{1000}, //\n"
5556                "       2};");
5557   verifyFormat("Aaaa aaaaaaa{\n"
5558                "    {\n"
5559                "        aaaa,\n"
5560                "    },\n"
5561                "};");
5562   verifyFormat("class C : public D {\n"
5563                "  SomeClass SC{2};\n"
5564                "};");
5565   verifyFormat("class C : public A {\n"
5566                "  class D : public B {\n"
5567                "    void f() { int i{2}; }\n"
5568                "  };\n"
5569                "};");
5570   verifyFormat("#define A {a, a},");
5571 
5572   // Cases where distinguising braced lists and blocks is hard.
5573   verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
5574   verifyFormat("void f() {\n"
5575                "  return; // comment\n"
5576                "}\n"
5577                "SomeType t;");
5578   verifyFormat("void f() {\n"
5579                "  if (a) {\n"
5580                "    f();\n"
5581                "  }\n"
5582                "}\n"
5583                "SomeType t;");
5584 
5585   // In combination with BinPackArguments = false.
5586   FormatStyle NoBinPacking = getLLVMStyle();
5587   NoBinPacking.BinPackArguments = false;
5588   verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
5589                "                      bbbbb,\n"
5590                "                      ccccc,\n"
5591                "                      ddddd,\n"
5592                "                      eeeee,\n"
5593                "                      ffffff,\n"
5594                "                      ggggg,\n"
5595                "                      hhhhhh,\n"
5596                "                      iiiiii,\n"
5597                "                      jjjjjj,\n"
5598                "                      kkkkkk};",
5599                NoBinPacking);
5600   verifyFormat("const Aaaaaa aaaaa = {\n"
5601                "    aaaaa,\n"
5602                "    bbbbb,\n"
5603                "    ccccc,\n"
5604                "    ddddd,\n"
5605                "    eeeee,\n"
5606                "    ffffff,\n"
5607                "    ggggg,\n"
5608                "    hhhhhh,\n"
5609                "    iiiiii,\n"
5610                "    jjjjjj,\n"
5611                "    kkkkkk,\n"
5612                "};",
5613                NoBinPacking);
5614   verifyFormat(
5615       "const Aaaaaa aaaaa = {\n"
5616       "    aaaaa,  bbbbb,  ccccc,  ddddd,  eeeee,  ffffff, ggggg, hhhhhh,\n"
5617       "    iiiiii, jjjjjj, kkkkkk, aaaaa,  bbbbb,  ccccc,  ddddd, eeeee,\n"
5618       "    ffffff, ggggg,  hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
5619       "};",
5620       NoBinPacking);
5621 
5622   // FIXME: The alignment of these trailing comments might be bad. Then again,
5623   // this might be utterly useless in real code.
5624   verifyFormat("Constructor::Constructor()\n"
5625                "    : some_value{         //\n"
5626                "                 aaaaaaa, //\n"
5627                "                 bbbbbbb} {}");
5628 
5629   // In braced lists, the first comment is always assumed to belong to the
5630   // first element. Thus, it can be moved to the next or previous line as
5631   // appropriate.
5632   EXPECT_EQ("function({// First element:\n"
5633             "          1,\n"
5634             "          // Second element:\n"
5635             "          2});",
5636             format("function({\n"
5637                    "    // First element:\n"
5638                    "    1,\n"
5639                    "    // Second element:\n"
5640                    "    2});"));
5641   EXPECT_EQ("std::vector<int> MyNumbers{\n"
5642             "    // First element:\n"
5643             "    1,\n"
5644             "    // Second element:\n"
5645             "    2};",
5646             format("std::vector<int> MyNumbers{// First element:\n"
5647                    "                           1,\n"
5648                    "                           // Second element:\n"
5649                    "                           2};",
5650                    getLLVMStyleWithColumns(30)));
5651   // A trailing comma should still lead to an enforced line break.
5652   EXPECT_EQ("vector<int> SomeVector = {\n"
5653             "    // aaa\n"
5654             "    1, 2,\n"
5655             "};",
5656             format("vector<int> SomeVector = { // aaa\n"
5657                    "    1, 2, };"));
5658 
5659   FormatStyle ExtraSpaces = getLLVMStyle();
5660   ExtraSpaces.Cpp11BracedListStyle = false;
5661   ExtraSpaces.ColumnLimit = 75;
5662   verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
5663   verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
5664   verifyFormat("f({ 1, 2 });", ExtraSpaces);
5665   verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
5666   verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
5667   verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
5668   verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
5669   verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
5670   verifyFormat("return { arg1, arg2 };", ExtraSpaces);
5671   verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
5672   verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
5673   verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
5674   verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
5675   verifyFormat("class Class {\n"
5676                "  T member = { arg1, arg2 };\n"
5677                "};",
5678                ExtraSpaces);
5679   verifyFormat(
5680       "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5681       "                                 aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
5682       "                  : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
5683       "                                 bbbbbbbbbbbbbbbbbbbb, bbbbb };",
5684       ExtraSpaces);
5685   verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
5686   verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
5687                ExtraSpaces);
5688   verifyFormat(
5689       "someFunction(OtherParam,\n"
5690       "             BracedList{ // comment 1 (Forcing interesting break)\n"
5691       "                         param1, param2,\n"
5692       "                         // comment 2\n"
5693       "                         param3, param4 });",
5694       ExtraSpaces);
5695   verifyFormat(
5696       "std::this_thread::sleep_for(\n"
5697       "    std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
5698       ExtraSpaces);
5699   verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n"
5700                "    aaaaaaa,\n"
5701                "    aaaaaaaaaa,\n"
5702                "    aaaaa,\n"
5703                "    aaaaaaaaaaaaaaa,\n"
5704                "    aaa,\n"
5705                "    aaaaaaaaaa,\n"
5706                "    a,\n"
5707                "    aaaaaaaaaaaaaaaaaaaaa,\n"
5708                "    aaaaaaaaaaaa,\n"
5709                "    aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
5710                "    aaaaaaa,\n"
5711                "    a};");
5712   verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
5713 }
5714 
5715 TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
5716   verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5717                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5718                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5719                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5720                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5721                "                 1, 22, 333, 4444, 55555, 666666, 7777777};");
5722   verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
5723                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5724                "                 1, 22, 333, 4444, 55555, //\n"
5725                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5726                "                 1, 22, 333, 4444, 55555, 666666, 7777777};");
5727   verifyFormat(
5728       "vector<int> x = {1,       22, 333, 4444, 55555, 666666, 7777777,\n"
5729       "                 1,       22, 333, 4444, 55555, 666666, 7777777,\n"
5730       "                 1,       22, 333, 4444, 55555, 666666, // comment\n"
5731       "                 7777777, 1,  22,  333,  4444,  55555,  666666,\n"
5732       "                 7777777, 1,  22,  333,  4444,  55555,  666666,\n"
5733       "                 7777777, 1,  22,  333,  4444,  55555,  666666,\n"
5734       "                 7777777};");
5735   verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
5736                "    X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
5737                "    X86::R8,  X86::R9,  X86::R10, X86::R11, 0};");
5738   verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
5739                "    X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
5740                "    // Separating comment.\n"
5741                "    X86::R8, X86::R9, X86::R10, X86::R11, 0};");
5742   verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
5743                "    // Leading comment\n"
5744                "    X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
5745                "    X86::R8,  X86::R9,  X86::R10, X86::R11, 0};");
5746   verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
5747                "                 1, 1, 1, 1};",
5748                getLLVMStyleWithColumns(39));
5749   verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
5750                "                 1, 1, 1, 1};",
5751                getLLVMStyleWithColumns(38));
5752   verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
5753                "    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
5754                getLLVMStyleWithColumns(43));
5755   verifyFormat(
5756       "static unsigned SomeValues[10][3] = {\n"
5757       "    {1, 4, 0},  {4, 9, 0},  {4, 5, 9},  {8, 5, 4}, {1, 8, 4},\n"
5758       "    {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
5759   verifyFormat("static auto fields = new vector<string>{\n"
5760                "    \"aaaaaaaaaaaaa\",\n"
5761                "    \"aaaaaaaaaaaaa\",\n"
5762                "    \"aaaaaaaaaaaa\",\n"
5763                "    \"aaaaaaaaaaaaaa\",\n"
5764                "    \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
5765                "    \"aaaaaaaaaaaa\",\n"
5766                "    \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
5767                "};");
5768   verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
5769   verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
5770                "                 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
5771                "                 3, cccccccccccccccccccccc};",
5772                getLLVMStyleWithColumns(60));
5773 
5774   // Trailing commas.
5775   verifyFormat("vector<int> x = {\n"
5776                "    1, 1, 1, 1, 1, 1, 1, 1,\n"
5777                "};",
5778                getLLVMStyleWithColumns(39));
5779   verifyFormat("vector<int> x = {\n"
5780                "    1, 1, 1, 1, 1, 1, 1, 1, //\n"
5781                "};",
5782                getLLVMStyleWithColumns(39));
5783   verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
5784                "                 1, 1, 1, 1,\n"
5785                "                 /**/ /**/};",
5786                getLLVMStyleWithColumns(39));
5787 
5788   // Trailing comment in the first line.
5789   verifyFormat("vector<int> iiiiiiiiiiiiiii = {                      //\n"
5790                "    1111111111, 2222222222, 33333333333, 4444444444, //\n"
5791                "    111111111,  222222222,  3333333333,  444444444,  //\n"
5792                "    11111111,   22222222,   333333333,   44444444};");
5793   // Trailing comment in the last line.
5794   verifyFormat("int aaaaa[] = {\n"
5795                "    1, 2, 3, // comment\n"
5796                "    4, 5, 6  // comment\n"
5797                "};");
5798 
5799   // With nested lists, we should either format one item per line or all nested
5800   // lists one on line.
5801   // FIXME: For some nested lists, we can do better.
5802   verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
5803                "        {aaaaaaaaaaaaaaaaaaa},\n"
5804                "        {aaaaaaaaaaaaaaaaaaaaa},\n"
5805                "        {aaaaaaaaaaaaaaaaa}};",
5806                getLLVMStyleWithColumns(60));
5807   verifyFormat(
5808       "SomeStruct my_struct_array = {\n"
5809       "    {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
5810       "     aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
5811       "    {aaa, aaa},\n"
5812       "    {aaa, aaa},\n"
5813       "    {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
5814       "    {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
5815       "     aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
5816 
5817   // No column layout should be used here.
5818   verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
5819                "                   bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
5820 
5821   verifyNoCrash("a<,");
5822 
5823   // No braced initializer here.
5824   verifyFormat("void f() {\n"
5825                "  struct Dummy {};\n"
5826                "  f(v);\n"
5827                "}");
5828 
5829   // Long lists should be formatted in columns even if they are nested.
5830   verifyFormat(
5831       "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5832       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5833       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5834       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5835       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
5836       "                          1, 22, 333, 4444, 55555, 666666, 7777777});");
5837 
5838   // Allow "single-column" layout even if that violates the column limit. There
5839   // isn't going to be a better way.
5840   verifyFormat("std::vector<int> a = {\n"
5841                "    aaaaaaaa,\n"
5842                "    aaaaaaaa,\n"
5843                "    aaaaaaaa,\n"
5844                "    aaaaaaaa,\n"
5845                "    aaaaaaaaaa,\n"
5846                "    aaaaaaaa,\n"
5847                "    aaaaaaaaaaaaaaaaaaaaaaaaaaa};",
5848                getLLVMStyleWithColumns(30));
5849   verifyFormat("vector<int> aaaa = {\n"
5850                "    aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5851                "    aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5852                "    aaaaaa.aaaaaaa,\n"
5853                "    aaaaaa.aaaaaaa,\n"
5854                "    aaaaaa.aaaaaaa,\n"
5855                "    aaaaaa.aaaaaaa,\n"
5856                "};");
5857 
5858   // Don't create hanging lists.
5859   verifyFormat("someFunction(Param, {List1, List2,\n"
5860                "                     List3});",
5861                getLLVMStyleWithColumns(35));
5862   verifyFormat("someFunction(Param, Param,\n"
5863                "             {List1, List2,\n"
5864                "              List3});",
5865                getLLVMStyleWithColumns(35));
5866   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n"
5867                "                               aaaaaaaaaaaaaaaaaaaaaaa);");
5868 }
5869 
5870 TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
5871   FormatStyle DoNotMerge = getLLVMStyle();
5872   DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
5873 
5874   verifyFormat("void f() { return 42; }");
5875   verifyFormat("void f() {\n"
5876                "  return 42;\n"
5877                "}",
5878                DoNotMerge);
5879   verifyFormat("void f() {\n"
5880                "  // Comment\n"
5881                "}");
5882   verifyFormat("{\n"
5883                "#error {\n"
5884                "  int a;\n"
5885                "}");
5886   verifyFormat("{\n"
5887                "  int a;\n"
5888                "#error {\n"
5889                "}");
5890   verifyFormat("void f() {} // comment");
5891   verifyFormat("void f() { int a; } // comment");
5892   verifyFormat("void f() {\n"
5893                "} // comment",
5894                DoNotMerge);
5895   verifyFormat("void f() {\n"
5896                "  int a;\n"
5897                "} // comment",
5898                DoNotMerge);
5899   verifyFormat("void f() {\n"
5900                "} // comment",
5901                getLLVMStyleWithColumns(15));
5902 
5903   verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
5904   verifyFormat("void f() {\n  return 42;\n}", getLLVMStyleWithColumns(22));
5905 
5906   verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
5907   verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
5908   verifyFormat("class C {\n"
5909                "  C()\n"
5910                "      : iiiiiiii(nullptr),\n"
5911                "        kkkkkkk(nullptr),\n"
5912                "        mmmmmmm(nullptr),\n"
5913                "        nnnnnnn(nullptr) {}\n"
5914                "};",
5915                getGoogleStyle());
5916 
5917   FormatStyle NoColumnLimit = getLLVMStyle();
5918   NoColumnLimit.ColumnLimit = 0;
5919   EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
5920   EXPECT_EQ("class C {\n"
5921             "  A() : b(0) {}\n"
5922             "};",
5923             format("class C{A():b(0){}};", NoColumnLimit));
5924   EXPECT_EQ("A()\n"
5925             "    : b(0) {\n"
5926             "}",
5927             format("A()\n:b(0)\n{\n}", NoColumnLimit));
5928 
5929   FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
5930   DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
5931       FormatStyle::SFS_None;
5932   EXPECT_EQ("A()\n"
5933             "    : b(0) {\n"
5934             "}",
5935             format("A():b(0){}", DoNotMergeNoColumnLimit));
5936   EXPECT_EQ("A()\n"
5937             "    : b(0) {\n"
5938             "}",
5939             format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
5940 
5941   verifyFormat("#define A          \\\n"
5942                "  void f() {       \\\n"
5943                "    int i;         \\\n"
5944                "  }",
5945                getLLVMStyleWithColumns(20));
5946   verifyFormat("#define A           \\\n"
5947                "  void f() { int i; }",
5948                getLLVMStyleWithColumns(21));
5949   verifyFormat("#define A            \\\n"
5950                "  void f() {         \\\n"
5951                "    int i;           \\\n"
5952                "  }                  \\\n"
5953                "  int j;",
5954                getLLVMStyleWithColumns(22));
5955   verifyFormat("#define A             \\\n"
5956                "  void f() { int i; } \\\n"
5957                "  int j;",
5958                getLLVMStyleWithColumns(23));
5959 }
5960 
5961 TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
5962   FormatStyle MergeInlineOnly = getLLVMStyle();
5963   MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
5964   verifyFormat("class C {\n"
5965                "  int f() { return 42; }\n"
5966                "};",
5967                MergeInlineOnly);
5968   verifyFormat("int f() {\n"
5969                "  return 42;\n"
5970                "}",
5971                MergeInlineOnly);
5972 }
5973 
5974 TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
5975   // Elaborate type variable declarations.
5976   verifyFormat("struct foo a = {bar};\nint n;");
5977   verifyFormat("class foo a = {bar};\nint n;");
5978   verifyFormat("union foo a = {bar};\nint n;");
5979 
5980   // Elaborate types inside function definitions.
5981   verifyFormat("struct foo f() {}\nint n;");
5982   verifyFormat("class foo f() {}\nint n;");
5983   verifyFormat("union foo f() {}\nint n;");
5984 
5985   // Templates.
5986   verifyFormat("template <class X> void f() {}\nint n;");
5987   verifyFormat("template <struct X> void f() {}\nint n;");
5988   verifyFormat("template <union X> void f() {}\nint n;");
5989 
5990   // Actual definitions...
5991   verifyFormat("struct {\n} n;");
5992   verifyFormat(
5993       "template <template <class T, class Y>, class Z> class X {\n} n;");
5994   verifyFormat("union Z {\n  int n;\n} x;");
5995   verifyFormat("class MACRO Z {\n} n;");
5996   verifyFormat("class MACRO(X) Z {\n} n;");
5997   verifyFormat("class __attribute__(X) Z {\n} n;");
5998   verifyFormat("class __declspec(X) Z {\n} n;");
5999   verifyFormat("class A##B##C {\n} n;");
6000   verifyFormat("class alignas(16) Z {\n} n;");
6001   verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
6002   verifyFormat("class MACROA MACRO(X) Z {\n} n;");
6003 
6004   // Redefinition from nested context:
6005   verifyFormat("class A::B::C {\n} n;");
6006 
6007   // Template definitions.
6008   verifyFormat(
6009       "template <typename F>\n"
6010       "Matcher(const Matcher<F> &Other,\n"
6011       "        typename enable_if_c<is_base_of<F, T>::value &&\n"
6012       "                             !is_same<F, T>::value>::type * = 0)\n"
6013       "    : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
6014 
6015   // FIXME: This is still incorrectly handled at the formatter side.
6016   verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
6017   verifyFormat("int i = SomeFunction(a<b, a> b);");
6018 
6019   // FIXME:
6020   // This now gets parsed incorrectly as class definition.
6021   // verifyFormat("class A<int> f() {\n}\nint n;");
6022 
6023   // Elaborate types where incorrectly parsing the structural element would
6024   // break the indent.
6025   verifyFormat("if (true)\n"
6026                "  class X x;\n"
6027                "else\n"
6028                "  f();\n");
6029 
6030   // This is simply incomplete. Formatting is not important, but must not crash.
6031   verifyFormat("class A:");
6032 }
6033 
6034 TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
6035   EXPECT_EQ("#error Leave     all         white!!!!! space* alone!\n",
6036             format("#error Leave     all         white!!!!! space* alone!\n"));
6037   EXPECT_EQ(
6038       "#warning Leave     all         white!!!!! space* alone!\n",
6039       format("#warning Leave     all         white!!!!! space* alone!\n"));
6040   EXPECT_EQ("#error 1", format("  #  error   1"));
6041   EXPECT_EQ("#warning 1", format("  #  warning 1"));
6042 }
6043 
6044 TEST_F(FormatTest, FormatHashIfExpressions) {
6045   verifyFormat("#if AAAA && BBBB");
6046   verifyFormat("#if (AAAA && BBBB)");
6047   verifyFormat("#elif (AAAA && BBBB)");
6048   // FIXME: Come up with a better indentation for #elif.
6049   verifyFormat(
6050       "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) &&  \\\n"
6051       "    defined(BBBBBBBB)\n"
6052       "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) &&  \\\n"
6053       "    defined(BBBBBBBB)\n"
6054       "#endif",
6055       getLLVMStyleWithColumns(65));
6056 }
6057 
6058 TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
6059   FormatStyle AllowsMergedIf = getGoogleStyle();
6060   AllowsMergedIf.AllowShortIfStatementsOnASingleLine = true;
6061   verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
6062   verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
6063   verifyFormat("if (true)\n#error E\n  return 42;", AllowsMergedIf);
6064   EXPECT_EQ("if (true) return 42;",
6065             format("if (true)\nreturn 42;", AllowsMergedIf));
6066   FormatStyle ShortMergedIf = AllowsMergedIf;
6067   ShortMergedIf.ColumnLimit = 25;
6068   verifyFormat("#define A \\\n"
6069                "  if (true) return 42;",
6070                ShortMergedIf);
6071   verifyFormat("#define A \\\n"
6072                "  f();    \\\n"
6073                "  if (true)\n"
6074                "#define B",
6075                ShortMergedIf);
6076   verifyFormat("#define A \\\n"
6077                "  f();    \\\n"
6078                "  if (true)\n"
6079                "g();",
6080                ShortMergedIf);
6081   verifyFormat("{\n"
6082                "#ifdef A\n"
6083                "  // Comment\n"
6084                "  if (true) continue;\n"
6085                "#endif\n"
6086                "  // Comment\n"
6087                "  if (true) continue;\n"
6088                "}",
6089                ShortMergedIf);
6090   ShortMergedIf.ColumnLimit = 29;
6091   verifyFormat("#define A                   \\\n"
6092                "  if (aaaaaaaaaa) return 1; \\\n"
6093                "  return 2;",
6094                ShortMergedIf);
6095   ShortMergedIf.ColumnLimit = 28;
6096   verifyFormat("#define A         \\\n"
6097                "  if (aaaaaaaaaa) \\\n"
6098                "    return 1;     \\\n"
6099                "  return 2;",
6100                ShortMergedIf);
6101 }
6102 
6103 TEST_F(FormatTest, FormatStarDependingOnContext) {
6104   verifyFormat("void f(int *a);");
6105   verifyFormat("void f() { f(fint * b); }");
6106   verifyFormat("class A {\n  void f(int *a);\n};");
6107   verifyFormat("class A {\n  int *a;\n};");
6108   verifyFormat("namespace a {\n"
6109                "namespace b {\n"
6110                "class A {\n"
6111                "  void f() {}\n"
6112                "  int *a;\n"
6113                "};\n"
6114                "}\n"
6115                "}");
6116 }
6117 
6118 TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
6119   verifyFormat("while");
6120   verifyFormat("operator");
6121 }
6122 
6123 TEST_F(FormatTest, SkipsDeeplyNestedLines) {
6124   // This code would be painfully slow to format if we didn't skip it.
6125   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
6126                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
6127                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
6128                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
6129                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
6130                    "A(1, 1)\n"
6131                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
6132                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6133                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6134                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6135                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6136                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6137                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6138                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6139                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
6140                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n");
6141   // Deeply nested part is untouched, rest is formatted.
6142   EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
6143             format(std::string("int    i;\n") + Code + "int    j;\n",
6144                    getLLVMStyle(), IC_ExpectIncomplete));
6145 }
6146 
6147 //===----------------------------------------------------------------------===//
6148 // Objective-C tests.
6149 //===----------------------------------------------------------------------===//
6150 
6151 TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
6152   verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
6153   EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
6154             format("-(NSUInteger)indexOfObject:(id)anObject;"));
6155   EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
6156   EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
6157   EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
6158             format("-(NSInteger)Method3:(id)anObject;"));
6159   EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
6160             format("-(NSInteger)Method4:(id)anObject;"));
6161   EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
6162             format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
6163   EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
6164             format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
6165   EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
6166             "forAllCells:(BOOL)flag;",
6167             format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
6168                    "forAllCells:(BOOL)flag;"));
6169 
6170   // Very long objectiveC method declaration.
6171   verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
6172                "    (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
6173   verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
6174                "                    inRange:(NSRange)range\n"
6175                "                   outRange:(NSRange)out_range\n"
6176                "                  outRange1:(NSRange)out_range1\n"
6177                "                  outRange2:(NSRange)out_range2\n"
6178                "                  outRange3:(NSRange)out_range3\n"
6179                "                  outRange4:(NSRange)out_range4\n"
6180                "                  outRange5:(NSRange)out_range5\n"
6181                "                  outRange6:(NSRange)out_range6\n"
6182                "                  outRange7:(NSRange)out_range7\n"
6183                "                  outRange8:(NSRange)out_range8\n"
6184                "                  outRange9:(NSRange)out_range9;");
6185 
6186   // When the function name has to be wrapped.
6187   FormatStyle Style = getLLVMStyle();
6188   Style.IndentWrappedFunctionNames = false;
6189   verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
6190                "veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
6191                "           anotherName:(NSString)bbbbbbbbbbbbbb {\n"
6192                "}",
6193                Style);
6194   Style.IndentWrappedFunctionNames = true;
6195   verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
6196                "    veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
6197                "               anotherName:(NSString)bbbbbbbbbbbbbb {\n"
6198                "}",
6199                Style);
6200 
6201   verifyFormat("- (int)sum:(vector<int>)numbers;");
6202   verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
6203   // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
6204   // protocol lists (but not for template classes):
6205   // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
6206 
6207   verifyFormat("- (int (*)())foo:(int (*)())f;");
6208   verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
6209 
6210   // If there's no return type (very rare in practice!), LLVM and Google style
6211   // agree.
6212   verifyFormat("- foo;");
6213   verifyFormat("- foo:(int)f;");
6214   verifyGoogleFormat("- foo:(int)foo;");
6215 }
6216 
6217 
6218 TEST_F(FormatTest, BreaksStringLiterals) {
6219   EXPECT_EQ("\"some text \"\n"
6220             "\"other\";",
6221             format("\"some text other\";", getLLVMStyleWithColumns(12)));
6222   EXPECT_EQ("\"some text \"\n"
6223             "\"other\";",
6224             format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
6225   EXPECT_EQ(
6226       "#define A  \\\n"
6227       "  \"some \"  \\\n"
6228       "  \"text \"  \\\n"
6229       "  \"other\";",
6230       format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
6231   EXPECT_EQ(
6232       "#define A  \\\n"
6233       "  \"so \"    \\\n"
6234       "  \"text \"  \\\n"
6235       "  \"other\";",
6236       format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
6237 
6238   EXPECT_EQ("\"some text\"",
6239             format("\"some text\"", getLLVMStyleWithColumns(1)));
6240   EXPECT_EQ("\"some text\"",
6241             format("\"some text\"", getLLVMStyleWithColumns(11)));
6242   EXPECT_EQ("\"some \"\n"
6243             "\"text\"",
6244             format("\"some text\"", getLLVMStyleWithColumns(10)));
6245   EXPECT_EQ("\"some \"\n"
6246             "\"text\"",
6247             format("\"some text\"", getLLVMStyleWithColumns(7)));
6248   EXPECT_EQ("\"some\"\n"
6249             "\" tex\"\n"
6250             "\"t\"",
6251             format("\"some text\"", getLLVMStyleWithColumns(6)));
6252   EXPECT_EQ("\"some\"\n"
6253             "\" tex\"\n"
6254             "\" and\"",
6255             format("\"some tex and\"", getLLVMStyleWithColumns(6)));
6256   EXPECT_EQ("\"some\"\n"
6257             "\"/tex\"\n"
6258             "\"/and\"",
6259             format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
6260 
6261   EXPECT_EQ("variable =\n"
6262             "    \"long string \"\n"
6263             "    \"literal\";",
6264             format("variable = \"long string literal\";",
6265                    getLLVMStyleWithColumns(20)));
6266 
6267   EXPECT_EQ("variable = f(\n"
6268             "    \"long string \"\n"
6269             "    \"literal\",\n"
6270             "    short,\n"
6271             "    loooooooooooooooooooong);",
6272             format("variable = f(\"long string literal\", short, "
6273                    "loooooooooooooooooooong);",
6274                    getLLVMStyleWithColumns(20)));
6275 
6276   EXPECT_EQ(
6277       "f(g(\"long string \"\n"
6278       "    \"literal\"),\n"
6279       "  b);",
6280       format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
6281   EXPECT_EQ("f(g(\"long string \"\n"
6282             "    \"literal\",\n"
6283             "    a),\n"
6284             "  b);",
6285             format("f(g(\"long string literal\", a), b);",
6286                    getLLVMStyleWithColumns(20)));
6287   EXPECT_EQ(
6288       "f(\"one two\".split(\n"
6289       "    variable));",
6290       format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
6291   EXPECT_EQ("f(\"one two three four five six \"\n"
6292             "  \"seven\".split(\n"
6293             "      really_looooong_variable));",
6294             format("f(\"one two three four five six seven\"."
6295                    "split(really_looooong_variable));",
6296                    getLLVMStyleWithColumns(33)));
6297 
6298   EXPECT_EQ("f(\"some \"\n"
6299             "  \"text\",\n"
6300             "  other);",
6301             format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
6302 
6303   // Only break as a last resort.
6304   verifyFormat(
6305       "aaaaaaaaaaaaaaaaaaaa(\n"
6306       "    aaaaaaaaaaaaaaaaaaaa,\n"
6307       "    aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
6308 
6309   EXPECT_EQ("\"splitmea\"\n"
6310             "\"trandomp\"\n"
6311             "\"oint\"",
6312             format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
6313 
6314   EXPECT_EQ("\"split/\"\n"
6315             "\"pathat/\"\n"
6316             "\"slashes\"",
6317             format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
6318 
6319   EXPECT_EQ("\"split/\"\n"
6320             "\"pathat/\"\n"
6321             "\"slashes\"",
6322             format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
6323   EXPECT_EQ("\"split at \"\n"
6324             "\"spaces/at/\"\n"
6325             "\"slashes.at.any$\"\n"
6326             "\"non-alphanumeric%\"\n"
6327             "\"1111111111characte\"\n"
6328             "\"rs\"",
6329             format("\"split at "
6330                    "spaces/at/"
6331                    "slashes.at."
6332                    "any$non-"
6333                    "alphanumeric%"
6334                    "1111111111characte"
6335                    "rs\"",
6336                    getLLVMStyleWithColumns(20)));
6337 
6338   // Verify that splitting the strings understands
6339   // Style::AlwaysBreakBeforeMultilineStrings.
6340   EXPECT_EQ(
6341       "aaaaaaaaaaaa(\n"
6342       "    \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
6343       "    \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
6344       format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
6345              "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
6346              "aaaaaaaaaaaaaaaaaaaaaa\");",
6347              getGoogleStyle()));
6348   EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
6349             "       \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
6350             format("return \"aaaaaaaaaaaaaaaaaaaaaa "
6351                    "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
6352                    "aaaaaaaaaaaaaaaaaaaaaa\";",
6353                    getGoogleStyle()));
6354   EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
6355             "                \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
6356             format("llvm::outs() << "
6357                    "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
6358                    "aaaaaaaaaaaaaaaaaaa\";"));
6359   EXPECT_EQ("ffff(\n"
6360             "    {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
6361             "     \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
6362             format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
6363                    "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
6364                    getGoogleStyle()));
6365 
6366   FormatStyle Style = getLLVMStyleWithColumns(12);
6367   Style.BreakStringLiterals = false;
6368   EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
6369 
6370   FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
6371   AlignLeft.AlignEscapedNewlinesLeft = true;
6372   EXPECT_EQ("#define A \\\n"
6373             "  \"some \" \\\n"
6374             "  \"text \" \\\n"
6375             "  \"other\";",
6376             format("#define A \"some text other\";", AlignLeft));
6377 }
6378 
6379 TEST_F(FormatTest, FullyRemoveEmptyLines) {
6380   FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
6381   NoEmptyLines.MaxEmptyLinesToKeep = 0;
6382   EXPECT_EQ("int i = a(b());",
6383             format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
6384 }
6385 
6386 TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
6387   EXPECT_EQ(
6388       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
6389       "(\n"
6390       "    \"x\t\");",
6391       format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
6392              "aaaaaaa("
6393              "\"x\t\");"));
6394 }
6395 
6396 TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
6397   EXPECT_EQ(
6398       "u8\"utf8 string \"\n"
6399       "u8\"literal\";",
6400       format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
6401   EXPECT_EQ(
6402       "u\"utf16 string \"\n"
6403       "u\"literal\";",
6404       format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
6405   EXPECT_EQ(
6406       "U\"utf32 string \"\n"
6407       "U\"literal\";",
6408       format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
6409   EXPECT_EQ("L\"wide string \"\n"
6410             "L\"literal\";",
6411             format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
6412   EXPECT_EQ("@\"NSString \"\n"
6413             "@\"literal\";",
6414             format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
6415 
6416   // This input makes clang-format try to split the incomplete unicode escape
6417   // sequence, which used to lead to a crasher.
6418   verifyNoCrash(
6419       "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
6420       getLLVMStyleWithColumns(60));
6421 }
6422 
6423 TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
6424   FormatStyle Style = getGoogleStyleWithColumns(15);
6425   EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
6426   EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
6427   EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
6428   EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
6429   EXPECT_EQ("u8R\"x(raw literal)x\";",
6430             format("u8R\"x(raw literal)x\";", Style));
6431 }
6432 
6433 TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
6434   FormatStyle Style = getLLVMStyleWithColumns(20);
6435   EXPECT_EQ(
6436       "_T(\"aaaaaaaaaaaaaa\")\n"
6437       "_T(\"aaaaaaaaaaaaaa\")\n"
6438       "_T(\"aaaaaaaaaaaa\")",
6439       format("  _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
6440   EXPECT_EQ("f(x, _T(\"aaaaaaaaa\")\n"
6441             "     _T(\"aaaaaa\"),\n"
6442             "  z);",
6443             format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
6444 
6445   // FIXME: Handle embedded spaces in one iteration.
6446   //  EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
6447   //            "_T(\"aaaaaaaaaaaaa\")\n"
6448   //            "_T(\"aaaaaaaaaaaaa\")\n"
6449   //            "_T(\"a\")",
6450   //            format("  _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
6451   //                   getLLVMStyleWithColumns(20)));
6452   EXPECT_EQ(
6453       "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
6454       format("  _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
6455   EXPECT_EQ("f(\n"
6456             "#if !TEST\n"
6457             "    _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
6458             "#endif\n"
6459             "    );",
6460             format("f(\n"
6461                    "#if !TEST\n"
6462                    "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
6463                    "#endif\n"
6464                    ");"));
6465   EXPECT_EQ("f(\n"
6466             "\n"
6467             "    _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
6468             format("f(\n"
6469                    "\n"
6470                    "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
6471 }
6472 
6473 TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
6474   EXPECT_EQ(
6475       "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
6476       "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
6477       "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
6478       format("aaaaaaaaaaa  =  \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
6479              "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
6480              "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
6481 }
6482 
6483 TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
6484   EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
6485             format("f(g(R\"x(raw literal)x\",   a), b);", getGoogleStyle()));
6486   EXPECT_EQ("fffffffffff(g(R\"x(\n"
6487             "multiline raw string literal xxxxxxxxxxxxxx\n"
6488             ")x\",\n"
6489             "              a),\n"
6490             "            b);",
6491             format("fffffffffff(g(R\"x(\n"
6492                    "multiline raw string literal xxxxxxxxxxxxxx\n"
6493                    ")x\", a), b);",
6494                    getGoogleStyleWithColumns(20)));
6495   EXPECT_EQ("fffffffffff(\n"
6496             "    g(R\"x(qqq\n"
6497             "multiline raw string literal xxxxxxxxxxxxxx\n"
6498             ")x\",\n"
6499             "      a),\n"
6500             "    b);",
6501             format("fffffffffff(g(R\"x(qqq\n"
6502                    "multiline raw string literal xxxxxxxxxxxxxx\n"
6503                    ")x\", a), b);",
6504                    getGoogleStyleWithColumns(20)));
6505 
6506   EXPECT_EQ("fffffffffff(R\"x(\n"
6507             "multiline raw string literal xxxxxxxxxxxxxx\n"
6508             ")x\");",
6509             format("fffffffffff(R\"x(\n"
6510                    "multiline raw string literal xxxxxxxxxxxxxx\n"
6511                    ")x\");",
6512                    getGoogleStyleWithColumns(20)));
6513   EXPECT_EQ("fffffffffff(R\"x(\n"
6514             "multiline raw string literal xxxxxxxxxxxxxx\n"
6515             ")x\" + bbbbbb);",
6516             format("fffffffffff(R\"x(\n"
6517                    "multiline raw string literal xxxxxxxxxxxxxx\n"
6518                    ")x\" +   bbbbbb);",
6519                    getGoogleStyleWithColumns(20)));
6520   EXPECT_EQ("fffffffffff(\n"
6521             "    R\"x(\n"
6522             "multiline raw string literal xxxxxxxxxxxxxx\n"
6523             ")x\" +\n"
6524             "    bbbbbb);",
6525             format("fffffffffff(\n"
6526                    " R\"x(\n"
6527                    "multiline raw string literal xxxxxxxxxxxxxx\n"
6528                    ")x\" + bbbbbb);",
6529                    getGoogleStyleWithColumns(20)));
6530 }
6531 
6532 TEST_F(FormatTest, SkipsUnknownStringLiterals) {
6533   verifyFormat("string a = \"unterminated;");
6534   EXPECT_EQ("function(\"unterminated,\n"
6535             "         OtherParameter);",
6536             format("function(  \"unterminated,\n"
6537                    "    OtherParameter);"));
6538 }
6539 
6540 TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
6541   FormatStyle Style = getLLVMStyle();
6542   Style.Standard = FormatStyle::LS_Cpp03;
6543   EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
6544             format("#define x(_a) printf(\"foo\"_a);", Style));
6545 }
6546 
6547 TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
6548 
6549 TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
6550   EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
6551             "             \"ddeeefff\");",
6552             format("someFunction(\"aaabbbcccdddeeefff\");",
6553                    getLLVMStyleWithColumns(25)));
6554   EXPECT_EQ("someFunction1234567890(\n"
6555             "    \"aaabbbcccdddeeefff\");",
6556             format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
6557                    getLLVMStyleWithColumns(26)));
6558   EXPECT_EQ("someFunction1234567890(\n"
6559             "    \"aaabbbcccdddeeeff\"\n"
6560             "    \"f\");",
6561             format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
6562                    getLLVMStyleWithColumns(25)));
6563   EXPECT_EQ("someFunction1234567890(\n"
6564             "    \"aaabbbcccdddeeeff\"\n"
6565             "    \"f\");",
6566             format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
6567                    getLLVMStyleWithColumns(24)));
6568   EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
6569             "             \"ddde \"\n"
6570             "             \"efff\");",
6571             format("someFunction(\"aaabbbcc ddde efff\");",
6572                    getLLVMStyleWithColumns(25)));
6573   EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
6574             "             \"ddeeefff\");",
6575             format("someFunction(\"aaabbbccc ddeeefff\");",
6576                    getLLVMStyleWithColumns(25)));
6577   EXPECT_EQ("someFunction1234567890(\n"
6578             "    \"aaabb \"\n"
6579             "    \"cccdddeeefff\");",
6580             format("someFunction1234567890(\"aaabb cccdddeeefff\");",
6581                    getLLVMStyleWithColumns(25)));
6582   EXPECT_EQ("#define A          \\\n"
6583             "  string s =       \\\n"
6584             "      \"123456789\"  \\\n"
6585             "      \"0\";         \\\n"
6586             "  int i;",
6587             format("#define A string s = \"1234567890\"; int i;",
6588                    getLLVMStyleWithColumns(20)));
6589   // FIXME: Put additional penalties on breaking at non-whitespace locations.
6590   EXPECT_EQ("someFunction(\"aaabbbcc \"\n"
6591             "             \"dddeeeff\"\n"
6592             "             \"f\");",
6593             format("someFunction(\"aaabbbcc dddeeefff\");",
6594                    getLLVMStyleWithColumns(25)));
6595 }
6596 
6597 TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
6598   EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
6599   EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
6600   EXPECT_EQ("\"test\"\n"
6601             "\"\\n\"",
6602             format("\"test\\n\"", getLLVMStyleWithColumns(7)));
6603   EXPECT_EQ("\"tes\\\\\"\n"
6604             "\"n\"",
6605             format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
6606   EXPECT_EQ("\"\\\\\\\\\"\n"
6607             "\"\\n\"",
6608             format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
6609   EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
6610   EXPECT_EQ("\"\\uff01\"\n"
6611             "\"test\"",
6612             format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
6613   EXPECT_EQ("\"\\Uff01ff02\"",
6614             format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
6615   EXPECT_EQ("\"\\x000000000001\"\n"
6616             "\"next\"",
6617             format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
6618   EXPECT_EQ("\"\\x000000000001next\"",
6619             format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
6620   EXPECT_EQ("\"\\x000000000001\"",
6621             format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
6622   EXPECT_EQ("\"test\"\n"
6623             "\"\\000000\"\n"
6624             "\"000001\"",
6625             format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
6626   EXPECT_EQ("\"test\\000\"\n"
6627             "\"00000000\"\n"
6628             "\"1\"",
6629             format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
6630 }
6631 
6632 TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
6633   verifyFormat("void f() {\n"
6634                "  return g() {}\n"
6635                "  void h() {}");
6636   verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
6637                "g();\n"
6638                "}");
6639 }
6640 
6641 TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
6642   verifyFormat(
6643       "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
6644 }
6645 
6646 TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
6647   verifyFormat("class X {\n"
6648                "  void f() {\n"
6649                "  }\n"
6650                "};",
6651                getLLVMStyleWithColumns(12));
6652 }
6653 
6654 TEST_F(FormatTest, ConfigurableIndentWidth) {
6655   FormatStyle EightIndent = getLLVMStyleWithColumns(18);
6656   EightIndent.IndentWidth = 8;
6657   EightIndent.ContinuationIndentWidth = 8;
6658   verifyFormat("void f() {\n"
6659                "        someFunction();\n"
6660                "        if (true) {\n"
6661                "                f();\n"
6662                "        }\n"
6663                "}",
6664                EightIndent);
6665   verifyFormat("class X {\n"
6666                "        void f() {\n"
6667                "        }\n"
6668                "};",
6669                EightIndent);
6670   verifyFormat("int x[] = {\n"
6671                "        call(),\n"
6672                "        call()};",
6673                EightIndent);
6674 }
6675 
6676 TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
6677   verifyFormat("double\n"
6678                "f();",
6679                getLLVMStyleWithColumns(8));
6680 }
6681 
6682 TEST_F(FormatTest, ConfigurableUseOfTab) {
6683   FormatStyle Tab = getLLVMStyleWithColumns(42);
6684   Tab.IndentWidth = 8;
6685   Tab.UseTab = FormatStyle::UT_Always;
6686   Tab.AlignEscapedNewlinesLeft = true;
6687 
6688   EXPECT_EQ("if (aaaaaaaa && // q\n"
6689             "    bb)\t\t// w\n"
6690             "\t;",
6691             format("if (aaaaaaaa &&// q\n"
6692                    "bb)// w\n"
6693                    ";",
6694                    Tab));
6695   EXPECT_EQ("if (aaa && bbb) // w\n"
6696             "\t;",
6697             format("if(aaa&&bbb)// w\n"
6698                    ";",
6699                    Tab));
6700 
6701   verifyFormat("class X {\n"
6702                "\tvoid f() {\n"
6703                "\t\tsomeFunction(parameter1,\n"
6704                "\t\t\t     parameter2);\n"
6705                "\t}\n"
6706                "};",
6707                Tab);
6708   verifyFormat("#define A                        \\\n"
6709                "\tvoid f() {               \\\n"
6710                "\t\tsomeFunction(    \\\n"
6711                "\t\t    parameter1,  \\\n"
6712                "\t\t    parameter2); \\\n"
6713                "\t}",
6714                Tab);
6715 
6716   Tab.TabWidth = 4;
6717   Tab.IndentWidth = 8;
6718   verifyFormat("class TabWidth4Indent8 {\n"
6719                "\t\tvoid f() {\n"
6720                "\t\t\t\tsomeFunction(parameter1,\n"
6721                "\t\t\t\t\t\t\t parameter2);\n"
6722                "\t\t}\n"
6723                "};",
6724                Tab);
6725 
6726   Tab.TabWidth = 4;
6727   Tab.IndentWidth = 4;
6728   verifyFormat("class TabWidth4Indent4 {\n"
6729                "\tvoid f() {\n"
6730                "\t\tsomeFunction(parameter1,\n"
6731                "\t\t\t\t\t parameter2);\n"
6732                "\t}\n"
6733                "};",
6734                Tab);
6735 
6736   Tab.TabWidth = 8;
6737   Tab.IndentWidth = 4;
6738   verifyFormat("class TabWidth8Indent4 {\n"
6739                "    void f() {\n"
6740                "\tsomeFunction(parameter1,\n"
6741                "\t\t     parameter2);\n"
6742                "    }\n"
6743                "};",
6744                Tab);
6745 
6746   Tab.TabWidth = 8;
6747   Tab.IndentWidth = 8;
6748   EXPECT_EQ("/*\n"
6749             "\t      a\t\tcomment\n"
6750             "\t      in multiple lines\n"
6751             "       */",
6752             format("   /*\t \t \n"
6753                    " \t \t a\t\tcomment\t \t\n"
6754                    " \t \t in multiple lines\t\n"
6755                    " \t  */",
6756                    Tab));
6757 
6758   Tab.UseTab = FormatStyle::UT_ForIndentation;
6759   verifyFormat("{\n"
6760                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
6761                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
6762                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
6763                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
6764                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
6765                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
6766                "};",
6767                Tab);
6768   verifyFormat("enum AA {\n"
6769                "\ta1, // Force multiple lines\n"
6770                "\ta2,\n"
6771                "\ta3\n"
6772                "};",
6773                Tab);
6774   EXPECT_EQ("if (aaaaaaaa && // q\n"
6775             "    bb)         // w\n"
6776             "\t;",
6777             format("if (aaaaaaaa &&// q\n"
6778                    "bb)// w\n"
6779                    ";",
6780                    Tab));
6781   verifyFormat("class X {\n"
6782                "\tvoid f() {\n"
6783                "\t\tsomeFunction(parameter1,\n"
6784                "\t\t             parameter2);\n"
6785                "\t}\n"
6786                "};",
6787                Tab);
6788   verifyFormat("{\n"
6789                "\tQ(\n"
6790                "\t    {\n"
6791                "\t\t    int a;\n"
6792                "\t\t    someFunction(aaaaaaaa,\n"
6793                "\t\t                 bbbbbbb);\n"
6794                "\t    },\n"
6795                "\t    p);\n"
6796                "}",
6797                Tab);
6798   EXPECT_EQ("{\n"
6799             "\t/* aaaa\n"
6800             "\t   bbbb */\n"
6801             "}",
6802             format("{\n"
6803                    "/* aaaa\n"
6804                    "   bbbb */\n"
6805                    "}",
6806                    Tab));
6807   EXPECT_EQ("{\n"
6808             "\t/*\n"
6809             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6810             "\t  bbbbbbbbbbbbb\n"
6811             "\t*/\n"
6812             "}",
6813             format("{\n"
6814                    "/*\n"
6815                    "  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
6816                    "*/\n"
6817                    "}",
6818                    Tab));
6819   EXPECT_EQ("{\n"
6820             "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6821             "\t// bbbbbbbbbbbbb\n"
6822             "}",
6823             format("{\n"
6824                    "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
6825                    "}",
6826                    Tab));
6827   EXPECT_EQ("{\n"
6828             "\t/*\n"
6829             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6830             "\t  bbbbbbbbbbbbb\n"
6831             "\t*/\n"
6832             "}",
6833             format("{\n"
6834                    "\t/*\n"
6835                    "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
6836                    "\t*/\n"
6837                    "}",
6838                    Tab));
6839   EXPECT_EQ("{\n"
6840             "\t/*\n"
6841             "\n"
6842             "\t*/\n"
6843             "}",
6844             format("{\n"
6845                    "\t/*\n"
6846                    "\n"
6847                    "\t*/\n"
6848                    "}",
6849                    Tab));
6850   EXPECT_EQ("{\n"
6851             "\t/*\n"
6852             " asdf\n"
6853             "\t*/\n"
6854             "}",
6855             format("{\n"
6856                    "\t/*\n"
6857                    " asdf\n"
6858                    "\t*/\n"
6859                    "}",
6860                    Tab));
6861 
6862   Tab.UseTab = FormatStyle::UT_Never;
6863   EXPECT_EQ("/*\n"
6864             "              a\t\tcomment\n"
6865             "              in multiple lines\n"
6866             "       */",
6867             format("   /*\t \t \n"
6868                    " \t \t a\t\tcomment\t \t\n"
6869                    " \t \t in multiple lines\t\n"
6870                    " \t  */",
6871                    Tab));
6872   EXPECT_EQ("/* some\n"
6873             "   comment */",
6874             format(" \t \t /* some\n"
6875                    " \t \t    comment */",
6876                    Tab));
6877   EXPECT_EQ("int a; /* some\n"
6878             "   comment */",
6879             format(" \t \t int a; /* some\n"
6880                    " \t \t    comment */",
6881                    Tab));
6882 
6883   EXPECT_EQ("int a; /* some\n"
6884             "comment */",
6885             format(" \t \t int\ta; /* some\n"
6886                    " \t \t    comment */",
6887                    Tab));
6888   EXPECT_EQ("f(\"\t\t\"); /* some\n"
6889             "    comment */",
6890             format(" \t \t f(\"\t\t\"); /* some\n"
6891                    " \t \t    comment */",
6892                    Tab));
6893   EXPECT_EQ("{\n"
6894             "  /*\n"
6895             "   * Comment\n"
6896             "   */\n"
6897             "  int i;\n"
6898             "}",
6899             format("{\n"
6900                    "\t/*\n"
6901                    "\t * Comment\n"
6902                    "\t */\n"
6903                    "\t int i;\n"
6904                    "}"));
6905 
6906   Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
6907   Tab.TabWidth = 8;
6908   Tab.IndentWidth = 8;
6909   EXPECT_EQ("if (aaaaaaaa && // q\n"
6910             "    bb)         // w\n"
6911             "\t;",
6912             format("if (aaaaaaaa &&// q\n"
6913                    "bb)// w\n"
6914                    ";",
6915                    Tab));
6916   EXPECT_EQ("if (aaa && bbb) // w\n"
6917             "\t;",
6918             format("if(aaa&&bbb)// w\n"
6919                    ";",
6920                    Tab));
6921   verifyFormat("class X {\n"
6922                "\tvoid f() {\n"
6923                "\t\tsomeFunction(parameter1,\n"
6924                "\t\t\t     parameter2);\n"
6925                "\t}\n"
6926                "};",
6927                Tab);
6928   verifyFormat("#define A                        \\\n"
6929                "\tvoid f() {               \\\n"
6930                "\t\tsomeFunction(    \\\n"
6931                "\t\t    parameter1,  \\\n"
6932                "\t\t    parameter2); \\\n"
6933                "\t}",
6934                Tab);
6935   Tab.TabWidth = 4;
6936   Tab.IndentWidth = 8;
6937   verifyFormat("class TabWidth4Indent8 {\n"
6938                "\t\tvoid f() {\n"
6939                "\t\t\t\tsomeFunction(parameter1,\n"
6940                "\t\t\t\t\t\t\t parameter2);\n"
6941                "\t\t}\n"
6942                "};",
6943                Tab);
6944   Tab.TabWidth = 4;
6945   Tab.IndentWidth = 4;
6946   verifyFormat("class TabWidth4Indent4 {\n"
6947                "\tvoid f() {\n"
6948                "\t\tsomeFunction(parameter1,\n"
6949                "\t\t\t\t\t parameter2);\n"
6950                "\t}\n"
6951                "};",
6952                Tab);
6953   Tab.TabWidth = 8;
6954   Tab.IndentWidth = 4;
6955   verifyFormat("class TabWidth8Indent4 {\n"
6956                "    void f() {\n"
6957                "\tsomeFunction(parameter1,\n"
6958                "\t\t     parameter2);\n"
6959                "    }\n"
6960                "};",
6961                Tab);
6962   Tab.TabWidth = 8;
6963   Tab.IndentWidth = 8;
6964   EXPECT_EQ("/*\n"
6965             "\t      a\t\tcomment\n"
6966             "\t      in multiple lines\n"
6967             "       */",
6968             format("   /*\t \t \n"
6969                    " \t \t a\t\tcomment\t \t\n"
6970                    " \t \t in multiple lines\t\n"
6971                    " \t  */",
6972                    Tab));
6973   verifyFormat("{\n"
6974                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
6975                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
6976                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
6977                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
6978                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
6979                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
6980                "};",
6981                Tab);
6982   verifyFormat("enum AA {\n"
6983                "\ta1, // Force multiple lines\n"
6984                "\ta2,\n"
6985                "\ta3\n"
6986                "};",
6987                Tab);
6988   EXPECT_EQ("if (aaaaaaaa && // q\n"
6989             "    bb)         // w\n"
6990             "\t;",
6991             format("if (aaaaaaaa &&// q\n"
6992                    "bb)// w\n"
6993                    ";",
6994                    Tab));
6995   verifyFormat("class X {\n"
6996                "\tvoid f() {\n"
6997                "\t\tsomeFunction(parameter1,\n"
6998                "\t\t\t     parameter2);\n"
6999                "\t}\n"
7000                "};",
7001                Tab);
7002   verifyFormat("{\n"
7003                "\tQ(\n"
7004                "\t    {\n"
7005                "\t\t    int a;\n"
7006                "\t\t    someFunction(aaaaaaaa,\n"
7007                "\t\t\t\t bbbbbbb);\n"
7008                "\t    },\n"
7009                "\t    p);\n"
7010                "}",
7011                Tab);
7012   EXPECT_EQ("{\n"
7013             "\t/* aaaa\n"
7014             "\t   bbbb */\n"
7015             "}",
7016             format("{\n"
7017                    "/* aaaa\n"
7018                    "   bbbb */\n"
7019                    "}",
7020                    Tab));
7021   EXPECT_EQ("{\n"
7022             "\t/*\n"
7023             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7024             "\t  bbbbbbbbbbbbb\n"
7025             "\t*/\n"
7026             "}",
7027             format("{\n"
7028                    "/*\n"
7029                    "  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7030                    "*/\n"
7031                    "}",
7032                    Tab));
7033   EXPECT_EQ("{\n"
7034             "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7035             "\t// bbbbbbbbbbbbb\n"
7036             "}",
7037             format("{\n"
7038                    "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7039                    "}",
7040                    Tab));
7041   EXPECT_EQ("{\n"
7042             "\t/*\n"
7043             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7044             "\t  bbbbbbbbbbbbb\n"
7045             "\t*/\n"
7046             "}",
7047             format("{\n"
7048                    "\t/*\n"
7049                    "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
7050                    "\t*/\n"
7051                    "}",
7052                    Tab));
7053   EXPECT_EQ("{\n"
7054             "\t/*\n"
7055             "\n"
7056             "\t*/\n"
7057             "}",
7058             format("{\n"
7059                    "\t/*\n"
7060                    "\n"
7061                    "\t*/\n"
7062                    "}",
7063                    Tab));
7064   EXPECT_EQ("{\n"
7065             "\t/*\n"
7066             " asdf\n"
7067             "\t*/\n"
7068             "}",
7069             format("{\n"
7070                    "\t/*\n"
7071                    " asdf\n"
7072                    "\t*/\n"
7073                    "}",
7074                    Tab));
7075   EXPECT_EQ("/*\n"
7076             "\t      a\t\tcomment\n"
7077             "\t      in multiple lines\n"
7078             "       */",
7079             format("   /*\t \t \n"
7080                    " \t \t a\t\tcomment\t \t\n"
7081                    " \t \t in multiple lines\t\n"
7082                    " \t  */",
7083                    Tab));
7084   EXPECT_EQ("/* some\n"
7085             "   comment */",
7086             format(" \t \t /* some\n"
7087                    " \t \t    comment */",
7088                    Tab));
7089   EXPECT_EQ("int a; /* some\n"
7090             "   comment */",
7091             format(" \t \t int a; /* some\n"
7092                    " \t \t    comment */",
7093                    Tab));
7094   EXPECT_EQ("int a; /* some\n"
7095             "comment */",
7096             format(" \t \t int\ta; /* some\n"
7097                    " \t \t    comment */",
7098                    Tab));
7099   EXPECT_EQ("f(\"\t\t\"); /* some\n"
7100             "    comment */",
7101             format(" \t \t f(\"\t\t\"); /* some\n"
7102                    " \t \t    comment */",
7103                    Tab));
7104   EXPECT_EQ("{\n"
7105             "  /*\n"
7106             "   * Comment\n"
7107             "   */\n"
7108             "  int i;\n"
7109             "}",
7110             format("{\n"
7111                    "\t/*\n"
7112                    "\t * Comment\n"
7113                    "\t */\n"
7114                    "\t int i;\n"
7115                    "}"));
7116   Tab.AlignConsecutiveAssignments = true;
7117   Tab.AlignConsecutiveDeclarations = true;
7118   Tab.TabWidth = 4;
7119   Tab.IndentWidth = 4;
7120   verifyFormat("class Assign {\n"
7121                "\tvoid f() {\n"
7122                "\t\tint         x      = 123;\n"
7123                "\t\tint         random = 4;\n"
7124                "\t\tstd::string alphabet =\n"
7125                "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
7126                "\t}\n"
7127                "};",
7128                Tab);
7129 }
7130 
7131 TEST_F(FormatTest, CalculatesOriginalColumn) {
7132   EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7133             "q\"; /* some\n"
7134             "       comment */",
7135             format("  \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7136                    "q\"; /* some\n"
7137                    "       comment */",
7138                    getLLVMStyle()));
7139   EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
7140             "/* some\n"
7141             "   comment */",
7142             format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
7143                    " /* some\n"
7144                    "    comment */",
7145                    getLLVMStyle()));
7146   EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7147             "qqq\n"
7148             "/* some\n"
7149             "   comment */",
7150             format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7151                    "qqq\n"
7152                    " /* some\n"
7153                    "    comment */",
7154                    getLLVMStyle()));
7155   EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7156             "wwww; /* some\n"
7157             "         comment */",
7158             format("  inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
7159                    "wwww; /* some\n"
7160                    "         comment */",
7161                    getLLVMStyle()));
7162 }
7163 
7164 TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
7165   FormatStyle NoSpace = getLLVMStyle();
7166   NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
7167 
7168   verifyFormat("while(true)\n"
7169                "  continue;",
7170                NoSpace);
7171   verifyFormat("for(;;)\n"
7172                "  continue;",
7173                NoSpace);
7174   verifyFormat("if(true)\n"
7175                "  f();\n"
7176                "else if(true)\n"
7177                "  f();",
7178                NoSpace);
7179   verifyFormat("do {\n"
7180                "  do_something();\n"
7181                "} while(something());",
7182                NoSpace);
7183   verifyFormat("switch(x) {\n"
7184                "default:\n"
7185                "  break;\n"
7186                "}",
7187                NoSpace);
7188   verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
7189   verifyFormat("size_t x = sizeof(x);", NoSpace);
7190   verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
7191   verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
7192   verifyFormat("alignas(128) char a[128];", NoSpace);
7193   verifyFormat("size_t x = alignof(MyType);", NoSpace);
7194   verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
7195   verifyFormat("int f() throw(Deprecated);", NoSpace);
7196   verifyFormat("typedef void (*cb)(int);", NoSpace);
7197   verifyFormat("T A::operator()();", NoSpace);
7198   verifyFormat("X A::operator++(T);", NoSpace);
7199 
7200   FormatStyle Space = getLLVMStyle();
7201   Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
7202 
7203   verifyFormat("int f ();", Space);
7204   verifyFormat("void f (int a, T b) {\n"
7205                "  while (true)\n"
7206                "    continue;\n"
7207                "}",
7208                Space);
7209   verifyFormat("if (true)\n"
7210                "  f ();\n"
7211                "else if (true)\n"
7212                "  f ();",
7213                Space);
7214   verifyFormat("do {\n"
7215                "  do_something ();\n"
7216                "} while (something ());",
7217                Space);
7218   verifyFormat("switch (x) {\n"
7219                "default:\n"
7220                "  break;\n"
7221                "}",
7222                Space);
7223   verifyFormat("A::A () : a (1) {}", Space);
7224   verifyFormat("void f () __attribute__ ((asdf));", Space);
7225   verifyFormat("*(&a + 1);\n"
7226                "&((&a)[1]);\n"
7227                "a[(b + c) * d];\n"
7228                "(((a + 1) * 2) + 3) * 4;",
7229                Space);
7230   verifyFormat("#define A(x) x", Space);
7231   verifyFormat("#define A (x) x", Space);
7232   verifyFormat("#if defined(x)\n"
7233                "#endif",
7234                Space);
7235   verifyFormat("auto i = std::make_unique<int> (5);", Space);
7236   verifyFormat("size_t x = sizeof (x);", Space);
7237   verifyFormat("auto f (int x) -> decltype (x);", Space);
7238   verifyFormat("int f (T x) noexcept (x.create ());", Space);
7239   verifyFormat("alignas (128) char a[128];", Space);
7240   verifyFormat("size_t x = alignof (MyType);", Space);
7241   verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
7242   verifyFormat("int f () throw (Deprecated);", Space);
7243   verifyFormat("typedef void (*cb) (int);", Space);
7244   verifyFormat("T A::operator() ();", Space);
7245   verifyFormat("X A::operator++ (T);", Space);
7246 }
7247 
7248 TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
7249   FormatStyle Spaces = getLLVMStyle();
7250 
7251   Spaces.SpacesInParentheses = true;
7252   verifyFormat("call( x, y, z );", Spaces);
7253   verifyFormat("call();", Spaces);
7254   verifyFormat("std::function<void( int, int )> callback;", Spaces);
7255   verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
7256                Spaces);
7257   verifyFormat("while ( (bool)1 )\n"
7258                "  continue;",
7259                Spaces);
7260   verifyFormat("for ( ;; )\n"
7261                "  continue;",
7262                Spaces);
7263   verifyFormat("if ( true )\n"
7264                "  f();\n"
7265                "else if ( true )\n"
7266                "  f();",
7267                Spaces);
7268   verifyFormat("do {\n"
7269                "  do_something( (int)i );\n"
7270                "} while ( something() );",
7271                Spaces);
7272   verifyFormat("switch ( x ) {\n"
7273                "default:\n"
7274                "  break;\n"
7275                "}",
7276                Spaces);
7277 
7278   Spaces.SpacesInParentheses = false;
7279   Spaces.SpacesInCStyleCastParentheses = true;
7280   verifyFormat("Type *A = ( Type * )P;", Spaces);
7281   verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
7282   verifyFormat("x = ( int32 )y;", Spaces);
7283   verifyFormat("int a = ( int )(2.0f);", Spaces);
7284   verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
7285   verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
7286   verifyFormat("#define x (( int )-1)", Spaces);
7287 
7288   // Run the first set of tests again with:
7289   Spaces.SpacesInParentheses = false;
7290   Spaces.SpaceInEmptyParentheses = true;
7291   Spaces.SpacesInCStyleCastParentheses = true;
7292   verifyFormat("call(x, y, z);", Spaces);
7293   verifyFormat("call( );", Spaces);
7294   verifyFormat("std::function<void(int, int)> callback;", Spaces);
7295   verifyFormat("while (( bool )1)\n"
7296                "  continue;",
7297                Spaces);
7298   verifyFormat("for (;;)\n"
7299                "  continue;",
7300                Spaces);
7301   verifyFormat("if (true)\n"
7302                "  f( );\n"
7303                "else if (true)\n"
7304                "  f( );",
7305                Spaces);
7306   verifyFormat("do {\n"
7307                "  do_something(( int )i);\n"
7308                "} while (something( ));",
7309                Spaces);
7310   verifyFormat("switch (x) {\n"
7311                "default:\n"
7312                "  break;\n"
7313                "}",
7314                Spaces);
7315 
7316   // Run the first set of tests again with:
7317   Spaces.SpaceAfterCStyleCast = true;
7318   verifyFormat("call(x, y, z);", Spaces);
7319   verifyFormat("call( );", Spaces);
7320   verifyFormat("std::function<void(int, int)> callback;", Spaces);
7321   verifyFormat("while (( bool ) 1)\n"
7322                "  continue;",
7323                Spaces);
7324   verifyFormat("for (;;)\n"
7325                "  continue;",
7326                Spaces);
7327   verifyFormat("if (true)\n"
7328                "  f( );\n"
7329                "else if (true)\n"
7330                "  f( );",
7331                Spaces);
7332   verifyFormat("do {\n"
7333                "  do_something(( int ) i);\n"
7334                "} while (something( ));",
7335                Spaces);
7336   verifyFormat("switch (x) {\n"
7337                "default:\n"
7338                "  break;\n"
7339                "}",
7340                Spaces);
7341 
7342   // Run subset of tests again with:
7343   Spaces.SpacesInCStyleCastParentheses = false;
7344   Spaces.SpaceAfterCStyleCast = true;
7345   verifyFormat("while ((bool) 1)\n"
7346                "  continue;",
7347                Spaces);
7348   verifyFormat("do {\n"
7349                "  do_something((int) i);\n"
7350                "} while (something( ));",
7351                Spaces);
7352 }
7353 
7354 TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
7355   verifyFormat("int a[5];");
7356   verifyFormat("a[3] += 42;");
7357 
7358   FormatStyle Spaces = getLLVMStyle();
7359   Spaces.SpacesInSquareBrackets = true;
7360   // Lambdas unchanged.
7361   verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
7362   verifyFormat("return [i, args...] {};", Spaces);
7363 
7364   // Not lambdas.
7365   verifyFormat("int a[ 5 ];", Spaces);
7366   verifyFormat("a[ 3 ] += 42;", Spaces);
7367   verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
7368   verifyFormat("double &operator[](int i) { return 0; }\n"
7369                "int i;",
7370                Spaces);
7371   verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
7372   verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
7373   verifyFormat("int i = (*b)[ a ]->f();", Spaces);
7374 }
7375 
7376 TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
7377   verifyFormat("int a = 5;");
7378   verifyFormat("a += 42;");
7379   verifyFormat("a or_eq 8;");
7380 
7381   FormatStyle Spaces = getLLVMStyle();
7382   Spaces.SpaceBeforeAssignmentOperators = false;
7383   verifyFormat("int a= 5;", Spaces);
7384   verifyFormat("a+= 42;", Spaces);
7385   verifyFormat("a or_eq 8;", Spaces);
7386 }
7387 
7388 TEST_F(FormatTest, AlignConsecutiveAssignments) {
7389   FormatStyle Alignment = getLLVMStyle();
7390   Alignment.AlignConsecutiveAssignments = false;
7391   verifyFormat("int a = 5;\n"
7392                "int oneTwoThree = 123;",
7393                Alignment);
7394   verifyFormat("int a = 5;\n"
7395                "int oneTwoThree = 123;",
7396                Alignment);
7397 
7398   Alignment.AlignConsecutiveAssignments = true;
7399   verifyFormat("int a           = 5;\n"
7400                "int oneTwoThree = 123;",
7401                Alignment);
7402   verifyFormat("int a           = method();\n"
7403                "int oneTwoThree = 133;",
7404                Alignment);
7405   verifyFormat("a &= 5;\n"
7406                "bcd *= 5;\n"
7407                "ghtyf += 5;\n"
7408                "dvfvdb -= 5;\n"
7409                "a /= 5;\n"
7410                "vdsvsv %= 5;\n"
7411                "sfdbddfbdfbb ^= 5;\n"
7412                "dvsdsv |= 5;\n"
7413                "int dsvvdvsdvvv = 123;",
7414                Alignment);
7415   verifyFormat("int i = 1, j = 10;\n"
7416                "something = 2000;",
7417                Alignment);
7418   verifyFormat("something = 2000;\n"
7419                "int i = 1, j = 10;\n",
7420                Alignment);
7421   verifyFormat("something = 2000;\n"
7422                "another   = 911;\n"
7423                "int i = 1, j = 10;\n"
7424                "oneMore = 1;\n"
7425                "i       = 2;",
7426                Alignment);
7427   verifyFormat("int a   = 5;\n"
7428                "int one = 1;\n"
7429                "method();\n"
7430                "int oneTwoThree = 123;\n"
7431                "int oneTwo      = 12;",
7432                Alignment);
7433   verifyFormat("int oneTwoThree = 123;\n"
7434                "int oneTwo      = 12;\n"
7435                "method();\n",
7436                Alignment);
7437   verifyFormat("int oneTwoThree = 123; // comment\n"
7438                "int oneTwo      = 12;  // comment",
7439                Alignment);
7440   EXPECT_EQ("int a = 5;\n"
7441             "\n"
7442             "int oneTwoThree = 123;",
7443             format("int a       = 5;\n"
7444                    "\n"
7445                    "int oneTwoThree= 123;",
7446                    Alignment));
7447   EXPECT_EQ("int a   = 5;\n"
7448             "int one = 1;\n"
7449             "\n"
7450             "int oneTwoThree = 123;",
7451             format("int a = 5;\n"
7452                    "int one = 1;\n"
7453                    "\n"
7454                    "int oneTwoThree = 123;",
7455                    Alignment));
7456   EXPECT_EQ("int a   = 5;\n"
7457             "int one = 1;\n"
7458             "\n"
7459             "int oneTwoThree = 123;\n"
7460             "int oneTwo      = 12;",
7461             format("int a = 5;\n"
7462                    "int one = 1;\n"
7463                    "\n"
7464                    "int oneTwoThree = 123;\n"
7465                    "int oneTwo = 12;",
7466                    Alignment));
7467   Alignment.AlignEscapedNewlinesLeft = true;
7468   verifyFormat("#define A               \\\n"
7469                "  int aaaa       = 12;  \\\n"
7470                "  int b          = 23;  \\\n"
7471                "  int ccc        = 234; \\\n"
7472                "  int dddddddddd = 2345;",
7473                Alignment);
7474   Alignment.AlignEscapedNewlinesLeft = false;
7475   verifyFormat("#define A                                                      "
7476                "                \\\n"
7477                "  int aaaa       = 12;                                         "
7478                "                \\\n"
7479                "  int b          = 23;                                         "
7480                "                \\\n"
7481                "  int ccc        = 234;                                        "
7482                "                \\\n"
7483                "  int dddddddddd = 2345;",
7484                Alignment);
7485   verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
7486                "k = 4, int l = 5,\n"
7487                "                  int m = 6) {\n"
7488                "  int j      = 10;\n"
7489                "  otherThing = 1;\n"
7490                "}",
7491                Alignment);
7492   verifyFormat("void SomeFunction(int parameter = 0) {\n"
7493                "  int i   = 1;\n"
7494                "  int j   = 2;\n"
7495                "  int big = 10000;\n"
7496                "}",
7497                Alignment);
7498   verifyFormat("class C {\n"
7499                "public:\n"
7500                "  int i            = 1;\n"
7501                "  virtual void f() = 0;\n"
7502                "};",
7503                Alignment);
7504   verifyFormat("int i = 1;\n"
7505                "if (SomeType t = getSomething()) {\n"
7506                "}\n"
7507                "int j   = 2;\n"
7508                "int big = 10000;",
7509                Alignment);
7510   verifyFormat("int j = 7;\n"
7511                "for (int k = 0; k < N; ++k) {\n"
7512                "}\n"
7513                "int j   = 2;\n"
7514                "int big = 10000;\n"
7515                "}",
7516                Alignment);
7517   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
7518   verifyFormat("int i = 1;\n"
7519                "LooooooooooongType loooooooooooooooooooooongVariable\n"
7520                "    = someLooooooooooooooooongFunction();\n"
7521                "int j = 2;",
7522                Alignment);
7523   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
7524   verifyFormat("int i = 1;\n"
7525                "LooooooooooongType loooooooooooooooooooooongVariable =\n"
7526                "    someLooooooooooooooooongFunction();\n"
7527                "int j = 2;",
7528                Alignment);
7529 
7530   verifyFormat("auto lambda = []() {\n"
7531                "  auto i = 0;\n"
7532                "  return 0;\n"
7533                "};\n"
7534                "int i  = 0;\n"
7535                "auto v = type{\n"
7536                "    i = 1,   //\n"
7537                "    (i = 2), //\n"
7538                "    i = 3    //\n"
7539                "};",
7540                Alignment);
7541 
7542   // FIXME: Should align all three assignments
7543   verifyFormat(
7544       "int i      = 1;\n"
7545       "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
7546       "                          loooooooooooooooooooooongParameterB);\n"
7547       "int j = 2;",
7548       Alignment);
7549 
7550   verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
7551                "          typename B   = very_long_type_name_1,\n"
7552                "          typename T_2 = very_long_type_name_2>\n"
7553                "auto foo() {}\n",
7554                Alignment);
7555   verifyFormat("int a, b = 1;\n"
7556                "int c  = 2;\n"
7557                "int dd = 3;\n",
7558                Alignment);
7559   verifyFormat("int aa       = ((1 > 2) ? 3 : 4);\n"
7560                "float b[1][] = {{3.f}};\n",
7561                Alignment);
7562 }
7563 
7564 TEST_F(FormatTest, AlignConsecutiveDeclarations) {
7565   FormatStyle Alignment = getLLVMStyle();
7566   Alignment.AlignConsecutiveDeclarations = false;
7567   verifyFormat("float const a = 5;\n"
7568                "int oneTwoThree = 123;",
7569                Alignment);
7570   verifyFormat("int a = 5;\n"
7571                "float const oneTwoThree = 123;",
7572                Alignment);
7573 
7574   Alignment.AlignConsecutiveDeclarations = true;
7575   verifyFormat("float const a = 5;\n"
7576                "int         oneTwoThree = 123;",
7577                Alignment);
7578   verifyFormat("int         a = method();\n"
7579                "float const oneTwoThree = 133;",
7580                Alignment);
7581   verifyFormat("int i = 1, j = 10;\n"
7582                "something = 2000;",
7583                Alignment);
7584   verifyFormat("something = 2000;\n"
7585                "int i = 1, j = 10;\n",
7586                Alignment);
7587   verifyFormat("float      something = 2000;\n"
7588                "double     another = 911;\n"
7589                "int        i = 1, j = 10;\n"
7590                "const int *oneMore = 1;\n"
7591                "unsigned   i = 2;",
7592                Alignment);
7593   verifyFormat("float a = 5;\n"
7594                "int   one = 1;\n"
7595                "method();\n"
7596                "const double       oneTwoThree = 123;\n"
7597                "const unsigned int oneTwo = 12;",
7598                Alignment);
7599   verifyFormat("int      oneTwoThree{0}; // comment\n"
7600                "unsigned oneTwo;         // comment",
7601                Alignment);
7602   EXPECT_EQ("float const a = 5;\n"
7603             "\n"
7604             "int oneTwoThree = 123;",
7605             format("float const   a = 5;\n"
7606                    "\n"
7607                    "int           oneTwoThree= 123;",
7608                    Alignment));
7609   EXPECT_EQ("float a = 5;\n"
7610             "int   one = 1;\n"
7611             "\n"
7612             "unsigned oneTwoThree = 123;",
7613             format("float    a = 5;\n"
7614                    "int      one = 1;\n"
7615                    "\n"
7616                    "unsigned oneTwoThree = 123;",
7617                    Alignment));
7618   EXPECT_EQ("float a = 5;\n"
7619             "int   one = 1;\n"
7620             "\n"
7621             "unsigned oneTwoThree = 123;\n"
7622             "int      oneTwo = 12;",
7623             format("float    a = 5;\n"
7624                    "int one = 1;\n"
7625                    "\n"
7626                    "unsigned oneTwoThree = 123;\n"
7627                    "int oneTwo = 12;",
7628                    Alignment));
7629   Alignment.AlignConsecutiveAssignments = true;
7630   verifyFormat("float      something = 2000;\n"
7631                "double     another   = 911;\n"
7632                "int        i = 1, j = 10;\n"
7633                "const int *oneMore = 1;\n"
7634                "unsigned   i       = 2;",
7635                Alignment);
7636   verifyFormat("int      oneTwoThree = {0}; // comment\n"
7637                "unsigned oneTwo      = 0;   // comment",
7638                Alignment);
7639   EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
7640             "  int const i   = 1;\n"
7641             "  int *     j   = 2;\n"
7642             "  int       big = 10000;\n"
7643             "\n"
7644             "  unsigned oneTwoThree = 123;\n"
7645             "  int      oneTwo      = 12;\n"
7646             "  method();\n"
7647             "  float k  = 2;\n"
7648             "  int   ll = 10000;\n"
7649             "}",
7650             format("void SomeFunction(int parameter= 0) {\n"
7651                    " int const  i= 1;\n"
7652                    "  int *j=2;\n"
7653                    " int big  =  10000;\n"
7654                    "\n"
7655                    "unsigned oneTwoThree  =123;\n"
7656                    "int oneTwo = 12;\n"
7657                    "  method();\n"
7658                    "float k= 2;\n"
7659                    "int ll=10000;\n"
7660                    "}",
7661                    Alignment));
7662   Alignment.AlignConsecutiveAssignments = false;
7663   Alignment.AlignEscapedNewlinesLeft = true;
7664   verifyFormat("#define A              \\\n"
7665                "  int       aaaa = 12; \\\n"
7666                "  float     b = 23;    \\\n"
7667                "  const int ccc = 234; \\\n"
7668                "  unsigned  dddddddddd = 2345;",
7669                Alignment);
7670   Alignment.AlignEscapedNewlinesLeft = false;
7671   Alignment.ColumnLimit = 30;
7672   verifyFormat("#define A                    \\\n"
7673                "  int       aaaa = 12;       \\\n"
7674                "  float     b = 23;          \\\n"
7675                "  const int ccc = 234;       \\\n"
7676                "  int       dddddddddd = 2345;",
7677                Alignment);
7678   Alignment.ColumnLimit = 80;
7679   verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
7680                "k = 4, int l = 5,\n"
7681                "                  int m = 6) {\n"
7682                "  const int j = 10;\n"
7683                "  otherThing = 1;\n"
7684                "}",
7685                Alignment);
7686   verifyFormat("void SomeFunction(int parameter = 0) {\n"
7687                "  int const i = 1;\n"
7688                "  int *     j = 2;\n"
7689                "  int       big = 10000;\n"
7690                "}",
7691                Alignment);
7692   verifyFormat("class C {\n"
7693                "public:\n"
7694                "  int          i = 1;\n"
7695                "  virtual void f() = 0;\n"
7696                "};",
7697                Alignment);
7698   verifyFormat("float i = 1;\n"
7699                "if (SomeType t = getSomething()) {\n"
7700                "}\n"
7701                "const unsigned j = 2;\n"
7702                "int            big = 10000;",
7703                Alignment);
7704   verifyFormat("float j = 7;\n"
7705                "for (int k = 0; k < N; ++k) {\n"
7706                "}\n"
7707                "unsigned j = 2;\n"
7708                "int      big = 10000;\n"
7709                "}",
7710                Alignment);
7711   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
7712   verifyFormat("float              i = 1;\n"
7713                "LooooooooooongType loooooooooooooooooooooongVariable\n"
7714                "    = someLooooooooooooooooongFunction();\n"
7715                "int j = 2;",
7716                Alignment);
7717   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
7718   verifyFormat("int                i = 1;\n"
7719                "LooooooooooongType loooooooooooooooooooooongVariable =\n"
7720                "    someLooooooooooooooooongFunction();\n"
7721                "int j = 2;",
7722                Alignment);
7723 
7724   Alignment.AlignConsecutiveAssignments = true;
7725   verifyFormat("auto lambda = []() {\n"
7726                "  auto  ii = 0;\n"
7727                "  float j  = 0;\n"
7728                "  return 0;\n"
7729                "};\n"
7730                "int   i  = 0;\n"
7731                "float i2 = 0;\n"
7732                "auto  v  = type{\n"
7733                "    i = 1,   //\n"
7734                "    (i = 2), //\n"
7735                "    i = 3    //\n"
7736                "};",
7737                Alignment);
7738   Alignment.AlignConsecutiveAssignments = false;
7739 
7740   // FIXME: Should align all three declarations
7741   verifyFormat(
7742       "int      i = 1;\n"
7743       "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
7744       "                          loooooooooooooooooooooongParameterB);\n"
7745       "int j = 2;",
7746       Alignment);
7747 
7748   // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
7749   // We expect declarations and assignments to align, as long as it doesn't
7750   // exceed the column limit, starting a new alignemnt sequence whenever it
7751   // happens.
7752   Alignment.AlignConsecutiveAssignments = true;
7753   Alignment.ColumnLimit = 30;
7754   verifyFormat("float    ii              = 1;\n"
7755                "unsigned j               = 2;\n"
7756                "int someVerylongVariable = 1;\n"
7757                "AnotherLongType  ll = 123456;\n"
7758                "VeryVeryLongType k  = 2;\n"
7759                "int              myvar = 1;",
7760                Alignment);
7761   Alignment.ColumnLimit = 80;
7762   Alignment.AlignConsecutiveAssignments = false;
7763 
7764   verifyFormat(
7765       "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
7766       "          typename LongType, typename B>\n"
7767       "auto foo() {}\n",
7768       Alignment);
7769   verifyFormat("float a, b = 1;\n"
7770                "int   c = 2;\n"
7771                "int   dd = 3;\n",
7772                Alignment);
7773   verifyFormat("int   aa = ((1 > 2) ? 3 : 4);\n"
7774                "float b[1][] = {{3.f}};\n",
7775                Alignment);
7776   Alignment.AlignConsecutiveAssignments = true;
7777   verifyFormat("float a, b = 1;\n"
7778                "int   c  = 2;\n"
7779                "int   dd = 3;\n",
7780                Alignment);
7781   verifyFormat("int   aa     = ((1 > 2) ? 3 : 4);\n"
7782                "float b[1][] = {{3.f}};\n",
7783                Alignment);
7784   Alignment.AlignConsecutiveAssignments = false;
7785 
7786   Alignment.ColumnLimit = 30;
7787   Alignment.BinPackParameters = false;
7788   verifyFormat("void foo(float     a,\n"
7789                "         float     b,\n"
7790                "         int       c,\n"
7791                "         uint32_t *d) {\n"
7792                "  int *  e = 0;\n"
7793                "  float  f = 0;\n"
7794                "  double g = 0;\n"
7795                "}\n"
7796                "void bar(ino_t     a,\n"
7797                "         int       b,\n"
7798                "         uint32_t *c,\n"
7799                "         bool      d) {}\n",
7800                Alignment);
7801   Alignment.BinPackParameters = true;
7802   Alignment.ColumnLimit = 80;
7803 }
7804 
7805 TEST_F(FormatTest, LinuxBraceBreaking) {
7806   FormatStyle LinuxBraceStyle = getLLVMStyle();
7807   LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
7808   verifyFormat("namespace a\n"
7809                "{\n"
7810                "class A\n"
7811                "{\n"
7812                "  void f()\n"
7813                "  {\n"
7814                "    if (true) {\n"
7815                "      a();\n"
7816                "      b();\n"
7817                "    } else {\n"
7818                "      a();\n"
7819                "    }\n"
7820                "  }\n"
7821                "  void g() { return; }\n"
7822                "};\n"
7823                "struct B {\n"
7824                "  int x;\n"
7825                "};\n"
7826                "}\n",
7827                LinuxBraceStyle);
7828   verifyFormat("enum X {\n"
7829                "  Y = 0,\n"
7830                "}\n",
7831                LinuxBraceStyle);
7832   verifyFormat("struct S {\n"
7833                "  int Type;\n"
7834                "  union {\n"
7835                "    int x;\n"
7836                "    double y;\n"
7837                "  } Value;\n"
7838                "  class C\n"
7839                "  {\n"
7840                "    MyFavoriteType Value;\n"
7841                "  } Class;\n"
7842                "}\n",
7843                LinuxBraceStyle);
7844 }
7845 
7846 TEST_F(FormatTest, MozillaBraceBreaking) {
7847   FormatStyle MozillaBraceStyle = getLLVMStyle();
7848   MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
7849   verifyFormat("namespace a {\n"
7850                "class A\n"
7851                "{\n"
7852                "  void f()\n"
7853                "  {\n"
7854                "    if (true) {\n"
7855                "      a();\n"
7856                "      b();\n"
7857                "    }\n"
7858                "  }\n"
7859                "  void g() { return; }\n"
7860                "};\n"
7861                "enum E\n"
7862                "{\n"
7863                "  A,\n"
7864                "  // foo\n"
7865                "  B,\n"
7866                "  C\n"
7867                "};\n"
7868                "struct B\n"
7869                "{\n"
7870                "  int x;\n"
7871                "};\n"
7872                "}\n",
7873                MozillaBraceStyle);
7874   verifyFormat("struct S\n"
7875                "{\n"
7876                "  int Type;\n"
7877                "  union\n"
7878                "  {\n"
7879                "    int x;\n"
7880                "    double y;\n"
7881                "  } Value;\n"
7882                "  class C\n"
7883                "  {\n"
7884                "    MyFavoriteType Value;\n"
7885                "  } Class;\n"
7886                "}\n",
7887                MozillaBraceStyle);
7888 }
7889 
7890 TEST_F(FormatTest, StroustrupBraceBreaking) {
7891   FormatStyle StroustrupBraceStyle = getLLVMStyle();
7892   StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
7893   verifyFormat("namespace a {\n"
7894                "class A {\n"
7895                "  void f()\n"
7896                "  {\n"
7897                "    if (true) {\n"
7898                "      a();\n"
7899                "      b();\n"
7900                "    }\n"
7901                "  }\n"
7902                "  void g() { return; }\n"
7903                "};\n"
7904                "struct B {\n"
7905                "  int x;\n"
7906                "};\n"
7907                "}\n",
7908                StroustrupBraceStyle);
7909 
7910   verifyFormat("void foo()\n"
7911                "{\n"
7912                "  if (a) {\n"
7913                "    a();\n"
7914                "  }\n"
7915                "  else {\n"
7916                "    b();\n"
7917                "  }\n"
7918                "}\n",
7919                StroustrupBraceStyle);
7920 
7921   verifyFormat("#ifdef _DEBUG\n"
7922                "int foo(int i = 0)\n"
7923                "#else\n"
7924                "int foo(int i = 5)\n"
7925                "#endif\n"
7926                "{\n"
7927                "  return i;\n"
7928                "}",
7929                StroustrupBraceStyle);
7930 
7931   verifyFormat("void foo() {}\n"
7932                "void bar()\n"
7933                "#ifdef _DEBUG\n"
7934                "{\n"
7935                "  foo();\n"
7936                "}\n"
7937                "#else\n"
7938                "{\n"
7939                "}\n"
7940                "#endif",
7941                StroustrupBraceStyle);
7942 
7943   verifyFormat("void foobar() { int i = 5; }\n"
7944                "#ifdef _DEBUG\n"
7945                "void bar() {}\n"
7946                "#else\n"
7947                "void bar() { foobar(); }\n"
7948                "#endif",
7949                StroustrupBraceStyle);
7950 }
7951 
7952 TEST_F(FormatTest, AllmanBraceBreaking) {
7953   FormatStyle AllmanBraceStyle = getLLVMStyle();
7954   AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
7955   verifyFormat("namespace a\n"
7956                "{\n"
7957                "class A\n"
7958                "{\n"
7959                "  void f()\n"
7960                "  {\n"
7961                "    if (true)\n"
7962                "    {\n"
7963                "      a();\n"
7964                "      b();\n"
7965                "    }\n"
7966                "  }\n"
7967                "  void g() { return; }\n"
7968                "};\n"
7969                "struct B\n"
7970                "{\n"
7971                "  int x;\n"
7972                "};\n"
7973                "}",
7974                AllmanBraceStyle);
7975 
7976   verifyFormat("void f()\n"
7977                "{\n"
7978                "  if (true)\n"
7979                "  {\n"
7980                "    a();\n"
7981                "  }\n"
7982                "  else if (false)\n"
7983                "  {\n"
7984                "    b();\n"
7985                "  }\n"
7986                "  else\n"
7987                "  {\n"
7988                "    c();\n"
7989                "  }\n"
7990                "}\n",
7991                AllmanBraceStyle);
7992 
7993   verifyFormat("void f()\n"
7994                "{\n"
7995                "  for (int i = 0; i < 10; ++i)\n"
7996                "  {\n"
7997                "    a();\n"
7998                "  }\n"
7999                "  while (false)\n"
8000                "  {\n"
8001                "    b();\n"
8002                "  }\n"
8003                "  do\n"
8004                "  {\n"
8005                "    c();\n"
8006                "  } while (false)\n"
8007                "}\n",
8008                AllmanBraceStyle);
8009 
8010   verifyFormat("void f(int a)\n"
8011                "{\n"
8012                "  switch (a)\n"
8013                "  {\n"
8014                "  case 0:\n"
8015                "    break;\n"
8016                "  case 1:\n"
8017                "  {\n"
8018                "    break;\n"
8019                "  }\n"
8020                "  case 2:\n"
8021                "  {\n"
8022                "  }\n"
8023                "  break;\n"
8024                "  default:\n"
8025                "    break;\n"
8026                "  }\n"
8027                "}\n",
8028                AllmanBraceStyle);
8029 
8030   verifyFormat("enum X\n"
8031                "{\n"
8032                "  Y = 0,\n"
8033                "}\n",
8034                AllmanBraceStyle);
8035   verifyFormat("enum X\n"
8036                "{\n"
8037                "  Y = 0\n"
8038                "}\n",
8039                AllmanBraceStyle);
8040 
8041   verifyFormat("@interface BSApplicationController ()\n"
8042                "{\n"
8043                "@private\n"
8044                "  id _extraIvar;\n"
8045                "}\n"
8046                "@end\n",
8047                AllmanBraceStyle);
8048 
8049   verifyFormat("#ifdef _DEBUG\n"
8050                "int foo(int i = 0)\n"
8051                "#else\n"
8052                "int foo(int i = 5)\n"
8053                "#endif\n"
8054                "{\n"
8055                "  return i;\n"
8056                "}",
8057                AllmanBraceStyle);
8058 
8059   verifyFormat("void foo() {}\n"
8060                "void bar()\n"
8061                "#ifdef _DEBUG\n"
8062                "{\n"
8063                "  foo();\n"
8064                "}\n"
8065                "#else\n"
8066                "{\n"
8067                "}\n"
8068                "#endif",
8069                AllmanBraceStyle);
8070 
8071   verifyFormat("void foobar() { int i = 5; }\n"
8072                "#ifdef _DEBUG\n"
8073                "void bar() {}\n"
8074                "#else\n"
8075                "void bar() { foobar(); }\n"
8076                "#endif",
8077                AllmanBraceStyle);
8078 
8079   // This shouldn't affect ObjC blocks..
8080   verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
8081                "  // ...\n"
8082                "  int i;\n"
8083                "}];",
8084                AllmanBraceStyle);
8085   verifyFormat("void (^block)(void) = ^{\n"
8086                "  // ...\n"
8087                "  int i;\n"
8088                "};",
8089                AllmanBraceStyle);
8090   // .. or dict literals.
8091   verifyFormat("void f()\n"
8092                "{\n"
8093                "  [object someMethod:@{ @\"a\" : @\"b\" }];\n"
8094                "}",
8095                AllmanBraceStyle);
8096   verifyFormat("int f()\n"
8097                "{ // comment\n"
8098                "  return 42;\n"
8099                "}",
8100                AllmanBraceStyle);
8101 
8102   AllmanBraceStyle.ColumnLimit = 19;
8103   verifyFormat("void f() { int i; }", AllmanBraceStyle);
8104   AllmanBraceStyle.ColumnLimit = 18;
8105   verifyFormat("void f()\n"
8106                "{\n"
8107                "  int i;\n"
8108                "}",
8109                AllmanBraceStyle);
8110   AllmanBraceStyle.ColumnLimit = 80;
8111 
8112   FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
8113   BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = true;
8114   BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
8115   verifyFormat("void f(bool b)\n"
8116                "{\n"
8117                "  if (b)\n"
8118                "  {\n"
8119                "    return;\n"
8120                "  }\n"
8121                "}\n",
8122                BreakBeforeBraceShortIfs);
8123   verifyFormat("void f(bool b)\n"
8124                "{\n"
8125                "  if (b) return;\n"
8126                "}\n",
8127                BreakBeforeBraceShortIfs);
8128   verifyFormat("void f(bool b)\n"
8129                "{\n"
8130                "  while (b)\n"
8131                "  {\n"
8132                "    return;\n"
8133                "  }\n"
8134                "}\n",
8135                BreakBeforeBraceShortIfs);
8136 }
8137 
8138 TEST_F(FormatTest, GNUBraceBreaking) {
8139   FormatStyle GNUBraceStyle = getLLVMStyle();
8140   GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
8141   verifyFormat("namespace a\n"
8142                "{\n"
8143                "class A\n"
8144                "{\n"
8145                "  void f()\n"
8146                "  {\n"
8147                "    int a;\n"
8148                "    {\n"
8149                "      int b;\n"
8150                "    }\n"
8151                "    if (true)\n"
8152                "      {\n"
8153                "        a();\n"
8154                "        b();\n"
8155                "      }\n"
8156                "  }\n"
8157                "  void g() { return; }\n"
8158                "}\n"
8159                "}",
8160                GNUBraceStyle);
8161 
8162   verifyFormat("void f()\n"
8163                "{\n"
8164                "  if (true)\n"
8165                "    {\n"
8166                "      a();\n"
8167                "    }\n"
8168                "  else if (false)\n"
8169                "    {\n"
8170                "      b();\n"
8171                "    }\n"
8172                "  else\n"
8173                "    {\n"
8174                "      c();\n"
8175                "    }\n"
8176                "}\n",
8177                GNUBraceStyle);
8178 
8179   verifyFormat("void f()\n"
8180                "{\n"
8181                "  for (int i = 0; i < 10; ++i)\n"
8182                "    {\n"
8183                "      a();\n"
8184                "    }\n"
8185                "  while (false)\n"
8186                "    {\n"
8187                "      b();\n"
8188                "    }\n"
8189                "  do\n"
8190                "    {\n"
8191                "      c();\n"
8192                "    }\n"
8193                "  while (false);\n"
8194                "}\n",
8195                GNUBraceStyle);
8196 
8197   verifyFormat("void f(int a)\n"
8198                "{\n"
8199                "  switch (a)\n"
8200                "    {\n"
8201                "    case 0:\n"
8202                "      break;\n"
8203                "    case 1:\n"
8204                "      {\n"
8205                "        break;\n"
8206                "      }\n"
8207                "    case 2:\n"
8208                "      {\n"
8209                "      }\n"
8210                "      break;\n"
8211                "    default:\n"
8212                "      break;\n"
8213                "    }\n"
8214                "}\n",
8215                GNUBraceStyle);
8216 
8217   verifyFormat("enum X\n"
8218                "{\n"
8219                "  Y = 0,\n"
8220                "}\n",
8221                GNUBraceStyle);
8222 
8223   verifyFormat("@interface BSApplicationController ()\n"
8224                "{\n"
8225                "@private\n"
8226                "  id _extraIvar;\n"
8227                "}\n"
8228                "@end\n",
8229                GNUBraceStyle);
8230 
8231   verifyFormat("#ifdef _DEBUG\n"
8232                "int foo(int i = 0)\n"
8233                "#else\n"
8234                "int foo(int i = 5)\n"
8235                "#endif\n"
8236                "{\n"
8237                "  return i;\n"
8238                "}",
8239                GNUBraceStyle);
8240 
8241   verifyFormat("void foo() {}\n"
8242                "void bar()\n"
8243                "#ifdef _DEBUG\n"
8244                "{\n"
8245                "  foo();\n"
8246                "}\n"
8247                "#else\n"
8248                "{\n"
8249                "}\n"
8250                "#endif",
8251                GNUBraceStyle);
8252 
8253   verifyFormat("void foobar() { int i = 5; }\n"
8254                "#ifdef _DEBUG\n"
8255                "void bar() {}\n"
8256                "#else\n"
8257                "void bar() { foobar(); }\n"
8258                "#endif",
8259                GNUBraceStyle);
8260 }
8261 
8262 TEST_F(FormatTest, WebKitBraceBreaking) {
8263   FormatStyle WebKitBraceStyle = getLLVMStyle();
8264   WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
8265   verifyFormat("namespace a {\n"
8266                "class A {\n"
8267                "  void f()\n"
8268                "  {\n"
8269                "    if (true) {\n"
8270                "      a();\n"
8271                "      b();\n"
8272                "    }\n"
8273                "  }\n"
8274                "  void g() { return; }\n"
8275                "};\n"
8276                "enum E {\n"
8277                "  A,\n"
8278                "  // foo\n"
8279                "  B,\n"
8280                "  C\n"
8281                "};\n"
8282                "struct B {\n"
8283                "  int x;\n"
8284                "};\n"
8285                "}\n",
8286                WebKitBraceStyle);
8287   verifyFormat("struct S {\n"
8288                "  int Type;\n"
8289                "  union {\n"
8290                "    int x;\n"
8291                "    double y;\n"
8292                "  } Value;\n"
8293                "  class C {\n"
8294                "    MyFavoriteType Value;\n"
8295                "  } Class;\n"
8296                "};\n",
8297                WebKitBraceStyle);
8298 }
8299 
8300 TEST_F(FormatTest, CatchExceptionReferenceBinding) {
8301   verifyFormat("void f() {\n"
8302                "  try {\n"
8303                "  } catch (const Exception &e) {\n"
8304                "  }\n"
8305                "}\n",
8306                getLLVMStyle());
8307 }
8308 
8309 TEST_F(FormatTest, UnderstandsPragmas) {
8310   verifyFormat("#pragma omp reduction(| : var)");
8311   verifyFormat("#pragma omp reduction(+ : var)");
8312 
8313   EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
8314             "(including parentheses).",
8315             format("#pragma    mark   Any non-hyphenated or hyphenated string "
8316                    "(including parentheses)."));
8317 }
8318 
8319 TEST_F(FormatTest, UnderstandPragmaOption) {
8320   verifyFormat("#pragma option -C -A");
8321 
8322   EXPECT_EQ("#pragma option -C -A", format("#pragma    option   -C   -A"));
8323 }
8324 
8325 #define EXPECT_ALL_STYLES_EQUAL(Styles)                                        \
8326   for (size_t i = 1; i < Styles.size(); ++i)                                   \
8327   EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \
8328                                   << " differs from Style #0"
8329 
8330 TEST_F(FormatTest, GetsPredefinedStyleByName) {
8331   SmallVector<FormatStyle, 3> Styles;
8332   Styles.resize(3);
8333 
8334   Styles[0] = getLLVMStyle();
8335   EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
8336   EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
8337   EXPECT_ALL_STYLES_EQUAL(Styles);
8338 
8339   Styles[0] = getGoogleStyle();
8340   EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
8341   EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
8342   EXPECT_ALL_STYLES_EQUAL(Styles);
8343 
8344   Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
8345   EXPECT_TRUE(
8346       getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
8347   EXPECT_TRUE(
8348       getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
8349   EXPECT_ALL_STYLES_EQUAL(Styles);
8350 
8351   Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
8352   EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
8353   EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
8354   EXPECT_ALL_STYLES_EQUAL(Styles);
8355 
8356   Styles[0] = getMozillaStyle();
8357   EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
8358   EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
8359   EXPECT_ALL_STYLES_EQUAL(Styles);
8360 
8361   Styles[0] = getWebKitStyle();
8362   EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
8363   EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
8364   EXPECT_ALL_STYLES_EQUAL(Styles);
8365 
8366   Styles[0] = getGNUStyle();
8367   EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
8368   EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
8369   EXPECT_ALL_STYLES_EQUAL(Styles);
8370 
8371   EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
8372 }
8373 
8374 TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
8375   SmallVector<FormatStyle, 8> Styles;
8376   Styles.resize(2);
8377 
8378   Styles[0] = getGoogleStyle();
8379   Styles[1] = getLLVMStyle();
8380   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
8381   EXPECT_ALL_STYLES_EQUAL(Styles);
8382 
8383   Styles.resize(5);
8384   Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
8385   Styles[1] = getLLVMStyle();
8386   Styles[1].Language = FormatStyle::LK_JavaScript;
8387   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
8388 
8389   Styles[2] = getLLVMStyle();
8390   Styles[2].Language = FormatStyle::LK_JavaScript;
8391   EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
8392                                   "BasedOnStyle: Google",
8393                                   &Styles[2])
8394                    .value());
8395 
8396   Styles[3] = getLLVMStyle();
8397   Styles[3].Language = FormatStyle::LK_JavaScript;
8398   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
8399                                   "Language: JavaScript",
8400                                   &Styles[3])
8401                    .value());
8402 
8403   Styles[4] = getLLVMStyle();
8404   Styles[4].Language = FormatStyle::LK_JavaScript;
8405   EXPECT_EQ(0, parseConfiguration("---\n"
8406                                   "BasedOnStyle: LLVM\n"
8407                                   "IndentWidth: 123\n"
8408                                   "---\n"
8409                                   "BasedOnStyle: Google\n"
8410                                   "Language: JavaScript",
8411                                   &Styles[4])
8412                    .value());
8413   EXPECT_ALL_STYLES_EQUAL(Styles);
8414 }
8415 
8416 #define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME)                             \
8417   Style.FIELD = false;                                                         \
8418   EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value());      \
8419   EXPECT_TRUE(Style.FIELD);                                                    \
8420   EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value());     \
8421   EXPECT_FALSE(Style.FIELD);
8422 
8423 #define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
8424 
8425 #define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME)              \
8426   Style.STRUCT.FIELD = false;                                                  \
8427   EXPECT_EQ(0,                                                                 \
8428             parseConfiguration(#STRUCT ":\n  " CONFIG_NAME ": true", &Style)   \
8429                 .value());                                                     \
8430   EXPECT_TRUE(Style.STRUCT.FIELD);                                             \
8431   EXPECT_EQ(0,                                                                 \
8432             parseConfiguration(#STRUCT ":\n  " CONFIG_NAME ": false", &Style)  \
8433                 .value());                                                     \
8434   EXPECT_FALSE(Style.STRUCT.FIELD);
8435 
8436 #define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD)                                 \
8437   CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
8438 
8439 #define CHECK_PARSE(TEXT, FIELD, VALUE)                                        \
8440   EXPECT_NE(VALUE, Style.FIELD);                                               \
8441   EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value());                      \
8442   EXPECT_EQ(VALUE, Style.FIELD)
8443 
8444 TEST_F(FormatTest, ParsesConfigurationBools) {
8445   FormatStyle Style = {};
8446   Style.Language = FormatStyle::LK_Cpp;
8447   CHECK_PARSE_BOOL(AlignEscapedNewlinesLeft);
8448   CHECK_PARSE_BOOL(AlignOperands);
8449   CHECK_PARSE_BOOL(AlignTrailingComments);
8450   CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
8451   CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
8452   CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
8453   CHECK_PARSE_BOOL(AllowShortBlocksOnASingleLine);
8454   CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
8455   CHECK_PARSE_BOOL(AllowShortIfStatementsOnASingleLine);
8456   CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
8457   CHECK_PARSE_BOOL(AlwaysBreakTemplateDeclarations);
8458   CHECK_PARSE_BOOL(BinPackArguments);
8459   CHECK_PARSE_BOOL(BinPackParameters);
8460   CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
8461   CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
8462   CHECK_PARSE_BOOL(BreakConstructorInitializersBeforeComma);
8463   CHECK_PARSE_BOOL(BreakStringLiterals);
8464   CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
8465   CHECK_PARSE_BOOL(DerivePointerAlignment);
8466   CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
8467   CHECK_PARSE_BOOL(DisableFormat);
8468   CHECK_PARSE_BOOL(IndentCaseLabels);
8469   CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
8470   CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
8471   CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
8472   CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
8473   CHECK_PARSE_BOOL(Cpp11BracedListStyle);
8474   CHECK_PARSE_BOOL(ReflowComments);
8475   CHECK_PARSE_BOOL(SortIncludes);
8476   CHECK_PARSE_BOOL(SpacesInParentheses);
8477   CHECK_PARSE_BOOL(SpacesInSquareBrackets);
8478   CHECK_PARSE_BOOL(SpacesInAngles);
8479   CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
8480   CHECK_PARSE_BOOL(SpacesInContainerLiterals);
8481   CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
8482   CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
8483   CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
8484   CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
8485 
8486   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
8487   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement);
8488   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
8489   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
8490   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
8491   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
8492   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
8493   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
8494   CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
8495   CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
8496   CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
8497 }
8498 
8499 #undef CHECK_PARSE_BOOL
8500 
8501 TEST_F(FormatTest, ParsesConfiguration) {
8502   FormatStyle Style = {};
8503   Style.Language = FormatStyle::LK_Cpp;
8504   CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
8505   CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
8506               ConstructorInitializerIndentWidth, 1234u);
8507   CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
8508   CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
8509   CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
8510   CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
8511               PenaltyBreakBeforeFirstCallParameter, 1234u);
8512   CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
8513   CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
8514               PenaltyReturnTypeOnItsOwnLine, 1234u);
8515   CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
8516               SpacesBeforeTrailingComments, 1234u);
8517   CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
8518   CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
8519   CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
8520 
8521   Style.PointerAlignment = FormatStyle::PAS_Middle;
8522   CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
8523               FormatStyle::PAS_Left);
8524   CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
8525               FormatStyle::PAS_Right);
8526   CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
8527               FormatStyle::PAS_Middle);
8528   // For backward compatibility:
8529   CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
8530               FormatStyle::PAS_Left);
8531   CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
8532               FormatStyle::PAS_Right);
8533   CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
8534               FormatStyle::PAS_Middle);
8535 
8536   Style.Standard = FormatStyle::LS_Auto;
8537   CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
8538   CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11);
8539   CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
8540   CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
8541   CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
8542 
8543   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
8544   CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
8545               BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
8546   CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
8547               FormatStyle::BOS_None);
8548   CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
8549               FormatStyle::BOS_All);
8550   // For backward compatibility:
8551   CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
8552               FormatStyle::BOS_None);
8553   CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
8554               FormatStyle::BOS_All);
8555 
8556   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
8557   CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
8558               FormatStyle::BAS_Align);
8559   CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
8560               FormatStyle::BAS_DontAlign);
8561   CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
8562               FormatStyle::BAS_AlwaysBreak);
8563   // For backward compatibility:
8564   CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
8565               FormatStyle::BAS_DontAlign);
8566   CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
8567               FormatStyle::BAS_Align);
8568 
8569   Style.UseTab = FormatStyle::UT_ForIndentation;
8570   CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
8571   CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
8572   CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
8573   CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
8574               FormatStyle::UT_ForContinuationAndIndentation);
8575   // For backward compatibility:
8576   CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
8577   CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
8578 
8579   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
8580   CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
8581               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
8582   CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
8583               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
8584   CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
8585               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
8586   CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
8587               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
8588   // For backward compatibility:
8589   CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
8590               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
8591   CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
8592               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
8593 
8594   Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
8595   CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
8596               FormatStyle::SBPO_Never);
8597   CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
8598               FormatStyle::SBPO_Always);
8599   CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
8600               FormatStyle::SBPO_ControlStatements);
8601   // For backward compatibility:
8602   CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
8603               FormatStyle::SBPO_Never);
8604   CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
8605               FormatStyle::SBPO_ControlStatements);
8606 
8607   Style.ColumnLimit = 123;
8608   FormatStyle BaseStyle = getLLVMStyle();
8609   CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
8610   CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
8611 
8612   Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
8613   CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
8614               FormatStyle::BS_Attach);
8615   CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
8616               FormatStyle::BS_Linux);
8617   CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
8618               FormatStyle::BS_Mozilla);
8619   CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
8620               FormatStyle::BS_Stroustrup);
8621   CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
8622               FormatStyle::BS_Allman);
8623   CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
8624   CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
8625               FormatStyle::BS_WebKit);
8626   CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
8627               FormatStyle::BS_Custom);
8628 
8629   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
8630   CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
8631               FormatStyle::RTBS_None);
8632   CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
8633               FormatStyle::RTBS_All);
8634   CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
8635               AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
8636   CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
8637               AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
8638   CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
8639               AlwaysBreakAfterReturnType,
8640               FormatStyle::RTBS_TopLevelDefinitions);
8641 
8642   Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
8643   CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
8644               AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
8645   CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
8646               AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
8647   CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
8648               AlwaysBreakAfterDefinitionReturnType,
8649               FormatStyle::DRTBS_TopLevel);
8650 
8651   Style.NamespaceIndentation = FormatStyle::NI_All;
8652   CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
8653               FormatStyle::NI_None);
8654   CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
8655               FormatStyle::NI_Inner);
8656   CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
8657               FormatStyle::NI_All);
8658 
8659   // FIXME: This is required because parsing a configuration simply overwrites
8660   // the first N elements of the list instead of resetting it.
8661   Style.ForEachMacros.clear();
8662   std::vector<std::string> BoostForeach;
8663   BoostForeach.push_back("BOOST_FOREACH");
8664   CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
8665   std::vector<std::string> BoostAndQForeach;
8666   BoostAndQForeach.push_back("BOOST_FOREACH");
8667   BoostAndQForeach.push_back("Q_FOREACH");
8668   CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
8669               BoostAndQForeach);
8670 
8671   Style.IncludeCategories.clear();
8672   std::vector<FormatStyle::IncludeCategory> ExpectedCategories = {{"abc/.*", 2},
8673                                                                   {".*", 1}};
8674   CHECK_PARSE("IncludeCategories:\n"
8675               "  - Regex: abc/.*\n"
8676               "    Priority: 2\n"
8677               "  - Regex: .*\n"
8678               "    Priority: 1",
8679               IncludeCategories, ExpectedCategories);
8680   CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeIsMainRegex, "abc$");
8681 }
8682 
8683 TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
8684   FormatStyle Style = {};
8685   Style.Language = FormatStyle::LK_Cpp;
8686   CHECK_PARSE("Language: Cpp\n"
8687               "IndentWidth: 12",
8688               IndentWidth, 12u);
8689   EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
8690                                "IndentWidth: 34",
8691                                &Style),
8692             ParseError::Unsuitable);
8693   EXPECT_EQ(12u, Style.IndentWidth);
8694   CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
8695   EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
8696 
8697   Style.Language = FormatStyle::LK_JavaScript;
8698   CHECK_PARSE("Language: JavaScript\n"
8699               "IndentWidth: 12",
8700               IndentWidth, 12u);
8701   CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
8702   EXPECT_EQ(parseConfiguration("Language: Cpp\n"
8703                                "IndentWidth: 34",
8704                                &Style),
8705             ParseError::Unsuitable);
8706   EXPECT_EQ(23u, Style.IndentWidth);
8707   CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
8708   EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
8709 
8710   CHECK_PARSE("BasedOnStyle: LLVM\n"
8711               "IndentWidth: 67",
8712               IndentWidth, 67u);
8713 
8714   CHECK_PARSE("---\n"
8715               "Language: JavaScript\n"
8716               "IndentWidth: 12\n"
8717               "---\n"
8718               "Language: Cpp\n"
8719               "IndentWidth: 34\n"
8720               "...\n",
8721               IndentWidth, 12u);
8722 
8723   Style.Language = FormatStyle::LK_Cpp;
8724   CHECK_PARSE("---\n"
8725               "Language: JavaScript\n"
8726               "IndentWidth: 12\n"
8727               "---\n"
8728               "Language: Cpp\n"
8729               "IndentWidth: 34\n"
8730               "...\n",
8731               IndentWidth, 34u);
8732   CHECK_PARSE("---\n"
8733               "IndentWidth: 78\n"
8734               "---\n"
8735               "Language: JavaScript\n"
8736               "IndentWidth: 56\n"
8737               "...\n",
8738               IndentWidth, 78u);
8739 
8740   Style.ColumnLimit = 123;
8741   Style.IndentWidth = 234;
8742   Style.BreakBeforeBraces = FormatStyle::BS_Linux;
8743   Style.TabWidth = 345;
8744   EXPECT_FALSE(parseConfiguration("---\n"
8745                                   "IndentWidth: 456\n"
8746                                   "BreakBeforeBraces: Allman\n"
8747                                   "---\n"
8748                                   "Language: JavaScript\n"
8749                                   "IndentWidth: 111\n"
8750                                   "TabWidth: 111\n"
8751                                   "---\n"
8752                                   "Language: Cpp\n"
8753                                   "BreakBeforeBraces: Stroustrup\n"
8754                                   "TabWidth: 789\n"
8755                                   "...\n",
8756                                   &Style));
8757   EXPECT_EQ(123u, Style.ColumnLimit);
8758   EXPECT_EQ(456u, Style.IndentWidth);
8759   EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
8760   EXPECT_EQ(789u, Style.TabWidth);
8761 
8762   EXPECT_EQ(parseConfiguration("---\n"
8763                                "Language: JavaScript\n"
8764                                "IndentWidth: 56\n"
8765                                "---\n"
8766                                "IndentWidth: 78\n"
8767                                "...\n",
8768                                &Style),
8769             ParseError::Error);
8770   EXPECT_EQ(parseConfiguration("---\n"
8771                                "Language: JavaScript\n"
8772                                "IndentWidth: 56\n"
8773                                "---\n"
8774                                "Language: JavaScript\n"
8775                                "IndentWidth: 78\n"
8776                                "...\n",
8777                                &Style),
8778             ParseError::Error);
8779 
8780   EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
8781 }
8782 
8783 #undef CHECK_PARSE
8784 
8785 TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
8786   FormatStyle Style = {};
8787   Style.Language = FormatStyle::LK_JavaScript;
8788   Style.BreakBeforeTernaryOperators = true;
8789   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
8790   EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
8791 
8792   Style.BreakBeforeTernaryOperators = true;
8793   EXPECT_EQ(0, parseConfiguration("---\n"
8794                                   "BasedOnStyle: Google\n"
8795                                   "---\n"
8796                                   "Language: JavaScript\n"
8797                                   "IndentWidth: 76\n"
8798                                   "...\n",
8799                                   &Style)
8800                    .value());
8801   EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
8802   EXPECT_EQ(76u, Style.IndentWidth);
8803   EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
8804 }
8805 
8806 TEST_F(FormatTest, ConfigurationRoundTripTest) {
8807   FormatStyle Style = getLLVMStyle();
8808   std::string YAML = configurationAsText(Style);
8809   FormatStyle ParsedStyle = {};
8810   ParsedStyle.Language = FormatStyle::LK_Cpp;
8811   EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
8812   EXPECT_EQ(Style, ParsedStyle);
8813 }
8814 
8815 TEST_F(FormatTest, WorksFor8bitEncodings) {
8816   EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
8817             "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
8818             "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
8819             "\"\xef\xee\xf0\xf3...\"",
8820             format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
8821                    "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
8822                    "\xef\xee\xf0\xf3...\"",
8823                    getLLVMStyleWithColumns(12)));
8824 }
8825 
8826 TEST_F(FormatTest, HandlesUTF8BOM) {
8827   EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
8828   EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
8829             format("\xef\xbb\xbf#include <iostream>"));
8830   EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
8831             format("\xef\xbb\xbf\n#include <iostream>"));
8832 }
8833 
8834 // FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
8835 #if !defined(_MSC_VER)
8836 
8837 TEST_F(FormatTest, CountsUTF8CharactersProperly) {
8838   verifyFormat("\"Однажды в студёную зимнюю пору...\"",
8839                getLLVMStyleWithColumns(35));
8840   verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
8841                getLLVMStyleWithColumns(31));
8842   verifyFormat("// Однажды в студёную зимнюю пору...",
8843                getLLVMStyleWithColumns(36));
8844   verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
8845   verifyFormat("/* Однажды в студёную зимнюю пору... */",
8846                getLLVMStyleWithColumns(39));
8847   verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
8848                getLLVMStyleWithColumns(35));
8849 }
8850 
8851 TEST_F(FormatTest, SplitsUTF8Strings) {
8852   // Non-printable characters' width is currently considered to be the length in
8853   // bytes in UTF8. The characters can be displayed in very different manner
8854   // (zero-width, single width with a substitution glyph, expanded to their code
8855   // (e.g. "<8d>"), so there's no single correct way to handle them.
8856   EXPECT_EQ("\"aaaaÄ\"\n"
8857             "\"\xc2\x8d\";",
8858             format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
8859   EXPECT_EQ("\"aaaaaaaÄ\"\n"
8860             "\"\xc2\x8d\";",
8861             format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
8862   EXPECT_EQ("\"Однажды, в \"\n"
8863             "\"студёную \"\n"
8864             "\"зимнюю \"\n"
8865             "\"пору,\"",
8866             format("\"Однажды, в студёную зимнюю пору,\"",
8867                    getLLVMStyleWithColumns(13)));
8868   EXPECT_EQ(
8869       "\"一 二 三 \"\n"
8870       "\"四 五六 \"\n"
8871       "\"七 八 九 \"\n"
8872       "\"十\"",
8873       format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
8874   EXPECT_EQ("\"一\t二 \"\n"
8875             "\"\t三 \"\n"
8876             "\"四 五\t六 \"\n"
8877             "\"\t七 \"\n"
8878             "\"八九十\tqq\"",
8879             format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
8880                    getLLVMStyleWithColumns(11)));
8881 
8882   // UTF8 character in an escape sequence.
8883   EXPECT_EQ("\"aaaaaa\"\n"
8884             "\"\\\xC2\x8D\"",
8885             format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
8886 }
8887 
8888 TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
8889   EXPECT_EQ("const char *sssss =\n"
8890             "    \"一二三四五六七八\\\n"
8891             " 九 十\";",
8892             format("const char *sssss = \"一二三四五六七八\\\n"
8893                    " 九 十\";",
8894                    getLLVMStyleWithColumns(30)));
8895 }
8896 
8897 TEST_F(FormatTest, SplitsUTF8LineComments) {
8898   EXPECT_EQ("// aaaaÄ\xc2\x8d",
8899             format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
8900   EXPECT_EQ("// Я из лесу\n"
8901             "// вышел; был\n"
8902             "// сильный\n"
8903             "// мороз.",
8904             format("// Я из лесу вышел; был сильный мороз.",
8905                    getLLVMStyleWithColumns(13)));
8906   EXPECT_EQ("// 一二三\n"
8907             "// 四五六七\n"
8908             "// 八  九\n"
8909             "// 十",
8910             format("// 一二三 四五六七 八  九 十", getLLVMStyleWithColumns(9)));
8911 }
8912 
8913 TEST_F(FormatTest, SplitsUTF8BlockComments) {
8914   EXPECT_EQ("/* Гляжу,\n"
8915             " * поднимается\n"
8916             " * медленно в\n"
8917             " * гору\n"
8918             " * Лошадка,\n"
8919             " * везущая\n"
8920             " * хворосту\n"
8921             " * воз. */",
8922             format("/* Гляжу, поднимается медленно в гору\n"
8923                    " * Лошадка, везущая хворосту воз. */",
8924                    getLLVMStyleWithColumns(13)));
8925   EXPECT_EQ(
8926       "/* 一二三\n"
8927       " * 四五六七\n"
8928       " * 八  九\n"
8929       " * 十  */",
8930       format("/* 一二三 四五六七 八  九 十  */", getLLVMStyleWithColumns(9)));
8931   EXPECT_EQ("/* �������� ��������\n"
8932             " * ��������\n"
8933             " * ������-�� */",
8934             format("/* �������� �������� �������� ������-�� */", getLLVMStyleWithColumns(12)));
8935 }
8936 
8937 #endif // _MSC_VER
8938 
8939 TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
8940   FormatStyle Style = getLLVMStyle();
8941 
8942   Style.ConstructorInitializerIndentWidth = 4;
8943   verifyFormat(
8944       "SomeClass::Constructor()\n"
8945       "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
8946       "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
8947       Style);
8948 
8949   Style.ConstructorInitializerIndentWidth = 2;
8950   verifyFormat(
8951       "SomeClass::Constructor()\n"
8952       "  : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
8953       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
8954       Style);
8955 
8956   Style.ConstructorInitializerIndentWidth = 0;
8957   verifyFormat(
8958       "SomeClass::Constructor()\n"
8959       ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
8960       "  aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
8961       Style);
8962   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
8963   verifyFormat(
8964       "SomeLongTemplateVariableName<\n"
8965       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
8966       Style);
8967   verifyFormat(
8968       "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
8969       "                       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
8970       Style);
8971 }
8972 
8973 TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
8974   FormatStyle Style = getLLVMStyle();
8975   Style.BreakConstructorInitializersBeforeComma = true;
8976   Style.ConstructorInitializerIndentWidth = 4;
8977   verifyFormat("SomeClass::Constructor()\n"
8978                "    : a(a)\n"
8979                "    , b(b)\n"
8980                "    , c(c) {}",
8981                Style);
8982   verifyFormat("SomeClass::Constructor()\n"
8983                "    : a(a) {}",
8984                Style);
8985 
8986   Style.ColumnLimit = 0;
8987   verifyFormat("SomeClass::Constructor()\n"
8988                "    : a(a) {}",
8989                Style);
8990   verifyFormat("SomeClass::Constructor() noexcept\n"
8991                "    : a(a) {}",
8992                Style);
8993   verifyFormat("SomeClass::Constructor()\n"
8994                "    : a(a)\n"
8995                "    , b(b)\n"
8996                "    , c(c) {}",
8997                Style);
8998   verifyFormat("SomeClass::Constructor()\n"
8999                "    : a(a) {\n"
9000                "  foo();\n"
9001                "  bar();\n"
9002                "}",
9003                Style);
9004 
9005   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
9006   verifyFormat("SomeClass::Constructor()\n"
9007                "    : a(a)\n"
9008                "    , b(b)\n"
9009                "    , c(c) {\n}",
9010                Style);
9011   verifyFormat("SomeClass::Constructor()\n"
9012                "    : a(a) {\n}",
9013                Style);
9014 
9015   Style.ColumnLimit = 80;
9016   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
9017   Style.ConstructorInitializerIndentWidth = 2;
9018   verifyFormat("SomeClass::Constructor()\n"
9019                "  : a(a)\n"
9020                "  , b(b)\n"
9021                "  , c(c) {}",
9022                Style);
9023 
9024   Style.ConstructorInitializerIndentWidth = 0;
9025   verifyFormat("SomeClass::Constructor()\n"
9026                ": a(a)\n"
9027                ", b(b)\n"
9028                ", c(c) {}",
9029                Style);
9030 
9031   Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
9032   Style.ConstructorInitializerIndentWidth = 4;
9033   verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
9034   verifyFormat(
9035       "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
9036       Style);
9037   verifyFormat(
9038       "SomeClass::Constructor()\n"
9039       "    : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
9040       Style);
9041   Style.ConstructorInitializerIndentWidth = 4;
9042   Style.ColumnLimit = 60;
9043   verifyFormat("SomeClass::Constructor()\n"
9044                "    : aaaaaaaa(aaaaaaaa)\n"
9045                "    , aaaaaaaa(aaaaaaaa)\n"
9046                "    , aaaaaaaa(aaaaaaaa) {}",
9047                Style);
9048 }
9049 
9050 TEST_F(FormatTest, Destructors) {
9051   verifyFormat("void F(int &i) { i.~int(); }");
9052   verifyFormat("void F(int &i) { i->~int(); }");
9053 }
9054 
9055 TEST_F(FormatTest, FormatsWithWebKitStyle) {
9056   FormatStyle Style = getWebKitStyle();
9057 
9058   // Don't indent in outer namespaces.
9059   verifyFormat("namespace outer {\n"
9060                "int i;\n"
9061                "namespace inner {\n"
9062                "    int i;\n"
9063                "} // namespace inner\n"
9064                "} // namespace outer\n"
9065                "namespace other_outer {\n"
9066                "int i;\n"
9067                "}",
9068                Style);
9069 
9070   // Don't indent case labels.
9071   verifyFormat("switch (variable) {\n"
9072                "case 1:\n"
9073                "case 2:\n"
9074                "    doSomething();\n"
9075                "    break;\n"
9076                "default:\n"
9077                "    ++variable;\n"
9078                "}",
9079                Style);
9080 
9081   // Wrap before binary operators.
9082   EXPECT_EQ("void f()\n"
9083             "{\n"
9084             "    if (aaaaaaaaaaaaaaaa\n"
9085             "        && bbbbbbbbbbbbbbbbbbbbbbbb\n"
9086             "        && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
9087             "        return;\n"
9088             "}",
9089             format("void f() {\n"
9090                    "if (aaaaaaaaaaaaaaaa\n"
9091                    "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
9092                    "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
9093                    "return;\n"
9094                    "}",
9095                    Style));
9096 
9097   // Allow functions on a single line.
9098   verifyFormat("void f() { return; }", Style);
9099 
9100   // Constructor initializers are formatted one per line with the "," on the
9101   // new line.
9102   verifyFormat("Constructor()\n"
9103                "    : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
9104                "    , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
9105                "          aaaaaaaaaaaaaa)\n"
9106                "    , aaaaaaaaaaaaaaaaaaaaaaa()\n"
9107                "{\n"
9108                "}",
9109                Style);
9110   verifyFormat("SomeClass::Constructor()\n"
9111                "    : a(a)\n"
9112                "{\n"
9113                "}",
9114                Style);
9115   EXPECT_EQ("SomeClass::Constructor()\n"
9116             "    : a(a)\n"
9117             "{\n"
9118             "}",
9119             format("SomeClass::Constructor():a(a){}", Style));
9120   verifyFormat("SomeClass::Constructor()\n"
9121                "    : a(a)\n"
9122                "    , b(b)\n"
9123                "    , c(c)\n"
9124                "{\n"
9125                "}",
9126                Style);
9127   verifyFormat("SomeClass::Constructor()\n"
9128                "    : a(a)\n"
9129                "{\n"
9130                "    foo();\n"
9131                "    bar();\n"
9132                "}",
9133                Style);
9134 
9135   // Access specifiers should be aligned left.
9136   verifyFormat("class C {\n"
9137                "public:\n"
9138                "    int i;\n"
9139                "};",
9140                Style);
9141 
9142   // Do not align comments.
9143   verifyFormat("int a; // Do not\n"
9144                "double b; // align comments.",
9145                Style);
9146 
9147   // Do not align operands.
9148   EXPECT_EQ("ASSERT(aaaa\n"
9149             "    || bbbb);",
9150             format("ASSERT ( aaaa\n||bbbb);", Style));
9151 
9152   // Accept input's line breaks.
9153   EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
9154             "    || bbbbbbbbbbbbbbb) {\n"
9155             "    i++;\n"
9156             "}",
9157             format("if (aaaaaaaaaaaaaaa\n"
9158                    "|| bbbbbbbbbbbbbbb) { i++; }",
9159                    Style));
9160   EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
9161             "    i++;\n"
9162             "}",
9163             format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
9164 
9165   // Don't automatically break all macro definitions (llvm.org/PR17842).
9166   verifyFormat("#define aNumber 10", Style);
9167   // However, generally keep the line breaks that the user authored.
9168   EXPECT_EQ("#define aNumber \\\n"
9169             "    10",
9170             format("#define aNumber \\\n"
9171                    " 10",
9172                    Style));
9173 
9174   // Keep empty and one-element array literals on a single line.
9175   EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
9176             "                                  copyItems:YES];",
9177             format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
9178                    "copyItems:YES];",
9179                    Style));
9180   EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
9181             "                                  copyItems:YES];",
9182             format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
9183                    "             copyItems:YES];",
9184                    Style));
9185   // FIXME: This does not seem right, there should be more indentation before
9186   // the array literal's entries. Nested blocks have the same problem.
9187   EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
9188             "    @\"a\",\n"
9189             "    @\"a\"\n"
9190             "]\n"
9191             "                                  copyItems:YES];",
9192             format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
9193                    "     @\"a\",\n"
9194                    "     @\"a\"\n"
9195                    "     ]\n"
9196                    "       copyItems:YES];",
9197                    Style));
9198   EXPECT_EQ(
9199       "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
9200       "                                  copyItems:YES];",
9201       format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
9202              "   copyItems:YES];",
9203              Style));
9204 
9205   verifyFormat("[self.a b:c c:d];", Style);
9206   EXPECT_EQ("[self.a b:c\n"
9207             "        c:d];",
9208             format("[self.a b:c\n"
9209                    "c:d];",
9210                    Style));
9211 }
9212 
9213 TEST_F(FormatTest, FormatsLambdas) {
9214   verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
9215   verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
9216   verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
9217   verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
9218   verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
9219   verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
9220   verifyFormat("int x = f(*+[] {});");
9221   verifyFormat("void f() {\n"
9222                "  other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
9223                "}\n");
9224   verifyFormat("void f() {\n"
9225                "  other(x.begin(), //\n"
9226                "        x.end(),   //\n"
9227                "        [&](int, int) { return 1; });\n"
9228                "}\n");
9229   verifyFormat("SomeFunction([]() { // A cool function...\n"
9230                "  return 43;\n"
9231                "});");
9232   EXPECT_EQ("SomeFunction([]() {\n"
9233             "#define A a\n"
9234             "  return 43;\n"
9235             "});",
9236             format("SomeFunction([](){\n"
9237                    "#define A a\n"
9238                    "return 43;\n"
9239                    "});"));
9240   verifyFormat("void f() {\n"
9241                "  SomeFunction([](decltype(x), A *a) {});\n"
9242                "}");
9243   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
9244                "    [](const aaaaaaaaaa &a) { return a; });");
9245   verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
9246                "  SomeOtherFunctioooooooooooooooooooooooooon();\n"
9247                "});");
9248   verifyFormat("Constructor()\n"
9249                "    : Field([] { // comment\n"
9250                "        int i;\n"
9251                "      }) {}");
9252   verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
9253                "  return some_parameter.size();\n"
9254                "};");
9255   verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
9256                "    [](const string &s) { return s; };");
9257   verifyFormat("int i = aaaaaa ? 1 //\n"
9258                "               : [] {\n"
9259                "                   return 2; //\n"
9260                "                 }();");
9261   verifyFormat("llvm::errs() << \"number of twos is \"\n"
9262                "             << std::count_if(v.begin(), v.end(), [](int x) {\n"
9263                "                  return x == 2; // force break\n"
9264                "                });");
9265   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
9266                "    [=](int iiiiiiiiiiii) {\n"
9267                "      return aaaaaaaaaaaaaaaaaaaaaaa !=\n"
9268                "             aaaaaaaaaaaaaaaaaaaaaaa;\n"
9269                "    });",
9270                getLLVMStyleWithColumns(60));
9271   verifyFormat("SomeFunction({[&] {\n"
9272                "                // comment\n"
9273                "              },\n"
9274                "              [&] {\n"
9275                "                // comment\n"
9276                "              }});");
9277   verifyFormat("SomeFunction({[&] {\n"
9278                "  // comment\n"
9279                "}});");
9280   verifyFormat("virtual aaaaaaaaaaaaaaaa(std::function<bool()> bbbbbbbbbbbb =\n"
9281                "                             [&]() { return true; },\n"
9282                "                         aaaaa aaaaaaaaa);");
9283 
9284   // Lambdas with return types.
9285   verifyFormat("int c = []() -> int { return 2; }();\n");
9286   verifyFormat("int c = []() -> int * { return 2; }();\n");
9287   verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
9288   verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
9289   verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
9290   verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
9291   verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
9292   verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
9293   verifyFormat("[a, a]() -> a<1> {};");
9294   verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
9295                "                   int j) -> int {\n"
9296                "  return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
9297                "};");
9298   verifyFormat(
9299       "aaaaaaaaaaaaaaaaaaaaaa(\n"
9300       "    [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
9301       "      return aaaaaaaaaaaaaaaaa;\n"
9302       "    });",
9303       getLLVMStyleWithColumns(70));
9304   verifyFormat("[]() //\n"
9305                "    -> int {\n"
9306                "  return 1; //\n"
9307                "};");
9308 
9309   // Multiple lambdas in the same parentheses change indentation rules.
9310   verifyFormat("SomeFunction(\n"
9311                "    []() {\n"
9312                "      int i = 42;\n"
9313                "      return i;\n"
9314                "    },\n"
9315                "    []() {\n"
9316                "      int j = 43;\n"
9317                "      return j;\n"
9318                "    });");
9319 
9320   // More complex introducers.
9321   verifyFormat("return [i, args...] {};");
9322 
9323   // Not lambdas.
9324   verifyFormat("constexpr char hello[]{\"hello\"};");
9325   verifyFormat("double &operator[](int i) { return 0; }\n"
9326                "int i;");
9327   verifyFormat("std::unique_ptr<int[]> foo() {}");
9328   verifyFormat("int i = a[a][a]->f();");
9329   verifyFormat("int i = (*b)[a]->f();");
9330 
9331   // Other corner cases.
9332   verifyFormat("void f() {\n"
9333                "  bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
9334                "      );\n"
9335                "}");
9336 
9337   // Lambdas created through weird macros.
9338   verifyFormat("void f() {\n"
9339                "  MACRO((const AA &a) { return 1; });\n"
9340                "  MACRO((AA &a) { return 1; });\n"
9341                "}");
9342 
9343   verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
9344                "      doo_dah();\n"
9345                "      doo_dah();\n"
9346                "    })) {\n"
9347                "}");
9348   verifyFormat("auto lambda = []() {\n"
9349                "  int a = 2\n"
9350                "#if A\n"
9351                "          + 2\n"
9352                "#endif\n"
9353                "      ;\n"
9354                "};");
9355 
9356   // Lambdas with complex multiline introducers.
9357   verifyFormat(
9358       "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
9359       "    [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n"
9360       "        -> ::std::unordered_set<\n"
9361       "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n"
9362       "      //\n"
9363       "    });");
9364 }
9365 
9366 TEST_F(FormatTest, FormatsBlocks) {
9367   FormatStyle ShortBlocks = getLLVMStyle();
9368   ShortBlocks.AllowShortBlocksOnASingleLine = true;
9369   verifyFormat("int (^Block)(int, int);", ShortBlocks);
9370   verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
9371   verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
9372   verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
9373   verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
9374   verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
9375 
9376   verifyFormat("foo(^{ bar(); });", ShortBlocks);
9377   verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
9378   verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
9379 
9380   verifyFormat("[operation setCompletionBlock:^{\n"
9381                "  [self onOperationDone];\n"
9382                "}];");
9383   verifyFormat("int i = {[operation setCompletionBlock:^{\n"
9384                "  [self onOperationDone];\n"
9385                "}]};");
9386   verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
9387                "  f();\n"
9388                "}];");
9389   verifyFormat("int a = [operation block:^int(int *i) {\n"
9390                "  return 1;\n"
9391                "}];");
9392   verifyFormat("[myObject doSomethingWith:arg1\n"
9393                "                      aaa:^int(int *a) {\n"
9394                "                        return 1;\n"
9395                "                      }\n"
9396                "                      bbb:f(a * bbbbbbbb)];");
9397 
9398   verifyFormat("[operation setCompletionBlock:^{\n"
9399                "  [self.delegate newDataAvailable];\n"
9400                "}];",
9401                getLLVMStyleWithColumns(60));
9402   verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
9403                "  NSString *path = [self sessionFilePath];\n"
9404                "  if (path) {\n"
9405                "    // ...\n"
9406                "  }\n"
9407                "});");
9408   verifyFormat("[[SessionService sharedService]\n"
9409                "    loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
9410                "      if (window) {\n"
9411                "        [self windowDidLoad:window];\n"
9412                "      } else {\n"
9413                "        [self errorLoadingWindow];\n"
9414                "      }\n"
9415                "    }];");
9416   verifyFormat("void (^largeBlock)(void) = ^{\n"
9417                "  // ...\n"
9418                "};\n",
9419                getLLVMStyleWithColumns(40));
9420   verifyFormat("[[SessionService sharedService]\n"
9421                "    loadWindowWithCompletionBlock: //\n"
9422                "        ^(SessionWindow *window) {\n"
9423                "          if (window) {\n"
9424                "            [self windowDidLoad:window];\n"
9425                "          } else {\n"
9426                "            [self errorLoadingWindow];\n"
9427                "          }\n"
9428                "        }];",
9429                getLLVMStyleWithColumns(60));
9430   verifyFormat("[myObject doSomethingWith:arg1\n"
9431                "    firstBlock:^(Foo *a) {\n"
9432                "      // ...\n"
9433                "      int i;\n"
9434                "    }\n"
9435                "    secondBlock:^(Bar *b) {\n"
9436                "      // ...\n"
9437                "      int i;\n"
9438                "    }\n"
9439                "    thirdBlock:^Foo(Bar *b) {\n"
9440                "      // ...\n"
9441                "      int i;\n"
9442                "    }];");
9443   verifyFormat("[myObject doSomethingWith:arg1\n"
9444                "               firstBlock:-1\n"
9445                "              secondBlock:^(Bar *b) {\n"
9446                "                // ...\n"
9447                "                int i;\n"
9448                "              }];");
9449 
9450   verifyFormat("f(^{\n"
9451                "  @autoreleasepool {\n"
9452                "    if (a) {\n"
9453                "      g();\n"
9454                "    }\n"
9455                "  }\n"
9456                "});");
9457   verifyFormat("Block b = ^int *(A *a, B *b) {}");
9458   verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
9459                "};");
9460 
9461   FormatStyle FourIndent = getLLVMStyle();
9462   FourIndent.ObjCBlockIndentWidth = 4;
9463   verifyFormat("[operation setCompletionBlock:^{\n"
9464                "    [self onOperationDone];\n"
9465                "}];",
9466                FourIndent);
9467 }
9468 
9469 TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
9470   FormatStyle ZeroColumn = getLLVMStyle();
9471   ZeroColumn.ColumnLimit = 0;
9472 
9473   verifyFormat("[[SessionService sharedService] "
9474                "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
9475                "  if (window) {\n"
9476                "    [self windowDidLoad:window];\n"
9477                "  } else {\n"
9478                "    [self errorLoadingWindow];\n"
9479                "  }\n"
9480                "}];",
9481                ZeroColumn);
9482   EXPECT_EQ("[[SessionService sharedService]\n"
9483             "    loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
9484             "      if (window) {\n"
9485             "        [self windowDidLoad:window];\n"
9486             "      } else {\n"
9487             "        [self errorLoadingWindow];\n"
9488             "      }\n"
9489             "    }];",
9490             format("[[SessionService sharedService]\n"
9491                    "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
9492                    "                if (window) {\n"
9493                    "    [self windowDidLoad:window];\n"
9494                    "  } else {\n"
9495                    "    [self errorLoadingWindow];\n"
9496                    "  }\n"
9497                    "}];",
9498                    ZeroColumn));
9499   verifyFormat("[myObject doSomethingWith:arg1\n"
9500                "    firstBlock:^(Foo *a) {\n"
9501                "      // ...\n"
9502                "      int i;\n"
9503                "    }\n"
9504                "    secondBlock:^(Bar *b) {\n"
9505                "      // ...\n"
9506                "      int i;\n"
9507                "    }\n"
9508                "    thirdBlock:^Foo(Bar *b) {\n"
9509                "      // ...\n"
9510                "      int i;\n"
9511                "    }];",
9512                ZeroColumn);
9513   verifyFormat("f(^{\n"
9514                "  @autoreleasepool {\n"
9515                "    if (a) {\n"
9516                "      g();\n"
9517                "    }\n"
9518                "  }\n"
9519                "});",
9520                ZeroColumn);
9521   verifyFormat("void (^largeBlock)(void) = ^{\n"
9522                "  // ...\n"
9523                "};",
9524                ZeroColumn);
9525 
9526   ZeroColumn.AllowShortBlocksOnASingleLine = true;
9527   EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
9528             format("void   (^largeBlock)(void) = ^{ int   i; };", ZeroColumn));
9529   ZeroColumn.AllowShortBlocksOnASingleLine = false;
9530   EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
9531             "  int i;\n"
9532             "};",
9533             format("void   (^largeBlock)(void) = ^{ int   i; };", ZeroColumn));
9534 }
9535 
9536 TEST_F(FormatTest, SupportsCRLF) {
9537   EXPECT_EQ("int a;\r\n"
9538             "int b;\r\n"
9539             "int c;\r\n",
9540             format("int a;\r\n"
9541                    "  int b;\r\n"
9542                    "    int c;\r\n",
9543                    getLLVMStyle()));
9544   EXPECT_EQ("int a;\r\n"
9545             "int b;\r\n"
9546             "int c;\r\n",
9547             format("int a;\r\n"
9548                    "  int b;\n"
9549                    "    int c;\r\n",
9550                    getLLVMStyle()));
9551   EXPECT_EQ("int a;\n"
9552             "int b;\n"
9553             "int c;\n",
9554             format("int a;\r\n"
9555                    "  int b;\n"
9556                    "    int c;\n",
9557                    getLLVMStyle()));
9558   EXPECT_EQ("\"aaaaaaa \"\r\n"
9559             "\"bbbbbbb\";\r\n",
9560             format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
9561   EXPECT_EQ("#define A \\\r\n"
9562             "  b;      \\\r\n"
9563             "  c;      \\\r\n"
9564             "  d;\r\n",
9565             format("#define A \\\r\n"
9566                    "  b; \\\r\n"
9567                    "  c; d; \r\n",
9568                    getGoogleStyle()));
9569 
9570   EXPECT_EQ("/*\r\n"
9571             "multi line block comments\r\n"
9572             "should not introduce\r\n"
9573             "an extra carriage return\r\n"
9574             "*/\r\n",
9575             format("/*\r\n"
9576                    "multi line block comments\r\n"
9577                    "should not introduce\r\n"
9578                    "an extra carriage return\r\n"
9579                    "*/\r\n"));
9580 }
9581 
9582 TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
9583   verifyFormat("MY_CLASS(C) {\n"
9584                "  int i;\n"
9585                "  int j;\n"
9586                "};");
9587 }
9588 
9589 TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
9590   FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
9591   TwoIndent.ContinuationIndentWidth = 2;
9592 
9593   EXPECT_EQ("int i =\n"
9594             "  longFunction(\n"
9595             "    arg);",
9596             format("int i = longFunction(arg);", TwoIndent));
9597 
9598   FormatStyle SixIndent = getLLVMStyleWithColumns(20);
9599   SixIndent.ContinuationIndentWidth = 6;
9600 
9601   EXPECT_EQ("int i =\n"
9602             "      longFunction(\n"
9603             "            arg);",
9604             format("int i = longFunction(arg);", SixIndent));
9605 }
9606 
9607 TEST_F(FormatTest, SpacesInAngles) {
9608   FormatStyle Spaces = getLLVMStyle();
9609   Spaces.SpacesInAngles = true;
9610 
9611   verifyFormat("static_cast< int >(arg);", Spaces);
9612   verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
9613   verifyFormat("f< int, float >();", Spaces);
9614   verifyFormat("template <> g() {}", Spaces);
9615   verifyFormat("template < std::vector< int > > f() {}", Spaces);
9616   verifyFormat("std::function< void(int, int) > fct;", Spaces);
9617   verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
9618                Spaces);
9619 
9620   Spaces.Standard = FormatStyle::LS_Cpp03;
9621   Spaces.SpacesInAngles = true;
9622   verifyFormat("A< A< int > >();", Spaces);
9623 
9624   Spaces.SpacesInAngles = false;
9625   verifyFormat("A<A<int> >();", Spaces);
9626 
9627   Spaces.Standard = FormatStyle::LS_Cpp11;
9628   Spaces.SpacesInAngles = true;
9629   verifyFormat("A< A< int > >();", Spaces);
9630 
9631   Spaces.SpacesInAngles = false;
9632   verifyFormat("A<A<int>>();", Spaces);
9633 }
9634 
9635 TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
9636   FormatStyle Style = getLLVMStyle();
9637   Style.SpaceAfterTemplateKeyword = false;
9638   verifyFormat("template<int> void foo();", Style);
9639 }
9640 
9641 TEST_F(FormatTest, TripleAngleBrackets) {
9642   verifyFormat("f<<<1, 1>>>();");
9643   verifyFormat("f<<<1, 1, 1, s>>>();");
9644   verifyFormat("f<<<a, b, c, d>>>();");
9645   EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
9646   verifyFormat("f<param><<<1, 1>>>();");
9647   verifyFormat("f<1><<<1, 1>>>();");
9648   EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
9649   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
9650                "aaaaaaaaaaa<<<\n    1, 1>>>();");
9651   verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
9652                "    <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
9653 }
9654 
9655 TEST_F(FormatTest, MergeLessLessAtEnd) {
9656   verifyFormat("<<");
9657   EXPECT_EQ("< < <", format("\\\n<<<"));
9658   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
9659                "aaallvm::outs() <<");
9660   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
9661                "aaaallvm::outs()\n    <<");
9662 }
9663 
9664 TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
9665   std::string code = "#if A\n"
9666                      "#if B\n"
9667                      "a.\n"
9668                      "#endif\n"
9669                      "    a = 1;\n"
9670                      "#else\n"
9671                      "#endif\n"
9672                      "#if C\n"
9673                      "#else\n"
9674                      "#endif\n";
9675   EXPECT_EQ(code, format(code));
9676 }
9677 
9678 TEST_F(FormatTest, HandleConflictMarkers) {
9679   // Git/SVN conflict markers.
9680   EXPECT_EQ("int a;\n"
9681             "void f() {\n"
9682             "  callme(some(parameter1,\n"
9683             "<<<<<<< text by the vcs\n"
9684             "              parameter2),\n"
9685             "||||||| text by the vcs\n"
9686             "              parameter2),\n"
9687             "         parameter3,\n"
9688             "======= text by the vcs\n"
9689             "              parameter2, parameter3),\n"
9690             ">>>>>>> text by the vcs\n"
9691             "         otherparameter);\n",
9692             format("int a;\n"
9693                    "void f() {\n"
9694                    "  callme(some(parameter1,\n"
9695                    "<<<<<<< text by the vcs\n"
9696                    "  parameter2),\n"
9697                    "||||||| text by the vcs\n"
9698                    "  parameter2),\n"
9699                    "  parameter3,\n"
9700                    "======= text by the vcs\n"
9701                    "  parameter2,\n"
9702                    "  parameter3),\n"
9703                    ">>>>>>> text by the vcs\n"
9704                    "  otherparameter);\n"));
9705 
9706   // Perforce markers.
9707   EXPECT_EQ("void f() {\n"
9708             "  function(\n"
9709             ">>>> text by the vcs\n"
9710             "      parameter,\n"
9711             "==== text by the vcs\n"
9712             "      parameter,\n"
9713             "==== text by the vcs\n"
9714             "      parameter,\n"
9715             "<<<< text by the vcs\n"
9716             "      parameter);\n",
9717             format("void f() {\n"
9718                    "  function(\n"
9719                    ">>>> text by the vcs\n"
9720                    "  parameter,\n"
9721                    "==== text by the vcs\n"
9722                    "  parameter,\n"
9723                    "==== text by the vcs\n"
9724                    "  parameter,\n"
9725                    "<<<< text by the vcs\n"
9726                    "  parameter);\n"));
9727 
9728   EXPECT_EQ("<<<<<<<\n"
9729             "|||||||\n"
9730             "=======\n"
9731             ">>>>>>>",
9732             format("<<<<<<<\n"
9733                    "|||||||\n"
9734                    "=======\n"
9735                    ">>>>>>>"));
9736 
9737   EXPECT_EQ("<<<<<<<\n"
9738             "|||||||\n"
9739             "int i;\n"
9740             "=======\n"
9741             ">>>>>>>",
9742             format("<<<<<<<\n"
9743                    "|||||||\n"
9744                    "int i;\n"
9745                    "=======\n"
9746                    ">>>>>>>"));
9747 
9748   // FIXME: Handle parsing of macros around conflict markers correctly:
9749   EXPECT_EQ("#define Macro \\\n"
9750             "<<<<<<<\n"
9751             "Something \\\n"
9752             "|||||||\n"
9753             "Else \\\n"
9754             "=======\n"
9755             "Other \\\n"
9756             ">>>>>>>\n"
9757             "    End int i;\n",
9758             format("#define Macro \\\n"
9759                    "<<<<<<<\n"
9760                    "  Something \\\n"
9761                    "|||||||\n"
9762                    "  Else \\\n"
9763                    "=======\n"
9764                    "  Other \\\n"
9765                    ">>>>>>>\n"
9766                    "  End\n"
9767                    "int i;\n"));
9768 }
9769 
9770 TEST_F(FormatTest, DisableRegions) {
9771   EXPECT_EQ("int i;\n"
9772             "// clang-format off\n"
9773             "  int j;\n"
9774             "// clang-format on\n"
9775             "int k;",
9776             format(" int  i;\n"
9777                    "   // clang-format off\n"
9778                    "  int j;\n"
9779                    " // clang-format on\n"
9780                    "   int   k;"));
9781   EXPECT_EQ("int i;\n"
9782             "/* clang-format off */\n"
9783             "  int j;\n"
9784             "/* clang-format on */\n"
9785             "int k;",
9786             format(" int  i;\n"
9787                    "   /* clang-format off */\n"
9788                    "  int j;\n"
9789                    " /* clang-format on */\n"
9790                    "   int   k;"));
9791 
9792   // Don't reflow comments within disabled regions.
9793   EXPECT_EQ(
9794       "// clang-format off\n"
9795       "// long long long long long long line\n"
9796       "/* clang-format on */\n"
9797       "/* long long long\n"
9798       " * long long long\n"
9799       " * line */\n"
9800       "int i;\n"
9801       "/* clang-format off */\n"
9802       "/* long long long long long long line */\n",
9803       format("// clang-format off\n"
9804              "// long long long long long long line\n"
9805              "/* clang-format on */\n"
9806              "/* long long long long long long line */\n"
9807              "int i;\n"
9808              "/* clang-format off */\n"
9809              "/* long long long long long long line */\n",
9810              getLLVMStyleWithColumns(20)));
9811 }
9812 
9813 TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
9814   format("? ) =");
9815   verifyNoCrash("#define a\\\n /**/}");
9816 }
9817 
9818 TEST_F(FormatTest, FormatsTableGenCode) {
9819   FormatStyle Style = getLLVMStyle();
9820   Style.Language = FormatStyle::LK_TableGen;
9821   verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
9822 }
9823 
9824 TEST_F(FormatTest, ArrayOfTemplates) {
9825   EXPECT_EQ("auto a = new unique_ptr<int>[10];",
9826             format("auto a = new unique_ptr<int > [ 10];"));
9827 
9828   FormatStyle Spaces = getLLVMStyle();
9829   Spaces.SpacesInSquareBrackets = true;
9830   EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
9831             format("auto a = new unique_ptr<int > [10];", Spaces));
9832 }
9833 
9834 TEST_F(FormatTest, ArrayAsTemplateType) {
9835   EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
9836             format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
9837 
9838   FormatStyle Spaces = getLLVMStyle();
9839   Spaces.SpacesInSquareBrackets = true;
9840   EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
9841             format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
9842 }
9843 
9844 TEST(FormatStyle, GetStyleOfFile) {
9845   vfs::InMemoryFileSystem FS;
9846   // Test 1: format file in the same directory.
9847   ASSERT_TRUE(
9848       FS.addFile("/a/.clang-format", 0,
9849                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
9850   ASSERT_TRUE(
9851       FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
9852   auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
9853   ASSERT_TRUE((bool)Style1);
9854   ASSERT_EQ(*Style1, getLLVMStyle());
9855 
9856   // Test 2.1: fallback to default.
9857   ASSERT_TRUE(
9858       FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
9859   auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
9860   ASSERT_TRUE((bool)Style2);
9861   ASSERT_EQ(*Style2, getMozillaStyle());
9862 
9863   // Test 2.2: no format on 'none' fallback style.
9864   Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
9865   ASSERT_TRUE((bool)Style2);
9866   ASSERT_EQ(*Style2, getNoStyle());
9867 
9868   // Test 2.3: format if config is found with no based style while fallback is
9869   // 'none'.
9870   ASSERT_TRUE(FS.addFile("/b/.clang-format", 0,
9871                          llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2")));
9872   Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
9873   ASSERT_TRUE((bool)Style2);
9874   ASSERT_EQ(*Style2, getLLVMStyle());
9875 
9876   // Test 2.4: format if yaml with no based style, while fallback is 'none'.
9877   Style2 = getStyle("{}", "a.h", "none", "", &FS);
9878   ASSERT_TRUE((bool)Style2);
9879   ASSERT_EQ(*Style2, getLLVMStyle());
9880 
9881   // Test 3: format file in parent directory.
9882   ASSERT_TRUE(
9883       FS.addFile("/c/.clang-format", 0,
9884                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
9885   ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
9886                          llvm::MemoryBuffer::getMemBuffer("int i;")));
9887   auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
9888   ASSERT_TRUE((bool)Style3);
9889   ASSERT_EQ(*Style3, getGoogleStyle());
9890 
9891   // Test 4: error on invalid fallback style
9892   auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS);
9893   ASSERT_FALSE((bool)Style4);
9894   llvm::consumeError(Style4.takeError());
9895 
9896   // Test 5: error on invalid yaml on command line
9897   auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS);
9898   ASSERT_FALSE((bool)Style5);
9899   llvm::consumeError(Style5.takeError());
9900 
9901   // Test 6: error on invalid style
9902   auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS);
9903   ASSERT_FALSE((bool)Style6);
9904   llvm::consumeError(Style6.takeError());
9905 
9906   // Test 7: found config file, error on parsing it
9907   ASSERT_TRUE(
9908       FS.addFile("/d/.clang-format", 0,
9909                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n"
9910                                                   "InvalidKey: InvalidValue")));
9911   ASSERT_TRUE(
9912       FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
9913   auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS);
9914   ASSERT_FALSE((bool)Style7);
9915   llvm::consumeError(Style7.takeError());
9916 }
9917 
9918 TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
9919   // Column limit is 20.
9920   std::string Code = "Type *a =\n"
9921                      "    new Type();\n"
9922                      "g(iiiii, 0, jjjjj,\n"
9923                      "  0, kkkkk, 0, mm);\n"
9924                      "int  bad     = format   ;";
9925   std::string Expected = "auto a = new Type();\n"
9926                          "g(iiiii, nullptr,\n"
9927                          "  jjjjj, nullptr,\n"
9928                          "  kkkkk, nullptr,\n"
9929                          "  mm);\n"
9930                          "int  bad     = format   ;";
9931   FileID ID = Context.createInMemoryFile("format.cpp", Code);
9932   tooling::Replacements Replaces = toReplacements(
9933       {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
9934                             "auto "),
9935        tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
9936                             "nullptr"),
9937        tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
9938                             "nullptr"),
9939        tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
9940                             "nullptr")});
9941 
9942   format::FormatStyle Style = format::getLLVMStyle();
9943   Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
9944   auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
9945   EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
9946       << llvm::toString(FormattedReplaces.takeError()) << "\n";
9947   auto Result = applyAllReplacements(Code, *FormattedReplaces);
9948   EXPECT_TRUE(static_cast<bool>(Result));
9949   EXPECT_EQ(Expected, *Result);
9950 }
9951 
9952 TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
9953   std::string Code = "#include \"a.h\"\n"
9954                      "#include \"c.h\"\n"
9955                      "\n"
9956                      "int main() {\n"
9957                      "  return 0;\n"
9958                      "}";
9959   std::string Expected = "#include \"a.h\"\n"
9960                          "#include \"b.h\"\n"
9961                          "#include \"c.h\"\n"
9962                          "\n"
9963                          "int main() {\n"
9964                          "  return 0;\n"
9965                          "}";
9966   FileID ID = Context.createInMemoryFile("fix.cpp", Code);
9967   tooling::Replacements Replaces = toReplacements(
9968       {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
9969                             "#include \"b.h\"\n")});
9970 
9971   format::FormatStyle Style = format::getLLVMStyle();
9972   Style.SortIncludes = true;
9973   auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
9974   EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
9975       << llvm::toString(FormattedReplaces.takeError()) << "\n";
9976   auto Result = applyAllReplacements(Code, *FormattedReplaces);
9977   EXPECT_TRUE(static_cast<bool>(Result));
9978   EXPECT_EQ(Expected, *Result);
9979 }
9980 
9981 } // end namespace
9982 } // end namespace format
9983 } // end namespace clang
9984