1 //===- unittest/Format/FormatTest.cpp - Formatting unit tests -------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "clang/Format/Format.h"
10 
11 #include "../Tooling/ReplacementTest.h"
12 #include "FormatTestUtils.h"
13 
14 #include "clang/Frontend/TextDiagnosticPrinter.h"
15 #include "llvm/Support/Debug.h"
16 #include "llvm/Support/MemoryBuffer.h"
17 #include "gtest/gtest.h"
18 
19 #define DEBUG_TYPE "format-test"
20 
21 using clang::tooling::ReplacementTest;
22 using clang::tooling::toReplacements;
23 
24 namespace clang {
25 namespace format {
26 namespace {
27 
28 FormatStyle getGoogleStyle() { return getGoogleStyle(FormatStyle::LK_Cpp); }
29 
30 class FormatTest : public ::testing::Test {
31 protected:
32   enum StatusCheck {
33     SC_ExpectComplete,
34     SC_ExpectIncomplete,
35     SC_DoNotCheck
36   };
37 
38   std::string format(llvm::StringRef Code,
39                      const FormatStyle &Style = getLLVMStyle(),
40                      StatusCheck CheckComplete = SC_ExpectComplete) {
41     LLVM_DEBUG(llvm::errs() << "---\n");
42     LLVM_DEBUG(llvm::errs() << Code << "\n\n");
43     std::vector<tooling::Range> Ranges(1, tooling::Range(0, Code.size()));
44     FormattingAttemptStatus Status;
45     tooling::Replacements Replaces =
46         reformat(Style, Code, Ranges, "<stdin>", &Status);
47     if (CheckComplete != SC_DoNotCheck) {
48       bool ExpectedCompleteFormat = CheckComplete == SC_ExpectComplete;
49       EXPECT_EQ(ExpectedCompleteFormat, Status.FormatComplete)
50           << Code << "\n\n";
51     }
52     ReplacementCount = Replaces.size();
53     auto Result = applyAllReplacements(Code, Replaces);
54     EXPECT_TRUE(static_cast<bool>(Result));
55     LLVM_DEBUG(llvm::errs() << "\n" << *Result << "\n\n");
56     return *Result;
57   }
58 
59   FormatStyle getStyleWithColumns(FormatStyle Style, unsigned ColumnLimit) {
60     Style.ColumnLimit = ColumnLimit;
61     return Style;
62   }
63 
64   FormatStyle getLLVMStyleWithColumns(unsigned ColumnLimit) {
65     return getStyleWithColumns(getLLVMStyle(), ColumnLimit);
66   }
67 
68   FormatStyle getGoogleStyleWithColumns(unsigned ColumnLimit) {
69     return getStyleWithColumns(getGoogleStyle(), ColumnLimit);
70   }
71 
72   void verifyFormat(llvm::StringRef Expected, llvm::StringRef Code,
73                     const FormatStyle &Style = getLLVMStyle()) {
74     EXPECT_EQ(Expected.str(), format(Expected, Style))
75         << "Expected code is not stable";
76     EXPECT_EQ(Expected.str(), format(Code, Style));
77     if (Style.Language == FormatStyle::LK_Cpp) {
78       // Objective-C++ is a superset of C++, so everything checked for C++
79       // needs to be checked for Objective-C++ as well.
80       FormatStyle ObjCStyle = Style;
81       ObjCStyle.Language = FormatStyle::LK_ObjC;
82       EXPECT_EQ(Expected.str(), format(test::messUp(Code), ObjCStyle));
83     }
84   }
85 
86   void verifyFormat(llvm::StringRef Code,
87                     const FormatStyle &Style = getLLVMStyle()) {
88     verifyFormat(Code, test::messUp(Code), Style);
89   }
90 
91   void verifyIncompleteFormat(llvm::StringRef Code,
92                               const FormatStyle &Style = getLLVMStyle()) {
93     EXPECT_EQ(Code.str(),
94               format(test::messUp(Code), Style, SC_ExpectIncomplete));
95   }
96 
97   void verifyGoogleFormat(llvm::StringRef Code) {
98     verifyFormat(Code, getGoogleStyle());
99   }
100 
101   void verifyIndependentOfContext(llvm::StringRef text) {
102     verifyFormat(text);
103     verifyFormat(llvm::Twine("void f() { " + text + " }").str());
104   }
105 
106   /// \brief Verify that clang-format does not crash on the given input.
107   void verifyNoCrash(llvm::StringRef Code,
108                      const FormatStyle &Style = getLLVMStyle()) {
109     format(Code, Style, SC_DoNotCheck);
110   }
111 
112   int ReplacementCount;
113 };
114 
115 TEST_F(FormatTest, MessUp) {
116   EXPECT_EQ("1 2 3", test::messUp("1 2 3"));
117   EXPECT_EQ("1 2 3\n", test::messUp("1\n2\n3\n"));
118   EXPECT_EQ("a\n//b\nc", test::messUp("a\n//b\nc"));
119   EXPECT_EQ("a\n#b\nc", test::messUp("a\n#b\nc"));
120   EXPECT_EQ("a\n#b c d\ne", test::messUp("a\n#b\\\nc\\\nd\ne"));
121 }
122 
123 TEST_F(FormatTest, DefaultLLVMStyleIsCpp) {
124   EXPECT_EQ(FormatStyle::LK_Cpp, getLLVMStyle().Language);
125 }
126 
127 TEST_F(FormatTest, LLVMStyleOverride) {
128   EXPECT_EQ(FormatStyle::LK_Proto,
129             getLLVMStyle(FormatStyle::LK_Proto).Language);
130 }
131 
132 //===----------------------------------------------------------------------===//
133 // Basic function tests.
134 //===----------------------------------------------------------------------===//
135 
136 TEST_F(FormatTest, DoesNotChangeCorrectlyFormattedCode) {
137   EXPECT_EQ(";", format(";"));
138 }
139 
140 TEST_F(FormatTest, FormatsGlobalStatementsAt0) {
141   EXPECT_EQ("int i;", format("  int i;"));
142   EXPECT_EQ("\nint i;", format(" \n\t \v \f  int i;"));
143   EXPECT_EQ("int i;\nint j;", format("    int i; int j;"));
144   EXPECT_EQ("int i;\nint j;", format("    int i;\n  int j;"));
145 }
146 
147 TEST_F(FormatTest, FormatsUnwrappedLinesAtFirstFormat) {
148   EXPECT_EQ("int i;", format("int\ni;"));
149 }
150 
151 TEST_F(FormatTest, FormatsNestedBlockStatements) {
152   EXPECT_EQ("{\n  {\n    {}\n  }\n}", format("{{{}}}"));
153 }
154 
155 TEST_F(FormatTest, FormatsNestedCall) {
156   verifyFormat("Method(f1, f2(f3));");
157   verifyFormat("Method(f1(f2, f3()));");
158   verifyFormat("Method(f1(f2, (f3())));");
159 }
160 
161 TEST_F(FormatTest, NestedNameSpecifiers) {
162   verifyFormat("vector<::Type> v;");
163   verifyFormat("::ns::SomeFunction(::ns::SomeOtherFunction())");
164   verifyFormat("static constexpr bool Bar = decltype(bar())::value;");
165   verifyFormat("bool a = 2 < ::SomeFunction();");
166   verifyFormat("ALWAYS_INLINE ::std::string getName();");
167   verifyFormat("some::string getName();");
168 }
169 
170 TEST_F(FormatTest, OnlyGeneratesNecessaryReplacements) {
171   EXPECT_EQ("if (a) {\n"
172             "  f();\n"
173             "}",
174             format("if(a){f();}"));
175   EXPECT_EQ(4, ReplacementCount);
176   EXPECT_EQ("if (a) {\n"
177             "  f();\n"
178             "}",
179             format("if (a) {\n"
180                    "  f();\n"
181                    "}"));
182   EXPECT_EQ(0, ReplacementCount);
183   EXPECT_EQ("/*\r\n"
184             "\r\n"
185             "*/\r\n",
186             format("/*\r\n"
187                    "\r\n"
188                    "*/\r\n"));
189   EXPECT_EQ(0, ReplacementCount);
190 }
191 
192 TEST_F(FormatTest, RemovesEmptyLines) {
193   EXPECT_EQ("class C {\n"
194             "  int i;\n"
195             "};",
196             format("class C {\n"
197                    " int i;\n"
198                    "\n"
199                    "};"));
200 
201   // Don't remove empty lines at the start of namespaces or extern "C" blocks.
202   EXPECT_EQ("namespace N {\n"
203             "\n"
204             "int i;\n"
205             "}",
206             format("namespace N {\n"
207                    "\n"
208                    "int    i;\n"
209                    "}",
210                    getGoogleStyle()));
211   EXPECT_EQ("/* something */ namespace N {\n"
212             "\n"
213             "int i;\n"
214             "}",
215             format("/* something */ namespace N {\n"
216                    "\n"
217                    "int    i;\n"
218                    "}",
219                    getGoogleStyle()));
220   EXPECT_EQ("inline namespace N {\n"
221             "\n"
222             "int i;\n"
223             "}",
224             format("inline namespace N {\n"
225                    "\n"
226                    "int    i;\n"
227                    "}",
228                    getGoogleStyle()));
229   EXPECT_EQ("/* something */ inline namespace N {\n"
230             "\n"
231             "int i;\n"
232             "}",
233             format("/* something */ inline namespace N {\n"
234                    "\n"
235                    "int    i;\n"
236                    "}",
237                    getGoogleStyle()));
238   EXPECT_EQ("export namespace N {\n"
239             "\n"
240             "int i;\n"
241             "}",
242             format("export namespace N {\n"
243                    "\n"
244                    "int    i;\n"
245                    "}",
246                    getGoogleStyle()));
247   EXPECT_EQ("extern /**/ \"C\" /**/ {\n"
248             "\n"
249             "int i;\n"
250             "}",
251             format("extern /**/ \"C\" /**/ {\n"
252                    "\n"
253                    "int    i;\n"
254                    "}",
255                    getGoogleStyle()));
256 
257   // ...but do keep inlining and removing empty lines for non-block extern "C"
258   // functions.
259   verifyFormat("extern \"C\" int f() { return 42; }", getGoogleStyle());
260   EXPECT_EQ("extern \"C\" int f() {\n"
261             "  int i = 42;\n"
262             "  return i;\n"
263             "}",
264             format("extern \"C\" int f() {\n"
265                    "\n"
266                    "  int i = 42;\n"
267                    "  return i;\n"
268                    "}",
269                    getGoogleStyle()));
270 
271   // Remove empty lines at the beginning and end of blocks.
272   EXPECT_EQ("void f() {\n"
273             "\n"
274             "  if (a) {\n"
275             "\n"
276             "    f();\n"
277             "  }\n"
278             "}",
279             format("void f() {\n"
280                    "\n"
281                    "  if (a) {\n"
282                    "\n"
283                    "    f();\n"
284                    "\n"
285                    "  }\n"
286                    "\n"
287                    "}",
288                    getLLVMStyle()));
289   EXPECT_EQ("void f() {\n"
290             "  if (a) {\n"
291             "    f();\n"
292             "  }\n"
293             "}",
294             format("void f() {\n"
295                    "\n"
296                    "  if (a) {\n"
297                    "\n"
298                    "    f();\n"
299                    "\n"
300                    "  }\n"
301                    "\n"
302                    "}",
303                    getGoogleStyle()));
304 
305   // Don't remove empty lines in more complex control statements.
306   EXPECT_EQ("void f() {\n"
307             "  if (a) {\n"
308             "    f();\n"
309             "\n"
310             "  } else if (b) {\n"
311             "    f();\n"
312             "  }\n"
313             "}",
314             format("void f() {\n"
315                    "  if (a) {\n"
316                    "    f();\n"
317                    "\n"
318                    "  } else if (b) {\n"
319                    "    f();\n"
320                    "\n"
321                    "  }\n"
322                    "\n"
323                    "}"));
324 
325   // Don't remove empty lines before namespace endings.
326   FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle();
327   LLVMWithNoNamespaceFix.FixNamespaceComments = false;
328   EXPECT_EQ("namespace {\n"
329             "int i;\n"
330             "\n"
331             "}",
332             format("namespace {\n"
333                    "int i;\n"
334                    "\n"
335                    "}", LLVMWithNoNamespaceFix));
336   EXPECT_EQ("namespace {\n"
337             "int i;\n"
338             "}",
339             format("namespace {\n"
340                    "int i;\n"
341                    "}", LLVMWithNoNamespaceFix));
342   EXPECT_EQ("namespace {\n"
343             "int i;\n"
344             "\n"
345             "};",
346             format("namespace {\n"
347                    "int i;\n"
348                    "\n"
349                    "};", LLVMWithNoNamespaceFix));
350   EXPECT_EQ("namespace {\n"
351             "int i;\n"
352             "};",
353             format("namespace {\n"
354                    "int i;\n"
355                    "};", LLVMWithNoNamespaceFix));
356   EXPECT_EQ("namespace {\n"
357             "int i;\n"
358             "\n"
359             "}",
360             format("namespace {\n"
361                    "int i;\n"
362                    "\n"
363                    "}"));
364   EXPECT_EQ("namespace {\n"
365             "int i;\n"
366             "\n"
367             "} // namespace",
368             format("namespace {\n"
369                    "int i;\n"
370                    "\n"
371                    "}  // namespace"));
372 
373   FormatStyle Style = getLLVMStyle();
374   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
375   Style.MaxEmptyLinesToKeep = 2;
376   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
377   Style.BraceWrapping.AfterClass = true;
378   Style.BraceWrapping.AfterFunction = true;
379   Style.KeepEmptyLinesAtTheStartOfBlocks = false;
380 
381   EXPECT_EQ("class Foo\n"
382             "{\n"
383             "  Foo() {}\n"
384             "\n"
385             "  void funk() {}\n"
386             "};",
387             format("class Foo\n"
388                    "{\n"
389                    "  Foo()\n"
390                    "  {\n"
391                    "  }\n"
392                    "\n"
393                    "  void funk() {}\n"
394                    "};",
395                    Style));
396 }
397 
398 TEST_F(FormatTest, RecognizesBinaryOperatorKeywords) {
399   verifyFormat("x = (a) and (b);");
400   verifyFormat("x = (a) or (b);");
401   verifyFormat("x = (a) bitand (b);");
402   verifyFormat("x = (a) bitor (b);");
403   verifyFormat("x = (a) not_eq (b);");
404   verifyFormat("x = (a) and_eq (b);");
405   verifyFormat("x = (a) or_eq (b);");
406   verifyFormat("x = (a) xor (b);");
407 }
408 
409 TEST_F(FormatTest, RecognizesUnaryOperatorKeywords) {
410   verifyFormat("x = compl(a);");
411   verifyFormat("x = not(a);");
412   verifyFormat("x = bitand(a);");
413   // Unary operator must not be merged with the next identifier
414   verifyFormat("x = compl a;");
415   verifyFormat("x = not a;");
416   verifyFormat("x = bitand a;");
417 }
418 
419 //===----------------------------------------------------------------------===//
420 // Tests for control statements.
421 //===----------------------------------------------------------------------===//
422 
423 TEST_F(FormatTest, FormatIfWithoutCompoundStatement) {
424   verifyFormat("if (true)\n  f();\ng();");
425   verifyFormat("if (a)\n  if (b)\n    if (c)\n      g();\nh();");
426   verifyFormat("if (a)\n  if (b) {\n    f();\n  }\ng();");
427   verifyFormat("if constexpr (true)\n"
428                "  f();\ng();");
429   verifyFormat("if constexpr (a)\n"
430                "  if constexpr (b)\n"
431                "    if constexpr (c)\n"
432                "      g();\n"
433                "h();");
434   verifyFormat("if constexpr (a)\n"
435                "  if constexpr (b) {\n"
436                "    f();\n"
437                "  }\n"
438                "g();");
439 
440   FormatStyle AllowsMergedIf = getLLVMStyle();
441   AllowsMergedIf.AlignEscapedNewlines = FormatStyle::ENAS_Left;
442   AllowsMergedIf.AllowShortIfStatementsOnASingleLine =
443       FormatStyle::SIS_WithoutElse;
444   verifyFormat("if (a)\n"
445                "  // comment\n"
446                "  f();",
447                AllowsMergedIf);
448   verifyFormat("{\n"
449                "  if (a)\n"
450                "  label:\n"
451                "    f();\n"
452                "}",
453                AllowsMergedIf);
454   verifyFormat("#define A \\\n"
455                "  if (a)  \\\n"
456                "  label:  \\\n"
457                "    f()",
458                AllowsMergedIf);
459   verifyFormat("if (a)\n"
460                "  ;",
461                AllowsMergedIf);
462   verifyFormat("if (a)\n"
463                "  if (b) return;",
464                AllowsMergedIf);
465 
466   verifyFormat("if (a) // Can't merge this\n"
467                "  f();\n",
468                AllowsMergedIf);
469   verifyFormat("if (a) /* still don't merge */\n"
470                "  f();",
471                AllowsMergedIf);
472   verifyFormat("if (a) { // Never merge this\n"
473                "  f();\n"
474                "}",
475                AllowsMergedIf);
476   verifyFormat("if (a) { /* Never merge this */\n"
477                "  f();\n"
478                "}",
479                AllowsMergedIf);
480 
481   AllowsMergedIf.ColumnLimit = 14;
482   verifyFormat("if (a) return;", AllowsMergedIf);
483   verifyFormat("if (aaaaaaaaa)\n"
484                "  return;",
485                AllowsMergedIf);
486 
487   AllowsMergedIf.ColumnLimit = 13;
488   verifyFormat("if (a)\n  return;", AllowsMergedIf);
489 }
490 
491 TEST_F(FormatTest, FormatIfWithoutCompoundStatementButElseWith) {
492   FormatStyle AllowsMergedIf = getLLVMStyle();
493   AllowsMergedIf.AlignEscapedNewlines = FormatStyle::ENAS_Left;
494   AllowsMergedIf.AllowShortIfStatementsOnASingleLine =
495       FormatStyle::SIS_WithoutElse;
496   verifyFormat("if (a)\n"
497                "  f();\n"
498                "else {\n"
499                "  g();\n"
500                "}",
501                AllowsMergedIf);
502   verifyFormat("if (a)\n"
503                "  f();\n"
504                "else\n"
505                "  g();\n",
506                AllowsMergedIf);
507 
508   AllowsMergedIf.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_Always;
509 
510   verifyFormat("if (a) f();\n"
511                "else {\n"
512                "  g();\n"
513                "}",
514                AllowsMergedIf);
515   verifyFormat("if (a) f();\n"
516                "else {\n"
517                "  if (a) f();\n"
518                "  else {\n"
519                "    g();\n"
520                "  }\n"
521                "  g();\n"
522                "}",
523                AllowsMergedIf);
524 }
525 
526 TEST_F(FormatTest, FormatLoopsWithoutCompoundStatement) {
527   FormatStyle AllowsMergedLoops = getLLVMStyle();
528   AllowsMergedLoops.AllowShortLoopsOnASingleLine = true;
529   verifyFormat("while (true) continue;", AllowsMergedLoops);
530   verifyFormat("for (;;) continue;", AllowsMergedLoops);
531   verifyFormat("for (int &v : vec) v *= 2;", AllowsMergedLoops);
532   verifyFormat("while (true)\n"
533                "  ;",
534                AllowsMergedLoops);
535   verifyFormat("for (;;)\n"
536                "  ;",
537                AllowsMergedLoops);
538   verifyFormat("for (;;)\n"
539                "  for (;;) continue;",
540                AllowsMergedLoops);
541   verifyFormat("for (;;) // Can't merge this\n"
542                "  continue;",
543                AllowsMergedLoops);
544   verifyFormat("for (;;) /* still don't merge */\n"
545                "  continue;",
546                AllowsMergedLoops);
547 }
548 
549 TEST_F(FormatTest, FormatShortBracedStatements) {
550   FormatStyle AllowSimpleBracedStatements = getLLVMStyle();
551   AllowSimpleBracedStatements.ColumnLimit = 40;
552   AllowSimpleBracedStatements.AllowShortBlocksOnASingleLine = true;
553 
554   AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine =
555       FormatStyle::SIS_WithoutElse;
556   AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true;
557 
558   AllowSimpleBracedStatements.BreakBeforeBraces = FormatStyle::BS_Custom;
559   AllowSimpleBracedStatements.BraceWrapping.AfterFunction = true;
560   AllowSimpleBracedStatements.BraceWrapping.SplitEmptyRecord = false;
561 
562   verifyFormat("if (true) {}", AllowSimpleBracedStatements);
563   verifyFormat("if constexpr (true) {}", AllowSimpleBracedStatements);
564   verifyFormat("while (true) {}", AllowSimpleBracedStatements);
565   verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
566   verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements);
567   verifyFormat("if constexpr (true) { f(); }", AllowSimpleBracedStatements);
568   verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements);
569   verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements);
570   verifyFormat("if (true) {\n"
571                "  ffffffffffffffffffffffffffffffffffffffffffffffffffffff();\n"
572                "}",
573                AllowSimpleBracedStatements);
574   verifyFormat("if (true) { //\n"
575                "  f();\n"
576                "}",
577                AllowSimpleBracedStatements);
578   verifyFormat("if (true) {\n"
579                "  f();\n"
580                "  f();\n"
581                "}",
582                AllowSimpleBracedStatements);
583   verifyFormat("if (true) {\n"
584                "  f();\n"
585                "} else {\n"
586                "  f();\n"
587                "}",
588                AllowSimpleBracedStatements);
589 
590   verifyFormat("struct A2 {\n"
591                "  int X;\n"
592                "};",
593                AllowSimpleBracedStatements);
594   verifyFormat("typedef struct A2 {\n"
595                "  int X;\n"
596                "} A2_t;",
597                AllowSimpleBracedStatements);
598   verifyFormat("template <int> struct A2 {\n"
599                "  struct B {};\n"
600                "};",
601                AllowSimpleBracedStatements);
602 
603   AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine =
604       FormatStyle::SIS_Never;
605   verifyFormat("if (true) {}", AllowSimpleBracedStatements);
606   verifyFormat("if (true) {\n"
607                "  f();\n"
608                "}",
609                AllowSimpleBracedStatements);
610   verifyFormat("if (true) {\n"
611                "  f();\n"
612                "} else {\n"
613                "  f();\n"
614                "}",
615                AllowSimpleBracedStatements);
616 
617   AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false;
618   verifyFormat("while (true) {}", AllowSimpleBracedStatements);
619   verifyFormat("while (true) {\n"
620                "  f();\n"
621                "}",
622                AllowSimpleBracedStatements);
623   verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
624   verifyFormat("for (;;) {\n"
625                "  f();\n"
626                "}",
627                AllowSimpleBracedStatements);
628 
629   AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine =
630       FormatStyle::SIS_WithoutElse;
631   AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = true;
632   AllowSimpleBracedStatements.BraceWrapping.AfterControlStatement = true;
633 
634   verifyFormat("if (true) {}", AllowSimpleBracedStatements);
635   verifyFormat("if constexpr (true) {}", AllowSimpleBracedStatements);
636   verifyFormat("while (true) {}", AllowSimpleBracedStatements);
637   verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
638   verifyFormat("if (true) { f(); }", AllowSimpleBracedStatements);
639   verifyFormat("if constexpr (true) { f(); }", AllowSimpleBracedStatements);
640   verifyFormat("while (true) { f(); }", AllowSimpleBracedStatements);
641   verifyFormat("for (;;) { f(); }", AllowSimpleBracedStatements);
642   verifyFormat("if (true)\n"
643                "{\n"
644                "  ffffffffffffffffffffffffffffffffffffffffffffffffffffff();\n"
645                "}",
646                AllowSimpleBracedStatements);
647   verifyFormat("if (true)\n"
648                "{ //\n"
649                "  f();\n"
650                "}",
651                AllowSimpleBracedStatements);
652   verifyFormat("if (true)\n"
653                "{\n"
654                "  f();\n"
655                "  f();\n"
656                "}",
657                AllowSimpleBracedStatements);
658   verifyFormat("if (true)\n"
659                "{\n"
660                "  f();\n"
661                "} else\n"
662                "{\n"
663                "  f();\n"
664                "}",
665                AllowSimpleBracedStatements);
666 
667   AllowSimpleBracedStatements.AllowShortIfStatementsOnASingleLine =
668       FormatStyle::SIS_Never;
669   verifyFormat("if (true) {}", AllowSimpleBracedStatements);
670   verifyFormat("if (true)\n"
671                "{\n"
672                "  f();\n"
673                "}",
674                AllowSimpleBracedStatements);
675   verifyFormat("if (true)\n"
676                "{\n"
677                "  f();\n"
678                "} else\n"
679                "{\n"
680                "  f();\n"
681                "}",
682                AllowSimpleBracedStatements);
683 
684   AllowSimpleBracedStatements.AllowShortLoopsOnASingleLine = false;
685   verifyFormat("while (true) {}", AllowSimpleBracedStatements);
686   verifyFormat("while (true)\n"
687                "{\n"
688                "  f();\n"
689                "}",
690                AllowSimpleBracedStatements);
691   verifyFormat("for (;;) {}", AllowSimpleBracedStatements);
692   verifyFormat("for (;;)\n"
693                "{\n"
694                "  f();\n"
695                "}",
696                AllowSimpleBracedStatements);
697 }
698 
699 TEST_F(FormatTest, ShortBlocksInMacrosDontMergeWithCodeAfterMacro) {
700   FormatStyle Style = getLLVMStyleWithColumns(60);
701   Style.AllowShortBlocksOnASingleLine = true;
702   Style.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_WithoutElse;
703   Style.BreakBeforeBraces = FormatStyle::BS_Allman;
704   EXPECT_EQ("#define A                                                  \\\n"
705             "  if (HANDLEwernufrnuLwrmviferuvnierv)                     \\\n"
706             "  { RET_ERR1_ANUIREUINERUIFNIOAerwfwrvnuier; }\n"
707             "X;",
708             format("#define A \\\n"
709                    "   if (HANDLEwernufrnuLwrmviferuvnierv) { \\\n"
710                    "      RET_ERR1_ANUIREUINERUIFNIOAerwfwrvnuier; \\\n"
711                    "   }\n"
712                    "X;",
713                    Style));
714 }
715 
716 TEST_F(FormatTest, ParseIfElse) {
717   verifyFormat("if (true)\n"
718                "  if (true)\n"
719                "    if (true)\n"
720                "      f();\n"
721                "    else\n"
722                "      g();\n"
723                "  else\n"
724                "    h();\n"
725                "else\n"
726                "  i();");
727   verifyFormat("if (true)\n"
728                "  if (true)\n"
729                "    if (true) {\n"
730                "      if (true)\n"
731                "        f();\n"
732                "    } else {\n"
733                "      g();\n"
734                "    }\n"
735                "  else\n"
736                "    h();\n"
737                "else {\n"
738                "  i();\n"
739                "}");
740   verifyFormat("if (true)\n"
741                "  if constexpr (true)\n"
742                "    if (true) {\n"
743                "      if constexpr (true)\n"
744                "        f();\n"
745                "    } else {\n"
746                "      g();\n"
747                "    }\n"
748                "  else\n"
749                "    h();\n"
750                "else {\n"
751                "  i();\n"
752                "}");
753   verifyFormat("void f() {\n"
754                "  if (a) {\n"
755                "  } else {\n"
756                "  }\n"
757                "}");
758 }
759 
760 TEST_F(FormatTest, ElseIf) {
761   verifyFormat("if (a) {\n} else if (b) {\n}");
762   verifyFormat("if (a)\n"
763                "  f();\n"
764                "else if (b)\n"
765                "  g();\n"
766                "else\n"
767                "  h();");
768   verifyFormat("if constexpr (a)\n"
769                "  f();\n"
770                "else if constexpr (b)\n"
771                "  g();\n"
772                "else\n"
773                "  h();");
774   verifyFormat("if (a) {\n"
775                "  f();\n"
776                "}\n"
777                "// or else ..\n"
778                "else {\n"
779                "  g()\n"
780                "}");
781 
782   verifyFormat("if (a) {\n"
783                "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
784                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
785                "}");
786   verifyFormat("if (a) {\n"
787                "} else if (\n"
788                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
789                "}",
790                getLLVMStyleWithColumns(62));
791   verifyFormat("if (a) {\n"
792                "} else if constexpr (\n"
793                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
794                "}",
795                getLLVMStyleWithColumns(62));
796 }
797 
798 TEST_F(FormatTest, FormatsForLoop) {
799   verifyFormat(
800       "for (int VeryVeryLongLoopVariable = 0; VeryVeryLongLoopVariable < 10;\n"
801       "     ++VeryVeryLongLoopVariable)\n"
802       "  ;");
803   verifyFormat("for (;;)\n"
804                "  f();");
805   verifyFormat("for (;;) {\n}");
806   verifyFormat("for (;;) {\n"
807                "  f();\n"
808                "}");
809   verifyFormat("for (int i = 0; (i < 10); ++i) {\n}");
810 
811   verifyFormat(
812       "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
813       "                                          E = UnwrappedLines.end();\n"
814       "     I != E; ++I) {\n}");
815 
816   verifyFormat(
817       "for (MachineFun::iterator IIII = PrevIt, EEEE = F.end(); IIII != EEEE;\n"
818       "     ++IIIII) {\n}");
819   verifyFormat("for (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaa =\n"
820                "         aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa;\n"
821                "     aaaaaaaaaaa != aaaaaaaaaaaaaaaaaaa; ++aaaaaaaaaaa) {\n}");
822   verifyFormat("for (llvm::ArrayRef<NamedDecl *>::iterator\n"
823                "         I = FD->getDeclsInPrototypeScope().begin(),\n"
824                "         E = FD->getDeclsInPrototypeScope().end();\n"
825                "     I != E; ++I) {\n}");
826   verifyFormat("for (SmallVectorImpl<TemplateIdAnnotationn *>::iterator\n"
827                "         I = Container.begin(),\n"
828                "         E = Container.end();\n"
829                "     I != E; ++I) {\n}",
830                getLLVMStyleWithColumns(76));
831 
832   verifyFormat(
833       "for (aaaaaaaaaaaaaaaaa aaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
834       "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa !=\n"
835       "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
836       "         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
837       "     ++aaaaaaaaaaa) {\n}");
838   verifyFormat("for (int i = 0; i < aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
839                "                bbbbbbbbbbbbbbbbbbbb < ccccccccccccccc;\n"
840                "     ++i) {\n}");
841   verifyFormat("for (int aaaaaaaaaaa = 1; aaaaaaaaaaa <= bbbbbbbbbbbbbbb;\n"
842                "     aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
843                "}");
844   verifyFormat("for (some_namespace::SomeIterator iter( // force break\n"
845                "         aaaaaaaaaa);\n"
846                "     iter; ++iter) {\n"
847                "}");
848   verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
849                "         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
850                "     aaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbbbbbbb;\n"
851                "     ++aaaaaaaaaaaaaaaaaaaaaaaaaaa) {");
852 
853   // These should not be formatted as Objective-C for-in loops.
854   verifyFormat("for (Foo *x = 0; x != in; x++) {\n}");
855   verifyFormat("Foo *x;\nfor (x = 0; x != in; x++) {\n}");
856   verifyFormat("Foo *x;\nfor (x in y) {\n}");
857   verifyFormat("for (const Foo<Bar> &baz = in.value(); !baz.at_end(); ++baz) {\n}");
858 
859   FormatStyle NoBinPacking = getLLVMStyle();
860   NoBinPacking.BinPackParameters = false;
861   verifyFormat("for (int aaaaaaaaaaa = 1;\n"
862                "     aaaaaaaaaaa <= aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa,\n"
863                "                                           aaaaaaaaaaaaaaaa,\n"
864                "                                           aaaaaaaaaaaaaaaa,\n"
865                "                                           aaaaaaaaaaaaaaaa);\n"
866                "     aaaaaaaaaaa++, bbbbbbbbbbbbbbbbb++) {\n"
867                "}",
868                NoBinPacking);
869   verifyFormat(
870       "for (std::vector<UnwrappedLine>::iterator I = UnwrappedLines.begin(),\n"
871       "                                          E = UnwrappedLines.end();\n"
872       "     I != E;\n"
873       "     ++I) {\n}",
874       NoBinPacking);
875 
876   FormatStyle AlignLeft = getLLVMStyle();
877   AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
878   verifyFormat("for (A* a = start; a < end; ++a, ++value) {\n}", AlignLeft);
879 }
880 
881 TEST_F(FormatTest, RangeBasedForLoops) {
882   verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
883                "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
884   verifyFormat("for (auto aaaaaaaaaaaaaaaaaaaaa :\n"
885                "     aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa, aaaaaaaaaaaaa)) {\n}");
886   verifyFormat("for (const aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaa :\n"
887                "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
888   verifyFormat("for (aaaaaaaaa aaaaaaaaaaaaaaaaaaaaa :\n"
889                "     aaaaaaaaaaaa.aaaaaaaaaaaa().aaaaaaaaa().a()) {\n}");
890 }
891 
892 TEST_F(FormatTest, ForEachLoops) {
893   verifyFormat("void f() {\n"
894                "  foreach (Item *item, itemlist) {}\n"
895                "  Q_FOREACH (Item *item, itemlist) {}\n"
896                "  BOOST_FOREACH (Item *item, itemlist) {}\n"
897                "  UNKNOWN_FORACH(Item * item, itemlist) {}\n"
898                "}");
899 
900   // As function-like macros.
901   verifyFormat("#define foreach(x, y)\n"
902                "#define Q_FOREACH(x, y)\n"
903                "#define BOOST_FOREACH(x, y)\n"
904                "#define UNKNOWN_FOREACH(x, y)\n");
905 
906   // Not as function-like macros.
907   verifyFormat("#define foreach (x, y)\n"
908                "#define Q_FOREACH (x, y)\n"
909                "#define BOOST_FOREACH (x, y)\n"
910                "#define UNKNOWN_FOREACH (x, y)\n");
911 }
912 
913 TEST_F(FormatTest, FormatsWhileLoop) {
914   verifyFormat("while (true) {\n}");
915   verifyFormat("while (true)\n"
916                "  f();");
917   verifyFormat("while () {\n}");
918   verifyFormat("while () {\n"
919                "  f();\n"
920                "}");
921 }
922 
923 TEST_F(FormatTest, FormatsDoWhile) {
924   verifyFormat("do {\n"
925                "  do_something();\n"
926                "} while (something());");
927   verifyFormat("do\n"
928                "  do_something();\n"
929                "while (something());");
930 }
931 
932 TEST_F(FormatTest, FormatsSwitchStatement) {
933   verifyFormat("switch (x) {\n"
934                "case 1:\n"
935                "  f();\n"
936                "  break;\n"
937                "case kFoo:\n"
938                "case ns::kBar:\n"
939                "case kBaz:\n"
940                "  break;\n"
941                "default:\n"
942                "  g();\n"
943                "  break;\n"
944                "}");
945   verifyFormat("switch (x) {\n"
946                "case 1: {\n"
947                "  f();\n"
948                "  break;\n"
949                "}\n"
950                "case 2: {\n"
951                "  break;\n"
952                "}\n"
953                "}");
954   verifyFormat("switch (x) {\n"
955                "case 1: {\n"
956                "  f();\n"
957                "  {\n"
958                "    g();\n"
959                "    h();\n"
960                "  }\n"
961                "  break;\n"
962                "}\n"
963                "}");
964   verifyFormat("switch (x) {\n"
965                "case 1: {\n"
966                "  f();\n"
967                "  if (foo) {\n"
968                "    g();\n"
969                "    h();\n"
970                "  }\n"
971                "  break;\n"
972                "}\n"
973                "}");
974   verifyFormat("switch (x) {\n"
975                "case 1: {\n"
976                "  f();\n"
977                "  g();\n"
978                "} break;\n"
979                "}");
980   verifyFormat("switch (test)\n"
981                "  ;");
982   verifyFormat("switch (x) {\n"
983                "default: {\n"
984                "  // Do nothing.\n"
985                "}\n"
986                "}");
987   verifyFormat("switch (x) {\n"
988                "// comment\n"
989                "// if 1, do f()\n"
990                "case 1:\n"
991                "  f();\n"
992                "}");
993   verifyFormat("switch (x) {\n"
994                "case 1:\n"
995                "  // Do amazing stuff\n"
996                "  {\n"
997                "    f();\n"
998                "    g();\n"
999                "  }\n"
1000                "  break;\n"
1001                "}");
1002   verifyFormat("#define A          \\\n"
1003                "  switch (x) {     \\\n"
1004                "  case a:          \\\n"
1005                "    foo = b;       \\\n"
1006                "  }",
1007                getLLVMStyleWithColumns(20));
1008   verifyFormat("#define OPERATION_CASE(name)           \\\n"
1009                "  case OP_name:                        \\\n"
1010                "    return operations::Operation##name\n",
1011                getLLVMStyleWithColumns(40));
1012   verifyFormat("switch (x) {\n"
1013                "case 1:;\n"
1014                "default:;\n"
1015                "  int i;\n"
1016                "}");
1017 
1018   verifyGoogleFormat("switch (x) {\n"
1019                      "  case 1:\n"
1020                      "    f();\n"
1021                      "    break;\n"
1022                      "  case kFoo:\n"
1023                      "  case ns::kBar:\n"
1024                      "  case kBaz:\n"
1025                      "    break;\n"
1026                      "  default:\n"
1027                      "    g();\n"
1028                      "    break;\n"
1029                      "}");
1030   verifyGoogleFormat("switch (x) {\n"
1031                      "  case 1: {\n"
1032                      "    f();\n"
1033                      "    break;\n"
1034                      "  }\n"
1035                      "}");
1036   verifyGoogleFormat("switch (test)\n"
1037                      "  ;");
1038 
1039   verifyGoogleFormat("#define OPERATION_CASE(name) \\\n"
1040                      "  case OP_name:              \\\n"
1041                      "    return operations::Operation##name\n");
1042   verifyGoogleFormat("Operation codeToOperation(OperationCode OpCode) {\n"
1043                      "  // Get the correction operation class.\n"
1044                      "  switch (OpCode) {\n"
1045                      "    CASE(Add);\n"
1046                      "    CASE(Subtract);\n"
1047                      "    default:\n"
1048                      "      return operations::Unknown;\n"
1049                      "  }\n"
1050                      "#undef OPERATION_CASE\n"
1051                      "}");
1052   verifyFormat("DEBUG({\n"
1053                "  switch (x) {\n"
1054                "  case A:\n"
1055                "    f();\n"
1056                "    break;\n"
1057                "    // fallthrough\n"
1058                "  case B:\n"
1059                "    g();\n"
1060                "    break;\n"
1061                "  }\n"
1062                "});");
1063   EXPECT_EQ("DEBUG({\n"
1064             "  switch (x) {\n"
1065             "  case A:\n"
1066             "    f();\n"
1067             "    break;\n"
1068             "  // On B:\n"
1069             "  case B:\n"
1070             "    g();\n"
1071             "    break;\n"
1072             "  }\n"
1073             "});",
1074             format("DEBUG({\n"
1075                    "  switch (x) {\n"
1076                    "  case A:\n"
1077                    "    f();\n"
1078                    "    break;\n"
1079                    "  // On B:\n"
1080                    "  case B:\n"
1081                    "    g();\n"
1082                    "    break;\n"
1083                    "  }\n"
1084                    "});",
1085                    getLLVMStyle()));
1086   EXPECT_EQ("switch (n) {\n"
1087             "case 0: {\n"
1088             "  return false;\n"
1089             "}\n"
1090             "default: {\n"
1091             "  return true;\n"
1092             "}\n"
1093             "}",
1094             format("switch (n)\n"
1095                    "{\n"
1096                    "case 0: {\n"
1097                    "  return false;\n"
1098                    "}\n"
1099                    "default: {\n"
1100                    "  return true;\n"
1101                    "}\n"
1102                    "}",
1103                    getLLVMStyle()));
1104   verifyFormat("switch (a) {\n"
1105                "case (b):\n"
1106                "  return;\n"
1107                "}");
1108 
1109   verifyFormat("switch (a) {\n"
1110                "case some_namespace::\n"
1111                "    some_constant:\n"
1112                "  return;\n"
1113                "}",
1114                getLLVMStyleWithColumns(34));
1115 
1116   FormatStyle Style = getLLVMStyle();
1117   Style.IndentCaseLabels = true;
1118   Style.AllowShortBlocksOnASingleLine = false;
1119   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1120   Style.BraceWrapping.AfterCaseLabel = true;
1121   Style.BraceWrapping.AfterControlStatement = true;
1122   EXPECT_EQ("switch (n)\n"
1123             "{\n"
1124             "  case 0:\n"
1125             "  {\n"
1126             "    return false;\n"
1127             "  }\n"
1128             "  default:\n"
1129             "  {\n"
1130             "    return true;\n"
1131             "  }\n"
1132             "}",
1133             format("switch (n) {\n"
1134                    "  case 0: {\n"
1135                    "    return false;\n"
1136                    "  }\n"
1137                    "  default: {\n"
1138                    "    return true;\n"
1139                    "  }\n"
1140                    "}",
1141                    Style));
1142   Style.BraceWrapping.AfterCaseLabel = false;
1143   EXPECT_EQ("switch (n)\n"
1144             "{\n"
1145             "  case 0: {\n"
1146             "    return false;\n"
1147             "  }\n"
1148             "  default: {\n"
1149             "    return true;\n"
1150             "  }\n"
1151             "}",
1152             format("switch (n) {\n"
1153                    "  case 0:\n"
1154                    "  {\n"
1155                    "    return false;\n"
1156                    "  }\n"
1157                    "  default:\n"
1158                    "  {\n"
1159                    "    return true;\n"
1160                    "  }\n"
1161                    "}",
1162                    Style));
1163 }
1164 
1165 TEST_F(FormatTest, CaseRanges) {
1166   verifyFormat("switch (x) {\n"
1167                "case 'A' ... 'Z':\n"
1168                "case 1 ... 5:\n"
1169                "case a ... b:\n"
1170                "  break;\n"
1171                "}");
1172 }
1173 
1174 TEST_F(FormatTest, ShortCaseLabels) {
1175   FormatStyle Style = getLLVMStyle();
1176   Style.AllowShortCaseLabelsOnASingleLine = true;
1177   verifyFormat("switch (a) {\n"
1178                "case 1: x = 1; break;\n"
1179                "case 2: return;\n"
1180                "case 3:\n"
1181                "case 4:\n"
1182                "case 5: return;\n"
1183                "case 6: // comment\n"
1184                "  return;\n"
1185                "case 7:\n"
1186                "  // comment\n"
1187                "  return;\n"
1188                "case 8:\n"
1189                "  x = 8; // comment\n"
1190                "  break;\n"
1191                "default: y = 1; break;\n"
1192                "}",
1193                Style);
1194   verifyFormat("switch (a) {\n"
1195                "case 0: return; // comment\n"
1196                "case 1: break;  // comment\n"
1197                "case 2: return;\n"
1198                "// comment\n"
1199                "case 3: return;\n"
1200                "// comment 1\n"
1201                "// comment 2\n"
1202                "// comment 3\n"
1203                "case 4: break; /* comment */\n"
1204                "case 5:\n"
1205                "  // comment\n"
1206                "  break;\n"
1207                "case 6: /* comment */ x = 1; break;\n"
1208                "case 7: x = /* comment */ 1; break;\n"
1209                "case 8:\n"
1210                "  x = 1; /* comment */\n"
1211                "  break;\n"
1212                "case 9:\n"
1213                "  break; // comment line 1\n"
1214                "         // comment line 2\n"
1215                "}",
1216                Style);
1217   EXPECT_EQ("switch (a) {\n"
1218             "case 1:\n"
1219             "  x = 8;\n"
1220             "  // fall through\n"
1221             "case 2: x = 8;\n"
1222             "// comment\n"
1223             "case 3:\n"
1224             "  return; /* comment line 1\n"
1225             "           * comment line 2 */\n"
1226             "case 4: i = 8;\n"
1227             "// something else\n"
1228             "#if FOO\n"
1229             "case 5: break;\n"
1230             "#endif\n"
1231             "}",
1232             format("switch (a) {\n"
1233                    "case 1: x = 8;\n"
1234                    "  // fall through\n"
1235                    "case 2:\n"
1236                    "  x = 8;\n"
1237                    "// comment\n"
1238                    "case 3:\n"
1239                    "  return; /* comment line 1\n"
1240                    "           * comment line 2 */\n"
1241                    "case 4:\n"
1242                    "  i = 8;\n"
1243                    "// something else\n"
1244                    "#if FOO\n"
1245                    "case 5: break;\n"
1246                    "#endif\n"
1247                    "}",
1248                    Style));
1249   EXPECT_EQ("switch (a) {\n" "case 0:\n"
1250             "  return; // long long long long long long long long long long long long comment\n"
1251             "          // line\n" "}",
1252             format("switch (a) {\n"
1253                    "case 0: return; // long long long long long long long long long long long long comment line\n"
1254                    "}",
1255                    Style));
1256   EXPECT_EQ("switch (a) {\n"
1257             "case 0:\n"
1258             "  return; /* long long long long long long long long long long long long comment\n"
1259             "             line */\n"
1260             "}",
1261             format("switch (a) {\n"
1262                    "case 0: return; /* long long long long long long long long long long long long comment line */\n"
1263                    "}",
1264                    Style));
1265   verifyFormat("switch (a) {\n"
1266                "#if FOO\n"
1267                "case 0: return 0;\n"
1268                "#endif\n"
1269                "}",
1270                Style);
1271   verifyFormat("switch (a) {\n"
1272                "case 1: {\n"
1273                "}\n"
1274                "case 2: {\n"
1275                "  return;\n"
1276                "}\n"
1277                "case 3: {\n"
1278                "  x = 1;\n"
1279                "  return;\n"
1280                "}\n"
1281                "case 4:\n"
1282                "  if (x)\n"
1283                "    return;\n"
1284                "}",
1285                Style);
1286   Style.ColumnLimit = 21;
1287   verifyFormat("switch (a) {\n"
1288                "case 1: x = 1; break;\n"
1289                "case 2: return;\n"
1290                "case 3:\n"
1291                "case 4:\n"
1292                "case 5: return;\n"
1293                "default:\n"
1294                "  y = 1;\n"
1295                "  break;\n"
1296                "}",
1297                Style);
1298   Style.ColumnLimit = 80;
1299   Style.AllowShortCaseLabelsOnASingleLine = false;
1300   Style.IndentCaseLabels = true;
1301   EXPECT_EQ("switch (n) {\n"
1302             "  default /*comments*/:\n"
1303             "    return true;\n"
1304             "  case 0:\n"
1305             "    return false;\n"
1306             "}",
1307             format("switch (n) {\n"
1308                    "default/*comments*/:\n"
1309                    "  return true;\n"
1310                    "case 0:\n"
1311                    "  return false;\n"
1312                    "}",
1313                    Style));
1314   Style.AllowShortCaseLabelsOnASingleLine = true;
1315   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1316   Style.BraceWrapping.AfterCaseLabel = true;
1317   Style.BraceWrapping.AfterControlStatement = true;
1318   EXPECT_EQ("switch (n)\n"
1319             "{\n"
1320             "  case 0:\n"
1321             "  {\n"
1322             "    return false;\n"
1323             "  }\n"
1324             "  default:\n"
1325             "  {\n"
1326             "    return true;\n"
1327             "  }\n"
1328             "}",
1329             format("switch (n) {\n"
1330                    "  case 0: {\n"
1331                    "    return false;\n"
1332                    "  }\n"
1333                    "  default:\n"
1334                    "  {\n"
1335                    "    return true;\n"
1336                    "  }\n"
1337                    "}",
1338                    Style));
1339 }
1340 
1341 TEST_F(FormatTest, FormatsLabels) {
1342   verifyFormat("void f() {\n"
1343                "  some_code();\n"
1344                "test_label:\n"
1345                "  some_other_code();\n"
1346                "  {\n"
1347                "    some_more_code();\n"
1348                "  another_label:\n"
1349                "    some_more_code();\n"
1350                "  }\n"
1351                "}");
1352   verifyFormat("{\n"
1353                "  some_code();\n"
1354                "test_label:\n"
1355                "  some_other_code();\n"
1356                "}");
1357   verifyFormat("{\n"
1358                "  some_code();\n"
1359                "test_label:;\n"
1360                "  int i = 0;\n"
1361                "}");
1362 }
1363 
1364 //===----------------------------------------------------------------------===//
1365 // Tests for classes, namespaces, etc.
1366 //===----------------------------------------------------------------------===//
1367 
1368 TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) {
1369   verifyFormat("class A {};");
1370 }
1371 
1372 TEST_F(FormatTest, UnderstandsAccessSpecifiers) {
1373   verifyFormat("class A {\n"
1374                "public:\n"
1375                "public: // comment\n"
1376                "protected:\n"
1377                "private:\n"
1378                "  void f() {}\n"
1379                "};");
1380   verifyFormat("export class A {\n"
1381                "public:\n"
1382                "public: // comment\n"
1383                "protected:\n"
1384                "private:\n"
1385                "  void f() {}\n"
1386                "};");
1387   verifyGoogleFormat("class A {\n"
1388                      " public:\n"
1389                      " protected:\n"
1390                      " private:\n"
1391                      "  void f() {}\n"
1392                      "};");
1393   verifyGoogleFormat("export class A {\n"
1394                      " public:\n"
1395                      " protected:\n"
1396                      " private:\n"
1397                      "  void f() {}\n"
1398                      "};");
1399   verifyFormat("class A {\n"
1400                "public slots:\n"
1401                "  void f1() {}\n"
1402                "public Q_SLOTS:\n"
1403                "  void f2() {}\n"
1404                "protected slots:\n"
1405                "  void f3() {}\n"
1406                "protected Q_SLOTS:\n"
1407                "  void f4() {}\n"
1408                "private slots:\n"
1409                "  void f5() {}\n"
1410                "private Q_SLOTS:\n"
1411                "  void f6() {}\n"
1412                "signals:\n"
1413                "  void g1();\n"
1414                "Q_SIGNALS:\n"
1415                "  void g2();\n"
1416                "};");
1417 
1418   // Don't interpret 'signals' the wrong way.
1419   verifyFormat("signals.set();");
1420   verifyFormat("for (Signals signals : f()) {\n}");
1421   verifyFormat("{\n"
1422                "  signals.set(); // This needs indentation.\n"
1423                "}");
1424   verifyFormat("void f() {\n"
1425                "label:\n"
1426                "  signals.baz();\n"
1427                "}");
1428 }
1429 
1430 TEST_F(FormatTest, SeparatesLogicalBlocks) {
1431   EXPECT_EQ("class A {\n"
1432             "public:\n"
1433             "  void f();\n"
1434             "\n"
1435             "private:\n"
1436             "  void g() {}\n"
1437             "  // test\n"
1438             "protected:\n"
1439             "  int h;\n"
1440             "};",
1441             format("class A {\n"
1442                    "public:\n"
1443                    "void f();\n"
1444                    "private:\n"
1445                    "void g() {}\n"
1446                    "// test\n"
1447                    "protected:\n"
1448                    "int h;\n"
1449                    "};"));
1450   EXPECT_EQ("class A {\n"
1451             "protected:\n"
1452             "public:\n"
1453             "  void f();\n"
1454             "};",
1455             format("class A {\n"
1456                    "protected:\n"
1457                    "\n"
1458                    "public:\n"
1459                    "\n"
1460                    "  void f();\n"
1461                    "};"));
1462 
1463   // Even ensure proper spacing inside macros.
1464   EXPECT_EQ("#define B     \\\n"
1465             "  class A {   \\\n"
1466             "   protected: \\\n"
1467             "   public:    \\\n"
1468             "    void f(); \\\n"
1469             "  };",
1470             format("#define B     \\\n"
1471                    "  class A {   \\\n"
1472                    "   protected: \\\n"
1473                    "              \\\n"
1474                    "   public:    \\\n"
1475                    "              \\\n"
1476                    "    void f(); \\\n"
1477                    "  };",
1478                    getGoogleStyle()));
1479   // But don't remove empty lines after macros ending in access specifiers.
1480   EXPECT_EQ("#define A private:\n"
1481             "\n"
1482             "int i;",
1483             format("#define A         private:\n"
1484                    "\n"
1485                    "int              i;"));
1486 }
1487 
1488 TEST_F(FormatTest, FormatsClasses) {
1489   verifyFormat("class A : public B {};");
1490   verifyFormat("class A : public ::B {};");
1491 
1492   verifyFormat(
1493       "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
1494       "                             public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
1495   verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n"
1496                "    : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
1497                "      public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};");
1498   verifyFormat(
1499       "class A : public B, public C, public D, public E, public F {};");
1500   verifyFormat("class AAAAAAAAAAAA : public B,\n"
1501                "                     public C,\n"
1502                "                     public D,\n"
1503                "                     public E,\n"
1504                "                     public F,\n"
1505                "                     public G {};");
1506 
1507   verifyFormat("class\n"
1508                "    ReallyReallyLongClassName {\n"
1509                "  int i;\n"
1510                "};",
1511                getLLVMStyleWithColumns(32));
1512   verifyFormat("struct aaaaaaaaaaaaa : public aaaaaaaaaaaaaaaaaaa< // break\n"
1513                "                           aaaaaaaaaaaaaaaa> {};");
1514   verifyFormat("struct aaaaaaaaaaaaaaaaaaaa\n"
1515                "    : public aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaa,\n"
1516                "                                 aaaaaaaaaaaaaaaaaaaaaa> {};");
1517   verifyFormat("template <class R, class C>\n"
1518                "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n"
1519                "    : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};");
1520   verifyFormat("class ::A::B {};");
1521 }
1522 
1523 TEST_F(FormatTest, BreakInheritanceStyle) {
1524   FormatStyle StyleWithInheritanceBreakBeforeComma = getLLVMStyle();
1525   StyleWithInheritanceBreakBeforeComma.BreakInheritanceList =
1526           FormatStyle::BILS_BeforeComma;
1527   verifyFormat("class MyClass : public X {};",
1528                StyleWithInheritanceBreakBeforeComma);
1529   verifyFormat("class MyClass\n"
1530                "    : public X\n"
1531                "    , public Y {};",
1532                StyleWithInheritanceBreakBeforeComma);
1533   verifyFormat("class AAAAAAAAAAAAAAAAAAAAAA\n"
1534                "    : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n"
1535                "    , public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};",
1536                StyleWithInheritanceBreakBeforeComma);
1537   verifyFormat("struct aaaaaaaaaaaaa\n"
1538                "    : public aaaaaaaaaaaaaaaaaaa< // break\n"
1539                "          aaaaaaaaaaaaaaaa> {};",
1540                StyleWithInheritanceBreakBeforeComma);
1541 
1542   FormatStyle StyleWithInheritanceBreakAfterColon = getLLVMStyle();
1543   StyleWithInheritanceBreakAfterColon.BreakInheritanceList =
1544           FormatStyle::BILS_AfterColon;
1545   verifyFormat("class MyClass : public X {};",
1546                StyleWithInheritanceBreakAfterColon);
1547   verifyFormat("class MyClass : public X, public Y {};",
1548                StyleWithInheritanceBreakAfterColon);
1549   verifyFormat("class AAAAAAAAAAAAAAAAAAAAAA :\n"
1550                "    public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n"
1551                "    public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {};",
1552                StyleWithInheritanceBreakAfterColon);
1553   verifyFormat("struct aaaaaaaaaaaaa :\n"
1554                "    public aaaaaaaaaaaaaaaaaaa< // break\n"
1555                "        aaaaaaaaaaaaaaaa> {};",
1556                StyleWithInheritanceBreakAfterColon);
1557 }
1558 
1559 TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) {
1560   verifyFormat("class A {\n} a, b;");
1561   verifyFormat("struct A {\n} a, b;");
1562   verifyFormat("union A {\n} a;");
1563 }
1564 
1565 TEST_F(FormatTest, FormatsEnum) {
1566   verifyFormat("enum {\n"
1567                "  Zero,\n"
1568                "  One = 1,\n"
1569                "  Two = One + 1,\n"
1570                "  Three = (One + Two),\n"
1571                "  Four = (Zero && (One ^ Two)) | (One << Two),\n"
1572                "  Five = (One, Two, Three, Four, 5)\n"
1573                "};");
1574   verifyGoogleFormat("enum {\n"
1575                      "  Zero,\n"
1576                      "  One = 1,\n"
1577                      "  Two = One + 1,\n"
1578                      "  Three = (One + Two),\n"
1579                      "  Four = (Zero && (One ^ Two)) | (One << Two),\n"
1580                      "  Five = (One, Two, Three, Four, 5)\n"
1581                      "};");
1582   verifyFormat("enum Enum {};");
1583   verifyFormat("enum {};");
1584   verifyFormat("enum X E {} d;");
1585   verifyFormat("enum __attribute__((...)) E {} d;");
1586   verifyFormat("enum __declspec__((...)) E {} d;");
1587   verifyFormat("enum {\n"
1588                "  Bar = Foo<int, int>::value\n"
1589                "};",
1590                getLLVMStyleWithColumns(30));
1591 
1592   verifyFormat("enum ShortEnum { A, B, C };");
1593   verifyGoogleFormat("enum ShortEnum { A, B, C };");
1594 
1595   EXPECT_EQ("enum KeepEmptyLines {\n"
1596             "  ONE,\n"
1597             "\n"
1598             "  TWO,\n"
1599             "\n"
1600             "  THREE\n"
1601             "}",
1602             format("enum KeepEmptyLines {\n"
1603                    "  ONE,\n"
1604                    "\n"
1605                    "  TWO,\n"
1606                    "\n"
1607                    "\n"
1608                    "  THREE\n"
1609                    "}"));
1610   verifyFormat("enum E { // comment\n"
1611                "  ONE,\n"
1612                "  TWO\n"
1613                "};\n"
1614                "int i;");
1615   // Not enums.
1616   verifyFormat("enum X f() {\n"
1617                "  a();\n"
1618                "  return 42;\n"
1619                "}");
1620   verifyFormat("enum X Type::f() {\n"
1621                "  a();\n"
1622                "  return 42;\n"
1623                "}");
1624   verifyFormat("enum ::X f() {\n"
1625                "  a();\n"
1626                "  return 42;\n"
1627                "}");
1628   verifyFormat("enum ns::X f() {\n"
1629                "  a();\n"
1630                "  return 42;\n"
1631                "}");
1632 }
1633 
1634 TEST_F(FormatTest, FormatsEnumsWithErrors) {
1635   verifyFormat("enum Type {\n"
1636                "  One = 0; // These semicolons should be commas.\n"
1637                "  Two = 1;\n"
1638                "};");
1639   verifyFormat("namespace n {\n"
1640                "enum Type {\n"
1641                "  One,\n"
1642                "  Two, // missing };\n"
1643                "  int i;\n"
1644                "}\n"
1645                "void g() {}");
1646 }
1647 
1648 TEST_F(FormatTest, FormatsEnumStruct) {
1649   verifyFormat("enum struct {\n"
1650                "  Zero,\n"
1651                "  One = 1,\n"
1652                "  Two = One + 1,\n"
1653                "  Three = (One + Two),\n"
1654                "  Four = (Zero && (One ^ Two)) | (One << Two),\n"
1655                "  Five = (One, Two, Three, Four, 5)\n"
1656                "};");
1657   verifyFormat("enum struct Enum {};");
1658   verifyFormat("enum struct {};");
1659   verifyFormat("enum struct X E {} d;");
1660   verifyFormat("enum struct __attribute__((...)) E {} d;");
1661   verifyFormat("enum struct __declspec__((...)) E {} d;");
1662   verifyFormat("enum struct X f() {\n  a();\n  return 42;\n}");
1663 }
1664 
1665 TEST_F(FormatTest, FormatsEnumClass) {
1666   verifyFormat("enum class {\n"
1667                "  Zero,\n"
1668                "  One = 1,\n"
1669                "  Two = One + 1,\n"
1670                "  Three = (One + Two),\n"
1671                "  Four = (Zero && (One ^ Two)) | (One << Two),\n"
1672                "  Five = (One, Two, Three, Four, 5)\n"
1673                "};");
1674   verifyFormat("enum class Enum {};");
1675   verifyFormat("enum class {};");
1676   verifyFormat("enum class X E {} d;");
1677   verifyFormat("enum class __attribute__((...)) E {} d;");
1678   verifyFormat("enum class __declspec__((...)) E {} d;");
1679   verifyFormat("enum class X f() {\n  a();\n  return 42;\n}");
1680 }
1681 
1682 TEST_F(FormatTest, FormatsEnumTypes) {
1683   verifyFormat("enum X : int {\n"
1684                "  A, // Force multiple lines.\n"
1685                "  B\n"
1686                "};");
1687   verifyFormat("enum X : int { A, B };");
1688   verifyFormat("enum X : std::uint32_t { A, B };");
1689 }
1690 
1691 TEST_F(FormatTest, FormatsTypedefEnum) {
1692   FormatStyle Style = getLLVMStyle();
1693   Style.ColumnLimit = 40;
1694   verifyFormat("typedef enum {} EmptyEnum;");
1695   verifyFormat("typedef enum { A, B, C } ShortEnum;");
1696   verifyFormat("typedef enum {\n"
1697                "  ZERO = 0,\n"
1698                "  ONE = 1,\n"
1699                "  TWO = 2,\n"
1700                "  THREE = 3\n"
1701                "} LongEnum;",
1702                Style);
1703   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
1704   Style.BraceWrapping.AfterEnum = true;
1705   verifyFormat("typedef enum {} EmptyEnum;");
1706   verifyFormat("typedef enum { A, B, C } ShortEnum;");
1707   verifyFormat("typedef enum\n"
1708                "{\n"
1709                "  ZERO = 0,\n"
1710                "  ONE = 1,\n"
1711                "  TWO = 2,\n"
1712                "  THREE = 3\n"
1713                "} LongEnum;",
1714                Style);
1715 }
1716 
1717 TEST_F(FormatTest, FormatsNSEnums) {
1718   verifyGoogleFormat("typedef NS_ENUM(NSInteger, SomeName) { AAA, BBB }");
1719   verifyGoogleFormat(
1720       "typedef NS_CLOSED_ENUM(NSInteger, SomeName) { AAA, BBB }");
1721   verifyGoogleFormat("typedef NS_ENUM(NSInteger, MyType) {\n"
1722                      "  // Information about someDecentlyLongValue.\n"
1723                      "  someDecentlyLongValue,\n"
1724                      "  // Information about anotherDecentlyLongValue.\n"
1725                      "  anotherDecentlyLongValue,\n"
1726                      "  // Information about aThirdDecentlyLongValue.\n"
1727                      "  aThirdDecentlyLongValue\n"
1728                      "};");
1729   verifyGoogleFormat("typedef NS_CLOSED_ENUM(NSInteger, MyType) {\n"
1730                      "  // Information about someDecentlyLongValue.\n"
1731                      "  someDecentlyLongValue,\n"
1732                      "  // Information about anotherDecentlyLongValue.\n"
1733                      "  anotherDecentlyLongValue,\n"
1734                      "  // Information about aThirdDecentlyLongValue.\n"
1735                      "  aThirdDecentlyLongValue\n"
1736                      "};");
1737   verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n"
1738                      "  a = 1,\n"
1739                      "  b = 2,\n"
1740                      "  c = 3,\n"
1741                      "};");
1742   verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n"
1743                      "  a = 1,\n"
1744                      "  b = 2,\n"
1745                      "  c = 3,\n"
1746                      "};");
1747   verifyGoogleFormat("typedef CF_CLOSED_ENUM(NSInteger, MyType) {\n"
1748                      "  a = 1,\n"
1749                      "  b = 2,\n"
1750                      "  c = 3,\n"
1751                      "};");
1752   verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n"
1753                      "  a = 1,\n"
1754                      "  b = 2,\n"
1755                      "  c = 3,\n"
1756                      "};");
1757 }
1758 
1759 TEST_F(FormatTest, FormatsBitfields) {
1760   verifyFormat("struct Bitfields {\n"
1761                "  unsigned sClass : 8;\n"
1762                "  unsigned ValueKind : 2;\n"
1763                "};");
1764   verifyFormat("struct A {\n"
1765                "  int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n"
1766                "      bbbbbbbbbbbbbbbbbbbbbbbbb;\n"
1767                "};");
1768   verifyFormat("struct MyStruct {\n"
1769                "  uchar data;\n"
1770                "  uchar : 8;\n"
1771                "  uchar : 8;\n"
1772                "  uchar other;\n"
1773                "};");
1774 }
1775 
1776 TEST_F(FormatTest, FormatsNamespaces) {
1777   FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle();
1778   LLVMWithNoNamespaceFix.FixNamespaceComments = false;
1779 
1780   verifyFormat("namespace some_namespace {\n"
1781                "class A {};\n"
1782                "void f() { f(); }\n"
1783                "}",
1784                LLVMWithNoNamespaceFix);
1785   verifyFormat("namespace N::inline D {\n"
1786                "class A {};\n"
1787                "void f() { f(); }\n"
1788                "}",
1789                LLVMWithNoNamespaceFix);
1790   verifyFormat("namespace N::inline D::E {\n"
1791                "class A {};\n"
1792                "void f() { f(); }\n"
1793                "}",
1794                LLVMWithNoNamespaceFix);
1795   verifyFormat("namespace [[deprecated(\"foo[bar\")]] some_namespace {\n"
1796                "class A {};\n"
1797                "void f() { f(); }\n"
1798                "}",
1799                LLVMWithNoNamespaceFix);
1800   verifyFormat("/* something */ namespace some_namespace {\n"
1801                "class A {};\n"
1802                "void f() { f(); }\n"
1803                "}",
1804                LLVMWithNoNamespaceFix);
1805   verifyFormat("namespace {\n"
1806                "class A {};\n"
1807                "void f() { f(); }\n"
1808                "}",
1809                LLVMWithNoNamespaceFix);
1810   verifyFormat("/* something */ namespace {\n"
1811                "class A {};\n"
1812                "void f() { f(); }\n"
1813                "}",
1814                LLVMWithNoNamespaceFix);
1815   verifyFormat("inline namespace X {\n"
1816                "class A {};\n"
1817                "void f() { f(); }\n"
1818                "}",
1819                LLVMWithNoNamespaceFix);
1820   verifyFormat("/* something */ inline namespace X {\n"
1821                "class A {};\n"
1822                "void f() { f(); }\n"
1823                "}",
1824                LLVMWithNoNamespaceFix);
1825   verifyFormat("export namespace X {\n"
1826                "class A {};\n"
1827                "void f() { f(); }\n"
1828                "}",
1829                LLVMWithNoNamespaceFix);
1830   verifyFormat("using namespace some_namespace;\n"
1831                "class A {};\n"
1832                "void f() { f(); }",
1833                LLVMWithNoNamespaceFix);
1834 
1835   // This code is more common than we thought; if we
1836   // layout this correctly the semicolon will go into
1837   // its own line, which is undesirable.
1838   verifyFormat("namespace {};",
1839                LLVMWithNoNamespaceFix);
1840   verifyFormat("namespace {\n"
1841                "class A {};\n"
1842                "};",
1843                LLVMWithNoNamespaceFix);
1844 
1845   verifyFormat("namespace {\n"
1846                "int SomeVariable = 0; // comment\n"
1847                "} // namespace",
1848                LLVMWithNoNamespaceFix);
1849   EXPECT_EQ("#ifndef HEADER_GUARD\n"
1850             "#define HEADER_GUARD\n"
1851             "namespace my_namespace {\n"
1852             "int i;\n"
1853             "} // my_namespace\n"
1854             "#endif // HEADER_GUARD",
1855             format("#ifndef HEADER_GUARD\n"
1856                    " #define HEADER_GUARD\n"
1857                    "   namespace my_namespace {\n"
1858                    "int i;\n"
1859                    "}    // my_namespace\n"
1860                    "#endif    // HEADER_GUARD",
1861                    LLVMWithNoNamespaceFix));
1862 
1863   EXPECT_EQ("namespace A::B {\n"
1864             "class C {};\n"
1865             "}",
1866             format("namespace A::B {\n"
1867                    "class C {};\n"
1868                    "}",
1869                    LLVMWithNoNamespaceFix));
1870 
1871   FormatStyle Style = getLLVMStyle();
1872   Style.NamespaceIndentation = FormatStyle::NI_All;
1873   EXPECT_EQ("namespace out {\n"
1874             "  int i;\n"
1875             "  namespace in {\n"
1876             "    int i;\n"
1877             "  } // namespace in\n"
1878             "} // namespace out",
1879             format("namespace out {\n"
1880                    "int i;\n"
1881                    "namespace in {\n"
1882                    "int i;\n"
1883                    "} // namespace in\n"
1884                    "} // namespace out",
1885                    Style));
1886 
1887   Style.NamespaceIndentation = FormatStyle::NI_Inner;
1888   EXPECT_EQ("namespace out {\n"
1889             "int i;\n"
1890             "namespace in {\n"
1891             "  int i;\n"
1892             "} // namespace in\n"
1893             "} // namespace out",
1894             format("namespace out {\n"
1895                    "int i;\n"
1896                    "namespace in {\n"
1897                    "int i;\n"
1898                    "} // namespace in\n"
1899                    "} // namespace out",
1900                    Style));
1901 }
1902 
1903 TEST_F(FormatTest, NamespaceMacros) {
1904   FormatStyle Style = getLLVMStyle();
1905   Style.NamespaceMacros.push_back("TESTSUITE");
1906 
1907   verifyFormat("TESTSUITE(A) {\n"
1908                "int foo();\n"
1909                "} // TESTSUITE(A)",
1910                Style);
1911 
1912   verifyFormat("TESTSUITE(A, B) {\n"
1913                "int foo();\n"
1914                "} // TESTSUITE(A)",
1915                Style);
1916 
1917   // Properly indent according to NamespaceIndentation style
1918   Style.NamespaceIndentation = FormatStyle::NI_All;
1919   verifyFormat("TESTSUITE(A) {\n"
1920                "  int foo();\n"
1921                "} // TESTSUITE(A)",
1922                Style);
1923   verifyFormat("TESTSUITE(A) {\n"
1924                "  namespace B {\n"
1925                "    int foo();\n"
1926                "  } // namespace B\n"
1927                "} // TESTSUITE(A)",
1928                Style);
1929   verifyFormat("namespace A {\n"
1930                "  TESTSUITE(B) {\n"
1931                "    int foo();\n"
1932                "  } // TESTSUITE(B)\n"
1933                "} // namespace A",
1934                Style);
1935 
1936   Style.NamespaceIndentation = FormatStyle::NI_Inner;
1937   verifyFormat("TESTSUITE(A) {\n"
1938                "TESTSUITE(B) {\n"
1939                "  int foo();\n"
1940                "} // TESTSUITE(B)\n"
1941                "} // TESTSUITE(A)",
1942                Style);
1943   verifyFormat("TESTSUITE(A) {\n"
1944                "namespace B {\n"
1945                "  int foo();\n"
1946                "} // namespace B\n"
1947                "} // TESTSUITE(A)",
1948                Style);
1949   verifyFormat("namespace A {\n"
1950                "TESTSUITE(B) {\n"
1951                "  int foo();\n"
1952                "} // TESTSUITE(B)\n"
1953                "} // namespace A",
1954                Style);
1955 
1956   // Properly merge namespace-macros blocks in CompactNamespaces mode
1957   Style.NamespaceIndentation = FormatStyle::NI_None;
1958   Style.CompactNamespaces = true;
1959   verifyFormat("TESTSUITE(A) { TESTSUITE(B) {\n"
1960                "}} // TESTSUITE(A::B)",
1961                Style);
1962 
1963   EXPECT_EQ("TESTSUITE(out) { TESTSUITE(in) {\n"
1964             "}} // TESTSUITE(out::in)",
1965             format("TESTSUITE(out) {\n"
1966                    "TESTSUITE(in) {\n"
1967                    "} // TESTSUITE(in)\n"
1968                    "} // TESTSUITE(out)",
1969                    Style));
1970 
1971   EXPECT_EQ("TESTSUITE(out) { TESTSUITE(in) {\n"
1972             "}} // TESTSUITE(out::in)",
1973             format("TESTSUITE(out) {\n"
1974                    "TESTSUITE(in) {\n"
1975                    "} // TESTSUITE(in)\n"
1976                    "} // TESTSUITE(out)",
1977                    Style));
1978 
1979   // Do not merge different namespaces/macros
1980   EXPECT_EQ("namespace out {\n"
1981             "TESTSUITE(in) {\n"
1982             "} // TESTSUITE(in)\n"
1983             "} // namespace out",
1984             format("namespace out {\n"
1985                    "TESTSUITE(in) {\n"
1986                    "} // TESTSUITE(in)\n"
1987                    "} // namespace out",
1988                    Style));
1989   EXPECT_EQ("TESTSUITE(out) {\n"
1990             "namespace in {\n"
1991             "} // namespace in\n"
1992             "} // TESTSUITE(out)",
1993             format("TESTSUITE(out) {\n"
1994                    "namespace in {\n"
1995                    "} // namespace in\n"
1996                    "} // TESTSUITE(out)",
1997                    Style));
1998   Style.NamespaceMacros.push_back("FOOBAR");
1999   EXPECT_EQ("TESTSUITE(out) {\n"
2000             "FOOBAR(in) {\n"
2001             "} // FOOBAR(in)\n"
2002             "} // TESTSUITE(out)",
2003             format("TESTSUITE(out) {\n"
2004                    "FOOBAR(in) {\n"
2005                    "} // FOOBAR(in)\n"
2006                    "} // TESTSUITE(out)",
2007                    Style));
2008 }
2009 
2010 TEST_F(FormatTest, FormatsCompactNamespaces) {
2011   FormatStyle Style = getLLVMStyle();
2012   Style.CompactNamespaces = true;
2013   Style.NamespaceMacros.push_back("TESTSUITE");
2014 
2015   verifyFormat("namespace A { namespace B {\n"
2016 			   "}} // namespace A::B",
2017 			   Style);
2018 
2019   EXPECT_EQ("namespace out { namespace in {\n"
2020             "}} // namespace out::in",
2021             format("namespace out {\n"
2022                    "namespace in {\n"
2023                    "} // namespace in\n"
2024                    "} // namespace out",
2025                    Style));
2026 
2027   // Only namespaces which have both consecutive opening and end get compacted
2028   EXPECT_EQ("namespace out {\n"
2029             "namespace in1 {\n"
2030             "} // namespace in1\n"
2031             "namespace in2 {\n"
2032             "} // namespace in2\n"
2033             "} // namespace out",
2034             format("namespace out {\n"
2035                    "namespace in1 {\n"
2036                    "} // namespace in1\n"
2037                    "namespace in2 {\n"
2038                    "} // namespace in2\n"
2039                    "} // namespace out",
2040                    Style));
2041 
2042   EXPECT_EQ("namespace out {\n"
2043             "int i;\n"
2044             "namespace in {\n"
2045             "int j;\n"
2046             "} // namespace in\n"
2047             "int k;\n"
2048             "} // namespace out",
2049             format("namespace out { int i;\n"
2050                    "namespace in { int j; } // namespace in\n"
2051                    "int k; } // namespace out",
2052                    Style));
2053 
2054   EXPECT_EQ("namespace A { namespace B { namespace C {\n"
2055             "}}} // namespace A::B::C\n",
2056             format("namespace A { namespace B {\n"
2057                    "namespace C {\n"
2058                    "}} // namespace B::C\n"
2059                    "} // namespace A\n",
2060                    Style));
2061 
2062   Style.ColumnLimit = 40;
2063   EXPECT_EQ("namespace aaaaaaaaaa {\n"
2064             "namespace bbbbbbbbbb {\n"
2065             "}} // namespace aaaaaaaaaa::bbbbbbbbbb",
2066             format("namespace aaaaaaaaaa {\n"
2067                    "namespace bbbbbbbbbb {\n"
2068                    "} // namespace bbbbbbbbbb\n"
2069                    "} // namespace aaaaaaaaaa",
2070                    Style));
2071 
2072   EXPECT_EQ("namespace aaaaaa { namespace bbbbbb {\n"
2073             "namespace cccccc {\n"
2074             "}}} // namespace aaaaaa::bbbbbb::cccccc",
2075             format("namespace aaaaaa {\n"
2076                    "namespace bbbbbb {\n"
2077                    "namespace cccccc {\n"
2078                    "} // namespace cccccc\n"
2079                    "} // namespace bbbbbb\n"
2080                    "} // namespace aaaaaa",
2081                    Style));
2082   Style.ColumnLimit = 80;
2083 
2084   // Extra semicolon after 'inner' closing brace prevents merging
2085   EXPECT_EQ("namespace out { namespace in {\n"
2086             "}; } // namespace out::in",
2087             format("namespace out {\n"
2088                    "namespace in {\n"
2089                    "}; // namespace in\n"
2090                    "} // namespace out",
2091                    Style));
2092 
2093   // Extra semicolon after 'outer' closing brace is conserved
2094   EXPECT_EQ("namespace out { namespace in {\n"
2095             "}}; // namespace out::in",
2096             format("namespace out {\n"
2097                    "namespace in {\n"
2098                    "} // namespace in\n"
2099                    "}; // namespace out",
2100                    Style));
2101 
2102   Style.NamespaceIndentation = FormatStyle::NI_All;
2103   EXPECT_EQ("namespace out { namespace in {\n"
2104             "  int i;\n"
2105             "}} // namespace out::in",
2106             format("namespace out {\n"
2107                    "namespace in {\n"
2108                    "int i;\n"
2109                    "} // namespace in\n"
2110                    "} // namespace out",
2111                    Style));
2112   EXPECT_EQ("namespace out { namespace mid {\n"
2113             "  namespace in {\n"
2114             "    int j;\n"
2115             "  } // namespace in\n"
2116             "  int k;\n"
2117             "}} // namespace out::mid",
2118             format("namespace out { namespace mid {\n"
2119                    "namespace in { int j; } // namespace in\n"
2120                    "int k; }} // namespace out::mid",
2121                    Style));
2122 
2123   Style.NamespaceIndentation = FormatStyle::NI_Inner;
2124   EXPECT_EQ("namespace out { namespace in {\n"
2125             "  int i;\n"
2126             "}} // namespace out::in",
2127             format("namespace out {\n"
2128                    "namespace in {\n"
2129                    "int i;\n"
2130                    "} // namespace in\n"
2131                    "} // namespace out",
2132                    Style));
2133   EXPECT_EQ("namespace out { namespace mid { namespace in {\n"
2134             "  int i;\n"
2135             "}}} // namespace out::mid::in",
2136             format("namespace out {\n"
2137                    "namespace mid {\n"
2138                    "namespace in {\n"
2139                    "int i;\n"
2140                    "} // namespace in\n"
2141                    "} // namespace mid\n"
2142                    "} // namespace out",
2143                    Style));
2144 }
2145 
2146 TEST_F(FormatTest, FormatsExternC) {
2147   verifyFormat("extern \"C\" {\nint a;");
2148   verifyFormat("extern \"C\" {}");
2149   verifyFormat("extern \"C\" {\n"
2150                "int foo();\n"
2151                "}");
2152   verifyFormat("extern \"C\" int foo() {}");
2153   verifyFormat("extern \"C\" int foo();");
2154   verifyFormat("extern \"C\" int foo() {\n"
2155                "  int i = 42;\n"
2156                "  return i;\n"
2157                "}");
2158 
2159   FormatStyle Style = getLLVMStyle();
2160   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
2161   Style.BraceWrapping.AfterFunction = true;
2162   verifyFormat("extern \"C\" int foo() {}", Style);
2163   verifyFormat("extern \"C\" int foo();", Style);
2164   verifyFormat("extern \"C\" int foo()\n"
2165                "{\n"
2166                "  int i = 42;\n"
2167                "  return i;\n"
2168                "}",
2169                Style);
2170 
2171   Style.BraceWrapping.AfterExternBlock = true;
2172   Style.BraceWrapping.SplitEmptyRecord = false;
2173   verifyFormat("extern \"C\"\n"
2174                "{}",
2175                Style);
2176   verifyFormat("extern \"C\"\n"
2177                "{\n"
2178                "  int foo();\n"
2179                "}",
2180                Style);
2181 }
2182 
2183 TEST_F(FormatTest, FormatsInlineASM) {
2184   verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));");
2185   verifyFormat("asm(\"nop\" ::: \"memory\");");
2186   verifyFormat(
2187       "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n"
2188       "    \"cpuid\\n\\t\"\n"
2189       "    \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n"
2190       "    : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n"
2191       "    : \"a\"(value));");
2192   EXPECT_EQ(
2193       "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
2194       "  __asm {\n"
2195       "        mov     edx,[that] // vtable in edx\n"
2196       "        mov     eax,methodIndex\n"
2197       "        call    [edx][eax*4] // stdcall\n"
2198       "  }\n"
2199       "}",
2200       format("void NS_InvokeByIndex(void *that,   unsigned int methodIndex) {\n"
2201              "    __asm {\n"
2202              "        mov     edx,[that] // vtable in edx\n"
2203              "        mov     eax,methodIndex\n"
2204              "        call    [edx][eax*4] // stdcall\n"
2205              "    }\n"
2206              "}"));
2207   EXPECT_EQ("_asm {\n"
2208             "  xor eax, eax;\n"
2209             "  cpuid;\n"
2210             "}",
2211             format("_asm {\n"
2212                    "  xor eax, eax;\n"
2213                    "  cpuid;\n"
2214                    "}"));
2215   verifyFormat("void function() {\n"
2216                "  // comment\n"
2217                "  asm(\"\");\n"
2218                "}");
2219   EXPECT_EQ("__asm {\n"
2220             "}\n"
2221             "int i;",
2222             format("__asm   {\n"
2223                    "}\n"
2224                    "int   i;"));
2225 }
2226 
2227 TEST_F(FormatTest, FormatTryCatch) {
2228   verifyFormat("try {\n"
2229                "  throw a * b;\n"
2230                "} catch (int a) {\n"
2231                "  // Do nothing.\n"
2232                "} catch (...) {\n"
2233                "  exit(42);\n"
2234                "}");
2235 
2236   // Function-level try statements.
2237   verifyFormat("int f() try { return 4; } catch (...) {\n"
2238                "  return 5;\n"
2239                "}");
2240   verifyFormat("class A {\n"
2241                "  int a;\n"
2242                "  A() try : a(0) {\n"
2243                "  } catch (...) {\n"
2244                "    throw;\n"
2245                "  }\n"
2246                "};\n");
2247 
2248   // Incomplete try-catch blocks.
2249   verifyIncompleteFormat("try {} catch (");
2250 }
2251 
2252 TEST_F(FormatTest, FormatSEHTryCatch) {
2253   verifyFormat("__try {\n"
2254                "  int a = b * c;\n"
2255                "} __except (EXCEPTION_EXECUTE_HANDLER) {\n"
2256                "  // Do nothing.\n"
2257                "}");
2258 
2259   verifyFormat("__try {\n"
2260                "  int a = b * c;\n"
2261                "} __finally {\n"
2262                "  // Do nothing.\n"
2263                "}");
2264 
2265   verifyFormat("DEBUG({\n"
2266                "  __try {\n"
2267                "  } __finally {\n"
2268                "  }\n"
2269                "});\n");
2270 }
2271 
2272 TEST_F(FormatTest, IncompleteTryCatchBlocks) {
2273   verifyFormat("try {\n"
2274                "  f();\n"
2275                "} catch {\n"
2276                "  g();\n"
2277                "}");
2278   verifyFormat("try {\n"
2279                "  f();\n"
2280                "} catch (A a) MACRO(x) {\n"
2281                "  g();\n"
2282                "} catch (B b) MACRO(x) {\n"
2283                "  g();\n"
2284                "}");
2285 }
2286 
2287 TEST_F(FormatTest, FormatTryCatchBraceStyles) {
2288   FormatStyle Style = getLLVMStyle();
2289   for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla,
2290                           FormatStyle::BS_WebKit}) {
2291     Style.BreakBeforeBraces = BraceStyle;
2292     verifyFormat("try {\n"
2293                  "  // something\n"
2294                  "} catch (...) {\n"
2295                  "  // something\n"
2296                  "}",
2297                  Style);
2298   }
2299   Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
2300   verifyFormat("try {\n"
2301                "  // something\n"
2302                "}\n"
2303                "catch (...) {\n"
2304                "  // something\n"
2305                "}",
2306                Style);
2307   verifyFormat("__try {\n"
2308                "  // something\n"
2309                "}\n"
2310                "__finally {\n"
2311                "  // something\n"
2312                "}",
2313                Style);
2314   verifyFormat("@try {\n"
2315                "  // something\n"
2316                "}\n"
2317                "@finally {\n"
2318                "  // something\n"
2319                "}",
2320                Style);
2321   Style.BreakBeforeBraces = FormatStyle::BS_Allman;
2322   verifyFormat("try\n"
2323                "{\n"
2324                "  // something\n"
2325                "}\n"
2326                "catch (...)\n"
2327                "{\n"
2328                "  // something\n"
2329                "}",
2330                Style);
2331   Style.BreakBeforeBraces = FormatStyle::BS_GNU;
2332   verifyFormat("try\n"
2333                "  {\n"
2334                "    // something\n"
2335                "  }\n"
2336                "catch (...)\n"
2337                "  {\n"
2338                "    // something\n"
2339                "  }",
2340                Style);
2341   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
2342   Style.BraceWrapping.BeforeCatch = true;
2343   verifyFormat("try {\n"
2344                "  // something\n"
2345                "}\n"
2346                "catch (...) {\n"
2347                "  // something\n"
2348                "}",
2349                Style);
2350 }
2351 
2352 TEST_F(FormatTest, StaticInitializers) {
2353   verifyFormat("static SomeClass SC = {1, 'a'};");
2354 
2355   verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n"
2356                "    100000000, "
2357                "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};");
2358 
2359   // Here, everything other than the "}" would fit on a line.
2360   verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n"
2361                "    10000000000000000000000000};");
2362   EXPECT_EQ("S s = {a,\n"
2363             "\n"
2364             "       b};",
2365             format("S s = {\n"
2366                    "  a,\n"
2367                    "\n"
2368                    "  b\n"
2369                    "};"));
2370 
2371   // FIXME: This would fit into the column limit if we'd fit "{ {" on the first
2372   // line. However, the formatting looks a bit off and this probably doesn't
2373   // happen often in practice.
2374   verifyFormat("static int Variable[1] = {\n"
2375                "    {1000000000000000000000000000000000000}};",
2376                getLLVMStyleWithColumns(40));
2377 }
2378 
2379 TEST_F(FormatTest, DesignatedInitializers) {
2380   verifyFormat("const struct A a = {.a = 1, .b = 2};");
2381   verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n"
2382                "                    .bbbbbbbbbb = 2,\n"
2383                "                    .cccccccccc = 3,\n"
2384                "                    .dddddddddd = 4,\n"
2385                "                    .eeeeeeeeee = 5};");
2386   verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
2387                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n"
2388                "    .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n"
2389                "    .ccccccccccccccccccccccccccc = 3,\n"
2390                "    .ddddddddddddddddddddddddddd = 4,\n"
2391                "    .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};");
2392 
2393   verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};");
2394 
2395   verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
2396   verifyFormat("const struct A a = {[1] = aaaaaaaaaa,\n"
2397                "                    [2] = bbbbbbbbbb,\n"
2398                "                    [3] = cccccccccc,\n"
2399                "                    [4] = dddddddddd,\n"
2400                "                    [5] = eeeeeeeeee};");
2401   verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
2402                "    [1] = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2403                "    [2] = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
2404                "    [3] = cccccccccccccccccccccccccccccccccccccc,\n"
2405                "    [4] = dddddddddddddddddddddddddddddddddddddd,\n"
2406                "    [5] = eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee};");
2407 }
2408 
2409 TEST_F(FormatTest, NestedStaticInitializers) {
2410   verifyFormat("static A x = {{{}}};\n");
2411   verifyFormat("static A x = {{{init1, init2, init3, init4},\n"
2412                "               {init1, init2, init3, init4}}};",
2413                getLLVMStyleWithColumns(50));
2414 
2415   verifyFormat("somes Status::global_reps[3] = {\n"
2416                "    {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
2417                "    {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
2418                "    {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};",
2419                getLLVMStyleWithColumns(60));
2420   verifyGoogleFormat("SomeType Status::global_reps[3] = {\n"
2421                      "    {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
2422                      "    {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
2423                      "    {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};");
2424   verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n"
2425                "                  {rect.fRight - rect.fLeft, rect.fBottom - "
2426                "rect.fTop}};");
2427 
2428   verifyFormat(
2429       "SomeArrayOfSomeType a = {\n"
2430       "    {{1, 2, 3},\n"
2431       "     {1, 2, 3},\n"
2432       "     {111111111111111111111111111111, 222222222222222222222222222222,\n"
2433       "      333333333333333333333333333333},\n"
2434       "     {1, 2, 3},\n"
2435       "     {1, 2, 3}}};");
2436   verifyFormat(
2437       "SomeArrayOfSomeType a = {\n"
2438       "    {{1, 2, 3}},\n"
2439       "    {{1, 2, 3}},\n"
2440       "    {{111111111111111111111111111111, 222222222222222222222222222222,\n"
2441       "      333333333333333333333333333333}},\n"
2442       "    {{1, 2, 3}},\n"
2443       "    {{1, 2, 3}}};");
2444 
2445   verifyFormat("struct {\n"
2446                "  unsigned bit;\n"
2447                "  const char *const name;\n"
2448                "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n"
2449                "                 {kOsWin, \"Windows\"},\n"
2450                "                 {kOsLinux, \"Linux\"},\n"
2451                "                 {kOsCrOS, \"Chrome OS\"}};");
2452   verifyFormat("struct {\n"
2453                "  unsigned bit;\n"
2454                "  const char *const name;\n"
2455                "} kBitsToOs[] = {\n"
2456                "    {kOsMac, \"Mac\"},\n"
2457                "    {kOsWin, \"Windows\"},\n"
2458                "    {kOsLinux, \"Linux\"},\n"
2459                "    {kOsCrOS, \"Chrome OS\"},\n"
2460                "};");
2461 }
2462 
2463 TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) {
2464   verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro("
2465                "                      \\\n"
2466                "    aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)");
2467 }
2468 
2469 TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) {
2470   verifyFormat("virtual void write(ELFWriter *writerrr,\n"
2471                "                   OwningPtr<FileOutputBuffer> &buffer) = 0;");
2472 
2473   // Do break defaulted and deleted functions.
2474   verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
2475                "    default;",
2476                getLLVMStyleWithColumns(40));
2477   verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
2478                "    delete;",
2479                getLLVMStyleWithColumns(40));
2480 }
2481 
2482 TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) {
2483   verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3",
2484                getLLVMStyleWithColumns(40));
2485   verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
2486                getLLVMStyleWithColumns(40));
2487   EXPECT_EQ("#define Q                              \\\n"
2488             "  \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\"    \\\n"
2489             "  \"aaaaaaaa.cpp\"",
2490             format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
2491                    getLLVMStyleWithColumns(40)));
2492 }
2493 
2494 TEST_F(FormatTest, UnderstandsLinePPDirective) {
2495   EXPECT_EQ("# 123 \"A string literal\"",
2496             format("   #     123    \"A string literal\""));
2497 }
2498 
2499 TEST_F(FormatTest, LayoutUnknownPPDirective) {
2500   EXPECT_EQ("#;", format("#;"));
2501   verifyFormat("#\n;\n;\n;");
2502 }
2503 
2504 TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) {
2505   EXPECT_EQ("#line 42 \"test\"\n",
2506             format("#  \\\n  line  \\\n  42  \\\n  \"test\"\n"));
2507   EXPECT_EQ("#define A B\n", format("#  \\\n define  \\\n    A  \\\n       B\n",
2508                                     getLLVMStyleWithColumns(12)));
2509 }
2510 
2511 TEST_F(FormatTest, EndOfFileEndsPPDirective) {
2512   EXPECT_EQ("#line 42 \"test\"",
2513             format("#  \\\n  line  \\\n  42  \\\n  \"test\""));
2514   EXPECT_EQ("#define A B", format("#  \\\n define  \\\n    A  \\\n       B"));
2515 }
2516 
2517 TEST_F(FormatTest, DoesntRemoveUnknownTokens) {
2518   verifyFormat("#define A \\x20");
2519   verifyFormat("#define A \\ x20");
2520   EXPECT_EQ("#define A \\ x20", format("#define A \\   x20"));
2521   verifyFormat("#define A ''");
2522   verifyFormat("#define A ''qqq");
2523   verifyFormat("#define A `qqq");
2524   verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");");
2525   EXPECT_EQ("const char *c = STRINGIFY(\n"
2526             "\\na : b);",
2527             format("const char * c = STRINGIFY(\n"
2528                    "\\na : b);"));
2529 
2530   verifyFormat("a\r\\");
2531   verifyFormat("a\v\\");
2532   verifyFormat("a\f\\");
2533 }
2534 
2535 TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) {
2536   verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13));
2537   verifyFormat("#define A( \\\n    BB)", getLLVMStyleWithColumns(12));
2538   verifyFormat("#define A( \\\n    A, B)", getLLVMStyleWithColumns(12));
2539   // FIXME: We never break before the macro name.
2540   verifyFormat("#define AA( \\\n    B)", getLLVMStyleWithColumns(12));
2541 
2542   verifyFormat("#define A A\n#define A A");
2543   verifyFormat("#define A(X) A\n#define A A");
2544 
2545   verifyFormat("#define Something Other", getLLVMStyleWithColumns(23));
2546   verifyFormat("#define Something    \\\n  Other", getLLVMStyleWithColumns(22));
2547 }
2548 
2549 TEST_F(FormatTest, HandlePreprocessorDirectiveContext) {
2550   EXPECT_EQ("// somecomment\n"
2551             "#include \"a.h\"\n"
2552             "#define A(  \\\n"
2553             "    A, B)\n"
2554             "#include \"b.h\"\n"
2555             "// somecomment\n",
2556             format("  // somecomment\n"
2557                    "  #include \"a.h\"\n"
2558                    "#define A(A,\\\n"
2559                    "    B)\n"
2560                    "    #include \"b.h\"\n"
2561                    " // somecomment\n",
2562                    getLLVMStyleWithColumns(13)));
2563 }
2564 
2565 TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); }
2566 
2567 TEST_F(FormatTest, LayoutCodeInMacroDefinitions) {
2568   EXPECT_EQ("#define A    \\\n"
2569             "  c;         \\\n"
2570             "  e;\n"
2571             "f;",
2572             format("#define A c; e;\n"
2573                    "f;",
2574                    getLLVMStyleWithColumns(14)));
2575 }
2576 
2577 TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); }
2578 
2579 TEST_F(FormatTest, MacroDefinitionInsideStatement) {
2580   EXPECT_EQ("int x,\n"
2581             "#define A\n"
2582             "    y;",
2583             format("int x,\n#define A\ny;"));
2584 }
2585 
2586 TEST_F(FormatTest, HashInMacroDefinition) {
2587   EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle()));
2588   verifyFormat("#define A \\\n  b #c;", getLLVMStyleWithColumns(11));
2589   verifyFormat("#define A  \\\n"
2590                "  {        \\\n"
2591                "    f(#c); \\\n"
2592                "  }",
2593                getLLVMStyleWithColumns(11));
2594 
2595   verifyFormat("#define A(X)         \\\n"
2596                "  void function##X()",
2597                getLLVMStyleWithColumns(22));
2598 
2599   verifyFormat("#define A(a, b, c)   \\\n"
2600                "  void a##b##c()",
2601                getLLVMStyleWithColumns(22));
2602 
2603   verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22));
2604 }
2605 
2606 TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) {
2607   EXPECT_EQ("#define A (x)", format("#define A (x)"));
2608   EXPECT_EQ("#define A(x)", format("#define A(x)"));
2609 
2610   FormatStyle Style = getLLVMStyle();
2611   Style.SpaceBeforeParens = FormatStyle::SBPO_Never;
2612   verifyFormat("#define true ((foo)1)", Style);
2613   Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
2614   verifyFormat("#define false((foo)0)", Style);
2615 }
2616 
2617 TEST_F(FormatTest, EmptyLinesInMacroDefinitions) {
2618   EXPECT_EQ("#define A b;", format("#define A \\\n"
2619                                    "          \\\n"
2620                                    "  b;",
2621                                    getLLVMStyleWithColumns(25)));
2622   EXPECT_EQ("#define A \\\n"
2623             "          \\\n"
2624             "  a;      \\\n"
2625             "  b;",
2626             format("#define A \\\n"
2627                    "          \\\n"
2628                    "  a;      \\\n"
2629                    "  b;",
2630                    getLLVMStyleWithColumns(11)));
2631   EXPECT_EQ("#define A \\\n"
2632             "  a;      \\\n"
2633             "          \\\n"
2634             "  b;",
2635             format("#define A \\\n"
2636                    "  a;      \\\n"
2637                    "          \\\n"
2638                    "  b;",
2639                    getLLVMStyleWithColumns(11)));
2640 }
2641 
2642 TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) {
2643   verifyIncompleteFormat("#define A :");
2644   verifyFormat("#define SOMECASES  \\\n"
2645                "  case 1:          \\\n"
2646                "  case 2\n",
2647                getLLVMStyleWithColumns(20));
2648   verifyFormat("#define MACRO(a) \\\n"
2649                "  if (a)         \\\n"
2650                "    f();         \\\n"
2651                "  else           \\\n"
2652                "    g()",
2653                getLLVMStyleWithColumns(18));
2654   verifyFormat("#define A template <typename T>");
2655   verifyIncompleteFormat("#define STR(x) #x\n"
2656                          "f(STR(this_is_a_string_literal{));");
2657   verifyFormat("#pragma omp threadprivate( \\\n"
2658                "    y)), // expected-warning",
2659                getLLVMStyleWithColumns(28));
2660   verifyFormat("#d, = };");
2661   verifyFormat("#if \"a");
2662   verifyIncompleteFormat("({\n"
2663                          "#define b     \\\n"
2664                          "  }           \\\n"
2665                          "  a\n"
2666                          "a",
2667                          getLLVMStyleWithColumns(15));
2668   verifyFormat("#define A     \\\n"
2669                "  {           \\\n"
2670                "    {\n"
2671                "#define B     \\\n"
2672                "  }           \\\n"
2673                "  }",
2674                getLLVMStyleWithColumns(15));
2675   verifyNoCrash("#if a\na(\n#else\n#endif\n{a");
2676   verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}");
2677   verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};");
2678   verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() {      \n)}");
2679 }
2680 
2681 TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) {
2682   verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline.
2683   EXPECT_EQ("class A : public QObject {\n"
2684             "  Q_OBJECT\n"
2685             "\n"
2686             "  A() {}\n"
2687             "};",
2688             format("class A  :  public QObject {\n"
2689                    "     Q_OBJECT\n"
2690                    "\n"
2691                    "  A() {\n}\n"
2692                    "}  ;"));
2693   EXPECT_EQ("MACRO\n"
2694             "/*static*/ int i;",
2695             format("MACRO\n"
2696                    " /*static*/ int   i;"));
2697   EXPECT_EQ("SOME_MACRO\n"
2698             "namespace {\n"
2699             "void f();\n"
2700             "} // namespace",
2701             format("SOME_MACRO\n"
2702                    "  namespace    {\n"
2703                    "void   f(  );\n"
2704                    "} // namespace"));
2705   // Only if the identifier contains at least 5 characters.
2706   EXPECT_EQ("HTTP f();", format("HTTP\nf();"));
2707   EXPECT_EQ("MACRO\nf();", format("MACRO\nf();"));
2708   // Only if everything is upper case.
2709   EXPECT_EQ("class A : public QObject {\n"
2710             "  Q_Object A() {}\n"
2711             "};",
2712             format("class A  :  public QObject {\n"
2713                    "     Q_Object\n"
2714                    "  A() {\n}\n"
2715                    "}  ;"));
2716 
2717   // Only if the next line can actually start an unwrapped line.
2718   EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;",
2719             format("SOME_WEIRD_LOG_MACRO\n"
2720                    "<< SomeThing;"));
2721 
2722   verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), "
2723                "(n, buffers))\n",
2724                getChromiumStyle(FormatStyle::LK_Cpp));
2725 
2726   // See PR41483
2727   EXPECT_EQ("/**/ FOO(a)\n"
2728             "FOO(b)",
2729             format("/**/ FOO(a)\n"
2730                    "FOO(b)"));
2731 }
2732 
2733 TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) {
2734   EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
2735             "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
2736             "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
2737             "class X {};\n"
2738             "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
2739             "int *createScopDetectionPass() { return 0; }",
2740             format("  INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
2741                    "  INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
2742                    "  INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
2743                    "  class X {};\n"
2744                    "  INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
2745                    "  int *createScopDetectionPass() { return 0; }"));
2746   // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as
2747   // braces, so that inner block is indented one level more.
2748   EXPECT_EQ("int q() {\n"
2749             "  IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2750             "  IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2751             "  IPC_END_MESSAGE_MAP()\n"
2752             "}",
2753             format("int q() {\n"
2754                    "  IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2755                    "    IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2756                    "  IPC_END_MESSAGE_MAP()\n"
2757                    "}"));
2758 
2759   // Same inside macros.
2760   EXPECT_EQ("#define LIST(L) \\\n"
2761             "  L(A)          \\\n"
2762             "  L(B)          \\\n"
2763             "  L(C)",
2764             format("#define LIST(L) \\\n"
2765                    "  L(A) \\\n"
2766                    "  L(B) \\\n"
2767                    "  L(C)",
2768                    getGoogleStyle()));
2769 
2770   // These must not be recognized as macros.
2771   EXPECT_EQ("int q() {\n"
2772             "  f(x);\n"
2773             "  f(x) {}\n"
2774             "  f(x)->g();\n"
2775             "  f(x)->*g();\n"
2776             "  f(x).g();\n"
2777             "  f(x) = x;\n"
2778             "  f(x) += x;\n"
2779             "  f(x) -= x;\n"
2780             "  f(x) *= x;\n"
2781             "  f(x) /= x;\n"
2782             "  f(x) %= x;\n"
2783             "  f(x) &= x;\n"
2784             "  f(x) |= x;\n"
2785             "  f(x) ^= x;\n"
2786             "  f(x) >>= x;\n"
2787             "  f(x) <<= x;\n"
2788             "  f(x)[y].z();\n"
2789             "  LOG(INFO) << x;\n"
2790             "  ifstream(x) >> x;\n"
2791             "}\n",
2792             format("int q() {\n"
2793                    "  f(x)\n;\n"
2794                    "  f(x)\n {}\n"
2795                    "  f(x)\n->g();\n"
2796                    "  f(x)\n->*g();\n"
2797                    "  f(x)\n.g();\n"
2798                    "  f(x)\n = x;\n"
2799                    "  f(x)\n += x;\n"
2800                    "  f(x)\n -= x;\n"
2801                    "  f(x)\n *= x;\n"
2802                    "  f(x)\n /= x;\n"
2803                    "  f(x)\n %= x;\n"
2804                    "  f(x)\n &= x;\n"
2805                    "  f(x)\n |= x;\n"
2806                    "  f(x)\n ^= x;\n"
2807                    "  f(x)\n >>= x;\n"
2808                    "  f(x)\n <<= x;\n"
2809                    "  f(x)\n[y].z();\n"
2810                    "  LOG(INFO)\n << x;\n"
2811                    "  ifstream(x)\n >> x;\n"
2812                    "}\n"));
2813   EXPECT_EQ("int q() {\n"
2814             "  F(x)\n"
2815             "  if (1) {\n"
2816             "  }\n"
2817             "  F(x)\n"
2818             "  while (1) {\n"
2819             "  }\n"
2820             "  F(x)\n"
2821             "  G(x);\n"
2822             "  F(x)\n"
2823             "  try {\n"
2824             "    Q();\n"
2825             "  } catch (...) {\n"
2826             "  }\n"
2827             "}\n",
2828             format("int q() {\n"
2829                    "F(x)\n"
2830                    "if (1) {}\n"
2831                    "F(x)\n"
2832                    "while (1) {}\n"
2833                    "F(x)\n"
2834                    "G(x);\n"
2835                    "F(x)\n"
2836                    "try { Q(); } catch (...) {}\n"
2837                    "}\n"));
2838   EXPECT_EQ("class A {\n"
2839             "  A() : t(0) {}\n"
2840             "  A(int i) noexcept() : {}\n"
2841             "  A(X x)\n" // FIXME: function-level try blocks are broken.
2842             "  try : t(0) {\n"
2843             "  } catch (...) {\n"
2844             "  }\n"
2845             "};",
2846             format("class A {\n"
2847                    "  A()\n : t(0) {}\n"
2848                    "  A(int i)\n noexcept() : {}\n"
2849                    "  A(X x)\n"
2850                    "  try : t(0) {} catch (...) {}\n"
2851                    "};"));
2852   FormatStyle Style = getLLVMStyle();
2853   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
2854   Style.BraceWrapping.AfterControlStatement = true;
2855   Style.BraceWrapping.AfterFunction = true;
2856   EXPECT_EQ("void f()\n"
2857             "try\n"
2858             "{\n"
2859             "}",
2860             format("void f() try {\n"
2861                    "}", Style));
2862   EXPECT_EQ("class SomeClass {\n"
2863             "public:\n"
2864             "  SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2865             "};",
2866             format("class SomeClass {\n"
2867                    "public:\n"
2868                    "  SomeClass()\n"
2869                    "  EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2870                    "};"));
2871   EXPECT_EQ("class SomeClass {\n"
2872             "public:\n"
2873             "  SomeClass()\n"
2874             "      EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2875             "};",
2876             format("class SomeClass {\n"
2877                    "public:\n"
2878                    "  SomeClass()\n"
2879                    "  EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2880                    "};",
2881                    getLLVMStyleWithColumns(40)));
2882 
2883   verifyFormat("MACRO(>)");
2884 
2885   // Some macros contain an implicit semicolon.
2886   Style = getLLVMStyle();
2887   Style.StatementMacros.push_back("FOO");
2888   verifyFormat("FOO(a) int b = 0;");
2889   verifyFormat("FOO(a)\n"
2890                "int b = 0;",
2891                Style);
2892   verifyFormat("FOO(a);\n"
2893                "int b = 0;",
2894                Style);
2895   verifyFormat("FOO(argc, argv, \"4.0.2\")\n"
2896                "int b = 0;",
2897                Style);
2898   verifyFormat("FOO()\n"
2899                "int b = 0;",
2900                Style);
2901   verifyFormat("FOO\n"
2902                "int b = 0;",
2903                Style);
2904   verifyFormat("void f() {\n"
2905                "  FOO(a)\n"
2906                "  return a;\n"
2907                "}",
2908                Style);
2909   verifyFormat("FOO(a)\n"
2910                "FOO(b)",
2911                Style);
2912   verifyFormat("int a = 0;\n"
2913                "FOO(b)\n"
2914                "int c = 0;",
2915                Style);
2916   verifyFormat("int a = 0;\n"
2917                "int x = FOO(a)\n"
2918                "int b = 0;",
2919                Style);
2920   verifyFormat("void foo(int a) { FOO(a) }\n"
2921                "uint32_t bar() {}",
2922                Style);
2923 }
2924 
2925 TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) {
2926   verifyFormat("#define A \\\n"
2927                "  f({     \\\n"
2928                "    g();  \\\n"
2929                "  });",
2930                getLLVMStyleWithColumns(11));
2931 }
2932 
2933 TEST_F(FormatTest, IndentPreprocessorDirectives) {
2934   FormatStyle Style = getLLVMStyle();
2935   Style.IndentPPDirectives = FormatStyle::PPDIS_None;
2936   Style.ColumnLimit = 40;
2937   verifyFormat("#ifdef _WIN32\n"
2938                "#define A 0\n"
2939                "#ifdef VAR2\n"
2940                "#define B 1\n"
2941                "#include <someheader.h>\n"
2942                "#define MACRO                          \\\n"
2943                "  some_very_long_func_aaaaaaaaaa();\n"
2944                "#endif\n"
2945                "#else\n"
2946                "#define A 1\n"
2947                "#endif",
2948                Style);
2949   Style.IndentPPDirectives = FormatStyle::PPDIS_AfterHash;
2950   verifyFormat("#ifdef _WIN32\n"
2951                "#  define A 0\n"
2952                "#  ifdef VAR2\n"
2953                "#    define B 1\n"
2954                "#    include <someheader.h>\n"
2955                "#    define MACRO                      \\\n"
2956                "      some_very_long_func_aaaaaaaaaa();\n"
2957                "#  endif\n"
2958                "#else\n"
2959                "#  define A 1\n"
2960                "#endif",
2961                Style);
2962   verifyFormat("#if A\n"
2963                "#  define MACRO                        \\\n"
2964                "    void a(int x) {                    \\\n"
2965                "      b();                             \\\n"
2966                "      c();                             \\\n"
2967                "      d();                             \\\n"
2968                "      e();                             \\\n"
2969                "      f();                             \\\n"
2970                "    }\n"
2971                "#endif",
2972                Style);
2973   // Comments before include guard.
2974   verifyFormat("// file comment\n"
2975                "// file comment\n"
2976                "#ifndef HEADER_H\n"
2977                "#define HEADER_H\n"
2978                "code();\n"
2979                "#endif",
2980                Style);
2981   // Test with include guards.
2982   verifyFormat("#ifndef HEADER_H\n"
2983                "#define HEADER_H\n"
2984                "code();\n"
2985                "#endif",
2986                Style);
2987   // Include guards must have a #define with the same variable immediately
2988   // after #ifndef.
2989   verifyFormat("#ifndef NOT_GUARD\n"
2990                "#  define FOO\n"
2991                "code();\n"
2992                "#endif",
2993                Style);
2994 
2995   // Include guards must cover the entire file.
2996   verifyFormat("code();\n"
2997                "code();\n"
2998                "#ifndef NOT_GUARD\n"
2999                "#  define NOT_GUARD\n"
3000                "code();\n"
3001                "#endif",
3002                Style);
3003   verifyFormat("#ifndef NOT_GUARD\n"
3004                "#  define NOT_GUARD\n"
3005                "code();\n"
3006                "#endif\n"
3007                "code();",
3008                Style);
3009   // Test with trailing blank lines.
3010   verifyFormat("#ifndef HEADER_H\n"
3011                "#define HEADER_H\n"
3012                "code();\n"
3013                "#endif\n",
3014                Style);
3015   // Include guards don't have #else.
3016   verifyFormat("#ifndef NOT_GUARD\n"
3017                "#  define NOT_GUARD\n"
3018                "code();\n"
3019                "#else\n"
3020                "#endif",
3021                Style);
3022   verifyFormat("#ifndef NOT_GUARD\n"
3023                "#  define NOT_GUARD\n"
3024                "code();\n"
3025                "#elif FOO\n"
3026                "#endif",
3027                Style);
3028   // Non-identifier #define after potential include guard.
3029   verifyFormat("#ifndef FOO\n"
3030                "#  define 1\n"
3031                "#endif\n",
3032                Style);
3033   // #if closes past last non-preprocessor line.
3034   verifyFormat("#ifndef FOO\n"
3035                "#define FOO\n"
3036                "#if 1\n"
3037                "int i;\n"
3038                "#  define A 0\n"
3039                "#endif\n"
3040                "#endif\n",
3041                Style);
3042   // FIXME: This doesn't handle the case where there's code between the
3043   // #ifndef and #define but all other conditions hold. This is because when
3044   // the #define line is parsed, UnwrappedLineParser::Lines doesn't hold the
3045   // previous code line yet, so we can't detect it.
3046   EXPECT_EQ("#ifndef NOT_GUARD\n"
3047             "code();\n"
3048             "#define NOT_GUARD\n"
3049             "code();\n"
3050             "#endif",
3051             format("#ifndef NOT_GUARD\n"
3052                    "code();\n"
3053                    "#  define NOT_GUARD\n"
3054                    "code();\n"
3055                    "#endif",
3056                    Style));
3057   // FIXME: This doesn't handle cases where legitimate preprocessor lines may
3058   // be outside an include guard. Examples are #pragma once and
3059   // #pragma GCC diagnostic, or anything else that does not change the meaning
3060   // of the file if it's included multiple times.
3061   EXPECT_EQ("#ifdef WIN32\n"
3062             "#  pragma once\n"
3063             "#endif\n"
3064             "#ifndef HEADER_H\n"
3065             "#  define HEADER_H\n"
3066             "code();\n"
3067             "#endif",
3068             format("#ifdef WIN32\n"
3069                    "#  pragma once\n"
3070                    "#endif\n"
3071                    "#ifndef HEADER_H\n"
3072                    "#define HEADER_H\n"
3073                    "code();\n"
3074                    "#endif",
3075                    Style));
3076   // FIXME: This does not detect when there is a single non-preprocessor line
3077   // in front of an include-guard-like structure where other conditions hold
3078   // because ScopedLineState hides the line.
3079   EXPECT_EQ("code();\n"
3080             "#ifndef HEADER_H\n"
3081             "#define HEADER_H\n"
3082             "code();\n"
3083             "#endif",
3084             format("code();\n"
3085                    "#ifndef HEADER_H\n"
3086                    "#  define HEADER_H\n"
3087                    "code();\n"
3088                    "#endif",
3089                    Style));
3090   // Keep comments aligned with #, otherwise indent comments normally. These
3091   // tests cannot use verifyFormat because messUp manipulates leading
3092   // whitespace.
3093   {
3094     const char *Expected = ""
3095                            "void f() {\n"
3096                            "#if 1\n"
3097                            "// Preprocessor aligned.\n"
3098                            "#  define A 0\n"
3099                            "  // Code. Separated by blank line.\n"
3100                            "\n"
3101                            "#  define B 0\n"
3102                            "  // Code. Not aligned with #\n"
3103                            "#  define C 0\n"
3104                            "#endif";
3105     const char *ToFormat = ""
3106                            "void f() {\n"
3107                            "#if 1\n"
3108                            "// Preprocessor aligned.\n"
3109                            "#  define A 0\n"
3110                            "// Code. Separated by blank line.\n"
3111                            "\n"
3112                            "#  define B 0\n"
3113                            "   // Code. Not aligned with #\n"
3114                            "#  define C 0\n"
3115                            "#endif";
3116     EXPECT_EQ(Expected, format(ToFormat, Style));
3117     EXPECT_EQ(Expected, format(Expected, Style));
3118   }
3119   // Keep block quotes aligned.
3120   {
3121     const char *Expected = ""
3122                            "void f() {\n"
3123                            "#if 1\n"
3124                            "/* Preprocessor aligned. */\n"
3125                            "#  define A 0\n"
3126                            "  /* Code. Separated by blank line. */\n"
3127                            "\n"
3128                            "#  define B 0\n"
3129                            "  /* Code. Not aligned with # */\n"
3130                            "#  define C 0\n"
3131                            "#endif";
3132     const char *ToFormat = ""
3133                            "void f() {\n"
3134                            "#if 1\n"
3135                            "/* Preprocessor aligned. */\n"
3136                            "#  define A 0\n"
3137                            "/* Code. Separated by blank line. */\n"
3138                            "\n"
3139                            "#  define B 0\n"
3140                            "   /* Code. Not aligned with # */\n"
3141                            "#  define C 0\n"
3142                            "#endif";
3143     EXPECT_EQ(Expected, format(ToFormat, Style));
3144     EXPECT_EQ(Expected, format(Expected, Style));
3145   }
3146   // Keep comments aligned with un-indented directives.
3147   {
3148     const char *Expected = ""
3149                            "void f() {\n"
3150                            "// Preprocessor aligned.\n"
3151                            "#define A 0\n"
3152                            "  // Code. Separated by blank line.\n"
3153                            "\n"
3154                            "#define B 0\n"
3155                            "  // Code. Not aligned with #\n"
3156                            "#define C 0\n";
3157     const char *ToFormat = ""
3158                            "void f() {\n"
3159                            "// Preprocessor aligned.\n"
3160                            "#define A 0\n"
3161                            "// Code. Separated by blank line.\n"
3162                            "\n"
3163                            "#define B 0\n"
3164                            "   // Code. Not aligned with #\n"
3165                            "#define C 0\n";
3166     EXPECT_EQ(Expected, format(ToFormat, Style));
3167     EXPECT_EQ(Expected, format(Expected, Style));
3168   }
3169   // Test AfterHash with tabs.
3170   {
3171     FormatStyle Tabbed = Style;
3172     Tabbed.UseTab = FormatStyle::UT_Always;
3173     Tabbed.IndentWidth = 8;
3174     Tabbed.TabWidth = 8;
3175     verifyFormat("#ifdef _WIN32\n"
3176                  "#\tdefine A 0\n"
3177                  "#\tifdef VAR2\n"
3178                  "#\t\tdefine B 1\n"
3179                  "#\t\tinclude <someheader.h>\n"
3180                  "#\t\tdefine MACRO          \\\n"
3181                  "\t\t\tsome_very_long_func_aaaaaaaaaa();\n"
3182                  "#\tendif\n"
3183                  "#else\n"
3184                  "#\tdefine A 1\n"
3185                  "#endif",
3186                  Tabbed);
3187   }
3188 
3189   // Regression test: Multiline-macro inside include guards.
3190   verifyFormat("#ifndef HEADER_H\n"
3191                "#define HEADER_H\n"
3192                "#define A()        \\\n"
3193                "  int i;           \\\n"
3194                "  int j;\n"
3195                "#endif // HEADER_H",
3196                getLLVMStyleWithColumns(20));
3197 
3198   Style.IndentPPDirectives = FormatStyle::PPDIS_BeforeHash;
3199   // Basic before hash indent tests
3200   verifyFormat("#ifdef _WIN32\n"
3201                "  #define A 0\n"
3202                "  #ifdef VAR2\n"
3203                "    #define B 1\n"
3204                "    #include <someheader.h>\n"
3205                "    #define MACRO                      \\\n"
3206                "      some_very_long_func_aaaaaaaaaa();\n"
3207                "  #endif\n"
3208                "#else\n"
3209                "  #define A 1\n"
3210                "#endif",
3211                Style);
3212   verifyFormat("#if A\n"
3213                "  #define MACRO                        \\\n"
3214                "    void a(int x) {                    \\\n"
3215                "      b();                             \\\n"
3216                "      c();                             \\\n"
3217                "      d();                             \\\n"
3218                "      e();                             \\\n"
3219                "      f();                             \\\n"
3220                "    }\n"
3221                "#endif",
3222                Style);
3223   // Keep comments aligned with indented directives. These
3224   // tests cannot use verifyFormat because messUp manipulates leading
3225   // whitespace.
3226   {
3227     const char *Expected = "void f() {\n"
3228                            "// Aligned to preprocessor.\n"
3229                            "#if 1\n"
3230                            "  // Aligned to code.\n"
3231                            "  int a;\n"
3232                            "  #if 1\n"
3233                            "    // Aligned to preprocessor.\n"
3234                            "    #define A 0\n"
3235                            "  // Aligned to code.\n"
3236                            "  int b;\n"
3237                            "  #endif\n"
3238                            "#endif\n"
3239                            "}";
3240     const char *ToFormat = "void f() {\n"
3241                            "// Aligned to preprocessor.\n"
3242                            "#if 1\n"
3243                            "// Aligned to code.\n"
3244                            "int a;\n"
3245                            "#if 1\n"
3246                            "// Aligned to preprocessor.\n"
3247                            "#define A 0\n"
3248                            "// Aligned to code.\n"
3249                            "int b;\n"
3250                            "#endif\n"
3251                            "#endif\n"
3252                            "}";
3253     EXPECT_EQ(Expected, format(ToFormat, Style));
3254     EXPECT_EQ(Expected, format(Expected, Style));
3255   }
3256   {
3257     const char *Expected = "void f() {\n"
3258                            "/* Aligned to preprocessor. */\n"
3259                            "#if 1\n"
3260                            "  /* Aligned to code. */\n"
3261                            "  int a;\n"
3262                            "  #if 1\n"
3263                            "    /* Aligned to preprocessor. */\n"
3264                            "    #define A 0\n"
3265                            "  /* Aligned to code. */\n"
3266                            "  int b;\n"
3267                            "  #endif\n"
3268                            "#endif\n"
3269                            "}";
3270     const char *ToFormat = "void f() {\n"
3271                            "/* Aligned to preprocessor. */\n"
3272                            "#if 1\n"
3273                            "/* Aligned to code. */\n"
3274                            "int a;\n"
3275                            "#if 1\n"
3276                            "/* Aligned to preprocessor. */\n"
3277                            "#define A 0\n"
3278                            "/* Aligned to code. */\n"
3279                            "int b;\n"
3280                            "#endif\n"
3281                            "#endif\n"
3282                            "}";
3283     EXPECT_EQ(Expected, format(ToFormat, Style));
3284     EXPECT_EQ(Expected, format(Expected, Style));
3285   }
3286 
3287   // Test single comment before preprocessor
3288   verifyFormat("// Comment\n"
3289                "\n"
3290                "#if 1\n"
3291                "#endif",
3292                Style);
3293 }
3294 
3295 TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) {
3296   verifyFormat("{\n  { a #c; }\n}");
3297 }
3298 
3299 TEST_F(FormatTest, FormatUnbalancedStructuralElements) {
3300   EXPECT_EQ("#define A \\\n  {       \\\n    {\nint i;",
3301             format("#define A { {\nint i;", getLLVMStyleWithColumns(11)));
3302   EXPECT_EQ("#define A \\\n  }       \\\n  }\nint i;",
3303             format("#define A } }\nint i;", getLLVMStyleWithColumns(11)));
3304 }
3305 
3306 TEST_F(FormatTest, EscapedNewlines) {
3307   FormatStyle Narrow = getLLVMStyleWithColumns(11);
3308   EXPECT_EQ("#define A \\\n  int i;  \\\n  int j;",
3309             format("#define A \\\nint i;\\\n  int j;", Narrow));
3310   EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;"));
3311   EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
3312   EXPECT_EQ("/* \\  \\  \\\n */", format("\\\n/* \\  \\  \\\n */"));
3313   EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>"));
3314 
3315   FormatStyle AlignLeft = getLLVMStyle();
3316   AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
3317   EXPECT_EQ("#define MACRO(x) \\\n"
3318             "private:         \\\n"
3319             "  int x(int a);\n",
3320             format("#define MACRO(x) \\\n"
3321                    "private:         \\\n"
3322                    "  int x(int a);\n",
3323                    AlignLeft));
3324 
3325   // CRLF line endings
3326   EXPECT_EQ("#define A \\\r\n  int i;  \\\r\n  int j;",
3327             format("#define A \\\r\nint i;\\\r\n  int j;", Narrow));
3328   EXPECT_EQ("#define A\r\n\r\nint i;", format("#define A \\\r\n\r\n int i;"));
3329   EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
3330   EXPECT_EQ("/* \\  \\  \\\r\n */", format("\\\r\n/* \\  \\  \\\r\n */"));
3331   EXPECT_EQ("<a\r\n\\\\\r\n>", format("<a\r\n\\\\\r\n>"));
3332   EXPECT_EQ("#define MACRO(x) \\\r\n"
3333             "private:         \\\r\n"
3334             "  int x(int a);\r\n",
3335             format("#define MACRO(x) \\\r\n"
3336                    "private:         \\\r\n"
3337                    "  int x(int a);\r\n",
3338                    AlignLeft));
3339 
3340   FormatStyle DontAlign = getLLVMStyle();
3341   DontAlign.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
3342   DontAlign.MaxEmptyLinesToKeep = 3;
3343   // FIXME: can't use verifyFormat here because the newline before
3344   // "public:" is not inserted the first time it's reformatted
3345   EXPECT_EQ("#define A \\\n"
3346             "  class Foo { \\\n"
3347             "    void bar(); \\\n"
3348             "\\\n"
3349             "\\\n"
3350             "\\\n"
3351             "  public: \\\n"
3352             "    void baz(); \\\n"
3353             "  };",
3354             format("#define A \\\n"
3355                    "  class Foo { \\\n"
3356                    "    void bar(); \\\n"
3357                    "\\\n"
3358                    "\\\n"
3359                    "\\\n"
3360                    "  public: \\\n"
3361                    "    void baz(); \\\n"
3362                    "  };",
3363                    DontAlign));
3364 }
3365 
3366 TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) {
3367   verifyFormat("#define A \\\n"
3368                "  int v(  \\\n"
3369                "      a); \\\n"
3370                "  int i;",
3371                getLLVMStyleWithColumns(11));
3372 }
3373 
3374 TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) {
3375   EXPECT_EQ(
3376       "#define ALooooooooooooooooooooooooooooooooooooooongMacro("
3377       "                      \\\n"
3378       "    aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
3379       "\n"
3380       "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
3381       "    aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n",
3382       format("  #define   ALooooooooooooooooooooooooooooooooooooooongMacro("
3383              "\\\n"
3384              "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
3385              "  \n"
3386              "   AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
3387              "  aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n"));
3388 }
3389 
3390 TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) {
3391   EXPECT_EQ("int\n"
3392             "#define A\n"
3393             "    a;",
3394             format("int\n#define A\na;"));
3395   verifyFormat("functionCallTo(\n"
3396                "    someOtherFunction(\n"
3397                "        withSomeParameters, whichInSequence,\n"
3398                "        areLongerThanALine(andAnotherCall,\n"
3399                "#define A B\n"
3400                "                           withMoreParamters,\n"
3401                "                           whichStronglyInfluenceTheLayout),\n"
3402                "        andMoreParameters),\n"
3403                "    trailing);",
3404                getLLVMStyleWithColumns(69));
3405   verifyFormat("Foo::Foo()\n"
3406                "#ifdef BAR\n"
3407                "    : baz(0)\n"
3408                "#endif\n"
3409                "{\n"
3410                "}");
3411   verifyFormat("void f() {\n"
3412                "  if (true)\n"
3413                "#ifdef A\n"
3414                "    f(42);\n"
3415                "  x();\n"
3416                "#else\n"
3417                "    g();\n"
3418                "  x();\n"
3419                "#endif\n"
3420                "}");
3421   verifyFormat("void f(param1, param2,\n"
3422                "       param3,\n"
3423                "#ifdef A\n"
3424                "       param4(param5,\n"
3425                "#ifdef A1\n"
3426                "              param6,\n"
3427                "#ifdef A2\n"
3428                "              param7),\n"
3429                "#else\n"
3430                "              param8),\n"
3431                "       param9,\n"
3432                "#endif\n"
3433                "       param10,\n"
3434                "#endif\n"
3435                "       param11)\n"
3436                "#else\n"
3437                "       param12)\n"
3438                "#endif\n"
3439                "{\n"
3440                "  x();\n"
3441                "}",
3442                getLLVMStyleWithColumns(28));
3443   verifyFormat("#if 1\n"
3444                "int i;");
3445   verifyFormat("#if 1\n"
3446                "#endif\n"
3447                "#if 1\n"
3448                "#else\n"
3449                "#endif\n");
3450   verifyFormat("DEBUG({\n"
3451                "  return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3452                "         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
3453                "});\n"
3454                "#if a\n"
3455                "#else\n"
3456                "#endif");
3457 
3458   verifyIncompleteFormat("void f(\n"
3459                          "#if A\n"
3460                          ");\n"
3461                          "#else\n"
3462                          "#endif");
3463 }
3464 
3465 TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) {
3466   verifyFormat("#endif\n"
3467                "#if B");
3468 }
3469 
3470 TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) {
3471   FormatStyle SingleLine = getLLVMStyle();
3472   SingleLine.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_WithoutElse;
3473   verifyFormat("#if 0\n"
3474                "#elif 1\n"
3475                "#endif\n"
3476                "void foo() {\n"
3477                "  if (test) foo2();\n"
3478                "}",
3479                SingleLine);
3480 }
3481 
3482 TEST_F(FormatTest, LayoutBlockInsideParens) {
3483   verifyFormat("functionCall({ int i; });");
3484   verifyFormat("functionCall({\n"
3485                "  int i;\n"
3486                "  int j;\n"
3487                "});");
3488   verifyFormat("functionCall(\n"
3489                "    {\n"
3490                "      int i;\n"
3491                "      int j;\n"
3492                "    },\n"
3493                "    aaaa, bbbb, cccc);");
3494   verifyFormat("functionA(functionB({\n"
3495                "            int i;\n"
3496                "            int j;\n"
3497                "          }),\n"
3498                "          aaaa, bbbb, cccc);");
3499   verifyFormat("functionCall(\n"
3500                "    {\n"
3501                "      int i;\n"
3502                "      int j;\n"
3503                "    },\n"
3504                "    aaaa, bbbb, // comment\n"
3505                "    cccc);");
3506   verifyFormat("functionA(functionB({\n"
3507                "            int i;\n"
3508                "            int j;\n"
3509                "          }),\n"
3510                "          aaaa, bbbb, // comment\n"
3511                "          cccc);");
3512   verifyFormat("functionCall(aaaa, bbbb, { int i; });");
3513   verifyFormat("functionCall(aaaa, bbbb, {\n"
3514                "  int i;\n"
3515                "  int j;\n"
3516                "});");
3517   verifyFormat(
3518       "Aaa(\n" // FIXME: There shouldn't be a linebreak here.
3519       "    {\n"
3520       "      int i; // break\n"
3521       "    },\n"
3522       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
3523       "                                     ccccccccccccccccc));");
3524   verifyFormat("DEBUG({\n"
3525                "  if (a)\n"
3526                "    f();\n"
3527                "});");
3528 }
3529 
3530 TEST_F(FormatTest, LayoutBlockInsideStatement) {
3531   EXPECT_EQ("SOME_MACRO { int i; }\n"
3532             "int i;",
3533             format("  SOME_MACRO  {int i;}  int i;"));
3534 }
3535 
3536 TEST_F(FormatTest, LayoutNestedBlocks) {
3537   verifyFormat("void AddOsStrings(unsigned bitmask) {\n"
3538                "  struct s {\n"
3539                "    int i;\n"
3540                "  };\n"
3541                "  s kBitsToOs[] = {{10}};\n"
3542                "  for (int i = 0; i < 10; ++i)\n"
3543                "    return;\n"
3544                "}");
3545   verifyFormat("call(parameter, {\n"
3546                "  something();\n"
3547                "  // Comment using all columns.\n"
3548                "  somethingelse();\n"
3549                "});",
3550                getLLVMStyleWithColumns(40));
3551   verifyFormat("DEBUG( //\n"
3552                "    { f(); }, a);");
3553   verifyFormat("DEBUG( //\n"
3554                "    {\n"
3555                "      f(); //\n"
3556                "    },\n"
3557                "    a);");
3558 
3559   EXPECT_EQ("call(parameter, {\n"
3560             "  something();\n"
3561             "  // Comment too\n"
3562             "  // looooooooooong.\n"
3563             "  somethingElse();\n"
3564             "});",
3565             format("call(parameter, {\n"
3566                    "  something();\n"
3567                    "  // Comment too looooooooooong.\n"
3568                    "  somethingElse();\n"
3569                    "});",
3570                    getLLVMStyleWithColumns(29)));
3571   EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int   i; });"));
3572   EXPECT_EQ("DEBUG({ // comment\n"
3573             "  int i;\n"
3574             "});",
3575             format("DEBUG({ // comment\n"
3576                    "int  i;\n"
3577                    "});"));
3578   EXPECT_EQ("DEBUG({\n"
3579             "  int i;\n"
3580             "\n"
3581             "  // comment\n"
3582             "  int j;\n"
3583             "});",
3584             format("DEBUG({\n"
3585                    "  int  i;\n"
3586                    "\n"
3587                    "  // comment\n"
3588                    "  int  j;\n"
3589                    "});"));
3590 
3591   verifyFormat("DEBUG({\n"
3592                "  if (a)\n"
3593                "    return;\n"
3594                "});");
3595   verifyGoogleFormat("DEBUG({\n"
3596                      "  if (a) return;\n"
3597                      "});");
3598   FormatStyle Style = getGoogleStyle();
3599   Style.ColumnLimit = 45;
3600   verifyFormat("Debug(\n"
3601                "    aaaaa,\n"
3602                "    {\n"
3603                "      if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n"
3604                "    },\n"
3605                "    a);",
3606                Style);
3607 
3608   verifyFormat("SomeFunction({MACRO({ return output; }), b});");
3609 
3610   verifyNoCrash("^{v^{a}}");
3611 }
3612 
3613 TEST_F(FormatTest, FormatNestedBlocksInMacros) {
3614   EXPECT_EQ("#define MACRO()                     \\\n"
3615             "  Debug(aaa, /* force line break */ \\\n"
3616             "        {                           \\\n"
3617             "          int i;                    \\\n"
3618             "          int j;                    \\\n"
3619             "        })",
3620             format("#define   MACRO()   Debug(aaa,  /* force line break */ \\\n"
3621                    "          {  int   i;  int  j;   })",
3622                    getGoogleStyle()));
3623 
3624   EXPECT_EQ("#define A                                       \\\n"
3625             "  [] {                                          \\\n"
3626             "    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx(        \\\n"
3627             "        xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n"
3628             "  }",
3629             format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3630                    "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }",
3631                    getGoogleStyle()));
3632 }
3633 
3634 TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) {
3635   EXPECT_EQ("{}", format("{}"));
3636   verifyFormat("enum E {};");
3637   verifyFormat("enum E {}");
3638 }
3639 
3640 TEST_F(FormatTest, FormatBeginBlockEndMacros) {
3641   FormatStyle Style = getLLVMStyle();
3642   Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$";
3643   Style.MacroBlockEnd = "^[A-Z_]+_END$";
3644   verifyFormat("FOO_BEGIN\n"
3645                "  FOO_ENTRY\n"
3646                "FOO_END", Style);
3647   verifyFormat("FOO_BEGIN\n"
3648                "  NESTED_FOO_BEGIN\n"
3649                "    NESTED_FOO_ENTRY\n"
3650                "  NESTED_FOO_END\n"
3651                "FOO_END", Style);
3652   verifyFormat("FOO_BEGIN(Foo, Bar)\n"
3653                "  int x;\n"
3654                "  x = 1;\n"
3655                "FOO_END(Baz)", Style);
3656 }
3657 
3658 //===----------------------------------------------------------------------===//
3659 // Line break tests.
3660 //===----------------------------------------------------------------------===//
3661 
3662 TEST_F(FormatTest, PreventConfusingIndents) {
3663   verifyFormat(
3664       "void f() {\n"
3665       "  SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
3666       "                         parameter, parameter, parameter)),\n"
3667       "                     SecondLongCall(parameter));\n"
3668       "}");
3669   verifyFormat(
3670       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3671       "    aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3672       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3673       "    aaaaaaaaaaaaaaaaaaaaaaaa);");
3674   verifyFormat(
3675       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3676       "    [aaaaaaaaaaaaaaaaaaaaaaaa\n"
3677       "         [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
3678       "         [aaaaaaaaaaaaaaaaaaaaaaaa]];");
3679   verifyFormat(
3680       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
3681       "    aaaaaaaaaaaaaaaaaaaaaaaa<\n"
3682       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n"
3683       "    aaaaaaaaaaaaaaaaaaaaaaaa>;");
3684   verifyFormat("int a = bbbb && ccc &&\n"
3685                "        fffff(\n"
3686                "#define A Just forcing a new line\n"
3687                "            ddd);");
3688 }
3689 
3690 TEST_F(FormatTest, LineBreakingInBinaryExpressions) {
3691   verifyFormat(
3692       "bool aaaaaaa =\n"
3693       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n"
3694       "    bbbbbbbb();");
3695   verifyFormat(
3696       "bool aaaaaaa =\n"
3697       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n"
3698       "    bbbbbbbb();");
3699 
3700   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3701                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n"
3702                "    ccccccccc == ddddddddddd;");
3703   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3704                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n"
3705                "    ccccccccc == ddddddddddd;");
3706   verifyFormat(
3707       "bool aaaaaaaaaaaaaaaaaaaaa =\n"
3708       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n"
3709       "    ccccccccc == ddddddddddd;");
3710 
3711   verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3712                "                 aaaaaa) &&\n"
3713                "         bbbbbb && cccccc;");
3714   verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3715                "                 aaaaaa) >>\n"
3716                "         bbbbbb;");
3717   verifyFormat("aa = Whitespaces.addUntouchableComment(\n"
3718                "    SourceMgr.getSpellingColumnNumber(\n"
3719                "        TheLine.Last->FormatTok.Tok.getLocation()) -\n"
3720                "    1);");
3721 
3722   verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3723                "     bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n"
3724                "    cccccc) {\n}");
3725   verifyFormat("if constexpr ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3726                "               bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n"
3727                "              cccccc) {\n}");
3728   verifyFormat("b = a &&\n"
3729                "    // Comment\n"
3730                "    b.c && d;");
3731 
3732   // If the LHS of a comparison is not a binary expression itself, the
3733   // additional linebreak confuses many people.
3734   verifyFormat(
3735       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3736       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n"
3737       "}");
3738   verifyFormat(
3739       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3740       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3741       "}");
3742   verifyFormat(
3743       "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n"
3744       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3745       "}");
3746   verifyFormat(
3747       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3748       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) <=> 5) {\n"
3749       "}");
3750   // Even explicit parentheses stress the precedence enough to make the
3751   // additional break unnecessary.
3752   verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3753                "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3754                "}");
3755   // This cases is borderline, but with the indentation it is still readable.
3756   verifyFormat(
3757       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3758       "        aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3759       "                               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
3760       "}",
3761       getLLVMStyleWithColumns(75));
3762 
3763   // If the LHS is a binary expression, we should still use the additional break
3764   // as otherwise the formatting hides the operator precedence.
3765   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3766                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3767                "    5) {\n"
3768                "}");
3769   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3770                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa <=>\n"
3771                "    5) {\n"
3772                "}");
3773 
3774   FormatStyle OnePerLine = getLLVMStyle();
3775   OnePerLine.BinPackParameters = false;
3776   verifyFormat(
3777       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3778       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3779       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}",
3780       OnePerLine);
3781 
3782   verifyFormat("int i = someFunction(aaaaaaa, 0)\n"
3783                "                .aaa(aaaaaaaaaaaaa) *\n"
3784                "            aaaaaaa +\n"
3785                "        aaaaaaa;",
3786                getLLVMStyleWithColumns(40));
3787 }
3788 
3789 TEST_F(FormatTest, ExpressionIndentation) {
3790   verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3791                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3792                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3793                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3794                "                         bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
3795                "                     bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n"
3796                "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3797                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n"
3798                "                 ccccccccccccccccccccccccccccccccccccccccc;");
3799   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3800                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3801                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3802                "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3803   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3804                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3805                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3806                "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3807   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3808                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3809                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3810                "        bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3811   verifyFormat("if () {\n"
3812                "} else if (aaaaa && bbbbb > // break\n"
3813                "                        ccccc) {\n"
3814                "}");
3815   verifyFormat("if () {\n"
3816                "} else if (aaaaa &&\n"
3817                "           bbbbb > // break\n"
3818                "               ccccc &&\n"
3819                "           ddddd) {\n"
3820                "}");
3821 
3822   // Presence of a trailing comment used to change indentation of b.
3823   verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n"
3824                "       b;\n"
3825                "return aaaaaaaaaaaaaaaaaaa +\n"
3826                "       b; //",
3827                getLLVMStyleWithColumns(30));
3828 }
3829 
3830 TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) {
3831   // Not sure what the best system is here. Like this, the LHS can be found
3832   // immediately above an operator (everything with the same or a higher
3833   // indent). The RHS is aligned right of the operator and so compasses
3834   // everything until something with the same indent as the operator is found.
3835   // FIXME: Is this a good system?
3836   FormatStyle Style = getLLVMStyle();
3837   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
3838   verifyFormat(
3839       "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3840       "                     + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3841       "                     + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3842       "                 == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3843       "                            * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3844       "                        + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3845       "             && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3846       "                        * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3847       "                    > ccccccccccccccccccccccccccccccccccccccccc;",
3848       Style);
3849   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3850                "            * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3851                "        + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3852                "    == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3853                Style);
3854   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3855                "        + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3856                "              * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3857                "    == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3858                Style);
3859   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3860                "    == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3861                "               * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3862                "           + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3863                Style);
3864   verifyFormat("if () {\n"
3865                "} else if (aaaaa\n"
3866                "           && bbbbb // break\n"
3867                "                  > ccccc) {\n"
3868                "}",
3869                Style);
3870   verifyFormat("return (a)\n"
3871                "       // comment\n"
3872                "       + b;",
3873                Style);
3874   verifyFormat(
3875       "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3876       "                 * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3877       "             + cc;",
3878       Style);
3879 
3880   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3881                "    = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
3882                Style);
3883 
3884   // Forced by comments.
3885   verifyFormat(
3886       "unsigned ContentSize =\n"
3887       "    sizeof(int16_t)   // DWARF ARange version number\n"
3888       "    + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
3889       "    + sizeof(int8_t)  // Pointer Size (in bytes)\n"
3890       "    + sizeof(int8_t); // Segment Size (in bytes)");
3891 
3892   verifyFormat("return boost::fusion::at_c<0>(iiii).second\n"
3893                "       == boost::fusion::at_c<1>(iiii).second;",
3894                Style);
3895 
3896   Style.ColumnLimit = 60;
3897   verifyFormat("zzzzzzzzzz\n"
3898                "    = bbbbbbbbbbbbbbbbb\n"
3899                "      >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);",
3900                Style);
3901 
3902   Style.ColumnLimit = 80;
3903   Style.IndentWidth = 4;
3904   Style.TabWidth = 4;
3905   Style.UseTab = FormatStyle::UT_Always;
3906   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
3907   Style.AlignOperands = false;
3908   EXPECT_EQ("return someVeryVeryLongConditionThatBarelyFitsOnALine\n"
3909             "\t&& (someOtherLongishConditionPart1\n"
3910             "\t\t|| someOtherEvenLongerNestedConditionPart2);",
3911             format("return someVeryVeryLongConditionThatBarelyFitsOnALine && (someOtherLongishConditionPart1 || someOtherEvenLongerNestedConditionPart2);",
3912                    Style));
3913 }
3914 
3915 TEST_F(FormatTest, EnforcedOperatorWraps) {
3916   // Here we'd like to wrap after the || operators, but a comment is forcing an
3917   // earlier wrap.
3918   verifyFormat("bool x = aaaaa //\n"
3919                "         || bbbbb\n"
3920                "         //\n"
3921                "         || cccc;");
3922 }
3923 
3924 TEST_F(FormatTest, NoOperandAlignment) {
3925   FormatStyle Style = getLLVMStyle();
3926   Style.AlignOperands = false;
3927   verifyFormat("aaaaaaaaaaaaaa(aaaaaaaaaaaa,\n"
3928                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3929                "                   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3930                Style);
3931   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
3932   verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3933                "            + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3934                "            + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3935                "        == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3936                "                * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3937                "            + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3938                "    && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3939                "            * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3940                "        > ccccccccccccccccccccccccccccccccccccccccc;",
3941                Style);
3942 
3943   verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3944                "        * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3945                "    + cc;",
3946                Style);
3947   verifyFormat("int a = aa\n"
3948                "    + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3949                "        * cccccccccccccccccccccccccccccccccccc;\n",
3950                Style);
3951 
3952   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
3953   verifyFormat("return (a > b\n"
3954                "    // comment1\n"
3955                "    // comment2\n"
3956                "    || c);",
3957                Style);
3958 }
3959 
3960 TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) {
3961   FormatStyle Style = getLLVMStyle();
3962   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
3963   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
3964                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3965                "    + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
3966                Style);
3967 }
3968 
3969 TEST_F(FormatTest, AllowBinPackingInsideArguments) {
3970   FormatStyle Style = getLLVMStyle();
3971   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
3972   Style.BinPackArguments = false;
3973   Style.ColumnLimit = 40;
3974   verifyFormat("void test() {\n"
3975                "  someFunction(\n"
3976                "      this + argument + is + quite\n"
3977                "      + long + so + it + gets + wrapped\n"
3978                "      + but + remains + bin - packed);\n"
3979                "}",
3980                Style);
3981   verifyFormat("void test() {\n"
3982                "  someFunction(arg1,\n"
3983                "               this + argument + is\n"
3984                "                   + quite + long + so\n"
3985                "                   + it + gets + wrapped\n"
3986                "                   + but + remains + bin\n"
3987                "                   - packed,\n"
3988                "               arg3);\n"
3989                "}",
3990                Style);
3991   verifyFormat("void test() {\n"
3992                "  someFunction(\n"
3993                "      arg1,\n"
3994                "      this + argument + has\n"
3995                "          + anotherFunc(nested,\n"
3996                "                        calls + whose\n"
3997                "                            + arguments\n"
3998                "                            + are + also\n"
3999                "                            + wrapped,\n"
4000                "                        in + addition)\n"
4001                "          + to + being + bin - packed,\n"
4002                "      arg3);\n"
4003                "}",
4004                Style);
4005 
4006   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
4007   verifyFormat("void test() {\n"
4008                "  someFunction(\n"
4009                "      arg1,\n"
4010                "      this + argument + has +\n"
4011                "          anotherFunc(nested,\n"
4012                "                      calls + whose +\n"
4013                "                          arguments +\n"
4014                "                          are + also +\n"
4015                "                          wrapped,\n"
4016                "                      in + addition) +\n"
4017                "          to + being + bin - packed,\n"
4018                "      arg3);\n"
4019                "}",
4020                Style);
4021 }
4022 
4023 TEST_F(FormatTest, ConstructorInitializers) {
4024   verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
4025   verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}",
4026                getLLVMStyleWithColumns(45));
4027   verifyFormat("Constructor()\n"
4028                "    : Inttializer(FitsOnTheLine) {}",
4029                getLLVMStyleWithColumns(44));
4030   verifyFormat("Constructor()\n"
4031                "    : Inttializer(FitsOnTheLine) {}",
4032                getLLVMStyleWithColumns(43));
4033 
4034   verifyFormat("template <typename T>\n"
4035                "Constructor() : Initializer(FitsOnTheLine) {}",
4036                getLLVMStyleWithColumns(45));
4037 
4038   verifyFormat(
4039       "SomeClass::Constructor()\n"
4040       "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
4041 
4042   verifyFormat(
4043       "SomeClass::Constructor()\n"
4044       "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4045       "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}");
4046   verifyFormat(
4047       "SomeClass::Constructor()\n"
4048       "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4049       "      aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
4050   verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4051                "            aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4052                "    : aaaaaaaaaa(aaaaaa) {}");
4053 
4054   verifyFormat("Constructor()\n"
4055                "    : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4056                "      aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4057                "                               aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4058                "      aaaaaaaaaaaaaaaaaaaaaaa() {}");
4059 
4060   verifyFormat("Constructor()\n"
4061                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4062                "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
4063 
4064   verifyFormat("Constructor(int Parameter = 0)\n"
4065                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
4066                "      aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}");
4067   verifyFormat("Constructor()\n"
4068                "    : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
4069                "}",
4070                getLLVMStyleWithColumns(60));
4071   verifyFormat("Constructor()\n"
4072                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4073                "          aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}");
4074 
4075   // Here a line could be saved by splitting the second initializer onto two
4076   // lines, but that is not desirable.
4077   verifyFormat("Constructor()\n"
4078                "    : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
4079                "      aaaaaaaaaaa(aaaaaaaaaaa),\n"
4080                "      aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
4081 
4082   FormatStyle OnePerLine = getLLVMStyle();
4083   OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
4084   OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
4085   verifyFormat("SomeClass::Constructor()\n"
4086                "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4087                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4088                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
4089                OnePerLine);
4090   verifyFormat("SomeClass::Constructor()\n"
4091                "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
4092                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4093                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
4094                OnePerLine);
4095   verifyFormat("MyClass::MyClass(int var)\n"
4096                "    : some_var_(var),            // 4 space indent\n"
4097                "      some_other_var_(var + 1) { // lined up\n"
4098                "}",
4099                OnePerLine);
4100   verifyFormat("Constructor()\n"
4101                "    : aaaaa(aaaaaa),\n"
4102                "      aaaaa(aaaaaa),\n"
4103                "      aaaaa(aaaaaa),\n"
4104                "      aaaaa(aaaaaa),\n"
4105                "      aaaaa(aaaaaa) {}",
4106                OnePerLine);
4107   verifyFormat("Constructor()\n"
4108                "    : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
4109                "            aaaaaaaaaaaaaaaaaaaaaa) {}",
4110                OnePerLine);
4111   OnePerLine.BinPackParameters = false;
4112   verifyFormat(
4113       "Constructor()\n"
4114       "    : aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4115       "          aaaaaaaaaaa().aaa(),\n"
4116       "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4117       OnePerLine);
4118   OnePerLine.ColumnLimit = 60;
4119   verifyFormat("Constructor()\n"
4120                "    : aaaaaaaaaaaaaaaaaaaa(a),\n"
4121                "      bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
4122                OnePerLine);
4123 
4124   EXPECT_EQ("Constructor()\n"
4125             "    : // Comment forcing unwanted break.\n"
4126             "      aaaa(aaaa) {}",
4127             format("Constructor() :\n"
4128                    "    // Comment forcing unwanted break.\n"
4129                    "    aaaa(aaaa) {}"));
4130 }
4131 
4132 TEST_F(FormatTest, AllowAllConstructorInitializersOnNextLine) {
4133   FormatStyle Style = getLLVMStyle();
4134   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
4135   Style.ColumnLimit = 60;
4136   Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
4137   Style.AllowAllConstructorInitializersOnNextLine = true;
4138   Style.BinPackParameters = false;
4139 
4140   for (int i = 0; i < 4; ++i) {
4141     // Test all combinations of parameters that should not have an effect.
4142     Style.AllowAllParametersOfDeclarationOnNextLine = i & 1;
4143     Style.AllowAllArgumentsOnNextLine = i & 2;
4144 
4145     Style.AllowAllConstructorInitializersOnNextLine = true;
4146     Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
4147     verifyFormat("Constructor()\n"
4148                  "    : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4149                  Style);
4150     verifyFormat("Constructor() : a(a), b(b) {}", Style);
4151 
4152     Style.AllowAllConstructorInitializersOnNextLine = false;
4153     verifyFormat("Constructor()\n"
4154                  "    : aaaaaaaaaaaaaaaaaaaa(a)\n"
4155                  "    , bbbbbbbbbbbbbbbbbbbbb(b) {}",
4156                  Style);
4157     verifyFormat("Constructor() : a(a), b(b) {}", Style);
4158 
4159     Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
4160     Style.AllowAllConstructorInitializersOnNextLine = true;
4161     verifyFormat("Constructor()\n"
4162                  "    : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4163                  Style);
4164 
4165     Style.AllowAllConstructorInitializersOnNextLine = false;
4166     verifyFormat("Constructor()\n"
4167                  "    : aaaaaaaaaaaaaaaaaaaa(a),\n"
4168                  "      bbbbbbbbbbbbbbbbbbbbb(b) {}",
4169                  Style);
4170 
4171     Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
4172     Style.AllowAllConstructorInitializersOnNextLine = true;
4173     verifyFormat("Constructor() :\n"
4174                  "    aaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4175                  Style);
4176 
4177     Style.AllowAllConstructorInitializersOnNextLine = false;
4178     verifyFormat("Constructor() :\n"
4179                  "    aaaaaaaaaaaaaaaaaa(a),\n"
4180                  "    bbbbbbbbbbbbbbbbbbbbb(b) {}",
4181                  Style);
4182   }
4183 
4184   // Test interactions between AllowAllParametersOfDeclarationOnNextLine and
4185   // AllowAllConstructorInitializersOnNextLine in all
4186   // BreakConstructorInitializers modes
4187   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
4188   Style.AllowAllParametersOfDeclarationOnNextLine = true;
4189   Style.AllowAllConstructorInitializersOnNextLine = false;
4190   verifyFormat("SomeClassWithALongName::Constructor(\n"
4191                "    int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb)\n"
4192                "    : aaaaaaaaaaaaaaaaaaaa(a)\n"
4193                "    , bbbbbbbbbbbbbbbbbbbbb(b) {}",
4194                Style);
4195 
4196   Style.AllowAllConstructorInitializersOnNextLine = true;
4197   verifyFormat("SomeClassWithALongName::Constructor(\n"
4198                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4199                "    int bbbbbbbbbbbbb,\n"
4200                "    int cccccccccccccccc)\n"
4201                "    : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4202                Style);
4203 
4204   Style.AllowAllParametersOfDeclarationOnNextLine = false;
4205   Style.AllowAllConstructorInitializersOnNextLine = false;
4206   verifyFormat("SomeClassWithALongName::Constructor(\n"
4207                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4208                "    int bbbbbbbbbbbbb)\n"
4209                "    : aaaaaaaaaaaaaaaaaaaa(a)\n"
4210                "    , bbbbbbbbbbbbbbbbbbbbb(b) {}",
4211                Style);
4212 
4213   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
4214 
4215   Style.AllowAllParametersOfDeclarationOnNextLine = true;
4216   verifyFormat("SomeClassWithALongName::Constructor(\n"
4217                "    int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb)\n"
4218                "    : aaaaaaaaaaaaaaaaaaaa(a),\n"
4219                "      bbbbbbbbbbbbbbbbbbbbb(b) {}",
4220                Style);
4221 
4222   Style.AllowAllConstructorInitializersOnNextLine = true;
4223   verifyFormat("SomeClassWithALongName::Constructor(\n"
4224                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4225                "    int bbbbbbbbbbbbb,\n"
4226                "    int cccccccccccccccc)\n"
4227                "    : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4228                Style);
4229 
4230   Style.AllowAllParametersOfDeclarationOnNextLine = false;
4231   Style.AllowAllConstructorInitializersOnNextLine = false;
4232   verifyFormat("SomeClassWithALongName::Constructor(\n"
4233                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4234                "    int bbbbbbbbbbbbb)\n"
4235                "    : aaaaaaaaaaaaaaaaaaaa(a),\n"
4236                "      bbbbbbbbbbbbbbbbbbbbb(b) {}",
4237                Style);
4238 
4239   Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
4240   Style.AllowAllParametersOfDeclarationOnNextLine = true;
4241   verifyFormat("SomeClassWithALongName::Constructor(\n"
4242                "    int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb) :\n"
4243                "    aaaaaaaaaaaaaaaaaaaa(a),\n"
4244                "    bbbbbbbbbbbbbbbbbbbbb(b) {}",
4245                Style);
4246 
4247   Style.AllowAllConstructorInitializersOnNextLine = true;
4248   verifyFormat("SomeClassWithALongName::Constructor(\n"
4249                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4250                "    int bbbbbbbbbbbbb,\n"
4251                "    int cccccccccccccccc) :\n"
4252                "    aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4253                Style);
4254 
4255   Style.AllowAllParametersOfDeclarationOnNextLine = false;
4256   Style.AllowAllConstructorInitializersOnNextLine = false;
4257   verifyFormat("SomeClassWithALongName::Constructor(\n"
4258                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4259                "    int bbbbbbbbbbbbb) :\n"
4260                "    aaaaaaaaaaaaaaaaaaaa(a),\n"
4261                "    bbbbbbbbbbbbbbbbbbbbb(b) {}",
4262                Style);
4263 }
4264 
4265 TEST_F(FormatTest, AllowAllArgumentsOnNextLine) {
4266   FormatStyle Style = getLLVMStyle();
4267   Style.ColumnLimit = 60;
4268   Style.BinPackArguments = false;
4269   for (int i = 0; i < 4; ++i) {
4270     // Test all combinations of parameters that should not have an effect.
4271     Style.AllowAllParametersOfDeclarationOnNextLine = i & 1;
4272     Style.AllowAllConstructorInitializersOnNextLine = i & 2;
4273 
4274     Style.AllowAllArgumentsOnNextLine = true;
4275     verifyFormat("void foo() {\n"
4276                  "  FunctionCallWithReallyLongName(\n"
4277                  "      aaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbb);\n"
4278                  "}",
4279                  Style);
4280     Style.AllowAllArgumentsOnNextLine = false;
4281     verifyFormat("void foo() {\n"
4282                  "  FunctionCallWithReallyLongName(\n"
4283                  "      aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4284                  "      bbbbbbbbbbbb);\n"
4285                  "}",
4286                  Style);
4287 
4288     Style.AllowAllArgumentsOnNextLine = true;
4289     verifyFormat("void foo() {\n"
4290                  "  auto VariableWithReallyLongName = {\n"
4291                  "      aaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbb};\n"
4292                  "}",
4293                  Style);
4294     Style.AllowAllArgumentsOnNextLine = false;
4295     verifyFormat("void foo() {\n"
4296                  "  auto VariableWithReallyLongName = {\n"
4297                  "      aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4298                  "      bbbbbbbbbbbb};\n"
4299                  "}",
4300                  Style);
4301   }
4302 
4303   // This parameter should not affect declarations.
4304   Style.BinPackParameters = false;
4305   Style.AllowAllArgumentsOnNextLine = false;
4306   Style.AllowAllParametersOfDeclarationOnNextLine = true;
4307   verifyFormat("void FunctionCallWithReallyLongName(\n"
4308                "    int aaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbb);",
4309                Style);
4310   Style.AllowAllParametersOfDeclarationOnNextLine = false;
4311   verifyFormat("void FunctionCallWithReallyLongName(\n"
4312                "    int aaaaaaaaaaaaaaaaaaaaaaa,\n"
4313                "    int bbbbbbbbbbbb);",
4314                Style);
4315 }
4316 
4317 TEST_F(FormatTest, BreakConstructorInitializersAfterColon) {
4318   FormatStyle Style = getLLVMStyle();
4319   Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
4320 
4321   verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
4322   verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}",
4323                getStyleWithColumns(Style, 45));
4324   verifyFormat("Constructor() :\n"
4325                "    Initializer(FitsOnTheLine) {}",
4326                getStyleWithColumns(Style, 44));
4327   verifyFormat("Constructor() :\n"
4328                "    Initializer(FitsOnTheLine) {}",
4329                getStyleWithColumns(Style, 43));
4330 
4331   verifyFormat("template <typename T>\n"
4332                "Constructor() : Initializer(FitsOnTheLine) {}",
4333                getStyleWithColumns(Style, 50));
4334   Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
4335   verifyFormat(
4336       "SomeClass::Constructor() :\n"
4337       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
4338       Style);
4339 
4340   Style.ConstructorInitializerAllOnOneLineOrOnePerLine = false;
4341   verifyFormat(
4342       "SomeClass::Constructor() :\n"
4343       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
4344       Style);
4345 
4346   verifyFormat(
4347       "SomeClass::Constructor() :\n"
4348       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4349       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
4350       Style);
4351   verifyFormat(
4352       "SomeClass::Constructor() :\n"
4353       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4354       "    aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
4355 	  Style);
4356   verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4357                "            aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4358                "    aaaaaaaaaa(aaaaaa) {}",
4359 			   Style);
4360 
4361   verifyFormat("Constructor() :\n"
4362                "    aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4363                "    aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4364                "                             aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4365                "    aaaaaaaaaaaaaaaaaaaaaaa() {}",
4366 			   Style);
4367 
4368   verifyFormat("Constructor() :\n"
4369                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4370                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4371 			   Style);
4372 
4373   verifyFormat("Constructor(int Parameter = 0) :\n"
4374                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
4375                "    aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}",
4376 			   Style);
4377   verifyFormat("Constructor() :\n"
4378                "    aaaaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
4379                "}",
4380                getStyleWithColumns(Style, 60));
4381   verifyFormat("Constructor() :\n"
4382                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4383                "        aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}",
4384 			   Style);
4385 
4386   // Here a line could be saved by splitting the second initializer onto two
4387   // lines, but that is not desirable.
4388   verifyFormat("Constructor() :\n"
4389                "    aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
4390                "    aaaaaaaaaaa(aaaaaaaaaaa),\n"
4391                "    aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4392 			   Style);
4393 
4394   FormatStyle OnePerLine = Style;
4395   OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
4396   OnePerLine.AllowAllConstructorInitializersOnNextLine = false;
4397   verifyFormat("SomeClass::Constructor() :\n"
4398                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4399                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4400                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
4401                OnePerLine);
4402   verifyFormat("SomeClass::Constructor() :\n"
4403                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
4404                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4405                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
4406                OnePerLine);
4407   verifyFormat("MyClass::MyClass(int var) :\n"
4408                "    some_var_(var),            // 4 space indent\n"
4409                "    some_other_var_(var + 1) { // lined up\n"
4410                "}",
4411                OnePerLine);
4412   verifyFormat("Constructor() :\n"
4413                "    aaaaa(aaaaaa),\n"
4414                "    aaaaa(aaaaaa),\n"
4415                "    aaaaa(aaaaaa),\n"
4416                "    aaaaa(aaaaaa),\n"
4417                "    aaaaa(aaaaaa) {}",
4418                OnePerLine);
4419   verifyFormat("Constructor() :\n"
4420                "    aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
4421                "          aaaaaaaaaaaaaaaaaaaaaa) {}",
4422                OnePerLine);
4423   OnePerLine.BinPackParameters = false;
4424   verifyFormat(
4425       "Constructor() :\n"
4426       "    aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4427       "        aaaaaaaaaaa().aaa(),\n"
4428       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4429       OnePerLine);
4430   OnePerLine.ColumnLimit = 60;
4431   verifyFormat("Constructor() :\n"
4432                "    aaaaaaaaaaaaaaaaaaaa(a),\n"
4433                "    bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
4434                OnePerLine);
4435 
4436   EXPECT_EQ("Constructor() :\n"
4437             "    // Comment forcing unwanted break.\n"
4438             "    aaaa(aaaa) {}",
4439             format("Constructor() :\n"
4440                    "    // Comment forcing unwanted break.\n"
4441                    "    aaaa(aaaa) {}",
4442 				   Style));
4443 
4444   Style.ColumnLimit = 0;
4445   verifyFormat("SomeClass::Constructor() :\n"
4446                "    a(a) {}",
4447                Style);
4448   verifyFormat("SomeClass::Constructor() noexcept :\n"
4449                "    a(a) {}",
4450                Style);
4451   verifyFormat("SomeClass::Constructor() :\n"
4452 			   "    a(a), b(b), c(c) {}",
4453                Style);
4454   verifyFormat("SomeClass::Constructor() :\n"
4455                "    a(a) {\n"
4456                "  foo();\n"
4457                "  bar();\n"
4458                "}",
4459                Style);
4460 
4461   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
4462   verifyFormat("SomeClass::Constructor() :\n"
4463 			   "    a(a), b(b), c(c) {\n"
4464 			   "}",
4465                Style);
4466   verifyFormat("SomeClass::Constructor() :\n"
4467                "    a(a) {\n"
4468 			   "}",
4469                Style);
4470 
4471   Style.ColumnLimit = 80;
4472   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
4473   Style.ConstructorInitializerIndentWidth = 2;
4474   verifyFormat("SomeClass::Constructor() : a(a), b(b), c(c) {}",
4475                Style);
4476   verifyFormat("SomeClass::Constructor() :\n"
4477                "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4478                "  bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {}",
4479                Style);
4480 
4481   // `ConstructorInitializerIndentWidth` actually applies to InheritanceList as well
4482   Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
4483   verifyFormat("class SomeClass\n"
4484                "  : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4485                "    public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};",
4486                Style);
4487   Style.BreakInheritanceList = FormatStyle::BILS_BeforeComma;
4488   verifyFormat("class SomeClass\n"
4489                "  : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4490                "  , public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};",
4491                Style);
4492   Style.BreakInheritanceList = FormatStyle::BILS_AfterColon;
4493   verifyFormat("class SomeClass :\n"
4494                "  public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4495                "  public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};",
4496                Style);
4497 }
4498 
4499 #ifndef EXPENSIVE_CHECKS
4500 // Expensive checks enables libstdc++ checking which includes validating the
4501 // state of ranges used in std::priority_queue - this blows out the
4502 // runtime/scalability of the function and makes this test unacceptably slow.
4503 TEST_F(FormatTest, MemoizationTests) {
4504   // This breaks if the memoization lookup does not take \c Indent and
4505   // \c LastSpace into account.
4506   verifyFormat(
4507       "extern CFRunLoopTimerRef\n"
4508       "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n"
4509       "                     CFTimeInterval interval, CFOptionFlags flags,\n"
4510       "                     CFIndex order, CFRunLoopTimerCallBack callout,\n"
4511       "                     CFRunLoopTimerContext *context) {}");
4512 
4513   // Deep nesting somewhat works around our memoization.
4514   verifyFormat(
4515       "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4516       "    aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4517       "        aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4518       "            aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4519       "                aaaaa())))))))))))))))))))))))))))))))))))))));",
4520       getLLVMStyleWithColumns(65));
4521   verifyFormat(
4522       "aaaaa(\n"
4523       "    aaaaa,\n"
4524       "    aaaaa(\n"
4525       "        aaaaa,\n"
4526       "        aaaaa(\n"
4527       "            aaaaa,\n"
4528       "            aaaaa(\n"
4529       "                aaaaa,\n"
4530       "                aaaaa(\n"
4531       "                    aaaaa,\n"
4532       "                    aaaaa(\n"
4533       "                        aaaaa,\n"
4534       "                        aaaaa(\n"
4535       "                            aaaaa,\n"
4536       "                            aaaaa(\n"
4537       "                                aaaaa,\n"
4538       "                                aaaaa(\n"
4539       "                                    aaaaa,\n"
4540       "                                    aaaaa(\n"
4541       "                                        aaaaa,\n"
4542       "                                        aaaaa(\n"
4543       "                                            aaaaa,\n"
4544       "                                            aaaaa(\n"
4545       "                                                aaaaa,\n"
4546       "                                                aaaaa))))))))))));",
4547       getLLVMStyleWithColumns(65));
4548   verifyFormat(
4549       "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"
4550       "                                  a),\n"
4551       "                                a),\n"
4552       "                              a),\n"
4553       "                            a),\n"
4554       "                          a),\n"
4555       "                        a),\n"
4556       "                      a),\n"
4557       "                    a),\n"
4558       "                  a),\n"
4559       "                a),\n"
4560       "              a),\n"
4561       "            a),\n"
4562       "          a),\n"
4563       "        a),\n"
4564       "      a),\n"
4565       "    a),\n"
4566       "  a)",
4567       getLLVMStyleWithColumns(65));
4568 
4569   // This test takes VERY long when memoization is broken.
4570   FormatStyle OnePerLine = getLLVMStyle();
4571   OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
4572   OnePerLine.BinPackParameters = false;
4573   std::string input = "Constructor()\n"
4574                       "    : aaaa(a,\n";
4575   for (unsigned i = 0, e = 80; i != e; ++i) {
4576     input += "           a,\n";
4577   }
4578   input += "           a) {}";
4579   verifyFormat(input, OnePerLine);
4580 }
4581 #endif
4582 
4583 TEST_F(FormatTest, BreaksAsHighAsPossible) {
4584   verifyFormat(
4585       "void f() {\n"
4586       "  if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
4587       "      (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
4588       "    f();\n"
4589       "}");
4590   verifyFormat("if (Intervals[i].getRange().getFirst() <\n"
4591                "    Intervals[i - 1].getRange().getLast()) {\n}");
4592 }
4593 
4594 TEST_F(FormatTest, BreaksFunctionDeclarations) {
4595   // Principially, we break function declarations in a certain order:
4596   // 1) break amongst arguments.
4597   verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n"
4598                "                              Cccccccccccccc cccccccccccccc);");
4599   verifyFormat("template <class TemplateIt>\n"
4600                "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n"
4601                "                            TemplateIt *stop) {}");
4602 
4603   // 2) break after return type.
4604   verifyFormat(
4605       "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4606       "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);",
4607       getGoogleStyle());
4608 
4609   // 3) break after (.
4610   verifyFormat(
4611       "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n"
4612       "    Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);",
4613       getGoogleStyle());
4614 
4615   // 4) break before after nested name specifiers.
4616   verifyFormat(
4617       "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4618       "SomeClasssssssssssssssssssssssssssssssssssssss::\n"
4619       "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);",
4620       getGoogleStyle());
4621 
4622   // However, there are exceptions, if a sufficient amount of lines can be
4623   // saved.
4624   // FIXME: The precise cut-offs wrt. the number of saved lines might need some
4625   // more adjusting.
4626   verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
4627                "                                  Cccccccccccccc cccccccccc,\n"
4628                "                                  Cccccccccccccc cccccccccc,\n"
4629                "                                  Cccccccccccccc cccccccccc,\n"
4630                "                                  Cccccccccccccc cccccccccc);");
4631   verifyFormat(
4632       "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4633       "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4634       "            Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4635       "            Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);",
4636       getGoogleStyle());
4637   verifyFormat(
4638       "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
4639       "                                          Cccccccccccccc cccccccccc,\n"
4640       "                                          Cccccccccccccc cccccccccc,\n"
4641       "                                          Cccccccccccccc cccccccccc,\n"
4642       "                                          Cccccccccccccc cccccccccc,\n"
4643       "                                          Cccccccccccccc cccccccccc,\n"
4644       "                                          Cccccccccccccc cccccccccc);");
4645   verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4646                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4647                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4648                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4649                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
4650 
4651   // Break after multi-line parameters.
4652   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4653                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4654                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4655                "    bbbb bbbb);");
4656   verifyFormat("void SomeLoooooooooooongFunction(\n"
4657                "    std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
4658                "        aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4659                "    int bbbbbbbbbbbbb);");
4660 
4661   // Treat overloaded operators like other functions.
4662   verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
4663                "operator>(const SomeLoooooooooooooooooooooooooogType &other);");
4664   verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
4665                "operator>>(const SomeLooooooooooooooooooooooooogType &other);");
4666   verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
4667                "operator<<(const SomeLooooooooooooooooooooooooogType &other);");
4668   verifyGoogleFormat(
4669       "SomeLoooooooooooooooooooooooooooooogType operator>>(\n"
4670       "    const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
4671   verifyGoogleFormat(
4672       "SomeLoooooooooooooooooooooooooooooogType operator<<(\n"
4673       "    const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
4674   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4675                "    int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);");
4676   verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n"
4677                "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);");
4678   verifyGoogleFormat(
4679       "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n"
4680       "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4681       "    bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}");
4682   verifyGoogleFormat(
4683       "template <typename T>\n"
4684       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4685       "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n"
4686       "    aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);");
4687 
4688   FormatStyle Style = getLLVMStyle();
4689   Style.PointerAlignment = FormatStyle::PAS_Left;
4690   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4691                "    aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}",
4692                Style);
4693   verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n"
4694                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4695                Style);
4696 }
4697 
4698 TEST_F(FormatTest, DontBreakBeforeQualifiedOperator) {
4699   // Regression test for https://bugs.llvm.org/show_bug.cgi?id=40516:
4700   // Prefer keeping `::` followed by `operator` together.
4701   EXPECT_EQ("const aaaa::bbbbbbb &\n"
4702             "ccccccccc::operator++() {\n"
4703             "  stuff();\n"
4704             "}",
4705             format("const aaaa::bbbbbbb\n"
4706                    "&ccccccccc::operator++() { stuff(); }",
4707                    getLLVMStyleWithColumns(40)));
4708 }
4709 
4710 TEST_F(FormatTest, TrailingReturnType) {
4711   verifyFormat("auto foo() -> int;\n");
4712   verifyFormat("struct S {\n"
4713                "  auto bar() const -> int;\n"
4714                "};");
4715   verifyFormat("template <size_t Order, typename T>\n"
4716                "auto load_img(const std::string &filename)\n"
4717                "    -> alias::tensor<Order, T, mem::tag::cpu> {}");
4718   verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n"
4719                "    -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}");
4720   verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}");
4721   verifyFormat("template <typename T>\n"
4722                "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n"
4723                "    -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());");
4724 
4725   // Not trailing return types.
4726   verifyFormat("void f() { auto a = b->c(); }");
4727 }
4728 
4729 TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) {
4730   // Avoid breaking before trailing 'const' or other trailing annotations, if
4731   // they are not function-like.
4732   FormatStyle Style = getGoogleStyle();
4733   Style.ColumnLimit = 47;
4734   verifyFormat("void someLongFunction(\n"
4735                "    int someLoooooooooooooongParameter) const {\n}",
4736                getLLVMStyleWithColumns(47));
4737   verifyFormat("LoooooongReturnType\n"
4738                "someLoooooooongFunction() const {}",
4739                getLLVMStyleWithColumns(47));
4740   verifyFormat("LoooooongReturnType someLoooooooongFunction()\n"
4741                "    const {}",
4742                Style);
4743   verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
4744                "                  aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;");
4745   verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
4746                "                  aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;");
4747   verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
4748                "                  aaaaa aaaaaaaaaaaaaaaaaaaa) override final;");
4749   verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n"
4750                "                   aaaaaaaaaaa aaaaa) const override;");
4751   verifyGoogleFormat(
4752       "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4753       "    const override;");
4754 
4755   // Even if the first parameter has to be wrapped.
4756   verifyFormat("void someLongFunction(\n"
4757                "    int someLongParameter) const {}",
4758                getLLVMStyleWithColumns(46));
4759   verifyFormat("void someLongFunction(\n"
4760                "    int someLongParameter) const {}",
4761                Style);
4762   verifyFormat("void someLongFunction(\n"
4763                "    int someLongParameter) override {}",
4764                Style);
4765   verifyFormat("void someLongFunction(\n"
4766                "    int someLongParameter) OVERRIDE {}",
4767                Style);
4768   verifyFormat("void someLongFunction(\n"
4769                "    int someLongParameter) final {}",
4770                Style);
4771   verifyFormat("void someLongFunction(\n"
4772                "    int someLongParameter) FINAL {}",
4773                Style);
4774   verifyFormat("void someLongFunction(\n"
4775                "    int parameter) const override {}",
4776                Style);
4777 
4778   Style.BreakBeforeBraces = FormatStyle::BS_Allman;
4779   verifyFormat("void someLongFunction(\n"
4780                "    int someLongParameter) const\n"
4781                "{\n"
4782                "}",
4783                Style);
4784 
4785   // Unless these are unknown annotations.
4786   verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n"
4787                "                  aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4788                "    LONG_AND_UGLY_ANNOTATION;");
4789 
4790   // Breaking before function-like trailing annotations is fine to keep them
4791   // close to their arguments.
4792   verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4793                "    LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
4794   verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
4795                "    LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
4796   verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
4797                "    LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}");
4798   verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n"
4799                      "    AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);");
4800   verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});");
4801 
4802   verifyFormat(
4803       "void aaaaaaaaaaaaaaaaaa()\n"
4804       "    __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n"
4805       "                   aaaaaaaaaaaaaaaaaaaaaaaaa));");
4806   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4807                "    __attribute__((unused));");
4808   verifyGoogleFormat(
4809       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4810       "    GUARDED_BY(aaaaaaaaaaaa);");
4811   verifyGoogleFormat(
4812       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4813       "    GUARDED_BY(aaaaaaaaaaaa);");
4814   verifyGoogleFormat(
4815       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4816       "    aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4817   verifyGoogleFormat(
4818       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4819       "    aaaaaaaaaaaaaaaaaaaaaaaaa;");
4820 }
4821 
4822 TEST_F(FormatTest, FunctionAnnotations) {
4823   verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
4824                "int OldFunction(const string &parameter) {}");
4825   verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
4826                "string OldFunction(const string &parameter) {}");
4827   verifyFormat("template <typename T>\n"
4828                "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
4829                "string OldFunction(const string &parameter) {}");
4830 
4831   // Not function annotations.
4832   verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4833                "                << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
4834   verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n"
4835                "       ThisIsATestWithAReallyReallyReallyReallyLongName) {}");
4836   verifyFormat("MACRO(abc).function() // wrap\n"
4837                "    << abc;");
4838   verifyFormat("MACRO(abc)->function() // wrap\n"
4839                "    << abc;");
4840   verifyFormat("MACRO(abc)::function() // wrap\n"
4841                "    << abc;");
4842 }
4843 
4844 TEST_F(FormatTest, BreaksDesireably) {
4845   verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
4846                "    aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
4847                "    aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
4848   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4849                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
4850                "}");
4851 
4852   verifyFormat(
4853       "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4854       "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
4855 
4856   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4857                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4858                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4859 
4860   verifyFormat(
4861       "aaaaaaaa(aaaaaaaaaaaaa,\n"
4862       "         aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4863       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
4864       "         aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4865       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
4866 
4867   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4868                "    (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4869 
4870   verifyFormat(
4871       "void f() {\n"
4872       "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
4873       "                                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4874       "}");
4875   verifyFormat(
4876       "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4877       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4878   verifyFormat(
4879       "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4880       "                aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4881   verifyFormat(
4882       "aaaaaa(aaa,\n"
4883       "       new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4884       "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4885       "       aaaa);");
4886   verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4887                "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4888                "                  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4889 
4890   // Indent consistently independent of call expression and unary operator.
4891   verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4892                "    dddddddddddddddddddddddddddddd));");
4893   verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4894                "    dddddddddddddddddddddddddddddd));");
4895   verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n"
4896                "    dddddddddddddddddddddddddddddd));");
4897 
4898   // This test case breaks on an incorrect memoization, i.e. an optimization not
4899   // taking into account the StopAt value.
4900   verifyFormat(
4901       "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4902       "       aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4903       "       aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4904       "       (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4905 
4906   verifyFormat("{\n  {\n    {\n"
4907                "      Annotation.SpaceRequiredBefore =\n"
4908                "          Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
4909                "          Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
4910                "    }\n  }\n}");
4911 
4912   // Break on an outer level if there was a break on an inner level.
4913   EXPECT_EQ("f(g(h(a, // comment\n"
4914             "      b, c),\n"
4915             "    d, e),\n"
4916             "  x, y);",
4917             format("f(g(h(a, // comment\n"
4918                    "    b, c), d, e), x, y);"));
4919 
4920   // Prefer breaking similar line breaks.
4921   verifyFormat(
4922       "const int kTrackingOptions = NSTrackingMouseMoved |\n"
4923       "                             NSTrackingMouseEnteredAndExited |\n"
4924       "                             NSTrackingActiveAlways;");
4925 }
4926 
4927 TEST_F(FormatTest, FormatsDeclarationsOnePerLine) {
4928   FormatStyle NoBinPacking = getGoogleStyle();
4929   NoBinPacking.BinPackParameters = false;
4930   NoBinPacking.BinPackArguments = true;
4931   verifyFormat("void f() {\n"
4932                "  f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n"
4933                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4934                "}",
4935                NoBinPacking);
4936   verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n"
4937                "       int aaaaaaaaaaaaaaaaaaaa,\n"
4938                "       int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4939                NoBinPacking);
4940 
4941   NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
4942   verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4943                "                        vector<int> bbbbbbbbbbbbbbb);",
4944                NoBinPacking);
4945   // FIXME: This behavior difference is probably not wanted. However, currently
4946   // we cannot distinguish BreakBeforeParameter being set because of the wrapped
4947   // template arguments from BreakBeforeParameter being set because of the
4948   // one-per-line formatting.
4949   verifyFormat(
4950       "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4951       "                                             aaaaaaaaaa> aaaaaaaaaa);",
4952       NoBinPacking);
4953   verifyFormat(
4954       "void fffffffffff(\n"
4955       "    aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n"
4956       "        aaaaaaaaaa);");
4957 }
4958 
4959 TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) {
4960   FormatStyle NoBinPacking = getGoogleStyle();
4961   NoBinPacking.BinPackParameters = false;
4962   NoBinPacking.BinPackArguments = false;
4963   verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n"
4964                "  aaaaaaaaaaaaaaaaaaaa,\n"
4965                "  aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);",
4966                NoBinPacking);
4967   verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n"
4968                "        aaaaaaaaaaaaa,\n"
4969                "        aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));",
4970                NoBinPacking);
4971   verifyFormat(
4972       "aaaaaaaa(aaaaaaaaaaaaa,\n"
4973       "         aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4974       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
4975       "         aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4976       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));",
4977       NoBinPacking);
4978   verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4979                "    .aaaaaaaaaaaaaaaaaa();",
4980                NoBinPacking);
4981   verifyFormat("void f() {\n"
4982                "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4983                "      aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n"
4984                "}",
4985                NoBinPacking);
4986 
4987   verifyFormat(
4988       "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4989       "             aaaaaaaaaaaa,\n"
4990       "             aaaaaaaaaaaa);",
4991       NoBinPacking);
4992   verifyFormat(
4993       "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n"
4994       "                               ddddddddddddddddddddddddddddd),\n"
4995       "             test);",
4996       NoBinPacking);
4997 
4998   verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4999                "            aaaaaaaaaaaaaaaaaaaaaaa,\n"
5000                "            aaaaaaaaaaaaaaaaaaaaaaa>\n"
5001                "    aaaaaaaaaaaaaaaaaa;",
5002                NoBinPacking);
5003   verifyFormat("a(\"a\"\n"
5004                "  \"a\",\n"
5005                "  a);");
5006 
5007   NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
5008   verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n"
5009                "                aaaaaaaaa,\n"
5010                "                aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5011                NoBinPacking);
5012   verifyFormat(
5013       "void f() {\n"
5014       "  aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
5015       "      .aaaaaaa();\n"
5016       "}",
5017       NoBinPacking);
5018   verifyFormat(
5019       "template <class SomeType, class SomeOtherType>\n"
5020       "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}",
5021       NoBinPacking);
5022 }
5023 
5024 TEST_F(FormatTest, AdaptiveOnePerLineFormatting) {
5025   FormatStyle Style = getLLVMStyleWithColumns(15);
5026   Style.ExperimentalAutoDetectBinPacking = true;
5027   EXPECT_EQ("aaa(aaaa,\n"
5028             "    aaaa,\n"
5029             "    aaaa);\n"
5030             "aaa(aaaa,\n"
5031             "    aaaa,\n"
5032             "    aaaa);",
5033             format("aaa(aaaa,\n" // one-per-line
5034                    "  aaaa,\n"
5035                    "    aaaa  );\n"
5036                    "aaa(aaaa,  aaaa,  aaaa);", // inconclusive
5037                    Style));
5038   EXPECT_EQ("aaa(aaaa, aaaa,\n"
5039             "    aaaa);\n"
5040             "aaa(aaaa, aaaa,\n"
5041             "    aaaa);",
5042             format("aaa(aaaa,  aaaa,\n" // bin-packed
5043                    "    aaaa  );\n"
5044                    "aaa(aaaa,  aaaa,  aaaa);", // inconclusive
5045                    Style));
5046 }
5047 
5048 TEST_F(FormatTest, FormatsBuilderPattern) {
5049   verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n"
5050                "    .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n"
5051                "    .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n"
5052                "    .StartsWith(\".init\", ORDER_INIT)\n"
5053                "    .StartsWith(\".fini\", ORDER_FINI)\n"
5054                "    .StartsWith(\".hash\", ORDER_HASH)\n"
5055                "    .Default(ORDER_TEXT);\n");
5056 
5057   verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n"
5058                "       aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();");
5059   verifyFormat(
5060       "aaaaaaa->aaaaaaa\n"
5061       "    ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5062       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5063       "    ->aaaaaaaa(aaaaaaaaaaaaaaa);");
5064   verifyFormat(
5065       "aaaaaaa->aaaaaaa\n"
5066       "    ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5067       "    ->aaaaaaaa(aaaaaaaaaaaaaaa);");
5068   verifyFormat(
5069       "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"
5070       "    aaaaaaaaaaaaaa);");
5071   verifyFormat(
5072       "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n"
5073       "    aaaaaa->aaaaaaaaaaaa()\n"
5074       "        ->aaaaaaaaaaaaaaaa(\n"
5075       "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5076       "        ->aaaaaaaaaaaaaaaaa();");
5077   verifyGoogleFormat(
5078       "void f() {\n"
5079       "  someo->Add((new util::filetools::Handler(dir))\n"
5080       "                 ->OnEvent1(NewPermanentCallback(\n"
5081       "                     this, &HandlerHolderClass::EventHandlerCBA))\n"
5082       "                 ->OnEvent2(NewPermanentCallback(\n"
5083       "                     this, &HandlerHolderClass::EventHandlerCBB))\n"
5084       "                 ->OnEvent3(NewPermanentCallback(\n"
5085       "                     this, &HandlerHolderClass::EventHandlerCBC))\n"
5086       "                 ->OnEvent5(NewPermanentCallback(\n"
5087       "                     this, &HandlerHolderClass::EventHandlerCBD))\n"
5088       "                 ->OnEvent6(NewPermanentCallback(\n"
5089       "                     this, &HandlerHolderClass::EventHandlerCBE)));\n"
5090       "}");
5091 
5092   verifyFormat(
5093       "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();");
5094   verifyFormat("aaaaaaaaaaaaaaa()\n"
5095                "    .aaaaaaaaaaaaaaa()\n"
5096                "    .aaaaaaaaaaaaaaa()\n"
5097                "    .aaaaaaaaaaaaaaa()\n"
5098                "    .aaaaaaaaaaaaaaa();");
5099   verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
5100                "    .aaaaaaaaaaaaaaa()\n"
5101                "    .aaaaaaaaaaaaaaa()\n"
5102                "    .aaaaaaaaaaaaaaa();");
5103   verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
5104                "    .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
5105                "    .aaaaaaaaaaaaaaa();");
5106   verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n"
5107                "    ->aaaaaaaaaaaaaae(0)\n"
5108                "    ->aaaaaaaaaaaaaaa();");
5109 
5110   // Don't linewrap after very short segments.
5111   verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5112                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5113                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5114   verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5115                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5116                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5117   verifyFormat("aaa()\n"
5118                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5119                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5120                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5121 
5122   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
5123                "    .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5124                "    .has<bbbbbbbbbbbbbbbbbbbbb>();");
5125   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
5126                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
5127                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();");
5128 
5129   // Prefer not to break after empty parentheses.
5130   verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n"
5131                "    First->LastNewlineOffset);");
5132 
5133   // Prefer not to create "hanging" indents.
5134   verifyFormat(
5135       "return !soooooooooooooome_map\n"
5136       "            .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5137       "            .second;");
5138   verifyFormat(
5139       "return aaaaaaaaaaaaaaaa\n"
5140       "    .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n"
5141       "    .aaaa(aaaaaaaaaaaaaa);");
5142   // No hanging indent here.
5143   verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n"
5144                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5145   verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n"
5146                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5147   verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
5148                "    .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5149                getLLVMStyleWithColumns(60));
5150   verifyFormat("aaaaaaaaaaaaaaaaaa\n"
5151                "    .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
5152                "    .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5153                getLLVMStyleWithColumns(59));
5154   verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5155                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5156                "    .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5157 
5158   // Dont break if only closing statements before member call
5159   verifyFormat("test() {\n"
5160                "  ([]() -> {\n"
5161                "    int b = 32;\n"
5162                "    return 3;\n"
5163                "  }).foo();\n"
5164                "}");
5165   verifyFormat("test() {\n"
5166                "  (\n"
5167                "      []() -> {\n"
5168                "        int b = 32;\n"
5169                "        return 3;\n"
5170                "      },\n"
5171                "      foo, bar)\n"
5172                "      .foo();\n"
5173                "}");
5174   verifyFormat("test() {\n"
5175                "  ([]() -> {\n"
5176                "    int b = 32;\n"
5177                "    return 3;\n"
5178                "  })\n"
5179                "      .foo()\n"
5180                "      .bar();\n"
5181                "}");
5182   verifyFormat("test() {\n"
5183                "  ([]() -> {\n"
5184                "    int b = 32;\n"
5185                "    return 3;\n"
5186                "  })\n"
5187                "      .foo(\"aaaaaaaaaaaaaaaaa\"\n"
5188                "           \"bbbb\");\n"
5189                "}",
5190                getLLVMStyleWithColumns(30));
5191 }
5192 
5193 TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
5194   verifyFormat(
5195       "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
5196       "    bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
5197   verifyFormat(
5198       "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n"
5199       "    bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}");
5200 
5201   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
5202                "    ccccccccccccccccccccccccc) {\n}");
5203   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n"
5204                "    ccccccccccccccccccccccccc) {\n}");
5205 
5206   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
5207                "    ccccccccccccccccccccccccc) {\n}");
5208   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n"
5209                "    ccccccccccccccccccccccccc) {\n}");
5210 
5211   verifyFormat(
5212       "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
5213       "    ccccccccccccccccccccccccc) {\n}");
5214   verifyFormat(
5215       "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n"
5216       "    ccccccccccccccccccccccccc) {\n}");
5217 
5218   verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
5219                "       bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
5220                "       cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
5221                "       dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
5222   verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n"
5223                "       bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n"
5224                "       cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n"
5225                "       dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
5226 
5227   verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
5228                "     aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
5229                "    aaaaaaaaaaaaaaa != aa) {\n}");
5230   verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n"
5231                "     aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n"
5232                "    aaaaaaaaaaaaaaa != aa) {\n}");
5233 }
5234 
5235 TEST_F(FormatTest, BreaksAfterAssignments) {
5236   verifyFormat(
5237       "unsigned Cost =\n"
5238       "    TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
5239       "                        SI->getPointerAddressSpaceee());\n");
5240   verifyFormat(
5241       "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
5242       "    Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
5243 
5244   verifyFormat(
5245       "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n"
5246       "    aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
5247   verifyFormat("unsigned OriginalStartColumn =\n"
5248                "    SourceMgr.getSpellingColumnNumber(\n"
5249                "        Current.FormatTok.getStartOfNonWhitespace()) -\n"
5250                "    1;");
5251 }
5252 
5253 TEST_F(FormatTest, ConfigurableBreakAssignmentPenalty) {
5254   FormatStyle Style = getLLVMStyle();
5255   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5256                "    bbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccccccccccccc;",
5257                Style);
5258 
5259   Style.PenaltyBreakAssignment = 20;
5260   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
5261                "                                 cccccccccccccccccccccccccc;",
5262                Style);
5263 }
5264 
5265 TEST_F(FormatTest, AlignsAfterAssignments) {
5266   verifyFormat(
5267       "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5268       "             aaaaaaaaaaaaaaaaaaaaaaaaa;");
5269   verifyFormat(
5270       "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5271       "          aaaaaaaaaaaaaaaaaaaaaaaaa;");
5272   verifyFormat(
5273       "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5274       "           aaaaaaaaaaaaaaaaaaaaaaaaa;");
5275   verifyFormat(
5276       "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5277       "              aaaaaaaaaaaaaaaaaaaaaaaaa);");
5278   verifyFormat(
5279       "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n"
5280       "                                            aaaaaaaaaaaaaaaaaaaaaaaa +\n"
5281       "                                            aaaaaaaaaaaaaaaaaaaaaaaa;");
5282 }
5283 
5284 TEST_F(FormatTest, AlignsAfterReturn) {
5285   verifyFormat(
5286       "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5287       "       aaaaaaaaaaaaaaaaaaaaaaaaa;");
5288   verifyFormat(
5289       "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5290       "        aaaaaaaaaaaaaaaaaaaaaaaaa);");
5291   verifyFormat(
5292       "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
5293       "       aaaaaaaaaaaaaaaaaaaaaa();");
5294   verifyFormat(
5295       "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
5296       "        aaaaaaaaaaaaaaaaaaaaaa());");
5297   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5298                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5299   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5300                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
5301                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5302   verifyFormat("return\n"
5303                "    // true if code is one of a or b.\n"
5304                "    code == a || code == b;");
5305 }
5306 
5307 TEST_F(FormatTest, AlignsAfterOpenBracket) {
5308   verifyFormat(
5309       "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
5310       "                                                aaaaaaaaa aaaaaaa) {}");
5311   verifyFormat(
5312       "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
5313       "                                               aaaaaaaaaaa aaaaaaaaa);");
5314   verifyFormat(
5315       "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
5316       "                                             aaaaaaaaaaaaaaaaaaaaa));");
5317   FormatStyle Style = getLLVMStyle();
5318   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5319   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5320                "    aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",
5321                Style);
5322   verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
5323                "    aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);",
5324                Style);
5325   verifyFormat("SomeLongVariableName->someFunction(\n"
5326                "    foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));",
5327                Style);
5328   verifyFormat(
5329       "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
5330       "    aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
5331       Style);
5332   verifyFormat(
5333       "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
5334       "    aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5335       Style);
5336   verifyFormat(
5337       "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
5338       "    aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
5339       Style);
5340 
5341   verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n"
5342                "    ccccccc(aaaaaaaaaaaaaaaaa,         //\n"
5343                "        b));",
5344                Style);
5345 
5346   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5347   Style.BinPackArguments = false;
5348   Style.BinPackParameters = false;
5349   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5350                "    aaaaaaaaaaa aaaaaaaa,\n"
5351                "    aaaaaaaaa aaaaaaa,\n"
5352                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
5353                Style);
5354   verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
5355                "    aaaaaaaaaaa aaaaaaaaa,\n"
5356                "    aaaaaaaaaaa aaaaaaaaa,\n"
5357                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5358                Style);
5359   verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n"
5360                "    aaaaaaaaaaaaaaa,\n"
5361                "    aaaaaaaaaaaaaaaaaaaaa,\n"
5362                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
5363                Style);
5364   verifyFormat(
5365       "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n"
5366       "    aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
5367       Style);
5368   verifyFormat(
5369       "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n"
5370       "    aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
5371       Style);
5372   verifyFormat(
5373       "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
5374       "    aaaaaaaaaaaaaaaaaaaaa(\n"
5375       "        aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n"
5376       "    aaaaaaaaaaaaaaaa);",
5377       Style);
5378   verifyFormat(
5379       "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
5380       "    aaaaaaaaaaaaaaaaaaaaa(\n"
5381       "        aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
5382       "    aaaaaaaaaaaaaaaa);",
5383       Style);
5384 }
5385 
5386 TEST_F(FormatTest, ParenthesesAndOperandAlignment) {
5387   FormatStyle Style = getLLVMStyleWithColumns(40);
5388   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5389                "          bbbbbbbbbbbbbbbbbbbbbb);",
5390                Style);
5391   Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
5392   Style.AlignOperands = false;
5393   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5394                "          bbbbbbbbbbbbbbbbbbbbbb);",
5395                Style);
5396   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5397   Style.AlignOperands = true;
5398   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5399                "          bbbbbbbbbbbbbbbbbbbbbb);",
5400                Style);
5401   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5402   Style.AlignOperands = false;
5403   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5404                "    bbbbbbbbbbbbbbbbbbbbbb);",
5405                Style);
5406 }
5407 
5408 TEST_F(FormatTest, BreaksConditionalExpressions) {
5409   verifyFormat(
5410       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5411       "                               ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5412       "                               : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5413   verifyFormat(
5414       "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
5415       "     aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5416       "                                : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5417   verifyFormat(
5418       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5419       "                                   : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5420   verifyFormat(
5421       "aaaa(aaaaaaaaa, aaaaaaaaa,\n"
5422       "     aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5423       "             : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5424   verifyFormat(
5425       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
5426       "                                                    : aaaaaaaaaaaaa);");
5427   verifyFormat(
5428       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5429       "                   aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5430       "                                    : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5431       "                   aaaaaaaaaaaaa);");
5432   verifyFormat(
5433       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5434       "                   aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5435       "                   aaaaaaaaaaaaa);");
5436   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5437                "    ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5438                "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5439                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5440                "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5441   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5442                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5443                "           ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5444                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5445                "           : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5446                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5447                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5448   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5449                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5450                "           ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5451                "                  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5452                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5453   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5454                "    ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5455                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5456   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
5457                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5458                "        ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5459                "        : aaaaaaaaaaaaaaaa;");
5460   verifyFormat(
5461       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5462       "    ? aaaaaaaaaaaaaaa\n"
5463       "    : aaaaaaaaaaaaaaa;");
5464   verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
5465                "          aaaaaaaaa\n"
5466                "      ? b\n"
5467                "      : c);");
5468   verifyFormat("return aaaa == bbbb\n"
5469                "           // comment\n"
5470                "           ? aaaa\n"
5471                "           : bbbb;");
5472   verifyFormat("unsigned Indent =\n"
5473                "    format(TheLine.First,\n"
5474                "           IndentForLevel[TheLine.Level] >= 0\n"
5475                "               ? IndentForLevel[TheLine.Level]\n"
5476                "               : TheLine * 2,\n"
5477                "           TheLine.InPPDirective, PreviousEndOfLineColumn);",
5478                getLLVMStyleWithColumns(60));
5479   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
5480                "                  ? aaaaaaaaaaaaaaa\n"
5481                "                  : bbbbbbbbbbbbbbb //\n"
5482                "                        ? ccccccccccccccc\n"
5483                "                        : ddddddddddddddd;");
5484   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
5485                "                  ? aaaaaaaaaaaaaaa\n"
5486                "                  : (bbbbbbbbbbbbbbb //\n"
5487                "                         ? ccccccccccccccc\n"
5488                "                         : ddddddddddddddd);");
5489   verifyFormat(
5490       "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5491       "                                      ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5492       "                                            aaaaaaaaaaaaaaaaaaaaa +\n"
5493       "                                            aaaaaaaaaaaaaaaaaaaaa\n"
5494       "                                      : aaaaaaaaaa;");
5495   verifyFormat(
5496       "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5497       "                                   : aaaaaaaaaaaaaaaaaaaaaa\n"
5498       "                      : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5499 
5500   FormatStyle NoBinPacking = getLLVMStyle();
5501   NoBinPacking.BinPackArguments = false;
5502   verifyFormat(
5503       "void f() {\n"
5504       "  g(aaa,\n"
5505       "    aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
5506       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5507       "        ? aaaaaaaaaaaaaaa\n"
5508       "        : aaaaaaaaaaaaaaa);\n"
5509       "}",
5510       NoBinPacking);
5511   verifyFormat(
5512       "void f() {\n"
5513       "  g(aaa,\n"
5514       "    aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
5515       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5516       "        ?: aaaaaaaaaaaaaaa);\n"
5517       "}",
5518       NoBinPacking);
5519 
5520   verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n"
5521                "             // comment.\n"
5522                "             ccccccccccccccccccccccccccccccccccccccc\n"
5523                "                 ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5524                "                 : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);");
5525 
5526   // Assignments in conditional expressions. Apparently not uncommon :-(.
5527   verifyFormat("return a != b\n"
5528                "           // comment\n"
5529                "           ? a = b\n"
5530                "           : a = b;");
5531   verifyFormat("return a != b\n"
5532                "           // comment\n"
5533                "           ? a = a != b\n"
5534                "                     // comment\n"
5535                "                     ? a = b\n"
5536                "                     : a\n"
5537                "           : a;\n");
5538   verifyFormat("return a != b\n"
5539                "           // comment\n"
5540                "           ? a\n"
5541                "           : a = a != b\n"
5542                "                     // comment\n"
5543                "                     ? a = b\n"
5544                "                     : a;");
5545 }
5546 
5547 TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {
5548   FormatStyle Style = getLLVMStyle();
5549   Style.BreakBeforeTernaryOperators = false;
5550   Style.ColumnLimit = 70;
5551   verifyFormat(
5552       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5553       "                               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5554       "                               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5555       Style);
5556   verifyFormat(
5557       "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
5558       "     aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5559       "                                  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5560       Style);
5561   verifyFormat(
5562       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5563       "                                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5564       Style);
5565   verifyFormat(
5566       "aaaa(aaaaaaaa, aaaaaaaaaa,\n"
5567       "     aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5568       "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5569       Style);
5570   verifyFormat(
5571       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n"
5572       "                                                      aaaaaaaaaaaaa);",
5573       Style);
5574   verifyFormat(
5575       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5576       "                   aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5577       "                                      aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5578       "                   aaaaaaaaaaaaa);",
5579       Style);
5580   verifyFormat(
5581       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5582       "                   aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5583       "                   aaaaaaaaaaaaa);",
5584       Style);
5585   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5586                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5587                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
5588                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5589                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5590                Style);
5591   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5592                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5593                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5594                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
5595                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5596                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5597                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5598                Style);
5599   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5600                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n"
5601                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5602                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5603                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5604                Style);
5605   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5606                "    aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5607                "    aaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5608                Style);
5609   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
5610                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5611                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5612                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5613                Style);
5614   verifyFormat(
5615       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5616       "    aaaaaaaaaaaaaaa :\n"
5617       "    aaaaaaaaaaaaaaa;",
5618       Style);
5619   verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
5620                "          aaaaaaaaa ?\n"
5621                "      b :\n"
5622                "      c);",
5623                Style);
5624   verifyFormat("unsigned Indent =\n"
5625                "    format(TheLine.First,\n"
5626                "           IndentForLevel[TheLine.Level] >= 0 ?\n"
5627                "               IndentForLevel[TheLine.Level] :\n"
5628                "               TheLine * 2,\n"
5629                "           TheLine.InPPDirective, PreviousEndOfLineColumn);",
5630                Style);
5631   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
5632                "                  aaaaaaaaaaaaaaa :\n"
5633                "                  bbbbbbbbbbbbbbb ? //\n"
5634                "                      ccccccccccccccc :\n"
5635                "                      ddddddddddddddd;",
5636                Style);
5637   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
5638                "                  aaaaaaaaaaaaaaa :\n"
5639                "                  (bbbbbbbbbbbbbbb ? //\n"
5640                "                       ccccccccccccccc :\n"
5641                "                       ddddddddddddddd);",
5642                Style);
5643   verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5644                "            /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n"
5645                "            ccccccccccccccccccccccccccc;",
5646                Style);
5647   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5648                "           aaaaa :\n"
5649                "           bbbbbbbbbbbbbbb + cccccccccccccccc;",
5650                Style);
5651 }
5652 
5653 TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
5654   verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
5655                "     aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
5656   verifyFormat("bool a = true, b = false;");
5657 
5658   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5659                "         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
5660                "     bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
5661                "         bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
5662   verifyFormat(
5663       "bool aaaaaaaaaaaaaaaaaaaaa =\n"
5664       "         bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
5665       "     d = e && f;");
5666   verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
5667                "          c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
5668   verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
5669                "          *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
5670   verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
5671                "          ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
5672 
5673   FormatStyle Style = getGoogleStyle();
5674   Style.PointerAlignment = FormatStyle::PAS_Left;
5675   Style.DerivePointerAlignment = false;
5676   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5677                "    *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
5678                "    *b = bbbbbbbbbbbbbbbbbbb;",
5679                Style);
5680   verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
5681                "          *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;",
5682                Style);
5683   verifyFormat("vector<int*> a, b;", Style);
5684   verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style);
5685 }
5686 
5687 TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
5688   verifyFormat("arr[foo ? bar : baz];");
5689   verifyFormat("f()[foo ? bar : baz];");
5690   verifyFormat("(a + b)[foo ? bar : baz];");
5691   verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
5692 }
5693 
5694 TEST_F(FormatTest, AlignsStringLiterals) {
5695   verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
5696                "                                      \"short literal\");");
5697   verifyFormat(
5698       "looooooooooooooooooooooooongFunction(\n"
5699       "    \"short literal\"\n"
5700       "    \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
5701   verifyFormat("someFunction(\"Always break between multi-line\"\n"
5702                "             \" string literals\",\n"
5703                "             and, other, parameters);");
5704   EXPECT_EQ("fun + \"1243\" /* comment */\n"
5705             "      \"5678\";",
5706             format("fun + \"1243\" /* comment */\n"
5707                    "    \"5678\";",
5708                    getLLVMStyleWithColumns(28)));
5709   EXPECT_EQ(
5710       "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
5711       "         \"aaaaaaaaaaaaaaaaaaaaa\"\n"
5712       "         \"aaaaaaaaaaaaaaaa\";",
5713       format("aaaaaa ="
5714              "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
5715              "aaaaaaaaaaaaaaaaaaaaa\" "
5716              "\"aaaaaaaaaaaaaaaa\";"));
5717   verifyFormat("a = a + \"a\"\n"
5718                "        \"a\"\n"
5719                "        \"a\";");
5720   verifyFormat("f(\"a\", \"b\"\n"
5721                "       \"c\");");
5722 
5723   verifyFormat(
5724       "#define LL_FORMAT \"ll\"\n"
5725       "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
5726       "       \"d, ddddddddd: %\" LL_FORMAT \"d\");");
5727 
5728   verifyFormat("#define A(X)          \\\n"
5729                "  \"aaaaa\" #X \"bbbbbb\" \\\n"
5730                "  \"ccccc\"",
5731                getLLVMStyleWithColumns(23));
5732   verifyFormat("#define A \"def\"\n"
5733                "f(\"abc\" A \"ghi\"\n"
5734                "  \"jkl\");");
5735 
5736   verifyFormat("f(L\"a\"\n"
5737                "  L\"b\");");
5738   verifyFormat("#define A(X)            \\\n"
5739                "  L\"aaaaa\" #X L\"bbbbbb\" \\\n"
5740                "  L\"ccccc\"",
5741                getLLVMStyleWithColumns(25));
5742 
5743   verifyFormat("f(@\"a\"\n"
5744                "  @\"b\");");
5745   verifyFormat("NSString s = @\"a\"\n"
5746                "             @\"b\"\n"
5747                "             @\"c\";");
5748   verifyFormat("NSString s = @\"a\"\n"
5749                "              \"b\"\n"
5750                "              \"c\";");
5751 }
5752 
5753 TEST_F(FormatTest, ReturnTypeBreakingStyle) {
5754   FormatStyle Style = getLLVMStyle();
5755   // No declarations or definitions should be moved to own line.
5756   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;
5757   verifyFormat("class A {\n"
5758                "  int f() { return 1; }\n"
5759                "  int g();\n"
5760                "};\n"
5761                "int f() { return 1; }\n"
5762                "int g();\n",
5763                Style);
5764 
5765   // All declarations and definitions should have the return type moved to its
5766   // own
5767   // line.
5768   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
5769   verifyFormat("class E {\n"
5770                "  int\n"
5771                "  f() {\n"
5772                "    return 1;\n"
5773                "  }\n"
5774                "  int\n"
5775                "  g();\n"
5776                "};\n"
5777                "int\n"
5778                "f() {\n"
5779                "  return 1;\n"
5780                "}\n"
5781                "int\n"
5782                "g();\n",
5783                Style);
5784 
5785   // Top-level definitions, and no kinds of declarations should have the
5786   // return type moved to its own line.
5787   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions;
5788   verifyFormat("class B {\n"
5789                "  int f() { return 1; }\n"
5790                "  int g();\n"
5791                "};\n"
5792                "int\n"
5793                "f() {\n"
5794                "  return 1;\n"
5795                "}\n"
5796                "int g();\n",
5797                Style);
5798 
5799   // Top-level definitions and declarations should have the return type moved
5800   // to its own line.
5801   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;
5802   verifyFormat("class C {\n"
5803                "  int f() { return 1; }\n"
5804                "  int g();\n"
5805                "};\n"
5806                "int\n"
5807                "f() {\n"
5808                "  return 1;\n"
5809                "}\n"
5810                "int\n"
5811                "g();\n",
5812                Style);
5813 
5814   // All definitions should have the return type moved to its own line, but no
5815   // kinds of declarations.
5816   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
5817   verifyFormat("class D {\n"
5818                "  int\n"
5819                "  f() {\n"
5820                "    return 1;\n"
5821                "  }\n"
5822                "  int g();\n"
5823                "};\n"
5824                "int\n"
5825                "f() {\n"
5826                "  return 1;\n"
5827                "}\n"
5828                "int g();\n",
5829                Style);
5830   verifyFormat("const char *\n"
5831                "f(void) {\n" // Break here.
5832                "  return \"\";\n"
5833                "}\n"
5834                "const char *bar(void);\n", // No break here.
5835                Style);
5836   verifyFormat("template <class T>\n"
5837                "T *\n"
5838                "f(T &c) {\n" // Break here.
5839                "  return NULL;\n"
5840                "}\n"
5841                "template <class T> T *f(T &c);\n", // No break here.
5842                Style);
5843   verifyFormat("class C {\n"
5844                "  int\n"
5845                "  operator+() {\n"
5846                "    return 1;\n"
5847                "  }\n"
5848                "  int\n"
5849                "  operator()() {\n"
5850                "    return 1;\n"
5851                "  }\n"
5852                "};\n",
5853                Style);
5854   verifyFormat("void\n"
5855                "A::operator()() {}\n"
5856                "void\n"
5857                "A::operator>>() {}\n"
5858                "void\n"
5859                "A::operator+() {}\n",
5860                Style);
5861   verifyFormat("void *operator new(std::size_t s);", // No break here.
5862                Style);
5863   verifyFormat("void *\n"
5864                "operator new(std::size_t s) {}",
5865                Style);
5866   verifyFormat("void *\n"
5867                "operator delete[](void *ptr) {}",
5868                Style);
5869   Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
5870   verifyFormat("const char *\n"
5871                "f(void)\n" // Break here.
5872                "{\n"
5873                "  return \"\";\n"
5874                "}\n"
5875                "const char *bar(void);\n", // No break here.
5876                Style);
5877   verifyFormat("template <class T>\n"
5878                "T *\n"     // Problem here: no line break
5879                "f(T &c)\n" // Break here.
5880                "{\n"
5881                "  return NULL;\n"
5882                "}\n"
5883                "template <class T> T *f(T &c);\n", // No break here.
5884                Style);
5885   verifyFormat("int\n"
5886                "foo(A<bool> a)\n"
5887                "{\n"
5888                "  return a;\n"
5889                "}\n",
5890                Style);
5891   verifyFormat("int\n"
5892                "foo(A<8> a)\n"
5893                "{\n"
5894                "  return a;\n"
5895                "}\n",
5896                Style);
5897   verifyFormat("int\n"
5898                "foo(A<B<bool>, 8> a)\n"
5899                "{\n"
5900                "  return a;\n"
5901                "}\n",
5902                Style);
5903   verifyFormat("int\n"
5904                "foo(A<B<8>, bool> a)\n"
5905                "{\n"
5906                "  return a;\n"
5907                "}\n",
5908                Style);
5909   verifyFormat("int\n"
5910                "foo(A<B<bool>, bool> a)\n"
5911                "{\n"
5912                "  return a;\n"
5913                "}\n",
5914                Style);
5915   verifyFormat("int\n"
5916                "foo(A<B<8>, 8> a)\n"
5917                "{\n"
5918                "  return a;\n"
5919                "}\n",
5920                Style);
5921 
5922   Style = getGNUStyle();
5923 
5924   // Test for comments at the end of function declarations.
5925   verifyFormat("void\n"
5926                "foo (int a, /*abc*/ int b) // def\n"
5927                "{\n"
5928                "}\n",
5929                Style);
5930 
5931   verifyFormat("void\n"
5932                "foo (int a, /* abc */ int b) /* def */\n"
5933                "{\n"
5934                "}\n",
5935                Style);
5936 
5937   // Definitions that should not break after return type
5938   verifyFormat("void foo (int a, int b); // def\n", Style);
5939   verifyFormat("void foo (int a, int b); /* def */\n", Style);
5940   verifyFormat("void foo (int a, int b);\n", Style);
5941 }
5942 
5943 TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
5944   FormatStyle NoBreak = getLLVMStyle();
5945   NoBreak.AlwaysBreakBeforeMultilineStrings = false;
5946   FormatStyle Break = getLLVMStyle();
5947   Break.AlwaysBreakBeforeMultilineStrings = true;
5948   verifyFormat("aaaa = \"bbbb\"\n"
5949                "       \"cccc\";",
5950                NoBreak);
5951   verifyFormat("aaaa =\n"
5952                "    \"bbbb\"\n"
5953                "    \"cccc\";",
5954                Break);
5955   verifyFormat("aaaa(\"bbbb\"\n"
5956                "     \"cccc\");",
5957                NoBreak);
5958   verifyFormat("aaaa(\n"
5959                "    \"bbbb\"\n"
5960                "    \"cccc\");",
5961                Break);
5962   verifyFormat("aaaa(qqq, \"bbbb\"\n"
5963                "          \"cccc\");",
5964                NoBreak);
5965   verifyFormat("aaaa(qqq,\n"
5966                "     \"bbbb\"\n"
5967                "     \"cccc\");",
5968                Break);
5969   verifyFormat("aaaa(qqq,\n"
5970                "     L\"bbbb\"\n"
5971                "     L\"cccc\");",
5972                Break);
5973   verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n"
5974                "                      \"bbbb\"));",
5975                Break);
5976   verifyFormat("string s = someFunction(\n"
5977                "    \"abc\"\n"
5978                "    \"abc\");",
5979                Break);
5980 
5981   // As we break before unary operators, breaking right after them is bad.
5982   verifyFormat("string foo = abc ? \"x\"\n"
5983                "                   \"blah blah blah blah blah blah\"\n"
5984                "                 : \"y\";",
5985                Break);
5986 
5987   // Don't break if there is no column gain.
5988   verifyFormat("f(\"aaaa\"\n"
5989                "  \"bbbb\");",
5990                Break);
5991 
5992   // Treat literals with escaped newlines like multi-line string literals.
5993   EXPECT_EQ("x = \"a\\\n"
5994             "b\\\n"
5995             "c\";",
5996             format("x = \"a\\\n"
5997                    "b\\\n"
5998                    "c\";",
5999                    NoBreak));
6000   EXPECT_EQ("xxxx =\n"
6001             "    \"a\\\n"
6002             "b\\\n"
6003             "c\";",
6004             format("xxxx = \"a\\\n"
6005                    "b\\\n"
6006                    "c\";",
6007                    Break));
6008 
6009   EXPECT_EQ("NSString *const kString =\n"
6010             "    @\"aaaa\"\n"
6011             "    @\"bbbb\";",
6012             format("NSString *const kString = @\"aaaa\"\n"
6013                    "@\"bbbb\";",
6014                    Break));
6015 
6016   Break.ColumnLimit = 0;
6017   verifyFormat("const char *hello = \"hello llvm\";", Break);
6018 }
6019 
6020 TEST_F(FormatTest, AlignsPipes) {
6021   verifyFormat(
6022       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6023       "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6024       "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
6025   verifyFormat(
6026       "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
6027       "                     << aaaaaaaaaaaaaaaaaaaa;");
6028   verifyFormat(
6029       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6030       "                                 << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
6031   verifyFormat(
6032       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
6033       "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
6034   verifyFormat(
6035       "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
6036       "                \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
6037       "             << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
6038   verifyFormat(
6039       "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6040       "                                 << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6041       "         << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
6042   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6043                "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6044                "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6045                "             << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
6046   verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n"
6047                "             << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);");
6048   verifyFormat(
6049       "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6050       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6051   verifyFormat(
6052       "auto Diag = diag() << aaaaaaaaaaaaaaaa(aaaaaaaaaaaa, aaaaaaaaaaaaa,\n"
6053       "                                       aaaaaaaaaaaaaaaaaaaaaaaaaa);");
6054 
6055   verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n"
6056                "             << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();");
6057   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6058                "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6059                "                    aaaaaaaaaaaaaaaaaaaaa)\n"
6060                "             << aaaaaaaaaaaaaaaaaaaaaaaaaa;");
6061   verifyFormat("LOG_IF(aaa == //\n"
6062                "       bbb)\n"
6063                "    << a << b;");
6064 
6065   // But sometimes, breaking before the first "<<" is desirable.
6066   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
6067                "    << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);");
6068   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n"
6069                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6070                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
6071   verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n"
6072                "    << BEF << IsTemplate << Description << E->getType();");
6073   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
6074                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6075                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6076   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
6077                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6078                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6079                "    << aaa;");
6080 
6081   verifyFormat(
6082       "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6083       "                    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
6084 
6085   // Incomplete string literal.
6086   EXPECT_EQ("llvm::errs() << \"\n"
6087             "             << a;",
6088             format("llvm::errs() << \"\n<<a;"));
6089 
6090   verifyFormat("void f() {\n"
6091                "  CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n"
6092                "      << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n"
6093                "}");
6094 
6095   // Handle 'endl'.
6096   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n"
6097                "             << bbbbbbbbbbbbbbbbbbbbbb << endl;");
6098   verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;");
6099 
6100   // Handle '\n'.
6101   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n"
6102                "             << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
6103   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n"
6104                "             << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';");
6105   verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n"
6106                "             << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";");
6107   verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
6108 }
6109 
6110 TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) {
6111   verifyFormat("return out << \"somepacket = {\\n\"\n"
6112                "           << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
6113                "           << \" bbbb = \" << pkt.bbbb << \"\\n\"\n"
6114                "           << \" cccccc = \" << pkt.cccccc << \"\\n\"\n"
6115                "           << \" ddd = [\" << pkt.ddd << \"]\\n\"\n"
6116                "           << \"}\";");
6117 
6118   verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
6119                "             << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
6120                "             << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;");
6121   verifyFormat(
6122       "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
6123       "             << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
6124       "             << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
6125       "             << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
6126       "             << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
6127   verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
6128                "             << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
6129   verifyFormat(
6130       "void f() {\n"
6131       "  llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n"
6132       "               << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
6133       "}");
6134 
6135   // Breaking before the first "<<" is generally not desirable.
6136   verifyFormat(
6137       "llvm::errs()\n"
6138       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6139       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6140       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6141       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
6142       getLLVMStyleWithColumns(70));
6143   verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n"
6144                "             << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6145                "             << \"aaaaaaaaaaaaaaaaaaa: \"\n"
6146                "             << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6147                "             << \"aaaaaaaaaaaaaaaaaaa: \"\n"
6148                "             << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
6149                getLLVMStyleWithColumns(70));
6150 
6151   verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
6152                "           \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
6153                "           \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;");
6154   verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
6155                "                  \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
6156                "                  \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);");
6157   verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n"
6158                "           (aaaa + aaaa);",
6159                getLLVMStyleWithColumns(40));
6160   verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n"
6161                "                  (aaaaaaa + aaaaa));",
6162                getLLVMStyleWithColumns(40));
6163   verifyFormat(
6164       "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n"
6165       "                  SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n"
6166       "                  bbbbbbbbbbbbbbbbbbbbbbb);");
6167 }
6168 
6169 TEST_F(FormatTest, UnderstandsEquals) {
6170   verifyFormat(
6171       "aaaaaaaaaaaaaaaaa =\n"
6172       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
6173   verifyFormat(
6174       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6175       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
6176   verifyFormat(
6177       "if (a) {\n"
6178       "  f();\n"
6179       "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6180       "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
6181       "}");
6182 
6183   verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6184                "        100000000 + 10000000) {\n}");
6185 }
6186 
6187 TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
6188   verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
6189                "    .looooooooooooooooooooooooooooooooooooooongFunction();");
6190 
6191   verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
6192                "    ->looooooooooooooooooooooooooooooooooooooongFunction();");
6193 
6194   verifyFormat(
6195       "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
6196       "                                                          Parameter2);");
6197 
6198   verifyFormat(
6199       "ShortObject->shortFunction(\n"
6200       "    LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
6201       "    LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
6202 
6203   verifyFormat("loooooooooooooongFunction(\n"
6204                "    LoooooooooooooongObject->looooooooooooooooongFunction());");
6205 
6206   verifyFormat(
6207       "function(LoooooooooooooooooooooooooooooooooooongObject\n"
6208       "             ->loooooooooooooooooooooooooooooooooooooooongFunction());");
6209 
6210   verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
6211                "    .WillRepeatedly(Return(SomeValue));");
6212   verifyFormat("void f() {\n"
6213                "  EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
6214                "      .Times(2)\n"
6215                "      .WillRepeatedly(Return(SomeValue));\n"
6216                "}");
6217   verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n"
6218                "    ccccccccccccccccccccccc);");
6219   verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6220                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6221                "          .aaaaa(aaaaa),\n"
6222                "      aaaaaaaaaaaaaaaaaaaaa);");
6223   verifyFormat("void f() {\n"
6224                "  aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6225                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n"
6226                "}");
6227   verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6228                "      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6229                "    .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6230                "                        aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6231                "                        aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
6232   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6233                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6234                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6235                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
6236                "}");
6237 
6238   // Here, it is not necessary to wrap at "." or "->".
6239   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
6240                "    aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
6241   verifyFormat(
6242       "aaaaaaaaaaa->aaaaaaaaa(\n"
6243       "    aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6244       "    aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
6245 
6246   verifyFormat(
6247       "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6248       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
6249   verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
6250                "                         aaaaaaaaa()->aaaaaa()->aaaaa());");
6251   verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
6252                "                         aaaaaaaaa()->aaaaaa()->aaaaa());");
6253 
6254   verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6255                "      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6256                "    .a();");
6257 
6258   FormatStyle NoBinPacking = getLLVMStyle();
6259   NoBinPacking.BinPackParameters = false;
6260   verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
6261                "    .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
6262                "    .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
6263                "                         aaaaaaaaaaaaaaaaaaa,\n"
6264                "                         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
6265                NoBinPacking);
6266 
6267   // If there is a subsequent call, change to hanging indentation.
6268   verifyFormat(
6269       "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6270       "                         aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n"
6271       "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
6272   verifyFormat(
6273       "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6274       "    aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));");
6275   verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6276                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6277                "                 .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
6278   verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6279                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6280                "               .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
6281 }
6282 
6283 TEST_F(FormatTest, WrapsTemplateDeclarations) {
6284   verifyFormat("template <typename T>\n"
6285                "virtual void loooooooooooongFunction(int Param1, int Param2);");
6286   verifyFormat("template <typename T>\n"
6287                "// T should be one of {A, B}.\n"
6288                "virtual void loooooooooooongFunction(int Param1, int Param2);");
6289   verifyFormat(
6290       "template <typename T>\n"
6291       "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
6292   verifyFormat("template <typename T>\n"
6293                "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
6294                "       int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
6295   verifyFormat(
6296       "template <typename T>\n"
6297       "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
6298       "                                      int Paaaaaaaaaaaaaaaaaaaaram2);");
6299   verifyFormat(
6300       "template <typename T>\n"
6301       "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
6302       "                    aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
6303       "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6304   verifyFormat("template <typename T>\n"
6305                "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6306                "    int aaaaaaaaaaaaaaaaaaaaaa);");
6307   verifyFormat(
6308       "template <typename T1, typename T2 = char, typename T3 = char,\n"
6309       "          typename T4 = char>\n"
6310       "void f();");
6311   verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n"
6312                "          template <typename> class cccccccccccccccccccccc,\n"
6313                "          typename ddddddddddddd>\n"
6314                "class C {};");
6315   verifyFormat(
6316       "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
6317       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6318 
6319   verifyFormat("void f() {\n"
6320                "  a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
6321                "      a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n"
6322                "}");
6323 
6324   verifyFormat("template <typename T> class C {};");
6325   verifyFormat("template <typename T> void f();");
6326   verifyFormat("template <typename T> void f() {}");
6327   verifyFormat(
6328       "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
6329       "              aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6330       "              aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n"
6331       "    new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
6332       "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6333       "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
6334       "        bbbbbbbbbbbbbbbbbbbbbbbb);",
6335       getLLVMStyleWithColumns(72));
6336   EXPECT_EQ("static_cast<A< //\n"
6337             "    B> *>(\n"
6338             "\n"
6339             ");",
6340             format("static_cast<A<//\n"
6341                    "    B>*>(\n"
6342                    "\n"
6343                    "    );"));
6344   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6345                "    const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);");
6346 
6347   FormatStyle AlwaysBreak = getLLVMStyle();
6348   AlwaysBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes;
6349   verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);
6350   verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);
6351   verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);
6352   verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6353                "                         bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
6354                "    ccccccccccccccccccccccccccccccccccccccccccccccc);");
6355   verifyFormat("template <template <typename> class Fooooooo,\n"
6356                "          template <typename> class Baaaaaaar>\n"
6357                "struct C {};",
6358                AlwaysBreak);
6359   verifyFormat("template <typename T> // T can be A, B or C.\n"
6360                "struct C {};",
6361                AlwaysBreak);
6362   verifyFormat("template <enum E> class A {\n"
6363                "public:\n"
6364                "  E *f();\n"
6365                "};");
6366 
6367   FormatStyle NeverBreak = getLLVMStyle();
6368   NeverBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_No;
6369   verifyFormat("template <typename T> class C {};", NeverBreak);
6370   verifyFormat("template <typename T> void f();", NeverBreak);
6371   verifyFormat("template <typename T> void f() {}", NeverBreak);
6372   verifyFormat("template <typename T>\nvoid foo(aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbb) {}",
6373                NeverBreak);
6374   verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6375                "                         bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
6376                "    ccccccccccccccccccccccccccccccccccccccccccccccc);",
6377                NeverBreak);
6378   verifyFormat("template <template <typename> class Fooooooo,\n"
6379                "          template <typename> class Baaaaaaar>\n"
6380                "struct C {};",
6381                NeverBreak);
6382   verifyFormat("template <typename T> // T can be A, B or C.\n"
6383                "struct C {};",
6384                NeverBreak);
6385   verifyFormat("template <enum E> class A {\n"
6386                "public:\n"
6387                "  E *f();\n"
6388                "};", NeverBreak);
6389   NeverBreak.PenaltyBreakTemplateDeclaration = 100;
6390   verifyFormat("template <typename T> void\nfoo(aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbb) {}",
6391                NeverBreak);
6392 }
6393 
6394 TEST_F(FormatTest, WrapsTemplateDeclarationsWithComments) {
6395   FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp);
6396   Style.ColumnLimit = 60;
6397   EXPECT_EQ("// Baseline - no comments.\n"
6398             "template <\n"
6399             "    typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n"
6400             "void f() {}",
6401             format("// Baseline - no comments.\n"
6402                    "template <\n"
6403                    "    typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n"
6404                    "void f() {}",
6405                    Style));
6406 
6407   EXPECT_EQ("template <\n"
6408             "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value>  // trailing\n"
6409             "void f() {}",
6410             format("template <\n"
6411                    "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n"
6412                    "void f() {}",
6413                    Style));
6414 
6415   EXPECT_EQ(
6416       "template <\n"
6417       "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value> /* line */\n"
6418       "void f() {}",
6419       format("template <typename aaaaaaaaaa<bbbbbbbbbbbb>::value>  /* line */\n"
6420              "void f() {}",
6421              Style));
6422 
6423   EXPECT_EQ(
6424       "template <\n"
6425       "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value>  // trailing\n"
6426       "                                               // multiline\n"
6427       "void f() {}",
6428       format("template <\n"
6429              "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n"
6430              "                                              // multiline\n"
6431              "void f() {}",
6432              Style));
6433 
6434   EXPECT_EQ(
6435       "template <typename aaaaaaaaaa<\n"
6436       "    bbbbbbbbbbbb>::value>  // trailing loooong\n"
6437       "void f() {}",
6438       format(
6439           "template <\n"
6440           "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing loooong\n"
6441           "void f() {}",
6442           Style));
6443 }
6444 
6445 TEST_F(FormatTest, WrapsTemplateParameters) {
6446   FormatStyle Style = getLLVMStyle();
6447   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
6448   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
6449   verifyFormat(
6450       "template <typename... a> struct q {};\n"
6451       "extern q<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
6452       "    aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
6453       "    y;",
6454       Style);
6455   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
6456   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
6457   verifyFormat(
6458       "template <typename... a> struct r {};\n"
6459       "extern r<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
6460       "    aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
6461       "    y;",
6462       Style);
6463   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
6464   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
6465   verifyFormat(
6466       "template <typename... a> struct s {};\n"
6467       "extern s<\n"
6468       "    aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
6469       "    aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
6470       "    y;",
6471       Style);
6472   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
6473   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
6474   verifyFormat(
6475       "template <typename... a> struct t {};\n"
6476       "extern t<\n"
6477       "    aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
6478       "    aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
6479       "    y;",
6480       Style);
6481 }
6482 
6483 TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
6484   verifyFormat(
6485       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6486       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
6487   verifyFormat(
6488       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6489       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6490       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
6491 
6492   // FIXME: Should we have the extra indent after the second break?
6493   verifyFormat(
6494       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6495       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6496       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
6497 
6498   verifyFormat(
6499       "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
6500       "                    cccccccccccccccccccccccccccccccccccccccccccccc());");
6501 
6502   // Breaking at nested name specifiers is generally not desirable.
6503   verifyFormat(
6504       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6505       "    aaaaaaaaaaaaaaaaaaaaaaa);");
6506 
6507   verifyFormat(
6508       "aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n"
6509       "                   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6510       "                       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6511       "                   aaaaaaaaaaaaaaaaaaaaa);",
6512       getLLVMStyleWithColumns(74));
6513 
6514   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6515                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6516                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
6517 }
6518 
6519 TEST_F(FormatTest, UnderstandsTemplateParameters) {
6520   verifyFormat("A<int> a;");
6521   verifyFormat("A<A<A<int>>> a;");
6522   verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
6523   verifyFormat("bool x = a < 1 || 2 > a;");
6524   verifyFormat("bool x = 5 < f<int>();");
6525   verifyFormat("bool x = f<int>() > 5;");
6526   verifyFormat("bool x = 5 < a<int>::x;");
6527   verifyFormat("bool x = a < 4 ? a > 2 : false;");
6528   verifyFormat("bool x = f() ? a < 2 : a > 2;");
6529 
6530   verifyGoogleFormat("A<A<int>> a;");
6531   verifyGoogleFormat("A<A<A<int>>> a;");
6532   verifyGoogleFormat("A<A<A<A<int>>>> a;");
6533   verifyGoogleFormat("A<A<int> > a;");
6534   verifyGoogleFormat("A<A<A<int> > > a;");
6535   verifyGoogleFormat("A<A<A<A<int> > > > a;");
6536   verifyGoogleFormat("A<::A<int>> a;");
6537   verifyGoogleFormat("A<::A> a;");
6538   verifyGoogleFormat("A< ::A> a;");
6539   verifyGoogleFormat("A< ::A<int> > a;");
6540   EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
6541   EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
6542   EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle()));
6543   EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle()));
6544   EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };",
6545             format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle()));
6546 
6547   verifyFormat("A<A>> a;", getChromiumStyle(FormatStyle::LK_Cpp));
6548 
6549   verifyFormat("test >> a >> b;");
6550   verifyFormat("test << a >> b;");
6551 
6552   verifyFormat("f<int>();");
6553   verifyFormat("template <typename T> void f() {}");
6554   verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;");
6555   verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : "
6556                "sizeof(char)>::type>;");
6557   verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};");
6558   verifyFormat("f(a.operator()<A>());");
6559   verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6560                "      .template operator()<A>());",
6561                getLLVMStyleWithColumns(35));
6562 
6563   // Not template parameters.
6564   verifyFormat("return a < b && c > d;");
6565   verifyFormat("void f() {\n"
6566                "  while (a < b && c > d) {\n"
6567                "  }\n"
6568                "}");
6569   verifyFormat("template <typename... Types>\n"
6570                "typename enable_if<0 < sizeof...(Types)>::type Foo() {}");
6571 
6572   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6573                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);",
6574                getLLVMStyleWithColumns(60));
6575   verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");");
6576   verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}");
6577   verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <");
6578 }
6579 
6580 TEST_F(FormatTest, BitshiftOperatorWidth) {
6581   EXPECT_EQ("int a = 1 << 2; /* foo\n"
6582             "                   bar */",
6583             format("int    a=1<<2;  /* foo\n"
6584                    "                   bar */"));
6585 
6586   EXPECT_EQ("int b = 256 >> 1; /* foo\n"
6587             "                     bar */",
6588             format("int  b  =256>>1 ;  /* foo\n"
6589                    "                      bar */"));
6590 }
6591 
6592 TEST_F(FormatTest, UnderstandsBinaryOperators) {
6593   verifyFormat("COMPARE(a, ==, b);");
6594   verifyFormat("auto s = sizeof...(Ts) - 1;");
6595 }
6596 
6597 TEST_F(FormatTest, UnderstandsPointersToMembers) {
6598   verifyFormat("int A::*x;");
6599   verifyFormat("int (S::*func)(void *);");
6600   verifyFormat("void f() { int (S::*func)(void *); }");
6601   verifyFormat("typedef bool *(Class::*Member)() const;");
6602   verifyFormat("void f() {\n"
6603                "  (a->*f)();\n"
6604                "  a->*x;\n"
6605                "  (a.*f)();\n"
6606                "  ((*a).*f)();\n"
6607                "  a.*x;\n"
6608                "}");
6609   verifyFormat("void f() {\n"
6610                "  (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
6611                "      aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
6612                "}");
6613   verifyFormat(
6614       "(aaaaaaaaaa->*bbbbbbb)(\n"
6615       "    aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
6616   FormatStyle Style = getLLVMStyle();
6617   Style.PointerAlignment = FormatStyle::PAS_Left;
6618   verifyFormat("typedef bool* (Class::*Member)() const;", Style);
6619 }
6620 
6621 TEST_F(FormatTest, UnderstandsUnaryOperators) {
6622   verifyFormat("int a = -2;");
6623   verifyFormat("f(-1, -2, -3);");
6624   verifyFormat("a[-1] = 5;");
6625   verifyFormat("int a = 5 + -2;");
6626   verifyFormat("if (i == -1) {\n}");
6627   verifyFormat("if (i != -1) {\n}");
6628   verifyFormat("if (i > -1) {\n}");
6629   verifyFormat("if (i < -1) {\n}");
6630   verifyFormat("++(a->f());");
6631   verifyFormat("--(a->f());");
6632   verifyFormat("(a->f())++;");
6633   verifyFormat("a[42]++;");
6634   verifyFormat("if (!(a->f())) {\n}");
6635   verifyFormat("if (!+i) {\n}");
6636   verifyFormat("~&a;");
6637 
6638   verifyFormat("a-- > b;");
6639   verifyFormat("b ? -a : c;");
6640   verifyFormat("n * sizeof char16;");
6641   verifyFormat("n * alignof char16;", getGoogleStyle());
6642   verifyFormat("sizeof(char);");
6643   verifyFormat("alignof(char);", getGoogleStyle());
6644 
6645   verifyFormat("return -1;");
6646   verifyFormat("switch (a) {\n"
6647                "case -1:\n"
6648                "  break;\n"
6649                "}");
6650   verifyFormat("#define X -1");
6651   verifyFormat("#define X -kConstant");
6652 
6653   verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};");
6654   verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};");
6655 
6656   verifyFormat("int a = /* confusing comment */ -1;");
6657   // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
6658   verifyFormat("int a = i /* confusing comment */++;");
6659 }
6660 
6661 TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) {
6662   verifyFormat("if (!aaaaaaaaaa( // break\n"
6663                "        aaaaa)) {\n"
6664                "}");
6665   verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
6666                "    aaaaa));");
6667   verifyFormat("*aaa = aaaaaaa( // break\n"
6668                "    bbbbbb);");
6669 }
6670 
6671 TEST_F(FormatTest, UnderstandsOverloadedOperators) {
6672   verifyFormat("bool operator<();");
6673   verifyFormat("bool operator>();");
6674   verifyFormat("bool operator=();");
6675   verifyFormat("bool operator==();");
6676   verifyFormat("bool operator!=();");
6677   verifyFormat("int operator+();");
6678   verifyFormat("int operator++();");
6679   verifyFormat("int operator++(int) volatile noexcept;");
6680   verifyFormat("bool operator,();");
6681   verifyFormat("bool operator();");
6682   verifyFormat("bool operator()();");
6683   verifyFormat("bool operator[]();");
6684   verifyFormat("operator bool();");
6685   verifyFormat("operator int();");
6686   verifyFormat("operator void *();");
6687   verifyFormat("operator SomeType<int>();");
6688   verifyFormat("operator SomeType<int, int>();");
6689   verifyFormat("operator SomeType<SomeType<int>>();");
6690   verifyFormat("void *operator new(std::size_t size);");
6691   verifyFormat("void *operator new[](std::size_t size);");
6692   verifyFormat("void operator delete(void *ptr);");
6693   verifyFormat("void operator delete[](void *ptr);");
6694   verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
6695                "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
6696   verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n"
6697                "    aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;");
6698 
6699   verifyFormat(
6700       "ostream &operator<<(ostream &OutputStream,\n"
6701       "                    SomeReallyLongType WithSomeReallyLongValue);");
6702   verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
6703                "               const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
6704                "  return left.group < right.group;\n"
6705                "}");
6706   verifyFormat("SomeType &operator=(const SomeType &S);");
6707   verifyFormat("f.template operator()<int>();");
6708 
6709   verifyGoogleFormat("operator void*();");
6710   verifyGoogleFormat("operator SomeType<SomeType<int>>();");
6711   verifyGoogleFormat("operator ::A();");
6712 
6713   verifyFormat("using A::operator+;");
6714   verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n"
6715                "int i;");
6716 }
6717 
6718 TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
6719   verifyFormat("Deleted &operator=(const Deleted &) & = default;");
6720   verifyFormat("Deleted &operator=(const Deleted &) && = delete;");
6721   verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;");
6722   verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;");
6723   verifyFormat("Deleted &operator=(const Deleted &) &;");
6724   verifyFormat("Deleted &operator=(const Deleted &) &&;");
6725   verifyFormat("SomeType MemberFunction(const Deleted &) &;");
6726   verifyFormat("SomeType MemberFunction(const Deleted &) &&;");
6727   verifyFormat("SomeType MemberFunction(const Deleted &) && {}");
6728   verifyFormat("SomeType MemberFunction(const Deleted &) && final {}");
6729   verifyFormat("SomeType MemberFunction(const Deleted &) && override {}");
6730   verifyFormat("void Fn(T const &) const &;");
6731   verifyFormat("void Fn(T const volatile &&) const volatile &&;");
6732   verifyFormat("template <typename T>\n"
6733                "void F(T) && = delete;",
6734                getGoogleStyle());
6735 
6736   FormatStyle AlignLeft = getLLVMStyle();
6737   AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
6738   verifyFormat("void A::b() && {}", AlignLeft);
6739   verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
6740   verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
6741                AlignLeft);
6742   verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
6743   verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
6744   verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
6745   verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
6746   verifyFormat("auto Function(T) & -> void {}", AlignLeft);
6747   verifyFormat("auto Function(T) & -> void;", AlignLeft);
6748   verifyFormat("void Fn(T const&) const&;", AlignLeft);
6749   verifyFormat("void Fn(T const volatile&&) const volatile&&;", AlignLeft);
6750 
6751   FormatStyle Spaces = getLLVMStyle();
6752   Spaces.SpacesInCStyleCastParentheses = true;
6753   verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
6754   verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
6755   verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
6756   verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
6757 
6758   Spaces.SpacesInCStyleCastParentheses = false;
6759   Spaces.SpacesInParentheses = true;
6760   verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
6761   verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", Spaces);
6762   verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
6763   verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
6764 }
6765 
6766 TEST_F(FormatTest, UnderstandsNewAndDelete) {
6767   verifyFormat("void f() {\n"
6768                "  A *a = new A;\n"
6769                "  A *a = new (placement) A;\n"
6770                "  delete a;\n"
6771                "  delete (A *)a;\n"
6772                "}");
6773   verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
6774                "    typename aaaaaaaaaaaaaaaaaaaaaaaa();");
6775   verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6776                "    new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
6777                "        typename aaaaaaaaaaaaaaaaaaaaaaaa();");
6778   verifyFormat("delete[] h->p;");
6779 }
6780 
6781 TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
6782   verifyFormat("int *f(int *a) {}");
6783   verifyFormat("int main(int argc, char **argv) {}");
6784   verifyFormat("Test::Test(int b) : a(b * b) {}");
6785   verifyIndependentOfContext("f(a, *a);");
6786   verifyFormat("void g() { f(*a); }");
6787   verifyIndependentOfContext("int a = b * 10;");
6788   verifyIndependentOfContext("int a = 10 * b;");
6789   verifyIndependentOfContext("int a = b * c;");
6790   verifyIndependentOfContext("int a += b * c;");
6791   verifyIndependentOfContext("int a -= b * c;");
6792   verifyIndependentOfContext("int a *= b * c;");
6793   verifyIndependentOfContext("int a /= b * c;");
6794   verifyIndependentOfContext("int a = *b;");
6795   verifyIndependentOfContext("int a = *b * c;");
6796   verifyIndependentOfContext("int a = b * *c;");
6797   verifyIndependentOfContext("int a = b * (10);");
6798   verifyIndependentOfContext("S << b * (10);");
6799   verifyIndependentOfContext("return 10 * b;");
6800   verifyIndependentOfContext("return *b * *c;");
6801   verifyIndependentOfContext("return a & ~b;");
6802   verifyIndependentOfContext("f(b ? *c : *d);");
6803   verifyIndependentOfContext("int a = b ? *c : *d;");
6804   verifyIndependentOfContext("*b = a;");
6805   verifyIndependentOfContext("a * ~b;");
6806   verifyIndependentOfContext("a * !b;");
6807   verifyIndependentOfContext("a * +b;");
6808   verifyIndependentOfContext("a * -b;");
6809   verifyIndependentOfContext("a * ++b;");
6810   verifyIndependentOfContext("a * --b;");
6811   verifyIndependentOfContext("a[4] * b;");
6812   verifyIndependentOfContext("a[a * a] = 1;");
6813   verifyIndependentOfContext("f() * b;");
6814   verifyIndependentOfContext("a * [self dostuff];");
6815   verifyIndependentOfContext("int x = a * (a + b);");
6816   verifyIndependentOfContext("(a *)(a + b);");
6817   verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
6818   verifyIndependentOfContext("int *pa = (int *)&a;");
6819   verifyIndependentOfContext("return sizeof(int **);");
6820   verifyIndependentOfContext("return sizeof(int ******);");
6821   verifyIndependentOfContext("return (int **&)a;");
6822   verifyIndependentOfContext("f((*PointerToArray)[10]);");
6823   verifyFormat("void f(Type (*parameter)[10]) {}");
6824   verifyFormat("void f(Type (&parameter)[10]) {}");
6825   verifyGoogleFormat("return sizeof(int**);");
6826   verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
6827   verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
6828   verifyFormat("auto a = [](int **&, int ***) {};");
6829   verifyFormat("auto PointerBinding = [](const char *S) {};");
6830   verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
6831   verifyFormat("[](const decltype(*a) &value) {}");
6832   verifyFormat("decltype(a * b) F();");
6833   verifyFormat("#define MACRO() [](A *a) { return 1; }");
6834   verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
6835   verifyIndependentOfContext("typedef void (*f)(int *a);");
6836   verifyIndependentOfContext("int i{a * b};");
6837   verifyIndependentOfContext("aaa && aaa->f();");
6838   verifyIndependentOfContext("int x = ~*p;");
6839   verifyFormat("Constructor() : a(a), area(width * height) {}");
6840   verifyFormat("Constructor() : a(a), area(a, width * height) {}");
6841   verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
6842   verifyFormat("void f() { f(a, c * d); }");
6843   verifyFormat("void f() { f(new a(), c * d); }");
6844   verifyFormat("void f(const MyOverride &override);");
6845   verifyFormat("void f(const MyFinal &final);");
6846   verifyIndependentOfContext("bool a = f() && override.f();");
6847   verifyIndependentOfContext("bool a = f() && final.f();");
6848 
6849   verifyIndependentOfContext("InvalidRegions[*R] = 0;");
6850 
6851   verifyIndependentOfContext("A<int *> a;");
6852   verifyIndependentOfContext("A<int **> a;");
6853   verifyIndependentOfContext("A<int *, int *> a;");
6854   verifyIndependentOfContext("A<int *[]> a;");
6855   verifyIndependentOfContext(
6856       "const char *const p = reinterpret_cast<const char *const>(q);");
6857   verifyIndependentOfContext("A<int **, int **> a;");
6858   verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
6859   verifyFormat("for (char **a = b; *a; ++a) {\n}");
6860   verifyFormat("for (; a && b;) {\n}");
6861   verifyFormat("bool foo = true && [] { return false; }();");
6862 
6863   verifyFormat(
6864       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6865       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6866 
6867   verifyGoogleFormat("int const* a = &b;");
6868   verifyGoogleFormat("**outparam = 1;");
6869   verifyGoogleFormat("*outparam = a * b;");
6870   verifyGoogleFormat("int main(int argc, char** argv) {}");
6871   verifyGoogleFormat("A<int*> a;");
6872   verifyGoogleFormat("A<int**> a;");
6873   verifyGoogleFormat("A<int*, int*> a;");
6874   verifyGoogleFormat("A<int**, int**> a;");
6875   verifyGoogleFormat("f(b ? *c : *d);");
6876   verifyGoogleFormat("int a = b ? *c : *d;");
6877   verifyGoogleFormat("Type* t = **x;");
6878   verifyGoogleFormat("Type* t = *++*x;");
6879   verifyGoogleFormat("*++*x;");
6880   verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
6881   verifyGoogleFormat("Type* t = x++ * y;");
6882   verifyGoogleFormat(
6883       "const char* const p = reinterpret_cast<const char* const>(q);");
6884   verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
6885   verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
6886   verifyGoogleFormat("template <typename T>\n"
6887                      "void f(int i = 0, SomeType** temps = NULL);");
6888 
6889   FormatStyle Left = getLLVMStyle();
6890   Left.PointerAlignment = FormatStyle::PAS_Left;
6891   verifyFormat("x = *a(x) = *a(y);", Left);
6892   verifyFormat("for (;; *a = b) {\n}", Left);
6893   verifyFormat("return *this += 1;", Left);
6894   verifyFormat("throw *x;", Left);
6895   verifyFormat("delete *x;", Left);
6896   verifyFormat("typedef typeof(int(int, int))* MyFuncPtr;", Left);
6897   verifyFormat("[](const decltype(*a)* ptr) {}", Left);
6898   verifyFormat("typedef typeof /*comment*/ (int(int, int))* MyFuncPtr;", Left);
6899 
6900   verifyIndependentOfContext("a = *(x + y);");
6901   verifyIndependentOfContext("a = &(x + y);");
6902   verifyIndependentOfContext("*(x + y).call();");
6903   verifyIndependentOfContext("&(x + y)->call();");
6904   verifyFormat("void f() { &(*I).first; }");
6905 
6906   verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
6907   verifyFormat(
6908       "int *MyValues = {\n"
6909       "    *A, // Operator detection might be confused by the '{'\n"
6910       "    *BB // Operator detection might be confused by previous comment\n"
6911       "};");
6912 
6913   verifyIndependentOfContext("if (int *a = &b)");
6914   verifyIndependentOfContext("if (int &a = *b)");
6915   verifyIndependentOfContext("if (a & b[i])");
6916   verifyIndependentOfContext("if (a::b::c::d & b[i])");
6917   verifyIndependentOfContext("if (*b[i])");
6918   verifyIndependentOfContext("if (int *a = (&b))");
6919   verifyIndependentOfContext("while (int *a = &b)");
6920   verifyIndependentOfContext("size = sizeof *a;");
6921   verifyIndependentOfContext("if (a && (b = c))");
6922   verifyFormat("void f() {\n"
6923                "  for (const int &v : Values) {\n"
6924                "  }\n"
6925                "}");
6926   verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
6927   verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
6928   verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
6929 
6930   verifyFormat("#define A (!a * b)");
6931   verifyFormat("#define MACRO     \\\n"
6932                "  int *i = a * b; \\\n"
6933                "  void f(a *b);",
6934                getLLVMStyleWithColumns(19));
6935 
6936   verifyIndependentOfContext("A = new SomeType *[Length];");
6937   verifyIndependentOfContext("A = new SomeType *[Length]();");
6938   verifyIndependentOfContext("T **t = new T *;");
6939   verifyIndependentOfContext("T **t = new T *();");
6940   verifyGoogleFormat("A = new SomeType*[Length]();");
6941   verifyGoogleFormat("A = new SomeType*[Length];");
6942   verifyGoogleFormat("T** t = new T*;");
6943   verifyGoogleFormat("T** t = new T*();");
6944 
6945   verifyFormat("STATIC_ASSERT((a & b) == 0);");
6946   verifyFormat("STATIC_ASSERT(0 == (a & b));");
6947   verifyFormat("template <bool a, bool b> "
6948                "typename t::if<x && y>::type f() {}");
6949   verifyFormat("template <int *y> f() {}");
6950   verifyFormat("vector<int *> v;");
6951   verifyFormat("vector<int *const> v;");
6952   verifyFormat("vector<int *const **const *> v;");
6953   verifyFormat("vector<int *volatile> v;");
6954   verifyFormat("vector<a * b> v;");
6955   verifyFormat("foo<b && false>();");
6956   verifyFormat("foo<b & 1>();");
6957   verifyFormat("decltype(*::std::declval<const T &>()) void F();");
6958   verifyFormat(
6959       "template <class T, class = typename std::enable_if<\n"
6960       "                       std::is_integral<T>::value &&\n"
6961       "                       (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
6962       "void F();",
6963       getLLVMStyleWithColumns(70));
6964   verifyFormat(
6965       "template <class T,\n"
6966       "          class = typename std::enable_if<\n"
6967       "              std::is_integral<T>::value &&\n"
6968       "              (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n"
6969       "          class U>\n"
6970       "void F();",
6971       getLLVMStyleWithColumns(70));
6972   verifyFormat(
6973       "template <class T,\n"
6974       "          class = typename ::std::enable_if<\n"
6975       "              ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
6976       "void F();",
6977       getGoogleStyleWithColumns(68));
6978 
6979   verifyIndependentOfContext("MACRO(int *i);");
6980   verifyIndependentOfContext("MACRO(auto *a);");
6981   verifyIndependentOfContext("MACRO(const A *a);");
6982   verifyIndependentOfContext("MACRO(A *const a);");
6983   verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
6984   verifyFormat("void f() { f(float{1}, a * a); }");
6985   // FIXME: Is there a way to make this work?
6986   // verifyIndependentOfContext("MACRO(A *a);");
6987 
6988   verifyFormat("DatumHandle const *operator->() const { return input_; }");
6989   verifyFormat("return options != nullptr && operator==(*options);");
6990 
6991   EXPECT_EQ("#define OP(x)                                    \\\n"
6992             "  ostream &operator<<(ostream &s, const A &a) {  \\\n"
6993             "    return s << a.DebugString();                 \\\n"
6994             "  }",
6995             format("#define OP(x) \\\n"
6996                    "  ostream &operator<<(ostream &s, const A &a) { \\\n"
6997                    "    return s << a.DebugString(); \\\n"
6998                    "  }",
6999                    getLLVMStyleWithColumns(50)));
7000 
7001   // FIXME: We cannot handle this case yet; we might be able to figure out that
7002   // foo<x> d > v; doesn't make sense.
7003   verifyFormat("foo<a<b && c> d> v;");
7004 
7005   FormatStyle PointerMiddle = getLLVMStyle();
7006   PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
7007   verifyFormat("delete *x;", PointerMiddle);
7008   verifyFormat("int * x;", PointerMiddle);
7009   verifyFormat("int *[] x;", PointerMiddle);
7010   verifyFormat("template <int * y> f() {}", PointerMiddle);
7011   verifyFormat("int * f(int * a) {}", PointerMiddle);
7012   verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
7013   verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
7014   verifyFormat("A<int *> a;", PointerMiddle);
7015   verifyFormat("A<int **> a;", PointerMiddle);
7016   verifyFormat("A<int *, int *> a;", PointerMiddle);
7017   verifyFormat("A<int *[]> a;", PointerMiddle);
7018   verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
7019   verifyFormat("A = new SomeType *[Length];", PointerMiddle);
7020   verifyFormat("T ** t = new T *;", PointerMiddle);
7021 
7022   // Member function reference qualifiers aren't binary operators.
7023   verifyFormat("string // break\n"
7024                "operator()() & {}");
7025   verifyFormat("string // break\n"
7026                "operator()() && {}");
7027   verifyGoogleFormat("template <typename T>\n"
7028                      "auto x() & -> int {}");
7029 }
7030 
7031 TEST_F(FormatTest, UnderstandsAttributes) {
7032   verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
7033   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
7034                "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
7035   FormatStyle AfterType = getLLVMStyle();
7036   AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
7037   verifyFormat("__attribute__((nodebug)) void\n"
7038                "foo() {}\n",
7039                AfterType);
7040 }
7041 
7042 TEST_F(FormatTest, UnderstandsSquareAttributes) {
7043   verifyFormat("SomeType s [[unused]] (InitValue);");
7044   verifyFormat("SomeType s [[gnu::unused]] (InitValue);");
7045   verifyFormat("SomeType s [[using gnu: unused]] (InitValue);");
7046   verifyFormat("[[gsl::suppress(\"clang-tidy-check-name\")]] void f() {}");
7047   verifyFormat("void f() [[deprecated(\"so sorry\")]];");
7048   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7049                "    [[unused]] aaaaaaaaaaaaaaaaaaaaaaa(int i);");
7050 
7051   // Make sure we do not mistake attributes for array subscripts.
7052   verifyFormat("int a() {}\n"
7053                "[[unused]] int b() {}\n");
7054   verifyFormat("NSArray *arr;\n"
7055                "arr[[Foo() bar]];");
7056 
7057   // On the other hand, we still need to correctly find array subscripts.
7058   verifyFormat("int a = std::vector<int>{1, 2, 3}[0];");
7059 
7060   // Make sure that we do not mistake Objective-C method inside array literals
7061   // as attributes, even if those method names are also keywords.
7062   verifyFormat("@[ [foo bar] ];");
7063   verifyFormat("@[ [NSArray class] ];");
7064   verifyFormat("@[ [foo enum] ];");
7065 
7066   // Make sure we do not parse attributes as lambda introducers.
7067   FormatStyle MultiLineFunctions = getLLVMStyle();
7068   MultiLineFunctions.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
7069   verifyFormat("[[unused]] int b() {\n"
7070                "  return 42;\n"
7071                "}\n",
7072                MultiLineFunctions);
7073 }
7074 
7075 TEST_F(FormatTest, UnderstandsEllipsis) {
7076   verifyFormat("int printf(const char *fmt, ...);");
7077   verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
7078   verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
7079 
7080   FormatStyle PointersLeft = getLLVMStyle();
7081   PointersLeft.PointerAlignment = FormatStyle::PAS_Left;
7082   verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
7083 }
7084 
7085 TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
7086   EXPECT_EQ("int *a;\n"
7087             "int *a;\n"
7088             "int *a;",
7089             format("int *a;\n"
7090                    "int* a;\n"
7091                    "int *a;",
7092                    getGoogleStyle()));
7093   EXPECT_EQ("int* a;\n"
7094             "int* a;\n"
7095             "int* a;",
7096             format("int* a;\n"
7097                    "int* a;\n"
7098                    "int *a;",
7099                    getGoogleStyle()));
7100   EXPECT_EQ("int *a;\n"
7101             "int *a;\n"
7102             "int *a;",
7103             format("int *a;\n"
7104                    "int * a;\n"
7105                    "int *  a;",
7106                    getGoogleStyle()));
7107   EXPECT_EQ("auto x = [] {\n"
7108             "  int *a;\n"
7109             "  int *a;\n"
7110             "  int *a;\n"
7111             "};",
7112             format("auto x=[]{int *a;\n"
7113                    "int * a;\n"
7114                    "int *  a;};",
7115                    getGoogleStyle()));
7116 }
7117 
7118 TEST_F(FormatTest, UnderstandsRvalueReferences) {
7119   verifyFormat("int f(int &&a) {}");
7120   verifyFormat("int f(int a, char &&b) {}");
7121   verifyFormat("void f() { int &&a = b; }");
7122   verifyGoogleFormat("int f(int a, char&& b) {}");
7123   verifyGoogleFormat("void f() { int&& a = b; }");
7124 
7125   verifyIndependentOfContext("A<int &&> a;");
7126   verifyIndependentOfContext("A<int &&, int &&> a;");
7127   verifyGoogleFormat("A<int&&> a;");
7128   verifyGoogleFormat("A<int&&, int&&> a;");
7129 
7130   // Not rvalue references:
7131   verifyFormat("template <bool B, bool C> class A {\n"
7132                "  static_assert(B && C, \"Something is wrong\");\n"
7133                "};");
7134   verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
7135   verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
7136   verifyFormat("#define A(a, b) (a && b)");
7137 }
7138 
7139 TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
7140   verifyFormat("void f() {\n"
7141                "  x[aaaaaaaaa -\n"
7142                "    b] = 23;\n"
7143                "}",
7144                getLLVMStyleWithColumns(15));
7145 }
7146 
7147 TEST_F(FormatTest, FormatsCasts) {
7148   verifyFormat("Type *A = static_cast<Type *>(P);");
7149   verifyFormat("Type *A = (Type *)P;");
7150   verifyFormat("Type *A = (vector<Type *, int *>)P;");
7151   verifyFormat("int a = (int)(2.0f);");
7152   verifyFormat("int a = (int)2.0f;");
7153   verifyFormat("x[(int32)y];");
7154   verifyFormat("x = (int32)y;");
7155   verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
7156   verifyFormat("int a = (int)*b;");
7157   verifyFormat("int a = (int)2.0f;");
7158   verifyFormat("int a = (int)~0;");
7159   verifyFormat("int a = (int)++a;");
7160   verifyFormat("int a = (int)sizeof(int);");
7161   verifyFormat("int a = (int)+2;");
7162   verifyFormat("my_int a = (my_int)2.0f;");
7163   verifyFormat("my_int a = (my_int)sizeof(int);");
7164   verifyFormat("return (my_int)aaa;");
7165   verifyFormat("#define x ((int)-1)");
7166   verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
7167   verifyFormat("#define p(q) ((int *)&q)");
7168   verifyFormat("fn(a)(b) + 1;");
7169 
7170   verifyFormat("void f() { my_int a = (my_int)*b; }");
7171   verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
7172   verifyFormat("my_int a = (my_int)~0;");
7173   verifyFormat("my_int a = (my_int)++a;");
7174   verifyFormat("my_int a = (my_int)-2;");
7175   verifyFormat("my_int a = (my_int)1;");
7176   verifyFormat("my_int a = (my_int *)1;");
7177   verifyFormat("my_int a = (const my_int)-1;");
7178   verifyFormat("my_int a = (const my_int *)-1;");
7179   verifyFormat("my_int a = (my_int)(my_int)-1;");
7180   verifyFormat("my_int a = (ns::my_int)-2;");
7181   verifyFormat("case (my_int)ONE:");
7182   verifyFormat("auto x = (X)this;");
7183 
7184   // FIXME: single value wrapped with paren will be treated as cast.
7185   verifyFormat("void f(int i = (kValue)*kMask) {}");
7186 
7187   verifyFormat("{ (void)F; }");
7188 
7189   // Don't break after a cast's
7190   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7191                "    (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
7192                "                                   bbbbbbbbbbbbbbbbbbbbbb);");
7193 
7194   // These are not casts.
7195   verifyFormat("void f(int *) {}");
7196   verifyFormat("f(foo)->b;");
7197   verifyFormat("f(foo).b;");
7198   verifyFormat("f(foo)(b);");
7199   verifyFormat("f(foo)[b];");
7200   verifyFormat("[](foo) { return 4; }(bar);");
7201   verifyFormat("(*funptr)(foo)[4];");
7202   verifyFormat("funptrs[4](foo)[4];");
7203   verifyFormat("void f(int *);");
7204   verifyFormat("void f(int *) = 0;");
7205   verifyFormat("void f(SmallVector<int>) {}");
7206   verifyFormat("void f(SmallVector<int>);");
7207   verifyFormat("void f(SmallVector<int>) = 0;");
7208   verifyFormat("void f(int i = (kA * kB) & kMask) {}");
7209   verifyFormat("int a = sizeof(int) * b;");
7210   verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
7211   verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
7212   verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
7213   verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
7214 
7215   // These are not casts, but at some point were confused with casts.
7216   verifyFormat("virtual void foo(int *) override;");
7217   verifyFormat("virtual void foo(char &) const;");
7218   verifyFormat("virtual void foo(int *a, char *) const;");
7219   verifyFormat("int a = sizeof(int *) + b;");
7220   verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
7221   verifyFormat("bool b = f(g<int>) && c;");
7222   verifyFormat("typedef void (*f)(int i) func;");
7223 
7224   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
7225                "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
7226   // FIXME: The indentation here is not ideal.
7227   verifyFormat(
7228       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7229       "    [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
7230       "        [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
7231 }
7232 
7233 TEST_F(FormatTest, FormatsFunctionTypes) {
7234   verifyFormat("A<bool()> a;");
7235   verifyFormat("A<SomeType()> a;");
7236   verifyFormat("A<void (*)(int, std::string)> a;");
7237   verifyFormat("A<void *(int)>;");
7238   verifyFormat("void *(*a)(int *, SomeType *);");
7239   verifyFormat("int (*func)(void *);");
7240   verifyFormat("void f() { int (*func)(void *); }");
7241   verifyFormat("template <class CallbackClass>\n"
7242                "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
7243 
7244   verifyGoogleFormat("A<void*(int*, SomeType*)>;");
7245   verifyGoogleFormat("void* (*a)(int);");
7246   verifyGoogleFormat(
7247       "template <class CallbackClass>\n"
7248       "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
7249 
7250   // Other constructs can look somewhat like function types:
7251   verifyFormat("A<sizeof(*x)> a;");
7252   verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
7253   verifyFormat("some_var = function(*some_pointer_var)[0];");
7254   verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
7255   verifyFormat("int x = f(&h)();");
7256   verifyFormat("returnsFunction(&param1, &param2)(param);");
7257   verifyFormat("std::function<\n"
7258                "    LooooooooooongTemplatedType<\n"
7259                "        SomeType>*(\n"
7260                "        LooooooooooooooooongType type)>\n"
7261                "    function;",
7262                getGoogleStyleWithColumns(40));
7263 }
7264 
7265 TEST_F(FormatTest, FormatsPointersToArrayTypes) {
7266   verifyFormat("A (*foo_)[6];");
7267   verifyFormat("vector<int> (*foo_)[6];");
7268 }
7269 
7270 TEST_F(FormatTest, BreaksLongVariableDeclarations) {
7271   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
7272                "    LoooooooooooooooooooooooooooooooooooooooongVariable;");
7273   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
7274                "    LoooooooooooooooooooooooooooooooooooooooongVariable;");
7275   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
7276                "    *LoooooooooooooooooooooooooooooooooooooooongVariable;");
7277 
7278   // Different ways of ()-initializiation.
7279   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
7280                "    LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
7281   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
7282                "    LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
7283   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
7284                "    LoooooooooooooooooooooooooooooooooooooooongVariable({});");
7285   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
7286                "    LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
7287 
7288   // Lambdas should not confuse the variable declaration heuristic.
7289   verifyFormat("LooooooooooooooooongType\n"
7290                "    variable(nullptr, [](A *a) {});",
7291                getLLVMStyleWithColumns(40));
7292 }
7293 
7294 TEST_F(FormatTest, BreaksLongDeclarations) {
7295   verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
7296                "    AnotherNameForTheLongType;");
7297   verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
7298                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
7299   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
7300                "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
7301   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
7302                "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
7303   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
7304                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
7305   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
7306                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
7307   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
7308                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
7309   verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
7310                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
7311   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
7312                "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
7313   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
7314                "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
7315   FormatStyle Indented = getLLVMStyle();
7316   Indented.IndentWrappedFunctionNames = true;
7317   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
7318                "    LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
7319                Indented);
7320   verifyFormat(
7321       "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
7322       "    LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
7323       Indented);
7324   verifyFormat(
7325       "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
7326       "    LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
7327       Indented);
7328   verifyFormat(
7329       "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
7330       "    LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
7331       Indented);
7332 
7333   // FIXME: Without the comment, this breaks after "(".
7334   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType  // break\n"
7335                "    (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
7336                getGoogleStyle());
7337 
7338   verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
7339                "                  int LoooooooooooooooooooongParam2) {}");
7340   verifyFormat(
7341       "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
7342       "                                   SourceLocation L, IdentifierIn *II,\n"
7343       "                                   Type *T) {}");
7344   verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
7345                "ReallyReaaallyLongFunctionName(\n"
7346                "    const std::string &SomeParameter,\n"
7347                "    const SomeType<string, SomeOtherTemplateParameter>\n"
7348                "        &ReallyReallyLongParameterName,\n"
7349                "    const SomeType<string, SomeOtherTemplateParameter>\n"
7350                "        &AnotherLongParameterName) {}");
7351   verifyFormat("template <typename A>\n"
7352                "SomeLoooooooooooooooooooooongType<\n"
7353                "    typename some_namespace::SomeOtherType<A>::Type>\n"
7354                "Function() {}");
7355 
7356   verifyGoogleFormat(
7357       "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
7358       "    aaaaaaaaaaaaaaaaaaaaaaa;");
7359   verifyGoogleFormat(
7360       "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
7361       "                                   SourceLocation L) {}");
7362   verifyGoogleFormat(
7363       "some_namespace::LongReturnType\n"
7364       "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
7365       "    int first_long_parameter, int second_parameter) {}");
7366 
7367   verifyGoogleFormat("template <typename T>\n"
7368                      "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
7369                      "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
7370   verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7371                      "                   int aaaaaaaaaaaaaaaaaaaaaaa);");
7372 
7373   verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
7374                "    const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7375                "        *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
7376   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7377                "    vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
7378                "        aaaaaaaaaaaaaaaaaaaaaaaa);");
7379   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7380                "    vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
7381                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
7382                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
7383 
7384   verifyFormat("template <typename T> // Templates on own line.\n"
7385                "static int            // Some comment.\n"
7386                "MyFunction(int a);",
7387                getLLVMStyle());
7388 }
7389 
7390 TEST_F(FormatTest, FormatsArrays) {
7391   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
7392                "                         [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
7393   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
7394                "                         [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
7395   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
7396                "    aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
7397   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7398                "    [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
7399   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7400                "    [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
7401   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7402                "    [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
7403                "    [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
7404   verifyFormat(
7405       "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
7406       "             << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
7407       "                                  [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
7408   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
7409                "    .aaaaaaaaaaaaaaaaaaaaaa();");
7410 
7411   verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
7412                      "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
7413   verifyFormat(
7414       "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
7415       "                                  .aaaaaaa[0]\n"
7416       "                                  .aaaaaaaaaaaaaaaaaaaaaa();");
7417   verifyFormat("a[::b::c];");
7418 
7419   verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
7420 
7421   FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
7422   verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
7423 }
7424 
7425 TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
7426   verifyFormat("(a)->b();");
7427   verifyFormat("--a;");
7428 }
7429 
7430 TEST_F(FormatTest, HandlesIncludeDirectives) {
7431   verifyFormat("#include <string>\n"
7432                "#include <a/b/c.h>\n"
7433                "#include \"a/b/string\"\n"
7434                "#include \"string.h\"\n"
7435                "#include \"string.h\"\n"
7436                "#include <a-a>\n"
7437                "#include < path with space >\n"
7438                "#include_next <test.h>"
7439                "#include \"abc.h\" // this is included for ABC\n"
7440                "#include \"some long include\" // with a comment\n"
7441                "#include \"some very long include path\"\n"
7442                "#include <some/very/long/include/path>\n",
7443                getLLVMStyleWithColumns(35));
7444   EXPECT_EQ("#include \"a.h\"", format("#include  \"a.h\""));
7445   EXPECT_EQ("#include <a>", format("#include<a>"));
7446 
7447   verifyFormat("#import <string>");
7448   verifyFormat("#import <a/b/c.h>");
7449   verifyFormat("#import \"a/b/string\"");
7450   verifyFormat("#import \"string.h\"");
7451   verifyFormat("#import \"string.h\"");
7452   verifyFormat("#if __has_include(<strstream>)\n"
7453                "#include <strstream>\n"
7454                "#endif");
7455 
7456   verifyFormat("#define MY_IMPORT <a/b>");
7457 
7458   verifyFormat("#if __has_include(<a/b>)");
7459   verifyFormat("#if __has_include_next(<a/b>)");
7460   verifyFormat("#define F __has_include(<a/b>)");
7461   verifyFormat("#define F __has_include_next(<a/b>)");
7462 
7463   // Protocol buffer definition or missing "#".
7464   verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
7465                getLLVMStyleWithColumns(30));
7466 
7467   FormatStyle Style = getLLVMStyle();
7468   Style.AlwaysBreakBeforeMultilineStrings = true;
7469   Style.ColumnLimit = 0;
7470   verifyFormat("#import \"abc.h\"", Style);
7471 
7472   // But 'import' might also be a regular C++ namespace.
7473   verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7474                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
7475 }
7476 
7477 //===----------------------------------------------------------------------===//
7478 // Error recovery tests.
7479 //===----------------------------------------------------------------------===//
7480 
7481 TEST_F(FormatTest, IncompleteParameterLists) {
7482   FormatStyle NoBinPacking = getLLVMStyle();
7483   NoBinPacking.BinPackParameters = false;
7484   verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
7485                "                        double *min_x,\n"
7486                "                        double *max_x,\n"
7487                "                        double *min_y,\n"
7488                "                        double *max_y,\n"
7489                "                        double *min_z,\n"
7490                "                        double *max_z, ) {}",
7491                NoBinPacking);
7492 }
7493 
7494 TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
7495   verifyFormat("void f() { return; }\n42");
7496   verifyFormat("void f() {\n"
7497                "  if (0)\n"
7498                "    return;\n"
7499                "}\n"
7500                "42");
7501   verifyFormat("void f() { return }\n42");
7502   verifyFormat("void f() {\n"
7503                "  if (0)\n"
7504                "    return\n"
7505                "}\n"
7506                "42");
7507 }
7508 
7509 TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
7510   EXPECT_EQ("void f() { return }", format("void  f ( )  {  return  }"));
7511   EXPECT_EQ("void f() {\n"
7512             "  if (a)\n"
7513             "    return\n"
7514             "}",
7515             format("void  f  (  )  {  if  ( a )  return  }"));
7516   EXPECT_EQ("namespace N {\n"
7517             "void f()\n"
7518             "}",
7519             format("namespace  N  {  void f()  }"));
7520   EXPECT_EQ("namespace N {\n"
7521             "void f() {}\n"
7522             "void g()\n"
7523             "} // namespace N",
7524             format("namespace N  { void f( ) { } void g( ) }"));
7525 }
7526 
7527 TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
7528   verifyFormat("int aaaaaaaa =\n"
7529                "    // Overlylongcomment\n"
7530                "    b;",
7531                getLLVMStyleWithColumns(20));
7532   verifyFormat("function(\n"
7533                "    ShortArgument,\n"
7534                "    LoooooooooooongArgument);\n",
7535                getLLVMStyleWithColumns(20));
7536 }
7537 
7538 TEST_F(FormatTest, IncorrectAccessSpecifier) {
7539   verifyFormat("public:");
7540   verifyFormat("class A {\n"
7541                "public\n"
7542                "  void f() {}\n"
7543                "};");
7544   verifyFormat("public\n"
7545                "int qwerty;");
7546   verifyFormat("public\n"
7547                "B {}");
7548   verifyFormat("public\n"
7549                "{}");
7550   verifyFormat("public\n"
7551                "B { int x; }");
7552 }
7553 
7554 TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
7555   verifyFormat("{");
7556   verifyFormat("#})");
7557   verifyNoCrash("(/**/[:!] ?[).");
7558 }
7559 
7560 TEST_F(FormatTest, IncorrectUnbalancedBracesInMacrosWithUnicode) {
7561   // Found by oss-fuzz:
7562   // https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=8212
7563   FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp);
7564   Style.ColumnLimit = 60;
7565   verifyNoCrash(
7566       "\x23\x47\xff\x20\x28\xff\x3c\xff\x3f\xff\x20\x2f\x7b\x7a\xff\x20"
7567       "\xff\xff\xff\xca\xb5\xff\xff\xff\xff\x3a\x7b\x7d\xff\x20\xff\x20"
7568       "\xff\x74\xff\x20\x7d\x7d\xff\x7b\x3a\xff\x20\x71\xff\x20\xff\x0a",
7569       Style);
7570 }
7571 
7572 TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
7573   verifyFormat("do {\n}");
7574   verifyFormat("do {\n}\n"
7575                "f();");
7576   verifyFormat("do {\n}\n"
7577                "wheeee(fun);");
7578   verifyFormat("do {\n"
7579                "  f();\n"
7580                "}");
7581 }
7582 
7583 TEST_F(FormatTest, IncorrectCodeMissingParens) {
7584   verifyFormat("if {\n  foo;\n  foo();\n}");
7585   verifyFormat("switch {\n  foo;\n  foo();\n}");
7586   verifyIncompleteFormat("for {\n  foo;\n  foo();\n}");
7587   verifyFormat("while {\n  foo;\n  foo();\n}");
7588   verifyFormat("do {\n  foo;\n  foo();\n} while;");
7589 }
7590 
7591 TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
7592   verifyIncompleteFormat("namespace {\n"
7593                          "class Foo { Foo (\n"
7594                          "};\n"
7595                          "} // namespace");
7596 }
7597 
7598 TEST_F(FormatTest, IncorrectCodeErrorDetection) {
7599   EXPECT_EQ("{\n  {}\n", format("{\n{\n}\n"));
7600   EXPECT_EQ("{\n  {}\n", format("{\n  {\n}\n"));
7601   EXPECT_EQ("{\n  {}\n", format("{\n  {\n  }\n"));
7602   EXPECT_EQ("{\n  {}\n}\n}\n", format("{\n  {\n    }\n  }\n}\n"));
7603 
7604   EXPECT_EQ("{\n"
7605             "  {\n"
7606             "    breakme(\n"
7607             "        qwe);\n"
7608             "  }\n",
7609             format("{\n"
7610                    "    {\n"
7611                    " breakme(qwe);\n"
7612                    "}\n",
7613                    getLLVMStyleWithColumns(10)));
7614 }
7615 
7616 TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
7617   verifyFormat("int x = {\n"
7618                "    avariable,\n"
7619                "    b(alongervariable)};",
7620                getLLVMStyleWithColumns(25));
7621 }
7622 
7623 TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
7624   verifyFormat("return (a)(b){1, 2, 3};");
7625 }
7626 
7627 TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
7628   verifyFormat("vector<int> x{1, 2, 3, 4};");
7629   verifyFormat("vector<int> x{\n"
7630                "    1,\n"
7631                "    2,\n"
7632                "    3,\n"
7633                "    4,\n"
7634                "};");
7635   verifyFormat("vector<T> x{{}, {}, {}, {}};");
7636   verifyFormat("f({1, 2});");
7637   verifyFormat("auto v = Foo{-1};");
7638   verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
7639   verifyFormat("Class::Class : member{1, 2, 3} {}");
7640   verifyFormat("new vector<int>{1, 2, 3};");
7641   verifyFormat("new int[3]{1, 2, 3};");
7642   verifyFormat("new int{1};");
7643   verifyFormat("return {arg1, arg2};");
7644   verifyFormat("return {arg1, SomeType{parameter}};");
7645   verifyFormat("int count = set<int>{f(), g(), h()}.size();");
7646   verifyFormat("new T{arg1, arg2};");
7647   verifyFormat("f(MyMap[{composite, key}]);");
7648   verifyFormat("class Class {\n"
7649                "  T member = {arg1, arg2};\n"
7650                "};");
7651   verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
7652   verifyFormat("const struct A a = {.a = 1, .b = 2};");
7653   verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
7654   verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
7655   verifyFormat("int a = std::is_integral<int>{} + 0;");
7656 
7657   verifyFormat("int foo(int i) { return fo1{}(i); }");
7658   verifyFormat("int foo(int i) { return fo1{}(i); }");
7659   verifyFormat("auto i = decltype(x){};");
7660   verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
7661   verifyFormat("Node n{1, Node{1000}, //\n"
7662                "       2};");
7663   verifyFormat("Aaaa aaaaaaa{\n"
7664                "    {\n"
7665                "        aaaa,\n"
7666                "    },\n"
7667                "};");
7668   verifyFormat("class C : public D {\n"
7669                "  SomeClass SC{2};\n"
7670                "};");
7671   verifyFormat("class C : public A {\n"
7672                "  class D : public B {\n"
7673                "    void f() { int i{2}; }\n"
7674                "  };\n"
7675                "};");
7676   verifyFormat("#define A {a, a},");
7677 
7678   // Avoid breaking between equal sign and opening brace
7679   FormatStyle AvoidBreakingFirstArgument = getLLVMStyle();
7680   AvoidBreakingFirstArgument.PenaltyBreakBeforeFirstCallParameter = 200;
7681   verifyFormat("const std::unordered_map<std::string, int> MyHashTable =\n"
7682                "    {{\"aaaaaaaaaaaaaaaaaaaaa\", 0},\n"
7683                "     {\"bbbbbbbbbbbbbbbbbbbbb\", 1},\n"
7684                "     {\"ccccccccccccccccccccc\", 2}};",
7685                AvoidBreakingFirstArgument);
7686 
7687   // Binpacking only if there is no trailing comma
7688   verifyFormat("const Aaaaaa aaaaa = {aaaaaaaaaa, bbbbbbbbbb,\n"
7689                "                      cccccccccc, dddddddddd};",
7690 			   getLLVMStyleWithColumns(50));
7691   verifyFormat("const Aaaaaa aaaaa = {\n"
7692                "    aaaaaaaaaaa,\n"
7693                "    bbbbbbbbbbb,\n"
7694                "    ccccccccccc,\n"
7695                "    ddddddddddd,\n"
7696                "};", getLLVMStyleWithColumns(50));
7697 
7698   // Cases where distinguising braced lists and blocks is hard.
7699   verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
7700   verifyFormat("void f() {\n"
7701                "  return; // comment\n"
7702                "}\n"
7703                "SomeType t;");
7704   verifyFormat("void f() {\n"
7705                "  if (a) {\n"
7706                "    f();\n"
7707                "  }\n"
7708                "}\n"
7709                "SomeType t;");
7710 
7711   // In combination with BinPackArguments = false.
7712   FormatStyle NoBinPacking = getLLVMStyle();
7713   NoBinPacking.BinPackArguments = false;
7714   verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
7715                "                      bbbbb,\n"
7716                "                      ccccc,\n"
7717                "                      ddddd,\n"
7718                "                      eeeee,\n"
7719                "                      ffffff,\n"
7720                "                      ggggg,\n"
7721                "                      hhhhhh,\n"
7722                "                      iiiiii,\n"
7723                "                      jjjjjj,\n"
7724                "                      kkkkkk};",
7725                NoBinPacking);
7726   verifyFormat("const Aaaaaa aaaaa = {\n"
7727                "    aaaaa,\n"
7728                "    bbbbb,\n"
7729                "    ccccc,\n"
7730                "    ddddd,\n"
7731                "    eeeee,\n"
7732                "    ffffff,\n"
7733                "    ggggg,\n"
7734                "    hhhhhh,\n"
7735                "    iiiiii,\n"
7736                "    jjjjjj,\n"
7737                "    kkkkkk,\n"
7738                "};",
7739                NoBinPacking);
7740   verifyFormat(
7741       "const Aaaaaa aaaaa = {\n"
7742       "    aaaaa,  bbbbb,  ccccc,  ddddd,  eeeee,  ffffff, ggggg, hhhhhh,\n"
7743       "    iiiiii, jjjjjj, kkkkkk, aaaaa,  bbbbb,  ccccc,  ddddd, eeeee,\n"
7744       "    ffffff, ggggg,  hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
7745       "};",
7746       NoBinPacking);
7747 
7748   // FIXME: The alignment of these trailing comments might be bad. Then again,
7749   // this might be utterly useless in real code.
7750   verifyFormat("Constructor::Constructor()\n"
7751                "    : some_value{         //\n"
7752                "                 aaaaaaa, //\n"
7753                "                 bbbbbbb} {}");
7754 
7755   // In braced lists, the first comment is always assumed to belong to the
7756   // first element. Thus, it can be moved to the next or previous line as
7757   // appropriate.
7758   EXPECT_EQ("function({// First element:\n"
7759             "          1,\n"
7760             "          // Second element:\n"
7761             "          2});",
7762             format("function({\n"
7763                    "    // First element:\n"
7764                    "    1,\n"
7765                    "    // Second element:\n"
7766                    "    2});"));
7767   EXPECT_EQ("std::vector<int> MyNumbers{\n"
7768             "    // First element:\n"
7769             "    1,\n"
7770             "    // Second element:\n"
7771             "    2};",
7772             format("std::vector<int> MyNumbers{// First element:\n"
7773                    "                           1,\n"
7774                    "                           // Second element:\n"
7775                    "                           2};",
7776                    getLLVMStyleWithColumns(30)));
7777   // A trailing comma should still lead to an enforced line break and no
7778   // binpacking.
7779   EXPECT_EQ("vector<int> SomeVector = {\n"
7780             "    // aaa\n"
7781             "    1,\n"
7782             "    2,\n"
7783             "};",
7784             format("vector<int> SomeVector = { // aaa\n"
7785                    "    1, 2, };"));
7786 
7787   FormatStyle ExtraSpaces = getLLVMStyle();
7788   ExtraSpaces.Cpp11BracedListStyle = false;
7789   ExtraSpaces.ColumnLimit = 75;
7790   verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
7791   verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
7792   verifyFormat("f({ 1, 2 });", ExtraSpaces);
7793   verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
7794   verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
7795   verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
7796   verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
7797   verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
7798   verifyFormat("return { arg1, arg2 };", ExtraSpaces);
7799   verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
7800   verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
7801   verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
7802   verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
7803   verifyFormat("class Class {\n"
7804                "  T member = { arg1, arg2 };\n"
7805                "};",
7806                ExtraSpaces);
7807   verifyFormat(
7808       "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7809       "                                 aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
7810       "                  : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
7811       "                                 bbbbbbbbbbbbbbbbbbbb, bbbbb };",
7812       ExtraSpaces);
7813   verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
7814   verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
7815                ExtraSpaces);
7816   verifyFormat(
7817       "someFunction(OtherParam,\n"
7818       "             BracedList{ // comment 1 (Forcing interesting break)\n"
7819       "                         param1, param2,\n"
7820       "                         // comment 2\n"
7821       "                         param3, param4 });",
7822       ExtraSpaces);
7823   verifyFormat(
7824       "std::this_thread::sleep_for(\n"
7825       "    std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
7826       ExtraSpaces);
7827   verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n"
7828                "    aaaaaaa,\n"
7829                "    aaaaaaaaaa,\n"
7830                "    aaaaa,\n"
7831                "    aaaaaaaaaaaaaaa,\n"
7832                "    aaa,\n"
7833                "    aaaaaaaaaa,\n"
7834                "    a,\n"
7835                "    aaaaaaaaaaaaaaaaaaaaa,\n"
7836                "    aaaaaaaaaaaa,\n"
7837                "    aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
7838                "    aaaaaaa,\n"
7839                "    a};");
7840   verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
7841   verifyFormat("const struct A a = { .a = 1, .b = 2 };", ExtraSpaces);
7842   verifyFormat("const struct A a = { [0] = 1, [1] = 2 };", ExtraSpaces);
7843 
7844   // Avoid breaking between initializer/equal sign and opening brace
7845   ExtraSpaces.PenaltyBreakBeforeFirstCallParameter = 200;
7846   verifyFormat("const std::unordered_map<std::string, int> MyHashTable = {\n"
7847                "  { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n"
7848                "  { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n"
7849                "  { \"ccccccccccccccccccccc\", 2 }\n"
7850                "};",
7851                ExtraSpaces);
7852   verifyFormat("const std::unordered_map<std::string, int> MyHashTable{\n"
7853                "  { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n"
7854                "  { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n"
7855                "  { \"ccccccccccccccccccccc\", 2 }\n"
7856                "};",
7857                ExtraSpaces);
7858 
7859   FormatStyle SpaceBeforeBrace = getLLVMStyle();
7860   SpaceBeforeBrace.SpaceBeforeCpp11BracedList = true;
7861   verifyFormat("vector<int> x {1, 2, 3, 4};", SpaceBeforeBrace);
7862   verifyFormat("f({}, {{}, {}}, MyMap[{k, v}]);", SpaceBeforeBrace);
7863 }
7864 
7865 TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
7866   verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7867                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7868                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7869                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7870                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7871                "                 1, 22, 333, 4444, 55555, 666666, 7777777};");
7872   verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
7873                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7874                "                 1, 22, 333, 4444, 55555, //\n"
7875                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7876                "                 1, 22, 333, 4444, 55555, 666666, 7777777};");
7877   verifyFormat(
7878       "vector<int> x = {1,       22, 333, 4444, 55555, 666666, 7777777,\n"
7879       "                 1,       22, 333, 4444, 55555, 666666, 7777777,\n"
7880       "                 1,       22, 333, 4444, 55555, 666666, // comment\n"
7881       "                 7777777, 1,  22,  333,  4444,  55555,  666666,\n"
7882       "                 7777777, 1,  22,  333,  4444,  55555,  666666,\n"
7883       "                 7777777, 1,  22,  333,  4444,  55555,  666666,\n"
7884       "                 7777777};");
7885   verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
7886                "    X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7887                "    X86::R8,  X86::R9,  X86::R10, X86::R11, 0};");
7888   verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
7889                "    X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7890                "    // Separating comment.\n"
7891                "    X86::R8, X86::R9, X86::R10, X86::R11, 0};");
7892   verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
7893                "    // Leading comment\n"
7894                "    X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7895                "    X86::R8,  X86::R9,  X86::R10, X86::R11, 0};");
7896   verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7897                "                 1, 1, 1, 1};",
7898                getLLVMStyleWithColumns(39));
7899   verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7900                "                 1, 1, 1, 1};",
7901                getLLVMStyleWithColumns(38));
7902   verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
7903                "    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
7904                getLLVMStyleWithColumns(43));
7905   verifyFormat(
7906       "static unsigned SomeValues[10][3] = {\n"
7907       "    {1, 4, 0},  {4, 9, 0},  {4, 5, 9},  {8, 5, 4}, {1, 8, 4},\n"
7908       "    {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
7909   verifyFormat("static auto fields = new vector<string>{\n"
7910                "    \"aaaaaaaaaaaaa\",\n"
7911                "    \"aaaaaaaaaaaaa\",\n"
7912                "    \"aaaaaaaaaaaa\",\n"
7913                "    \"aaaaaaaaaaaaaa\",\n"
7914                "    \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
7915                "    \"aaaaaaaaaaaa\",\n"
7916                "    \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
7917                "};");
7918   verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
7919   verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
7920                "                 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
7921                "                 3, cccccccccccccccccccccc};",
7922                getLLVMStyleWithColumns(60));
7923 
7924   // Trailing commas.
7925   verifyFormat("vector<int> x = {\n"
7926                "    1, 1, 1, 1, 1, 1, 1, 1,\n"
7927                "};",
7928                getLLVMStyleWithColumns(39));
7929   verifyFormat("vector<int> x = {\n"
7930                "    1, 1, 1, 1, 1, 1, 1, 1, //\n"
7931                "};",
7932                getLLVMStyleWithColumns(39));
7933   verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7934                "                 1, 1, 1, 1,\n"
7935                "                 /**/ /**/};",
7936                getLLVMStyleWithColumns(39));
7937 
7938   // Trailing comment in the first line.
7939   verifyFormat("vector<int> iiiiiiiiiiiiiii = {                      //\n"
7940                "    1111111111, 2222222222, 33333333333, 4444444444, //\n"
7941                "    111111111,  222222222,  3333333333,  444444444,  //\n"
7942                "    11111111,   22222222,   333333333,   44444444};");
7943   // Trailing comment in the last line.
7944   verifyFormat("int aaaaa[] = {\n"
7945                "    1, 2, 3, // comment\n"
7946                "    4, 5, 6  // comment\n"
7947                "};");
7948 
7949   // With nested lists, we should either format one item per line or all nested
7950   // lists one on line.
7951   // FIXME: For some nested lists, we can do better.
7952   verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
7953                "        {aaaaaaaaaaaaaaaaaaa},\n"
7954                "        {aaaaaaaaaaaaaaaaaaaaa},\n"
7955                "        {aaaaaaaaaaaaaaaaa}};",
7956                getLLVMStyleWithColumns(60));
7957   verifyFormat(
7958       "SomeStruct my_struct_array = {\n"
7959       "    {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
7960       "     aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
7961       "    {aaa, aaa},\n"
7962       "    {aaa, aaa},\n"
7963       "    {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
7964       "    {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
7965       "     aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
7966 
7967   // No column layout should be used here.
7968   verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
7969                "                   bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
7970 
7971   verifyNoCrash("a<,");
7972 
7973   // No braced initializer here.
7974   verifyFormat("void f() {\n"
7975                "  struct Dummy {};\n"
7976                "  f(v);\n"
7977                "}");
7978 
7979   // Long lists should be formatted in columns even if they are nested.
7980   verifyFormat(
7981       "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7982       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7983       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7984       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7985       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7986       "                          1, 22, 333, 4444, 55555, 666666, 7777777});");
7987 
7988   // Allow "single-column" layout even if that violates the column limit. There
7989   // isn't going to be a better way.
7990   verifyFormat("std::vector<int> a = {\n"
7991                "    aaaaaaaa,\n"
7992                "    aaaaaaaa,\n"
7993                "    aaaaaaaa,\n"
7994                "    aaaaaaaa,\n"
7995                "    aaaaaaaaaa,\n"
7996                "    aaaaaaaa,\n"
7997                "    aaaaaaaaaaaaaaaaaaaaaaaaaaa};",
7998                getLLVMStyleWithColumns(30));
7999   verifyFormat("vector<int> aaaa = {\n"
8000                "    aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
8001                "    aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
8002                "    aaaaaa.aaaaaaa,\n"
8003                "    aaaaaa.aaaaaaa,\n"
8004                "    aaaaaa.aaaaaaa,\n"
8005                "    aaaaaa.aaaaaaa,\n"
8006                "};");
8007 
8008   // Don't create hanging lists.
8009   verifyFormat("someFunction(Param, {List1, List2,\n"
8010                "                     List3});",
8011                getLLVMStyleWithColumns(35));
8012   verifyFormat("someFunction(Param, Param,\n"
8013                "             {List1, List2,\n"
8014                "              List3});",
8015                getLLVMStyleWithColumns(35));
8016   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n"
8017                "                               aaaaaaaaaaaaaaaaaaaaaaa);");
8018 }
8019 
8020 TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
8021   FormatStyle DoNotMerge = getLLVMStyle();
8022   DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
8023 
8024   verifyFormat("void f() { return 42; }");
8025   verifyFormat("void f() {\n"
8026                "  return 42;\n"
8027                "}",
8028                DoNotMerge);
8029   verifyFormat("void f() {\n"
8030                "  // Comment\n"
8031                "}");
8032   verifyFormat("{\n"
8033                "#error {\n"
8034                "  int a;\n"
8035                "}");
8036   verifyFormat("{\n"
8037                "  int a;\n"
8038                "#error {\n"
8039                "}");
8040   verifyFormat("void f() {} // comment");
8041   verifyFormat("void f() { int a; } // comment");
8042   verifyFormat("void f() {\n"
8043                "} // comment",
8044                DoNotMerge);
8045   verifyFormat("void f() {\n"
8046                "  int a;\n"
8047                "} // comment",
8048                DoNotMerge);
8049   verifyFormat("void f() {\n"
8050                "} // comment",
8051                getLLVMStyleWithColumns(15));
8052 
8053   verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
8054   verifyFormat("void f() {\n  return 42;\n}", getLLVMStyleWithColumns(22));
8055 
8056   verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
8057   verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
8058   verifyFormat("class C {\n"
8059                "  C()\n"
8060                "      : iiiiiiii(nullptr),\n"
8061                "        kkkkkkk(nullptr),\n"
8062                "        mmmmmmm(nullptr),\n"
8063                "        nnnnnnn(nullptr) {}\n"
8064                "};",
8065                getGoogleStyle());
8066 
8067   FormatStyle NoColumnLimit = getLLVMStyle();
8068   NoColumnLimit.ColumnLimit = 0;
8069   EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
8070   EXPECT_EQ("class C {\n"
8071             "  A() : b(0) {}\n"
8072             "};",
8073             format("class C{A():b(0){}};", NoColumnLimit));
8074   EXPECT_EQ("A()\n"
8075             "    : b(0) {\n"
8076             "}",
8077             format("A()\n:b(0)\n{\n}", NoColumnLimit));
8078 
8079   FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
8080   DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
8081       FormatStyle::SFS_None;
8082   EXPECT_EQ("A()\n"
8083             "    : b(0) {\n"
8084             "}",
8085             format("A():b(0){}", DoNotMergeNoColumnLimit));
8086   EXPECT_EQ("A()\n"
8087             "    : b(0) {\n"
8088             "}",
8089             format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
8090 
8091   verifyFormat("#define A          \\\n"
8092                "  void f() {       \\\n"
8093                "    int i;         \\\n"
8094                "  }",
8095                getLLVMStyleWithColumns(20));
8096   verifyFormat("#define A           \\\n"
8097                "  void f() { int i; }",
8098                getLLVMStyleWithColumns(21));
8099   verifyFormat("#define A            \\\n"
8100                "  void f() {         \\\n"
8101                "    int i;           \\\n"
8102                "  }                  \\\n"
8103                "  int j;",
8104                getLLVMStyleWithColumns(22));
8105   verifyFormat("#define A             \\\n"
8106                "  void f() { int i; } \\\n"
8107                "  int j;",
8108                getLLVMStyleWithColumns(23));
8109 }
8110 
8111 TEST_F(FormatTest, PullEmptyFunctionDefinitionsIntoSingleLine) {
8112   FormatStyle MergeEmptyOnly = getLLVMStyle();
8113   MergeEmptyOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
8114   verifyFormat("class C {\n"
8115                "  int f() {}\n"
8116                "};",
8117                MergeEmptyOnly);
8118   verifyFormat("class C {\n"
8119                "  int f() {\n"
8120                "    return 42;\n"
8121                "  }\n"
8122                "};",
8123                MergeEmptyOnly);
8124   verifyFormat("int f() {}", MergeEmptyOnly);
8125   verifyFormat("int f() {\n"
8126                "  return 42;\n"
8127                "}",
8128                MergeEmptyOnly);
8129 
8130   // Also verify behavior when BraceWrapping.AfterFunction = true
8131   MergeEmptyOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
8132   MergeEmptyOnly.BraceWrapping.AfterFunction = true;
8133   verifyFormat("int f() {}", MergeEmptyOnly);
8134   verifyFormat("class C {\n"
8135                "  int f() {}\n"
8136                "};",
8137                MergeEmptyOnly);
8138 }
8139 
8140 TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
8141   FormatStyle MergeInlineOnly = getLLVMStyle();
8142   MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
8143   verifyFormat("class C {\n"
8144                "  int f() { return 42; }\n"
8145                "};",
8146                MergeInlineOnly);
8147   verifyFormat("int f() {\n"
8148                "  return 42;\n"
8149                "}",
8150                MergeInlineOnly);
8151 
8152   // SFS_Inline implies SFS_Empty
8153   verifyFormat("class C {\n"
8154                "  int f() {}\n"
8155                "};",
8156                MergeInlineOnly);
8157   verifyFormat("int f() {}", MergeInlineOnly);
8158 
8159   // Also verify behavior when BraceWrapping.AfterFunction = true
8160   MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
8161   MergeInlineOnly.BraceWrapping.AfterFunction = true;
8162   verifyFormat("class C {\n"
8163                "  int f() { return 42; }\n"
8164                "};",
8165                MergeInlineOnly);
8166   verifyFormat("int f()\n"
8167                "{\n"
8168                "  return 42;\n"
8169                "}",
8170                MergeInlineOnly);
8171 
8172   // SFS_Inline implies SFS_Empty
8173   verifyFormat("int f() {}", MergeInlineOnly);
8174   verifyFormat("class C {\n"
8175                "  int f() {}\n"
8176                "};",
8177                MergeInlineOnly);
8178 }
8179 
8180 TEST_F(FormatTest, PullInlineOnlyFunctionDefinitionsIntoSingleLine) {
8181   FormatStyle MergeInlineOnly = getLLVMStyle();
8182   MergeInlineOnly.AllowShortFunctionsOnASingleLine =
8183       FormatStyle::SFS_InlineOnly;
8184   verifyFormat("class C {\n"
8185                "  int f() { return 42; }\n"
8186                "};",
8187                MergeInlineOnly);
8188   verifyFormat("int f() {\n"
8189                "  return 42;\n"
8190                "}",
8191                MergeInlineOnly);
8192 
8193   // SFS_InlineOnly does not imply SFS_Empty
8194   verifyFormat("class C {\n"
8195                "  int f() {}\n"
8196                "};",
8197                MergeInlineOnly);
8198   verifyFormat("int f() {\n"
8199                "}",
8200                MergeInlineOnly);
8201 
8202   // Also verify behavior when BraceWrapping.AfterFunction = true
8203   MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
8204   MergeInlineOnly.BraceWrapping.AfterFunction = true;
8205   verifyFormat("class C {\n"
8206                "  int f() { return 42; }\n"
8207                "};",
8208                MergeInlineOnly);
8209   verifyFormat("int f()\n"
8210                "{\n"
8211                "  return 42;\n"
8212                "}",
8213                MergeInlineOnly);
8214 
8215   // SFS_InlineOnly does not imply SFS_Empty
8216   verifyFormat("int f()\n"
8217                "{\n"
8218                "}",
8219                MergeInlineOnly);
8220   verifyFormat("class C {\n"
8221                "  int f() {}\n"
8222                "};",
8223                MergeInlineOnly);
8224 }
8225 
8226 TEST_F(FormatTest, SplitEmptyFunction) {
8227   FormatStyle Style = getLLVMStyle();
8228   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
8229   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
8230   Style.BraceWrapping.AfterFunction = true;
8231   Style.BraceWrapping.SplitEmptyFunction = false;
8232   Style.ColumnLimit = 40;
8233 
8234   verifyFormat("int f()\n"
8235                "{}",
8236                Style);
8237   verifyFormat("int f()\n"
8238                "{\n"
8239                "  return 42;\n"
8240                "}",
8241                Style);
8242   verifyFormat("int f()\n"
8243                "{\n"
8244                "  // some comment\n"
8245                "}",
8246                Style);
8247 
8248   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
8249   verifyFormat("int f() {}", Style);
8250   verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
8251                "{}",
8252                Style);
8253   verifyFormat("int f()\n"
8254                "{\n"
8255                "  return 0;\n"
8256                "}",
8257                Style);
8258 
8259   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
8260   verifyFormat("class Foo {\n"
8261                "  int f() {}\n"
8262                "};\n",
8263                Style);
8264   verifyFormat("class Foo {\n"
8265                "  int f() { return 0; }\n"
8266                "};\n",
8267                Style);
8268   verifyFormat("class Foo {\n"
8269                "  int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
8270                "  {}\n"
8271                "};\n",
8272                Style);
8273   verifyFormat("class Foo {\n"
8274                "  int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
8275                "  {\n"
8276                "    return 0;\n"
8277                "  }\n"
8278                "};\n",
8279                Style);
8280 
8281   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
8282   verifyFormat("int f() {}", Style);
8283   verifyFormat("int f() { return 0; }", Style);
8284   verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
8285                "{}",
8286                Style);
8287   verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
8288                "{\n"
8289                "  return 0;\n"
8290                "}",
8291                Style);
8292 }
8293 TEST_F(FormatTest, KeepShortFunctionAfterPPElse) {
8294   FormatStyle Style = getLLVMStyle();
8295   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
8296   verifyFormat("#ifdef A\n"
8297                "int f() {}\n"
8298                "#else\n"
8299                "int g() {}\n"
8300                "#endif",
8301                Style);
8302 }
8303 
8304 TEST_F(FormatTest, SplitEmptyClass) {
8305   FormatStyle Style = getLLVMStyle();
8306   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
8307   Style.BraceWrapping.AfterClass = true;
8308   Style.BraceWrapping.SplitEmptyRecord = false;
8309 
8310   verifyFormat("class Foo\n"
8311                "{};",
8312                Style);
8313   verifyFormat("/* something */ class Foo\n"
8314                "{};",
8315                Style);
8316   verifyFormat("template <typename X> class Foo\n"
8317                "{};",
8318                Style);
8319   verifyFormat("class Foo\n"
8320                "{\n"
8321                "  Foo();\n"
8322                "};",
8323                Style);
8324   verifyFormat("typedef class Foo\n"
8325                "{\n"
8326                "} Foo_t;",
8327                Style);
8328 }
8329 
8330 TEST_F(FormatTest, SplitEmptyStruct) {
8331   FormatStyle Style = getLLVMStyle();
8332   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
8333   Style.BraceWrapping.AfterStruct = true;
8334   Style.BraceWrapping.SplitEmptyRecord = false;
8335 
8336   verifyFormat("struct Foo\n"
8337                "{};",
8338                Style);
8339   verifyFormat("/* something */ struct Foo\n"
8340                "{};",
8341                Style);
8342   verifyFormat("template <typename X> struct Foo\n"
8343                "{};",
8344                Style);
8345   verifyFormat("struct Foo\n"
8346                "{\n"
8347                "  Foo();\n"
8348                "};",
8349                Style);
8350   verifyFormat("typedef struct Foo\n"
8351                "{\n"
8352                "} Foo_t;",
8353                Style);
8354   //typedef struct Bar {} Bar_t;
8355 }
8356 
8357 TEST_F(FormatTest, SplitEmptyUnion) {
8358   FormatStyle Style = getLLVMStyle();
8359   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
8360   Style.BraceWrapping.AfterUnion = true;
8361   Style.BraceWrapping.SplitEmptyRecord = false;
8362 
8363   verifyFormat("union Foo\n"
8364                "{};",
8365                Style);
8366   verifyFormat("/* something */ union Foo\n"
8367                "{};",
8368                Style);
8369   verifyFormat("union Foo\n"
8370                "{\n"
8371                "  A,\n"
8372                "};",
8373                Style);
8374   verifyFormat("typedef union Foo\n"
8375                "{\n"
8376                "} Foo_t;",
8377                Style);
8378 }
8379 
8380 TEST_F(FormatTest, SplitEmptyNamespace) {
8381   FormatStyle Style = getLLVMStyle();
8382   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
8383   Style.BraceWrapping.AfterNamespace = true;
8384   Style.BraceWrapping.SplitEmptyNamespace = false;
8385 
8386   verifyFormat("namespace Foo\n"
8387                "{};",
8388                Style);
8389   verifyFormat("/* something */ namespace Foo\n"
8390                "{};",
8391                Style);
8392   verifyFormat("inline namespace Foo\n"
8393                "{};",
8394                Style);
8395   verifyFormat("/* something */ inline namespace Foo\n"
8396                "{};",
8397                Style);
8398   verifyFormat("export namespace Foo\n"
8399                "{};",
8400                Style);
8401   verifyFormat("namespace Foo\n"
8402                "{\n"
8403                "void Bar();\n"
8404                "};",
8405                Style);
8406 }
8407 
8408 TEST_F(FormatTest, NeverMergeShortRecords) {
8409   FormatStyle Style = getLLVMStyle();
8410 
8411   verifyFormat("class Foo {\n"
8412                "  Foo();\n"
8413                "};",
8414                Style);
8415   verifyFormat("typedef class Foo {\n"
8416                "  Foo();\n"
8417                "} Foo_t;",
8418                Style);
8419   verifyFormat("struct Foo {\n"
8420                "  Foo();\n"
8421                "};",
8422                Style);
8423   verifyFormat("typedef struct Foo {\n"
8424                "  Foo();\n"
8425                "} Foo_t;",
8426                Style);
8427   verifyFormat("union Foo {\n"
8428                "  A,\n"
8429                "};",
8430                Style);
8431   verifyFormat("typedef union Foo {\n"
8432                "  A,\n"
8433                "} Foo_t;",
8434                Style);
8435   verifyFormat("namespace Foo {\n"
8436                "void Bar();\n"
8437                "};",
8438                Style);
8439 
8440   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
8441   Style.BraceWrapping.AfterClass = true;
8442   Style.BraceWrapping.AfterStruct = true;
8443   Style.BraceWrapping.AfterUnion = true;
8444   Style.BraceWrapping.AfterNamespace = true;
8445   verifyFormat("class Foo\n"
8446                "{\n"
8447                "  Foo();\n"
8448                "};",
8449                Style);
8450   verifyFormat("typedef class Foo\n"
8451                "{\n"
8452                "  Foo();\n"
8453                "} Foo_t;",
8454                Style);
8455   verifyFormat("struct Foo\n"
8456                "{\n"
8457                "  Foo();\n"
8458                "};",
8459                Style);
8460   verifyFormat("typedef struct Foo\n"
8461                "{\n"
8462                "  Foo();\n"
8463                "} Foo_t;",
8464                Style);
8465   verifyFormat("union Foo\n"
8466                "{\n"
8467                "  A,\n"
8468                "};",
8469                Style);
8470   verifyFormat("typedef union Foo\n"
8471                "{\n"
8472                "  A,\n"
8473                "} Foo_t;",
8474                Style);
8475   verifyFormat("namespace Foo\n"
8476                "{\n"
8477                "void Bar();\n"
8478                "};",
8479                Style);
8480 }
8481 
8482 TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
8483   // Elaborate type variable declarations.
8484   verifyFormat("struct foo a = {bar};\nint n;");
8485   verifyFormat("class foo a = {bar};\nint n;");
8486   verifyFormat("union foo a = {bar};\nint n;");
8487 
8488   // Elaborate types inside function definitions.
8489   verifyFormat("struct foo f() {}\nint n;");
8490   verifyFormat("class foo f() {}\nint n;");
8491   verifyFormat("union foo f() {}\nint n;");
8492 
8493   // Templates.
8494   verifyFormat("template <class X> void f() {}\nint n;");
8495   verifyFormat("template <struct X> void f() {}\nint n;");
8496   verifyFormat("template <union X> void f() {}\nint n;");
8497 
8498   // Actual definitions...
8499   verifyFormat("struct {\n} n;");
8500   verifyFormat(
8501       "template <template <class T, class Y>, class Z> class X {\n} n;");
8502   verifyFormat("union Z {\n  int n;\n} x;");
8503   verifyFormat("class MACRO Z {\n} n;");
8504   verifyFormat("class MACRO(X) Z {\n} n;");
8505   verifyFormat("class __attribute__(X) Z {\n} n;");
8506   verifyFormat("class __declspec(X) Z {\n} n;");
8507   verifyFormat("class A##B##C {\n} n;");
8508   verifyFormat("class alignas(16) Z {\n} n;");
8509   verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
8510   verifyFormat("class MACROA MACRO(X) Z {\n} n;");
8511 
8512   // Redefinition from nested context:
8513   verifyFormat("class A::B::C {\n} n;");
8514 
8515   // Template definitions.
8516   verifyFormat(
8517       "template <typename F>\n"
8518       "Matcher(const Matcher<F> &Other,\n"
8519       "        typename enable_if_c<is_base_of<F, T>::value &&\n"
8520       "                             !is_same<F, T>::value>::type * = 0)\n"
8521       "    : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
8522 
8523   // FIXME: This is still incorrectly handled at the formatter side.
8524   verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
8525   verifyFormat("int i = SomeFunction(a<b, a> b);");
8526 
8527   // FIXME:
8528   // This now gets parsed incorrectly as class definition.
8529   // verifyFormat("class A<int> f() {\n}\nint n;");
8530 
8531   // Elaborate types where incorrectly parsing the structural element would
8532   // break the indent.
8533   verifyFormat("if (true)\n"
8534                "  class X x;\n"
8535                "else\n"
8536                "  f();\n");
8537 
8538   // This is simply incomplete. Formatting is not important, but must not crash.
8539   verifyFormat("class A:");
8540 }
8541 
8542 TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
8543   EXPECT_EQ("#error Leave     all         white!!!!! space* alone!\n",
8544             format("#error Leave     all         white!!!!! space* alone!\n"));
8545   EXPECT_EQ(
8546       "#warning Leave     all         white!!!!! space* alone!\n",
8547       format("#warning Leave     all         white!!!!! space* alone!\n"));
8548   EXPECT_EQ("#error 1", format("  #  error   1"));
8549   EXPECT_EQ("#warning 1", format("  #  warning 1"));
8550 }
8551 
8552 TEST_F(FormatTest, FormatHashIfExpressions) {
8553   verifyFormat("#if AAAA && BBBB");
8554   verifyFormat("#if (AAAA && BBBB)");
8555   verifyFormat("#elif (AAAA && BBBB)");
8556   // FIXME: Come up with a better indentation for #elif.
8557   verifyFormat(
8558       "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) &&  \\\n"
8559       "    defined(BBBBBBBB)\n"
8560       "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) &&  \\\n"
8561       "    defined(BBBBBBBB)\n"
8562       "#endif",
8563       getLLVMStyleWithColumns(65));
8564 }
8565 
8566 TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
8567   FormatStyle AllowsMergedIf = getGoogleStyle();
8568   AllowsMergedIf.AllowShortIfStatementsOnASingleLine =
8569       FormatStyle::SIS_WithoutElse;
8570   verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
8571   verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
8572   verifyFormat("if (true)\n#error E\n  return 42;", AllowsMergedIf);
8573   EXPECT_EQ("if (true) return 42;",
8574             format("if (true)\nreturn 42;", AllowsMergedIf));
8575   FormatStyle ShortMergedIf = AllowsMergedIf;
8576   ShortMergedIf.ColumnLimit = 25;
8577   verifyFormat("#define A \\\n"
8578                "  if (true) return 42;",
8579                ShortMergedIf);
8580   verifyFormat("#define A \\\n"
8581                "  f();    \\\n"
8582                "  if (true)\n"
8583                "#define B",
8584                ShortMergedIf);
8585   verifyFormat("#define A \\\n"
8586                "  f();    \\\n"
8587                "  if (true)\n"
8588                "g();",
8589                ShortMergedIf);
8590   verifyFormat("{\n"
8591                "#ifdef A\n"
8592                "  // Comment\n"
8593                "  if (true) continue;\n"
8594                "#endif\n"
8595                "  // Comment\n"
8596                "  if (true) continue;\n"
8597                "}",
8598                ShortMergedIf);
8599   ShortMergedIf.ColumnLimit = 33;
8600   verifyFormat("#define A \\\n"
8601                "  if constexpr (true) return 42;",
8602                ShortMergedIf);
8603   ShortMergedIf.ColumnLimit = 29;
8604   verifyFormat("#define A                   \\\n"
8605                "  if (aaaaaaaaaa) return 1; \\\n"
8606                "  return 2;",
8607                ShortMergedIf);
8608   ShortMergedIf.ColumnLimit = 28;
8609   verifyFormat("#define A         \\\n"
8610                "  if (aaaaaaaaaa) \\\n"
8611                "    return 1;     \\\n"
8612                "  return 2;",
8613                ShortMergedIf);
8614   verifyFormat("#define A                \\\n"
8615                "  if constexpr (aaaaaaa) \\\n"
8616                "    return 1;            \\\n"
8617                "  return 2;",
8618                ShortMergedIf);
8619 }
8620 
8621 TEST_F(FormatTest, FormatStarDependingOnContext) {
8622   verifyFormat("void f(int *a);");
8623   verifyFormat("void f() { f(fint * b); }");
8624   verifyFormat("class A {\n  void f(int *a);\n};");
8625   verifyFormat("class A {\n  int *a;\n};");
8626   verifyFormat("namespace a {\n"
8627                "namespace b {\n"
8628                "class A {\n"
8629                "  void f() {}\n"
8630                "  int *a;\n"
8631                "};\n"
8632                "} // namespace b\n"
8633                "} // namespace a");
8634 }
8635 
8636 TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
8637   verifyFormat("while");
8638   verifyFormat("operator");
8639 }
8640 
8641 TEST_F(FormatTest, SkipsDeeplyNestedLines) {
8642   // This code would be painfully slow to format if we didn't skip it.
8643   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
8644                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
8645                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
8646                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
8647                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
8648                    "A(1, 1)\n"
8649                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
8650                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8651                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8652                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8653                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8654                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8655                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8656                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8657                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8658                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n");
8659   // Deeply nested part is untouched, rest is formatted.
8660   EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
8661             format(std::string("int    i;\n") + Code + "int    j;\n",
8662                    getLLVMStyle(), SC_ExpectIncomplete));
8663 }
8664 
8665 //===----------------------------------------------------------------------===//
8666 // Objective-C tests.
8667 //===----------------------------------------------------------------------===//
8668 
8669 TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
8670   verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
8671   EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
8672             format("-(NSUInteger)indexOfObject:(id)anObject;"));
8673   EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
8674   EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
8675   EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
8676             format("-(NSInteger)Method3:(id)anObject;"));
8677   EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
8678             format("-(NSInteger)Method4:(id)anObject;"));
8679   EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
8680             format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
8681   EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
8682             format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
8683   EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
8684             "forAllCells:(BOOL)flag;",
8685             format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
8686                    "forAllCells:(BOOL)flag;"));
8687 
8688   // Very long objectiveC method declaration.
8689   verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
8690                "    (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
8691   verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
8692                "                    inRange:(NSRange)range\n"
8693                "                   outRange:(NSRange)out_range\n"
8694                "                  outRange1:(NSRange)out_range1\n"
8695                "                  outRange2:(NSRange)out_range2\n"
8696                "                  outRange3:(NSRange)out_range3\n"
8697                "                  outRange4:(NSRange)out_range4\n"
8698                "                  outRange5:(NSRange)out_range5\n"
8699                "                  outRange6:(NSRange)out_range6\n"
8700                "                  outRange7:(NSRange)out_range7\n"
8701                "                  outRange8:(NSRange)out_range8\n"
8702                "                  outRange9:(NSRange)out_range9;");
8703 
8704   // When the function name has to be wrapped.
8705   FormatStyle Style = getLLVMStyle();
8706   // ObjC ignores IndentWrappedFunctionNames when wrapping methods
8707   // and always indents instead.
8708   Style.IndentWrappedFunctionNames = false;
8709   verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
8710                "    veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
8711                "               anotherName:(NSString)bbbbbbbbbbbbbb {\n"
8712                "}",
8713                Style);
8714   Style.IndentWrappedFunctionNames = true;
8715   verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
8716                "    veryLooooooooooongName:(NSString)cccccccccccccc\n"
8717                "               anotherName:(NSString)dddddddddddddd {\n"
8718                "}",
8719                Style);
8720 
8721   verifyFormat("- (int)sum:(vector<int>)numbers;");
8722   verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
8723   // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
8724   // protocol lists (but not for template classes):
8725   // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
8726 
8727   verifyFormat("- (int (*)())foo:(int (*)())f;");
8728   verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
8729 
8730   // If there's no return type (very rare in practice!), LLVM and Google style
8731   // agree.
8732   verifyFormat("- foo;");
8733   verifyFormat("- foo:(int)f;");
8734   verifyGoogleFormat("- foo:(int)foo;");
8735 }
8736 
8737 
8738 TEST_F(FormatTest, BreaksStringLiterals) {
8739   EXPECT_EQ("\"some text \"\n"
8740             "\"other\";",
8741             format("\"some text other\";", getLLVMStyleWithColumns(12)));
8742   EXPECT_EQ("\"some text \"\n"
8743             "\"other\";",
8744             format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
8745   EXPECT_EQ(
8746       "#define A  \\\n"
8747       "  \"some \"  \\\n"
8748       "  \"text \"  \\\n"
8749       "  \"other\";",
8750       format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
8751   EXPECT_EQ(
8752       "#define A  \\\n"
8753       "  \"so \"    \\\n"
8754       "  \"text \"  \\\n"
8755       "  \"other\";",
8756       format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
8757 
8758   EXPECT_EQ("\"some text\"",
8759             format("\"some text\"", getLLVMStyleWithColumns(1)));
8760   EXPECT_EQ("\"some text\"",
8761             format("\"some text\"", getLLVMStyleWithColumns(11)));
8762   EXPECT_EQ("\"some \"\n"
8763             "\"text\"",
8764             format("\"some text\"", getLLVMStyleWithColumns(10)));
8765   EXPECT_EQ("\"some \"\n"
8766             "\"text\"",
8767             format("\"some text\"", getLLVMStyleWithColumns(7)));
8768   EXPECT_EQ("\"some\"\n"
8769             "\" tex\"\n"
8770             "\"t\"",
8771             format("\"some text\"", getLLVMStyleWithColumns(6)));
8772   EXPECT_EQ("\"some\"\n"
8773             "\" tex\"\n"
8774             "\" and\"",
8775             format("\"some tex and\"", getLLVMStyleWithColumns(6)));
8776   EXPECT_EQ("\"some\"\n"
8777             "\"/tex\"\n"
8778             "\"/and\"",
8779             format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
8780 
8781   EXPECT_EQ("variable =\n"
8782             "    \"long string \"\n"
8783             "    \"literal\";",
8784             format("variable = \"long string literal\";",
8785                    getLLVMStyleWithColumns(20)));
8786 
8787   EXPECT_EQ("variable = f(\n"
8788             "    \"long string \"\n"
8789             "    \"literal\",\n"
8790             "    short,\n"
8791             "    loooooooooooooooooooong);",
8792             format("variable = f(\"long string literal\", short, "
8793                    "loooooooooooooooooooong);",
8794                    getLLVMStyleWithColumns(20)));
8795 
8796   EXPECT_EQ(
8797       "f(g(\"long string \"\n"
8798       "    \"literal\"),\n"
8799       "  b);",
8800       format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
8801   EXPECT_EQ("f(g(\"long string \"\n"
8802             "    \"literal\",\n"
8803             "    a),\n"
8804             "  b);",
8805             format("f(g(\"long string literal\", a), b);",
8806                    getLLVMStyleWithColumns(20)));
8807   EXPECT_EQ(
8808       "f(\"one two\".split(\n"
8809       "    variable));",
8810       format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
8811   EXPECT_EQ("f(\"one two three four five six \"\n"
8812             "  \"seven\".split(\n"
8813             "      really_looooong_variable));",
8814             format("f(\"one two three four five six seven\"."
8815                    "split(really_looooong_variable));",
8816                    getLLVMStyleWithColumns(33)));
8817 
8818   EXPECT_EQ("f(\"some \"\n"
8819             "  \"text\",\n"
8820             "  other);",
8821             format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
8822 
8823   // Only break as a last resort.
8824   verifyFormat(
8825       "aaaaaaaaaaaaaaaaaaaa(\n"
8826       "    aaaaaaaaaaaaaaaaaaaa,\n"
8827       "    aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
8828 
8829   EXPECT_EQ("\"splitmea\"\n"
8830             "\"trandomp\"\n"
8831             "\"oint\"",
8832             format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
8833 
8834   EXPECT_EQ("\"split/\"\n"
8835             "\"pathat/\"\n"
8836             "\"slashes\"",
8837             format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
8838 
8839   EXPECT_EQ("\"split/\"\n"
8840             "\"pathat/\"\n"
8841             "\"slashes\"",
8842             format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
8843   EXPECT_EQ("\"split at \"\n"
8844             "\"spaces/at/\"\n"
8845             "\"slashes.at.any$\"\n"
8846             "\"non-alphanumeric%\"\n"
8847             "\"1111111111characte\"\n"
8848             "\"rs\"",
8849             format("\"split at "
8850                    "spaces/at/"
8851                    "slashes.at."
8852                    "any$non-"
8853                    "alphanumeric%"
8854                    "1111111111characte"
8855                    "rs\"",
8856                    getLLVMStyleWithColumns(20)));
8857 
8858   // Verify that splitting the strings understands
8859   // Style::AlwaysBreakBeforeMultilineStrings.
8860   EXPECT_EQ(
8861       "aaaaaaaaaaaa(\n"
8862       "    \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
8863       "    \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
8864       format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
8865              "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
8866              "aaaaaaaaaaaaaaaaaaaaaa\");",
8867              getGoogleStyle()));
8868   EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8869             "       \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
8870             format("return \"aaaaaaaaaaaaaaaaaaaaaa "
8871                    "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
8872                    "aaaaaaaaaaaaaaaaaaaaaa\";",
8873                    getGoogleStyle()));
8874   EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8875             "                \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
8876             format("llvm::outs() << "
8877                    "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
8878                    "aaaaaaaaaaaaaaaaaaa\";"));
8879   EXPECT_EQ("ffff(\n"
8880             "    {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8881             "     \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
8882             format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
8883                    "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
8884                    getGoogleStyle()));
8885 
8886   FormatStyle Style = getLLVMStyleWithColumns(12);
8887   Style.BreakStringLiterals = false;
8888   EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
8889 
8890   FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
8891   AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
8892   EXPECT_EQ("#define A \\\n"
8893             "  \"some \" \\\n"
8894             "  \"text \" \\\n"
8895             "  \"other\";",
8896             format("#define A \"some text other\";", AlignLeft));
8897 }
8898 
8899 TEST_F(FormatTest, BreaksStringLiteralsAtColumnLimit) {
8900   EXPECT_EQ("C a = \"some more \"\n"
8901             "      \"text\";",
8902             format("C a = \"some more text\";", getLLVMStyleWithColumns(18)));
8903 }
8904 
8905 TEST_F(FormatTest, FullyRemoveEmptyLines) {
8906   FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
8907   NoEmptyLines.MaxEmptyLinesToKeep = 0;
8908   EXPECT_EQ("int i = a(b());",
8909             format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
8910 }
8911 
8912 TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
8913   EXPECT_EQ(
8914       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
8915       "(\n"
8916       "    \"x\t\");",
8917       format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
8918              "aaaaaaa("
8919              "\"x\t\");"));
8920 }
8921 
8922 TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
8923   EXPECT_EQ(
8924       "u8\"utf8 string \"\n"
8925       "u8\"literal\";",
8926       format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
8927   EXPECT_EQ(
8928       "u\"utf16 string \"\n"
8929       "u\"literal\";",
8930       format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
8931   EXPECT_EQ(
8932       "U\"utf32 string \"\n"
8933       "U\"literal\";",
8934       format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
8935   EXPECT_EQ("L\"wide string \"\n"
8936             "L\"literal\";",
8937             format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
8938   EXPECT_EQ("@\"NSString \"\n"
8939             "@\"literal\";",
8940             format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
8941   verifyFormat(R"(NSString *s = @"那那那那";)", getLLVMStyleWithColumns(26));
8942 
8943   // This input makes clang-format try to split the incomplete unicode escape
8944   // sequence, which used to lead to a crasher.
8945   verifyNoCrash(
8946       "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
8947       getLLVMStyleWithColumns(60));
8948 }
8949 
8950 TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
8951   FormatStyle Style = getGoogleStyleWithColumns(15);
8952   EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
8953   EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
8954   EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
8955   EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
8956   EXPECT_EQ("u8R\"x(raw literal)x\";",
8957             format("u8R\"x(raw literal)x\";", Style));
8958 }
8959 
8960 TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
8961   FormatStyle Style = getLLVMStyleWithColumns(20);
8962   EXPECT_EQ(
8963       "_T(\"aaaaaaaaaaaaaa\")\n"
8964       "_T(\"aaaaaaaaaaaaaa\")\n"
8965       "_T(\"aaaaaaaaaaaa\")",
8966       format("  _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
8967   EXPECT_EQ("f(x,\n"
8968             "  _T(\"aaaaaaaaaaaa\")\n"
8969             "  _T(\"aaa\"),\n"
8970             "  z);",
8971             format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
8972 
8973   // FIXME: Handle embedded spaces in one iteration.
8974   //  EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
8975   //            "_T(\"aaaaaaaaaaaaa\")\n"
8976   //            "_T(\"aaaaaaaaaaaaa\")\n"
8977   //            "_T(\"a\")",
8978   //            format("  _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
8979   //                   getLLVMStyleWithColumns(20)));
8980   EXPECT_EQ(
8981       "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
8982       format("  _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
8983   EXPECT_EQ("f(\n"
8984             "#if !TEST\n"
8985             "    _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
8986             "#endif\n"
8987             ");",
8988             format("f(\n"
8989                    "#if !TEST\n"
8990                    "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
8991                    "#endif\n"
8992                    ");"));
8993   EXPECT_EQ("f(\n"
8994             "\n"
8995             "    _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
8996             format("f(\n"
8997                    "\n"
8998                    "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
8999 }
9000 
9001 TEST_F(FormatTest, BreaksStringLiteralOperands) {
9002   // In a function call with two operands, the second can be broken with no line
9003   // break before it.
9004   EXPECT_EQ("func(a, \"long long \"\n"
9005             "        \"long long\");",
9006             format("func(a, \"long long long long\");",
9007                    getLLVMStyleWithColumns(24)));
9008   // In a function call with three operands, the second must be broken with a
9009   // line break before it.
9010   EXPECT_EQ("func(a,\n"
9011             "     \"long long long \"\n"
9012             "     \"long\",\n"
9013             "     c);",
9014             format("func(a, \"long long long long\", c);",
9015                    getLLVMStyleWithColumns(24)));
9016   // In a function call with three operands, the third must be broken with a
9017   // line break before it.
9018   EXPECT_EQ("func(a, b,\n"
9019             "     \"long long long \"\n"
9020             "     \"long\");",
9021             format("func(a, b, \"long long long long\");",
9022                    getLLVMStyleWithColumns(24)));
9023   // In a function call with three operands, both the second and the third must
9024   // be broken with a line break before them.
9025   EXPECT_EQ("func(a,\n"
9026             "     \"long long long \"\n"
9027             "     \"long\",\n"
9028             "     \"long long long \"\n"
9029             "     \"long\");",
9030             format("func(a, \"long long long long\", \"long long long long\");",
9031                    getLLVMStyleWithColumns(24)));
9032   // In a chain of << with two operands, the second can be broken with no line
9033   // break before it.
9034   EXPECT_EQ("a << \"line line \"\n"
9035             "     \"line\";",
9036             format("a << \"line line line\";",
9037                    getLLVMStyleWithColumns(20)));
9038   // In a chain of << with three operands, the second can be broken with no line
9039   // break before it.
9040   EXPECT_EQ("abcde << \"line \"\n"
9041             "         \"line line\"\n"
9042             "      << c;",
9043             format("abcde << \"line line line\" << c;",
9044                    getLLVMStyleWithColumns(20)));
9045   // In a chain of << with three operands, the third must be broken with a line
9046   // break before it.
9047   EXPECT_EQ("a << b\n"
9048             "  << \"line line \"\n"
9049             "     \"line\";",
9050             format("a << b << \"line line line\";",
9051                    getLLVMStyleWithColumns(20)));
9052   // In a chain of << with three operands, the second can be broken with no line
9053   // break before it and the third must be broken with a line break before it.
9054   EXPECT_EQ("abcd << \"line line \"\n"
9055             "        \"line\"\n"
9056             "     << \"line line \"\n"
9057             "        \"line\";",
9058             format("abcd << \"line line line\" << \"line line line\";",
9059                    getLLVMStyleWithColumns(20)));
9060   // In a chain of binary operators with two operands, the second can be broken
9061   // with no line break before it.
9062   EXPECT_EQ("abcd + \"line line \"\n"
9063             "       \"line line\";",
9064             format("abcd + \"line line line line\";",
9065                    getLLVMStyleWithColumns(20)));
9066   // In a chain of binary operators with three operands, the second must be
9067   // broken with a line break before it.
9068   EXPECT_EQ("abcd +\n"
9069             "    \"line line \"\n"
9070             "    \"line line\" +\n"
9071             "    e;",
9072             format("abcd + \"line line line line\" + e;",
9073                    getLLVMStyleWithColumns(20)));
9074   // In a function call with two operands, with AlignAfterOpenBracket enabled,
9075   // the first must be broken with a line break before it.
9076   FormatStyle Style = getLLVMStyleWithColumns(25);
9077   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
9078   EXPECT_EQ("someFunction(\n"
9079             "    \"long long long \"\n"
9080             "    \"long\",\n"
9081             "    a);",
9082             format("someFunction(\"long long long long\", a);", Style));
9083 }
9084 
9085 TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
9086   EXPECT_EQ(
9087       "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
9088       "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
9089       "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
9090       format("aaaaaaaaaaa  =  \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
9091              "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
9092              "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
9093 }
9094 
9095 TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
9096   EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
9097             format("f(g(R\"x(raw literal)x\",   a), b);", getGoogleStyle()));
9098   EXPECT_EQ("fffffffffff(g(R\"x(\n"
9099             "multiline raw string literal xxxxxxxxxxxxxx\n"
9100             ")x\",\n"
9101             "              a),\n"
9102             "            b);",
9103             format("fffffffffff(g(R\"x(\n"
9104                    "multiline raw string literal xxxxxxxxxxxxxx\n"
9105                    ")x\", a), b);",
9106                    getGoogleStyleWithColumns(20)));
9107   EXPECT_EQ("fffffffffff(\n"
9108             "    g(R\"x(qqq\n"
9109             "multiline raw string literal xxxxxxxxxxxxxx\n"
9110             ")x\",\n"
9111             "      a),\n"
9112             "    b);",
9113             format("fffffffffff(g(R\"x(qqq\n"
9114                    "multiline raw string literal xxxxxxxxxxxxxx\n"
9115                    ")x\", a), b);",
9116                    getGoogleStyleWithColumns(20)));
9117 
9118   EXPECT_EQ("fffffffffff(R\"x(\n"
9119             "multiline raw string literal xxxxxxxxxxxxxx\n"
9120             ")x\");",
9121             format("fffffffffff(R\"x(\n"
9122                    "multiline raw string literal xxxxxxxxxxxxxx\n"
9123                    ")x\");",
9124                    getGoogleStyleWithColumns(20)));
9125   EXPECT_EQ("fffffffffff(R\"x(\n"
9126             "multiline raw string literal xxxxxxxxxxxxxx\n"
9127             ")x\" + bbbbbb);",
9128             format("fffffffffff(R\"x(\n"
9129                    "multiline raw string literal xxxxxxxxxxxxxx\n"
9130                    ")x\" +   bbbbbb);",
9131                    getGoogleStyleWithColumns(20)));
9132   EXPECT_EQ("fffffffffff(\n"
9133             "    R\"x(\n"
9134             "multiline raw string literal xxxxxxxxxxxxxx\n"
9135             ")x\" +\n"
9136             "    bbbbbb);",
9137             format("fffffffffff(\n"
9138                    " R\"x(\n"
9139                    "multiline raw string literal xxxxxxxxxxxxxx\n"
9140                    ")x\" + bbbbbb);",
9141                    getGoogleStyleWithColumns(20)));
9142   EXPECT_EQ("fffffffffff(R\"(single line raw string)\" + bbbbbb);",
9143             format("fffffffffff(\n"
9144                    " R\"(single line raw string)\" + bbbbbb);"));
9145 }
9146 
9147 TEST_F(FormatTest, SkipsUnknownStringLiterals) {
9148   verifyFormat("string a = \"unterminated;");
9149   EXPECT_EQ("function(\"unterminated,\n"
9150             "         OtherParameter);",
9151             format("function(  \"unterminated,\n"
9152                    "    OtherParameter);"));
9153 }
9154 
9155 TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
9156   FormatStyle Style = getLLVMStyle();
9157   Style.Standard = FormatStyle::LS_Cpp03;
9158   EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
9159             format("#define x(_a) printf(\"foo\"_a);", Style));
9160 }
9161 
9162 TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
9163 
9164 TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
9165   EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
9166             "             \"ddeeefff\");",
9167             format("someFunction(\"aaabbbcccdddeeefff\");",
9168                    getLLVMStyleWithColumns(25)));
9169   EXPECT_EQ("someFunction1234567890(\n"
9170             "    \"aaabbbcccdddeeefff\");",
9171             format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
9172                    getLLVMStyleWithColumns(26)));
9173   EXPECT_EQ("someFunction1234567890(\n"
9174             "    \"aaabbbcccdddeeeff\"\n"
9175             "    \"f\");",
9176             format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
9177                    getLLVMStyleWithColumns(25)));
9178   EXPECT_EQ("someFunction1234567890(\n"
9179             "    \"aaabbbcccdddeeeff\"\n"
9180             "    \"f\");",
9181             format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
9182                    getLLVMStyleWithColumns(24)));
9183   EXPECT_EQ("someFunction(\n"
9184             "    \"aaabbbcc ddde \"\n"
9185             "    \"efff\");",
9186             format("someFunction(\"aaabbbcc ddde efff\");",
9187                    getLLVMStyleWithColumns(25)));
9188   EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
9189             "             \"ddeeefff\");",
9190             format("someFunction(\"aaabbbccc ddeeefff\");",
9191                    getLLVMStyleWithColumns(25)));
9192   EXPECT_EQ("someFunction1234567890(\n"
9193             "    \"aaabb \"\n"
9194             "    \"cccdddeeefff\");",
9195             format("someFunction1234567890(\"aaabb cccdddeeefff\");",
9196                    getLLVMStyleWithColumns(25)));
9197   EXPECT_EQ("#define A          \\\n"
9198             "  string s =       \\\n"
9199             "      \"123456789\"  \\\n"
9200             "      \"0\";         \\\n"
9201             "  int i;",
9202             format("#define A string s = \"1234567890\"; int i;",
9203                    getLLVMStyleWithColumns(20)));
9204   EXPECT_EQ("someFunction(\n"
9205             "    \"aaabbbcc \"\n"
9206             "    \"dddeeefff\");",
9207             format("someFunction(\"aaabbbcc dddeeefff\");",
9208                    getLLVMStyleWithColumns(25)));
9209 }
9210 
9211 TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
9212   EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
9213   EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
9214   EXPECT_EQ("\"test\"\n"
9215             "\"\\n\"",
9216             format("\"test\\n\"", getLLVMStyleWithColumns(7)));
9217   EXPECT_EQ("\"tes\\\\\"\n"
9218             "\"n\"",
9219             format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
9220   EXPECT_EQ("\"\\\\\\\\\"\n"
9221             "\"\\n\"",
9222             format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
9223   EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
9224   EXPECT_EQ("\"\\uff01\"\n"
9225             "\"test\"",
9226             format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
9227   EXPECT_EQ("\"\\Uff01ff02\"",
9228             format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
9229   EXPECT_EQ("\"\\x000000000001\"\n"
9230             "\"next\"",
9231             format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
9232   EXPECT_EQ("\"\\x000000000001next\"",
9233             format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
9234   EXPECT_EQ("\"\\x000000000001\"",
9235             format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
9236   EXPECT_EQ("\"test\"\n"
9237             "\"\\000000\"\n"
9238             "\"000001\"",
9239             format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
9240   EXPECT_EQ("\"test\\000\"\n"
9241             "\"00000000\"\n"
9242             "\"1\"",
9243             format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
9244 }
9245 
9246 TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
9247   verifyFormat("void f() {\n"
9248                "  return g() {}\n"
9249                "  void h() {}");
9250   verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
9251                "g();\n"
9252                "}");
9253 }
9254 
9255 TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
9256   verifyFormat(
9257       "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
9258 }
9259 
9260 TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
9261   verifyFormat("class X {\n"
9262                "  void f() {\n"
9263                "  }\n"
9264                "};",
9265                getLLVMStyleWithColumns(12));
9266 }
9267 
9268 TEST_F(FormatTest, ConfigurableIndentWidth) {
9269   FormatStyle EightIndent = getLLVMStyleWithColumns(18);
9270   EightIndent.IndentWidth = 8;
9271   EightIndent.ContinuationIndentWidth = 8;
9272   verifyFormat("void f() {\n"
9273                "        someFunction();\n"
9274                "        if (true) {\n"
9275                "                f();\n"
9276                "        }\n"
9277                "}",
9278                EightIndent);
9279   verifyFormat("class X {\n"
9280                "        void f() {\n"
9281                "        }\n"
9282                "};",
9283                EightIndent);
9284   verifyFormat("int x[] = {\n"
9285                "        call(),\n"
9286                "        call()};",
9287                EightIndent);
9288 }
9289 
9290 TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
9291   verifyFormat("double\n"
9292                "f();",
9293                getLLVMStyleWithColumns(8));
9294 }
9295 
9296 TEST_F(FormatTest, ConfigurableUseOfTab) {
9297   FormatStyle Tab = getLLVMStyleWithColumns(42);
9298   Tab.IndentWidth = 8;
9299   Tab.UseTab = FormatStyle::UT_Always;
9300   Tab.AlignEscapedNewlines = FormatStyle::ENAS_Left;
9301 
9302   EXPECT_EQ("if (aaaaaaaa && // q\n"
9303             "    bb)\t\t// w\n"
9304             "\t;",
9305             format("if (aaaaaaaa &&// q\n"
9306                    "bb)// w\n"
9307                    ";",
9308                    Tab));
9309   EXPECT_EQ("if (aaa && bbb) // w\n"
9310             "\t;",
9311             format("if(aaa&&bbb)// w\n"
9312                    ";",
9313                    Tab));
9314 
9315   verifyFormat("class X {\n"
9316                "\tvoid f() {\n"
9317                "\t\tsomeFunction(parameter1,\n"
9318                "\t\t\t     parameter2);\n"
9319                "\t}\n"
9320                "};",
9321                Tab);
9322   verifyFormat("#define A                        \\\n"
9323                "\tvoid f() {               \\\n"
9324                "\t\tsomeFunction(    \\\n"
9325                "\t\t    parameter1,  \\\n"
9326                "\t\t    parameter2); \\\n"
9327                "\t}",
9328                Tab);
9329   verifyFormat("int a;\t      // x\n"
9330                "int bbbbbbbb; // x\n",
9331                Tab);
9332 
9333   Tab.TabWidth = 4;
9334   Tab.IndentWidth = 8;
9335   verifyFormat("class TabWidth4Indent8 {\n"
9336                "\t\tvoid f() {\n"
9337                "\t\t\t\tsomeFunction(parameter1,\n"
9338                "\t\t\t\t\t\t\t parameter2);\n"
9339                "\t\t}\n"
9340                "};",
9341                Tab);
9342 
9343   Tab.TabWidth = 4;
9344   Tab.IndentWidth = 4;
9345   verifyFormat("class TabWidth4Indent4 {\n"
9346                "\tvoid f() {\n"
9347                "\t\tsomeFunction(parameter1,\n"
9348                "\t\t\t\t\t parameter2);\n"
9349                "\t}\n"
9350                "};",
9351                Tab);
9352 
9353   Tab.TabWidth = 8;
9354   Tab.IndentWidth = 4;
9355   verifyFormat("class TabWidth8Indent4 {\n"
9356                "    void f() {\n"
9357                "\tsomeFunction(parameter1,\n"
9358                "\t\t     parameter2);\n"
9359                "    }\n"
9360                "};",
9361                Tab);
9362 
9363   Tab.TabWidth = 8;
9364   Tab.IndentWidth = 8;
9365   EXPECT_EQ("/*\n"
9366             "\t      a\t\tcomment\n"
9367             "\t      in multiple lines\n"
9368             "       */",
9369             format("   /*\t \t \n"
9370                    " \t \t a\t\tcomment\t \t\n"
9371                    " \t \t in multiple lines\t\n"
9372                    " \t  */",
9373                    Tab));
9374 
9375   Tab.UseTab = FormatStyle::UT_ForIndentation;
9376   verifyFormat("{\n"
9377                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9378                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9379                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9380                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9381                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9382                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9383                "};",
9384                Tab);
9385   verifyFormat("enum AA {\n"
9386                "\ta1, // Force multiple lines\n"
9387                "\ta2,\n"
9388                "\ta3\n"
9389                "};",
9390                Tab);
9391   EXPECT_EQ("if (aaaaaaaa && // q\n"
9392             "    bb)         // w\n"
9393             "\t;",
9394             format("if (aaaaaaaa &&// q\n"
9395                    "bb)// w\n"
9396                    ";",
9397                    Tab));
9398   verifyFormat("class X {\n"
9399                "\tvoid f() {\n"
9400                "\t\tsomeFunction(parameter1,\n"
9401                "\t\t             parameter2);\n"
9402                "\t}\n"
9403                "};",
9404                Tab);
9405   verifyFormat("{\n"
9406                "\tQ(\n"
9407                "\t    {\n"
9408                "\t\t    int a;\n"
9409                "\t\t    someFunction(aaaaaaaa,\n"
9410                "\t\t                 bbbbbbb);\n"
9411                "\t    },\n"
9412                "\t    p);\n"
9413                "}",
9414                Tab);
9415   EXPECT_EQ("{\n"
9416             "\t/* aaaa\n"
9417             "\t   bbbb */\n"
9418             "}",
9419             format("{\n"
9420                    "/* aaaa\n"
9421                    "   bbbb */\n"
9422                    "}",
9423                    Tab));
9424   EXPECT_EQ("{\n"
9425             "\t/*\n"
9426             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
9427             "\t  bbbbbbbbbbbbb\n"
9428             "\t*/\n"
9429             "}",
9430             format("{\n"
9431                    "/*\n"
9432                    "  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
9433                    "*/\n"
9434                    "}",
9435                    Tab));
9436   EXPECT_EQ("{\n"
9437             "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
9438             "\t// bbbbbbbbbbbbb\n"
9439             "}",
9440             format("{\n"
9441                    "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
9442                    "}",
9443                    Tab));
9444   EXPECT_EQ("{\n"
9445             "\t/*\n"
9446             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
9447             "\t  bbbbbbbbbbbbb\n"
9448             "\t*/\n"
9449             "}",
9450             format("{\n"
9451                    "\t/*\n"
9452                    "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
9453                    "\t*/\n"
9454                    "}",
9455                    Tab));
9456   EXPECT_EQ("{\n"
9457             "\t/*\n"
9458             "\n"
9459             "\t*/\n"
9460             "}",
9461             format("{\n"
9462                    "\t/*\n"
9463                    "\n"
9464                    "\t*/\n"
9465                    "}",
9466                    Tab));
9467   EXPECT_EQ("{\n"
9468             "\t/*\n"
9469             " asdf\n"
9470             "\t*/\n"
9471             "}",
9472             format("{\n"
9473                    "\t/*\n"
9474                    " asdf\n"
9475                    "\t*/\n"
9476                    "}",
9477                    Tab));
9478 
9479   Tab.UseTab = FormatStyle::UT_Never;
9480   EXPECT_EQ("/*\n"
9481             "              a\t\tcomment\n"
9482             "              in multiple lines\n"
9483             "       */",
9484             format("   /*\t \t \n"
9485                    " \t \t a\t\tcomment\t \t\n"
9486                    " \t \t in multiple lines\t\n"
9487                    " \t  */",
9488                    Tab));
9489   EXPECT_EQ("/* some\n"
9490             "   comment */",
9491             format(" \t \t /* some\n"
9492                    " \t \t    comment */",
9493                    Tab));
9494   EXPECT_EQ("int a; /* some\n"
9495             "   comment */",
9496             format(" \t \t int a; /* some\n"
9497                    " \t \t    comment */",
9498                    Tab));
9499 
9500   EXPECT_EQ("int a; /* some\n"
9501             "comment */",
9502             format(" \t \t int\ta; /* some\n"
9503                    " \t \t    comment */",
9504                    Tab));
9505   EXPECT_EQ("f(\"\t\t\"); /* some\n"
9506             "    comment */",
9507             format(" \t \t f(\"\t\t\"); /* some\n"
9508                    " \t \t    comment */",
9509                    Tab));
9510   EXPECT_EQ("{\n"
9511             "  /*\n"
9512             "   * Comment\n"
9513             "   */\n"
9514             "  int i;\n"
9515             "}",
9516             format("{\n"
9517                    "\t/*\n"
9518                    "\t * Comment\n"
9519                    "\t */\n"
9520                    "\t int i;\n"
9521                    "}"));
9522 
9523   Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
9524   Tab.TabWidth = 8;
9525   Tab.IndentWidth = 8;
9526   EXPECT_EQ("if (aaaaaaaa && // q\n"
9527             "    bb)         // w\n"
9528             "\t;",
9529             format("if (aaaaaaaa &&// q\n"
9530                    "bb)// w\n"
9531                    ";",
9532                    Tab));
9533   EXPECT_EQ("if (aaa && bbb) // w\n"
9534             "\t;",
9535             format("if(aaa&&bbb)// w\n"
9536                    ";",
9537                    Tab));
9538   verifyFormat("class X {\n"
9539                "\tvoid f() {\n"
9540                "\t\tsomeFunction(parameter1,\n"
9541                "\t\t\t     parameter2);\n"
9542                "\t}\n"
9543                "};",
9544                Tab);
9545   verifyFormat("#define A                        \\\n"
9546                "\tvoid f() {               \\\n"
9547                "\t\tsomeFunction(    \\\n"
9548                "\t\t    parameter1,  \\\n"
9549                "\t\t    parameter2); \\\n"
9550                "\t}",
9551                Tab);
9552   Tab.TabWidth = 4;
9553   Tab.IndentWidth = 8;
9554   verifyFormat("class TabWidth4Indent8 {\n"
9555                "\t\tvoid f() {\n"
9556                "\t\t\t\tsomeFunction(parameter1,\n"
9557                "\t\t\t\t\t\t\t parameter2);\n"
9558                "\t\t}\n"
9559                "};",
9560                Tab);
9561   Tab.TabWidth = 4;
9562   Tab.IndentWidth = 4;
9563   verifyFormat("class TabWidth4Indent4 {\n"
9564                "\tvoid f() {\n"
9565                "\t\tsomeFunction(parameter1,\n"
9566                "\t\t\t\t\t parameter2);\n"
9567                "\t}\n"
9568                "};",
9569                Tab);
9570   Tab.TabWidth = 8;
9571   Tab.IndentWidth = 4;
9572   verifyFormat("class TabWidth8Indent4 {\n"
9573                "    void f() {\n"
9574                "\tsomeFunction(parameter1,\n"
9575                "\t\t     parameter2);\n"
9576                "    }\n"
9577                "};",
9578                Tab);
9579   Tab.TabWidth = 8;
9580   Tab.IndentWidth = 8;
9581   EXPECT_EQ("/*\n"
9582             "\t      a\t\tcomment\n"
9583             "\t      in multiple lines\n"
9584             "       */",
9585             format("   /*\t \t \n"
9586                    " \t \t a\t\tcomment\t \t\n"
9587                    " \t \t in multiple lines\t\n"
9588                    " \t  */",
9589                    Tab));
9590   verifyFormat("{\n"
9591                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9592                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9593                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9594                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9595                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9596                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9597                "};",
9598                Tab);
9599   verifyFormat("enum AA {\n"
9600                "\ta1, // Force multiple lines\n"
9601                "\ta2,\n"
9602                "\ta3\n"
9603                "};",
9604                Tab);
9605   EXPECT_EQ("if (aaaaaaaa && // q\n"
9606             "    bb)         // w\n"
9607             "\t;",
9608             format("if (aaaaaaaa &&// q\n"
9609                    "bb)// w\n"
9610                    ";",
9611                    Tab));
9612   verifyFormat("class X {\n"
9613                "\tvoid f() {\n"
9614                "\t\tsomeFunction(parameter1,\n"
9615                "\t\t\t     parameter2);\n"
9616                "\t}\n"
9617                "};",
9618                Tab);
9619   verifyFormat("{\n"
9620                "\tQ(\n"
9621                "\t    {\n"
9622                "\t\t    int a;\n"
9623                "\t\t    someFunction(aaaaaaaa,\n"
9624                "\t\t\t\t bbbbbbb);\n"
9625                "\t    },\n"
9626                "\t    p);\n"
9627                "}",
9628                Tab);
9629   EXPECT_EQ("{\n"
9630             "\t/* aaaa\n"
9631             "\t   bbbb */\n"
9632             "}",
9633             format("{\n"
9634                    "/* aaaa\n"
9635                    "   bbbb */\n"
9636                    "}",
9637                    Tab));
9638   EXPECT_EQ("{\n"
9639             "\t/*\n"
9640             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
9641             "\t  bbbbbbbbbbbbb\n"
9642             "\t*/\n"
9643             "}",
9644             format("{\n"
9645                    "/*\n"
9646                    "  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
9647                    "*/\n"
9648                    "}",
9649                    Tab));
9650   EXPECT_EQ("{\n"
9651             "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
9652             "\t// bbbbbbbbbbbbb\n"
9653             "}",
9654             format("{\n"
9655                    "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
9656                    "}",
9657                    Tab));
9658   EXPECT_EQ("{\n"
9659             "\t/*\n"
9660             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
9661             "\t  bbbbbbbbbbbbb\n"
9662             "\t*/\n"
9663             "}",
9664             format("{\n"
9665                    "\t/*\n"
9666                    "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
9667                    "\t*/\n"
9668                    "}",
9669                    Tab));
9670   EXPECT_EQ("{\n"
9671             "\t/*\n"
9672             "\n"
9673             "\t*/\n"
9674             "}",
9675             format("{\n"
9676                    "\t/*\n"
9677                    "\n"
9678                    "\t*/\n"
9679                    "}",
9680                    Tab));
9681   EXPECT_EQ("{\n"
9682             "\t/*\n"
9683             " asdf\n"
9684             "\t*/\n"
9685             "}",
9686             format("{\n"
9687                    "\t/*\n"
9688                    " asdf\n"
9689                    "\t*/\n"
9690                    "}",
9691                    Tab));
9692   EXPECT_EQ("/*\n"
9693             "\t      a\t\tcomment\n"
9694             "\t      in multiple lines\n"
9695             "       */",
9696             format("   /*\t \t \n"
9697                    " \t \t a\t\tcomment\t \t\n"
9698                    " \t \t in multiple lines\t\n"
9699                    " \t  */",
9700                    Tab));
9701   EXPECT_EQ("/* some\n"
9702             "   comment */",
9703             format(" \t \t /* some\n"
9704                    " \t \t    comment */",
9705                    Tab));
9706   EXPECT_EQ("int a; /* some\n"
9707             "   comment */",
9708             format(" \t \t int a; /* some\n"
9709                    " \t \t    comment */",
9710                    Tab));
9711   EXPECT_EQ("int a; /* some\n"
9712             "comment */",
9713             format(" \t \t int\ta; /* some\n"
9714                    " \t \t    comment */",
9715                    Tab));
9716   EXPECT_EQ("f(\"\t\t\"); /* some\n"
9717             "    comment */",
9718             format(" \t \t f(\"\t\t\"); /* some\n"
9719                    " \t \t    comment */",
9720                    Tab));
9721   EXPECT_EQ("{\n"
9722             "  /*\n"
9723             "   * Comment\n"
9724             "   */\n"
9725             "  int i;\n"
9726             "}",
9727             format("{\n"
9728                    "\t/*\n"
9729                    "\t * Comment\n"
9730                    "\t */\n"
9731                    "\t int i;\n"
9732                    "}"));
9733   Tab.AlignConsecutiveAssignments = true;
9734   Tab.AlignConsecutiveDeclarations = true;
9735   Tab.TabWidth = 4;
9736   Tab.IndentWidth = 4;
9737   verifyFormat("class Assign {\n"
9738                "\tvoid f() {\n"
9739                "\t\tint         x      = 123;\n"
9740                "\t\tint         random = 4;\n"
9741                "\t\tstd::string alphabet =\n"
9742                "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
9743                "\t}\n"
9744                "};",
9745                Tab);
9746 }
9747 
9748 TEST_F(FormatTest, CalculatesOriginalColumn) {
9749   EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9750             "q\"; /* some\n"
9751             "       comment */",
9752             format("  \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9753                    "q\"; /* some\n"
9754                    "       comment */",
9755                    getLLVMStyle()));
9756   EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
9757             "/* some\n"
9758             "   comment */",
9759             format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
9760                    " /* some\n"
9761                    "    comment */",
9762                    getLLVMStyle()));
9763   EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9764             "qqq\n"
9765             "/* some\n"
9766             "   comment */",
9767             format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9768                    "qqq\n"
9769                    " /* some\n"
9770                    "    comment */",
9771                    getLLVMStyle()));
9772   EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9773             "wwww; /* some\n"
9774             "         comment */",
9775             format("  inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9776                    "wwww; /* some\n"
9777                    "         comment */",
9778                    getLLVMStyle()));
9779 }
9780 
9781 TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
9782   FormatStyle NoSpace = getLLVMStyle();
9783   NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
9784 
9785   verifyFormat("while(true)\n"
9786                "  continue;",
9787                NoSpace);
9788   verifyFormat("for(;;)\n"
9789                "  continue;",
9790                NoSpace);
9791   verifyFormat("if(true)\n"
9792                "  f();\n"
9793                "else if(true)\n"
9794                "  f();",
9795                NoSpace);
9796   verifyFormat("do {\n"
9797                "  do_something();\n"
9798                "} while(something());",
9799                NoSpace);
9800   verifyFormat("switch(x) {\n"
9801                "default:\n"
9802                "  break;\n"
9803                "}",
9804                NoSpace);
9805   verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
9806   verifyFormat("size_t x = sizeof(x);", NoSpace);
9807   verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
9808   verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
9809   verifyFormat("alignas(128) char a[128];", NoSpace);
9810   verifyFormat("size_t x = alignof(MyType);", NoSpace);
9811   verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
9812   verifyFormat("int f() throw(Deprecated);", NoSpace);
9813   verifyFormat("typedef void (*cb)(int);", NoSpace);
9814   verifyFormat("T A::operator()();", NoSpace);
9815   verifyFormat("X A::operator++(T);", NoSpace);
9816   verifyFormat("auto lambda = []() { return 0; };", NoSpace);
9817 
9818   FormatStyle Space = getLLVMStyle();
9819   Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
9820 
9821   verifyFormat("int f ();", Space);
9822   verifyFormat("void f (int a, T b) {\n"
9823                "  while (true)\n"
9824                "    continue;\n"
9825                "}",
9826                Space);
9827   verifyFormat("if (true)\n"
9828                "  f ();\n"
9829                "else if (true)\n"
9830                "  f ();",
9831                Space);
9832   verifyFormat("do {\n"
9833                "  do_something ();\n"
9834                "} while (something ());",
9835                Space);
9836   verifyFormat("switch (x) {\n"
9837                "default:\n"
9838                "  break;\n"
9839                "}",
9840                Space);
9841   verifyFormat("A::A () : a (1) {}", Space);
9842   verifyFormat("void f () __attribute__ ((asdf));", Space);
9843   verifyFormat("*(&a + 1);\n"
9844                "&((&a)[1]);\n"
9845                "a[(b + c) * d];\n"
9846                "(((a + 1) * 2) + 3) * 4;",
9847                Space);
9848   verifyFormat("#define A(x) x", Space);
9849   verifyFormat("#define A (x) x", Space);
9850   verifyFormat("#if defined(x)\n"
9851                "#endif",
9852                Space);
9853   verifyFormat("auto i = std::make_unique<int> (5);", Space);
9854   verifyFormat("size_t x = sizeof (x);", Space);
9855   verifyFormat("auto f (int x) -> decltype (x);", Space);
9856   verifyFormat("int f (T x) noexcept (x.create ());", Space);
9857   verifyFormat("alignas (128) char a[128];", Space);
9858   verifyFormat("size_t x = alignof (MyType);", Space);
9859   verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
9860   verifyFormat("int f () throw (Deprecated);", Space);
9861   verifyFormat("typedef void (*cb) (int);", Space);
9862   verifyFormat("T A::operator() ();", Space);
9863   verifyFormat("X A::operator++ (T);", Space);
9864   verifyFormat("auto lambda = [] () { return 0; };", Space);
9865   verifyFormat("int x = int (y);", Space);
9866 
9867   FormatStyle SomeSpace = getLLVMStyle();
9868   SomeSpace.SpaceBeforeParens = FormatStyle::SBPO_NonEmptyParentheses;
9869 
9870   verifyFormat("[]() -> float {}", SomeSpace);
9871   verifyFormat("[] (auto foo) {}", SomeSpace);
9872   verifyFormat("[foo]() -> int {}", SomeSpace);
9873   verifyFormat("int f();", SomeSpace);
9874   verifyFormat("void f (int a, T b) {\n"
9875                "  while (true)\n"
9876                "    continue;\n"
9877                "}",
9878                SomeSpace);
9879   verifyFormat("if (true)\n"
9880                "  f();\n"
9881                "else if (true)\n"
9882                "  f();",
9883                SomeSpace);
9884   verifyFormat("do {\n"
9885                "  do_something();\n"
9886                "} while (something());",
9887                SomeSpace);
9888   verifyFormat("switch (x) {\n"
9889                "default:\n"
9890                "  break;\n"
9891                "}",
9892                SomeSpace);
9893   verifyFormat("A::A() : a (1) {}", SomeSpace);
9894   verifyFormat("void f() __attribute__ ((asdf));", SomeSpace);
9895   verifyFormat("*(&a + 1);\n"
9896                "&((&a)[1]);\n"
9897                "a[(b + c) * d];\n"
9898                "(((a + 1) * 2) + 3) * 4;",
9899                SomeSpace);
9900   verifyFormat("#define A(x) x", SomeSpace);
9901   verifyFormat("#define A (x) x", SomeSpace);
9902   verifyFormat("#if defined(x)\n"
9903                "#endif",
9904                SomeSpace);
9905   verifyFormat("auto i = std::make_unique<int> (5);", SomeSpace);
9906   verifyFormat("size_t x = sizeof (x);", SomeSpace);
9907   verifyFormat("auto f (int x) -> decltype (x);", SomeSpace);
9908   verifyFormat("int f (T x) noexcept (x.create());", SomeSpace);
9909   verifyFormat("alignas (128) char a[128];", SomeSpace);
9910   verifyFormat("size_t x = alignof (MyType);", SomeSpace);
9911   verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");",
9912                SomeSpace);
9913   verifyFormat("int f() throw (Deprecated);", SomeSpace);
9914   verifyFormat("typedef void (*cb) (int);", SomeSpace);
9915   verifyFormat("T A::operator()();", SomeSpace);
9916   verifyFormat("X A::operator++ (T);", SomeSpace);
9917   verifyFormat("int x = int (y);", SomeSpace);
9918   verifyFormat("auto lambda = []() { return 0; };", SomeSpace);
9919 }
9920 
9921 TEST_F(FormatTest, SpaceAfterLogicalNot) {
9922   FormatStyle Spaces = getLLVMStyle();
9923   Spaces.SpaceAfterLogicalNot = true;
9924 
9925   verifyFormat("bool x = ! y", Spaces);
9926   verifyFormat("if (! isFailure())", Spaces);
9927   verifyFormat("if (! (a && b))", Spaces);
9928   verifyFormat("\"Error!\"", Spaces);
9929   verifyFormat("! ! x", Spaces);
9930 }
9931 
9932 TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
9933   FormatStyle Spaces = getLLVMStyle();
9934 
9935   Spaces.SpacesInParentheses = true;
9936   verifyFormat("do_something( ::globalVar );", Spaces);
9937   verifyFormat("call( x, y, z );", Spaces);
9938   verifyFormat("call();", Spaces);
9939   verifyFormat("std::function<void( int, int )> callback;", Spaces);
9940   verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
9941                Spaces);
9942   verifyFormat("while ( (bool)1 )\n"
9943                "  continue;",
9944                Spaces);
9945   verifyFormat("for ( ;; )\n"
9946                "  continue;",
9947                Spaces);
9948   verifyFormat("if ( true )\n"
9949                "  f();\n"
9950                "else if ( true )\n"
9951                "  f();",
9952                Spaces);
9953   verifyFormat("do {\n"
9954                "  do_something( (int)i );\n"
9955                "} while ( something() );",
9956                Spaces);
9957   verifyFormat("switch ( x ) {\n"
9958                "default:\n"
9959                "  break;\n"
9960                "}",
9961                Spaces);
9962 
9963   Spaces.SpacesInParentheses = false;
9964   Spaces.SpacesInCStyleCastParentheses = true;
9965   verifyFormat("Type *A = ( Type * )P;", Spaces);
9966   verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
9967   verifyFormat("x = ( int32 )y;", Spaces);
9968   verifyFormat("int a = ( int )(2.0f);", Spaces);
9969   verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
9970   verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
9971   verifyFormat("#define x (( int )-1)", Spaces);
9972 
9973   // Run the first set of tests again with:
9974   Spaces.SpacesInParentheses = false;
9975   Spaces.SpaceInEmptyParentheses = true;
9976   Spaces.SpacesInCStyleCastParentheses = true;
9977   verifyFormat("call(x, y, z);", Spaces);
9978   verifyFormat("call( );", Spaces);
9979   verifyFormat("std::function<void(int, int)> callback;", Spaces);
9980   verifyFormat("while (( bool )1)\n"
9981                "  continue;",
9982                Spaces);
9983   verifyFormat("for (;;)\n"
9984                "  continue;",
9985                Spaces);
9986   verifyFormat("if (true)\n"
9987                "  f( );\n"
9988                "else if (true)\n"
9989                "  f( );",
9990                Spaces);
9991   verifyFormat("do {\n"
9992                "  do_something(( int )i);\n"
9993                "} while (something( ));",
9994                Spaces);
9995   verifyFormat("switch (x) {\n"
9996                "default:\n"
9997                "  break;\n"
9998                "}",
9999                Spaces);
10000 
10001   // Run the first set of tests again with:
10002   Spaces.SpaceAfterCStyleCast = true;
10003   verifyFormat("call(x, y, z);", Spaces);
10004   verifyFormat("call( );", Spaces);
10005   verifyFormat("std::function<void(int, int)> callback;", Spaces);
10006   verifyFormat("while (( bool ) 1)\n"
10007                "  continue;",
10008                Spaces);
10009   verifyFormat("for (;;)\n"
10010                "  continue;",
10011                Spaces);
10012   verifyFormat("if (true)\n"
10013                "  f( );\n"
10014                "else if (true)\n"
10015                "  f( );",
10016                Spaces);
10017   verifyFormat("do {\n"
10018                "  do_something(( int ) i);\n"
10019                "} while (something( ));",
10020                Spaces);
10021   verifyFormat("switch (x) {\n"
10022                "default:\n"
10023                "  break;\n"
10024                "}",
10025                Spaces);
10026 
10027   // Run subset of tests again with:
10028   Spaces.SpacesInCStyleCastParentheses = false;
10029   Spaces.SpaceAfterCStyleCast = true;
10030   verifyFormat("while ((bool) 1)\n"
10031                "  continue;",
10032                Spaces);
10033   verifyFormat("do {\n"
10034                "  do_something((int) i);\n"
10035                "} while (something( ));",
10036                Spaces);
10037 }
10038 
10039 TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
10040   verifyFormat("int a[5];");
10041   verifyFormat("a[3] += 42;");
10042 
10043   FormatStyle Spaces = getLLVMStyle();
10044   Spaces.SpacesInSquareBrackets = true;
10045   // Lambdas unchanged.
10046   verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
10047   verifyFormat("return [i, args...] {};", Spaces);
10048 
10049   // Not lambdas.
10050   verifyFormat("int a[ 5 ];", Spaces);
10051   verifyFormat("a[ 3 ] += 42;", Spaces);
10052   verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
10053   verifyFormat("double &operator[](int i) { return 0; }\n"
10054                "int i;",
10055                Spaces);
10056   verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
10057   verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
10058   verifyFormat("int i = (*b)[ a ]->f();", Spaces);
10059 }
10060 
10061 TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
10062   verifyFormat("int a = 5;");
10063   verifyFormat("a += 42;");
10064   verifyFormat("a or_eq 8;");
10065 
10066   FormatStyle Spaces = getLLVMStyle();
10067   Spaces.SpaceBeforeAssignmentOperators = false;
10068   verifyFormat("int a= 5;", Spaces);
10069   verifyFormat("a+= 42;", Spaces);
10070   verifyFormat("a or_eq 8;", Spaces);
10071 }
10072 
10073 TEST_F(FormatTest, ConfigurableSpaceBeforeColon) {
10074   verifyFormat("class Foo : public Bar {};");
10075   verifyFormat("Foo::Foo() : foo(1) {}");
10076   verifyFormat("for (auto a : b) {\n}");
10077   verifyFormat("int x = a ? b : c;");
10078   verifyFormat("{\n"
10079                "label0:\n"
10080                "  int x = 0;\n"
10081                "}");
10082   verifyFormat("switch (x) {\n"
10083                "case 1:\n"
10084                "default:\n"
10085                "}");
10086 
10087   FormatStyle CtorInitializerStyle = getLLVMStyleWithColumns(30);
10088   CtorInitializerStyle.SpaceBeforeCtorInitializerColon = false;
10089   verifyFormat("class Foo : public Bar {};", CtorInitializerStyle);
10090   verifyFormat("Foo::Foo(): foo(1) {}", CtorInitializerStyle);
10091   verifyFormat("for (auto a : b) {\n}", CtorInitializerStyle);
10092   verifyFormat("int x = a ? b : c;", CtorInitializerStyle);
10093   verifyFormat("{\n"
10094                "label1:\n"
10095                "  int x = 0;\n"
10096                "}",
10097                CtorInitializerStyle);
10098   verifyFormat("switch (x) {\n"
10099                "case 1:\n"
10100                "default:\n"
10101                "}",
10102                CtorInitializerStyle);
10103   CtorInitializerStyle.BreakConstructorInitializers =
10104       FormatStyle::BCIS_AfterColon;
10105   verifyFormat("Fooooooooooo::Fooooooooooo():\n"
10106                "    aaaaaaaaaaaaaaaa(1),\n"
10107                "    bbbbbbbbbbbbbbbb(2) {}",
10108                CtorInitializerStyle);
10109   CtorInitializerStyle.BreakConstructorInitializers =
10110       FormatStyle::BCIS_BeforeComma;
10111   verifyFormat("Fooooooooooo::Fooooooooooo()\n"
10112                "    : aaaaaaaaaaaaaaaa(1)\n"
10113                "    , bbbbbbbbbbbbbbbb(2) {}",
10114                CtorInitializerStyle);
10115   CtorInitializerStyle.BreakConstructorInitializers =
10116       FormatStyle::BCIS_BeforeColon;
10117   verifyFormat("Fooooooooooo::Fooooooooooo()\n"
10118                "    : aaaaaaaaaaaaaaaa(1),\n"
10119                "      bbbbbbbbbbbbbbbb(2) {}",
10120                CtorInitializerStyle);
10121   CtorInitializerStyle.ConstructorInitializerIndentWidth = 0;
10122   verifyFormat("Fooooooooooo::Fooooooooooo()\n"
10123                ": aaaaaaaaaaaaaaaa(1),\n"
10124                "  bbbbbbbbbbbbbbbb(2) {}",
10125                CtorInitializerStyle);
10126 
10127   FormatStyle InheritanceStyle = getLLVMStyleWithColumns(30);
10128   InheritanceStyle.SpaceBeforeInheritanceColon = false;
10129   verifyFormat("class Foo: public Bar {};", InheritanceStyle);
10130   verifyFormat("Foo::Foo() : foo(1) {}", InheritanceStyle);
10131   verifyFormat("for (auto a : b) {\n}", InheritanceStyle);
10132   verifyFormat("int x = a ? b : c;", InheritanceStyle);
10133   verifyFormat("{\n"
10134                "label2:\n"
10135                "  int x = 0;\n"
10136                "}",
10137                InheritanceStyle);
10138   verifyFormat("switch (x) {\n"
10139                "case 1:\n"
10140                "default:\n"
10141                "}",
10142                InheritanceStyle);
10143   InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_AfterColon;
10144   verifyFormat("class Foooooooooooooooooooooo:\n"
10145                "    public aaaaaaaaaaaaaaaaaa,\n"
10146                "    public bbbbbbbbbbbbbbbbbb {\n"
10147                "}",
10148                InheritanceStyle);
10149   InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeComma;
10150   verifyFormat("class Foooooooooooooooooooooo\n"
10151                "    : public aaaaaaaaaaaaaaaaaa\n"
10152                "    , public bbbbbbbbbbbbbbbbbb {\n"
10153                "}",
10154                InheritanceStyle);
10155   InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
10156   verifyFormat("class Foooooooooooooooooooooo\n"
10157                "    : public aaaaaaaaaaaaaaaaaa,\n"
10158                "      public bbbbbbbbbbbbbbbbbb {\n"
10159                "}",
10160                InheritanceStyle);
10161   InheritanceStyle.ConstructorInitializerIndentWidth = 0;
10162   verifyFormat("class Foooooooooooooooooooooo\n"
10163                ": public aaaaaaaaaaaaaaaaaa,\n"
10164                "  public bbbbbbbbbbbbbbbbbb {}",
10165                InheritanceStyle);
10166 
10167   FormatStyle ForLoopStyle = getLLVMStyle();
10168   ForLoopStyle.SpaceBeforeRangeBasedForLoopColon = false;
10169   verifyFormat("class Foo : public Bar {};", ForLoopStyle);
10170   verifyFormat("Foo::Foo() : foo(1) {}", ForLoopStyle);
10171   verifyFormat("for (auto a: b) {\n}", ForLoopStyle);
10172   verifyFormat("int x = a ? b : c;", ForLoopStyle);
10173   verifyFormat("{\n"
10174                "label2:\n"
10175                "  int x = 0;\n"
10176                "}",
10177                ForLoopStyle);
10178   verifyFormat("switch (x) {\n"
10179                "case 1:\n"
10180                "default:\n"
10181                "}",
10182                ForLoopStyle);
10183 
10184   FormatStyle NoSpaceStyle = getLLVMStyle();
10185   NoSpaceStyle.SpaceBeforeCtorInitializerColon = false;
10186   NoSpaceStyle.SpaceBeforeInheritanceColon = false;
10187   NoSpaceStyle.SpaceBeforeRangeBasedForLoopColon = false;
10188   verifyFormat("class Foo: public Bar {};", NoSpaceStyle);
10189   verifyFormat("Foo::Foo(): foo(1) {}", NoSpaceStyle);
10190   verifyFormat("for (auto a: b) {\n}", NoSpaceStyle);
10191   verifyFormat("int x = a ? b : c;", NoSpaceStyle);
10192   verifyFormat("{\n"
10193                "label3:\n"
10194                "  int x = 0;\n"
10195                "}",
10196                NoSpaceStyle);
10197   verifyFormat("switch (x) {\n"
10198                "case 1:\n"
10199                "default:\n"
10200                "}",
10201                NoSpaceStyle);
10202 }
10203 
10204 TEST_F(FormatTest, AlignConsecutiveMacros) {
10205   FormatStyle Style = getLLVMStyle();
10206   Style.AlignConsecutiveAssignments = true;
10207   Style.AlignConsecutiveDeclarations = true;
10208   Style.AlignConsecutiveMacros = false;
10209 
10210   verifyFormat("#define a 3\n"
10211                "#define bbbb 4\n"
10212                "#define ccc (5)",
10213                Style);
10214 
10215   verifyFormat("#define f(x) (x * x)\n"
10216                "#define fff(x, y, z) (x * y + z)\n"
10217                "#define ffff(x, y) (x - y)",
10218                Style);
10219 
10220   verifyFormat("#define foo(x, y) (x + y)\n"
10221                "#define bar (5, 6)(2 + 2)",
10222                Style);
10223 
10224   verifyFormat("#define a 3\n"
10225                "#define bbbb 4\n"
10226                "#define ccc (5)\n"
10227                "#define f(x) (x * x)\n"
10228                "#define fff(x, y, z) (x * y + z)\n"
10229                "#define ffff(x, y) (x - y)",
10230                Style);
10231 
10232   Style.AlignConsecutiveMacros = true;
10233   verifyFormat("#define a    3\n"
10234                "#define bbbb 4\n"
10235                "#define ccc  (5)",
10236                Style);
10237 
10238   verifyFormat("#define f(x)         (x * x)\n"
10239                "#define fff(x, y, z) (x * y + z)\n"
10240                "#define ffff(x, y)   (x - y)",
10241                Style);
10242 
10243   verifyFormat("#define foo(x, y) (x + y)\n"
10244                "#define bar       (5, 6)(2 + 2)",
10245                Style);
10246 
10247   verifyFormat("#define a            3\n"
10248                "#define bbbb         4\n"
10249                "#define ccc          (5)\n"
10250                "#define f(x)         (x * x)\n"
10251                "#define fff(x, y, z) (x * y + z)\n"
10252                "#define ffff(x, y)   (x - y)",
10253                Style);
10254 
10255   verifyFormat("#define a         5\n"
10256                "#define foo(x, y) (x + y)\n"
10257                "#define CCC       (6)\n"
10258                "auto lambda = []() {\n"
10259                "  auto  ii = 0;\n"
10260                "  float j  = 0;\n"
10261                "  return 0;\n"
10262                "};\n"
10263                "int   i  = 0;\n"
10264                "float i2 = 0;\n"
10265                "auto  v  = type{\n"
10266                "    i = 1,   //\n"
10267                "    (i = 2), //\n"
10268                "    i = 3    //\n"
10269                "};",
10270                Style);
10271 
10272   Style.AlignConsecutiveMacros = false;
10273   Style.ColumnLimit = 20;
10274 
10275   verifyFormat("#define a          \\\n"
10276                "  \"aabbbbbbbbbbbb\"\n"
10277                "#define D          \\\n"
10278                "  \"aabbbbbbbbbbbb\" \\\n"
10279                "  \"ccddeeeeeeeee\"\n"
10280                "#define B          \\\n"
10281                "  \"QQQQQQQQQQQQQ\"  \\\n"
10282                "  \"FFFFFFFFFFFFF\"  \\\n"
10283                "  \"LLLLLLLL\"\n",
10284                Style);
10285 
10286   Style.AlignConsecutiveMacros = true;
10287   verifyFormat("#define a          \\\n"
10288                "  \"aabbbbbbbbbbbb\"\n"
10289                "#define D          \\\n"
10290                "  \"aabbbbbbbbbbbb\" \\\n"
10291                "  \"ccddeeeeeeeee\"\n"
10292                "#define B          \\\n"
10293                "  \"QQQQQQQQQQQQQ\"  \\\n"
10294                "  \"FFFFFFFFFFFFF\"  \\\n"
10295                "  \"LLLLLLLL\"\n",
10296                Style);
10297 }
10298 
10299 TEST_F(FormatTest, AlignConsecutiveAssignments) {
10300   FormatStyle Alignment = getLLVMStyle();
10301   Alignment.AlignConsecutiveMacros = true;
10302   Alignment.AlignConsecutiveAssignments = false;
10303   verifyFormat("int a = 5;\n"
10304                "int oneTwoThree = 123;",
10305                Alignment);
10306   verifyFormat("int a = 5;\n"
10307                "int oneTwoThree = 123;",
10308                Alignment);
10309 
10310   Alignment.AlignConsecutiveAssignments = true;
10311   verifyFormat("int a           = 5;\n"
10312                "int oneTwoThree = 123;",
10313                Alignment);
10314   verifyFormat("int a           = method();\n"
10315                "int oneTwoThree = 133;",
10316                Alignment);
10317   verifyFormat("a &= 5;\n"
10318                "bcd *= 5;\n"
10319                "ghtyf += 5;\n"
10320                "dvfvdb -= 5;\n"
10321                "a /= 5;\n"
10322                "vdsvsv %= 5;\n"
10323                "sfdbddfbdfbb ^= 5;\n"
10324                "dvsdsv |= 5;\n"
10325                "int dsvvdvsdvvv = 123;",
10326                Alignment);
10327   verifyFormat("int i = 1, j = 10;\n"
10328                "something = 2000;",
10329                Alignment);
10330   verifyFormat("something = 2000;\n"
10331                "int i = 1, j = 10;\n",
10332                Alignment);
10333   verifyFormat("something = 2000;\n"
10334                "another   = 911;\n"
10335                "int i = 1, j = 10;\n"
10336                "oneMore = 1;\n"
10337                "i       = 2;",
10338                Alignment);
10339   verifyFormat("int a   = 5;\n"
10340                "int one = 1;\n"
10341                "method();\n"
10342                "int oneTwoThree = 123;\n"
10343                "int oneTwo      = 12;",
10344                Alignment);
10345   verifyFormat("int oneTwoThree = 123;\n"
10346                "int oneTwo      = 12;\n"
10347                "method();\n",
10348                Alignment);
10349   verifyFormat("int oneTwoThree = 123; // comment\n"
10350                "int oneTwo      = 12;  // comment",
10351                Alignment);
10352   EXPECT_EQ("int a = 5;\n"
10353             "\n"
10354             "int oneTwoThree = 123;",
10355             format("int a       = 5;\n"
10356                    "\n"
10357                    "int oneTwoThree= 123;",
10358                    Alignment));
10359   EXPECT_EQ("int a   = 5;\n"
10360             "int one = 1;\n"
10361             "\n"
10362             "int oneTwoThree = 123;",
10363             format("int a = 5;\n"
10364                    "int one = 1;\n"
10365                    "\n"
10366                    "int oneTwoThree = 123;",
10367                    Alignment));
10368   EXPECT_EQ("int a   = 5;\n"
10369             "int one = 1;\n"
10370             "\n"
10371             "int oneTwoThree = 123;\n"
10372             "int oneTwo      = 12;",
10373             format("int a = 5;\n"
10374                    "int one = 1;\n"
10375                    "\n"
10376                    "int oneTwoThree = 123;\n"
10377                    "int oneTwo = 12;",
10378                    Alignment));
10379   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
10380   verifyFormat("#define A \\\n"
10381                "  int aaaa       = 12; \\\n"
10382                "  int b          = 23; \\\n"
10383                "  int ccc        = 234; \\\n"
10384                "  int dddddddddd = 2345;",
10385                Alignment);
10386   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
10387   verifyFormat("#define A               \\\n"
10388                "  int aaaa       = 12;  \\\n"
10389                "  int b          = 23;  \\\n"
10390                "  int ccc        = 234; \\\n"
10391                "  int dddddddddd = 2345;",
10392                Alignment);
10393   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
10394   verifyFormat("#define A                                                      "
10395                "                \\\n"
10396                "  int aaaa       = 12;                                         "
10397                "                \\\n"
10398                "  int b          = 23;                                         "
10399                "                \\\n"
10400                "  int ccc        = 234;                                        "
10401                "                \\\n"
10402                "  int dddddddddd = 2345;",
10403                Alignment);
10404   verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
10405                "k = 4, int l = 5,\n"
10406                "                  int m = 6) {\n"
10407                "  int j      = 10;\n"
10408                "  otherThing = 1;\n"
10409                "}",
10410                Alignment);
10411   verifyFormat("void SomeFunction(int parameter = 0) {\n"
10412                "  int i   = 1;\n"
10413                "  int j   = 2;\n"
10414                "  int big = 10000;\n"
10415                "}",
10416                Alignment);
10417   verifyFormat("class C {\n"
10418                "public:\n"
10419                "  int i            = 1;\n"
10420                "  virtual void f() = 0;\n"
10421                "};",
10422                Alignment);
10423   verifyFormat("int i = 1;\n"
10424                "if (SomeType t = getSomething()) {\n"
10425                "}\n"
10426                "int j   = 2;\n"
10427                "int big = 10000;",
10428                Alignment);
10429   verifyFormat("int j = 7;\n"
10430                "for (int k = 0; k < N; ++k) {\n"
10431                "}\n"
10432                "int j   = 2;\n"
10433                "int big = 10000;\n"
10434                "}",
10435                Alignment);
10436   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
10437   verifyFormat("int i = 1;\n"
10438                "LooooooooooongType loooooooooooooooooooooongVariable\n"
10439                "    = someLooooooooooooooooongFunction();\n"
10440                "int j = 2;",
10441                Alignment);
10442   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
10443   verifyFormat("int i = 1;\n"
10444                "LooooooooooongType loooooooooooooooooooooongVariable =\n"
10445                "    someLooooooooooooooooongFunction();\n"
10446                "int j = 2;",
10447                Alignment);
10448 
10449   verifyFormat("auto lambda = []() {\n"
10450                "  auto i = 0;\n"
10451                "  return 0;\n"
10452                "};\n"
10453                "int i  = 0;\n"
10454                "auto v = type{\n"
10455                "    i = 1,   //\n"
10456                "    (i = 2), //\n"
10457                "    i = 3    //\n"
10458                "};",
10459                Alignment);
10460 
10461   verifyFormat(
10462       "int i      = 1;\n"
10463       "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
10464       "                          loooooooooooooooooooooongParameterB);\n"
10465       "int j      = 2;",
10466       Alignment);
10467 
10468   verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
10469                "          typename B   = very_long_type_name_1,\n"
10470                "          typename T_2 = very_long_type_name_2>\n"
10471                "auto foo() {}\n",
10472                Alignment);
10473   verifyFormat("int a, b = 1;\n"
10474                "int c  = 2;\n"
10475                "int dd = 3;\n",
10476                Alignment);
10477   verifyFormat("int aa       = ((1 > 2) ? 3 : 4);\n"
10478                "float b[1][] = {{3.f}};\n",
10479                Alignment);
10480   verifyFormat("for (int i = 0; i < 1; i++)\n"
10481                "  int x = 1;\n",
10482                Alignment);
10483   verifyFormat("for (i = 0; i < 1; i++)\n"
10484                "  x = 1;\n"
10485                "y = 1;\n",
10486                Alignment);
10487 }
10488 
10489 TEST_F(FormatTest, AlignConsecutiveDeclarations) {
10490   FormatStyle Alignment = getLLVMStyle();
10491   Alignment.AlignConsecutiveMacros = true;
10492   Alignment.AlignConsecutiveDeclarations = false;
10493   verifyFormat("float const a = 5;\n"
10494                "int oneTwoThree = 123;",
10495                Alignment);
10496   verifyFormat("int a = 5;\n"
10497                "float const oneTwoThree = 123;",
10498                Alignment);
10499 
10500   Alignment.AlignConsecutiveDeclarations = true;
10501   verifyFormat("float const a = 5;\n"
10502                "int         oneTwoThree = 123;",
10503                Alignment);
10504   verifyFormat("int         a = method();\n"
10505                "float const oneTwoThree = 133;",
10506                Alignment);
10507   verifyFormat("int i = 1, j = 10;\n"
10508                "something = 2000;",
10509                Alignment);
10510   verifyFormat("something = 2000;\n"
10511                "int i = 1, j = 10;\n",
10512                Alignment);
10513   verifyFormat("float      something = 2000;\n"
10514                "double     another = 911;\n"
10515                "int        i = 1, j = 10;\n"
10516                "const int *oneMore = 1;\n"
10517                "unsigned   i = 2;",
10518                Alignment);
10519   verifyFormat("float a = 5;\n"
10520                "int   one = 1;\n"
10521                "method();\n"
10522                "const double       oneTwoThree = 123;\n"
10523                "const unsigned int oneTwo = 12;",
10524                Alignment);
10525   verifyFormat("int      oneTwoThree{0}; // comment\n"
10526                "unsigned oneTwo;         // comment",
10527                Alignment);
10528   EXPECT_EQ("float const a = 5;\n"
10529             "\n"
10530             "int oneTwoThree = 123;",
10531             format("float const   a = 5;\n"
10532                    "\n"
10533                    "int           oneTwoThree= 123;",
10534                    Alignment));
10535   EXPECT_EQ("float a = 5;\n"
10536             "int   one = 1;\n"
10537             "\n"
10538             "unsigned oneTwoThree = 123;",
10539             format("float    a = 5;\n"
10540                    "int      one = 1;\n"
10541                    "\n"
10542                    "unsigned oneTwoThree = 123;",
10543                    Alignment));
10544   EXPECT_EQ("float a = 5;\n"
10545             "int   one = 1;\n"
10546             "\n"
10547             "unsigned oneTwoThree = 123;\n"
10548             "int      oneTwo = 12;",
10549             format("float    a = 5;\n"
10550                    "int one = 1;\n"
10551                    "\n"
10552                    "unsigned oneTwoThree = 123;\n"
10553                    "int oneTwo = 12;",
10554                    Alignment));
10555   // Function prototype alignment
10556   verifyFormat("int    a();\n"
10557                "double b();",
10558                Alignment);
10559   verifyFormat("int    a(int x);\n"
10560                "double b();",
10561                Alignment);
10562   unsigned OldColumnLimit = Alignment.ColumnLimit;
10563   // We need to set ColumnLimit to zero, in order to stress nested alignments,
10564   // otherwise the function parameters will be re-flowed onto a single line.
10565   Alignment.ColumnLimit = 0;
10566   EXPECT_EQ("int    a(int   x,\n"
10567             "         float y);\n"
10568             "double b(int    x,\n"
10569             "         double y);",
10570             format("int a(int x,\n"
10571                    " float y);\n"
10572                    "double b(int x,\n"
10573                    " double y);",
10574                    Alignment));
10575   // This ensures that function parameters of function declarations are
10576   // correctly indented when their owning functions are indented.
10577   // The failure case here is for 'double y' to not be indented enough.
10578   EXPECT_EQ("double a(int x);\n"
10579             "int    b(int    y,\n"
10580             "         double z);",
10581             format("double a(int x);\n"
10582                    "int b(int y,\n"
10583                    " double z);",
10584                    Alignment));
10585   // Set ColumnLimit low so that we induce wrapping immediately after
10586   // the function name and opening paren.
10587   Alignment.ColumnLimit = 13;
10588   verifyFormat("int function(\n"
10589                "    int  x,\n"
10590                "    bool y);",
10591                Alignment);
10592   Alignment.ColumnLimit = OldColumnLimit;
10593   // Ensure function pointers don't screw up recursive alignment
10594   verifyFormat("int    a(int x, void (*fp)(int y));\n"
10595                "double b();",
10596                Alignment);
10597   Alignment.AlignConsecutiveAssignments = true;
10598   // Ensure recursive alignment is broken by function braces, so that the
10599   // "a = 1" does not align with subsequent assignments inside the function
10600   // body.
10601   verifyFormat("int func(int a = 1) {\n"
10602                "  int b  = 2;\n"
10603                "  int cc = 3;\n"
10604                "}",
10605                Alignment);
10606   verifyFormat("float      something = 2000;\n"
10607                "double     another   = 911;\n"
10608                "int        i = 1, j = 10;\n"
10609                "const int *oneMore = 1;\n"
10610                "unsigned   i       = 2;",
10611                Alignment);
10612   verifyFormat("int      oneTwoThree = {0}; // comment\n"
10613                "unsigned oneTwo      = 0;   // comment",
10614                Alignment);
10615   // Make sure that scope is correctly tracked, in the absence of braces
10616   verifyFormat("for (int i = 0; i < n; i++)\n"
10617                "  j = i;\n"
10618                "double x = 1;\n",
10619                Alignment);
10620   verifyFormat("if (int i = 0)\n"
10621                "  j = i;\n"
10622                "double x = 1;\n",
10623                Alignment);
10624   // Ensure operator[] and operator() are comprehended
10625   verifyFormat("struct test {\n"
10626                "  long long int foo();\n"
10627                "  int           operator[](int a);\n"
10628                "  double        bar();\n"
10629                "};\n",
10630                Alignment);
10631   verifyFormat("struct test {\n"
10632                "  long long int foo();\n"
10633                "  int           operator()(int a);\n"
10634                "  double        bar();\n"
10635                "};\n",
10636                Alignment);
10637   EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
10638             "  int const i   = 1;\n"
10639             "  int *     j   = 2;\n"
10640             "  int       big = 10000;\n"
10641             "\n"
10642             "  unsigned oneTwoThree = 123;\n"
10643             "  int      oneTwo      = 12;\n"
10644             "  method();\n"
10645             "  float k  = 2;\n"
10646             "  int   ll = 10000;\n"
10647             "}",
10648             format("void SomeFunction(int parameter= 0) {\n"
10649                    " int const  i= 1;\n"
10650                    "  int *j=2;\n"
10651                    " int big  =  10000;\n"
10652                    "\n"
10653                    "unsigned oneTwoThree  =123;\n"
10654                    "int oneTwo = 12;\n"
10655                    "  method();\n"
10656                    "float k= 2;\n"
10657                    "int ll=10000;\n"
10658                    "}",
10659                    Alignment));
10660   Alignment.AlignConsecutiveAssignments = false;
10661   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
10662   verifyFormat("#define A \\\n"
10663                "  int       aaaa = 12; \\\n"
10664                "  float     b = 23; \\\n"
10665                "  const int ccc = 234; \\\n"
10666                "  unsigned  dddddddddd = 2345;",
10667                Alignment);
10668   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
10669   verifyFormat("#define A              \\\n"
10670                "  int       aaaa = 12; \\\n"
10671                "  float     b = 23;    \\\n"
10672                "  const int ccc = 234; \\\n"
10673                "  unsigned  dddddddddd = 2345;",
10674                Alignment);
10675   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
10676   Alignment.ColumnLimit = 30;
10677   verifyFormat("#define A                    \\\n"
10678                "  int       aaaa = 12;       \\\n"
10679                "  float     b = 23;          \\\n"
10680                "  const int ccc = 234;       \\\n"
10681                "  int       dddddddddd = 2345;",
10682                Alignment);
10683   Alignment.ColumnLimit = 80;
10684   verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
10685                "k = 4, int l = 5,\n"
10686                "                  int m = 6) {\n"
10687                "  const int j = 10;\n"
10688                "  otherThing = 1;\n"
10689                "}",
10690                Alignment);
10691   verifyFormat("void SomeFunction(int parameter = 0) {\n"
10692                "  int const i = 1;\n"
10693                "  int *     j = 2;\n"
10694                "  int       big = 10000;\n"
10695                "}",
10696                Alignment);
10697   verifyFormat("class C {\n"
10698                "public:\n"
10699                "  int          i = 1;\n"
10700                "  virtual void f() = 0;\n"
10701                "};",
10702                Alignment);
10703   verifyFormat("float i = 1;\n"
10704                "if (SomeType t = getSomething()) {\n"
10705                "}\n"
10706                "const unsigned j = 2;\n"
10707                "int            big = 10000;",
10708                Alignment);
10709   verifyFormat("float j = 7;\n"
10710                "for (int k = 0; k < N; ++k) {\n"
10711                "}\n"
10712                "unsigned j = 2;\n"
10713                "int      big = 10000;\n"
10714                "}",
10715                Alignment);
10716   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
10717   verifyFormat("float              i = 1;\n"
10718                "LooooooooooongType loooooooooooooooooooooongVariable\n"
10719                "    = someLooooooooooooooooongFunction();\n"
10720                "int j = 2;",
10721                Alignment);
10722   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
10723   verifyFormat("int                i = 1;\n"
10724                "LooooooooooongType loooooooooooooooooooooongVariable =\n"
10725                "    someLooooooooooooooooongFunction();\n"
10726                "int j = 2;",
10727                Alignment);
10728 
10729   Alignment.AlignConsecutiveAssignments = true;
10730   verifyFormat("auto lambda = []() {\n"
10731                "  auto  ii = 0;\n"
10732                "  float j  = 0;\n"
10733                "  return 0;\n"
10734                "};\n"
10735                "int   i  = 0;\n"
10736                "float i2 = 0;\n"
10737                "auto  v  = type{\n"
10738                "    i = 1,   //\n"
10739                "    (i = 2), //\n"
10740                "    i = 3    //\n"
10741                "};",
10742                Alignment);
10743   Alignment.AlignConsecutiveAssignments = false;
10744 
10745   verifyFormat(
10746       "int      i = 1;\n"
10747       "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
10748       "                          loooooooooooooooooooooongParameterB);\n"
10749       "int      j = 2;",
10750       Alignment);
10751 
10752   // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
10753   // We expect declarations and assignments to align, as long as it doesn't
10754   // exceed the column limit, starting a new alignment sequence whenever it
10755   // happens.
10756   Alignment.AlignConsecutiveAssignments = true;
10757   Alignment.ColumnLimit = 30;
10758   verifyFormat("float    ii              = 1;\n"
10759                "unsigned j               = 2;\n"
10760                "int someVerylongVariable = 1;\n"
10761                "AnotherLongType  ll = 123456;\n"
10762                "VeryVeryLongType k  = 2;\n"
10763                "int              myvar = 1;",
10764                Alignment);
10765   Alignment.ColumnLimit = 80;
10766   Alignment.AlignConsecutiveAssignments = false;
10767 
10768   verifyFormat(
10769       "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
10770       "          typename LongType, typename B>\n"
10771       "auto foo() {}\n",
10772       Alignment);
10773   verifyFormat("float a, b = 1;\n"
10774                "int   c = 2;\n"
10775                "int   dd = 3;\n",
10776                Alignment);
10777   verifyFormat("int   aa = ((1 > 2) ? 3 : 4);\n"
10778                "float b[1][] = {{3.f}};\n",
10779                Alignment);
10780   Alignment.AlignConsecutiveAssignments = true;
10781   verifyFormat("float a, b = 1;\n"
10782                "int   c  = 2;\n"
10783                "int   dd = 3;\n",
10784                Alignment);
10785   verifyFormat("int   aa     = ((1 > 2) ? 3 : 4);\n"
10786                "float b[1][] = {{3.f}};\n",
10787                Alignment);
10788   Alignment.AlignConsecutiveAssignments = false;
10789 
10790   Alignment.ColumnLimit = 30;
10791   Alignment.BinPackParameters = false;
10792   verifyFormat("void foo(float     a,\n"
10793                "         float     b,\n"
10794                "         int       c,\n"
10795                "         uint32_t *d) {\n"
10796                "  int *  e = 0;\n"
10797                "  float  f = 0;\n"
10798                "  double g = 0;\n"
10799                "}\n"
10800                "void bar(ino_t     a,\n"
10801                "         int       b,\n"
10802                "         uint32_t *c,\n"
10803                "         bool      d) {}\n",
10804                Alignment);
10805   Alignment.BinPackParameters = true;
10806   Alignment.ColumnLimit = 80;
10807 
10808   // Bug 33507
10809   Alignment.PointerAlignment = FormatStyle::PAS_Middle;
10810   verifyFormat(
10811       "auto found = range::find_if(vsProducts, [&](auto * aProduct) {\n"
10812       "  static const Version verVs2017;\n"
10813       "  return true;\n"
10814       "});\n",
10815       Alignment);
10816   Alignment.PointerAlignment = FormatStyle::PAS_Right;
10817 
10818   // See llvm.org/PR35641
10819   Alignment.AlignConsecutiveDeclarations = true;
10820   verifyFormat("int func() { //\n"
10821                "  int      b;\n"
10822                "  unsigned c;\n"
10823                "}",
10824                Alignment);
10825 
10826   // See PR37175
10827   FormatStyle Style = getMozillaStyle();
10828   Style.AlignConsecutiveDeclarations = true;
10829   EXPECT_EQ("DECOR1 /**/ int8_t /**/ DECOR2 /**/\n"
10830             "foo(int a);",
10831             format("DECOR1 /**/ int8_t /**/ DECOR2 /**/ foo (int a);", Style));
10832 }
10833 
10834 TEST_F(FormatTest, LinuxBraceBreaking) {
10835   FormatStyle LinuxBraceStyle = getLLVMStyle();
10836   LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
10837   verifyFormat("namespace a\n"
10838                "{\n"
10839                "class A\n"
10840                "{\n"
10841                "  void f()\n"
10842                "  {\n"
10843                "    if (true) {\n"
10844                "      a();\n"
10845                "      b();\n"
10846                "    } else {\n"
10847                "      a();\n"
10848                "    }\n"
10849                "  }\n"
10850                "  void g() { return; }\n"
10851                "};\n"
10852                "struct B {\n"
10853                "  int x;\n"
10854                "};\n"
10855                "} // namespace a\n",
10856                LinuxBraceStyle);
10857   verifyFormat("enum X {\n"
10858                "  Y = 0,\n"
10859                "}\n",
10860                LinuxBraceStyle);
10861   verifyFormat("struct S {\n"
10862                "  int Type;\n"
10863                "  union {\n"
10864                "    int x;\n"
10865                "    double y;\n"
10866                "  } Value;\n"
10867                "  class C\n"
10868                "  {\n"
10869                "    MyFavoriteType Value;\n"
10870                "  } Class;\n"
10871                "}\n",
10872                LinuxBraceStyle);
10873 }
10874 
10875 TEST_F(FormatTest, MozillaBraceBreaking) {
10876   FormatStyle MozillaBraceStyle = getLLVMStyle();
10877   MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
10878   MozillaBraceStyle.FixNamespaceComments = false;
10879   verifyFormat("namespace a {\n"
10880                "class A\n"
10881                "{\n"
10882                "  void f()\n"
10883                "  {\n"
10884                "    if (true) {\n"
10885                "      a();\n"
10886                "      b();\n"
10887                "    }\n"
10888                "  }\n"
10889                "  void g() { return; }\n"
10890                "};\n"
10891                "enum E\n"
10892                "{\n"
10893                "  A,\n"
10894                "  // foo\n"
10895                "  B,\n"
10896                "  C\n"
10897                "};\n"
10898                "struct B\n"
10899                "{\n"
10900                "  int x;\n"
10901                "};\n"
10902                "}\n",
10903                MozillaBraceStyle);
10904   verifyFormat("struct S\n"
10905                "{\n"
10906                "  int Type;\n"
10907                "  union\n"
10908                "  {\n"
10909                "    int x;\n"
10910                "    double y;\n"
10911                "  } Value;\n"
10912                "  class C\n"
10913                "  {\n"
10914                "    MyFavoriteType Value;\n"
10915                "  } Class;\n"
10916                "}\n",
10917                MozillaBraceStyle);
10918 }
10919 
10920 TEST_F(FormatTest, StroustrupBraceBreaking) {
10921   FormatStyle StroustrupBraceStyle = getLLVMStyle();
10922   StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
10923   verifyFormat("namespace a {\n"
10924                "class A {\n"
10925                "  void f()\n"
10926                "  {\n"
10927                "    if (true) {\n"
10928                "      a();\n"
10929                "      b();\n"
10930                "    }\n"
10931                "  }\n"
10932                "  void g() { return; }\n"
10933                "};\n"
10934                "struct B {\n"
10935                "  int x;\n"
10936                "};\n"
10937                "} // namespace a\n",
10938                StroustrupBraceStyle);
10939 
10940   verifyFormat("void foo()\n"
10941                "{\n"
10942                "  if (a) {\n"
10943                "    a();\n"
10944                "  }\n"
10945                "  else {\n"
10946                "    b();\n"
10947                "  }\n"
10948                "}\n",
10949                StroustrupBraceStyle);
10950 
10951   verifyFormat("#ifdef _DEBUG\n"
10952                "int foo(int i = 0)\n"
10953                "#else\n"
10954                "int foo(int i = 5)\n"
10955                "#endif\n"
10956                "{\n"
10957                "  return i;\n"
10958                "}",
10959                StroustrupBraceStyle);
10960 
10961   verifyFormat("void foo() {}\n"
10962                "void bar()\n"
10963                "#ifdef _DEBUG\n"
10964                "{\n"
10965                "  foo();\n"
10966                "}\n"
10967                "#else\n"
10968                "{\n"
10969                "}\n"
10970                "#endif",
10971                StroustrupBraceStyle);
10972 
10973   verifyFormat("void foobar() { int i = 5; }\n"
10974                "#ifdef _DEBUG\n"
10975                "void bar() {}\n"
10976                "#else\n"
10977                "void bar() { foobar(); }\n"
10978                "#endif",
10979                StroustrupBraceStyle);
10980 }
10981 
10982 TEST_F(FormatTest, AllmanBraceBreaking) {
10983   FormatStyle AllmanBraceStyle = getLLVMStyle();
10984   AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
10985 
10986   EXPECT_EQ("namespace a\n"
10987             "{\n"
10988             "void f();\n"
10989             "void g();\n"
10990             "} // namespace a\n",
10991             format("namespace a\n"
10992                    "{\n"
10993                    "void f();\n"
10994                    "void g();\n"
10995                    "}\n",
10996                    AllmanBraceStyle));
10997 
10998   verifyFormat("namespace a\n"
10999                "{\n"
11000                "class A\n"
11001                "{\n"
11002                "  void f()\n"
11003                "  {\n"
11004                "    if (true)\n"
11005                "    {\n"
11006                "      a();\n"
11007                "      b();\n"
11008                "    }\n"
11009                "  }\n"
11010                "  void g() { return; }\n"
11011                "};\n"
11012                "struct B\n"
11013                "{\n"
11014                "  int x;\n"
11015                "};\n"
11016                "} // namespace a",
11017                AllmanBraceStyle);
11018 
11019   verifyFormat("void f()\n"
11020                "{\n"
11021                "  if (true)\n"
11022                "  {\n"
11023                "    a();\n"
11024                "  }\n"
11025                "  else if (false)\n"
11026                "  {\n"
11027                "    b();\n"
11028                "  }\n"
11029                "  else\n"
11030                "  {\n"
11031                "    c();\n"
11032                "  }\n"
11033                "}\n",
11034                AllmanBraceStyle);
11035 
11036   verifyFormat("void f()\n"
11037                "{\n"
11038                "  for (int i = 0; i < 10; ++i)\n"
11039                "  {\n"
11040                "    a();\n"
11041                "  }\n"
11042                "  while (false)\n"
11043                "  {\n"
11044                "    b();\n"
11045                "  }\n"
11046                "  do\n"
11047                "  {\n"
11048                "    c();\n"
11049                "  } while (false)\n"
11050                "}\n",
11051                AllmanBraceStyle);
11052 
11053   verifyFormat("void f(int a)\n"
11054                "{\n"
11055                "  switch (a)\n"
11056                "  {\n"
11057                "  case 0:\n"
11058                "    break;\n"
11059                "  case 1:\n"
11060                "  {\n"
11061                "    break;\n"
11062                "  }\n"
11063                "  case 2:\n"
11064                "  {\n"
11065                "  }\n"
11066                "  break;\n"
11067                "  default:\n"
11068                "    break;\n"
11069                "  }\n"
11070                "}\n",
11071                AllmanBraceStyle);
11072 
11073   verifyFormat("enum X\n"
11074                "{\n"
11075                "  Y = 0,\n"
11076                "}\n",
11077                AllmanBraceStyle);
11078   verifyFormat("enum X\n"
11079                "{\n"
11080                "  Y = 0\n"
11081                "}\n",
11082                AllmanBraceStyle);
11083 
11084   verifyFormat("@interface BSApplicationController ()\n"
11085                "{\n"
11086                "@private\n"
11087                "  id _extraIvar;\n"
11088                "}\n"
11089                "@end\n",
11090                AllmanBraceStyle);
11091 
11092   verifyFormat("#ifdef _DEBUG\n"
11093                "int foo(int i = 0)\n"
11094                "#else\n"
11095                "int foo(int i = 5)\n"
11096                "#endif\n"
11097                "{\n"
11098                "  return i;\n"
11099                "}",
11100                AllmanBraceStyle);
11101 
11102   verifyFormat("void foo() {}\n"
11103                "void bar()\n"
11104                "#ifdef _DEBUG\n"
11105                "{\n"
11106                "  foo();\n"
11107                "}\n"
11108                "#else\n"
11109                "{\n"
11110                "}\n"
11111                "#endif",
11112                AllmanBraceStyle);
11113 
11114   verifyFormat("void foobar() { int i = 5; }\n"
11115                "#ifdef _DEBUG\n"
11116                "void bar() {}\n"
11117                "#else\n"
11118                "void bar() { foobar(); }\n"
11119                "#endif",
11120                AllmanBraceStyle);
11121 
11122   // This shouldn't affect ObjC blocks..
11123   verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
11124                "  // ...\n"
11125                "  int i;\n"
11126                "}];",
11127                AllmanBraceStyle);
11128   verifyFormat("void (^block)(void) = ^{\n"
11129                "  // ...\n"
11130                "  int i;\n"
11131                "};",
11132                AllmanBraceStyle);
11133   // .. or dict literals.
11134   verifyFormat("void f()\n"
11135                "{\n"
11136                "  // ...\n"
11137                "  [object someMethod:@{@\"a\" : @\"b\"}];\n"
11138                "}",
11139                AllmanBraceStyle);
11140   verifyFormat("void f()\n"
11141                "{\n"
11142                "  // ...\n"
11143                "  [object someMethod:@{a : @\"b\"}];\n"
11144                "}",
11145                AllmanBraceStyle);
11146   verifyFormat("int f()\n"
11147                "{ // comment\n"
11148                "  return 42;\n"
11149                "}",
11150                AllmanBraceStyle);
11151 
11152   AllmanBraceStyle.ColumnLimit = 19;
11153   verifyFormat("void f() { int i; }", AllmanBraceStyle);
11154   AllmanBraceStyle.ColumnLimit = 18;
11155   verifyFormat("void f()\n"
11156                "{\n"
11157                "  int i;\n"
11158                "}",
11159                AllmanBraceStyle);
11160   AllmanBraceStyle.ColumnLimit = 80;
11161 
11162   FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
11163   BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine =
11164       FormatStyle::SIS_WithoutElse;
11165   BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
11166   verifyFormat("void f(bool b)\n"
11167                "{\n"
11168                "  if (b)\n"
11169                "  {\n"
11170                "    return;\n"
11171                "  }\n"
11172                "}\n",
11173                BreakBeforeBraceShortIfs);
11174   verifyFormat("void f(bool b)\n"
11175                "{\n"
11176                "  if constexpr (b)\n"
11177                "  {\n"
11178                "    return;\n"
11179                "  }\n"
11180                "}\n",
11181                BreakBeforeBraceShortIfs);
11182   verifyFormat("void f(bool b)\n"
11183                "{\n"
11184                "  if (b) return;\n"
11185                "}\n",
11186                BreakBeforeBraceShortIfs);
11187   verifyFormat("void f(bool b)\n"
11188                "{\n"
11189                "  if constexpr (b) return;\n"
11190                "}\n",
11191                BreakBeforeBraceShortIfs);
11192   verifyFormat("void f(bool b)\n"
11193                "{\n"
11194                "  while (b)\n"
11195                "  {\n"
11196                "    return;\n"
11197                "  }\n"
11198                "}\n",
11199                BreakBeforeBraceShortIfs);
11200 }
11201 
11202 TEST_F(FormatTest, GNUBraceBreaking) {
11203   FormatStyle GNUBraceStyle = getLLVMStyle();
11204   GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
11205   verifyFormat("namespace a\n"
11206                "{\n"
11207                "class A\n"
11208                "{\n"
11209                "  void f()\n"
11210                "  {\n"
11211                "    int a;\n"
11212                "    {\n"
11213                "      int b;\n"
11214                "    }\n"
11215                "    if (true)\n"
11216                "      {\n"
11217                "        a();\n"
11218                "        b();\n"
11219                "      }\n"
11220                "  }\n"
11221                "  void g() { return; }\n"
11222                "}\n"
11223                "} // namespace a",
11224                GNUBraceStyle);
11225 
11226   verifyFormat("void f()\n"
11227                "{\n"
11228                "  if (true)\n"
11229                "    {\n"
11230                "      a();\n"
11231                "    }\n"
11232                "  else if (false)\n"
11233                "    {\n"
11234                "      b();\n"
11235                "    }\n"
11236                "  else\n"
11237                "    {\n"
11238                "      c();\n"
11239                "    }\n"
11240                "}\n",
11241                GNUBraceStyle);
11242 
11243   verifyFormat("void f()\n"
11244                "{\n"
11245                "  for (int i = 0; i < 10; ++i)\n"
11246                "    {\n"
11247                "      a();\n"
11248                "    }\n"
11249                "  while (false)\n"
11250                "    {\n"
11251                "      b();\n"
11252                "    }\n"
11253                "  do\n"
11254                "    {\n"
11255                "      c();\n"
11256                "    }\n"
11257                "  while (false);\n"
11258                "}\n",
11259                GNUBraceStyle);
11260 
11261   verifyFormat("void f(int a)\n"
11262                "{\n"
11263                "  switch (a)\n"
11264                "    {\n"
11265                "    case 0:\n"
11266                "      break;\n"
11267                "    case 1:\n"
11268                "      {\n"
11269                "        break;\n"
11270                "      }\n"
11271                "    case 2:\n"
11272                "      {\n"
11273                "      }\n"
11274                "      break;\n"
11275                "    default:\n"
11276                "      break;\n"
11277                "    }\n"
11278                "}\n",
11279                GNUBraceStyle);
11280 
11281   verifyFormat("enum X\n"
11282                "{\n"
11283                "  Y = 0,\n"
11284                "}\n",
11285                GNUBraceStyle);
11286 
11287   verifyFormat("@interface BSApplicationController ()\n"
11288                "{\n"
11289                "@private\n"
11290                "  id _extraIvar;\n"
11291                "}\n"
11292                "@end\n",
11293                GNUBraceStyle);
11294 
11295   verifyFormat("#ifdef _DEBUG\n"
11296                "int foo(int i = 0)\n"
11297                "#else\n"
11298                "int foo(int i = 5)\n"
11299                "#endif\n"
11300                "{\n"
11301                "  return i;\n"
11302                "}",
11303                GNUBraceStyle);
11304 
11305   verifyFormat("void foo() {}\n"
11306                "void bar()\n"
11307                "#ifdef _DEBUG\n"
11308                "{\n"
11309                "  foo();\n"
11310                "}\n"
11311                "#else\n"
11312                "{\n"
11313                "}\n"
11314                "#endif",
11315                GNUBraceStyle);
11316 
11317   verifyFormat("void foobar() { int i = 5; }\n"
11318                "#ifdef _DEBUG\n"
11319                "void bar() {}\n"
11320                "#else\n"
11321                "void bar() { foobar(); }\n"
11322                "#endif",
11323                GNUBraceStyle);
11324 }
11325 
11326 TEST_F(FormatTest, WebKitBraceBreaking) {
11327   FormatStyle WebKitBraceStyle = getLLVMStyle();
11328   WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
11329   WebKitBraceStyle.FixNamespaceComments = false;
11330   verifyFormat("namespace a {\n"
11331                "class A {\n"
11332                "  void f()\n"
11333                "  {\n"
11334                "    if (true) {\n"
11335                "      a();\n"
11336                "      b();\n"
11337                "    }\n"
11338                "  }\n"
11339                "  void g() { return; }\n"
11340                "};\n"
11341                "enum E {\n"
11342                "  A,\n"
11343                "  // foo\n"
11344                "  B,\n"
11345                "  C\n"
11346                "};\n"
11347                "struct B {\n"
11348                "  int x;\n"
11349                "};\n"
11350                "}\n",
11351                WebKitBraceStyle);
11352   verifyFormat("struct S {\n"
11353                "  int Type;\n"
11354                "  union {\n"
11355                "    int x;\n"
11356                "    double y;\n"
11357                "  } Value;\n"
11358                "  class C {\n"
11359                "    MyFavoriteType Value;\n"
11360                "  } Class;\n"
11361                "};\n",
11362                WebKitBraceStyle);
11363 }
11364 
11365 TEST_F(FormatTest, CatchExceptionReferenceBinding) {
11366   verifyFormat("void f() {\n"
11367                "  try {\n"
11368                "  } catch (const Exception &e) {\n"
11369                "  }\n"
11370                "}\n",
11371                getLLVMStyle());
11372 }
11373 
11374 TEST_F(FormatTest, UnderstandsPragmas) {
11375   verifyFormat("#pragma omp reduction(| : var)");
11376   verifyFormat("#pragma omp reduction(+ : var)");
11377 
11378   EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
11379             "(including parentheses).",
11380             format("#pragma    mark   Any non-hyphenated or hyphenated string "
11381                    "(including parentheses)."));
11382 }
11383 
11384 TEST_F(FormatTest, UnderstandPragmaOption) {
11385   verifyFormat("#pragma option -C -A");
11386 
11387   EXPECT_EQ("#pragma option -C -A", format("#pragma    option   -C   -A"));
11388 }
11389 
11390 TEST_F(FormatTest, OptimizeBreakPenaltyVsExcess) {
11391   FormatStyle Style = getLLVMStyle();
11392   Style.ColumnLimit = 20;
11393 
11394   // See PR41213
11395   EXPECT_EQ("/*\n"
11396             " *\t9012345\n"
11397             " * /8901\n"
11398             " */",
11399             format("/*\n"
11400                    " *\t9012345 /8901\n"
11401                    " */",
11402                    Style));
11403   EXPECT_EQ("/*\n"
11404             " *345678\n"
11405             " *\t/8901\n"
11406             " */",
11407             format("/*\n"
11408                    " *345678\t/8901\n"
11409                    " */",
11410                    Style));
11411 
11412   verifyFormat("int a; // the\n"
11413                "       // comment", Style);
11414   EXPECT_EQ("int a; /* first line\n"
11415             "        * second\n"
11416             "        * line third\n"
11417             "        * line\n"
11418             "        */",
11419             format("int a; /* first line\n"
11420                    "        * second\n"
11421                    "        * line third\n"
11422                    "        * line\n"
11423                    "        */",
11424                    Style));
11425   EXPECT_EQ("int a; // first line\n"
11426             "       // second\n"
11427             "       // line third\n"
11428             "       // line",
11429             format("int a; // first line\n"
11430                    "       // second line\n"
11431                    "       // third line",
11432                    Style));
11433 
11434   Style.PenaltyExcessCharacter = 90;
11435   verifyFormat("int a; // the comment", Style);
11436   EXPECT_EQ("int a; // the comment\n"
11437             "       // aaa",
11438             format("int a; // the comment aaa", Style));
11439   EXPECT_EQ("int a; /* first line\n"
11440             "        * second line\n"
11441             "        * third line\n"
11442             "        */",
11443             format("int a; /* first line\n"
11444                    "        * second line\n"
11445                    "        * third line\n"
11446                    "        */",
11447                    Style));
11448   EXPECT_EQ("int a; // first line\n"
11449             "       // second line\n"
11450             "       // third line",
11451             format("int a; // first line\n"
11452                    "       // second line\n"
11453                    "       // third line",
11454                    Style));
11455   // FIXME: Investigate why this is not getting the same layout as the test
11456   // above.
11457   EXPECT_EQ("int a; /* first line\n"
11458             "        * second line\n"
11459             "        * third line\n"
11460             "        */",
11461             format("int a; /* first line second line third line"
11462                    "\n*/",
11463                    Style));
11464 
11465   EXPECT_EQ("// foo bar baz bazfoo\n"
11466             "// foo bar foo bar\n",
11467             format("// foo bar baz bazfoo\n"
11468                    "// foo bar foo           bar\n",
11469                    Style));
11470   EXPECT_EQ("// foo bar baz bazfoo\n"
11471             "// foo bar foo bar\n",
11472             format("// foo bar baz      bazfoo\n"
11473                    "// foo            bar foo bar\n",
11474                    Style));
11475 
11476   // FIXME: Optimally, we'd keep bazfoo on the first line and reflow bar to the
11477   // next one.
11478   EXPECT_EQ("// foo bar baz bazfoo\n"
11479             "// bar foo bar\n",
11480             format("// foo bar baz      bazfoo bar\n"
11481                    "// foo            bar\n",
11482                    Style));
11483 
11484   EXPECT_EQ("// foo bar baz bazfoo\n"
11485             "// foo bar baz bazfoo\n"
11486             "// bar foo bar\n",
11487             format("// foo bar baz      bazfoo\n"
11488                    "// foo bar baz      bazfoo bar\n"
11489                    "// foo bar\n",
11490                    Style));
11491 
11492   EXPECT_EQ("// foo bar baz bazfoo\n"
11493             "// foo bar baz bazfoo\n"
11494             "// bar foo bar\n",
11495             format("// foo bar baz      bazfoo\n"
11496                    "// foo bar baz      bazfoo bar\n"
11497                    "// foo           bar\n",
11498                    Style));
11499 
11500   // Make sure we do not keep protruding characters if strict mode reflow is
11501   // cheaper than keeping protruding characters.
11502   Style.ColumnLimit = 21;
11503   EXPECT_EQ("// foo foo foo foo\n"
11504             "// foo foo foo foo\n"
11505             "// foo foo foo foo\n",
11506             format("// foo foo foo foo foo foo foo foo foo foo foo foo\n",
11507                            Style));
11508 
11509   EXPECT_EQ("int a = /* long block\n"
11510             "           comment */\n"
11511             "    42;",
11512             format("int a = /* long block comment */ 42;", Style));
11513 }
11514 
11515 #define EXPECT_ALL_STYLES_EQUAL(Styles)                                        \
11516   for (size_t i = 1; i < Styles.size(); ++i)                                   \
11517   EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \
11518                                   << " differs from Style #0"
11519 
11520 TEST_F(FormatTest, GetsPredefinedStyleByName) {
11521   SmallVector<FormatStyle, 3> Styles;
11522   Styles.resize(3);
11523 
11524   Styles[0] = getLLVMStyle();
11525   EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
11526   EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
11527   EXPECT_ALL_STYLES_EQUAL(Styles);
11528 
11529   Styles[0] = getGoogleStyle();
11530   EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
11531   EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
11532   EXPECT_ALL_STYLES_EQUAL(Styles);
11533 
11534   Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
11535   EXPECT_TRUE(
11536       getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
11537   EXPECT_TRUE(
11538       getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
11539   EXPECT_ALL_STYLES_EQUAL(Styles);
11540 
11541   Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
11542   EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
11543   EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
11544   EXPECT_ALL_STYLES_EQUAL(Styles);
11545 
11546   Styles[0] = getMozillaStyle();
11547   EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
11548   EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
11549   EXPECT_ALL_STYLES_EQUAL(Styles);
11550 
11551   Styles[0] = getWebKitStyle();
11552   EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
11553   EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
11554   EXPECT_ALL_STYLES_EQUAL(Styles);
11555 
11556   Styles[0] = getGNUStyle();
11557   EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
11558   EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
11559   EXPECT_ALL_STYLES_EQUAL(Styles);
11560 
11561   EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
11562 }
11563 
11564 TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
11565   SmallVector<FormatStyle, 8> Styles;
11566   Styles.resize(2);
11567 
11568   Styles[0] = getGoogleStyle();
11569   Styles[1] = getLLVMStyle();
11570   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
11571   EXPECT_ALL_STYLES_EQUAL(Styles);
11572 
11573   Styles.resize(5);
11574   Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
11575   Styles[1] = getLLVMStyle();
11576   Styles[1].Language = FormatStyle::LK_JavaScript;
11577   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
11578 
11579   Styles[2] = getLLVMStyle();
11580   Styles[2].Language = FormatStyle::LK_JavaScript;
11581   EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
11582                                   "BasedOnStyle: Google",
11583                                   &Styles[2])
11584                    .value());
11585 
11586   Styles[3] = getLLVMStyle();
11587   Styles[3].Language = FormatStyle::LK_JavaScript;
11588   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
11589                                   "Language: JavaScript",
11590                                   &Styles[3])
11591                    .value());
11592 
11593   Styles[4] = getLLVMStyle();
11594   Styles[4].Language = FormatStyle::LK_JavaScript;
11595   EXPECT_EQ(0, parseConfiguration("---\n"
11596                                   "BasedOnStyle: LLVM\n"
11597                                   "IndentWidth: 123\n"
11598                                   "---\n"
11599                                   "BasedOnStyle: Google\n"
11600                                   "Language: JavaScript",
11601                                   &Styles[4])
11602                    .value());
11603   EXPECT_ALL_STYLES_EQUAL(Styles);
11604 }
11605 
11606 #define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME)                             \
11607   Style.FIELD = false;                                                         \
11608   EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value());      \
11609   EXPECT_TRUE(Style.FIELD);                                                    \
11610   EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value());     \
11611   EXPECT_FALSE(Style.FIELD);
11612 
11613 #define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
11614 
11615 #define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME)              \
11616   Style.STRUCT.FIELD = false;                                                  \
11617   EXPECT_EQ(0,                                                                 \
11618             parseConfiguration(#STRUCT ":\n  " CONFIG_NAME ": true", &Style)   \
11619                 .value());                                                     \
11620   EXPECT_TRUE(Style.STRUCT.FIELD);                                             \
11621   EXPECT_EQ(0,                                                                 \
11622             parseConfiguration(#STRUCT ":\n  " CONFIG_NAME ": false", &Style)  \
11623                 .value());                                                     \
11624   EXPECT_FALSE(Style.STRUCT.FIELD);
11625 
11626 #define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD)                                 \
11627   CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
11628 
11629 #define CHECK_PARSE(TEXT, FIELD, VALUE)                                        \
11630   EXPECT_NE(VALUE, Style.FIELD);                                               \
11631   EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value());                      \
11632   EXPECT_EQ(VALUE, Style.FIELD)
11633 
11634 TEST_F(FormatTest, ParsesConfigurationBools) {
11635   FormatStyle Style = {};
11636   Style.Language = FormatStyle::LK_Cpp;
11637   CHECK_PARSE_BOOL(AlignOperands);
11638   CHECK_PARSE_BOOL(AlignTrailingComments);
11639   CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
11640   CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
11641   CHECK_PARSE_BOOL(AlignConsecutiveMacros);
11642   CHECK_PARSE_BOOL(AllowAllArgumentsOnNextLine);
11643   CHECK_PARSE_BOOL(AllowAllConstructorInitializersOnNextLine);
11644   CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
11645   CHECK_PARSE_BOOL(AllowShortBlocksOnASingleLine);
11646   CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
11647   CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
11648   CHECK_PARSE_BOOL(BinPackArguments);
11649   CHECK_PARSE_BOOL(BinPackParameters);
11650   CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
11651   CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
11652   CHECK_PARSE_BOOL(BreakStringLiterals);
11653   CHECK_PARSE_BOOL(CompactNamespaces);
11654   CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
11655   CHECK_PARSE_BOOL(DerivePointerAlignment);
11656   CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
11657   CHECK_PARSE_BOOL(DisableFormat);
11658   CHECK_PARSE_BOOL(IndentCaseLabels);
11659   CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
11660   CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
11661   CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
11662   CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
11663   CHECK_PARSE_BOOL(Cpp11BracedListStyle);
11664   CHECK_PARSE_BOOL(ReflowComments);
11665   CHECK_PARSE_BOOL(SortIncludes);
11666   CHECK_PARSE_BOOL(SortUsingDeclarations);
11667   CHECK_PARSE_BOOL(SpacesInParentheses);
11668   CHECK_PARSE_BOOL(SpacesInSquareBrackets);
11669   CHECK_PARSE_BOOL(SpacesInAngles);
11670   CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
11671   CHECK_PARSE_BOOL(SpacesInContainerLiterals);
11672   CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
11673   CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
11674   CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
11675   CHECK_PARSE_BOOL(SpaceAfterLogicalNot);
11676   CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
11677   CHECK_PARSE_BOOL(SpaceBeforeCpp11BracedList);
11678   CHECK_PARSE_BOOL(SpaceBeforeCtorInitializerColon);
11679   CHECK_PARSE_BOOL(SpaceBeforeInheritanceColon);
11680   CHECK_PARSE_BOOL(SpaceBeforeRangeBasedForLoopColon);
11681 
11682   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterCaseLabel);
11683   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
11684   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement);
11685   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
11686   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
11687   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
11688   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
11689   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
11690   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
11691   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterExternBlock);
11692   CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
11693   CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
11694   CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
11695   CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunction);
11696   CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyRecord);
11697   CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyNamespace);
11698 }
11699 
11700 #undef CHECK_PARSE_BOOL
11701 
11702 TEST_F(FormatTest, ParsesConfiguration) {
11703   FormatStyle Style = {};
11704   Style.Language = FormatStyle::LK_Cpp;
11705   CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
11706   CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
11707               ConstructorInitializerIndentWidth, 1234u);
11708   CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
11709   CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
11710   CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
11711   CHECK_PARSE("PenaltyBreakAssignment: 1234",
11712               PenaltyBreakAssignment, 1234u);
11713   CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
11714               PenaltyBreakBeforeFirstCallParameter, 1234u);
11715   CHECK_PARSE("PenaltyBreakTemplateDeclaration: 1234",
11716               PenaltyBreakTemplateDeclaration, 1234u);
11717   CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
11718   CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
11719               PenaltyReturnTypeOnItsOwnLine, 1234u);
11720   CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
11721               SpacesBeforeTrailingComments, 1234u);
11722   CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
11723   CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
11724   CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
11725 
11726   Style.PointerAlignment = FormatStyle::PAS_Middle;
11727   CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
11728               FormatStyle::PAS_Left);
11729   CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
11730               FormatStyle::PAS_Right);
11731   CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
11732               FormatStyle::PAS_Middle);
11733   // For backward compatibility:
11734   CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
11735               FormatStyle::PAS_Left);
11736   CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
11737               FormatStyle::PAS_Right);
11738   CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
11739               FormatStyle::PAS_Middle);
11740 
11741   Style.Standard = FormatStyle::LS_Auto;
11742   CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
11743   CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11);
11744   CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
11745   CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
11746   CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
11747 
11748   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
11749   CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
11750               BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
11751   CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
11752               FormatStyle::BOS_None);
11753   CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
11754               FormatStyle::BOS_All);
11755   // For backward compatibility:
11756   CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
11757               FormatStyle::BOS_None);
11758   CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
11759               FormatStyle::BOS_All);
11760 
11761   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
11762   CHECK_PARSE("BreakConstructorInitializers: BeforeComma",
11763               BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
11764   CHECK_PARSE("BreakConstructorInitializers: AfterColon",
11765               BreakConstructorInitializers, FormatStyle::BCIS_AfterColon);
11766   CHECK_PARSE("BreakConstructorInitializers: BeforeColon",
11767               BreakConstructorInitializers, FormatStyle::BCIS_BeforeColon);
11768   // For backward compatibility:
11769   CHECK_PARSE("BreakConstructorInitializersBeforeComma: true",
11770               BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
11771 
11772   Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
11773   CHECK_PARSE("BreakInheritanceList: BeforeComma",
11774               BreakInheritanceList, FormatStyle::BILS_BeforeComma);
11775   CHECK_PARSE("BreakInheritanceList: AfterColon",
11776               BreakInheritanceList, FormatStyle::BILS_AfterColon);
11777   CHECK_PARSE("BreakInheritanceList: BeforeColon",
11778               BreakInheritanceList, FormatStyle::BILS_BeforeColon);
11779   // For backward compatibility:
11780   CHECK_PARSE("BreakBeforeInheritanceComma: true",
11781               BreakInheritanceList, FormatStyle::BILS_BeforeComma);
11782 
11783   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
11784   CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
11785               FormatStyle::BAS_Align);
11786   CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
11787               FormatStyle::BAS_DontAlign);
11788   CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
11789               FormatStyle::BAS_AlwaysBreak);
11790   // For backward compatibility:
11791   CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
11792               FormatStyle::BAS_DontAlign);
11793   CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
11794               FormatStyle::BAS_Align);
11795 
11796   Style.AlignEscapedNewlines = FormatStyle::ENAS_Left;
11797   CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines,
11798               FormatStyle::ENAS_DontAlign);
11799   CHECK_PARSE("AlignEscapedNewlines: Left", AlignEscapedNewlines,
11800               FormatStyle::ENAS_Left);
11801   CHECK_PARSE("AlignEscapedNewlines: Right", AlignEscapedNewlines,
11802               FormatStyle::ENAS_Right);
11803   // For backward compatibility:
11804   CHECK_PARSE("AlignEscapedNewlinesLeft: true", AlignEscapedNewlines,
11805               FormatStyle::ENAS_Left);
11806   CHECK_PARSE("AlignEscapedNewlinesLeft: false", AlignEscapedNewlines,
11807               FormatStyle::ENAS_Right);
11808 
11809   Style.UseTab = FormatStyle::UT_ForIndentation;
11810   CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
11811   CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
11812   CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
11813   CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
11814               FormatStyle::UT_ForContinuationAndIndentation);
11815   // For backward compatibility:
11816   CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
11817   CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
11818 
11819   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
11820   CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
11821               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
11822   CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
11823               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
11824   CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
11825               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
11826   CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
11827               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
11828   // For backward compatibility:
11829   CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
11830               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
11831   CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
11832               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
11833 
11834   Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
11835   CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
11836               FormatStyle::SBPO_Never);
11837   CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
11838               FormatStyle::SBPO_Always);
11839   CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
11840               FormatStyle::SBPO_ControlStatements);
11841   CHECK_PARSE("SpaceBeforeParens: NonEmptyParentheses", SpaceBeforeParens,
11842               FormatStyle::SBPO_NonEmptyParentheses);
11843   // For backward compatibility:
11844   CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
11845               FormatStyle::SBPO_Never);
11846   CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
11847               FormatStyle::SBPO_ControlStatements);
11848 
11849   Style.ColumnLimit = 123;
11850   FormatStyle BaseStyle = getLLVMStyle();
11851   CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
11852   CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
11853 
11854   Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
11855   CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
11856               FormatStyle::BS_Attach);
11857   CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
11858               FormatStyle::BS_Linux);
11859   CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
11860               FormatStyle::BS_Mozilla);
11861   CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
11862               FormatStyle::BS_Stroustrup);
11863   CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
11864               FormatStyle::BS_Allman);
11865   CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
11866   CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
11867               FormatStyle::BS_WebKit);
11868   CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
11869               FormatStyle::BS_Custom);
11870 
11871   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
11872   CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
11873               FormatStyle::RTBS_None);
11874   CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
11875               FormatStyle::RTBS_All);
11876   CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
11877               AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
11878   CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
11879               AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
11880   CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
11881               AlwaysBreakAfterReturnType,
11882               FormatStyle::RTBS_TopLevelDefinitions);
11883 
11884   Style.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes;
11885   CHECK_PARSE("AlwaysBreakTemplateDeclarations: No", AlwaysBreakTemplateDeclarations,
11886               FormatStyle::BTDS_No);
11887   CHECK_PARSE("AlwaysBreakTemplateDeclarations: MultiLine", AlwaysBreakTemplateDeclarations,
11888               FormatStyle::BTDS_MultiLine);
11889   CHECK_PARSE("AlwaysBreakTemplateDeclarations: Yes", AlwaysBreakTemplateDeclarations,
11890               FormatStyle::BTDS_Yes);
11891   CHECK_PARSE("AlwaysBreakTemplateDeclarations: false", AlwaysBreakTemplateDeclarations,
11892               FormatStyle::BTDS_MultiLine);
11893   CHECK_PARSE("AlwaysBreakTemplateDeclarations: true", AlwaysBreakTemplateDeclarations,
11894               FormatStyle::BTDS_Yes);
11895 
11896   Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
11897   CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
11898               AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
11899   CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
11900               AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
11901   CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
11902               AlwaysBreakAfterDefinitionReturnType,
11903               FormatStyle::DRTBS_TopLevel);
11904 
11905   Style.NamespaceIndentation = FormatStyle::NI_All;
11906   CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
11907               FormatStyle::NI_None);
11908   CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
11909               FormatStyle::NI_Inner);
11910   CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
11911               FormatStyle::NI_All);
11912 
11913   Style.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_Always;
11914   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Never",
11915               AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never);
11916   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: WithoutElse",
11917               AllowShortIfStatementsOnASingleLine,
11918               FormatStyle::SIS_WithoutElse);
11919   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Always",
11920               AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Always);
11921   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: false",
11922               AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never);
11923   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: true",
11924               AllowShortIfStatementsOnASingleLine,
11925               FormatStyle::SIS_WithoutElse);
11926 
11927   // FIXME: This is required because parsing a configuration simply overwrites
11928   // the first N elements of the list instead of resetting it.
11929   Style.ForEachMacros.clear();
11930   std::vector<std::string> BoostForeach;
11931   BoostForeach.push_back("BOOST_FOREACH");
11932   CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
11933   std::vector<std::string> BoostAndQForeach;
11934   BoostAndQForeach.push_back("BOOST_FOREACH");
11935   BoostAndQForeach.push_back("Q_FOREACH");
11936   CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
11937               BoostAndQForeach);
11938 
11939   Style.StatementMacros.clear();
11940   CHECK_PARSE("StatementMacros: [QUNUSED]", StatementMacros,
11941               std::vector<std::string>{"QUNUSED"});
11942   CHECK_PARSE("StatementMacros: [QUNUSED, QT_REQUIRE_VERSION]", StatementMacros,
11943               std::vector<std::string>({"QUNUSED", "QT_REQUIRE_VERSION"}));
11944 
11945   Style.NamespaceMacros.clear();
11946   CHECK_PARSE("NamespaceMacros: [TESTSUITE]", NamespaceMacros,
11947               std::vector<std::string>{"TESTSUITE"});
11948   CHECK_PARSE("NamespaceMacros: [TESTSUITE, SUITE]", NamespaceMacros,
11949               std::vector<std::string>({"TESTSUITE", "SUITE"}));
11950 
11951   Style.IncludeStyle.IncludeCategories.clear();
11952   std::vector<tooling::IncludeStyle::IncludeCategory> ExpectedCategories = {
11953       {"abc/.*", 2}, {".*", 1}};
11954   CHECK_PARSE("IncludeCategories:\n"
11955               "  - Regex: abc/.*\n"
11956               "    Priority: 2\n"
11957               "  - Regex: .*\n"
11958               "    Priority: 1",
11959               IncludeStyle.IncludeCategories, ExpectedCategories);
11960   CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeStyle.IncludeIsMainRegex,
11961               "abc$");
11962 
11963   Style.RawStringFormats.clear();
11964   std::vector<FormatStyle::RawStringFormat> ExpectedRawStringFormats = {
11965       {
11966           FormatStyle::LK_TextProto,
11967           {"pb", "proto"},
11968           {"PARSE_TEXT_PROTO"},
11969           /*CanonicalDelimiter=*/"",
11970           "llvm",
11971       },
11972       {
11973           FormatStyle::LK_Cpp,
11974           {"cc", "cpp"},
11975           {"C_CODEBLOCK", "CPPEVAL"},
11976           /*CanonicalDelimiter=*/"cc",
11977           /*BasedOnStyle=*/"",
11978       },
11979   };
11980 
11981   CHECK_PARSE("RawStringFormats:\n"
11982               "  - Language: TextProto\n"
11983               "    Delimiters:\n"
11984               "      - 'pb'\n"
11985               "      - 'proto'\n"
11986               "    EnclosingFunctions:\n"
11987               "      - 'PARSE_TEXT_PROTO'\n"
11988               "    BasedOnStyle: llvm\n"
11989               "  - Language: Cpp\n"
11990               "    Delimiters:\n"
11991               "      - 'cc'\n"
11992               "      - 'cpp'\n"
11993               "    EnclosingFunctions:\n"
11994               "      - 'C_CODEBLOCK'\n"
11995               "      - 'CPPEVAL'\n"
11996               "    CanonicalDelimiter: 'cc'",
11997               RawStringFormats, ExpectedRawStringFormats);
11998 }
11999 
12000 TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
12001   FormatStyle Style = {};
12002   Style.Language = FormatStyle::LK_Cpp;
12003   CHECK_PARSE("Language: Cpp\n"
12004               "IndentWidth: 12",
12005               IndentWidth, 12u);
12006   EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
12007                                "IndentWidth: 34",
12008                                &Style),
12009             ParseError::Unsuitable);
12010   EXPECT_EQ(12u, Style.IndentWidth);
12011   CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
12012   EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
12013 
12014   Style.Language = FormatStyle::LK_JavaScript;
12015   CHECK_PARSE("Language: JavaScript\n"
12016               "IndentWidth: 12",
12017               IndentWidth, 12u);
12018   CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
12019   EXPECT_EQ(parseConfiguration("Language: Cpp\n"
12020                                "IndentWidth: 34",
12021                                &Style),
12022             ParseError::Unsuitable);
12023   EXPECT_EQ(23u, Style.IndentWidth);
12024   CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
12025   EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
12026 
12027   CHECK_PARSE("BasedOnStyle: LLVM\n"
12028               "IndentWidth: 67",
12029               IndentWidth, 67u);
12030 
12031   CHECK_PARSE("---\n"
12032               "Language: JavaScript\n"
12033               "IndentWidth: 12\n"
12034               "---\n"
12035               "Language: Cpp\n"
12036               "IndentWidth: 34\n"
12037               "...\n",
12038               IndentWidth, 12u);
12039 
12040   Style.Language = FormatStyle::LK_Cpp;
12041   CHECK_PARSE("---\n"
12042               "Language: JavaScript\n"
12043               "IndentWidth: 12\n"
12044               "---\n"
12045               "Language: Cpp\n"
12046               "IndentWidth: 34\n"
12047               "...\n",
12048               IndentWidth, 34u);
12049   CHECK_PARSE("---\n"
12050               "IndentWidth: 78\n"
12051               "---\n"
12052               "Language: JavaScript\n"
12053               "IndentWidth: 56\n"
12054               "...\n",
12055               IndentWidth, 78u);
12056 
12057   Style.ColumnLimit = 123;
12058   Style.IndentWidth = 234;
12059   Style.BreakBeforeBraces = FormatStyle::BS_Linux;
12060   Style.TabWidth = 345;
12061   EXPECT_FALSE(parseConfiguration("---\n"
12062                                   "IndentWidth: 456\n"
12063                                   "BreakBeforeBraces: Allman\n"
12064                                   "---\n"
12065                                   "Language: JavaScript\n"
12066                                   "IndentWidth: 111\n"
12067                                   "TabWidth: 111\n"
12068                                   "---\n"
12069                                   "Language: Cpp\n"
12070                                   "BreakBeforeBraces: Stroustrup\n"
12071                                   "TabWidth: 789\n"
12072                                   "...\n",
12073                                   &Style));
12074   EXPECT_EQ(123u, Style.ColumnLimit);
12075   EXPECT_EQ(456u, Style.IndentWidth);
12076   EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
12077   EXPECT_EQ(789u, Style.TabWidth);
12078 
12079   EXPECT_EQ(parseConfiguration("---\n"
12080                                "Language: JavaScript\n"
12081                                "IndentWidth: 56\n"
12082                                "---\n"
12083                                "IndentWidth: 78\n"
12084                                "...\n",
12085                                &Style),
12086             ParseError::Error);
12087   EXPECT_EQ(parseConfiguration("---\n"
12088                                "Language: JavaScript\n"
12089                                "IndentWidth: 56\n"
12090                                "---\n"
12091                                "Language: JavaScript\n"
12092                                "IndentWidth: 78\n"
12093                                "...\n",
12094                                &Style),
12095             ParseError::Error);
12096 
12097   EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
12098 }
12099 
12100 #undef CHECK_PARSE
12101 
12102 TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
12103   FormatStyle Style = {};
12104   Style.Language = FormatStyle::LK_JavaScript;
12105   Style.BreakBeforeTernaryOperators = true;
12106   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
12107   EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
12108 
12109   Style.BreakBeforeTernaryOperators = true;
12110   EXPECT_EQ(0, parseConfiguration("---\n"
12111                                   "BasedOnStyle: Google\n"
12112                                   "---\n"
12113                                   "Language: JavaScript\n"
12114                                   "IndentWidth: 76\n"
12115                                   "...\n",
12116                                   &Style)
12117                    .value());
12118   EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
12119   EXPECT_EQ(76u, Style.IndentWidth);
12120   EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
12121 }
12122 
12123 TEST_F(FormatTest, ConfigurationRoundTripTest) {
12124   FormatStyle Style = getLLVMStyle();
12125   std::string YAML = configurationAsText(Style);
12126   FormatStyle ParsedStyle = {};
12127   ParsedStyle.Language = FormatStyle::LK_Cpp;
12128   EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
12129   EXPECT_EQ(Style, ParsedStyle);
12130 }
12131 
12132 TEST_F(FormatTest, WorksFor8bitEncodings) {
12133   EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
12134             "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
12135             "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
12136             "\"\xef\xee\xf0\xf3...\"",
12137             format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
12138                    "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
12139                    "\xef\xee\xf0\xf3...\"",
12140                    getLLVMStyleWithColumns(12)));
12141 }
12142 
12143 TEST_F(FormatTest, HandlesUTF8BOM) {
12144   EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
12145   EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
12146             format("\xef\xbb\xbf#include <iostream>"));
12147   EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
12148             format("\xef\xbb\xbf\n#include <iostream>"));
12149 }
12150 
12151 // FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
12152 #if !defined(_MSC_VER)
12153 
12154 TEST_F(FormatTest, CountsUTF8CharactersProperly) {
12155   verifyFormat("\"Однажды в студёную зимнюю пору...\"",
12156                getLLVMStyleWithColumns(35));
12157   verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
12158                getLLVMStyleWithColumns(31));
12159   verifyFormat("// Однажды в студёную зимнюю пору...",
12160                getLLVMStyleWithColumns(36));
12161   verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
12162   verifyFormat("/* Однажды в студёную зимнюю пору... */",
12163                getLLVMStyleWithColumns(39));
12164   verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
12165                getLLVMStyleWithColumns(35));
12166 }
12167 
12168 TEST_F(FormatTest, SplitsUTF8Strings) {
12169   // Non-printable characters' width is currently considered to be the length in
12170   // bytes in UTF8. The characters can be displayed in very different manner
12171   // (zero-width, single width with a substitution glyph, expanded to their code
12172   // (e.g. "<8d>"), so there's no single correct way to handle them.
12173   EXPECT_EQ("\"aaaaÄ\"\n"
12174             "\"\xc2\x8d\";",
12175             format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
12176   EXPECT_EQ("\"aaaaaaaÄ\"\n"
12177             "\"\xc2\x8d\";",
12178             format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
12179   EXPECT_EQ("\"Однажды, в \"\n"
12180             "\"студёную \"\n"
12181             "\"зимнюю \"\n"
12182             "\"пору,\"",
12183             format("\"Однажды, в студёную зимнюю пору,\"",
12184                    getLLVMStyleWithColumns(13)));
12185   EXPECT_EQ(
12186       "\"一 二 三 \"\n"
12187       "\"四 五六 \"\n"
12188       "\"七 八 九 \"\n"
12189       "\"十\"",
12190       format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
12191   EXPECT_EQ("\"一\t\"\n"
12192             "\"二 \t\"\n"
12193             "\"三 四 \"\n"
12194             "\"五\t\"\n"
12195             "\"六 \t\"\n"
12196             "\"七 \"\n"
12197             "\"八九十\tqq\"",
12198             format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
12199                    getLLVMStyleWithColumns(11)));
12200 
12201   // UTF8 character in an escape sequence.
12202   EXPECT_EQ("\"aaaaaa\"\n"
12203             "\"\\\xC2\x8D\"",
12204             format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
12205 }
12206 
12207 TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
12208   EXPECT_EQ("const char *sssss =\n"
12209             "    \"一二三四五六七八\\\n"
12210             " 九 十\";",
12211             format("const char *sssss = \"一二三四五六七八\\\n"
12212                    " 九 十\";",
12213                    getLLVMStyleWithColumns(30)));
12214 }
12215 
12216 TEST_F(FormatTest, SplitsUTF8LineComments) {
12217   EXPECT_EQ("// aaaaÄ\xc2\x8d",
12218             format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
12219   EXPECT_EQ("// Я из лесу\n"
12220             "// вышел; был\n"
12221             "// сильный\n"
12222             "// мороз.",
12223             format("// Я из лесу вышел; был сильный мороз.",
12224                    getLLVMStyleWithColumns(13)));
12225   EXPECT_EQ("// 一二三\n"
12226             "// 四五六七\n"
12227             "// 八  九\n"
12228             "// 十",
12229             format("// 一二三 四五六七 八  九 十", getLLVMStyleWithColumns(9)));
12230 }
12231 
12232 TEST_F(FormatTest, SplitsUTF8BlockComments) {
12233   EXPECT_EQ("/* Гляжу,\n"
12234             " * поднимается\n"
12235             " * медленно в\n"
12236             " * гору\n"
12237             " * Лошадка,\n"
12238             " * везущая\n"
12239             " * хворосту\n"
12240             " * воз. */",
12241             format("/* Гляжу, поднимается медленно в гору\n"
12242                    " * Лошадка, везущая хворосту воз. */",
12243                    getLLVMStyleWithColumns(13)));
12244   EXPECT_EQ(
12245       "/* 一二三\n"
12246       " * 四五六七\n"
12247       " * 八  九\n"
12248       " * 十  */",
12249       format("/* 一二三 四五六七 八  九 十  */", getLLVMStyleWithColumns(9)));
12250   EXPECT_EQ("/* �������� ��������\n"
12251             " * ��������\n"
12252             " * ������-�� */",
12253             format("/* �������� �������� �������� ������-�� */", getLLVMStyleWithColumns(12)));
12254 }
12255 
12256 #endif // _MSC_VER
12257 
12258 TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
12259   FormatStyle Style = getLLVMStyle();
12260 
12261   Style.ConstructorInitializerIndentWidth = 4;
12262   verifyFormat(
12263       "SomeClass::Constructor()\n"
12264       "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
12265       "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
12266       Style);
12267 
12268   Style.ConstructorInitializerIndentWidth = 2;
12269   verifyFormat(
12270       "SomeClass::Constructor()\n"
12271       "  : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
12272       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
12273       Style);
12274 
12275   Style.ConstructorInitializerIndentWidth = 0;
12276   verifyFormat(
12277       "SomeClass::Constructor()\n"
12278       ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
12279       "  aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
12280       Style);
12281   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
12282   verifyFormat(
12283       "SomeLongTemplateVariableName<\n"
12284       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
12285       Style);
12286   verifyFormat(
12287       "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
12288       "                       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
12289       Style);
12290 
12291   Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
12292   verifyFormat(
12293       "SomeClass::Constructor() :\n"
12294       "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa),\n"
12295       "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa) {}",
12296       Style);
12297 }
12298 
12299 TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
12300   FormatStyle Style = getLLVMStyle();
12301   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
12302   Style.ConstructorInitializerIndentWidth = 4;
12303   verifyFormat("SomeClass::Constructor()\n"
12304                "    : a(a)\n"
12305                "    , b(b)\n"
12306                "    , c(c) {}",
12307                Style);
12308   verifyFormat("SomeClass::Constructor()\n"
12309                "    : a(a) {}",
12310                Style);
12311 
12312   Style.ColumnLimit = 0;
12313   verifyFormat("SomeClass::Constructor()\n"
12314                "    : a(a) {}",
12315                Style);
12316   verifyFormat("SomeClass::Constructor() noexcept\n"
12317                "    : a(a) {}",
12318                Style);
12319   verifyFormat("SomeClass::Constructor()\n"
12320                "    : a(a)\n"
12321                "    , b(b)\n"
12322                "    , c(c) {}",
12323                Style);
12324   verifyFormat("SomeClass::Constructor()\n"
12325                "    : a(a) {\n"
12326                "  foo();\n"
12327                "  bar();\n"
12328                "}",
12329                Style);
12330 
12331   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
12332   verifyFormat("SomeClass::Constructor()\n"
12333                "    : a(a)\n"
12334                "    , b(b)\n"
12335                "    , c(c) {\n}",
12336                Style);
12337   verifyFormat("SomeClass::Constructor()\n"
12338                "    : a(a) {\n}",
12339                Style);
12340 
12341   Style.ColumnLimit = 80;
12342   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
12343   Style.ConstructorInitializerIndentWidth = 2;
12344   verifyFormat("SomeClass::Constructor()\n"
12345                "  : a(a)\n"
12346                "  , b(b)\n"
12347                "  , c(c) {}",
12348                Style);
12349 
12350   Style.ConstructorInitializerIndentWidth = 0;
12351   verifyFormat("SomeClass::Constructor()\n"
12352                ": a(a)\n"
12353                ", b(b)\n"
12354                ", c(c) {}",
12355                Style);
12356 
12357   Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
12358   Style.ConstructorInitializerIndentWidth = 4;
12359   verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
12360   verifyFormat(
12361       "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
12362       Style);
12363   verifyFormat(
12364       "SomeClass::Constructor()\n"
12365       "    : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
12366       Style);
12367   Style.ConstructorInitializerIndentWidth = 4;
12368   Style.ColumnLimit = 60;
12369   verifyFormat("SomeClass::Constructor()\n"
12370                "    : aaaaaaaa(aaaaaaaa)\n"
12371                "    , aaaaaaaa(aaaaaaaa)\n"
12372                "    , aaaaaaaa(aaaaaaaa) {}",
12373                Style);
12374 }
12375 
12376 TEST_F(FormatTest, Destructors) {
12377   verifyFormat("void F(int &i) { i.~int(); }");
12378   verifyFormat("void F(int &i) { i->~int(); }");
12379 }
12380 
12381 TEST_F(FormatTest, FormatsWithWebKitStyle) {
12382   FormatStyle Style = getWebKitStyle();
12383 
12384   // Don't indent in outer namespaces.
12385   verifyFormat("namespace outer {\n"
12386                "int i;\n"
12387                "namespace inner {\n"
12388                "    int i;\n"
12389                "} // namespace inner\n"
12390                "} // namespace outer\n"
12391                "namespace other_outer {\n"
12392                "int i;\n"
12393                "}",
12394                Style);
12395 
12396   // Don't indent case labels.
12397   verifyFormat("switch (variable) {\n"
12398                "case 1:\n"
12399                "case 2:\n"
12400                "    doSomething();\n"
12401                "    break;\n"
12402                "default:\n"
12403                "    ++variable;\n"
12404                "}",
12405                Style);
12406 
12407   // Wrap before binary operators.
12408   EXPECT_EQ("void f()\n"
12409             "{\n"
12410             "    if (aaaaaaaaaaaaaaaa\n"
12411             "        && bbbbbbbbbbbbbbbbbbbbbbbb\n"
12412             "        && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
12413             "        return;\n"
12414             "}",
12415             format("void f() {\n"
12416                    "if (aaaaaaaaaaaaaaaa\n"
12417                    "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
12418                    "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
12419                    "return;\n"
12420                    "}",
12421                    Style));
12422 
12423   // Allow functions on a single line.
12424   verifyFormat("void f() { return; }", Style);
12425 
12426   // Constructor initializers are formatted one per line with the "," on the
12427   // new line.
12428   verifyFormat("Constructor()\n"
12429                "    : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
12430                "    , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
12431                "          aaaaaaaaaaaaaa)\n"
12432                "    , aaaaaaaaaaaaaaaaaaaaaaa()\n"
12433                "{\n"
12434                "}",
12435                Style);
12436   verifyFormat("SomeClass::Constructor()\n"
12437                "    : a(a)\n"
12438                "{\n"
12439                "}",
12440                Style);
12441   EXPECT_EQ("SomeClass::Constructor()\n"
12442             "    : a(a)\n"
12443             "{\n"
12444             "}",
12445             format("SomeClass::Constructor():a(a){}", Style));
12446   verifyFormat("SomeClass::Constructor()\n"
12447                "    : a(a)\n"
12448                "    , b(b)\n"
12449                "    , c(c)\n"
12450                "{\n"
12451                "}",
12452                Style);
12453   verifyFormat("SomeClass::Constructor()\n"
12454                "    : a(a)\n"
12455                "{\n"
12456                "    foo();\n"
12457                "    bar();\n"
12458                "}",
12459                Style);
12460 
12461   // Access specifiers should be aligned left.
12462   verifyFormat("class C {\n"
12463                "public:\n"
12464                "    int i;\n"
12465                "};",
12466                Style);
12467 
12468   // Do not align comments.
12469   verifyFormat("int a; // Do not\n"
12470                "double b; // align comments.",
12471                Style);
12472 
12473   // Do not align operands.
12474   EXPECT_EQ("ASSERT(aaaa\n"
12475             "    || bbbb);",
12476             format("ASSERT ( aaaa\n||bbbb);", Style));
12477 
12478   // Accept input's line breaks.
12479   EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
12480             "    || bbbbbbbbbbbbbbb) {\n"
12481             "    i++;\n"
12482             "}",
12483             format("if (aaaaaaaaaaaaaaa\n"
12484                    "|| bbbbbbbbbbbbbbb) { i++; }",
12485                    Style));
12486   EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
12487             "    i++;\n"
12488             "}",
12489             format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
12490 
12491   // Don't automatically break all macro definitions (llvm.org/PR17842).
12492   verifyFormat("#define aNumber 10", Style);
12493   // However, generally keep the line breaks that the user authored.
12494   EXPECT_EQ("#define aNumber \\\n"
12495             "    10",
12496             format("#define aNumber \\\n"
12497                    " 10",
12498                    Style));
12499 
12500   // Keep empty and one-element array literals on a single line.
12501   EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
12502             "                                  copyItems:YES];",
12503             format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
12504                    "copyItems:YES];",
12505                    Style));
12506   EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
12507             "                                  copyItems:YES];",
12508             format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
12509                    "             copyItems:YES];",
12510                    Style));
12511   // FIXME: This does not seem right, there should be more indentation before
12512   // the array literal's entries. Nested blocks have the same problem.
12513   EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
12514             "    @\"a\",\n"
12515             "    @\"a\"\n"
12516             "]\n"
12517             "                                  copyItems:YES];",
12518             format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
12519                    "     @\"a\",\n"
12520                    "     @\"a\"\n"
12521                    "     ]\n"
12522                    "       copyItems:YES];",
12523                    Style));
12524   EXPECT_EQ(
12525       "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
12526       "                                  copyItems:YES];",
12527       format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
12528              "   copyItems:YES];",
12529              Style));
12530 
12531   verifyFormat("[self.a b:c c:d];", Style);
12532   EXPECT_EQ("[self.a b:c\n"
12533             "        c:d];",
12534             format("[self.a b:c\n"
12535                    "c:d];",
12536                    Style));
12537 }
12538 
12539 TEST_F(FormatTest, FormatsLambdas) {
12540   verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
12541   verifyFormat(
12542       "int c = [b]() mutable noexcept { return [&b] { return b++; }(); }();\n");
12543   verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
12544   verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
12545   verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
12546   verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
12547   verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
12548   verifyFormat("auto c = [a = [b = 42] {}] {};\n");
12549   verifyFormat("auto c = [a = &i + 10, b = [] {}] {};\n");
12550   verifyFormat("int x = f(*+[] {});");
12551   verifyFormat("void f() {\n"
12552                "  other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
12553                "}\n");
12554   verifyFormat("void f() {\n"
12555                "  other(x.begin(), //\n"
12556                "        x.end(),   //\n"
12557                "        [&](int, int) { return 1; });\n"
12558                "}\n");
12559   verifyFormat("void f() {\n"
12560                "  other.other.other.other.other(\n"
12561                "      x.begin(), x.end(),\n"
12562                "      [something, rather](int, int, int, int, int, int, int) { return 1; });\n"
12563                "}\n");
12564   verifyFormat("void f() {\n"
12565                "  other.other.other.other.other(\n"
12566                "      x.begin(), x.end(),\n"
12567                "      [something, rather](int, int, int, int, int, int, int) {\n"
12568                "        //\n"
12569                "      });\n"
12570                "}\n");
12571   verifyFormat("SomeFunction([]() { // A cool function...\n"
12572                "  return 43;\n"
12573                "});");
12574   EXPECT_EQ("SomeFunction([]() {\n"
12575             "#define A a\n"
12576             "  return 43;\n"
12577             "});",
12578             format("SomeFunction([](){\n"
12579                    "#define A a\n"
12580                    "return 43;\n"
12581                    "});"));
12582   verifyFormat("void f() {\n"
12583                "  SomeFunction([](decltype(x), A *a) {});\n"
12584                "}");
12585   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
12586                "    [](const aaaaaaaaaa &a) { return a; });");
12587   verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
12588                "  SomeOtherFunctioooooooooooooooooooooooooon();\n"
12589                "});");
12590   verifyFormat("Constructor()\n"
12591                "    : Field([] { // comment\n"
12592                "        int i;\n"
12593                "      }) {}");
12594   verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
12595                "  return some_parameter.size();\n"
12596                "};");
12597   verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
12598                "    [](const string &s) { return s; };");
12599   verifyFormat("int i = aaaaaa ? 1 //\n"
12600                "               : [] {\n"
12601                "                   return 2; //\n"
12602                "                 }();");
12603   verifyFormat("llvm::errs() << \"number of twos is \"\n"
12604                "             << std::count_if(v.begin(), v.end(), [](int x) {\n"
12605                "                  return x == 2; // force break\n"
12606                "                });");
12607   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
12608                "    [=](int iiiiiiiiiiii) {\n"
12609                "      return aaaaaaaaaaaaaaaaaaaaaaa !=\n"
12610                "             aaaaaaaaaaaaaaaaaaaaaaa;\n"
12611                "    });",
12612                getLLVMStyleWithColumns(60));
12613   verifyFormat("SomeFunction({[&] {\n"
12614                "                // comment\n"
12615                "              },\n"
12616                "              [&] {\n"
12617                "                // comment\n"
12618                "              }});");
12619   verifyFormat("SomeFunction({[&] {\n"
12620                "  // comment\n"
12621                "}});");
12622   verifyFormat("virtual aaaaaaaaaaaaaaaa(\n"
12623                "    std::function<bool()> bbbbbbbbbbbb = [&]() { return true; },\n"
12624                "    aaaaa aaaaaaaaa);");
12625 
12626   // Lambdas with return types.
12627   verifyFormat("int c = []() -> int { return 2; }();\n");
12628   verifyFormat("int c = []() -> int * { return 2; }();\n");
12629   verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
12630   verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
12631   verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
12632   verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
12633   verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
12634   verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
12635   verifyFormat("[a, a]() -> a<1> {};");
12636   verifyFormat("[]() -> foo<5 + 2> { return {}; };");
12637   verifyFormat("[]() -> foo<5 - 2> { return {}; };");
12638   verifyFormat("[]() -> foo<5 / 2> { return {}; };");
12639   verifyFormat("[]() -> foo<5 * 2> { return {}; };");
12640   verifyFormat("[]() -> foo<5 % 2> { return {}; };");
12641   verifyFormat("[]() -> foo<5 << 2> { return {}; };");
12642   verifyFormat("[]() -> foo<!5> { return {}; };");
12643   verifyFormat("[]() -> foo<~5> { return {}; };");
12644   verifyFormat("[]() -> foo<5 | 2> { return {}; };");
12645   verifyFormat("[]() -> foo<5 || 2> { return {}; };");
12646   verifyFormat("[]() -> foo<5 & 2> { return {}; };");
12647   verifyFormat("[]() -> foo<5 && 2> { return {}; };");
12648   verifyFormat("[]() -> foo<5 == 2> { return {}; };");
12649   verifyFormat("[]() -> foo<5 != 2> { return {}; };");
12650   verifyFormat("[]() -> foo<5 >= 2> { return {}; };");
12651   verifyFormat("[]() -> foo<5 <= 2> { return {}; };");
12652   verifyFormat("[]() -> foo<5 < 2> { return {}; };");
12653   verifyFormat("[]() -> foo<2 ? 1 : 0> { return {}; };");
12654   verifyFormat("namespace bar {\n"
12655               "// broken:\n"
12656               "auto foo{[]() -> foo<5 + 2> { return {}; }};\n"
12657               "} // namespace bar");
12658   verifyFormat("namespace bar {\n"
12659               "// broken:\n"
12660               "auto foo{[]() -> foo<5 - 2> { return {}; }};\n"
12661               "} // namespace bar");
12662   verifyFormat("namespace bar {\n"
12663               "// broken:\n"
12664               "auto foo{[]() -> foo<5 / 2> { return {}; }};\n"
12665               "} // namespace bar");
12666   verifyFormat("namespace bar {\n"
12667               "// broken:\n"
12668               "auto foo{[]() -> foo<5 * 2> { return {}; }};\n"
12669               "} // namespace bar");
12670   verifyFormat("namespace bar {\n"
12671               "// broken:\n"
12672               "auto foo{[]() -> foo<5 % 2> { return {}; }};\n"
12673               "} // namespace bar");
12674   verifyFormat("namespace bar {\n"
12675               "// broken:\n"
12676               "auto foo{[]() -> foo<5 << 2> { return {}; }};\n"
12677               "} // namespace bar");
12678   verifyFormat("namespace bar {\n"
12679               "// broken:\n"
12680               "auto foo{[]() -> foo<!5> { return {}; }};\n"
12681               "} // namespace bar");
12682   verifyFormat("namespace bar {\n"
12683               "// broken:\n"
12684               "auto foo{[]() -> foo<~5> { return {}; }};\n"
12685               "} // namespace bar");
12686   verifyFormat("namespace bar {\n"
12687               "// broken:\n"
12688               "auto foo{[]() -> foo<5 | 2> { return {}; }};\n"
12689               "} // namespace bar");
12690   verifyFormat("namespace bar {\n"
12691               "// broken:\n"
12692               "auto foo{[]() -> foo<5 || 2> { return {}; }};\n"
12693               "} // namespace bar");
12694   verifyFormat("namespace bar {\n"
12695               "// broken:\n"
12696               "auto foo{[]() -> foo<5 & 2> { return {}; }};\n"
12697               "} // namespace bar");
12698   verifyFormat("namespace bar {\n"
12699               "// broken:\n"
12700               "auto foo{[]() -> foo<5 && 2> { return {}; }};\n"
12701               "} // namespace bar");
12702   verifyFormat("namespace bar {\n"
12703               "// broken:\n"
12704               "auto foo{[]() -> foo<5 == 2> { return {}; }};\n"
12705               "} // namespace bar");
12706   verifyFormat("namespace bar {\n"
12707               "// broken:\n"
12708               "auto foo{[]() -> foo<5 != 2> { return {}; }};\n"
12709               "} // namespace bar");
12710   verifyFormat("namespace bar {\n"
12711               "// broken:\n"
12712               "auto foo{[]() -> foo<5 >= 2> { return {}; }};\n"
12713               "} // namespace bar");
12714   verifyFormat("namespace bar {\n"
12715               "// broken:\n"
12716               "auto foo{[]() -> foo<5 <= 2> { return {}; }};\n"
12717               "} // namespace bar");
12718   verifyFormat("namespace bar {\n"
12719               "// broken:\n"
12720               "auto foo{[]() -> foo<5 < 2> { return {}; }};\n"
12721               "} // namespace bar");
12722   verifyFormat("namespace bar {\n"
12723               "// broken:\n"
12724               "auto foo{[]() -> foo<2 ? 1 : 0> { return {}; }};\n"
12725               "} // namespace bar");
12726   verifyFormat("[]() -> a<1> {};");
12727   verifyFormat("[]() -> a<1> { ; };");
12728   verifyFormat("[]() -> a<1> { ; }();");
12729   verifyFormat("[a, a]() -> a<true> {};");
12730   verifyFormat("[]() -> a<true> {};");
12731   verifyFormat("[]() -> a<true> { ; };");
12732   verifyFormat("[]() -> a<true> { ; }();");
12733   verifyFormat("[a, a]() -> a<false> {};");
12734   verifyFormat("[]() -> a<false> {};");
12735   verifyFormat("[]() -> a<false> { ; };");
12736   verifyFormat("[]() -> a<false> { ; }();");
12737   verifyFormat("auto foo{[]() -> foo<false> { ; }};");
12738   verifyFormat("namespace bar {\n"
12739                "auto foo{[]() -> foo<false> { ; }};\n"
12740                "} // namespace bar");
12741   verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
12742                "                   int j) -> int {\n"
12743                "  return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
12744                "};");
12745   verifyFormat(
12746       "aaaaaaaaaaaaaaaaaaaaaa(\n"
12747       "    [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
12748       "      return aaaaaaaaaaaaaaaaa;\n"
12749       "    });",
12750       getLLVMStyleWithColumns(70));
12751   verifyFormat("[]() //\n"
12752                "    -> int {\n"
12753                "  return 1; //\n"
12754                "};");
12755 
12756   // Multiple lambdas in the same parentheses change indentation rules. These
12757   // lambdas are forced to start on new lines.
12758   verifyFormat("SomeFunction(\n"
12759                "    []() {\n"
12760                "      //\n"
12761                "    },\n"
12762                "    []() {\n"
12763                "      //\n"
12764                "    });");
12765 
12766   // A lambda passed as arg0 is always pushed to the next line.
12767   verifyFormat("SomeFunction(\n"
12768                "    [this] {\n"
12769                "      //\n"
12770                "    },\n"
12771                "    1);\n");
12772 
12773   // A multi-line lambda passed as arg1 forces arg0 to be pushed out, just like the arg0
12774   // case above.
12775   auto Style = getGoogleStyle();
12776   Style.BinPackArguments = false;
12777   verifyFormat("SomeFunction(\n"
12778                "    a,\n"
12779                "    [this] {\n"
12780                "      //\n"
12781                "    },\n"
12782                "    b);\n",
12783                Style);
12784   verifyFormat("SomeFunction(\n"
12785                "    a,\n"
12786                "    [this] {\n"
12787                "      //\n"
12788                "    },\n"
12789                "    b);\n");
12790 
12791   // A lambda with a very long line forces arg0 to be pushed out irrespective of
12792   // the BinPackArguments value (as long as the code is wide enough).
12793   verifyFormat("something->SomeFunction(\n"
12794                "    a,\n"
12795                "    [this] {\n"
12796                "      D0000000000000000000000000000000000000000000000000000000000001();\n"
12797                "    },\n"
12798                "    b);\n");
12799 
12800   // A multi-line lambda is pulled up as long as the introducer fits on the previous
12801   // line and there are no further args.
12802   verifyFormat("function(1, [this, that] {\n"
12803                "  //\n"
12804                "});\n");
12805   verifyFormat("function([this, that] {\n"
12806                "  //\n"
12807                "});\n");
12808   // FIXME: this format is not ideal and we should consider forcing the first arg
12809   // onto its own line.
12810   verifyFormat("function(a, b, c, //\n"
12811                "         d, [this, that] {\n"
12812                "           //\n"
12813                "         });\n");
12814 
12815   // Multiple lambdas are treated correctly even when there is a short arg0.
12816   verifyFormat("SomeFunction(\n"
12817                "    1,\n"
12818                "    [this] {\n"
12819                "      //\n"
12820                "    },\n"
12821                "    [this] {\n"
12822                "      //\n"
12823                "    },\n"
12824                "    1);\n");
12825 
12826   // More complex introducers.
12827   verifyFormat("return [i, args...] {};");
12828 
12829   // Not lambdas.
12830   verifyFormat("constexpr char hello[]{\"hello\"};");
12831   verifyFormat("double &operator[](int i) { return 0; }\n"
12832                "int i;");
12833   verifyFormat("std::unique_ptr<int[]> foo() {}");
12834   verifyFormat("int i = a[a][a]->f();");
12835   verifyFormat("int i = (*b)[a]->f();");
12836 
12837   // Other corner cases.
12838   verifyFormat("void f() {\n"
12839                "  bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
12840                "  );\n"
12841                "}");
12842 
12843   // Lambdas created through weird macros.
12844   verifyFormat("void f() {\n"
12845                "  MACRO((const AA &a) { return 1; });\n"
12846                "  MACRO((AA &a) { return 1; });\n"
12847                "}");
12848 
12849   verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
12850                "      doo_dah();\n"
12851                "      doo_dah();\n"
12852                "    })) {\n"
12853                "}");
12854   verifyFormat("if constexpr (blah_blah(whatever, whatever, [] {\n"
12855                "                doo_dah();\n"
12856                "                doo_dah();\n"
12857                "              })) {\n"
12858                "}");
12859   verifyFormat("auto lambda = []() {\n"
12860                "  int a = 2\n"
12861                "#if A\n"
12862                "          + 2\n"
12863                "#endif\n"
12864                "      ;\n"
12865                "};");
12866 
12867   // Lambdas with complex multiline introducers.
12868   verifyFormat(
12869       "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
12870       "    [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n"
12871       "        -> ::std::unordered_set<\n"
12872       "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n"
12873       "      //\n"
12874       "    });");
12875 
12876   FormatStyle DoNotMerge = getLLVMStyle();
12877   DoNotMerge.AllowShortLambdasOnASingleLine = FormatStyle::SLS_None;
12878   verifyFormat("auto c = []() {\n"
12879                "  return b;\n"
12880                "};",
12881                "auto c = []() { return b; };", DoNotMerge);
12882   verifyFormat("auto c = []() {\n"
12883                "};",
12884                " auto c = []() {};", DoNotMerge);
12885 
12886   FormatStyle MergeEmptyOnly = getLLVMStyle();
12887   MergeEmptyOnly.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Empty;
12888   verifyFormat("auto c = []() {\n"
12889                "  return b;\n"
12890                "};",
12891                "auto c = []() {\n"
12892                "  return b;\n"
12893                " };",
12894                MergeEmptyOnly);
12895   verifyFormat("auto c = []() {};",
12896                "auto c = []() {\n"
12897                "};",
12898                MergeEmptyOnly);
12899 
12900   FormatStyle MergeInline = getLLVMStyle();
12901   MergeInline.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Inline;
12902   verifyFormat("auto c = []() {\n"
12903                "  return b;\n"
12904                "};",
12905                "auto c = []() { return b; };", MergeInline);
12906   verifyFormat("function([]() { return b; })", "function([]() { return b; })",
12907                MergeInline);
12908   verifyFormat("function([]() { return b; }, a)",
12909                "function([]() { return b; }, a)", MergeInline);
12910   verifyFormat("function(a, []() { return b; })",
12911                "function(a, []() { return b; })", MergeInline);
12912 }
12913 
12914 TEST_F(FormatTest, EmptyLinesInLambdas) {
12915   verifyFormat("auto lambda = []() {\n"
12916                "  x(); //\n"
12917                "};",
12918                "auto lambda = []() {\n"
12919                "\n"
12920                "  x(); //\n"
12921                "\n"
12922                "};");
12923 }
12924 
12925 TEST_F(FormatTest, FormatsBlocks) {
12926   FormatStyle ShortBlocks = getLLVMStyle();
12927   ShortBlocks.AllowShortBlocksOnASingleLine = true;
12928   verifyFormat("int (^Block)(int, int);", ShortBlocks);
12929   verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
12930   verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
12931   verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
12932   verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
12933   verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
12934 
12935   verifyFormat("foo(^{ bar(); });", ShortBlocks);
12936   verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
12937   verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
12938 
12939   verifyFormat("[operation setCompletionBlock:^{\n"
12940                "  [self onOperationDone];\n"
12941                "}];");
12942   verifyFormat("int i = {[operation setCompletionBlock:^{\n"
12943                "  [self onOperationDone];\n"
12944                "}]};");
12945   verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
12946                "  f();\n"
12947                "}];");
12948   verifyFormat("int a = [operation block:^int(int *i) {\n"
12949                "  return 1;\n"
12950                "}];");
12951   verifyFormat("[myObject doSomethingWith:arg1\n"
12952                "                      aaa:^int(int *a) {\n"
12953                "                        return 1;\n"
12954                "                      }\n"
12955                "                      bbb:f(a * bbbbbbbb)];");
12956 
12957   verifyFormat("[operation setCompletionBlock:^{\n"
12958                "  [self.delegate newDataAvailable];\n"
12959                "}];",
12960                getLLVMStyleWithColumns(60));
12961   verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
12962                "  NSString *path = [self sessionFilePath];\n"
12963                "  if (path) {\n"
12964                "    // ...\n"
12965                "  }\n"
12966                "});");
12967   verifyFormat("[[SessionService sharedService]\n"
12968                "    loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
12969                "      if (window) {\n"
12970                "        [self windowDidLoad:window];\n"
12971                "      } else {\n"
12972                "        [self errorLoadingWindow];\n"
12973                "      }\n"
12974                "    }];");
12975   verifyFormat("void (^largeBlock)(void) = ^{\n"
12976                "  // ...\n"
12977                "};\n",
12978                getLLVMStyleWithColumns(40));
12979   verifyFormat("[[SessionService sharedService]\n"
12980                "    loadWindowWithCompletionBlock: //\n"
12981                "        ^(SessionWindow *window) {\n"
12982                "          if (window) {\n"
12983                "            [self windowDidLoad:window];\n"
12984                "          } else {\n"
12985                "            [self errorLoadingWindow];\n"
12986                "          }\n"
12987                "        }];",
12988                getLLVMStyleWithColumns(60));
12989   verifyFormat("[myObject doSomethingWith:arg1\n"
12990                "    firstBlock:^(Foo *a) {\n"
12991                "      // ...\n"
12992                "      int i;\n"
12993                "    }\n"
12994                "    secondBlock:^(Bar *b) {\n"
12995                "      // ...\n"
12996                "      int i;\n"
12997                "    }\n"
12998                "    thirdBlock:^Foo(Bar *b) {\n"
12999                "      // ...\n"
13000                "      int i;\n"
13001                "    }];");
13002   verifyFormat("[myObject doSomethingWith:arg1\n"
13003                "               firstBlock:-1\n"
13004                "              secondBlock:^(Bar *b) {\n"
13005                "                // ...\n"
13006                "                int i;\n"
13007                "              }];");
13008 
13009   verifyFormat("f(^{\n"
13010                "  @autoreleasepool {\n"
13011                "    if (a) {\n"
13012                "      g();\n"
13013                "    }\n"
13014                "  }\n"
13015                "});");
13016   verifyFormat("Block b = ^int *(A *a, B *b) {}");
13017   verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
13018                "};");
13019 
13020   FormatStyle FourIndent = getLLVMStyle();
13021   FourIndent.ObjCBlockIndentWidth = 4;
13022   verifyFormat("[operation setCompletionBlock:^{\n"
13023                "    [self onOperationDone];\n"
13024                "}];",
13025                FourIndent);
13026 }
13027 
13028 TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
13029   FormatStyle ZeroColumn = getLLVMStyle();
13030   ZeroColumn.ColumnLimit = 0;
13031 
13032   verifyFormat("[[SessionService sharedService] "
13033                "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
13034                "  if (window) {\n"
13035                "    [self windowDidLoad:window];\n"
13036                "  } else {\n"
13037                "    [self errorLoadingWindow];\n"
13038                "  }\n"
13039                "}];",
13040                ZeroColumn);
13041   EXPECT_EQ("[[SessionService sharedService]\n"
13042             "    loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
13043             "      if (window) {\n"
13044             "        [self windowDidLoad:window];\n"
13045             "      } else {\n"
13046             "        [self errorLoadingWindow];\n"
13047             "      }\n"
13048             "    }];",
13049             format("[[SessionService sharedService]\n"
13050                    "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
13051                    "                if (window) {\n"
13052                    "    [self windowDidLoad:window];\n"
13053                    "  } else {\n"
13054                    "    [self errorLoadingWindow];\n"
13055                    "  }\n"
13056                    "}];",
13057                    ZeroColumn));
13058   verifyFormat("[myObject doSomethingWith:arg1\n"
13059                "    firstBlock:^(Foo *a) {\n"
13060                "      // ...\n"
13061                "      int i;\n"
13062                "    }\n"
13063                "    secondBlock:^(Bar *b) {\n"
13064                "      // ...\n"
13065                "      int i;\n"
13066                "    }\n"
13067                "    thirdBlock:^Foo(Bar *b) {\n"
13068                "      // ...\n"
13069                "      int i;\n"
13070                "    }];",
13071                ZeroColumn);
13072   verifyFormat("f(^{\n"
13073                "  @autoreleasepool {\n"
13074                "    if (a) {\n"
13075                "      g();\n"
13076                "    }\n"
13077                "  }\n"
13078                "});",
13079                ZeroColumn);
13080   verifyFormat("void (^largeBlock)(void) = ^{\n"
13081                "  // ...\n"
13082                "};",
13083                ZeroColumn);
13084 
13085   ZeroColumn.AllowShortBlocksOnASingleLine = true;
13086   EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
13087             format("void   (^largeBlock)(void) = ^{ int   i; };", ZeroColumn));
13088   ZeroColumn.AllowShortBlocksOnASingleLine = false;
13089   EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
13090             "  int i;\n"
13091             "};",
13092             format("void   (^largeBlock)(void) = ^{ int   i; };", ZeroColumn));
13093 }
13094 
13095 TEST_F(FormatTest, SupportsCRLF) {
13096   EXPECT_EQ("int a;\r\n"
13097             "int b;\r\n"
13098             "int c;\r\n",
13099             format("int a;\r\n"
13100                    "  int b;\r\n"
13101                    "    int c;\r\n",
13102                    getLLVMStyle()));
13103   EXPECT_EQ("int a;\r\n"
13104             "int b;\r\n"
13105             "int c;\r\n",
13106             format("int a;\r\n"
13107                    "  int b;\n"
13108                    "    int c;\r\n",
13109                    getLLVMStyle()));
13110   EXPECT_EQ("int a;\n"
13111             "int b;\n"
13112             "int c;\n",
13113             format("int a;\r\n"
13114                    "  int b;\n"
13115                    "    int c;\n",
13116                    getLLVMStyle()));
13117   EXPECT_EQ("\"aaaaaaa \"\r\n"
13118             "\"bbbbbbb\";\r\n",
13119             format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
13120   EXPECT_EQ("#define A \\\r\n"
13121             "  b;      \\\r\n"
13122             "  c;      \\\r\n"
13123             "  d;\r\n",
13124             format("#define A \\\r\n"
13125                    "  b; \\\r\n"
13126                    "  c; d; \r\n",
13127                    getGoogleStyle()));
13128 
13129   EXPECT_EQ("/*\r\n"
13130             "multi line block comments\r\n"
13131             "should not introduce\r\n"
13132             "an extra carriage return\r\n"
13133             "*/\r\n",
13134             format("/*\r\n"
13135                    "multi line block comments\r\n"
13136                    "should not introduce\r\n"
13137                    "an extra carriage return\r\n"
13138                    "*/\r\n"));
13139   EXPECT_EQ("/*\r\n"
13140             "\r\n"
13141             "*/",
13142             format("/*\r\n"
13143                    "    \r\r\r\n"
13144                    "*/"));
13145 }
13146 
13147 TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
13148   verifyFormat("MY_CLASS(C) {\n"
13149                "  int i;\n"
13150                "  int j;\n"
13151                "};");
13152 }
13153 
13154 TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
13155   FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
13156   TwoIndent.ContinuationIndentWidth = 2;
13157 
13158   EXPECT_EQ("int i =\n"
13159             "  longFunction(\n"
13160             "    arg);",
13161             format("int i = longFunction(arg);", TwoIndent));
13162 
13163   FormatStyle SixIndent = getLLVMStyleWithColumns(20);
13164   SixIndent.ContinuationIndentWidth = 6;
13165 
13166   EXPECT_EQ("int i =\n"
13167             "      longFunction(\n"
13168             "            arg);",
13169             format("int i = longFunction(arg);", SixIndent));
13170 }
13171 
13172 TEST_F(FormatTest, WrappedClosingParenthesisIndent) {
13173   FormatStyle Style = getLLVMStyle();
13174   verifyFormat("int Foo::getter(\n"
13175                "    //\n"
13176                ") const {\n"
13177                "  return foo;\n"
13178                "}",
13179                Style);
13180   verifyFormat("void Foo::setter(\n"
13181                "    //\n"
13182                ") {\n"
13183                "  foo = 1;\n"
13184                "}",
13185                Style);
13186 }
13187 
13188 TEST_F(FormatTest, SpacesInAngles) {
13189   FormatStyle Spaces = getLLVMStyle();
13190   Spaces.SpacesInAngles = true;
13191 
13192   verifyFormat("static_cast< int >(arg);", Spaces);
13193   verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
13194   verifyFormat("f< int, float >();", Spaces);
13195   verifyFormat("template <> g() {}", Spaces);
13196   verifyFormat("template < std::vector< int > > f() {}", Spaces);
13197   verifyFormat("std::function< void(int, int) > fct;", Spaces);
13198   verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
13199                Spaces);
13200 
13201   Spaces.Standard = FormatStyle::LS_Cpp03;
13202   Spaces.SpacesInAngles = true;
13203   verifyFormat("A< A< int > >();", Spaces);
13204 
13205   Spaces.SpacesInAngles = false;
13206   verifyFormat("A<A<int> >();", Spaces);
13207 
13208   Spaces.Standard = FormatStyle::LS_Cpp11;
13209   Spaces.SpacesInAngles = true;
13210   verifyFormat("A< A< int > >();", Spaces);
13211 
13212   Spaces.SpacesInAngles = false;
13213   verifyFormat("A<A<int>>();", Spaces);
13214 }
13215 
13216 TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
13217   FormatStyle Style = getLLVMStyle();
13218   Style.SpaceAfterTemplateKeyword = false;
13219   verifyFormat("template<int> void foo();", Style);
13220 }
13221 
13222 TEST_F(FormatTest, TripleAngleBrackets) {
13223   verifyFormat("f<<<1, 1>>>();");
13224   verifyFormat("f<<<1, 1, 1, s>>>();");
13225   verifyFormat("f<<<a, b, c, d>>>();");
13226   EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
13227   verifyFormat("f<param><<<1, 1>>>();");
13228   verifyFormat("f<1><<<1, 1>>>();");
13229   EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
13230   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
13231                "aaaaaaaaaaa<<<\n    1, 1>>>();");
13232   verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
13233                "    <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
13234 }
13235 
13236 TEST_F(FormatTest, MergeLessLessAtEnd) {
13237   verifyFormat("<<");
13238   EXPECT_EQ("< < <", format("\\\n<<<"));
13239   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
13240                "aaallvm::outs() <<");
13241   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
13242                "aaaallvm::outs()\n    <<");
13243 }
13244 
13245 TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
13246   std::string code = "#if A\n"
13247                      "#if B\n"
13248                      "a.\n"
13249                      "#endif\n"
13250                      "    a = 1;\n"
13251                      "#else\n"
13252                      "#endif\n"
13253                      "#if C\n"
13254                      "#else\n"
13255                      "#endif\n";
13256   EXPECT_EQ(code, format(code));
13257 }
13258 
13259 TEST_F(FormatTest, HandleConflictMarkers) {
13260   // Git/SVN conflict markers.
13261   EXPECT_EQ("int a;\n"
13262             "void f() {\n"
13263             "  callme(some(parameter1,\n"
13264             "<<<<<<< text by the vcs\n"
13265             "              parameter2),\n"
13266             "||||||| text by the vcs\n"
13267             "              parameter2),\n"
13268             "         parameter3,\n"
13269             "======= text by the vcs\n"
13270             "              parameter2, parameter3),\n"
13271             ">>>>>>> text by the vcs\n"
13272             "         otherparameter);\n",
13273             format("int a;\n"
13274                    "void f() {\n"
13275                    "  callme(some(parameter1,\n"
13276                    "<<<<<<< text by the vcs\n"
13277                    "  parameter2),\n"
13278                    "||||||| text by the vcs\n"
13279                    "  parameter2),\n"
13280                    "  parameter3,\n"
13281                    "======= text by the vcs\n"
13282                    "  parameter2,\n"
13283                    "  parameter3),\n"
13284                    ">>>>>>> text by the vcs\n"
13285                    "  otherparameter);\n"));
13286 
13287   // Perforce markers.
13288   EXPECT_EQ("void f() {\n"
13289             "  function(\n"
13290             ">>>> text by the vcs\n"
13291             "      parameter,\n"
13292             "==== text by the vcs\n"
13293             "      parameter,\n"
13294             "==== text by the vcs\n"
13295             "      parameter,\n"
13296             "<<<< text by the vcs\n"
13297             "      parameter);\n",
13298             format("void f() {\n"
13299                    "  function(\n"
13300                    ">>>> text by the vcs\n"
13301                    "  parameter,\n"
13302                    "==== text by the vcs\n"
13303                    "  parameter,\n"
13304                    "==== text by the vcs\n"
13305                    "  parameter,\n"
13306                    "<<<< text by the vcs\n"
13307                    "  parameter);\n"));
13308 
13309   EXPECT_EQ("<<<<<<<\n"
13310             "|||||||\n"
13311             "=======\n"
13312             ">>>>>>>",
13313             format("<<<<<<<\n"
13314                    "|||||||\n"
13315                    "=======\n"
13316                    ">>>>>>>"));
13317 
13318   EXPECT_EQ("<<<<<<<\n"
13319             "|||||||\n"
13320             "int i;\n"
13321             "=======\n"
13322             ">>>>>>>",
13323             format("<<<<<<<\n"
13324                    "|||||||\n"
13325                    "int i;\n"
13326                    "=======\n"
13327                    ">>>>>>>"));
13328 
13329   // FIXME: Handle parsing of macros around conflict markers correctly:
13330   EXPECT_EQ("#define Macro \\\n"
13331             "<<<<<<<\n"
13332             "Something \\\n"
13333             "|||||||\n"
13334             "Else \\\n"
13335             "=======\n"
13336             "Other \\\n"
13337             ">>>>>>>\n"
13338             "    End int i;\n",
13339             format("#define Macro \\\n"
13340                    "<<<<<<<\n"
13341                    "  Something \\\n"
13342                    "|||||||\n"
13343                    "  Else \\\n"
13344                    "=======\n"
13345                    "  Other \\\n"
13346                    ">>>>>>>\n"
13347                    "  End\n"
13348                    "int i;\n"));
13349 }
13350 
13351 TEST_F(FormatTest, DisableRegions) {
13352   EXPECT_EQ("int i;\n"
13353             "// clang-format off\n"
13354             "  int j;\n"
13355             "// clang-format on\n"
13356             "int k;",
13357             format(" int  i;\n"
13358                    "   // clang-format off\n"
13359                    "  int j;\n"
13360                    " // clang-format on\n"
13361                    "   int   k;"));
13362   EXPECT_EQ("int i;\n"
13363             "/* clang-format off */\n"
13364             "  int j;\n"
13365             "/* clang-format on */\n"
13366             "int k;",
13367             format(" int  i;\n"
13368                    "   /* clang-format off */\n"
13369                    "  int j;\n"
13370                    " /* clang-format on */\n"
13371                    "   int   k;"));
13372 
13373   // Don't reflow comments within disabled regions.
13374   EXPECT_EQ(
13375       "// clang-format off\n"
13376       "// long long long long long long line\n"
13377       "/* clang-format on */\n"
13378       "/* long long long\n"
13379       " * long long long\n"
13380       " * line */\n"
13381       "int i;\n"
13382       "/* clang-format off */\n"
13383       "/* long long long long long long line */\n",
13384       format("// clang-format off\n"
13385              "// long long long long long long line\n"
13386              "/* clang-format on */\n"
13387              "/* long long long long long long line */\n"
13388              "int i;\n"
13389              "/* clang-format off */\n"
13390              "/* long long long long long long line */\n",
13391              getLLVMStyleWithColumns(20)));
13392 }
13393 
13394 TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
13395   format("? ) =");
13396   verifyNoCrash("#define a\\\n /**/}");
13397 }
13398 
13399 TEST_F(FormatTest, FormatsTableGenCode) {
13400   FormatStyle Style = getLLVMStyle();
13401   Style.Language = FormatStyle::LK_TableGen;
13402   verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
13403 }
13404 
13405 TEST_F(FormatTest, ArrayOfTemplates) {
13406   EXPECT_EQ("auto a = new unique_ptr<int>[10];",
13407             format("auto a = new unique_ptr<int > [ 10];"));
13408 
13409   FormatStyle Spaces = getLLVMStyle();
13410   Spaces.SpacesInSquareBrackets = true;
13411   EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
13412             format("auto a = new unique_ptr<int > [10];", Spaces));
13413 }
13414 
13415 TEST_F(FormatTest, ArrayAsTemplateType) {
13416   EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
13417             format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
13418 
13419   FormatStyle Spaces = getLLVMStyle();
13420   Spaces.SpacesInSquareBrackets = true;
13421   EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
13422             format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
13423 }
13424 
13425 TEST_F(FormatTest, NoSpaceAfterSuper) {
13426     verifyFormat("__super::FooBar();");
13427 }
13428 
13429 TEST(FormatStyle, GetStyleWithEmptyFileName) {
13430   llvm::vfs::InMemoryFileSystem FS;
13431   auto Style1 = getStyle("file", "", "Google", "", &FS);
13432   ASSERT_TRUE((bool)Style1);
13433   ASSERT_EQ(*Style1, getGoogleStyle());
13434 }
13435 
13436 TEST(FormatStyle, GetStyleOfFile) {
13437   llvm::vfs::InMemoryFileSystem FS;
13438   // Test 1: format file in the same directory.
13439   ASSERT_TRUE(
13440       FS.addFile("/a/.clang-format", 0,
13441                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
13442   ASSERT_TRUE(
13443       FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
13444   auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
13445   ASSERT_TRUE((bool)Style1);
13446   ASSERT_EQ(*Style1, getLLVMStyle());
13447 
13448   // Test 2.1: fallback to default.
13449   ASSERT_TRUE(
13450       FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
13451   auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
13452   ASSERT_TRUE((bool)Style2);
13453   ASSERT_EQ(*Style2, getMozillaStyle());
13454 
13455   // Test 2.2: no format on 'none' fallback style.
13456   Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
13457   ASSERT_TRUE((bool)Style2);
13458   ASSERT_EQ(*Style2, getNoStyle());
13459 
13460   // Test 2.3: format if config is found with no based style while fallback is
13461   // 'none'.
13462   ASSERT_TRUE(FS.addFile("/b/.clang-format", 0,
13463                          llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2")));
13464   Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
13465   ASSERT_TRUE((bool)Style2);
13466   ASSERT_EQ(*Style2, getLLVMStyle());
13467 
13468   // Test 2.4: format if yaml with no based style, while fallback is 'none'.
13469   Style2 = getStyle("{}", "a.h", "none", "", &FS);
13470   ASSERT_TRUE((bool)Style2);
13471   ASSERT_EQ(*Style2, getLLVMStyle());
13472 
13473   // Test 3: format file in parent directory.
13474   ASSERT_TRUE(
13475       FS.addFile("/c/.clang-format", 0,
13476                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
13477   ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
13478                          llvm::MemoryBuffer::getMemBuffer("int i;")));
13479   auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
13480   ASSERT_TRUE((bool)Style3);
13481   ASSERT_EQ(*Style3, getGoogleStyle());
13482 
13483   // Test 4: error on invalid fallback style
13484   auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS);
13485   ASSERT_FALSE((bool)Style4);
13486   llvm::consumeError(Style4.takeError());
13487 
13488   // Test 5: error on invalid yaml on command line
13489   auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS);
13490   ASSERT_FALSE((bool)Style5);
13491   llvm::consumeError(Style5.takeError());
13492 
13493   // Test 6: error on invalid style
13494   auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS);
13495   ASSERT_FALSE((bool)Style6);
13496   llvm::consumeError(Style6.takeError());
13497 
13498   // Test 7: found config file, error on parsing it
13499   ASSERT_TRUE(
13500       FS.addFile("/d/.clang-format", 0,
13501                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n"
13502                                                   "InvalidKey: InvalidValue")));
13503   ASSERT_TRUE(
13504       FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
13505   auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS);
13506   ASSERT_FALSE((bool)Style7);
13507   llvm::consumeError(Style7.takeError());
13508 
13509   // Test 8: inferred per-language defaults apply.
13510   auto StyleTd = getStyle("file", "x.td", "llvm", "", &FS);
13511   ASSERT_TRUE((bool)StyleTd);
13512   ASSERT_EQ(*StyleTd, getLLVMStyle(FormatStyle::LK_TableGen));
13513 }
13514 
13515 TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
13516   // Column limit is 20.
13517   std::string Code = "Type *a =\n"
13518                      "    new Type();\n"
13519                      "g(iiiii, 0, jjjjj,\n"
13520                      "  0, kkkkk, 0, mm);\n"
13521                      "int  bad     = format   ;";
13522   std::string Expected = "auto a = new Type();\n"
13523                          "g(iiiii, nullptr,\n"
13524                          "  jjjjj, nullptr,\n"
13525                          "  kkkkk, nullptr,\n"
13526                          "  mm);\n"
13527                          "int  bad     = format   ;";
13528   FileID ID = Context.createInMemoryFile("format.cpp", Code);
13529   tooling::Replacements Replaces = toReplacements(
13530       {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
13531                             "auto "),
13532        tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
13533                             "nullptr"),
13534        tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
13535                             "nullptr"),
13536        tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
13537                             "nullptr")});
13538 
13539   format::FormatStyle Style = format::getLLVMStyle();
13540   Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
13541   auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
13542   EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
13543       << llvm::toString(FormattedReplaces.takeError()) << "\n";
13544   auto Result = applyAllReplacements(Code, *FormattedReplaces);
13545   EXPECT_TRUE(static_cast<bool>(Result));
13546   EXPECT_EQ(Expected, *Result);
13547 }
13548 
13549 TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
13550   std::string Code = "#include \"a.h\"\n"
13551                      "#include \"c.h\"\n"
13552                      "\n"
13553                      "int main() {\n"
13554                      "  return 0;\n"
13555                      "}";
13556   std::string Expected = "#include \"a.h\"\n"
13557                          "#include \"b.h\"\n"
13558                          "#include \"c.h\"\n"
13559                          "\n"
13560                          "int main() {\n"
13561                          "  return 0;\n"
13562                          "}";
13563   FileID ID = Context.createInMemoryFile("fix.cpp", Code);
13564   tooling::Replacements Replaces = toReplacements(
13565       {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
13566                             "#include \"b.h\"\n")});
13567 
13568   format::FormatStyle Style = format::getLLVMStyle();
13569   Style.SortIncludes = true;
13570   auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
13571   EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
13572       << llvm::toString(FormattedReplaces.takeError()) << "\n";
13573   auto Result = applyAllReplacements(Code, *FormattedReplaces);
13574   EXPECT_TRUE(static_cast<bool>(Result));
13575   EXPECT_EQ(Expected, *Result);
13576 }
13577 
13578 TEST_F(FormatTest, FormatSortsUsingDeclarations) {
13579   EXPECT_EQ("using std::cin;\n"
13580             "using std::cout;",
13581             format("using std::cout;\n"
13582                    "using std::cin;", getGoogleStyle()));
13583 }
13584 
13585 TEST_F(FormatTest, UTF8CharacterLiteralCpp03) {
13586   format::FormatStyle Style = format::getLLVMStyle();
13587   Style.Standard = FormatStyle::LS_Cpp03;
13588   // cpp03 recognize this string as identifier u8 and literal character 'a'
13589   EXPECT_EQ("auto c = u8 'a';", format("auto c = u8'a';", Style));
13590 }
13591 
13592 TEST_F(FormatTest, UTF8CharacterLiteralCpp11) {
13593   // u8'a' is a C++17 feature, utf8 literal character, LS_Cpp11 covers
13594   // all modes, including C++11, C++14 and C++17
13595   EXPECT_EQ("auto c = u8'a';", format("auto c = u8'a';"));
13596 }
13597 
13598 TEST_F(FormatTest, DoNotFormatLikelyXml) {
13599   EXPECT_EQ("<!-- ;> -->",
13600             format("<!-- ;> -->", getGoogleStyle()));
13601   EXPECT_EQ(" <!-- >; -->",
13602             format(" <!-- >; -->", getGoogleStyle()));
13603 }
13604 
13605 TEST_F(FormatTest, StructuredBindings) {
13606   // Structured bindings is a C++17 feature.
13607   // all modes, including C++11, C++14 and C++17
13608   verifyFormat("auto [a, b] = f();");
13609   EXPECT_EQ("auto [a, b] = f();", format("auto[a, b] = f();"));
13610   EXPECT_EQ("const auto [a, b] = f();", format("const   auto[a, b] = f();"));
13611   EXPECT_EQ("auto const [a, b] = f();", format("auto  const[a, b] = f();"));
13612   EXPECT_EQ("auto const volatile [a, b] = f();",
13613             format("auto  const   volatile[a, b] = f();"));
13614   EXPECT_EQ("auto [a, b, c] = f();", format("auto   [  a  ,  b,c   ] = f();"));
13615   EXPECT_EQ("auto &[a, b, c] = f();",
13616             format("auto   &[  a  ,  b,c   ] = f();"));
13617   EXPECT_EQ("auto &&[a, b, c] = f();",
13618             format("auto   &&[  a  ,  b,c   ] = f();"));
13619   EXPECT_EQ("auto const &[a, b] = f();", format("auto  const&[a, b] = f();"));
13620   EXPECT_EQ("auto const volatile &&[a, b] = f();",
13621             format("auto  const  volatile  &&[a, b] = f();"));
13622   EXPECT_EQ("auto const &&[a, b] = f();", format("auto  const   &&  [a, b] = f();"));
13623   EXPECT_EQ("const auto &[a, b] = f();", format("const  auto  &  [a, b] = f();"));
13624   EXPECT_EQ("const auto volatile &&[a, b] = f();",
13625             format("const  auto   volatile  &&[a, b] = f();"));
13626   EXPECT_EQ("volatile const auto &&[a, b] = f();",
13627             format("volatile  const  auto   &&[a, b] = f();"));
13628   EXPECT_EQ("const auto &&[a, b] = f();", format("const  auto  &&  [a, b] = f();"));
13629 
13630   // Make sure we don't mistake structured bindings for lambdas.
13631   FormatStyle PointerMiddle = getLLVMStyle();
13632   PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
13633   verifyFormat("auto [a1, b]{A * i};", getGoogleStyle());
13634   verifyFormat("auto [a2, b]{A * i};", getLLVMStyle());
13635   verifyFormat("auto [a3, b]{A * i};", PointerMiddle);
13636   verifyFormat("auto const [a1, b]{A * i};", getGoogleStyle());
13637   verifyFormat("auto const [a2, b]{A * i};", getLLVMStyle());
13638   verifyFormat("auto const [a3, b]{A * i};", PointerMiddle);
13639   verifyFormat("auto const& [a1, b]{A * i};", getGoogleStyle());
13640   verifyFormat("auto const &[a2, b]{A * i};", getLLVMStyle());
13641   verifyFormat("auto const & [a3, b]{A * i};", PointerMiddle);
13642   verifyFormat("auto const&& [a1, b]{A * i};", getGoogleStyle());
13643   verifyFormat("auto const &&[a2, b]{A * i};", getLLVMStyle());
13644   verifyFormat("auto const && [a3, b]{A * i};", PointerMiddle);
13645 
13646   EXPECT_EQ("for (const auto &&[a, b] : some_range) {\n}",
13647             format("for (const auto   &&   [a, b] : some_range) {\n}"));
13648   EXPECT_EQ("for (const auto &[a, b] : some_range) {\n}",
13649             format("for (const auto   &   [a, b] : some_range) {\n}"));
13650   EXPECT_EQ("for (const auto [a, b] : some_range) {\n}",
13651             format("for (const auto[a, b] : some_range) {\n}"));
13652   EXPECT_EQ("auto [x, y](expr);", format("auto[x,y]  (expr);"));
13653   EXPECT_EQ("auto &[x, y](expr);", format("auto  &  [x,y]  (expr);"));
13654   EXPECT_EQ("auto &&[x, y](expr);", format("auto  &&  [x,y]  (expr);"));
13655   EXPECT_EQ("auto const &[x, y](expr);", format("auto  const  &  [x,y]  (expr);"));
13656   EXPECT_EQ("auto const &&[x, y](expr);", format("auto  const  &&  [x,y]  (expr);"));
13657   EXPECT_EQ("auto [x, y]{expr};", format("auto[x,y]     {expr};"));
13658   EXPECT_EQ("auto const &[x, y]{expr};", format("auto  const  &  [x,y]  {expr};"));
13659   EXPECT_EQ("auto const &&[x, y]{expr};", format("auto  const  &&  [x,y]  {expr};"));
13660 
13661   format::FormatStyle Spaces = format::getLLVMStyle();
13662   Spaces.SpacesInSquareBrackets = true;
13663   verifyFormat("auto [ a, b ] = f();", Spaces);
13664   verifyFormat("auto &&[ a, b ] = f();", Spaces);
13665   verifyFormat("auto &[ a, b ] = f();", Spaces);
13666   verifyFormat("auto const &&[ a, b ] = f();", Spaces);
13667   verifyFormat("auto const &[ a, b ] = f();", Spaces);
13668 }
13669 
13670 TEST_F(FormatTest, FileAndCode) {
13671   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.cc", ""));
13672   EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.m", ""));
13673   EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.mm", ""));
13674   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", ""));
13675   EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@interface Foo\n@end\n"));
13676   EXPECT_EQ(
13677       FormatStyle::LK_ObjC,
13678       guessLanguage("foo.h", "#define TRY(x, y) @try { x; } @finally { y; }"));
13679   EXPECT_EQ(FormatStyle::LK_ObjC,
13680             guessLanguage("foo.h", "#define AVAIL(x) @available(x, *))"));
13681   EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@class Foo;"));
13682   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo", ""));
13683   EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo", "@interface Foo\n@end\n"));
13684   EXPECT_EQ(FormatStyle::LK_ObjC,
13685             guessLanguage("foo.h", "int DoStuff(CGRect rect);\n"));
13686   EXPECT_EQ(
13687       FormatStyle::LK_ObjC,
13688       guessLanguage("foo.h",
13689                     "#define MY_POINT_MAKE(x, y) CGPointMake((x), (y));\n"));
13690   EXPECT_EQ(
13691       FormatStyle::LK_Cpp,
13692       guessLanguage("foo.h", "#define FOO(...) auto bar = [] __VA_ARGS__;"));
13693 }
13694 
13695 TEST_F(FormatTest, GuessLanguageWithCpp11AttributeSpecifiers) {
13696   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[noreturn]];"));
13697   EXPECT_EQ(FormatStyle::LK_ObjC,
13698             guessLanguage("foo.h", "array[[calculator getIndex]];"));
13699   EXPECT_EQ(FormatStyle::LK_Cpp,
13700             guessLanguage("foo.h", "[[noreturn, deprecated(\"so sorry\")]];"));
13701   EXPECT_EQ(
13702       FormatStyle::LK_Cpp,
13703       guessLanguage("foo.h", "[[noreturn, deprecated(\"gone, sorry\")]];"));
13704   EXPECT_EQ(FormatStyle::LK_ObjC,
13705             guessLanguage("foo.h", "[[noreturn foo] bar];"));
13706   EXPECT_EQ(FormatStyle::LK_Cpp,
13707             guessLanguage("foo.h", "[[clang::fallthrough]];"));
13708   EXPECT_EQ(FormatStyle::LK_ObjC,
13709             guessLanguage("foo.h", "[[clang:fallthrough] foo];"));
13710   EXPECT_EQ(FormatStyle::LK_Cpp,
13711             guessLanguage("foo.h", "[[gsl::suppress(\"type\")]];"));
13712   EXPECT_EQ(FormatStyle::LK_Cpp,
13713             guessLanguage("foo.h", "[[using clang: fallthrough]];"));
13714   EXPECT_EQ(FormatStyle::LK_ObjC,
13715             guessLanguage("foo.h", "[[abusing clang:fallthrough] bar];"));
13716   EXPECT_EQ(FormatStyle::LK_Cpp,
13717             guessLanguage("foo.h", "[[using gsl: suppress(\"type\")]];"));
13718   EXPECT_EQ(
13719       FormatStyle::LK_Cpp,
13720       guessLanguage("foo.h", "for (auto &&[endpoint, stream] : streams_)"));
13721   EXPECT_EQ(
13722       FormatStyle::LK_Cpp,
13723       guessLanguage("foo.h",
13724                     "[[clang::callable_when(\"unconsumed\", \"unknown\")]]"));
13725   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[foo::bar, ...]]"));
13726 }
13727 
13728 TEST_F(FormatTest, GuessLanguageWithCaret) {
13729   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^);"));
13730   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^, Bar);"));
13731   EXPECT_EQ(FormatStyle::LK_ObjC,
13732             guessLanguage("foo.h", "int(^)(char, float);"));
13733   EXPECT_EQ(FormatStyle::LK_ObjC,
13734             guessLanguage("foo.h", "int(^foo)(char, float);"));
13735   EXPECT_EQ(FormatStyle::LK_ObjC,
13736             guessLanguage("foo.h", "int(^foo[10])(char, float);"));
13737   EXPECT_EQ(FormatStyle::LK_ObjC,
13738             guessLanguage("foo.h", "int(^foo[kNumEntries])(char, float);"));
13739   EXPECT_EQ(
13740       FormatStyle::LK_ObjC,
13741       guessLanguage("foo.h", "int(^foo[(kNumEntries + 10)])(char, float);"));
13742 }
13743 
13744 TEST_F(FormatTest, GuessedLanguageWithInlineAsmClobbers) {
13745   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h",
13746                                                "void f() {\n"
13747                                                "  asm (\"mov %[e], %[d]\"\n"
13748                                                "     : [d] \"=rm\" (d)\n"
13749                                                "       [e] \"rm\" (*e));\n"
13750                                                "}"));
13751   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h",
13752                                                "void f() {\n"
13753                                                "  _asm (\"mov %[e], %[d]\"\n"
13754                                                "     : [d] \"=rm\" (d)\n"
13755                                                "       [e] \"rm\" (*e));\n"
13756                                                "}"));
13757   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h",
13758                                                "void f() {\n"
13759                                                "  __asm (\"mov %[e], %[d]\"\n"
13760                                                "     : [d] \"=rm\" (d)\n"
13761                                                "       [e] \"rm\" (*e));\n"
13762                                                "}"));
13763   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h",
13764                                                "void f() {\n"
13765                                                "  __asm__ (\"mov %[e], %[d]\"\n"
13766                                                "     : [d] \"=rm\" (d)\n"
13767                                                "       [e] \"rm\" (*e));\n"
13768                                                "}"));
13769   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h",
13770                                                "void f() {\n"
13771                                                "  asm (\"mov %[e], %[d]\"\n"
13772                                                "     : [d] \"=rm\" (d),\n"
13773                                                "       [e] \"rm\" (*e));\n"
13774                                                "}"));
13775   EXPECT_EQ(FormatStyle::LK_Cpp,
13776             guessLanguage("foo.h", "void f() {\n"
13777                                    "  asm volatile (\"mov %[e], %[d]\"\n"
13778                                    "     : [d] \"=rm\" (d)\n"
13779                                    "       [e] \"rm\" (*e));\n"
13780                                    "}"));
13781 }
13782 
13783 TEST_F(FormatTest, GuessLanguageWithChildLines) {
13784   EXPECT_EQ(FormatStyle::LK_Cpp,
13785             guessLanguage("foo.h", "#define FOO ({ std::string s; })"));
13786   EXPECT_EQ(FormatStyle::LK_ObjC,
13787             guessLanguage("foo.h", "#define FOO ({ NSString *s; })"));
13788   EXPECT_EQ(
13789       FormatStyle::LK_Cpp,
13790       guessLanguage("foo.h", "#define FOO ({ foo(); ({ std::string s; }) })"));
13791   EXPECT_EQ(
13792       FormatStyle::LK_ObjC,
13793       guessLanguage("foo.h", "#define FOO ({ foo(); ({ NSString *s; }) })"));
13794 }
13795 
13796 TEST_F(FormatTest, TypenameMacros) {
13797   std::vector<std::string> TypenameMacros = {"STACK_OF", "LIST", "TAILQ_ENTRY"};
13798 
13799   // Test case reported in https://bugs.llvm.org/show_bug.cgi?id=30353
13800   FormatStyle Google = getGoogleStyleWithColumns(0);
13801   Google.TypenameMacros = TypenameMacros;
13802   verifyFormat("struct foo {\n"
13803                "  int bar;\n"
13804                "  TAILQ_ENTRY(a) bleh;\n"
13805                "};", Google);
13806 
13807   FormatStyle Macros = getLLVMStyle();
13808   Macros.TypenameMacros = TypenameMacros;
13809 
13810   verifyFormat("STACK_OF(int) a;", Macros);
13811   verifyFormat("STACK_OF(int) *a;", Macros);
13812   verifyFormat("STACK_OF(int const *) *a;", Macros);
13813   verifyFormat("STACK_OF(int *const) *a;", Macros);
13814   verifyFormat("STACK_OF(int, string) a;", Macros);
13815   verifyFormat("STACK_OF(LIST(int)) a;", Macros);
13816   verifyFormat("STACK_OF(LIST(int)) a, b;", Macros);
13817   verifyFormat("for (LIST(int) *a = NULL; a;) {\n}", Macros);
13818   verifyFormat("STACK_OF(int) f(LIST(int) *arg);", Macros);
13819 
13820   Macros.PointerAlignment = FormatStyle::PAS_Left;
13821   verifyFormat("STACK_OF(int)* a;", Macros);
13822   verifyFormat("STACK_OF(int*)* a;", Macros);
13823 }
13824 
13825 } // end namespace
13826 } // end namespace format
13827 } // end namespace clang
13828