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("typedef NS_ENUM(NSInteger, MyType) {\n"
1720                      "  // Information about someDecentlyLongValue.\n"
1721                      "  someDecentlyLongValue,\n"
1722                      "  // Information about anotherDecentlyLongValue.\n"
1723                      "  anotherDecentlyLongValue,\n"
1724                      "  // Information about aThirdDecentlyLongValue.\n"
1725                      "  aThirdDecentlyLongValue\n"
1726                      "};");
1727   verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n"
1728                      "  a = 1,\n"
1729                      "  b = 2,\n"
1730                      "  c = 3,\n"
1731                      "};");
1732   verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n"
1733                      "  a = 1,\n"
1734                      "  b = 2,\n"
1735                      "  c = 3,\n"
1736                      "};");
1737   verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n"
1738                      "  a = 1,\n"
1739                      "  b = 2,\n"
1740                      "  c = 3,\n"
1741                      "};");
1742 }
1743 
1744 TEST_F(FormatTest, FormatsBitfields) {
1745   verifyFormat("struct Bitfields {\n"
1746                "  unsigned sClass : 8;\n"
1747                "  unsigned ValueKind : 2;\n"
1748                "};");
1749   verifyFormat("struct A {\n"
1750                "  int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa : 1,\n"
1751                "      bbbbbbbbbbbbbbbbbbbbbbbbb;\n"
1752                "};");
1753   verifyFormat("struct MyStruct {\n"
1754                "  uchar data;\n"
1755                "  uchar : 8;\n"
1756                "  uchar : 8;\n"
1757                "  uchar other;\n"
1758                "};");
1759 }
1760 
1761 TEST_F(FormatTest, FormatsNamespaces) {
1762   FormatStyle LLVMWithNoNamespaceFix = getLLVMStyle();
1763   LLVMWithNoNamespaceFix.FixNamespaceComments = false;
1764 
1765   verifyFormat("namespace some_namespace {\n"
1766                "class A {};\n"
1767                "void f() { f(); }\n"
1768                "}",
1769                LLVMWithNoNamespaceFix);
1770   verifyFormat("/* something */ namespace some_namespace {\n"
1771                "class A {};\n"
1772                "void f() { f(); }\n"
1773                "}",
1774                LLVMWithNoNamespaceFix);
1775   verifyFormat("namespace {\n"
1776                "class A {};\n"
1777                "void f() { f(); }\n"
1778                "}",
1779                LLVMWithNoNamespaceFix);
1780   verifyFormat("/* something */ namespace {\n"
1781                "class A {};\n"
1782                "void f() { f(); }\n"
1783                "}",
1784                LLVMWithNoNamespaceFix);
1785   verifyFormat("inline namespace X {\n"
1786                "class A {};\n"
1787                "void f() { f(); }\n"
1788                "}",
1789                LLVMWithNoNamespaceFix);
1790   verifyFormat("/* something */ inline namespace X {\n"
1791                "class A {};\n"
1792                "void f() { f(); }\n"
1793                "}",
1794                LLVMWithNoNamespaceFix);
1795   verifyFormat("export namespace X {\n"
1796                "class A {};\n"
1797                "void f() { f(); }\n"
1798                "}",
1799                LLVMWithNoNamespaceFix);
1800   verifyFormat("using namespace some_namespace;\n"
1801                "class A {};\n"
1802                "void f() { f(); }",
1803                LLVMWithNoNamespaceFix);
1804 
1805   // This code is more common than we thought; if we
1806   // layout this correctly the semicolon will go into
1807   // its own line, which is undesirable.
1808   verifyFormat("namespace {};",
1809                LLVMWithNoNamespaceFix);
1810   verifyFormat("namespace {\n"
1811                "class A {};\n"
1812                "};",
1813                LLVMWithNoNamespaceFix);
1814 
1815   verifyFormat("namespace {\n"
1816                "int SomeVariable = 0; // comment\n"
1817                "} // namespace",
1818                LLVMWithNoNamespaceFix);
1819   EXPECT_EQ("#ifndef HEADER_GUARD\n"
1820             "#define HEADER_GUARD\n"
1821             "namespace my_namespace {\n"
1822             "int i;\n"
1823             "} // my_namespace\n"
1824             "#endif // HEADER_GUARD",
1825             format("#ifndef HEADER_GUARD\n"
1826                    " #define HEADER_GUARD\n"
1827                    "   namespace my_namespace {\n"
1828                    "int i;\n"
1829                    "}    // my_namespace\n"
1830                    "#endif    // HEADER_GUARD",
1831                    LLVMWithNoNamespaceFix));
1832 
1833   EXPECT_EQ("namespace A::B {\n"
1834             "class C {};\n"
1835             "}",
1836             format("namespace A::B {\n"
1837                    "class C {};\n"
1838                    "}",
1839                    LLVMWithNoNamespaceFix));
1840 
1841   FormatStyle Style = getLLVMStyle();
1842   Style.NamespaceIndentation = FormatStyle::NI_All;
1843   EXPECT_EQ("namespace out {\n"
1844             "  int i;\n"
1845             "  namespace in {\n"
1846             "    int i;\n"
1847             "  } // namespace in\n"
1848             "} // namespace out",
1849             format("namespace out {\n"
1850                    "int i;\n"
1851                    "namespace in {\n"
1852                    "int i;\n"
1853                    "} // namespace in\n"
1854                    "} // namespace out",
1855                    Style));
1856 
1857   Style.NamespaceIndentation = FormatStyle::NI_Inner;
1858   EXPECT_EQ("namespace out {\n"
1859             "int i;\n"
1860             "namespace in {\n"
1861             "  int i;\n"
1862             "} // namespace in\n"
1863             "} // namespace out",
1864             format("namespace out {\n"
1865                    "int i;\n"
1866                    "namespace in {\n"
1867                    "int i;\n"
1868                    "} // namespace in\n"
1869                    "} // namespace out",
1870                    Style));
1871 }
1872 
1873 TEST_F(FormatTest, FormatsCompactNamespaces) {
1874   FormatStyle Style = getLLVMStyle();
1875   Style.CompactNamespaces = true;
1876 
1877   verifyFormat("namespace A { namespace B {\n"
1878 			   "}} // namespace A::B",
1879 			   Style);
1880 
1881   EXPECT_EQ("namespace out { namespace in {\n"
1882             "}} // namespace out::in",
1883             format("namespace out {\n"
1884                    "namespace in {\n"
1885                    "} // namespace in\n"
1886                    "} // namespace out",
1887                    Style));
1888 
1889   // Only namespaces which have both consecutive opening and end get compacted
1890   EXPECT_EQ("namespace out {\n"
1891             "namespace in1 {\n"
1892             "} // namespace in1\n"
1893             "namespace in2 {\n"
1894             "} // namespace in2\n"
1895             "} // namespace out",
1896             format("namespace out {\n"
1897                    "namespace in1 {\n"
1898                    "} // namespace in1\n"
1899                    "namespace in2 {\n"
1900                    "} // namespace in2\n"
1901                    "} // namespace out",
1902                    Style));
1903 
1904   EXPECT_EQ("namespace out {\n"
1905             "int i;\n"
1906             "namespace in {\n"
1907             "int j;\n"
1908             "} // namespace in\n"
1909             "int k;\n"
1910             "} // namespace out",
1911             format("namespace out { int i;\n"
1912                    "namespace in { int j; } // namespace in\n"
1913                    "int k; } // namespace out",
1914                    Style));
1915 
1916   EXPECT_EQ("namespace A { namespace B { namespace C {\n"
1917             "}}} // namespace A::B::C\n",
1918             format("namespace A { namespace B {\n"
1919                    "namespace C {\n"
1920                    "}} // namespace B::C\n"
1921                    "} // namespace A\n",
1922                    Style));
1923 
1924   Style.ColumnLimit = 40;
1925   EXPECT_EQ("namespace aaaaaaaaaa {\n"
1926             "namespace bbbbbbbbbb {\n"
1927             "}} // namespace aaaaaaaaaa::bbbbbbbbbb",
1928             format("namespace aaaaaaaaaa {\n"
1929                    "namespace bbbbbbbbbb {\n"
1930                    "} // namespace bbbbbbbbbb\n"
1931                    "} // namespace aaaaaaaaaa",
1932                    Style));
1933 
1934   EXPECT_EQ("namespace aaaaaa { namespace bbbbbb {\n"
1935             "namespace cccccc {\n"
1936             "}}} // namespace aaaaaa::bbbbbb::cccccc",
1937             format("namespace aaaaaa {\n"
1938                    "namespace bbbbbb {\n"
1939                    "namespace cccccc {\n"
1940                    "} // namespace cccccc\n"
1941                    "} // namespace bbbbbb\n"
1942                    "} // namespace aaaaaa",
1943                    Style));
1944   Style.ColumnLimit = 80;
1945 
1946   // Extra semicolon after 'inner' closing brace prevents merging
1947   EXPECT_EQ("namespace out { namespace in {\n"
1948             "}; } // namespace out::in",
1949             format("namespace out {\n"
1950                    "namespace in {\n"
1951                    "}; // namespace in\n"
1952                    "} // namespace out",
1953                    Style));
1954 
1955   // Extra semicolon after 'outer' closing brace is conserved
1956   EXPECT_EQ("namespace out { namespace in {\n"
1957             "}}; // namespace out::in",
1958             format("namespace out {\n"
1959                    "namespace in {\n"
1960                    "} // namespace in\n"
1961                    "}; // namespace out",
1962                    Style));
1963 
1964   Style.NamespaceIndentation = FormatStyle::NI_All;
1965   EXPECT_EQ("namespace out { namespace in {\n"
1966             "  int i;\n"
1967             "}} // namespace out::in",
1968             format("namespace out {\n"
1969                    "namespace in {\n"
1970                    "int i;\n"
1971                    "} // namespace in\n"
1972                    "} // namespace out",
1973                    Style));
1974   EXPECT_EQ("namespace out { namespace mid {\n"
1975             "  namespace in {\n"
1976             "    int j;\n"
1977             "  } // namespace in\n"
1978             "  int k;\n"
1979             "}} // namespace out::mid",
1980             format("namespace out { namespace mid {\n"
1981                    "namespace in { int j; } // namespace in\n"
1982                    "int k; }} // namespace out::mid",
1983                    Style));
1984 
1985   Style.NamespaceIndentation = FormatStyle::NI_Inner;
1986   EXPECT_EQ("namespace out { namespace in {\n"
1987             "  int i;\n"
1988             "}} // namespace out::in",
1989             format("namespace out {\n"
1990                    "namespace in {\n"
1991                    "int i;\n"
1992                    "} // namespace in\n"
1993                    "} // namespace out",
1994                    Style));
1995   EXPECT_EQ("namespace out { namespace mid { namespace in {\n"
1996             "  int i;\n"
1997             "}}} // namespace out::mid::in",
1998             format("namespace out {\n"
1999                    "namespace mid {\n"
2000                    "namespace in {\n"
2001                    "int i;\n"
2002                    "} // namespace in\n"
2003                    "} // namespace mid\n"
2004                    "} // namespace out",
2005                    Style));
2006 }
2007 
2008 TEST_F(FormatTest, FormatsExternC) {
2009   verifyFormat("extern \"C\" {\nint a;");
2010   verifyFormat("extern \"C\" {}");
2011   verifyFormat("extern \"C\" {\n"
2012                "int foo();\n"
2013                "}");
2014   verifyFormat("extern \"C\" int foo() {}");
2015   verifyFormat("extern \"C\" int foo();");
2016   verifyFormat("extern \"C\" int foo() {\n"
2017                "  int i = 42;\n"
2018                "  return i;\n"
2019                "}");
2020 
2021   FormatStyle Style = getLLVMStyle();
2022   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
2023   Style.BraceWrapping.AfterFunction = true;
2024   verifyFormat("extern \"C\" int foo() {}", Style);
2025   verifyFormat("extern \"C\" int foo();", Style);
2026   verifyFormat("extern \"C\" int foo()\n"
2027                "{\n"
2028                "  int i = 42;\n"
2029                "  return i;\n"
2030                "}",
2031                Style);
2032 
2033   Style.BraceWrapping.AfterExternBlock = true;
2034   Style.BraceWrapping.SplitEmptyRecord = false;
2035   verifyFormat("extern \"C\"\n"
2036                "{}",
2037                Style);
2038   verifyFormat("extern \"C\"\n"
2039                "{\n"
2040                "  int foo();\n"
2041                "}",
2042                Style);
2043 }
2044 
2045 TEST_F(FormatTest, FormatsInlineASM) {
2046   verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));");
2047   verifyFormat("asm(\"nop\" ::: \"memory\");");
2048   verifyFormat(
2049       "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n"
2050       "    \"cpuid\\n\\t\"\n"
2051       "    \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n"
2052       "    : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n"
2053       "    : \"a\"(value));");
2054   EXPECT_EQ(
2055       "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n"
2056       "  __asm {\n"
2057       "        mov     edx,[that] // vtable in edx\n"
2058       "        mov     eax,methodIndex\n"
2059       "        call    [edx][eax*4] // stdcall\n"
2060       "  }\n"
2061       "}",
2062       format("void NS_InvokeByIndex(void *that,   unsigned int methodIndex) {\n"
2063              "    __asm {\n"
2064              "        mov     edx,[that] // vtable in edx\n"
2065              "        mov     eax,methodIndex\n"
2066              "        call    [edx][eax*4] // stdcall\n"
2067              "    }\n"
2068              "}"));
2069   EXPECT_EQ("_asm {\n"
2070             "  xor eax, eax;\n"
2071             "  cpuid;\n"
2072             "}",
2073             format("_asm {\n"
2074                    "  xor eax, eax;\n"
2075                    "  cpuid;\n"
2076                    "}"));
2077   verifyFormat("void function() {\n"
2078                "  // comment\n"
2079                "  asm(\"\");\n"
2080                "}");
2081   EXPECT_EQ("__asm {\n"
2082             "}\n"
2083             "int i;",
2084             format("__asm   {\n"
2085                    "}\n"
2086                    "int   i;"));
2087 }
2088 
2089 TEST_F(FormatTest, FormatTryCatch) {
2090   verifyFormat("try {\n"
2091                "  throw a * b;\n"
2092                "} catch (int a) {\n"
2093                "  // Do nothing.\n"
2094                "} catch (...) {\n"
2095                "  exit(42);\n"
2096                "}");
2097 
2098   // Function-level try statements.
2099   verifyFormat("int f() try { return 4; } catch (...) {\n"
2100                "  return 5;\n"
2101                "}");
2102   verifyFormat("class A {\n"
2103                "  int a;\n"
2104                "  A() try : a(0) {\n"
2105                "  } catch (...) {\n"
2106                "    throw;\n"
2107                "  }\n"
2108                "};\n");
2109 
2110   // Incomplete try-catch blocks.
2111   verifyIncompleteFormat("try {} catch (");
2112 }
2113 
2114 TEST_F(FormatTest, FormatSEHTryCatch) {
2115   verifyFormat("__try {\n"
2116                "  int a = b * c;\n"
2117                "} __except (EXCEPTION_EXECUTE_HANDLER) {\n"
2118                "  // Do nothing.\n"
2119                "}");
2120 
2121   verifyFormat("__try {\n"
2122                "  int a = b * c;\n"
2123                "} __finally {\n"
2124                "  // Do nothing.\n"
2125                "}");
2126 
2127   verifyFormat("DEBUG({\n"
2128                "  __try {\n"
2129                "  } __finally {\n"
2130                "  }\n"
2131                "});\n");
2132 }
2133 
2134 TEST_F(FormatTest, IncompleteTryCatchBlocks) {
2135   verifyFormat("try {\n"
2136                "  f();\n"
2137                "} catch {\n"
2138                "  g();\n"
2139                "}");
2140   verifyFormat("try {\n"
2141                "  f();\n"
2142                "} catch (A a) MACRO(x) {\n"
2143                "  g();\n"
2144                "} catch (B b) MACRO(x) {\n"
2145                "  g();\n"
2146                "}");
2147 }
2148 
2149 TEST_F(FormatTest, FormatTryCatchBraceStyles) {
2150   FormatStyle Style = getLLVMStyle();
2151   for (auto BraceStyle : {FormatStyle::BS_Attach, FormatStyle::BS_Mozilla,
2152                           FormatStyle::BS_WebKit}) {
2153     Style.BreakBeforeBraces = BraceStyle;
2154     verifyFormat("try {\n"
2155                  "  // something\n"
2156                  "} catch (...) {\n"
2157                  "  // something\n"
2158                  "}",
2159                  Style);
2160   }
2161   Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
2162   verifyFormat("try {\n"
2163                "  // something\n"
2164                "}\n"
2165                "catch (...) {\n"
2166                "  // something\n"
2167                "}",
2168                Style);
2169   verifyFormat("__try {\n"
2170                "  // something\n"
2171                "}\n"
2172                "__finally {\n"
2173                "  // something\n"
2174                "}",
2175                Style);
2176   verifyFormat("@try {\n"
2177                "  // something\n"
2178                "}\n"
2179                "@finally {\n"
2180                "  // something\n"
2181                "}",
2182                Style);
2183   Style.BreakBeforeBraces = FormatStyle::BS_Allman;
2184   verifyFormat("try\n"
2185                "{\n"
2186                "  // something\n"
2187                "}\n"
2188                "catch (...)\n"
2189                "{\n"
2190                "  // something\n"
2191                "}",
2192                Style);
2193   Style.BreakBeforeBraces = FormatStyle::BS_GNU;
2194   verifyFormat("try\n"
2195                "  {\n"
2196                "    // something\n"
2197                "  }\n"
2198                "catch (...)\n"
2199                "  {\n"
2200                "    // something\n"
2201                "  }",
2202                Style);
2203   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
2204   Style.BraceWrapping.BeforeCatch = true;
2205   verifyFormat("try {\n"
2206                "  // something\n"
2207                "}\n"
2208                "catch (...) {\n"
2209                "  // something\n"
2210                "}",
2211                Style);
2212 }
2213 
2214 TEST_F(FormatTest, StaticInitializers) {
2215   verifyFormat("static SomeClass SC = {1, 'a'};");
2216 
2217   verifyFormat("static SomeClass WithALoooooooooooooooooooongName = {\n"
2218                "    100000000, "
2219                "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"};");
2220 
2221   // Here, everything other than the "}" would fit on a line.
2222   verifyFormat("static int LooooooooooooooooooooooooongVariable[1] = {\n"
2223                "    10000000000000000000000000};");
2224   EXPECT_EQ("S s = {a,\n"
2225             "\n"
2226             "       b};",
2227             format("S s = {\n"
2228                    "  a,\n"
2229                    "\n"
2230                    "  b\n"
2231                    "};"));
2232 
2233   // FIXME: This would fit into the column limit if we'd fit "{ {" on the first
2234   // line. However, the formatting looks a bit off and this probably doesn't
2235   // happen often in practice.
2236   verifyFormat("static int Variable[1] = {\n"
2237                "    {1000000000000000000000000000000000000}};",
2238                getLLVMStyleWithColumns(40));
2239 }
2240 
2241 TEST_F(FormatTest, DesignatedInitializers) {
2242   verifyFormat("const struct A a = {.a = 1, .b = 2};");
2243   verifyFormat("const struct A a = {.aaaaaaaaaa = 1,\n"
2244                "                    .bbbbbbbbbb = 2,\n"
2245                "                    .cccccccccc = 3,\n"
2246                "                    .dddddddddd = 4,\n"
2247                "                    .eeeeeeeeee = 5};");
2248   verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
2249                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaa = 1,\n"
2250                "    .bbbbbbbbbbbbbbbbbbbbbbbbbbb = 2,\n"
2251                "    .ccccccccccccccccccccccccccc = 3,\n"
2252                "    .ddddddddddddddddddddddddddd = 4,\n"
2253                "    .eeeeeeeeeeeeeeeeeeeeeeeeeee = 5};");
2254 
2255   verifyGoogleFormat("const struct A a = {.a = 1, .b = 2};");
2256 
2257   verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
2258   verifyFormat("const struct A a = {[1] = aaaaaaaaaa,\n"
2259                "                    [2] = bbbbbbbbbb,\n"
2260                "                    [3] = cccccccccc,\n"
2261                "                    [4] = dddddddddd,\n"
2262                "                    [5] = eeeeeeeeee};");
2263   verifyFormat("const struct Aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa = {\n"
2264                "    [1] = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
2265                "    [2] = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
2266                "    [3] = cccccccccccccccccccccccccccccccccccccc,\n"
2267                "    [4] = dddddddddddddddddddddddddddddddddddddd,\n"
2268                "    [5] = eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee};");
2269 }
2270 
2271 TEST_F(FormatTest, NestedStaticInitializers) {
2272   verifyFormat("static A x = {{{}}};\n");
2273   verifyFormat("static A x = {{{init1, init2, init3, init4},\n"
2274                "               {init1, init2, init3, init4}}};",
2275                getLLVMStyleWithColumns(50));
2276 
2277   verifyFormat("somes Status::global_reps[3] = {\n"
2278                "    {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
2279                "    {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
2280                "    {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};",
2281                getLLVMStyleWithColumns(60));
2282   verifyGoogleFormat("SomeType Status::global_reps[3] = {\n"
2283                      "    {kGlobalRef, OK_CODE, NULL, NULL, NULL},\n"
2284                      "    {kGlobalRef, CANCELLED_CODE, NULL, NULL, NULL},\n"
2285                      "    {kGlobalRef, UNKNOWN_CODE, NULL, NULL, NULL}};");
2286   verifyFormat("CGRect cg_rect = {{rect.fLeft, rect.fTop},\n"
2287                "                  {rect.fRight - rect.fLeft, rect.fBottom - "
2288                "rect.fTop}};");
2289 
2290   verifyFormat(
2291       "SomeArrayOfSomeType a = {\n"
2292       "    {{1, 2, 3},\n"
2293       "     {1, 2, 3},\n"
2294       "     {111111111111111111111111111111, 222222222222222222222222222222,\n"
2295       "      333333333333333333333333333333},\n"
2296       "     {1, 2, 3},\n"
2297       "     {1, 2, 3}}};");
2298   verifyFormat(
2299       "SomeArrayOfSomeType a = {\n"
2300       "    {{1, 2, 3}},\n"
2301       "    {{1, 2, 3}},\n"
2302       "    {{111111111111111111111111111111, 222222222222222222222222222222,\n"
2303       "      333333333333333333333333333333}},\n"
2304       "    {{1, 2, 3}},\n"
2305       "    {{1, 2, 3}}};");
2306 
2307   verifyFormat("struct {\n"
2308                "  unsigned bit;\n"
2309                "  const char *const name;\n"
2310                "} kBitsToOs[] = {{kOsMac, \"Mac\"},\n"
2311                "                 {kOsWin, \"Windows\"},\n"
2312                "                 {kOsLinux, \"Linux\"},\n"
2313                "                 {kOsCrOS, \"Chrome OS\"}};");
2314   verifyFormat("struct {\n"
2315                "  unsigned bit;\n"
2316                "  const char *const name;\n"
2317                "} kBitsToOs[] = {\n"
2318                "    {kOsMac, \"Mac\"},\n"
2319                "    {kOsWin, \"Windows\"},\n"
2320                "    {kOsLinux, \"Linux\"},\n"
2321                "    {kOsCrOS, \"Chrome OS\"},\n"
2322                "};");
2323 }
2324 
2325 TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) {
2326   verifyFormat("#define ALooooooooooooooooooooooooooooooooooooooongMacro("
2327                "                      \\\n"
2328                "    aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)");
2329 }
2330 
2331 TEST_F(FormatTest, DoesNotBreakPureVirtualFunctionDefinition) {
2332   verifyFormat("virtual void write(ELFWriter *writerrr,\n"
2333                "                   OwningPtr<FileOutputBuffer> &buffer) = 0;");
2334 
2335   // Do break defaulted and deleted functions.
2336   verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
2337                "    default;",
2338                getLLVMStyleWithColumns(40));
2339   verifyFormat("virtual void ~Deeeeeeeestructor() =\n"
2340                "    delete;",
2341                getLLVMStyleWithColumns(40));
2342 }
2343 
2344 TEST_F(FormatTest, BreaksStringLiteralsOnlyInDefine) {
2345   verifyFormat("# 1111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\" 2 3",
2346                getLLVMStyleWithColumns(40));
2347   verifyFormat("#line 11111 \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
2348                getLLVMStyleWithColumns(40));
2349   EXPECT_EQ("#define Q                              \\\n"
2350             "  \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/\"    \\\n"
2351             "  \"aaaaaaaa.cpp\"",
2352             format("#define Q \"/aaaaaaaaa/aaaaaaaaaaaaaaaaaaa/aaaaaaaa.cpp\"",
2353                    getLLVMStyleWithColumns(40)));
2354 }
2355 
2356 TEST_F(FormatTest, UnderstandsLinePPDirective) {
2357   EXPECT_EQ("# 123 \"A string literal\"",
2358             format("   #     123    \"A string literal\""));
2359 }
2360 
2361 TEST_F(FormatTest, LayoutUnknownPPDirective) {
2362   EXPECT_EQ("#;", format("#;"));
2363   verifyFormat("#\n;\n;\n;");
2364 }
2365 
2366 TEST_F(FormatTest, UnescapedEndOfLineEndsPPDirective) {
2367   EXPECT_EQ("#line 42 \"test\"\n",
2368             format("#  \\\n  line  \\\n  42  \\\n  \"test\"\n"));
2369   EXPECT_EQ("#define A B\n", format("#  \\\n define  \\\n    A  \\\n       B\n",
2370                                     getLLVMStyleWithColumns(12)));
2371 }
2372 
2373 TEST_F(FormatTest, EndOfFileEndsPPDirective) {
2374   EXPECT_EQ("#line 42 \"test\"",
2375             format("#  \\\n  line  \\\n  42  \\\n  \"test\""));
2376   EXPECT_EQ("#define A B", format("#  \\\n define  \\\n    A  \\\n       B"));
2377 }
2378 
2379 TEST_F(FormatTest, DoesntRemoveUnknownTokens) {
2380   verifyFormat("#define A \\x20");
2381   verifyFormat("#define A \\ x20");
2382   EXPECT_EQ("#define A \\ x20", format("#define A \\   x20"));
2383   verifyFormat("#define A ''");
2384   verifyFormat("#define A ''qqq");
2385   verifyFormat("#define A `qqq");
2386   verifyFormat("f(\"aaaa, bbbb, \"\\\"ccccc\\\"\");");
2387   EXPECT_EQ("const char *c = STRINGIFY(\n"
2388             "\\na : b);",
2389             format("const char * c = STRINGIFY(\n"
2390                    "\\na : b);"));
2391 
2392   verifyFormat("a\r\\");
2393   verifyFormat("a\v\\");
2394   verifyFormat("a\f\\");
2395 }
2396 
2397 TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) {
2398   verifyFormat("#define A(BB)", getLLVMStyleWithColumns(13));
2399   verifyFormat("#define A( \\\n    BB)", getLLVMStyleWithColumns(12));
2400   verifyFormat("#define A( \\\n    A, B)", getLLVMStyleWithColumns(12));
2401   // FIXME: We never break before the macro name.
2402   verifyFormat("#define AA( \\\n    B)", getLLVMStyleWithColumns(12));
2403 
2404   verifyFormat("#define A A\n#define A A");
2405   verifyFormat("#define A(X) A\n#define A A");
2406 
2407   verifyFormat("#define Something Other", getLLVMStyleWithColumns(23));
2408   verifyFormat("#define Something    \\\n  Other", getLLVMStyleWithColumns(22));
2409 }
2410 
2411 TEST_F(FormatTest, HandlePreprocessorDirectiveContext) {
2412   EXPECT_EQ("// somecomment\n"
2413             "#include \"a.h\"\n"
2414             "#define A(  \\\n"
2415             "    A, B)\n"
2416             "#include \"b.h\"\n"
2417             "// somecomment\n",
2418             format("  // somecomment\n"
2419                    "  #include \"a.h\"\n"
2420                    "#define A(A,\\\n"
2421                    "    B)\n"
2422                    "    #include \"b.h\"\n"
2423                    " // somecomment\n",
2424                    getLLVMStyleWithColumns(13)));
2425 }
2426 
2427 TEST_F(FormatTest, LayoutSingleHash) { EXPECT_EQ("#\na;", format("#\na;")); }
2428 
2429 TEST_F(FormatTest, LayoutCodeInMacroDefinitions) {
2430   EXPECT_EQ("#define A    \\\n"
2431             "  c;         \\\n"
2432             "  e;\n"
2433             "f;",
2434             format("#define A c; e;\n"
2435                    "f;",
2436                    getLLVMStyleWithColumns(14)));
2437 }
2438 
2439 TEST_F(FormatTest, LayoutRemainingTokens) { EXPECT_EQ("{}", format("{}")); }
2440 
2441 TEST_F(FormatTest, MacroDefinitionInsideStatement) {
2442   EXPECT_EQ("int x,\n"
2443             "#define A\n"
2444             "    y;",
2445             format("int x,\n#define A\ny;"));
2446 }
2447 
2448 TEST_F(FormatTest, HashInMacroDefinition) {
2449   EXPECT_EQ("#define A(c) L#c", format("#define A(c) L#c", getLLVMStyle()));
2450   verifyFormat("#define A \\\n  b #c;", getLLVMStyleWithColumns(11));
2451   verifyFormat("#define A  \\\n"
2452                "  {        \\\n"
2453                "    f(#c); \\\n"
2454                "  }",
2455                getLLVMStyleWithColumns(11));
2456 
2457   verifyFormat("#define A(X)         \\\n"
2458                "  void function##X()",
2459                getLLVMStyleWithColumns(22));
2460 
2461   verifyFormat("#define A(a, b, c)   \\\n"
2462                "  void a##b##c()",
2463                getLLVMStyleWithColumns(22));
2464 
2465   verifyFormat("#define A void # ## #", getLLVMStyleWithColumns(22));
2466 }
2467 
2468 TEST_F(FormatTest, RespectWhitespaceInMacroDefinitions) {
2469   EXPECT_EQ("#define A (x)", format("#define A (x)"));
2470   EXPECT_EQ("#define A(x)", format("#define A(x)"));
2471 
2472   FormatStyle Style = getLLVMStyle();
2473   Style.SpaceBeforeParens = FormatStyle::SBPO_Never;
2474   verifyFormat("#define true ((foo)1)", Style);
2475   Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
2476   verifyFormat("#define false((foo)0)", Style);
2477 }
2478 
2479 TEST_F(FormatTest, EmptyLinesInMacroDefinitions) {
2480   EXPECT_EQ("#define A b;", format("#define A \\\n"
2481                                    "          \\\n"
2482                                    "  b;",
2483                                    getLLVMStyleWithColumns(25)));
2484   EXPECT_EQ("#define A \\\n"
2485             "          \\\n"
2486             "  a;      \\\n"
2487             "  b;",
2488             format("#define A \\\n"
2489                    "          \\\n"
2490                    "  a;      \\\n"
2491                    "  b;",
2492                    getLLVMStyleWithColumns(11)));
2493   EXPECT_EQ("#define A \\\n"
2494             "  a;      \\\n"
2495             "          \\\n"
2496             "  b;",
2497             format("#define A \\\n"
2498                    "  a;      \\\n"
2499                    "          \\\n"
2500                    "  b;",
2501                    getLLVMStyleWithColumns(11)));
2502 }
2503 
2504 TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) {
2505   verifyIncompleteFormat("#define A :");
2506   verifyFormat("#define SOMECASES  \\\n"
2507                "  case 1:          \\\n"
2508                "  case 2\n",
2509                getLLVMStyleWithColumns(20));
2510   verifyFormat("#define MACRO(a) \\\n"
2511                "  if (a)         \\\n"
2512                "    f();         \\\n"
2513                "  else           \\\n"
2514                "    g()",
2515                getLLVMStyleWithColumns(18));
2516   verifyFormat("#define A template <typename T>");
2517   verifyIncompleteFormat("#define STR(x) #x\n"
2518                          "f(STR(this_is_a_string_literal{));");
2519   verifyFormat("#pragma omp threadprivate( \\\n"
2520                "    y)), // expected-warning",
2521                getLLVMStyleWithColumns(28));
2522   verifyFormat("#d, = };");
2523   verifyFormat("#if \"a");
2524   verifyIncompleteFormat("({\n"
2525                          "#define b     \\\n"
2526                          "  }           \\\n"
2527                          "  a\n"
2528                          "a",
2529                          getLLVMStyleWithColumns(15));
2530   verifyFormat("#define A     \\\n"
2531                "  {           \\\n"
2532                "    {\n"
2533                "#define B     \\\n"
2534                "  }           \\\n"
2535                "  }",
2536                getLLVMStyleWithColumns(15));
2537   verifyNoCrash("#if a\na(\n#else\n#endif\n{a");
2538   verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}");
2539   verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};");
2540   verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() {      \n)}");
2541 }
2542 
2543 TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) {
2544   verifyFormat("SOME_TYPE_NAME abc;"); // Gated on the newline.
2545   EXPECT_EQ("class A : public QObject {\n"
2546             "  Q_OBJECT\n"
2547             "\n"
2548             "  A() {}\n"
2549             "};",
2550             format("class A  :  public QObject {\n"
2551                    "     Q_OBJECT\n"
2552                    "\n"
2553                    "  A() {\n}\n"
2554                    "}  ;"));
2555   EXPECT_EQ("MACRO\n"
2556             "/*static*/ int i;",
2557             format("MACRO\n"
2558                    " /*static*/ int   i;"));
2559   EXPECT_EQ("SOME_MACRO\n"
2560             "namespace {\n"
2561             "void f();\n"
2562             "} // namespace",
2563             format("SOME_MACRO\n"
2564                    "  namespace    {\n"
2565                    "void   f(  );\n"
2566                    "} // namespace"));
2567   // Only if the identifier contains at least 5 characters.
2568   EXPECT_EQ("HTTP f();", format("HTTP\nf();"));
2569   EXPECT_EQ("MACRO\nf();", format("MACRO\nf();"));
2570   // Only if everything is upper case.
2571   EXPECT_EQ("class A : public QObject {\n"
2572             "  Q_Object A() {}\n"
2573             "};",
2574             format("class A  :  public QObject {\n"
2575                    "     Q_Object\n"
2576                    "  A() {\n}\n"
2577                    "}  ;"));
2578 
2579   // Only if the next line can actually start an unwrapped line.
2580   EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;",
2581             format("SOME_WEIRD_LOG_MACRO\n"
2582                    "<< SomeThing;"));
2583 
2584   verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), "
2585                "(n, buffers))\n",
2586                getChromiumStyle(FormatStyle::LK_Cpp));
2587 
2588   // See PR41483
2589   EXPECT_EQ("/**/ FOO(a)\n"
2590             "FOO(b)",
2591             format("/**/ FOO(a)\n"
2592                    "FOO(b)"));
2593 }
2594 
2595 TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) {
2596   EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
2597             "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
2598             "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
2599             "class X {};\n"
2600             "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
2601             "int *createScopDetectionPass() { return 0; }",
2602             format("  INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
2603                    "  INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
2604                    "  INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
2605                    "  class X {};\n"
2606                    "  INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
2607                    "  int *createScopDetectionPass() { return 0; }"));
2608   // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as
2609   // braces, so that inner block is indented one level more.
2610   EXPECT_EQ("int q() {\n"
2611             "  IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2612             "  IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2613             "  IPC_END_MESSAGE_MAP()\n"
2614             "}",
2615             format("int q() {\n"
2616                    "  IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2617                    "    IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2618                    "  IPC_END_MESSAGE_MAP()\n"
2619                    "}"));
2620 
2621   // Same inside macros.
2622   EXPECT_EQ("#define LIST(L) \\\n"
2623             "  L(A)          \\\n"
2624             "  L(B)          \\\n"
2625             "  L(C)",
2626             format("#define LIST(L) \\\n"
2627                    "  L(A) \\\n"
2628                    "  L(B) \\\n"
2629                    "  L(C)",
2630                    getGoogleStyle()));
2631 
2632   // These must not be recognized as macros.
2633   EXPECT_EQ("int q() {\n"
2634             "  f(x);\n"
2635             "  f(x) {}\n"
2636             "  f(x)->g();\n"
2637             "  f(x)->*g();\n"
2638             "  f(x).g();\n"
2639             "  f(x) = x;\n"
2640             "  f(x) += x;\n"
2641             "  f(x) -= x;\n"
2642             "  f(x) *= x;\n"
2643             "  f(x) /= x;\n"
2644             "  f(x) %= x;\n"
2645             "  f(x) &= x;\n"
2646             "  f(x) |= x;\n"
2647             "  f(x) ^= x;\n"
2648             "  f(x) >>= x;\n"
2649             "  f(x) <<= x;\n"
2650             "  f(x)[y].z();\n"
2651             "  LOG(INFO) << x;\n"
2652             "  ifstream(x) >> x;\n"
2653             "}\n",
2654             format("int q() {\n"
2655                    "  f(x)\n;\n"
2656                    "  f(x)\n {}\n"
2657                    "  f(x)\n->g();\n"
2658                    "  f(x)\n->*g();\n"
2659                    "  f(x)\n.g();\n"
2660                    "  f(x)\n = x;\n"
2661                    "  f(x)\n += x;\n"
2662                    "  f(x)\n -= x;\n"
2663                    "  f(x)\n *= x;\n"
2664                    "  f(x)\n /= x;\n"
2665                    "  f(x)\n %= x;\n"
2666                    "  f(x)\n &= x;\n"
2667                    "  f(x)\n |= x;\n"
2668                    "  f(x)\n ^= x;\n"
2669                    "  f(x)\n >>= x;\n"
2670                    "  f(x)\n <<= x;\n"
2671                    "  f(x)\n[y].z();\n"
2672                    "  LOG(INFO)\n << x;\n"
2673                    "  ifstream(x)\n >> x;\n"
2674                    "}\n"));
2675   EXPECT_EQ("int q() {\n"
2676             "  F(x)\n"
2677             "  if (1) {\n"
2678             "  }\n"
2679             "  F(x)\n"
2680             "  while (1) {\n"
2681             "  }\n"
2682             "  F(x)\n"
2683             "  G(x);\n"
2684             "  F(x)\n"
2685             "  try {\n"
2686             "    Q();\n"
2687             "  } catch (...) {\n"
2688             "  }\n"
2689             "}\n",
2690             format("int q() {\n"
2691                    "F(x)\n"
2692                    "if (1) {}\n"
2693                    "F(x)\n"
2694                    "while (1) {}\n"
2695                    "F(x)\n"
2696                    "G(x);\n"
2697                    "F(x)\n"
2698                    "try { Q(); } catch (...) {}\n"
2699                    "}\n"));
2700   EXPECT_EQ("class A {\n"
2701             "  A() : t(0) {}\n"
2702             "  A(int i) noexcept() : {}\n"
2703             "  A(X x)\n" // FIXME: function-level try blocks are broken.
2704             "  try : t(0) {\n"
2705             "  } catch (...) {\n"
2706             "  }\n"
2707             "};",
2708             format("class A {\n"
2709                    "  A()\n : t(0) {}\n"
2710                    "  A(int i)\n noexcept() : {}\n"
2711                    "  A(X x)\n"
2712                    "  try : t(0) {} catch (...) {}\n"
2713                    "};"));
2714   FormatStyle Style = getLLVMStyle();
2715   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
2716   Style.BraceWrapping.AfterControlStatement = true;
2717   Style.BraceWrapping.AfterFunction = true;
2718   EXPECT_EQ("void f()\n"
2719             "try\n"
2720             "{\n"
2721             "}",
2722             format("void f() try {\n"
2723                    "}", Style));
2724   EXPECT_EQ("class SomeClass {\n"
2725             "public:\n"
2726             "  SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2727             "};",
2728             format("class SomeClass {\n"
2729                    "public:\n"
2730                    "  SomeClass()\n"
2731                    "  EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2732                    "};"));
2733   EXPECT_EQ("class SomeClass {\n"
2734             "public:\n"
2735             "  SomeClass()\n"
2736             "      EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2737             "};",
2738             format("class SomeClass {\n"
2739                    "public:\n"
2740                    "  SomeClass()\n"
2741                    "  EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2742                    "};",
2743                    getLLVMStyleWithColumns(40)));
2744 
2745   verifyFormat("MACRO(>)");
2746 
2747   // Some macros contain an implicit semicolon.
2748   Style = getLLVMStyle();
2749   Style.StatementMacros.push_back("FOO");
2750   verifyFormat("FOO(a) int b = 0;");
2751   verifyFormat("FOO(a)\n"
2752                "int b = 0;",
2753                Style);
2754   verifyFormat("FOO(a);\n"
2755                "int b = 0;",
2756                Style);
2757   verifyFormat("FOO(argc, argv, \"4.0.2\")\n"
2758                "int b = 0;",
2759                Style);
2760   verifyFormat("FOO()\n"
2761                "int b = 0;",
2762                Style);
2763   verifyFormat("FOO\n"
2764                "int b = 0;",
2765                Style);
2766   verifyFormat("void f() {\n"
2767                "  FOO(a)\n"
2768                "  return a;\n"
2769                "}",
2770                Style);
2771   verifyFormat("FOO(a)\n"
2772                "FOO(b)",
2773                Style);
2774   verifyFormat("int a = 0;\n"
2775                "FOO(b)\n"
2776                "int c = 0;",
2777                Style);
2778   verifyFormat("int a = 0;\n"
2779                "int x = FOO(a)\n"
2780                "int b = 0;",
2781                Style);
2782   verifyFormat("void foo(int a) { FOO(a) }\n"
2783                "uint32_t bar() {}",
2784                Style);
2785 }
2786 
2787 TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) {
2788   verifyFormat("#define A \\\n"
2789                "  f({     \\\n"
2790                "    g();  \\\n"
2791                "  });",
2792                getLLVMStyleWithColumns(11));
2793 }
2794 
2795 TEST_F(FormatTest, IndentPreprocessorDirectives) {
2796   FormatStyle Style = getLLVMStyle();
2797   Style.IndentPPDirectives = FormatStyle::PPDIS_None;
2798   Style.ColumnLimit = 40;
2799   verifyFormat("#ifdef _WIN32\n"
2800                "#define A 0\n"
2801                "#ifdef VAR2\n"
2802                "#define B 1\n"
2803                "#include <someheader.h>\n"
2804                "#define MACRO                          \\\n"
2805                "  some_very_long_func_aaaaaaaaaa();\n"
2806                "#endif\n"
2807                "#else\n"
2808                "#define A 1\n"
2809                "#endif",
2810                Style);
2811   Style.IndentPPDirectives = FormatStyle::PPDIS_AfterHash;
2812   verifyFormat("#ifdef _WIN32\n"
2813                "#  define A 0\n"
2814                "#  ifdef VAR2\n"
2815                "#    define B 1\n"
2816                "#    include <someheader.h>\n"
2817                "#    define MACRO                      \\\n"
2818                "      some_very_long_func_aaaaaaaaaa();\n"
2819                "#  endif\n"
2820                "#else\n"
2821                "#  define A 1\n"
2822                "#endif",
2823                Style);
2824   verifyFormat("#if A\n"
2825                "#  define MACRO                        \\\n"
2826                "    void a(int x) {                    \\\n"
2827                "      b();                             \\\n"
2828                "      c();                             \\\n"
2829                "      d();                             \\\n"
2830                "      e();                             \\\n"
2831                "      f();                             \\\n"
2832                "    }\n"
2833                "#endif",
2834                Style);
2835   // Comments before include guard.
2836   verifyFormat("// file comment\n"
2837                "// file comment\n"
2838                "#ifndef HEADER_H\n"
2839                "#define HEADER_H\n"
2840                "code();\n"
2841                "#endif",
2842                Style);
2843   // Test with include guards.
2844   verifyFormat("#ifndef HEADER_H\n"
2845                "#define HEADER_H\n"
2846                "code();\n"
2847                "#endif",
2848                Style);
2849   // Include guards must have a #define with the same variable immediately
2850   // after #ifndef.
2851   verifyFormat("#ifndef NOT_GUARD\n"
2852                "#  define FOO\n"
2853                "code();\n"
2854                "#endif",
2855                Style);
2856 
2857   // Include guards must cover the entire file.
2858   verifyFormat("code();\n"
2859                "code();\n"
2860                "#ifndef NOT_GUARD\n"
2861                "#  define NOT_GUARD\n"
2862                "code();\n"
2863                "#endif",
2864                Style);
2865   verifyFormat("#ifndef NOT_GUARD\n"
2866                "#  define NOT_GUARD\n"
2867                "code();\n"
2868                "#endif\n"
2869                "code();",
2870                Style);
2871   // Test with trailing blank lines.
2872   verifyFormat("#ifndef HEADER_H\n"
2873                "#define HEADER_H\n"
2874                "code();\n"
2875                "#endif\n",
2876                Style);
2877   // Include guards don't have #else.
2878   verifyFormat("#ifndef NOT_GUARD\n"
2879                "#  define NOT_GUARD\n"
2880                "code();\n"
2881                "#else\n"
2882                "#endif",
2883                Style);
2884   verifyFormat("#ifndef NOT_GUARD\n"
2885                "#  define NOT_GUARD\n"
2886                "code();\n"
2887                "#elif FOO\n"
2888                "#endif",
2889                Style);
2890   // Non-identifier #define after potential include guard.
2891   verifyFormat("#ifndef FOO\n"
2892                "#  define 1\n"
2893                "#endif\n",
2894                Style);
2895   // #if closes past last non-preprocessor line.
2896   verifyFormat("#ifndef FOO\n"
2897                "#define FOO\n"
2898                "#if 1\n"
2899                "int i;\n"
2900                "#  define A 0\n"
2901                "#endif\n"
2902                "#endif\n",
2903                Style);
2904   // FIXME: This doesn't handle the case where there's code between the
2905   // #ifndef and #define but all other conditions hold. This is because when
2906   // the #define line is parsed, UnwrappedLineParser::Lines doesn't hold the
2907   // previous code line yet, so we can't detect it.
2908   EXPECT_EQ("#ifndef NOT_GUARD\n"
2909             "code();\n"
2910             "#define NOT_GUARD\n"
2911             "code();\n"
2912             "#endif",
2913             format("#ifndef NOT_GUARD\n"
2914                    "code();\n"
2915                    "#  define NOT_GUARD\n"
2916                    "code();\n"
2917                    "#endif",
2918                    Style));
2919   // FIXME: This doesn't handle cases where legitimate preprocessor lines may
2920   // be outside an include guard. Examples are #pragma once and
2921   // #pragma GCC diagnostic, or anything else that does not change the meaning
2922   // of the file if it's included multiple times.
2923   EXPECT_EQ("#ifdef WIN32\n"
2924             "#  pragma once\n"
2925             "#endif\n"
2926             "#ifndef HEADER_H\n"
2927             "#  define HEADER_H\n"
2928             "code();\n"
2929             "#endif",
2930             format("#ifdef WIN32\n"
2931                    "#  pragma once\n"
2932                    "#endif\n"
2933                    "#ifndef HEADER_H\n"
2934                    "#define HEADER_H\n"
2935                    "code();\n"
2936                    "#endif",
2937                    Style));
2938   // FIXME: This does not detect when there is a single non-preprocessor line
2939   // in front of an include-guard-like structure where other conditions hold
2940   // because ScopedLineState hides the line.
2941   EXPECT_EQ("code();\n"
2942             "#ifndef HEADER_H\n"
2943             "#define HEADER_H\n"
2944             "code();\n"
2945             "#endif",
2946             format("code();\n"
2947                    "#ifndef HEADER_H\n"
2948                    "#  define HEADER_H\n"
2949                    "code();\n"
2950                    "#endif",
2951                    Style));
2952   // Keep comments aligned with #, otherwise indent comments normally. These
2953   // tests cannot use verifyFormat because messUp manipulates leading
2954   // whitespace.
2955   {
2956     const char *Expected = ""
2957                            "void f() {\n"
2958                            "#if 1\n"
2959                            "// Preprocessor aligned.\n"
2960                            "#  define A 0\n"
2961                            "  // Code. Separated by blank line.\n"
2962                            "\n"
2963                            "#  define B 0\n"
2964                            "  // Code. Not aligned with #\n"
2965                            "#  define C 0\n"
2966                            "#endif";
2967     const char *ToFormat = ""
2968                            "void f() {\n"
2969                            "#if 1\n"
2970                            "// Preprocessor aligned.\n"
2971                            "#  define A 0\n"
2972                            "// Code. Separated by blank line.\n"
2973                            "\n"
2974                            "#  define B 0\n"
2975                            "   // Code. Not aligned with #\n"
2976                            "#  define C 0\n"
2977                            "#endif";
2978     EXPECT_EQ(Expected, format(ToFormat, Style));
2979     EXPECT_EQ(Expected, format(Expected, Style));
2980   }
2981   // Keep block quotes aligned.
2982   {
2983     const char *Expected = ""
2984                            "void f() {\n"
2985                            "#if 1\n"
2986                            "/* Preprocessor aligned. */\n"
2987                            "#  define A 0\n"
2988                            "  /* Code. Separated by blank line. */\n"
2989                            "\n"
2990                            "#  define B 0\n"
2991                            "  /* Code. Not aligned with # */\n"
2992                            "#  define C 0\n"
2993                            "#endif";
2994     const char *ToFormat = ""
2995                            "void f() {\n"
2996                            "#if 1\n"
2997                            "/* Preprocessor aligned. */\n"
2998                            "#  define A 0\n"
2999                            "/* Code. Separated by blank line. */\n"
3000                            "\n"
3001                            "#  define B 0\n"
3002                            "   /* Code. Not aligned with # */\n"
3003                            "#  define C 0\n"
3004                            "#endif";
3005     EXPECT_EQ(Expected, format(ToFormat, Style));
3006     EXPECT_EQ(Expected, format(Expected, Style));
3007   }
3008   // Keep comments aligned with un-indented directives.
3009   {
3010     const char *Expected = ""
3011                            "void f() {\n"
3012                            "// Preprocessor aligned.\n"
3013                            "#define A 0\n"
3014                            "  // Code. Separated by blank line.\n"
3015                            "\n"
3016                            "#define B 0\n"
3017                            "  // Code. Not aligned with #\n"
3018                            "#define C 0\n";
3019     const char *ToFormat = ""
3020                            "void f() {\n"
3021                            "// Preprocessor aligned.\n"
3022                            "#define A 0\n"
3023                            "// Code. Separated by blank line.\n"
3024                            "\n"
3025                            "#define B 0\n"
3026                            "   // Code. Not aligned with #\n"
3027                            "#define C 0\n";
3028     EXPECT_EQ(Expected, format(ToFormat, Style));
3029     EXPECT_EQ(Expected, format(Expected, Style));
3030   }
3031   // Test AfterHash with tabs.
3032   {
3033     FormatStyle Tabbed = Style;
3034     Tabbed.UseTab = FormatStyle::UT_Always;
3035     Tabbed.IndentWidth = 8;
3036     Tabbed.TabWidth = 8;
3037     verifyFormat("#ifdef _WIN32\n"
3038                  "#\tdefine A 0\n"
3039                  "#\tifdef VAR2\n"
3040                  "#\t\tdefine B 1\n"
3041                  "#\t\tinclude <someheader.h>\n"
3042                  "#\t\tdefine MACRO          \\\n"
3043                  "\t\t\tsome_very_long_func_aaaaaaaaaa();\n"
3044                  "#\tendif\n"
3045                  "#else\n"
3046                  "#\tdefine A 1\n"
3047                  "#endif",
3048                  Tabbed);
3049   }
3050 
3051   // Regression test: Multiline-macro inside include guards.
3052   verifyFormat("#ifndef HEADER_H\n"
3053                "#define HEADER_H\n"
3054                "#define A()        \\\n"
3055                "  int i;           \\\n"
3056                "  int j;\n"
3057                "#endif // HEADER_H",
3058                getLLVMStyleWithColumns(20));
3059 
3060   Style.IndentPPDirectives = FormatStyle::PPDIS_BeforeHash;
3061   // Basic before hash indent tests
3062   verifyFormat("#ifdef _WIN32\n"
3063                "  #define A 0\n"
3064                "  #ifdef VAR2\n"
3065                "    #define B 1\n"
3066                "    #include <someheader.h>\n"
3067                "    #define MACRO                      \\\n"
3068                "      some_very_long_func_aaaaaaaaaa();\n"
3069                "  #endif\n"
3070                "#else\n"
3071                "  #define A 1\n"
3072                "#endif",
3073                Style);
3074   verifyFormat("#if A\n"
3075                "  #define MACRO                        \\\n"
3076                "    void a(int x) {                    \\\n"
3077                "      b();                             \\\n"
3078                "      c();                             \\\n"
3079                "      d();                             \\\n"
3080                "      e();                             \\\n"
3081                "      f();                             \\\n"
3082                "    }\n"
3083                "#endif",
3084                Style);
3085   // Keep comments aligned with indented directives. These
3086   // tests cannot use verifyFormat because messUp manipulates leading
3087   // whitespace.
3088   {
3089     const char *Expected = "void f() {\n"
3090                            "// Aligned to preprocessor.\n"
3091                            "#if 1\n"
3092                            "  // Aligned to code.\n"
3093                            "  int a;\n"
3094                            "  #if 1\n"
3095                            "    // Aligned to preprocessor.\n"
3096                            "    #define A 0\n"
3097                            "  // Aligned to code.\n"
3098                            "  int b;\n"
3099                            "  #endif\n"
3100                            "#endif\n"
3101                            "}";
3102     const char *ToFormat = "void f() {\n"
3103                            "// Aligned to preprocessor.\n"
3104                            "#if 1\n"
3105                            "// Aligned to code.\n"
3106                            "int a;\n"
3107                            "#if 1\n"
3108                            "// Aligned to preprocessor.\n"
3109                            "#define A 0\n"
3110                            "// Aligned to code.\n"
3111                            "int b;\n"
3112                            "#endif\n"
3113                            "#endif\n"
3114                            "}";
3115     EXPECT_EQ(Expected, format(ToFormat, Style));
3116     EXPECT_EQ(Expected, format(Expected, Style));
3117   }
3118   {
3119     const char *Expected = "void f() {\n"
3120                            "/* Aligned to preprocessor. */\n"
3121                            "#if 1\n"
3122                            "  /* Aligned to code. */\n"
3123                            "  int a;\n"
3124                            "  #if 1\n"
3125                            "    /* Aligned to preprocessor. */\n"
3126                            "    #define A 0\n"
3127                            "  /* Aligned to code. */\n"
3128                            "  int b;\n"
3129                            "  #endif\n"
3130                            "#endif\n"
3131                            "}";
3132     const char *ToFormat = "void f() {\n"
3133                            "/* Aligned to preprocessor. */\n"
3134                            "#if 1\n"
3135                            "/* Aligned to code. */\n"
3136                            "int a;\n"
3137                            "#if 1\n"
3138                            "/* Aligned to preprocessor. */\n"
3139                            "#define A 0\n"
3140                            "/* Aligned to code. */\n"
3141                            "int b;\n"
3142                            "#endif\n"
3143                            "#endif\n"
3144                            "}";
3145     EXPECT_EQ(Expected, format(ToFormat, Style));
3146     EXPECT_EQ(Expected, format(Expected, Style));
3147   }
3148 
3149   // Test single comment before preprocessor
3150   verifyFormat("// Comment\n"
3151                "\n"
3152                "#if 1\n"
3153                "#endif",
3154                Style);
3155 }
3156 
3157 TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) {
3158   verifyFormat("{\n  { a #c; }\n}");
3159 }
3160 
3161 TEST_F(FormatTest, FormatUnbalancedStructuralElements) {
3162   EXPECT_EQ("#define A \\\n  {       \\\n    {\nint i;",
3163             format("#define A { {\nint i;", getLLVMStyleWithColumns(11)));
3164   EXPECT_EQ("#define A \\\n  }       \\\n  }\nint i;",
3165             format("#define A } }\nint i;", getLLVMStyleWithColumns(11)));
3166 }
3167 
3168 TEST_F(FormatTest, EscapedNewlines) {
3169   FormatStyle Narrow = getLLVMStyleWithColumns(11);
3170   EXPECT_EQ("#define A \\\n  int i;  \\\n  int j;",
3171             format("#define A \\\nint i;\\\n  int j;", Narrow));
3172   EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;"));
3173   EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
3174   EXPECT_EQ("/* \\  \\  \\\n */", format("\\\n/* \\  \\  \\\n */"));
3175   EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>"));
3176 
3177   FormatStyle AlignLeft = getLLVMStyle();
3178   AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
3179   EXPECT_EQ("#define MACRO(x) \\\n"
3180             "private:         \\\n"
3181             "  int x(int a);\n",
3182             format("#define MACRO(x) \\\n"
3183                    "private:         \\\n"
3184                    "  int x(int a);\n",
3185                    AlignLeft));
3186 
3187   // CRLF line endings
3188   EXPECT_EQ("#define A \\\r\n  int i;  \\\r\n  int j;",
3189             format("#define A \\\r\nint i;\\\r\n  int j;", Narrow));
3190   EXPECT_EQ("#define A\r\n\r\nint i;", format("#define A \\\r\n\r\n int i;"));
3191   EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
3192   EXPECT_EQ("/* \\  \\  \\\r\n */", format("\\\r\n/* \\  \\  \\\r\n */"));
3193   EXPECT_EQ("<a\r\n\\\\\r\n>", format("<a\r\n\\\\\r\n>"));
3194   EXPECT_EQ("#define MACRO(x) \\\r\n"
3195             "private:         \\\r\n"
3196             "  int x(int a);\r\n",
3197             format("#define MACRO(x) \\\r\n"
3198                    "private:         \\\r\n"
3199                    "  int x(int a);\r\n",
3200                    AlignLeft));
3201 
3202   FormatStyle DontAlign = getLLVMStyle();
3203   DontAlign.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
3204   DontAlign.MaxEmptyLinesToKeep = 3;
3205   // FIXME: can't use verifyFormat here because the newline before
3206   // "public:" is not inserted the first time it's reformatted
3207   EXPECT_EQ("#define A \\\n"
3208             "  class Foo { \\\n"
3209             "    void bar(); \\\n"
3210             "\\\n"
3211             "\\\n"
3212             "\\\n"
3213             "  public: \\\n"
3214             "    void baz(); \\\n"
3215             "  };",
3216             format("#define A \\\n"
3217                    "  class Foo { \\\n"
3218                    "    void bar(); \\\n"
3219                    "\\\n"
3220                    "\\\n"
3221                    "\\\n"
3222                    "  public: \\\n"
3223                    "    void baz(); \\\n"
3224                    "  };",
3225                    DontAlign));
3226 }
3227 
3228 TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) {
3229   verifyFormat("#define A \\\n"
3230                "  int v(  \\\n"
3231                "      a); \\\n"
3232                "  int i;",
3233                getLLVMStyleWithColumns(11));
3234 }
3235 
3236 TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) {
3237   EXPECT_EQ(
3238       "#define ALooooooooooooooooooooooooooooooooooooooongMacro("
3239       "                      \\\n"
3240       "    aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
3241       "\n"
3242       "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
3243       "    aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n",
3244       format("  #define   ALooooooooooooooooooooooooooooooooooooooongMacro("
3245              "\\\n"
3246              "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
3247              "  \n"
3248              "   AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
3249              "  aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n"));
3250 }
3251 
3252 TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) {
3253   EXPECT_EQ("int\n"
3254             "#define A\n"
3255             "    a;",
3256             format("int\n#define A\na;"));
3257   verifyFormat("functionCallTo(\n"
3258                "    someOtherFunction(\n"
3259                "        withSomeParameters, whichInSequence,\n"
3260                "        areLongerThanALine(andAnotherCall,\n"
3261                "#define A B\n"
3262                "                           withMoreParamters,\n"
3263                "                           whichStronglyInfluenceTheLayout),\n"
3264                "        andMoreParameters),\n"
3265                "    trailing);",
3266                getLLVMStyleWithColumns(69));
3267   verifyFormat("Foo::Foo()\n"
3268                "#ifdef BAR\n"
3269                "    : baz(0)\n"
3270                "#endif\n"
3271                "{\n"
3272                "}");
3273   verifyFormat("void f() {\n"
3274                "  if (true)\n"
3275                "#ifdef A\n"
3276                "    f(42);\n"
3277                "  x();\n"
3278                "#else\n"
3279                "    g();\n"
3280                "  x();\n"
3281                "#endif\n"
3282                "}");
3283   verifyFormat("void f(param1, param2,\n"
3284                "       param3,\n"
3285                "#ifdef A\n"
3286                "       param4(param5,\n"
3287                "#ifdef A1\n"
3288                "              param6,\n"
3289                "#ifdef A2\n"
3290                "              param7),\n"
3291                "#else\n"
3292                "              param8),\n"
3293                "       param9,\n"
3294                "#endif\n"
3295                "       param10,\n"
3296                "#endif\n"
3297                "       param11)\n"
3298                "#else\n"
3299                "       param12)\n"
3300                "#endif\n"
3301                "{\n"
3302                "  x();\n"
3303                "}",
3304                getLLVMStyleWithColumns(28));
3305   verifyFormat("#if 1\n"
3306                "int i;");
3307   verifyFormat("#if 1\n"
3308                "#endif\n"
3309                "#if 1\n"
3310                "#else\n"
3311                "#endif\n");
3312   verifyFormat("DEBUG({\n"
3313                "  return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3314                "         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
3315                "});\n"
3316                "#if a\n"
3317                "#else\n"
3318                "#endif");
3319 
3320   verifyIncompleteFormat("void f(\n"
3321                          "#if A\n"
3322                          ");\n"
3323                          "#else\n"
3324                          "#endif");
3325 }
3326 
3327 TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) {
3328   verifyFormat("#endif\n"
3329                "#if B");
3330 }
3331 
3332 TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) {
3333   FormatStyle SingleLine = getLLVMStyle();
3334   SingleLine.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_WithoutElse;
3335   verifyFormat("#if 0\n"
3336                "#elif 1\n"
3337                "#endif\n"
3338                "void foo() {\n"
3339                "  if (test) foo2();\n"
3340                "}",
3341                SingleLine);
3342 }
3343 
3344 TEST_F(FormatTest, LayoutBlockInsideParens) {
3345   verifyFormat("functionCall({ int i; });");
3346   verifyFormat("functionCall({\n"
3347                "  int i;\n"
3348                "  int j;\n"
3349                "});");
3350   verifyFormat("functionCall(\n"
3351                "    {\n"
3352                "      int i;\n"
3353                "      int j;\n"
3354                "    },\n"
3355                "    aaaa, bbbb, cccc);");
3356   verifyFormat("functionA(functionB({\n"
3357                "            int i;\n"
3358                "            int j;\n"
3359                "          }),\n"
3360                "          aaaa, bbbb, cccc);");
3361   verifyFormat("functionCall(\n"
3362                "    {\n"
3363                "      int i;\n"
3364                "      int j;\n"
3365                "    },\n"
3366                "    aaaa, bbbb, // comment\n"
3367                "    cccc);");
3368   verifyFormat("functionA(functionB({\n"
3369                "            int i;\n"
3370                "            int j;\n"
3371                "          }),\n"
3372                "          aaaa, bbbb, // comment\n"
3373                "          cccc);");
3374   verifyFormat("functionCall(aaaa, bbbb, { int i; });");
3375   verifyFormat("functionCall(aaaa, bbbb, {\n"
3376                "  int i;\n"
3377                "  int j;\n"
3378                "});");
3379   verifyFormat(
3380       "Aaa(\n" // FIXME: There shouldn't be a linebreak here.
3381       "    {\n"
3382       "      int i; // break\n"
3383       "    },\n"
3384       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
3385       "                                     ccccccccccccccccc));");
3386   verifyFormat("DEBUG({\n"
3387                "  if (a)\n"
3388                "    f();\n"
3389                "});");
3390 }
3391 
3392 TEST_F(FormatTest, LayoutBlockInsideStatement) {
3393   EXPECT_EQ("SOME_MACRO { int i; }\n"
3394             "int i;",
3395             format("  SOME_MACRO  {int i;}  int i;"));
3396 }
3397 
3398 TEST_F(FormatTest, LayoutNestedBlocks) {
3399   verifyFormat("void AddOsStrings(unsigned bitmask) {\n"
3400                "  struct s {\n"
3401                "    int i;\n"
3402                "  };\n"
3403                "  s kBitsToOs[] = {{10}};\n"
3404                "  for (int i = 0; i < 10; ++i)\n"
3405                "    return;\n"
3406                "}");
3407   verifyFormat("call(parameter, {\n"
3408                "  something();\n"
3409                "  // Comment using all columns.\n"
3410                "  somethingelse();\n"
3411                "});",
3412                getLLVMStyleWithColumns(40));
3413   verifyFormat("DEBUG( //\n"
3414                "    { f(); }, a);");
3415   verifyFormat("DEBUG( //\n"
3416                "    {\n"
3417                "      f(); //\n"
3418                "    },\n"
3419                "    a);");
3420 
3421   EXPECT_EQ("call(parameter, {\n"
3422             "  something();\n"
3423             "  // Comment too\n"
3424             "  // looooooooooong.\n"
3425             "  somethingElse();\n"
3426             "});",
3427             format("call(parameter, {\n"
3428                    "  something();\n"
3429                    "  // Comment too looooooooooong.\n"
3430                    "  somethingElse();\n"
3431                    "});",
3432                    getLLVMStyleWithColumns(29)));
3433   EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int   i; });"));
3434   EXPECT_EQ("DEBUG({ // comment\n"
3435             "  int i;\n"
3436             "});",
3437             format("DEBUG({ // comment\n"
3438                    "int  i;\n"
3439                    "});"));
3440   EXPECT_EQ("DEBUG({\n"
3441             "  int i;\n"
3442             "\n"
3443             "  // comment\n"
3444             "  int j;\n"
3445             "});",
3446             format("DEBUG({\n"
3447                    "  int  i;\n"
3448                    "\n"
3449                    "  // comment\n"
3450                    "  int  j;\n"
3451                    "});"));
3452 
3453   verifyFormat("DEBUG({\n"
3454                "  if (a)\n"
3455                "    return;\n"
3456                "});");
3457   verifyGoogleFormat("DEBUG({\n"
3458                      "  if (a) return;\n"
3459                      "});");
3460   FormatStyle Style = getGoogleStyle();
3461   Style.ColumnLimit = 45;
3462   verifyFormat("Debug(\n"
3463                "    aaaaa,\n"
3464                "    {\n"
3465                "      if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n"
3466                "    },\n"
3467                "    a);",
3468                Style);
3469 
3470   verifyFormat("SomeFunction({MACRO({ return output; }), b});");
3471 
3472   verifyNoCrash("^{v^{a}}");
3473 }
3474 
3475 TEST_F(FormatTest, FormatNestedBlocksInMacros) {
3476   EXPECT_EQ("#define MACRO()                     \\\n"
3477             "  Debug(aaa, /* force line break */ \\\n"
3478             "        {                           \\\n"
3479             "          int i;                    \\\n"
3480             "          int j;                    \\\n"
3481             "        })",
3482             format("#define   MACRO()   Debug(aaa,  /* force line break */ \\\n"
3483                    "          {  int   i;  int  j;   })",
3484                    getGoogleStyle()));
3485 
3486   EXPECT_EQ("#define A                                       \\\n"
3487             "  [] {                                          \\\n"
3488             "    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx(        \\\n"
3489             "        xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n"
3490             "  }",
3491             format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3492                    "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }",
3493                    getGoogleStyle()));
3494 }
3495 
3496 TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) {
3497   EXPECT_EQ("{}", format("{}"));
3498   verifyFormat("enum E {};");
3499   verifyFormat("enum E {}");
3500 }
3501 
3502 TEST_F(FormatTest, FormatBeginBlockEndMacros) {
3503   FormatStyle Style = getLLVMStyle();
3504   Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$";
3505   Style.MacroBlockEnd = "^[A-Z_]+_END$";
3506   verifyFormat("FOO_BEGIN\n"
3507                "  FOO_ENTRY\n"
3508                "FOO_END", Style);
3509   verifyFormat("FOO_BEGIN\n"
3510                "  NESTED_FOO_BEGIN\n"
3511                "    NESTED_FOO_ENTRY\n"
3512                "  NESTED_FOO_END\n"
3513                "FOO_END", Style);
3514   verifyFormat("FOO_BEGIN(Foo, Bar)\n"
3515                "  int x;\n"
3516                "  x = 1;\n"
3517                "FOO_END(Baz)", Style);
3518 }
3519 
3520 //===----------------------------------------------------------------------===//
3521 // Line break tests.
3522 //===----------------------------------------------------------------------===//
3523 
3524 TEST_F(FormatTest, PreventConfusingIndents) {
3525   verifyFormat(
3526       "void f() {\n"
3527       "  SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
3528       "                         parameter, parameter, parameter)),\n"
3529       "                     SecondLongCall(parameter));\n"
3530       "}");
3531   verifyFormat(
3532       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3533       "    aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3534       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3535       "    aaaaaaaaaaaaaaaaaaaaaaaa);");
3536   verifyFormat(
3537       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3538       "    [aaaaaaaaaaaaaaaaaaaaaaaa\n"
3539       "         [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
3540       "         [aaaaaaaaaaaaaaaaaaaaaaaa]];");
3541   verifyFormat(
3542       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
3543       "    aaaaaaaaaaaaaaaaaaaaaaaa<\n"
3544       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n"
3545       "    aaaaaaaaaaaaaaaaaaaaaaaa>;");
3546   verifyFormat("int a = bbbb && ccc &&\n"
3547                "        fffff(\n"
3548                "#define A Just forcing a new line\n"
3549                "            ddd);");
3550 }
3551 
3552 TEST_F(FormatTest, LineBreakingInBinaryExpressions) {
3553   verifyFormat(
3554       "bool aaaaaaa =\n"
3555       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n"
3556       "    bbbbbbbb();");
3557   verifyFormat(
3558       "bool aaaaaaa =\n"
3559       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n"
3560       "    bbbbbbbb();");
3561 
3562   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3563                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n"
3564                "    ccccccccc == ddddddddddd;");
3565   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3566                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n"
3567                "    ccccccccc == ddddddddddd;");
3568   verifyFormat(
3569       "bool aaaaaaaaaaaaaaaaaaaaa =\n"
3570       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n"
3571       "    ccccccccc == ddddddddddd;");
3572 
3573   verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3574                "                 aaaaaa) &&\n"
3575                "         bbbbbb && cccccc;");
3576   verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3577                "                 aaaaaa) >>\n"
3578                "         bbbbbb;");
3579   verifyFormat("aa = Whitespaces.addUntouchableComment(\n"
3580                "    SourceMgr.getSpellingColumnNumber(\n"
3581                "        TheLine.Last->FormatTok.Tok.getLocation()) -\n"
3582                "    1);");
3583 
3584   verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3585                "     bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n"
3586                "    cccccc) {\n}");
3587   verifyFormat("if constexpr ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3588                "               bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n"
3589                "              cccccc) {\n}");
3590   verifyFormat("b = a &&\n"
3591                "    // Comment\n"
3592                "    b.c && d;");
3593 
3594   // If the LHS of a comparison is not a binary expression itself, the
3595   // additional linebreak confuses many people.
3596   verifyFormat(
3597       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3598       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n"
3599       "}");
3600   verifyFormat(
3601       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3602       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3603       "}");
3604   verifyFormat(
3605       "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n"
3606       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3607       "}");
3608   verifyFormat(
3609       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3610       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) <=> 5) {\n"
3611       "}");
3612   // Even explicit parentheses stress the precedence enough to make the
3613   // additional break unnecessary.
3614   verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3615                "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3616                "}");
3617   // This cases is borderline, but with the indentation it is still readable.
3618   verifyFormat(
3619       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3620       "        aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3621       "                               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
3622       "}",
3623       getLLVMStyleWithColumns(75));
3624 
3625   // If the LHS is a binary expression, we should still use the additional break
3626   // as otherwise the formatting hides the operator precedence.
3627   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3628                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3629                "    5) {\n"
3630                "}");
3631   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3632                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa <=>\n"
3633                "    5) {\n"
3634                "}");
3635 
3636   FormatStyle OnePerLine = getLLVMStyle();
3637   OnePerLine.BinPackParameters = false;
3638   verifyFormat(
3639       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3640       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3641       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}",
3642       OnePerLine);
3643 
3644   verifyFormat("int i = someFunction(aaaaaaa, 0)\n"
3645                "                .aaa(aaaaaaaaaaaaa) *\n"
3646                "            aaaaaaa +\n"
3647                "        aaaaaaa;",
3648                getLLVMStyleWithColumns(40));
3649 }
3650 
3651 TEST_F(FormatTest, ExpressionIndentation) {
3652   verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3653                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3654                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3655                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3656                "                         bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
3657                "                     bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n"
3658                "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3659                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n"
3660                "                 ccccccccccccccccccccccccccccccccccccccccc;");
3661   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3662                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3663                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3664                "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3665   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3666                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3667                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3668                "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3669   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3670                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3671                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3672                "        bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3673   verifyFormat("if () {\n"
3674                "} else if (aaaaa && bbbbb > // break\n"
3675                "                        ccccc) {\n"
3676                "}");
3677   verifyFormat("if () {\n"
3678                "} else if (aaaaa &&\n"
3679                "           bbbbb > // break\n"
3680                "               ccccc &&\n"
3681                "           ddddd) {\n"
3682                "}");
3683 
3684   // Presence of a trailing comment used to change indentation of b.
3685   verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n"
3686                "       b;\n"
3687                "return aaaaaaaaaaaaaaaaaaa +\n"
3688                "       b; //",
3689                getLLVMStyleWithColumns(30));
3690 }
3691 
3692 TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) {
3693   // Not sure what the best system is here. Like this, the LHS can be found
3694   // immediately above an operator (everything with the same or a higher
3695   // indent). The RHS is aligned right of the operator and so compasses
3696   // everything until something with the same indent as the operator is found.
3697   // FIXME: Is this a good system?
3698   FormatStyle Style = getLLVMStyle();
3699   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
3700   verifyFormat(
3701       "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3702       "                     + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3703       "                     + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3704       "                 == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3705       "                            * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3706       "                        + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3707       "             && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3708       "                        * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3709       "                    > ccccccccccccccccccccccccccccccccccccccccc;",
3710       Style);
3711   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3712                "            * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3713                "        + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3714                "    == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3715                Style);
3716   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3717                "        + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3718                "              * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3719                "    == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3720                Style);
3721   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3722                "    == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3723                "               * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3724                "           + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3725                Style);
3726   verifyFormat("if () {\n"
3727                "} else if (aaaaa\n"
3728                "           && bbbbb // break\n"
3729                "                  > ccccc) {\n"
3730                "}",
3731                Style);
3732   verifyFormat("return (a)\n"
3733                "       // comment\n"
3734                "       + b;",
3735                Style);
3736   verifyFormat(
3737       "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3738       "                 * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3739       "             + cc;",
3740       Style);
3741 
3742   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3743                "    = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
3744                Style);
3745 
3746   // Forced by comments.
3747   verifyFormat(
3748       "unsigned ContentSize =\n"
3749       "    sizeof(int16_t)   // DWARF ARange version number\n"
3750       "    + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
3751       "    + sizeof(int8_t)  // Pointer Size (in bytes)\n"
3752       "    + sizeof(int8_t); // Segment Size (in bytes)");
3753 
3754   verifyFormat("return boost::fusion::at_c<0>(iiii).second\n"
3755                "       == boost::fusion::at_c<1>(iiii).second;",
3756                Style);
3757 
3758   Style.ColumnLimit = 60;
3759   verifyFormat("zzzzzzzzzz\n"
3760                "    = bbbbbbbbbbbbbbbbb\n"
3761                "      >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);",
3762                Style);
3763 
3764   Style.ColumnLimit = 80;
3765   Style.IndentWidth = 4;
3766   Style.TabWidth = 4;
3767   Style.UseTab = FormatStyle::UT_Always;
3768   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
3769   Style.AlignOperands = false;
3770   EXPECT_EQ("return someVeryVeryLongConditionThatBarelyFitsOnALine\n"
3771             "\t&& (someOtherLongishConditionPart1\n"
3772             "\t\t|| someOtherEvenLongerNestedConditionPart2);",
3773             format("return someVeryVeryLongConditionThatBarelyFitsOnALine && (someOtherLongishConditionPart1 || someOtherEvenLongerNestedConditionPart2);",
3774                    Style));
3775 }
3776 
3777 TEST_F(FormatTest, EnforcedOperatorWraps) {
3778   // Here we'd like to wrap after the || operators, but a comment is forcing an
3779   // earlier wrap.
3780   verifyFormat("bool x = aaaaa //\n"
3781                "         || bbbbb\n"
3782                "         //\n"
3783                "         || cccc;");
3784 }
3785 
3786 TEST_F(FormatTest, NoOperandAlignment) {
3787   FormatStyle Style = getLLVMStyle();
3788   Style.AlignOperands = false;
3789   verifyFormat("aaaaaaaaaaaaaa(aaaaaaaaaaaa,\n"
3790                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3791                "                   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3792                Style);
3793   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
3794   verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3795                "            + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3796                "            + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3797                "        == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3798                "                * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3799                "            + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3800                "    && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3801                "            * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3802                "        > ccccccccccccccccccccccccccccccccccccccccc;",
3803                Style);
3804 
3805   verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3806                "        * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3807                "    + cc;",
3808                Style);
3809   verifyFormat("int a = aa\n"
3810                "    + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3811                "        * cccccccccccccccccccccccccccccccccccc;\n",
3812                Style);
3813 
3814   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
3815   verifyFormat("return (a > b\n"
3816                "    // comment1\n"
3817                "    // comment2\n"
3818                "    || c);",
3819                Style);
3820 }
3821 
3822 TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) {
3823   FormatStyle Style = getLLVMStyle();
3824   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
3825   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
3826                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3827                "    + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
3828                Style);
3829 }
3830 
3831 TEST_F(FormatTest, AllowBinPackingInsideArguments) {
3832   FormatStyle Style = getLLVMStyle();
3833   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
3834   Style.BinPackArguments = false;
3835   Style.ColumnLimit = 40;
3836   verifyFormat("void test() {\n"
3837                "  someFunction(\n"
3838                "      this + argument + is + quite\n"
3839                "      + long + so + it + gets + wrapped\n"
3840                "      + but + remains + bin - packed);\n"
3841                "}",
3842                Style);
3843   verifyFormat("void test() {\n"
3844                "  someFunction(arg1,\n"
3845                "               this + argument + is\n"
3846                "                   + quite + long + so\n"
3847                "                   + it + gets + wrapped\n"
3848                "                   + but + remains + bin\n"
3849                "                   - packed,\n"
3850                "               arg3);\n"
3851                "}",
3852                Style);
3853   verifyFormat("void test() {\n"
3854                "  someFunction(\n"
3855                "      arg1,\n"
3856                "      this + argument + has\n"
3857                "          + anotherFunc(nested,\n"
3858                "                        calls + whose\n"
3859                "                            + arguments\n"
3860                "                            + are + also\n"
3861                "                            + wrapped,\n"
3862                "                        in + addition)\n"
3863                "          + to + being + bin - packed,\n"
3864                "      arg3);\n"
3865                "}",
3866                Style);
3867 
3868   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
3869   verifyFormat("void test() {\n"
3870                "  someFunction(\n"
3871                "      arg1,\n"
3872                "      this + argument + has +\n"
3873                "          anotherFunc(nested,\n"
3874                "                      calls + whose +\n"
3875                "                          arguments +\n"
3876                "                          are + also +\n"
3877                "                          wrapped,\n"
3878                "                      in + addition) +\n"
3879                "          to + being + bin - packed,\n"
3880                "      arg3);\n"
3881                "}",
3882                Style);
3883 }
3884 
3885 TEST_F(FormatTest, ConstructorInitializers) {
3886   verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
3887   verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}",
3888                getLLVMStyleWithColumns(45));
3889   verifyFormat("Constructor()\n"
3890                "    : Inttializer(FitsOnTheLine) {}",
3891                getLLVMStyleWithColumns(44));
3892   verifyFormat("Constructor()\n"
3893                "    : Inttializer(FitsOnTheLine) {}",
3894                getLLVMStyleWithColumns(43));
3895 
3896   verifyFormat("template <typename T>\n"
3897                "Constructor() : Initializer(FitsOnTheLine) {}",
3898                getLLVMStyleWithColumns(45));
3899 
3900   verifyFormat(
3901       "SomeClass::Constructor()\n"
3902       "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
3903 
3904   verifyFormat(
3905       "SomeClass::Constructor()\n"
3906       "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3907       "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}");
3908   verifyFormat(
3909       "SomeClass::Constructor()\n"
3910       "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3911       "      aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
3912   verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3913                "            aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3914                "    : aaaaaaaaaa(aaaaaa) {}");
3915 
3916   verifyFormat("Constructor()\n"
3917                "    : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3918                "      aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3919                "                               aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3920                "      aaaaaaaaaaaaaaaaaaaaaaa() {}");
3921 
3922   verifyFormat("Constructor()\n"
3923                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3924                "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
3925 
3926   verifyFormat("Constructor(int Parameter = 0)\n"
3927                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
3928                "      aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}");
3929   verifyFormat("Constructor()\n"
3930                "    : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
3931                "}",
3932                getLLVMStyleWithColumns(60));
3933   verifyFormat("Constructor()\n"
3934                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3935                "          aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}");
3936 
3937   // Here a line could be saved by splitting the second initializer onto two
3938   // lines, but that is not desirable.
3939   verifyFormat("Constructor()\n"
3940                "    : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
3941                "      aaaaaaaaaaa(aaaaaaaaaaa),\n"
3942                "      aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
3943 
3944   FormatStyle OnePerLine = getLLVMStyle();
3945   OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
3946   OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
3947   verifyFormat("SomeClass::Constructor()\n"
3948                "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3949                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3950                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3951                OnePerLine);
3952   verifyFormat("SomeClass::Constructor()\n"
3953                "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
3954                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3955                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3956                OnePerLine);
3957   verifyFormat("MyClass::MyClass(int var)\n"
3958                "    : some_var_(var),            // 4 space indent\n"
3959                "      some_other_var_(var + 1) { // lined up\n"
3960                "}",
3961                OnePerLine);
3962   verifyFormat("Constructor()\n"
3963                "    : aaaaa(aaaaaa),\n"
3964                "      aaaaa(aaaaaa),\n"
3965                "      aaaaa(aaaaaa),\n"
3966                "      aaaaa(aaaaaa),\n"
3967                "      aaaaa(aaaaaa) {}",
3968                OnePerLine);
3969   verifyFormat("Constructor()\n"
3970                "    : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
3971                "            aaaaaaaaaaaaaaaaaaaaaa) {}",
3972                OnePerLine);
3973   OnePerLine.BinPackParameters = false;
3974   verifyFormat(
3975       "Constructor()\n"
3976       "    : aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3977       "          aaaaaaaaaaa().aaa(),\n"
3978       "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3979       OnePerLine);
3980   OnePerLine.ColumnLimit = 60;
3981   verifyFormat("Constructor()\n"
3982                "    : aaaaaaaaaaaaaaaaaaaa(a),\n"
3983                "      bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
3984                OnePerLine);
3985 
3986   EXPECT_EQ("Constructor()\n"
3987             "    : // Comment forcing unwanted break.\n"
3988             "      aaaa(aaaa) {}",
3989             format("Constructor() :\n"
3990                    "    // Comment forcing unwanted break.\n"
3991                    "    aaaa(aaaa) {}"));
3992 }
3993 
3994 TEST_F(FormatTest, AllowAllConstructorInitializersOnNextLine) {
3995   FormatStyle Style = getLLVMStyle();
3996   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
3997   Style.ColumnLimit = 60;
3998   Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
3999   Style.AllowAllConstructorInitializersOnNextLine = true;
4000   Style.BinPackParameters = false;
4001 
4002   for (int i = 0; i < 4; ++i) {
4003     // Test all combinations of parameters that should not have an effect.
4004     Style.AllowAllParametersOfDeclarationOnNextLine = i & 1;
4005     Style.AllowAllArgumentsOnNextLine = i & 2;
4006 
4007     Style.AllowAllConstructorInitializersOnNextLine = true;
4008     Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
4009     verifyFormat("Constructor()\n"
4010                  "    : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4011                  Style);
4012     verifyFormat("Constructor() : a(a), b(b) {}", Style);
4013 
4014     Style.AllowAllConstructorInitializersOnNextLine = false;
4015     verifyFormat("Constructor()\n"
4016                  "    : aaaaaaaaaaaaaaaaaaaa(a)\n"
4017                  "    , bbbbbbbbbbbbbbbbbbbbb(b) {}",
4018                  Style);
4019     verifyFormat("Constructor() : a(a), b(b) {}", Style);
4020 
4021     Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
4022     Style.AllowAllConstructorInitializersOnNextLine = true;
4023     verifyFormat("Constructor()\n"
4024                  "    : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4025                  Style);
4026 
4027     Style.AllowAllConstructorInitializersOnNextLine = false;
4028     verifyFormat("Constructor()\n"
4029                  "    : aaaaaaaaaaaaaaaaaaaa(a),\n"
4030                  "      bbbbbbbbbbbbbbbbbbbbb(b) {}",
4031                  Style);
4032 
4033     Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
4034     Style.AllowAllConstructorInitializersOnNextLine = true;
4035     verifyFormat("Constructor() :\n"
4036                  "    aaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4037                  Style);
4038 
4039     Style.AllowAllConstructorInitializersOnNextLine = false;
4040     verifyFormat("Constructor() :\n"
4041                  "    aaaaaaaaaaaaaaaaaa(a),\n"
4042                  "    bbbbbbbbbbbbbbbbbbbbb(b) {}",
4043                  Style);
4044   }
4045 
4046   // Test interactions between AllowAllParametersOfDeclarationOnNextLine and
4047   // AllowAllConstructorInitializersOnNextLine in all
4048   // BreakConstructorInitializers modes
4049   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
4050   Style.AllowAllParametersOfDeclarationOnNextLine = true;
4051   Style.AllowAllConstructorInitializersOnNextLine = false;
4052   verifyFormat("SomeClassWithALongName::Constructor(\n"
4053                "    int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb)\n"
4054                "    : aaaaaaaaaaaaaaaaaaaa(a)\n"
4055                "    , bbbbbbbbbbbbbbbbbbbbb(b) {}",
4056                Style);
4057 
4058   Style.AllowAllConstructorInitializersOnNextLine = true;
4059   verifyFormat("SomeClassWithALongName::Constructor(\n"
4060                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4061                "    int bbbbbbbbbbbbb,\n"
4062                "    int cccccccccccccccc)\n"
4063                "    : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4064                Style);
4065 
4066   Style.AllowAllParametersOfDeclarationOnNextLine = false;
4067   Style.AllowAllConstructorInitializersOnNextLine = false;
4068   verifyFormat("SomeClassWithALongName::Constructor(\n"
4069                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4070                "    int bbbbbbbbbbbbb)\n"
4071                "    : aaaaaaaaaaaaaaaaaaaa(a)\n"
4072                "    , bbbbbbbbbbbbbbbbbbbbb(b) {}",
4073                Style);
4074 
4075   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
4076 
4077   Style.AllowAllParametersOfDeclarationOnNextLine = true;
4078   verifyFormat("SomeClassWithALongName::Constructor(\n"
4079                "    int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb)\n"
4080                "    : aaaaaaaaaaaaaaaaaaaa(a),\n"
4081                "      bbbbbbbbbbbbbbbbbbbbb(b) {}",
4082                Style);
4083 
4084   Style.AllowAllConstructorInitializersOnNextLine = true;
4085   verifyFormat("SomeClassWithALongName::Constructor(\n"
4086                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4087                "    int bbbbbbbbbbbbb,\n"
4088                "    int cccccccccccccccc)\n"
4089                "    : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4090                Style);
4091 
4092   Style.AllowAllParametersOfDeclarationOnNextLine = false;
4093   Style.AllowAllConstructorInitializersOnNextLine = false;
4094   verifyFormat("SomeClassWithALongName::Constructor(\n"
4095                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4096                "    int bbbbbbbbbbbbb)\n"
4097                "    : aaaaaaaaaaaaaaaaaaaa(a),\n"
4098                "      bbbbbbbbbbbbbbbbbbbbb(b) {}",
4099                Style);
4100 
4101   Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
4102   Style.AllowAllParametersOfDeclarationOnNextLine = true;
4103   verifyFormat("SomeClassWithALongName::Constructor(\n"
4104                "    int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb) :\n"
4105                "    aaaaaaaaaaaaaaaaaaaa(a),\n"
4106                "    bbbbbbbbbbbbbbbbbbbbb(b) {}",
4107                Style);
4108 
4109   Style.AllowAllConstructorInitializersOnNextLine = true;
4110   verifyFormat("SomeClassWithALongName::Constructor(\n"
4111                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4112                "    int bbbbbbbbbbbbb,\n"
4113                "    int cccccccccccccccc) :\n"
4114                "    aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4115                Style);
4116 
4117   Style.AllowAllParametersOfDeclarationOnNextLine = false;
4118   Style.AllowAllConstructorInitializersOnNextLine = false;
4119   verifyFormat("SomeClassWithALongName::Constructor(\n"
4120                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4121                "    int bbbbbbbbbbbbb) :\n"
4122                "    aaaaaaaaaaaaaaaaaaaa(a),\n"
4123                "    bbbbbbbbbbbbbbbbbbbbb(b) {}",
4124                Style);
4125 }
4126 
4127 TEST_F(FormatTest, AllowAllArgumentsOnNextLine) {
4128   FormatStyle Style = getLLVMStyle();
4129   Style.ColumnLimit = 60;
4130   Style.BinPackArguments = false;
4131   for (int i = 0; i < 4; ++i) {
4132     // Test all combinations of parameters that should not have an effect.
4133     Style.AllowAllParametersOfDeclarationOnNextLine = i & 1;
4134     Style.AllowAllConstructorInitializersOnNextLine = i & 2;
4135 
4136     Style.AllowAllArgumentsOnNextLine = true;
4137     verifyFormat("void foo() {\n"
4138                  "  FunctionCallWithReallyLongName(\n"
4139                  "      aaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbb);\n"
4140                  "}",
4141                  Style);
4142     Style.AllowAllArgumentsOnNextLine = false;
4143     verifyFormat("void foo() {\n"
4144                  "  FunctionCallWithReallyLongName(\n"
4145                  "      aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4146                  "      bbbbbbbbbbbb);\n"
4147                  "}",
4148                  Style);
4149 
4150     Style.AllowAllArgumentsOnNextLine = true;
4151     verifyFormat("void foo() {\n"
4152                  "  auto VariableWithReallyLongName = {\n"
4153                  "      aaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbb};\n"
4154                  "}",
4155                  Style);
4156     Style.AllowAllArgumentsOnNextLine = false;
4157     verifyFormat("void foo() {\n"
4158                  "  auto VariableWithReallyLongName = {\n"
4159                  "      aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4160                  "      bbbbbbbbbbbb};\n"
4161                  "}",
4162                  Style);
4163   }
4164 
4165   // This parameter should not affect declarations.
4166   Style.BinPackParameters = false;
4167   Style.AllowAllArgumentsOnNextLine = false;
4168   Style.AllowAllParametersOfDeclarationOnNextLine = true;
4169   verifyFormat("void FunctionCallWithReallyLongName(\n"
4170                "    int aaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbb);",
4171                Style);
4172   Style.AllowAllParametersOfDeclarationOnNextLine = false;
4173   verifyFormat("void FunctionCallWithReallyLongName(\n"
4174                "    int aaaaaaaaaaaaaaaaaaaaaaa,\n"
4175                "    int bbbbbbbbbbbb);",
4176                Style);
4177 }
4178 
4179 TEST_F(FormatTest, BreakConstructorInitializersAfterColon) {
4180   FormatStyle Style = getLLVMStyle();
4181   Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
4182 
4183   verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
4184   verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}",
4185                getStyleWithColumns(Style, 45));
4186   verifyFormat("Constructor() :\n"
4187                "    Initializer(FitsOnTheLine) {}",
4188                getStyleWithColumns(Style, 44));
4189   verifyFormat("Constructor() :\n"
4190                "    Initializer(FitsOnTheLine) {}",
4191                getStyleWithColumns(Style, 43));
4192 
4193   verifyFormat("template <typename T>\n"
4194                "Constructor() : Initializer(FitsOnTheLine) {}",
4195                getStyleWithColumns(Style, 50));
4196   Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
4197   verifyFormat(
4198       "SomeClass::Constructor() :\n"
4199       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
4200       Style);
4201 
4202   Style.ConstructorInitializerAllOnOneLineOrOnePerLine = false;
4203   verifyFormat(
4204       "SomeClass::Constructor() :\n"
4205       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
4206       Style);
4207 
4208   verifyFormat(
4209       "SomeClass::Constructor() :\n"
4210       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4211       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
4212       Style);
4213   verifyFormat(
4214       "SomeClass::Constructor() :\n"
4215       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4216       "    aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
4217 	  Style);
4218   verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4219                "            aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4220                "    aaaaaaaaaa(aaaaaa) {}",
4221 			   Style);
4222 
4223   verifyFormat("Constructor() :\n"
4224                "    aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4225                "    aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4226                "                             aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4227                "    aaaaaaaaaaaaaaaaaaaaaaa() {}",
4228 			   Style);
4229 
4230   verifyFormat("Constructor() :\n"
4231                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4232                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4233 			   Style);
4234 
4235   verifyFormat("Constructor(int Parameter = 0) :\n"
4236                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
4237                "    aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}",
4238 			   Style);
4239   verifyFormat("Constructor() :\n"
4240                "    aaaaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
4241                "}",
4242                getStyleWithColumns(Style, 60));
4243   verifyFormat("Constructor() :\n"
4244                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4245                "        aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}",
4246 			   Style);
4247 
4248   // Here a line could be saved by splitting the second initializer onto two
4249   // lines, but that is not desirable.
4250   verifyFormat("Constructor() :\n"
4251                "    aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
4252                "    aaaaaaaaaaa(aaaaaaaaaaa),\n"
4253                "    aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4254 			   Style);
4255 
4256   FormatStyle OnePerLine = Style;
4257   OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
4258   OnePerLine.AllowAllConstructorInitializersOnNextLine = false;
4259   verifyFormat("SomeClass::Constructor() :\n"
4260                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4261                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4262                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
4263                OnePerLine);
4264   verifyFormat("SomeClass::Constructor() :\n"
4265                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
4266                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4267                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
4268                OnePerLine);
4269   verifyFormat("MyClass::MyClass(int var) :\n"
4270                "    some_var_(var),            // 4 space indent\n"
4271                "    some_other_var_(var + 1) { // lined up\n"
4272                "}",
4273                OnePerLine);
4274   verifyFormat("Constructor() :\n"
4275                "    aaaaa(aaaaaa),\n"
4276                "    aaaaa(aaaaaa),\n"
4277                "    aaaaa(aaaaaa),\n"
4278                "    aaaaa(aaaaaa),\n"
4279                "    aaaaa(aaaaaa) {}",
4280                OnePerLine);
4281   verifyFormat("Constructor() :\n"
4282                "    aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
4283                "          aaaaaaaaaaaaaaaaaaaaaa) {}",
4284                OnePerLine);
4285   OnePerLine.BinPackParameters = false;
4286   verifyFormat(
4287       "Constructor() :\n"
4288       "    aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4289       "        aaaaaaaaaaa().aaa(),\n"
4290       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4291       OnePerLine);
4292   OnePerLine.ColumnLimit = 60;
4293   verifyFormat("Constructor() :\n"
4294                "    aaaaaaaaaaaaaaaaaaaa(a),\n"
4295                "    bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
4296                OnePerLine);
4297 
4298   EXPECT_EQ("Constructor() :\n"
4299             "    // Comment forcing unwanted break.\n"
4300             "    aaaa(aaaa) {}",
4301             format("Constructor() :\n"
4302                    "    // Comment forcing unwanted break.\n"
4303                    "    aaaa(aaaa) {}",
4304 				   Style));
4305 
4306   Style.ColumnLimit = 0;
4307   verifyFormat("SomeClass::Constructor() :\n"
4308                "    a(a) {}",
4309                Style);
4310   verifyFormat("SomeClass::Constructor() noexcept :\n"
4311                "    a(a) {}",
4312                Style);
4313   verifyFormat("SomeClass::Constructor() :\n"
4314 			   "    a(a), b(b), c(c) {}",
4315                Style);
4316   verifyFormat("SomeClass::Constructor() :\n"
4317                "    a(a) {\n"
4318                "  foo();\n"
4319                "  bar();\n"
4320                "}",
4321                Style);
4322 
4323   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
4324   verifyFormat("SomeClass::Constructor() :\n"
4325 			   "    a(a), b(b), c(c) {\n"
4326 			   "}",
4327                Style);
4328   verifyFormat("SomeClass::Constructor() :\n"
4329                "    a(a) {\n"
4330 			   "}",
4331                Style);
4332 
4333   Style.ColumnLimit = 80;
4334   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
4335   Style.ConstructorInitializerIndentWidth = 2;
4336   verifyFormat("SomeClass::Constructor() : a(a), b(b), c(c) {}",
4337                Style);
4338   verifyFormat("SomeClass::Constructor() :\n"
4339                "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4340                "  bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {}",
4341                Style);
4342 
4343   // `ConstructorInitializerIndentWidth` actually applies to InheritanceList as well
4344   Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
4345   verifyFormat("class SomeClass\n"
4346                "  : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4347                "    public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};",
4348                Style);
4349   Style.BreakInheritanceList = FormatStyle::BILS_BeforeComma;
4350   verifyFormat("class SomeClass\n"
4351                "  : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4352                "  , public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};",
4353                Style);
4354   Style.BreakInheritanceList = FormatStyle::BILS_AfterColon;
4355   verifyFormat("class SomeClass :\n"
4356                "  public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4357                "  public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};",
4358                Style);
4359 }
4360 
4361 #ifndef EXPENSIVE_CHECKS
4362 // Expensive checks enables libstdc++ checking which includes validating the
4363 // state of ranges used in std::priority_queue - this blows out the
4364 // runtime/scalability of the function and makes this test unacceptably slow.
4365 TEST_F(FormatTest, MemoizationTests) {
4366   // This breaks if the memoization lookup does not take \c Indent and
4367   // \c LastSpace into account.
4368   verifyFormat(
4369       "extern CFRunLoopTimerRef\n"
4370       "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n"
4371       "                     CFTimeInterval interval, CFOptionFlags flags,\n"
4372       "                     CFIndex order, CFRunLoopTimerCallBack callout,\n"
4373       "                     CFRunLoopTimerContext *context) {}");
4374 
4375   // Deep nesting somewhat works around our memoization.
4376   verifyFormat(
4377       "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4378       "    aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4379       "        aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4380       "            aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4381       "                aaaaa())))))))))))))))))))))))))))))))))))))));",
4382       getLLVMStyleWithColumns(65));
4383   verifyFormat(
4384       "aaaaa(\n"
4385       "    aaaaa,\n"
4386       "    aaaaa(\n"
4387       "        aaaaa,\n"
4388       "        aaaaa(\n"
4389       "            aaaaa,\n"
4390       "            aaaaa(\n"
4391       "                aaaaa,\n"
4392       "                aaaaa(\n"
4393       "                    aaaaa,\n"
4394       "                    aaaaa(\n"
4395       "                        aaaaa,\n"
4396       "                        aaaaa(\n"
4397       "                            aaaaa,\n"
4398       "                            aaaaa(\n"
4399       "                                aaaaa,\n"
4400       "                                aaaaa(\n"
4401       "                                    aaaaa,\n"
4402       "                                    aaaaa(\n"
4403       "                                        aaaaa,\n"
4404       "                                        aaaaa(\n"
4405       "                                            aaaaa,\n"
4406       "                                            aaaaa(\n"
4407       "                                                aaaaa,\n"
4408       "                                                aaaaa))))))))))));",
4409       getLLVMStyleWithColumns(65));
4410   verifyFormat(
4411       "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"
4412       "                                  a),\n"
4413       "                                a),\n"
4414       "                              a),\n"
4415       "                            a),\n"
4416       "                          a),\n"
4417       "                        a),\n"
4418       "                      a),\n"
4419       "                    a),\n"
4420       "                  a),\n"
4421       "                a),\n"
4422       "              a),\n"
4423       "            a),\n"
4424       "          a),\n"
4425       "        a),\n"
4426       "      a),\n"
4427       "    a),\n"
4428       "  a)",
4429       getLLVMStyleWithColumns(65));
4430 
4431   // This test takes VERY long when memoization is broken.
4432   FormatStyle OnePerLine = getLLVMStyle();
4433   OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
4434   OnePerLine.BinPackParameters = false;
4435   std::string input = "Constructor()\n"
4436                       "    : aaaa(a,\n";
4437   for (unsigned i = 0, e = 80; i != e; ++i) {
4438     input += "           a,\n";
4439   }
4440   input += "           a) {}";
4441   verifyFormat(input, OnePerLine);
4442 }
4443 #endif
4444 
4445 TEST_F(FormatTest, BreaksAsHighAsPossible) {
4446   verifyFormat(
4447       "void f() {\n"
4448       "  if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
4449       "      (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
4450       "    f();\n"
4451       "}");
4452   verifyFormat("if (Intervals[i].getRange().getFirst() <\n"
4453                "    Intervals[i - 1].getRange().getLast()) {\n}");
4454 }
4455 
4456 TEST_F(FormatTest, BreaksFunctionDeclarations) {
4457   // Principially, we break function declarations in a certain order:
4458   // 1) break amongst arguments.
4459   verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n"
4460                "                              Cccccccccccccc cccccccccccccc);");
4461   verifyFormat("template <class TemplateIt>\n"
4462                "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n"
4463                "                            TemplateIt *stop) {}");
4464 
4465   // 2) break after return type.
4466   verifyFormat(
4467       "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4468       "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);",
4469       getGoogleStyle());
4470 
4471   // 3) break after (.
4472   verifyFormat(
4473       "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n"
4474       "    Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);",
4475       getGoogleStyle());
4476 
4477   // 4) break before after nested name specifiers.
4478   verifyFormat(
4479       "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4480       "SomeClasssssssssssssssssssssssssssssssssssssss::\n"
4481       "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);",
4482       getGoogleStyle());
4483 
4484   // However, there are exceptions, if a sufficient amount of lines can be
4485   // saved.
4486   // FIXME: The precise cut-offs wrt. the number of saved lines might need some
4487   // more adjusting.
4488   verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
4489                "                                  Cccccccccccccc cccccccccc,\n"
4490                "                                  Cccccccccccccc cccccccccc,\n"
4491                "                                  Cccccccccccccc cccccccccc,\n"
4492                "                                  Cccccccccccccc cccccccccc);");
4493   verifyFormat(
4494       "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4495       "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4496       "            Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4497       "            Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);",
4498       getGoogleStyle());
4499   verifyFormat(
4500       "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
4501       "                                          Cccccccccccccc cccccccccc,\n"
4502       "                                          Cccccccccccccc cccccccccc,\n"
4503       "                                          Cccccccccccccc cccccccccc,\n"
4504       "                                          Cccccccccccccc cccccccccc,\n"
4505       "                                          Cccccccccccccc cccccccccc,\n"
4506       "                                          Cccccccccccccc cccccccccc);");
4507   verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4508                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4509                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4510                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4511                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
4512 
4513   // Break after multi-line parameters.
4514   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4515                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4516                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4517                "    bbbb bbbb);");
4518   verifyFormat("void SomeLoooooooooooongFunction(\n"
4519                "    std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
4520                "        aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4521                "    int bbbbbbbbbbbbb);");
4522 
4523   // Treat overloaded operators like other functions.
4524   verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
4525                "operator>(const SomeLoooooooooooooooooooooooooogType &other);");
4526   verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
4527                "operator>>(const SomeLooooooooooooooooooooooooogType &other);");
4528   verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
4529                "operator<<(const SomeLooooooooooooooooooooooooogType &other);");
4530   verifyGoogleFormat(
4531       "SomeLoooooooooooooooooooooooooooooogType operator>>(\n"
4532       "    const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
4533   verifyGoogleFormat(
4534       "SomeLoooooooooooooooooooooooooooooogType operator<<(\n"
4535       "    const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
4536   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4537                "    int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);");
4538   verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n"
4539                "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);");
4540   verifyGoogleFormat(
4541       "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n"
4542       "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4543       "    bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}");
4544   verifyGoogleFormat(
4545       "template <typename T>\n"
4546       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4547       "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n"
4548       "    aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);");
4549 
4550   FormatStyle Style = getLLVMStyle();
4551   Style.PointerAlignment = FormatStyle::PAS_Left;
4552   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4553                "    aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}",
4554                Style);
4555   verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n"
4556                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4557                Style);
4558 }
4559 
4560 TEST_F(FormatTest, DontBreakBeforeQualifiedOperator) {
4561   // Regression test for https://bugs.llvm.org/show_bug.cgi?id=40516:
4562   // Prefer keeping `::` followed by `operator` together.
4563   EXPECT_EQ("const aaaa::bbbbbbb &\n"
4564             "ccccccccc::operator++() {\n"
4565             "  stuff();\n"
4566             "}",
4567             format("const aaaa::bbbbbbb\n"
4568                    "&ccccccccc::operator++() { stuff(); }",
4569                    getLLVMStyleWithColumns(40)));
4570 }
4571 
4572 TEST_F(FormatTest, TrailingReturnType) {
4573   verifyFormat("auto foo() -> int;\n");
4574   verifyFormat("struct S {\n"
4575                "  auto bar() const -> int;\n"
4576                "};");
4577   verifyFormat("template <size_t Order, typename T>\n"
4578                "auto load_img(const std::string &filename)\n"
4579                "    -> alias::tensor<Order, T, mem::tag::cpu> {}");
4580   verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n"
4581                "    -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}");
4582   verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}");
4583   verifyFormat("template <typename T>\n"
4584                "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n"
4585                "    -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());");
4586 
4587   // Not trailing return types.
4588   verifyFormat("void f() { auto a = b->c(); }");
4589 }
4590 
4591 TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) {
4592   // Avoid breaking before trailing 'const' or other trailing annotations, if
4593   // they are not function-like.
4594   FormatStyle Style = getGoogleStyle();
4595   Style.ColumnLimit = 47;
4596   verifyFormat("void someLongFunction(\n"
4597                "    int someLoooooooooooooongParameter) const {\n}",
4598                getLLVMStyleWithColumns(47));
4599   verifyFormat("LoooooongReturnType\n"
4600                "someLoooooooongFunction() const {}",
4601                getLLVMStyleWithColumns(47));
4602   verifyFormat("LoooooongReturnType someLoooooooongFunction()\n"
4603                "    const {}",
4604                Style);
4605   verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
4606                "                  aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;");
4607   verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
4608                "                  aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;");
4609   verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
4610                "                  aaaaa aaaaaaaaaaaaaaaaaaaa) override final;");
4611   verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n"
4612                "                   aaaaaaaaaaa aaaaa) const override;");
4613   verifyGoogleFormat(
4614       "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4615       "    const override;");
4616 
4617   // Even if the first parameter has to be wrapped.
4618   verifyFormat("void someLongFunction(\n"
4619                "    int someLongParameter) const {}",
4620                getLLVMStyleWithColumns(46));
4621   verifyFormat("void someLongFunction(\n"
4622                "    int someLongParameter) const {}",
4623                Style);
4624   verifyFormat("void someLongFunction(\n"
4625                "    int someLongParameter) override {}",
4626                Style);
4627   verifyFormat("void someLongFunction(\n"
4628                "    int someLongParameter) OVERRIDE {}",
4629                Style);
4630   verifyFormat("void someLongFunction(\n"
4631                "    int someLongParameter) final {}",
4632                Style);
4633   verifyFormat("void someLongFunction(\n"
4634                "    int someLongParameter) FINAL {}",
4635                Style);
4636   verifyFormat("void someLongFunction(\n"
4637                "    int parameter) const override {}",
4638                Style);
4639 
4640   Style.BreakBeforeBraces = FormatStyle::BS_Allman;
4641   verifyFormat("void someLongFunction(\n"
4642                "    int someLongParameter) const\n"
4643                "{\n"
4644                "}",
4645                Style);
4646 
4647   // Unless these are unknown annotations.
4648   verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n"
4649                "                  aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4650                "    LONG_AND_UGLY_ANNOTATION;");
4651 
4652   // Breaking before function-like trailing annotations is fine to keep them
4653   // close to their arguments.
4654   verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4655                "    LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
4656   verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
4657                "    LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
4658   verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
4659                "    LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}");
4660   verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n"
4661                      "    AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);");
4662   verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});");
4663 
4664   verifyFormat(
4665       "void aaaaaaaaaaaaaaaaaa()\n"
4666       "    __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n"
4667       "                   aaaaaaaaaaaaaaaaaaaaaaaaa));");
4668   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4669                "    __attribute__((unused));");
4670   verifyGoogleFormat(
4671       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4672       "    GUARDED_BY(aaaaaaaaaaaa);");
4673   verifyGoogleFormat(
4674       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4675       "    GUARDED_BY(aaaaaaaaaaaa);");
4676   verifyGoogleFormat(
4677       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4678       "    aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4679   verifyGoogleFormat(
4680       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4681       "    aaaaaaaaaaaaaaaaaaaaaaaaa;");
4682 }
4683 
4684 TEST_F(FormatTest, FunctionAnnotations) {
4685   verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
4686                "int OldFunction(const string &parameter) {}");
4687   verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
4688                "string OldFunction(const string &parameter) {}");
4689   verifyFormat("template <typename T>\n"
4690                "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
4691                "string OldFunction(const string &parameter) {}");
4692 
4693   // Not function annotations.
4694   verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4695                "                << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
4696   verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n"
4697                "       ThisIsATestWithAReallyReallyReallyReallyLongName) {}");
4698   verifyFormat("MACRO(abc).function() // wrap\n"
4699                "    << abc;");
4700   verifyFormat("MACRO(abc)->function() // wrap\n"
4701                "    << abc;");
4702   verifyFormat("MACRO(abc)::function() // wrap\n"
4703                "    << abc;");
4704 }
4705 
4706 TEST_F(FormatTest, BreaksDesireably) {
4707   verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
4708                "    aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
4709                "    aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
4710   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4711                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
4712                "}");
4713 
4714   verifyFormat(
4715       "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4716       "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
4717 
4718   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4719                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4720                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4721 
4722   verifyFormat(
4723       "aaaaaaaa(aaaaaaaaaaaaa,\n"
4724       "         aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4725       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
4726       "         aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4727       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
4728 
4729   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4730                "    (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4731 
4732   verifyFormat(
4733       "void f() {\n"
4734       "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
4735       "                                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4736       "}");
4737   verifyFormat(
4738       "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4739       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4740   verifyFormat(
4741       "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4742       "                aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4743   verifyFormat(
4744       "aaaaaa(aaa,\n"
4745       "       new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4746       "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4747       "       aaaa);");
4748   verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4749                "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4750                "                  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4751 
4752   // Indent consistently independent of call expression and unary operator.
4753   verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4754                "    dddddddddddddddddddddddddddddd));");
4755   verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4756                "    dddddddddddddddddddddddddddddd));");
4757   verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n"
4758                "    dddddddddddddddddddddddddddddd));");
4759 
4760   // This test case breaks on an incorrect memoization, i.e. an optimization not
4761   // taking into account the StopAt value.
4762   verifyFormat(
4763       "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4764       "       aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4765       "       aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4766       "       (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4767 
4768   verifyFormat("{\n  {\n    {\n"
4769                "      Annotation.SpaceRequiredBefore =\n"
4770                "          Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
4771                "          Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
4772                "    }\n  }\n}");
4773 
4774   // Break on an outer level if there was a break on an inner level.
4775   EXPECT_EQ("f(g(h(a, // comment\n"
4776             "      b, c),\n"
4777             "    d, e),\n"
4778             "  x, y);",
4779             format("f(g(h(a, // comment\n"
4780                    "    b, c), d, e), x, y);"));
4781 
4782   // Prefer breaking similar line breaks.
4783   verifyFormat(
4784       "const int kTrackingOptions = NSTrackingMouseMoved |\n"
4785       "                             NSTrackingMouseEnteredAndExited |\n"
4786       "                             NSTrackingActiveAlways;");
4787 }
4788 
4789 TEST_F(FormatTest, FormatsDeclarationsOnePerLine) {
4790   FormatStyle NoBinPacking = getGoogleStyle();
4791   NoBinPacking.BinPackParameters = false;
4792   NoBinPacking.BinPackArguments = true;
4793   verifyFormat("void f() {\n"
4794                "  f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n"
4795                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4796                "}",
4797                NoBinPacking);
4798   verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n"
4799                "       int aaaaaaaaaaaaaaaaaaaa,\n"
4800                "       int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4801                NoBinPacking);
4802 
4803   NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
4804   verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4805                "                        vector<int> bbbbbbbbbbbbbbb);",
4806                NoBinPacking);
4807   // FIXME: This behavior difference is probably not wanted. However, currently
4808   // we cannot distinguish BreakBeforeParameter being set because of the wrapped
4809   // template arguments from BreakBeforeParameter being set because of the
4810   // one-per-line formatting.
4811   verifyFormat(
4812       "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4813       "                                             aaaaaaaaaa> aaaaaaaaaa);",
4814       NoBinPacking);
4815   verifyFormat(
4816       "void fffffffffff(\n"
4817       "    aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n"
4818       "        aaaaaaaaaa);");
4819 }
4820 
4821 TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) {
4822   FormatStyle NoBinPacking = getGoogleStyle();
4823   NoBinPacking.BinPackParameters = false;
4824   NoBinPacking.BinPackArguments = false;
4825   verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n"
4826                "  aaaaaaaaaaaaaaaaaaaa,\n"
4827                "  aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);",
4828                NoBinPacking);
4829   verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n"
4830                "        aaaaaaaaaaaaa,\n"
4831                "        aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));",
4832                NoBinPacking);
4833   verifyFormat(
4834       "aaaaaaaa(aaaaaaaaaaaaa,\n"
4835       "         aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4836       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
4837       "         aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4838       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));",
4839       NoBinPacking);
4840   verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4841                "    .aaaaaaaaaaaaaaaaaa();",
4842                NoBinPacking);
4843   verifyFormat("void f() {\n"
4844                "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4845                "      aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n"
4846                "}",
4847                NoBinPacking);
4848 
4849   verifyFormat(
4850       "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4851       "             aaaaaaaaaaaa,\n"
4852       "             aaaaaaaaaaaa);",
4853       NoBinPacking);
4854   verifyFormat(
4855       "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n"
4856       "                               ddddddddddddddddddddddddddddd),\n"
4857       "             test);",
4858       NoBinPacking);
4859 
4860   verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4861                "            aaaaaaaaaaaaaaaaaaaaaaa,\n"
4862                "            aaaaaaaaaaaaaaaaaaaaaaa>\n"
4863                "    aaaaaaaaaaaaaaaaaa;",
4864                NoBinPacking);
4865   verifyFormat("a(\"a\"\n"
4866                "  \"a\",\n"
4867                "  a);");
4868 
4869   NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
4870   verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n"
4871                "                aaaaaaaaa,\n"
4872                "                aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4873                NoBinPacking);
4874   verifyFormat(
4875       "void f() {\n"
4876       "  aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4877       "      .aaaaaaa();\n"
4878       "}",
4879       NoBinPacking);
4880   verifyFormat(
4881       "template <class SomeType, class SomeOtherType>\n"
4882       "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}",
4883       NoBinPacking);
4884 }
4885 
4886 TEST_F(FormatTest, AdaptiveOnePerLineFormatting) {
4887   FormatStyle Style = getLLVMStyleWithColumns(15);
4888   Style.ExperimentalAutoDetectBinPacking = true;
4889   EXPECT_EQ("aaa(aaaa,\n"
4890             "    aaaa,\n"
4891             "    aaaa);\n"
4892             "aaa(aaaa,\n"
4893             "    aaaa,\n"
4894             "    aaaa);",
4895             format("aaa(aaaa,\n" // one-per-line
4896                    "  aaaa,\n"
4897                    "    aaaa  );\n"
4898                    "aaa(aaaa,  aaaa,  aaaa);", // inconclusive
4899                    Style));
4900   EXPECT_EQ("aaa(aaaa, aaaa,\n"
4901             "    aaaa);\n"
4902             "aaa(aaaa, aaaa,\n"
4903             "    aaaa);",
4904             format("aaa(aaaa,  aaaa,\n" // bin-packed
4905                    "    aaaa  );\n"
4906                    "aaa(aaaa,  aaaa,  aaaa);", // inconclusive
4907                    Style));
4908 }
4909 
4910 TEST_F(FormatTest, FormatsBuilderPattern) {
4911   verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n"
4912                "    .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n"
4913                "    .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n"
4914                "    .StartsWith(\".init\", ORDER_INIT)\n"
4915                "    .StartsWith(\".fini\", ORDER_FINI)\n"
4916                "    .StartsWith(\".hash\", ORDER_HASH)\n"
4917                "    .Default(ORDER_TEXT);\n");
4918 
4919   verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n"
4920                "       aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();");
4921   verifyFormat(
4922       "aaaaaaa->aaaaaaa\n"
4923       "    ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4924       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4925       "    ->aaaaaaaa(aaaaaaaaaaaaaaa);");
4926   verifyFormat(
4927       "aaaaaaa->aaaaaaa\n"
4928       "    ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4929       "    ->aaaaaaaa(aaaaaaaaaaaaaaa);");
4930   verifyFormat(
4931       "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"
4932       "    aaaaaaaaaaaaaa);");
4933   verifyFormat(
4934       "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n"
4935       "    aaaaaa->aaaaaaaaaaaa()\n"
4936       "        ->aaaaaaaaaaaaaaaa(\n"
4937       "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4938       "        ->aaaaaaaaaaaaaaaaa();");
4939   verifyGoogleFormat(
4940       "void f() {\n"
4941       "  someo->Add((new util::filetools::Handler(dir))\n"
4942       "                 ->OnEvent1(NewPermanentCallback(\n"
4943       "                     this, &HandlerHolderClass::EventHandlerCBA))\n"
4944       "                 ->OnEvent2(NewPermanentCallback(\n"
4945       "                     this, &HandlerHolderClass::EventHandlerCBB))\n"
4946       "                 ->OnEvent3(NewPermanentCallback(\n"
4947       "                     this, &HandlerHolderClass::EventHandlerCBC))\n"
4948       "                 ->OnEvent5(NewPermanentCallback(\n"
4949       "                     this, &HandlerHolderClass::EventHandlerCBD))\n"
4950       "                 ->OnEvent6(NewPermanentCallback(\n"
4951       "                     this, &HandlerHolderClass::EventHandlerCBE)));\n"
4952       "}");
4953 
4954   verifyFormat(
4955       "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();");
4956   verifyFormat("aaaaaaaaaaaaaaa()\n"
4957                "    .aaaaaaaaaaaaaaa()\n"
4958                "    .aaaaaaaaaaaaaaa()\n"
4959                "    .aaaaaaaaaaaaaaa()\n"
4960                "    .aaaaaaaaaaaaaaa();");
4961   verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4962                "    .aaaaaaaaaaaaaaa()\n"
4963                "    .aaaaaaaaaaaaaaa()\n"
4964                "    .aaaaaaaaaaaaaaa();");
4965   verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4966                "    .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4967                "    .aaaaaaaaaaaaaaa();");
4968   verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n"
4969                "    ->aaaaaaaaaaaaaae(0)\n"
4970                "    ->aaaaaaaaaaaaaaa();");
4971 
4972   // Don't linewrap after very short segments.
4973   verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4974                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4975                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4976   verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4977                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4978                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4979   verifyFormat("aaa()\n"
4980                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4981                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4982                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4983 
4984   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4985                "    .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4986                "    .has<bbbbbbbbbbbbbbbbbbbbb>();");
4987   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4988                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
4989                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();");
4990 
4991   // Prefer not to break after empty parentheses.
4992   verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n"
4993                "    First->LastNewlineOffset);");
4994 
4995   // Prefer not to create "hanging" indents.
4996   verifyFormat(
4997       "return !soooooooooooooome_map\n"
4998       "            .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4999       "            .second;");
5000   verifyFormat(
5001       "return aaaaaaaaaaaaaaaa\n"
5002       "    .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n"
5003       "    .aaaa(aaaaaaaaaaaaaa);");
5004   // No hanging indent here.
5005   verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n"
5006                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5007   verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n"
5008                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5009   verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
5010                "    .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5011                getLLVMStyleWithColumns(60));
5012   verifyFormat("aaaaaaaaaaaaaaaaaa\n"
5013                "    .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
5014                "    .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5015                getLLVMStyleWithColumns(59));
5016   verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5017                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5018                "    .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5019 
5020   // Dont break if only closing statements before member call
5021   verifyFormat("test() {\n"
5022                "  ([]() -> {\n"
5023                "    int b = 32;\n"
5024                "    return 3;\n"
5025                "  }).foo();\n"
5026                "}");
5027   verifyFormat("test() {\n"
5028                "  (\n"
5029                "      []() -> {\n"
5030                "        int b = 32;\n"
5031                "        return 3;\n"
5032                "      },\n"
5033                "      foo, bar)\n"
5034                "      .foo();\n"
5035                "}");
5036   verifyFormat("test() {\n"
5037                "  ([]() -> {\n"
5038                "    int b = 32;\n"
5039                "    return 3;\n"
5040                "  })\n"
5041                "      .foo()\n"
5042                "      .bar();\n"
5043                "}");
5044   verifyFormat("test() {\n"
5045                "  ([]() -> {\n"
5046                "    int b = 32;\n"
5047                "    return 3;\n"
5048                "  })\n"
5049                "      .foo(\"aaaaaaaaaaaaaaaaa\"\n"
5050                "           \"bbbb\");\n"
5051                "}",
5052                getLLVMStyleWithColumns(30));
5053 }
5054 
5055 TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
5056   verifyFormat(
5057       "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
5058       "    bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
5059   verifyFormat(
5060       "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n"
5061       "    bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}");
5062 
5063   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
5064                "    ccccccccccccccccccccccccc) {\n}");
5065   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n"
5066                "    ccccccccccccccccccccccccc) {\n}");
5067 
5068   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
5069                "    ccccccccccccccccccccccccc) {\n}");
5070   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n"
5071                "    ccccccccccccccccccccccccc) {\n}");
5072 
5073   verifyFormat(
5074       "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
5075       "    ccccccccccccccccccccccccc) {\n}");
5076   verifyFormat(
5077       "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n"
5078       "    ccccccccccccccccccccccccc) {\n}");
5079 
5080   verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
5081                "       bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
5082                "       cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
5083                "       dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
5084   verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n"
5085                "       bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n"
5086                "       cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n"
5087                "       dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
5088 
5089   verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
5090                "     aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
5091                "    aaaaaaaaaaaaaaa != aa) {\n}");
5092   verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n"
5093                "     aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n"
5094                "    aaaaaaaaaaaaaaa != aa) {\n}");
5095 }
5096 
5097 TEST_F(FormatTest, BreaksAfterAssignments) {
5098   verifyFormat(
5099       "unsigned Cost =\n"
5100       "    TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
5101       "                        SI->getPointerAddressSpaceee());\n");
5102   verifyFormat(
5103       "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
5104       "    Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
5105 
5106   verifyFormat(
5107       "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n"
5108       "    aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
5109   verifyFormat("unsigned OriginalStartColumn =\n"
5110                "    SourceMgr.getSpellingColumnNumber(\n"
5111                "        Current.FormatTok.getStartOfNonWhitespace()) -\n"
5112                "    1;");
5113 }
5114 
5115 TEST_F(FormatTest, ConfigurableBreakAssignmentPenalty) {
5116   FormatStyle Style = getLLVMStyle();
5117   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5118                "    bbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccccccccccccc;",
5119                Style);
5120 
5121   Style.PenaltyBreakAssignment = 20;
5122   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
5123                "                                 cccccccccccccccccccccccccc;",
5124                Style);
5125 }
5126 
5127 TEST_F(FormatTest, AlignsAfterAssignments) {
5128   verifyFormat(
5129       "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5130       "             aaaaaaaaaaaaaaaaaaaaaaaaa;");
5131   verifyFormat(
5132       "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5133       "          aaaaaaaaaaaaaaaaaaaaaaaaa;");
5134   verifyFormat(
5135       "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5136       "           aaaaaaaaaaaaaaaaaaaaaaaaa;");
5137   verifyFormat(
5138       "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5139       "              aaaaaaaaaaaaaaaaaaaaaaaaa);");
5140   verifyFormat(
5141       "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n"
5142       "                                            aaaaaaaaaaaaaaaaaaaaaaaa +\n"
5143       "                                            aaaaaaaaaaaaaaaaaaaaaaaa;");
5144 }
5145 
5146 TEST_F(FormatTest, AlignsAfterReturn) {
5147   verifyFormat(
5148       "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5149       "       aaaaaaaaaaaaaaaaaaaaaaaaa;");
5150   verifyFormat(
5151       "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5152       "        aaaaaaaaaaaaaaaaaaaaaaaaa);");
5153   verifyFormat(
5154       "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
5155       "       aaaaaaaaaaaaaaaaaaaaaa();");
5156   verifyFormat(
5157       "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
5158       "        aaaaaaaaaaaaaaaaaaaaaa());");
5159   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5160                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5161   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5162                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
5163                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5164   verifyFormat("return\n"
5165                "    // true if code is one of a or b.\n"
5166                "    code == a || code == b;");
5167 }
5168 
5169 TEST_F(FormatTest, AlignsAfterOpenBracket) {
5170   verifyFormat(
5171       "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
5172       "                                                aaaaaaaaa aaaaaaa) {}");
5173   verifyFormat(
5174       "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
5175       "                                               aaaaaaaaaaa aaaaaaaaa);");
5176   verifyFormat(
5177       "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
5178       "                                             aaaaaaaaaaaaaaaaaaaaa));");
5179   FormatStyle Style = getLLVMStyle();
5180   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5181   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5182                "    aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",
5183                Style);
5184   verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
5185                "    aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);",
5186                Style);
5187   verifyFormat("SomeLongVariableName->someFunction(\n"
5188                "    foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));",
5189                Style);
5190   verifyFormat(
5191       "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
5192       "    aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
5193       Style);
5194   verifyFormat(
5195       "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
5196       "    aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5197       Style);
5198   verifyFormat(
5199       "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
5200       "    aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
5201       Style);
5202 
5203   verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n"
5204                "    ccccccc(aaaaaaaaaaaaaaaaa,         //\n"
5205                "        b));",
5206                Style);
5207 
5208   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5209   Style.BinPackArguments = false;
5210   Style.BinPackParameters = false;
5211   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5212                "    aaaaaaaaaaa aaaaaaaa,\n"
5213                "    aaaaaaaaa aaaaaaa,\n"
5214                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
5215                Style);
5216   verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
5217                "    aaaaaaaaaaa aaaaaaaaa,\n"
5218                "    aaaaaaaaaaa aaaaaaaaa,\n"
5219                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5220                Style);
5221   verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n"
5222                "    aaaaaaaaaaaaaaa,\n"
5223                "    aaaaaaaaaaaaaaaaaaaaa,\n"
5224                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
5225                Style);
5226   verifyFormat(
5227       "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n"
5228       "    aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
5229       Style);
5230   verifyFormat(
5231       "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n"
5232       "    aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
5233       Style);
5234   verifyFormat(
5235       "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
5236       "    aaaaaaaaaaaaaaaaaaaaa(\n"
5237       "        aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n"
5238       "    aaaaaaaaaaaaaaaa);",
5239       Style);
5240   verifyFormat(
5241       "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
5242       "    aaaaaaaaaaaaaaaaaaaaa(\n"
5243       "        aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
5244       "    aaaaaaaaaaaaaaaa);",
5245       Style);
5246 }
5247 
5248 TEST_F(FormatTest, ParenthesesAndOperandAlignment) {
5249   FormatStyle Style = getLLVMStyleWithColumns(40);
5250   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5251                "          bbbbbbbbbbbbbbbbbbbbbb);",
5252                Style);
5253   Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
5254   Style.AlignOperands = false;
5255   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5256                "          bbbbbbbbbbbbbbbbbbbbbb);",
5257                Style);
5258   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5259   Style.AlignOperands = true;
5260   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5261                "          bbbbbbbbbbbbbbbbbbbbbb);",
5262                Style);
5263   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5264   Style.AlignOperands = false;
5265   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5266                "    bbbbbbbbbbbbbbbbbbbbbb);",
5267                Style);
5268 }
5269 
5270 TEST_F(FormatTest, BreaksConditionalExpressions) {
5271   verifyFormat(
5272       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5273       "                               ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5274       "                               : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5275   verifyFormat(
5276       "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
5277       "     aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5278       "                                : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5279   verifyFormat(
5280       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5281       "                                   : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5282   verifyFormat(
5283       "aaaa(aaaaaaaaa, aaaaaaaaa,\n"
5284       "     aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5285       "             : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5286   verifyFormat(
5287       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
5288       "                                                    : aaaaaaaaaaaaa);");
5289   verifyFormat(
5290       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5291       "                   aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5292       "                                    : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5293       "                   aaaaaaaaaaaaa);");
5294   verifyFormat(
5295       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5296       "                   aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5297       "                   aaaaaaaaaaaaa);");
5298   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5299                "    ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5300                "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5301                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5302                "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5303   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5304                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5305                "           ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5306                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5307                "           : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5308                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5309                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5310   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5311                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5312                "           ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5313                "                  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5314                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5315   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5316                "    ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5317                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5318   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
5319                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5320                "        ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5321                "        : aaaaaaaaaaaaaaaa;");
5322   verifyFormat(
5323       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5324       "    ? aaaaaaaaaaaaaaa\n"
5325       "    : aaaaaaaaaaaaaaa;");
5326   verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
5327                "          aaaaaaaaa\n"
5328                "      ? b\n"
5329                "      : c);");
5330   verifyFormat("return aaaa == bbbb\n"
5331                "           // comment\n"
5332                "           ? aaaa\n"
5333                "           : bbbb;");
5334   verifyFormat("unsigned Indent =\n"
5335                "    format(TheLine.First,\n"
5336                "           IndentForLevel[TheLine.Level] >= 0\n"
5337                "               ? IndentForLevel[TheLine.Level]\n"
5338                "               : TheLine * 2,\n"
5339                "           TheLine.InPPDirective, PreviousEndOfLineColumn);",
5340                getLLVMStyleWithColumns(60));
5341   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
5342                "                  ? aaaaaaaaaaaaaaa\n"
5343                "                  : bbbbbbbbbbbbbbb //\n"
5344                "                        ? ccccccccccccccc\n"
5345                "                        : ddddddddddddddd;");
5346   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
5347                "                  ? aaaaaaaaaaaaaaa\n"
5348                "                  : (bbbbbbbbbbbbbbb //\n"
5349                "                         ? ccccccccccccccc\n"
5350                "                         : ddddddddddddddd);");
5351   verifyFormat(
5352       "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5353       "                                      ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5354       "                                            aaaaaaaaaaaaaaaaaaaaa +\n"
5355       "                                            aaaaaaaaaaaaaaaaaaaaa\n"
5356       "                                      : aaaaaaaaaa;");
5357   verifyFormat(
5358       "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5359       "                                   : aaaaaaaaaaaaaaaaaaaaaa\n"
5360       "                      : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5361 
5362   FormatStyle NoBinPacking = getLLVMStyle();
5363   NoBinPacking.BinPackArguments = false;
5364   verifyFormat(
5365       "void f() {\n"
5366       "  g(aaa,\n"
5367       "    aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
5368       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5369       "        ? aaaaaaaaaaaaaaa\n"
5370       "        : aaaaaaaaaaaaaaa);\n"
5371       "}",
5372       NoBinPacking);
5373   verifyFormat(
5374       "void f() {\n"
5375       "  g(aaa,\n"
5376       "    aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
5377       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5378       "        ?: aaaaaaaaaaaaaaa);\n"
5379       "}",
5380       NoBinPacking);
5381 
5382   verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n"
5383                "             // comment.\n"
5384                "             ccccccccccccccccccccccccccccccccccccccc\n"
5385                "                 ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5386                "                 : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);");
5387 
5388   // Assignments in conditional expressions. Apparently not uncommon :-(.
5389   verifyFormat("return a != b\n"
5390                "           // comment\n"
5391                "           ? a = b\n"
5392                "           : a = b;");
5393   verifyFormat("return a != b\n"
5394                "           // comment\n"
5395                "           ? a = a != b\n"
5396                "                     // comment\n"
5397                "                     ? a = b\n"
5398                "                     : a\n"
5399                "           : a;\n");
5400   verifyFormat("return a != b\n"
5401                "           // comment\n"
5402                "           ? a\n"
5403                "           : a = a != b\n"
5404                "                     // comment\n"
5405                "                     ? a = b\n"
5406                "                     : a;");
5407 }
5408 
5409 TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {
5410   FormatStyle Style = getLLVMStyle();
5411   Style.BreakBeforeTernaryOperators = false;
5412   Style.ColumnLimit = 70;
5413   verifyFormat(
5414       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5415       "                               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5416       "                               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5417       Style);
5418   verifyFormat(
5419       "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
5420       "     aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5421       "                                  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5422       Style);
5423   verifyFormat(
5424       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5425       "                                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5426       Style);
5427   verifyFormat(
5428       "aaaa(aaaaaaaa, aaaaaaaaaa,\n"
5429       "     aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5430       "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5431       Style);
5432   verifyFormat(
5433       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n"
5434       "                                                      aaaaaaaaaaaaa);",
5435       Style);
5436   verifyFormat(
5437       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5438       "                   aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5439       "                                      aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5440       "                   aaaaaaaaaaaaa);",
5441       Style);
5442   verifyFormat(
5443       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5444       "                   aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5445       "                   aaaaaaaaaaaaa);",
5446       Style);
5447   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5448                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5449                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
5450                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5451                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5452                Style);
5453   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5454                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5455                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5456                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
5457                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5458                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5459                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5460                Style);
5461   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5462                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n"
5463                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5464                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5465                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5466                Style);
5467   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5468                "    aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5469                "    aaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5470                Style);
5471   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
5472                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5473                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5474                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5475                Style);
5476   verifyFormat(
5477       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5478       "    aaaaaaaaaaaaaaa :\n"
5479       "    aaaaaaaaaaaaaaa;",
5480       Style);
5481   verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
5482                "          aaaaaaaaa ?\n"
5483                "      b :\n"
5484                "      c);",
5485                Style);
5486   verifyFormat("unsigned Indent =\n"
5487                "    format(TheLine.First,\n"
5488                "           IndentForLevel[TheLine.Level] >= 0 ?\n"
5489                "               IndentForLevel[TheLine.Level] :\n"
5490                "               TheLine * 2,\n"
5491                "           TheLine.InPPDirective, PreviousEndOfLineColumn);",
5492                Style);
5493   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
5494                "                  aaaaaaaaaaaaaaa :\n"
5495                "                  bbbbbbbbbbbbbbb ? //\n"
5496                "                      ccccccccccccccc :\n"
5497                "                      ddddddddddddddd;",
5498                Style);
5499   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
5500                "                  aaaaaaaaaaaaaaa :\n"
5501                "                  (bbbbbbbbbbbbbbb ? //\n"
5502                "                       ccccccccccccccc :\n"
5503                "                       ddddddddddddddd);",
5504                Style);
5505   verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5506                "            /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n"
5507                "            ccccccccccccccccccccccccccc;",
5508                Style);
5509   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5510                "           aaaaa :\n"
5511                "           bbbbbbbbbbbbbbb + cccccccccccccccc;",
5512                Style);
5513 }
5514 
5515 TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
5516   verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
5517                "     aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
5518   verifyFormat("bool a = true, b = false;");
5519 
5520   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5521                "         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
5522                "     bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
5523                "         bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
5524   verifyFormat(
5525       "bool aaaaaaaaaaaaaaaaaaaaa =\n"
5526       "         bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
5527       "     d = e && f;");
5528   verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
5529                "          c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
5530   verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
5531                "          *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
5532   verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
5533                "          ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
5534 
5535   FormatStyle Style = getGoogleStyle();
5536   Style.PointerAlignment = FormatStyle::PAS_Left;
5537   Style.DerivePointerAlignment = false;
5538   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5539                "    *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
5540                "    *b = bbbbbbbbbbbbbbbbbbb;",
5541                Style);
5542   verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
5543                "          *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;",
5544                Style);
5545   verifyFormat("vector<int*> a, b;", Style);
5546   verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style);
5547 }
5548 
5549 TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
5550   verifyFormat("arr[foo ? bar : baz];");
5551   verifyFormat("f()[foo ? bar : baz];");
5552   verifyFormat("(a + b)[foo ? bar : baz];");
5553   verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
5554 }
5555 
5556 TEST_F(FormatTest, AlignsStringLiterals) {
5557   verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
5558                "                                      \"short literal\");");
5559   verifyFormat(
5560       "looooooooooooooooooooooooongFunction(\n"
5561       "    \"short literal\"\n"
5562       "    \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
5563   verifyFormat("someFunction(\"Always break between multi-line\"\n"
5564                "             \" string literals\",\n"
5565                "             and, other, parameters);");
5566   EXPECT_EQ("fun + \"1243\" /* comment */\n"
5567             "      \"5678\";",
5568             format("fun + \"1243\" /* comment */\n"
5569                    "    \"5678\";",
5570                    getLLVMStyleWithColumns(28)));
5571   EXPECT_EQ(
5572       "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
5573       "         \"aaaaaaaaaaaaaaaaaaaaa\"\n"
5574       "         \"aaaaaaaaaaaaaaaa\";",
5575       format("aaaaaa ="
5576              "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
5577              "aaaaaaaaaaaaaaaaaaaaa\" "
5578              "\"aaaaaaaaaaaaaaaa\";"));
5579   verifyFormat("a = a + \"a\"\n"
5580                "        \"a\"\n"
5581                "        \"a\";");
5582   verifyFormat("f(\"a\", \"b\"\n"
5583                "       \"c\");");
5584 
5585   verifyFormat(
5586       "#define LL_FORMAT \"ll\"\n"
5587       "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
5588       "       \"d, ddddddddd: %\" LL_FORMAT \"d\");");
5589 
5590   verifyFormat("#define A(X)          \\\n"
5591                "  \"aaaaa\" #X \"bbbbbb\" \\\n"
5592                "  \"ccccc\"",
5593                getLLVMStyleWithColumns(23));
5594   verifyFormat("#define A \"def\"\n"
5595                "f(\"abc\" A \"ghi\"\n"
5596                "  \"jkl\");");
5597 
5598   verifyFormat("f(L\"a\"\n"
5599                "  L\"b\");");
5600   verifyFormat("#define A(X)            \\\n"
5601                "  L\"aaaaa\" #X L\"bbbbbb\" \\\n"
5602                "  L\"ccccc\"",
5603                getLLVMStyleWithColumns(25));
5604 
5605   verifyFormat("f(@\"a\"\n"
5606                "  @\"b\");");
5607   verifyFormat("NSString s = @\"a\"\n"
5608                "             @\"b\"\n"
5609                "             @\"c\";");
5610   verifyFormat("NSString s = @\"a\"\n"
5611                "              \"b\"\n"
5612                "              \"c\";");
5613 }
5614 
5615 TEST_F(FormatTest, ReturnTypeBreakingStyle) {
5616   FormatStyle Style = getLLVMStyle();
5617   // No declarations or definitions should be moved to own line.
5618   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;
5619   verifyFormat("class A {\n"
5620                "  int f() { return 1; }\n"
5621                "  int g();\n"
5622                "};\n"
5623                "int f() { return 1; }\n"
5624                "int g();\n",
5625                Style);
5626 
5627   // All declarations and definitions should have the return type moved to its
5628   // own
5629   // line.
5630   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
5631   verifyFormat("class E {\n"
5632                "  int\n"
5633                "  f() {\n"
5634                "    return 1;\n"
5635                "  }\n"
5636                "  int\n"
5637                "  g();\n"
5638                "};\n"
5639                "int\n"
5640                "f() {\n"
5641                "  return 1;\n"
5642                "}\n"
5643                "int\n"
5644                "g();\n",
5645                Style);
5646 
5647   // Top-level definitions, and no kinds of declarations should have the
5648   // return type moved to its own line.
5649   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions;
5650   verifyFormat("class B {\n"
5651                "  int f() { return 1; }\n"
5652                "  int g();\n"
5653                "};\n"
5654                "int\n"
5655                "f() {\n"
5656                "  return 1;\n"
5657                "}\n"
5658                "int g();\n",
5659                Style);
5660 
5661   // Top-level definitions and declarations should have the return type moved
5662   // to its own line.
5663   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;
5664   verifyFormat("class C {\n"
5665                "  int f() { return 1; }\n"
5666                "  int g();\n"
5667                "};\n"
5668                "int\n"
5669                "f() {\n"
5670                "  return 1;\n"
5671                "}\n"
5672                "int\n"
5673                "g();\n",
5674                Style);
5675 
5676   // All definitions should have the return type moved to its own line, but no
5677   // kinds of declarations.
5678   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
5679   verifyFormat("class D {\n"
5680                "  int\n"
5681                "  f() {\n"
5682                "    return 1;\n"
5683                "  }\n"
5684                "  int g();\n"
5685                "};\n"
5686                "int\n"
5687                "f() {\n"
5688                "  return 1;\n"
5689                "}\n"
5690                "int g();\n",
5691                Style);
5692   verifyFormat("const char *\n"
5693                "f(void) {\n" // Break here.
5694                "  return \"\";\n"
5695                "}\n"
5696                "const char *bar(void);\n", // No break here.
5697                Style);
5698   verifyFormat("template <class T>\n"
5699                "T *\n"
5700                "f(T &c) {\n" // Break here.
5701                "  return NULL;\n"
5702                "}\n"
5703                "template <class T> T *f(T &c);\n", // No break here.
5704                Style);
5705   verifyFormat("class C {\n"
5706                "  int\n"
5707                "  operator+() {\n"
5708                "    return 1;\n"
5709                "  }\n"
5710                "  int\n"
5711                "  operator()() {\n"
5712                "    return 1;\n"
5713                "  }\n"
5714                "};\n",
5715                Style);
5716   verifyFormat("void\n"
5717                "A::operator()() {}\n"
5718                "void\n"
5719                "A::operator>>() {}\n"
5720                "void\n"
5721                "A::operator+() {}\n",
5722                Style);
5723   verifyFormat("void *operator new(std::size_t s);", // No break here.
5724                Style);
5725   verifyFormat("void *\n"
5726                "operator new(std::size_t s) {}",
5727                Style);
5728   verifyFormat("void *\n"
5729                "operator delete[](void *ptr) {}",
5730                Style);
5731   Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
5732   verifyFormat("const char *\n"
5733                "f(void)\n" // Break here.
5734                "{\n"
5735                "  return \"\";\n"
5736                "}\n"
5737                "const char *bar(void);\n", // No break here.
5738                Style);
5739   verifyFormat("template <class T>\n"
5740                "T *\n"     // Problem here: no line break
5741                "f(T &c)\n" // Break here.
5742                "{\n"
5743                "  return NULL;\n"
5744                "}\n"
5745                "template <class T> T *f(T &c);\n", // No break here.
5746                Style);
5747   verifyFormat("int\n"
5748                "foo(A<bool> a)\n"
5749                "{\n"
5750                "  return a;\n"
5751                "}\n",
5752                Style);
5753   verifyFormat("int\n"
5754                "foo(A<8> a)\n"
5755                "{\n"
5756                "  return a;\n"
5757                "}\n",
5758                Style);
5759   verifyFormat("int\n"
5760                "foo(A<B<bool>, 8> a)\n"
5761                "{\n"
5762                "  return a;\n"
5763                "}\n",
5764                Style);
5765   verifyFormat("int\n"
5766                "foo(A<B<8>, bool> a)\n"
5767                "{\n"
5768                "  return a;\n"
5769                "}\n",
5770                Style);
5771   verifyFormat("int\n"
5772                "foo(A<B<bool>, bool> a)\n"
5773                "{\n"
5774                "  return a;\n"
5775                "}\n",
5776                Style);
5777   verifyFormat("int\n"
5778                "foo(A<B<8>, 8> a)\n"
5779                "{\n"
5780                "  return a;\n"
5781                "}\n",
5782                Style);
5783 
5784   Style = getGNUStyle();
5785 
5786   // Test for comments at the end of function declarations.
5787   verifyFormat("void\n"
5788                "foo (int a, /*abc*/ int b) // def\n"
5789                "{\n"
5790                "}\n",
5791                Style);
5792 
5793   verifyFormat("void\n"
5794                "foo (int a, /* abc */ int b) /* def */\n"
5795                "{\n"
5796                "}\n",
5797                Style);
5798 
5799   // Definitions that should not break after return type
5800   verifyFormat("void foo (int a, int b); // def\n", Style);
5801   verifyFormat("void foo (int a, int b); /* def */\n", Style);
5802   verifyFormat("void foo (int a, int b);\n", Style);
5803 }
5804 
5805 TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
5806   FormatStyle NoBreak = getLLVMStyle();
5807   NoBreak.AlwaysBreakBeforeMultilineStrings = false;
5808   FormatStyle Break = getLLVMStyle();
5809   Break.AlwaysBreakBeforeMultilineStrings = true;
5810   verifyFormat("aaaa = \"bbbb\"\n"
5811                "       \"cccc\";",
5812                NoBreak);
5813   verifyFormat("aaaa =\n"
5814                "    \"bbbb\"\n"
5815                "    \"cccc\";",
5816                Break);
5817   verifyFormat("aaaa(\"bbbb\"\n"
5818                "     \"cccc\");",
5819                NoBreak);
5820   verifyFormat("aaaa(\n"
5821                "    \"bbbb\"\n"
5822                "    \"cccc\");",
5823                Break);
5824   verifyFormat("aaaa(qqq, \"bbbb\"\n"
5825                "          \"cccc\");",
5826                NoBreak);
5827   verifyFormat("aaaa(qqq,\n"
5828                "     \"bbbb\"\n"
5829                "     \"cccc\");",
5830                Break);
5831   verifyFormat("aaaa(qqq,\n"
5832                "     L\"bbbb\"\n"
5833                "     L\"cccc\");",
5834                Break);
5835   verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n"
5836                "                      \"bbbb\"));",
5837                Break);
5838   verifyFormat("string s = someFunction(\n"
5839                "    \"abc\"\n"
5840                "    \"abc\");",
5841                Break);
5842 
5843   // As we break before unary operators, breaking right after them is bad.
5844   verifyFormat("string foo = abc ? \"x\"\n"
5845                "                   \"blah blah blah blah blah blah\"\n"
5846                "                 : \"y\";",
5847                Break);
5848 
5849   // Don't break if there is no column gain.
5850   verifyFormat("f(\"aaaa\"\n"
5851                "  \"bbbb\");",
5852                Break);
5853 
5854   // Treat literals with escaped newlines like multi-line string literals.
5855   EXPECT_EQ("x = \"a\\\n"
5856             "b\\\n"
5857             "c\";",
5858             format("x = \"a\\\n"
5859                    "b\\\n"
5860                    "c\";",
5861                    NoBreak));
5862   EXPECT_EQ("xxxx =\n"
5863             "    \"a\\\n"
5864             "b\\\n"
5865             "c\";",
5866             format("xxxx = \"a\\\n"
5867                    "b\\\n"
5868                    "c\";",
5869                    Break));
5870 
5871   EXPECT_EQ("NSString *const kString =\n"
5872             "    @\"aaaa\"\n"
5873             "    @\"bbbb\";",
5874             format("NSString *const kString = @\"aaaa\"\n"
5875                    "@\"bbbb\";",
5876                    Break));
5877 
5878   Break.ColumnLimit = 0;
5879   verifyFormat("const char *hello = \"hello llvm\";", Break);
5880 }
5881 
5882 TEST_F(FormatTest, AlignsPipes) {
5883   verifyFormat(
5884       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5885       "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5886       "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5887   verifyFormat(
5888       "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
5889       "                     << aaaaaaaaaaaaaaaaaaaa;");
5890   verifyFormat(
5891       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5892       "                                 << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5893   verifyFormat(
5894       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5895       "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5896   verifyFormat(
5897       "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
5898       "                \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
5899       "             << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
5900   verifyFormat(
5901       "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5902       "                                 << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5903       "         << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5904   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5905                "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5906                "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5907                "             << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
5908   verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n"
5909                "             << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);");
5910   verifyFormat(
5911       "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5912       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5913   verifyFormat(
5914       "auto Diag = diag() << aaaaaaaaaaaaaaaa(aaaaaaaaaaaa, aaaaaaaaaaaaa,\n"
5915       "                                       aaaaaaaaaaaaaaaaaaaaaaaaaa);");
5916 
5917   verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n"
5918                "             << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();");
5919   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5920                "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5921                "                    aaaaaaaaaaaaaaaaaaaaa)\n"
5922                "             << aaaaaaaaaaaaaaaaaaaaaaaaaa;");
5923   verifyFormat("LOG_IF(aaa == //\n"
5924                "       bbb)\n"
5925                "    << a << b;");
5926 
5927   // But sometimes, breaking before the first "<<" is desirable.
5928   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5929                "    << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);");
5930   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n"
5931                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5932                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5933   verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n"
5934                "    << BEF << IsTemplate << Description << E->getType();");
5935   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5936                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5937                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5938   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5939                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5940                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5941                "    << aaa;");
5942 
5943   verifyFormat(
5944       "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5945       "                    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5946 
5947   // Incomplete string literal.
5948   EXPECT_EQ("llvm::errs() << \"\n"
5949             "             << a;",
5950             format("llvm::errs() << \"\n<<a;"));
5951 
5952   verifyFormat("void f() {\n"
5953                "  CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n"
5954                "      << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n"
5955                "}");
5956 
5957   // Handle 'endl'.
5958   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n"
5959                "             << bbbbbbbbbbbbbbbbbbbbbb << endl;");
5960   verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;");
5961 
5962   // Handle '\n'.
5963   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n"
5964                "             << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
5965   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n"
5966                "             << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';");
5967   verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n"
5968                "             << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";");
5969   verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
5970 }
5971 
5972 TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) {
5973   verifyFormat("return out << \"somepacket = {\\n\"\n"
5974                "           << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
5975                "           << \" bbbb = \" << pkt.bbbb << \"\\n\"\n"
5976                "           << \" cccccc = \" << pkt.cccccc << \"\\n\"\n"
5977                "           << \" ddd = [\" << pkt.ddd << \"]\\n\"\n"
5978                "           << \"}\";");
5979 
5980   verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5981                "             << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5982                "             << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;");
5983   verifyFormat(
5984       "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
5985       "             << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
5986       "             << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
5987       "             << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
5988       "             << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
5989   verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
5990                "             << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
5991   verifyFormat(
5992       "void f() {\n"
5993       "  llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n"
5994       "               << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
5995       "}");
5996 
5997   // Breaking before the first "<<" is generally not desirable.
5998   verifyFormat(
5999       "llvm::errs()\n"
6000       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6001       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6002       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6003       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
6004       getLLVMStyleWithColumns(70));
6005   verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n"
6006                "             << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6007                "             << \"aaaaaaaaaaaaaaaaaaa: \"\n"
6008                "             << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6009                "             << \"aaaaaaaaaaaaaaaaaaa: \"\n"
6010                "             << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
6011                getLLVMStyleWithColumns(70));
6012 
6013   verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
6014                "           \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
6015                "           \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;");
6016   verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
6017                "                  \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
6018                "                  \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);");
6019   verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n"
6020                "           (aaaa + aaaa);",
6021                getLLVMStyleWithColumns(40));
6022   verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n"
6023                "                  (aaaaaaa + aaaaa));",
6024                getLLVMStyleWithColumns(40));
6025   verifyFormat(
6026       "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n"
6027       "                  SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n"
6028       "                  bbbbbbbbbbbbbbbbbbbbbbb);");
6029 }
6030 
6031 TEST_F(FormatTest, UnderstandsEquals) {
6032   verifyFormat(
6033       "aaaaaaaaaaaaaaaaa =\n"
6034       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
6035   verifyFormat(
6036       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6037       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
6038   verifyFormat(
6039       "if (a) {\n"
6040       "  f();\n"
6041       "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6042       "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
6043       "}");
6044 
6045   verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6046                "        100000000 + 10000000) {\n}");
6047 }
6048 
6049 TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
6050   verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
6051                "    .looooooooooooooooooooooooooooooooooooooongFunction();");
6052 
6053   verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
6054                "    ->looooooooooooooooooooooooooooooooooooooongFunction();");
6055 
6056   verifyFormat(
6057       "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
6058       "                                                          Parameter2);");
6059 
6060   verifyFormat(
6061       "ShortObject->shortFunction(\n"
6062       "    LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
6063       "    LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
6064 
6065   verifyFormat("loooooooooooooongFunction(\n"
6066                "    LoooooooooooooongObject->looooooooooooooooongFunction());");
6067 
6068   verifyFormat(
6069       "function(LoooooooooooooooooooooooooooooooooooongObject\n"
6070       "             ->loooooooooooooooooooooooooooooooooooooooongFunction());");
6071 
6072   verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
6073                "    .WillRepeatedly(Return(SomeValue));");
6074   verifyFormat("void f() {\n"
6075                "  EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
6076                "      .Times(2)\n"
6077                "      .WillRepeatedly(Return(SomeValue));\n"
6078                "}");
6079   verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n"
6080                "    ccccccccccccccccccccccc);");
6081   verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6082                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6083                "          .aaaaa(aaaaa),\n"
6084                "      aaaaaaaaaaaaaaaaaaaaa);");
6085   verifyFormat("void f() {\n"
6086                "  aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6087                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n"
6088                "}");
6089   verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6090                "      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6091                "    .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6092                "                        aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6093                "                        aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
6094   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6095                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6096                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6097                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
6098                "}");
6099 
6100   // Here, it is not necessary to wrap at "." or "->".
6101   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
6102                "    aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
6103   verifyFormat(
6104       "aaaaaaaaaaa->aaaaaaaaa(\n"
6105       "    aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6106       "    aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
6107 
6108   verifyFormat(
6109       "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6110       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
6111   verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
6112                "                         aaaaaaaaa()->aaaaaa()->aaaaa());");
6113   verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
6114                "                         aaaaaaaaa()->aaaaaa()->aaaaa());");
6115 
6116   verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6117                "      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6118                "    .a();");
6119 
6120   FormatStyle NoBinPacking = getLLVMStyle();
6121   NoBinPacking.BinPackParameters = false;
6122   verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
6123                "    .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
6124                "    .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
6125                "                         aaaaaaaaaaaaaaaaaaa,\n"
6126                "                         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
6127                NoBinPacking);
6128 
6129   // If there is a subsequent call, change to hanging indentation.
6130   verifyFormat(
6131       "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6132       "                         aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n"
6133       "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
6134   verifyFormat(
6135       "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6136       "    aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));");
6137   verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6138                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6139                "                 .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
6140   verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6141                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6142                "               .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
6143 }
6144 
6145 TEST_F(FormatTest, WrapsTemplateDeclarations) {
6146   verifyFormat("template <typename T>\n"
6147                "virtual void loooooooooooongFunction(int Param1, int Param2);");
6148   verifyFormat("template <typename T>\n"
6149                "// T should be one of {A, B}.\n"
6150                "virtual void loooooooooooongFunction(int Param1, int Param2);");
6151   verifyFormat(
6152       "template <typename T>\n"
6153       "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
6154   verifyFormat("template <typename T>\n"
6155                "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
6156                "       int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
6157   verifyFormat(
6158       "template <typename T>\n"
6159       "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
6160       "                                      int Paaaaaaaaaaaaaaaaaaaaram2);");
6161   verifyFormat(
6162       "template <typename T>\n"
6163       "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
6164       "                    aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
6165       "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6166   verifyFormat("template <typename T>\n"
6167                "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6168                "    int aaaaaaaaaaaaaaaaaaaaaa);");
6169   verifyFormat(
6170       "template <typename T1, typename T2 = char, typename T3 = char,\n"
6171       "          typename T4 = char>\n"
6172       "void f();");
6173   verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n"
6174                "          template <typename> class cccccccccccccccccccccc,\n"
6175                "          typename ddddddddddddd>\n"
6176                "class C {};");
6177   verifyFormat(
6178       "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
6179       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6180 
6181   verifyFormat("void f() {\n"
6182                "  a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
6183                "      a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n"
6184                "}");
6185 
6186   verifyFormat("template <typename T> class C {};");
6187   verifyFormat("template <typename T> void f();");
6188   verifyFormat("template <typename T> void f() {}");
6189   verifyFormat(
6190       "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
6191       "              aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6192       "              aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n"
6193       "    new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
6194       "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6195       "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
6196       "        bbbbbbbbbbbbbbbbbbbbbbbb);",
6197       getLLVMStyleWithColumns(72));
6198   EXPECT_EQ("static_cast<A< //\n"
6199             "    B> *>(\n"
6200             "\n"
6201             ");",
6202             format("static_cast<A<//\n"
6203                    "    B>*>(\n"
6204                    "\n"
6205                    "    );"));
6206   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6207                "    const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);");
6208 
6209   FormatStyle AlwaysBreak = getLLVMStyle();
6210   AlwaysBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes;
6211   verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);
6212   verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);
6213   verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);
6214   verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6215                "                         bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
6216                "    ccccccccccccccccccccccccccccccccccccccccccccccc);");
6217   verifyFormat("template <template <typename> class Fooooooo,\n"
6218                "          template <typename> class Baaaaaaar>\n"
6219                "struct C {};",
6220                AlwaysBreak);
6221   verifyFormat("template <typename T> // T can be A, B or C.\n"
6222                "struct C {};",
6223                AlwaysBreak);
6224   verifyFormat("template <enum E> class A {\n"
6225                "public:\n"
6226                "  E *f();\n"
6227                "};");
6228 
6229   FormatStyle NeverBreak = getLLVMStyle();
6230   NeverBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_No;
6231   verifyFormat("template <typename T> class C {};", NeverBreak);
6232   verifyFormat("template <typename T> void f();", NeverBreak);
6233   verifyFormat("template <typename T> void f() {}", NeverBreak);
6234   verifyFormat("template <typename T>\nvoid foo(aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbb) {}",
6235                NeverBreak);
6236   verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6237                "                         bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
6238                "    ccccccccccccccccccccccccccccccccccccccccccccccc);",
6239                NeverBreak);
6240   verifyFormat("template <template <typename> class Fooooooo,\n"
6241                "          template <typename> class Baaaaaaar>\n"
6242                "struct C {};",
6243                NeverBreak);
6244   verifyFormat("template <typename T> // T can be A, B or C.\n"
6245                "struct C {};",
6246                NeverBreak);
6247   verifyFormat("template <enum E> class A {\n"
6248                "public:\n"
6249                "  E *f();\n"
6250                "};", NeverBreak);
6251   NeverBreak.PenaltyBreakTemplateDeclaration = 100;
6252   verifyFormat("template <typename T> void\nfoo(aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbb) {}",
6253                NeverBreak);
6254 }
6255 
6256 TEST_F(FormatTest, WrapsTemplateDeclarationsWithComments) {
6257   FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp);
6258   Style.ColumnLimit = 60;
6259   EXPECT_EQ("// Baseline - no comments.\n"
6260             "template <\n"
6261             "    typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n"
6262             "void f() {}",
6263             format("// Baseline - no comments.\n"
6264                    "template <\n"
6265                    "    typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n"
6266                    "void f() {}",
6267                    Style));
6268 
6269   EXPECT_EQ("template <\n"
6270             "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value>  // trailing\n"
6271             "void f() {}",
6272             format("template <\n"
6273                    "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n"
6274                    "void f() {}",
6275                    Style));
6276 
6277   EXPECT_EQ(
6278       "template <\n"
6279       "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value> /* line */\n"
6280       "void f() {}",
6281       format("template <typename aaaaaaaaaa<bbbbbbbbbbbb>::value>  /* line */\n"
6282              "void f() {}",
6283              Style));
6284 
6285   EXPECT_EQ(
6286       "template <\n"
6287       "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value>  // trailing\n"
6288       "                                               // multiline\n"
6289       "void f() {}",
6290       format("template <\n"
6291              "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n"
6292              "                                              // multiline\n"
6293              "void f() {}",
6294              Style));
6295 
6296   EXPECT_EQ(
6297       "template <typename aaaaaaaaaa<\n"
6298       "    bbbbbbbbbbbb>::value>  // trailing loooong\n"
6299       "void f() {}",
6300       format(
6301           "template <\n"
6302           "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing loooong\n"
6303           "void f() {}",
6304           Style));
6305 }
6306 
6307 TEST_F(FormatTest, WrapsTemplateParameters) {
6308   FormatStyle Style = getLLVMStyle();
6309   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
6310   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
6311   verifyFormat(
6312       "template <typename... a> struct q {};\n"
6313       "extern q<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
6314       "    aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
6315       "    y;",
6316       Style);
6317   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
6318   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
6319   verifyFormat(
6320       "template <typename... a> struct r {};\n"
6321       "extern r<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
6322       "    aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
6323       "    y;",
6324       Style);
6325   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
6326   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
6327   verifyFormat(
6328       "template <typename... a> struct s {};\n"
6329       "extern s<\n"
6330       "    aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
6331       "    aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
6332       "    y;",
6333       Style);
6334   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
6335   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
6336   verifyFormat(
6337       "template <typename... a> struct t {};\n"
6338       "extern t<\n"
6339       "    aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
6340       "    aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
6341       "    y;",
6342       Style);
6343 }
6344 
6345 TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
6346   verifyFormat(
6347       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6348       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
6349   verifyFormat(
6350       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6351       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6352       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
6353 
6354   // FIXME: Should we have the extra indent after the second break?
6355   verifyFormat(
6356       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6357       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6358       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
6359 
6360   verifyFormat(
6361       "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
6362       "                    cccccccccccccccccccccccccccccccccccccccccccccc());");
6363 
6364   // Breaking at nested name specifiers is generally not desirable.
6365   verifyFormat(
6366       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6367       "    aaaaaaaaaaaaaaaaaaaaaaa);");
6368 
6369   verifyFormat(
6370       "aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n"
6371       "                   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6372       "                       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6373       "                   aaaaaaaaaaaaaaaaaaaaa);",
6374       getLLVMStyleWithColumns(74));
6375 
6376   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6377                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6378                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
6379 }
6380 
6381 TEST_F(FormatTest, UnderstandsTemplateParameters) {
6382   verifyFormat("A<int> a;");
6383   verifyFormat("A<A<A<int>>> a;");
6384   verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
6385   verifyFormat("bool x = a < 1 || 2 > a;");
6386   verifyFormat("bool x = 5 < f<int>();");
6387   verifyFormat("bool x = f<int>() > 5;");
6388   verifyFormat("bool x = 5 < a<int>::x;");
6389   verifyFormat("bool x = a < 4 ? a > 2 : false;");
6390   verifyFormat("bool x = f() ? a < 2 : a > 2;");
6391 
6392   verifyGoogleFormat("A<A<int>> a;");
6393   verifyGoogleFormat("A<A<A<int>>> a;");
6394   verifyGoogleFormat("A<A<A<A<int>>>> a;");
6395   verifyGoogleFormat("A<A<int> > a;");
6396   verifyGoogleFormat("A<A<A<int> > > a;");
6397   verifyGoogleFormat("A<A<A<A<int> > > > a;");
6398   verifyGoogleFormat("A<::A<int>> a;");
6399   verifyGoogleFormat("A<::A> a;");
6400   verifyGoogleFormat("A< ::A> a;");
6401   verifyGoogleFormat("A< ::A<int> > a;");
6402   EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
6403   EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
6404   EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle()));
6405   EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle()));
6406   EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };",
6407             format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle()));
6408 
6409   verifyFormat("A<A>> a;", getChromiumStyle(FormatStyle::LK_Cpp));
6410 
6411   verifyFormat("test >> a >> b;");
6412   verifyFormat("test << a >> b;");
6413 
6414   verifyFormat("f<int>();");
6415   verifyFormat("template <typename T> void f() {}");
6416   verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;");
6417   verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : "
6418                "sizeof(char)>::type>;");
6419   verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};");
6420   verifyFormat("f(a.operator()<A>());");
6421   verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6422                "      .template operator()<A>());",
6423                getLLVMStyleWithColumns(35));
6424 
6425   // Not template parameters.
6426   verifyFormat("return a < b && c > d;");
6427   verifyFormat("void f() {\n"
6428                "  while (a < b && c > d) {\n"
6429                "  }\n"
6430                "}");
6431   verifyFormat("template <typename... Types>\n"
6432                "typename enable_if<0 < sizeof...(Types)>::type Foo() {}");
6433 
6434   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6435                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);",
6436                getLLVMStyleWithColumns(60));
6437   verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");");
6438   verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}");
6439   verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <");
6440 }
6441 
6442 TEST_F(FormatTest, BitshiftOperatorWidth) {
6443   EXPECT_EQ("int a = 1 << 2; /* foo\n"
6444             "                   bar */",
6445             format("int    a=1<<2;  /* foo\n"
6446                    "                   bar */"));
6447 
6448   EXPECT_EQ("int b = 256 >> 1; /* foo\n"
6449             "                     bar */",
6450             format("int  b  =256>>1 ;  /* foo\n"
6451                    "                      bar */"));
6452 }
6453 
6454 TEST_F(FormatTest, UnderstandsBinaryOperators) {
6455   verifyFormat("COMPARE(a, ==, b);");
6456   verifyFormat("auto s = sizeof...(Ts) - 1;");
6457 }
6458 
6459 TEST_F(FormatTest, UnderstandsPointersToMembers) {
6460   verifyFormat("int A::*x;");
6461   verifyFormat("int (S::*func)(void *);");
6462   verifyFormat("void f() { int (S::*func)(void *); }");
6463   verifyFormat("typedef bool *(Class::*Member)() const;");
6464   verifyFormat("void f() {\n"
6465                "  (a->*f)();\n"
6466                "  a->*x;\n"
6467                "  (a.*f)();\n"
6468                "  ((*a).*f)();\n"
6469                "  a.*x;\n"
6470                "}");
6471   verifyFormat("void f() {\n"
6472                "  (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
6473                "      aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
6474                "}");
6475   verifyFormat(
6476       "(aaaaaaaaaa->*bbbbbbb)(\n"
6477       "    aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
6478   FormatStyle Style = getLLVMStyle();
6479   Style.PointerAlignment = FormatStyle::PAS_Left;
6480   verifyFormat("typedef bool* (Class::*Member)() const;", Style);
6481 }
6482 
6483 TEST_F(FormatTest, UnderstandsUnaryOperators) {
6484   verifyFormat("int a = -2;");
6485   verifyFormat("f(-1, -2, -3);");
6486   verifyFormat("a[-1] = 5;");
6487   verifyFormat("int a = 5 + -2;");
6488   verifyFormat("if (i == -1) {\n}");
6489   verifyFormat("if (i != -1) {\n}");
6490   verifyFormat("if (i > -1) {\n}");
6491   verifyFormat("if (i < -1) {\n}");
6492   verifyFormat("++(a->f());");
6493   verifyFormat("--(a->f());");
6494   verifyFormat("(a->f())++;");
6495   verifyFormat("a[42]++;");
6496   verifyFormat("if (!(a->f())) {\n}");
6497   verifyFormat("if (!+i) {\n}");
6498   verifyFormat("~&a;");
6499 
6500   verifyFormat("a-- > b;");
6501   verifyFormat("b ? -a : c;");
6502   verifyFormat("n * sizeof char16;");
6503   verifyFormat("n * alignof char16;", getGoogleStyle());
6504   verifyFormat("sizeof(char);");
6505   verifyFormat("alignof(char);", getGoogleStyle());
6506 
6507   verifyFormat("return -1;");
6508   verifyFormat("switch (a) {\n"
6509                "case -1:\n"
6510                "  break;\n"
6511                "}");
6512   verifyFormat("#define X -1");
6513   verifyFormat("#define X -kConstant");
6514 
6515   verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};");
6516   verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};");
6517 
6518   verifyFormat("int a = /* confusing comment */ -1;");
6519   // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
6520   verifyFormat("int a = i /* confusing comment */++;");
6521 }
6522 
6523 TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) {
6524   verifyFormat("if (!aaaaaaaaaa( // break\n"
6525                "        aaaaa)) {\n"
6526                "}");
6527   verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
6528                "    aaaaa));");
6529   verifyFormat("*aaa = aaaaaaa( // break\n"
6530                "    bbbbbb);");
6531 }
6532 
6533 TEST_F(FormatTest, UnderstandsOverloadedOperators) {
6534   verifyFormat("bool operator<();");
6535   verifyFormat("bool operator>();");
6536   verifyFormat("bool operator=();");
6537   verifyFormat("bool operator==();");
6538   verifyFormat("bool operator!=();");
6539   verifyFormat("int operator+();");
6540   verifyFormat("int operator++();");
6541   verifyFormat("int operator++(int) volatile noexcept;");
6542   verifyFormat("bool operator,();");
6543   verifyFormat("bool operator();");
6544   verifyFormat("bool operator()();");
6545   verifyFormat("bool operator[]();");
6546   verifyFormat("operator bool();");
6547   verifyFormat("operator int();");
6548   verifyFormat("operator void *();");
6549   verifyFormat("operator SomeType<int>();");
6550   verifyFormat("operator SomeType<int, int>();");
6551   verifyFormat("operator SomeType<SomeType<int>>();");
6552   verifyFormat("void *operator new(std::size_t size);");
6553   verifyFormat("void *operator new[](std::size_t size);");
6554   verifyFormat("void operator delete(void *ptr);");
6555   verifyFormat("void operator delete[](void *ptr);");
6556   verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
6557                "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
6558   verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n"
6559                "    aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;");
6560 
6561   verifyFormat(
6562       "ostream &operator<<(ostream &OutputStream,\n"
6563       "                    SomeReallyLongType WithSomeReallyLongValue);");
6564   verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
6565                "               const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
6566                "  return left.group < right.group;\n"
6567                "}");
6568   verifyFormat("SomeType &operator=(const SomeType &S);");
6569   verifyFormat("f.template operator()<int>();");
6570 
6571   verifyGoogleFormat("operator void*();");
6572   verifyGoogleFormat("operator SomeType<SomeType<int>>();");
6573   verifyGoogleFormat("operator ::A();");
6574 
6575   verifyFormat("using A::operator+;");
6576   verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n"
6577                "int i;");
6578 }
6579 
6580 TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
6581   verifyFormat("Deleted &operator=(const Deleted &) & = default;");
6582   verifyFormat("Deleted &operator=(const Deleted &) && = delete;");
6583   verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;");
6584   verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;");
6585   verifyFormat("Deleted &operator=(const Deleted &) &;");
6586   verifyFormat("Deleted &operator=(const Deleted &) &&;");
6587   verifyFormat("SomeType MemberFunction(const Deleted &) &;");
6588   verifyFormat("SomeType MemberFunction(const Deleted &) &&;");
6589   verifyFormat("SomeType MemberFunction(const Deleted &) && {}");
6590   verifyFormat("SomeType MemberFunction(const Deleted &) && final {}");
6591   verifyFormat("SomeType MemberFunction(const Deleted &) && override {}");
6592   verifyFormat("void Fn(T const &) const &;");
6593   verifyFormat("void Fn(T const volatile &&) const volatile &&;");
6594   verifyFormat("template <typename T>\n"
6595                "void F(T) && = delete;",
6596                getGoogleStyle());
6597 
6598   FormatStyle AlignLeft = getLLVMStyle();
6599   AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
6600   verifyFormat("void A::b() && {}", AlignLeft);
6601   verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
6602   verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
6603                AlignLeft);
6604   verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
6605   verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
6606   verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
6607   verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
6608   verifyFormat("auto Function(T) & -> void {}", AlignLeft);
6609   verifyFormat("auto Function(T) & -> void;", AlignLeft);
6610   verifyFormat("void Fn(T const&) const&;", AlignLeft);
6611   verifyFormat("void Fn(T const volatile&&) const volatile&&;", AlignLeft);
6612 
6613   FormatStyle Spaces = getLLVMStyle();
6614   Spaces.SpacesInCStyleCastParentheses = true;
6615   verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
6616   verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
6617   verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
6618   verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
6619 
6620   Spaces.SpacesInCStyleCastParentheses = false;
6621   Spaces.SpacesInParentheses = true;
6622   verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
6623   verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", Spaces);
6624   verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
6625   verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
6626 }
6627 
6628 TEST_F(FormatTest, UnderstandsNewAndDelete) {
6629   verifyFormat("void f() {\n"
6630                "  A *a = new A;\n"
6631                "  A *a = new (placement) A;\n"
6632                "  delete a;\n"
6633                "  delete (A *)a;\n"
6634                "}");
6635   verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
6636                "    typename aaaaaaaaaaaaaaaaaaaaaaaa();");
6637   verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6638                "    new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
6639                "        typename aaaaaaaaaaaaaaaaaaaaaaaa();");
6640   verifyFormat("delete[] h->p;");
6641 }
6642 
6643 TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
6644   verifyFormat("int *f(int *a) {}");
6645   verifyFormat("int main(int argc, char **argv) {}");
6646   verifyFormat("Test::Test(int b) : a(b * b) {}");
6647   verifyIndependentOfContext("f(a, *a);");
6648   verifyFormat("void g() { f(*a); }");
6649   verifyIndependentOfContext("int a = b * 10;");
6650   verifyIndependentOfContext("int a = 10 * b;");
6651   verifyIndependentOfContext("int a = b * c;");
6652   verifyIndependentOfContext("int a += b * c;");
6653   verifyIndependentOfContext("int a -= b * c;");
6654   verifyIndependentOfContext("int a *= b * c;");
6655   verifyIndependentOfContext("int a /= b * c;");
6656   verifyIndependentOfContext("int a = *b;");
6657   verifyIndependentOfContext("int a = *b * c;");
6658   verifyIndependentOfContext("int a = b * *c;");
6659   verifyIndependentOfContext("int a = b * (10);");
6660   verifyIndependentOfContext("S << b * (10);");
6661   verifyIndependentOfContext("return 10 * b;");
6662   verifyIndependentOfContext("return *b * *c;");
6663   verifyIndependentOfContext("return a & ~b;");
6664   verifyIndependentOfContext("f(b ? *c : *d);");
6665   verifyIndependentOfContext("int a = b ? *c : *d;");
6666   verifyIndependentOfContext("*b = a;");
6667   verifyIndependentOfContext("a * ~b;");
6668   verifyIndependentOfContext("a * !b;");
6669   verifyIndependentOfContext("a * +b;");
6670   verifyIndependentOfContext("a * -b;");
6671   verifyIndependentOfContext("a * ++b;");
6672   verifyIndependentOfContext("a * --b;");
6673   verifyIndependentOfContext("a[4] * b;");
6674   verifyIndependentOfContext("a[a * a] = 1;");
6675   verifyIndependentOfContext("f() * b;");
6676   verifyIndependentOfContext("a * [self dostuff];");
6677   verifyIndependentOfContext("int x = a * (a + b);");
6678   verifyIndependentOfContext("(a *)(a + b);");
6679   verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
6680   verifyIndependentOfContext("int *pa = (int *)&a;");
6681   verifyIndependentOfContext("return sizeof(int **);");
6682   verifyIndependentOfContext("return sizeof(int ******);");
6683   verifyIndependentOfContext("return (int **&)a;");
6684   verifyIndependentOfContext("f((*PointerToArray)[10]);");
6685   verifyFormat("void f(Type (*parameter)[10]) {}");
6686   verifyFormat("void f(Type (&parameter)[10]) {}");
6687   verifyGoogleFormat("return sizeof(int**);");
6688   verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
6689   verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
6690   verifyFormat("auto a = [](int **&, int ***) {};");
6691   verifyFormat("auto PointerBinding = [](const char *S) {};");
6692   verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
6693   verifyFormat("[](const decltype(*a) &value) {}");
6694   verifyFormat("decltype(a * b) F();");
6695   verifyFormat("#define MACRO() [](A *a) { return 1; }");
6696   verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
6697   verifyIndependentOfContext("typedef void (*f)(int *a);");
6698   verifyIndependentOfContext("int i{a * b};");
6699   verifyIndependentOfContext("aaa && aaa->f();");
6700   verifyIndependentOfContext("int x = ~*p;");
6701   verifyFormat("Constructor() : a(a), area(width * height) {}");
6702   verifyFormat("Constructor() : a(a), area(a, width * height) {}");
6703   verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
6704   verifyFormat("void f() { f(a, c * d); }");
6705   verifyFormat("void f() { f(new a(), c * d); }");
6706   verifyFormat("void f(const MyOverride &override);");
6707   verifyFormat("void f(const MyFinal &final);");
6708   verifyIndependentOfContext("bool a = f() && override.f();");
6709   verifyIndependentOfContext("bool a = f() && final.f();");
6710 
6711   verifyIndependentOfContext("InvalidRegions[*R] = 0;");
6712 
6713   verifyIndependentOfContext("A<int *> a;");
6714   verifyIndependentOfContext("A<int **> a;");
6715   verifyIndependentOfContext("A<int *, int *> a;");
6716   verifyIndependentOfContext("A<int *[]> a;");
6717   verifyIndependentOfContext(
6718       "const char *const p = reinterpret_cast<const char *const>(q);");
6719   verifyIndependentOfContext("A<int **, int **> a;");
6720   verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
6721   verifyFormat("for (char **a = b; *a; ++a) {\n}");
6722   verifyFormat("for (; a && b;) {\n}");
6723   verifyFormat("bool foo = true && [] { return false; }();");
6724 
6725   verifyFormat(
6726       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6727       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6728 
6729   verifyGoogleFormat("int const* a = &b;");
6730   verifyGoogleFormat("**outparam = 1;");
6731   verifyGoogleFormat("*outparam = a * b;");
6732   verifyGoogleFormat("int main(int argc, char** argv) {}");
6733   verifyGoogleFormat("A<int*> a;");
6734   verifyGoogleFormat("A<int**> a;");
6735   verifyGoogleFormat("A<int*, int*> a;");
6736   verifyGoogleFormat("A<int**, int**> a;");
6737   verifyGoogleFormat("f(b ? *c : *d);");
6738   verifyGoogleFormat("int a = b ? *c : *d;");
6739   verifyGoogleFormat("Type* t = **x;");
6740   verifyGoogleFormat("Type* t = *++*x;");
6741   verifyGoogleFormat("*++*x;");
6742   verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
6743   verifyGoogleFormat("Type* t = x++ * y;");
6744   verifyGoogleFormat(
6745       "const char* const p = reinterpret_cast<const char* const>(q);");
6746   verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
6747   verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
6748   verifyGoogleFormat("template <typename T>\n"
6749                      "void f(int i = 0, SomeType** temps = NULL);");
6750 
6751   FormatStyle Left = getLLVMStyle();
6752   Left.PointerAlignment = FormatStyle::PAS_Left;
6753   verifyFormat("x = *a(x) = *a(y);", Left);
6754   verifyFormat("for (;; *a = b) {\n}", Left);
6755   verifyFormat("return *this += 1;", Left);
6756   verifyFormat("throw *x;", Left);
6757   verifyFormat("delete *x;", Left);
6758   verifyFormat("typedef typeof(int(int, int))* MyFuncPtr;", Left);
6759   verifyFormat("[](const decltype(*a)* ptr) {}", Left);
6760   verifyFormat("typedef typeof /*comment*/ (int(int, int))* MyFuncPtr;", Left);
6761 
6762   verifyIndependentOfContext("a = *(x + y);");
6763   verifyIndependentOfContext("a = &(x + y);");
6764   verifyIndependentOfContext("*(x + y).call();");
6765   verifyIndependentOfContext("&(x + y)->call();");
6766   verifyFormat("void f() { &(*I).first; }");
6767 
6768   verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
6769   verifyFormat(
6770       "int *MyValues = {\n"
6771       "    *A, // Operator detection might be confused by the '{'\n"
6772       "    *BB // Operator detection might be confused by previous comment\n"
6773       "};");
6774 
6775   verifyIndependentOfContext("if (int *a = &b)");
6776   verifyIndependentOfContext("if (int &a = *b)");
6777   verifyIndependentOfContext("if (a & b[i])");
6778   verifyIndependentOfContext("if (a::b::c::d & b[i])");
6779   verifyIndependentOfContext("if (*b[i])");
6780   verifyIndependentOfContext("if (int *a = (&b))");
6781   verifyIndependentOfContext("while (int *a = &b)");
6782   verifyIndependentOfContext("size = sizeof *a;");
6783   verifyIndependentOfContext("if (a && (b = c))");
6784   verifyFormat("void f() {\n"
6785                "  for (const int &v : Values) {\n"
6786                "  }\n"
6787                "}");
6788   verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
6789   verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
6790   verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
6791 
6792   verifyFormat("#define A (!a * b)");
6793   verifyFormat("#define MACRO     \\\n"
6794                "  int *i = a * b; \\\n"
6795                "  void f(a *b);",
6796                getLLVMStyleWithColumns(19));
6797 
6798   verifyIndependentOfContext("A = new SomeType *[Length];");
6799   verifyIndependentOfContext("A = new SomeType *[Length]();");
6800   verifyIndependentOfContext("T **t = new T *;");
6801   verifyIndependentOfContext("T **t = new T *();");
6802   verifyGoogleFormat("A = new SomeType*[Length]();");
6803   verifyGoogleFormat("A = new SomeType*[Length];");
6804   verifyGoogleFormat("T** t = new T*;");
6805   verifyGoogleFormat("T** t = new T*();");
6806 
6807   verifyFormat("STATIC_ASSERT((a & b) == 0);");
6808   verifyFormat("STATIC_ASSERT(0 == (a & b));");
6809   verifyFormat("template <bool a, bool b> "
6810                "typename t::if<x && y>::type f() {}");
6811   verifyFormat("template <int *y> f() {}");
6812   verifyFormat("vector<int *> v;");
6813   verifyFormat("vector<int *const> v;");
6814   verifyFormat("vector<int *const **const *> v;");
6815   verifyFormat("vector<int *volatile> v;");
6816   verifyFormat("vector<a * b> v;");
6817   verifyFormat("foo<b && false>();");
6818   verifyFormat("foo<b & 1>();");
6819   verifyFormat("decltype(*::std::declval<const T &>()) void F();");
6820   verifyFormat(
6821       "template <class T, class = typename std::enable_if<\n"
6822       "                       std::is_integral<T>::value &&\n"
6823       "                       (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
6824       "void F();",
6825       getLLVMStyleWithColumns(70));
6826   verifyFormat(
6827       "template <class T,\n"
6828       "          class = typename std::enable_if<\n"
6829       "              std::is_integral<T>::value &&\n"
6830       "              (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n"
6831       "          class U>\n"
6832       "void F();",
6833       getLLVMStyleWithColumns(70));
6834   verifyFormat(
6835       "template <class T,\n"
6836       "          class = typename ::std::enable_if<\n"
6837       "              ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
6838       "void F();",
6839       getGoogleStyleWithColumns(68));
6840 
6841   verifyIndependentOfContext("MACRO(int *i);");
6842   verifyIndependentOfContext("MACRO(auto *a);");
6843   verifyIndependentOfContext("MACRO(const A *a);");
6844   verifyIndependentOfContext("MACRO(A *const a);");
6845   verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
6846   verifyFormat("void f() { f(float{1}, a * a); }");
6847   // FIXME: Is there a way to make this work?
6848   // verifyIndependentOfContext("MACRO(A *a);");
6849 
6850   verifyFormat("DatumHandle const *operator->() const { return input_; }");
6851   verifyFormat("return options != nullptr && operator==(*options);");
6852 
6853   EXPECT_EQ("#define OP(x)                                    \\\n"
6854             "  ostream &operator<<(ostream &s, const A &a) {  \\\n"
6855             "    return s << a.DebugString();                 \\\n"
6856             "  }",
6857             format("#define OP(x) \\\n"
6858                    "  ostream &operator<<(ostream &s, const A &a) { \\\n"
6859                    "    return s << a.DebugString(); \\\n"
6860                    "  }",
6861                    getLLVMStyleWithColumns(50)));
6862 
6863   // FIXME: We cannot handle this case yet; we might be able to figure out that
6864   // foo<x> d > v; doesn't make sense.
6865   verifyFormat("foo<a<b && c> d> v;");
6866 
6867   FormatStyle PointerMiddle = getLLVMStyle();
6868   PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
6869   verifyFormat("delete *x;", PointerMiddle);
6870   verifyFormat("int * x;", PointerMiddle);
6871   verifyFormat("int *[] x;", PointerMiddle);
6872   verifyFormat("template <int * y> f() {}", PointerMiddle);
6873   verifyFormat("int * f(int * a) {}", PointerMiddle);
6874   verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
6875   verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
6876   verifyFormat("A<int *> a;", PointerMiddle);
6877   verifyFormat("A<int **> a;", PointerMiddle);
6878   verifyFormat("A<int *, int *> a;", PointerMiddle);
6879   verifyFormat("A<int *[]> a;", PointerMiddle);
6880   verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
6881   verifyFormat("A = new SomeType *[Length];", PointerMiddle);
6882   verifyFormat("T ** t = new T *;", PointerMiddle);
6883 
6884   // Member function reference qualifiers aren't binary operators.
6885   verifyFormat("string // break\n"
6886                "operator()() & {}");
6887   verifyFormat("string // break\n"
6888                "operator()() && {}");
6889   verifyGoogleFormat("template <typename T>\n"
6890                      "auto x() & -> int {}");
6891 }
6892 
6893 TEST_F(FormatTest, UnderstandsAttributes) {
6894   verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
6895   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
6896                "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
6897   FormatStyle AfterType = getLLVMStyle();
6898   AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
6899   verifyFormat("__attribute__((nodebug)) void\n"
6900                "foo() {}\n",
6901                AfterType);
6902 }
6903 
6904 TEST_F(FormatTest, UnderstandsSquareAttributes) {
6905   verifyFormat("SomeType s [[unused]] (InitValue);");
6906   verifyFormat("SomeType s [[gnu::unused]] (InitValue);");
6907   verifyFormat("SomeType s [[using gnu: unused]] (InitValue);");
6908   verifyFormat("[[gsl::suppress(\"clang-tidy-check-name\")]] void f() {}");
6909   verifyFormat("void f() [[deprecated(\"so sorry\")]];");
6910   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6911                "    [[unused]] aaaaaaaaaaaaaaaaaaaaaaa(int i);");
6912 
6913   // Make sure we do not mistake attributes for array subscripts.
6914   verifyFormat("int a() {}\n"
6915                "[[unused]] int b() {}\n");
6916   verifyFormat("NSArray *arr;\n"
6917                "arr[[Foo() bar]];");
6918 
6919   // On the other hand, we still need to correctly find array subscripts.
6920   verifyFormat("int a = std::vector<int>{1, 2, 3}[0];");
6921 
6922   // Make sure we do not parse attributes as lambda introducers.
6923   FormatStyle MultiLineFunctions = getLLVMStyle();
6924   MultiLineFunctions.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
6925   verifyFormat("[[unused]] int b() {\n"
6926                "  return 42;\n"
6927                "}\n",
6928                MultiLineFunctions);
6929 }
6930 
6931 TEST_F(FormatTest, UnderstandsEllipsis) {
6932   verifyFormat("int printf(const char *fmt, ...);");
6933   verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
6934   verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
6935 
6936   FormatStyle PointersLeft = getLLVMStyle();
6937   PointersLeft.PointerAlignment = FormatStyle::PAS_Left;
6938   verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
6939 }
6940 
6941 TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
6942   EXPECT_EQ("int *a;\n"
6943             "int *a;\n"
6944             "int *a;",
6945             format("int *a;\n"
6946                    "int* a;\n"
6947                    "int *a;",
6948                    getGoogleStyle()));
6949   EXPECT_EQ("int* a;\n"
6950             "int* a;\n"
6951             "int* a;",
6952             format("int* a;\n"
6953                    "int* a;\n"
6954                    "int *a;",
6955                    getGoogleStyle()));
6956   EXPECT_EQ("int *a;\n"
6957             "int *a;\n"
6958             "int *a;",
6959             format("int *a;\n"
6960                    "int * a;\n"
6961                    "int *  a;",
6962                    getGoogleStyle()));
6963   EXPECT_EQ("auto x = [] {\n"
6964             "  int *a;\n"
6965             "  int *a;\n"
6966             "  int *a;\n"
6967             "};",
6968             format("auto x=[]{int *a;\n"
6969                    "int * a;\n"
6970                    "int *  a;};",
6971                    getGoogleStyle()));
6972 }
6973 
6974 TEST_F(FormatTest, UnderstandsRvalueReferences) {
6975   verifyFormat("int f(int &&a) {}");
6976   verifyFormat("int f(int a, char &&b) {}");
6977   verifyFormat("void f() { int &&a = b; }");
6978   verifyGoogleFormat("int f(int a, char&& b) {}");
6979   verifyGoogleFormat("void f() { int&& a = b; }");
6980 
6981   verifyIndependentOfContext("A<int &&> a;");
6982   verifyIndependentOfContext("A<int &&, int &&> a;");
6983   verifyGoogleFormat("A<int&&> a;");
6984   verifyGoogleFormat("A<int&&, int&&> a;");
6985 
6986   // Not rvalue references:
6987   verifyFormat("template <bool B, bool C> class A {\n"
6988                "  static_assert(B && C, \"Something is wrong\");\n"
6989                "};");
6990   verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
6991   verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
6992   verifyFormat("#define A(a, b) (a && b)");
6993 }
6994 
6995 TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
6996   verifyFormat("void f() {\n"
6997                "  x[aaaaaaaaa -\n"
6998                "    b] = 23;\n"
6999                "}",
7000                getLLVMStyleWithColumns(15));
7001 }
7002 
7003 TEST_F(FormatTest, FormatsCasts) {
7004   verifyFormat("Type *A = static_cast<Type *>(P);");
7005   verifyFormat("Type *A = (Type *)P;");
7006   verifyFormat("Type *A = (vector<Type *, int *>)P;");
7007   verifyFormat("int a = (int)(2.0f);");
7008   verifyFormat("int a = (int)2.0f;");
7009   verifyFormat("x[(int32)y];");
7010   verifyFormat("x = (int32)y;");
7011   verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
7012   verifyFormat("int a = (int)*b;");
7013   verifyFormat("int a = (int)2.0f;");
7014   verifyFormat("int a = (int)~0;");
7015   verifyFormat("int a = (int)++a;");
7016   verifyFormat("int a = (int)sizeof(int);");
7017   verifyFormat("int a = (int)+2;");
7018   verifyFormat("my_int a = (my_int)2.0f;");
7019   verifyFormat("my_int a = (my_int)sizeof(int);");
7020   verifyFormat("return (my_int)aaa;");
7021   verifyFormat("#define x ((int)-1)");
7022   verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
7023   verifyFormat("#define p(q) ((int *)&q)");
7024   verifyFormat("fn(a)(b) + 1;");
7025 
7026   verifyFormat("void f() { my_int a = (my_int)*b; }");
7027   verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
7028   verifyFormat("my_int a = (my_int)~0;");
7029   verifyFormat("my_int a = (my_int)++a;");
7030   verifyFormat("my_int a = (my_int)-2;");
7031   verifyFormat("my_int a = (my_int)1;");
7032   verifyFormat("my_int a = (my_int *)1;");
7033   verifyFormat("my_int a = (const my_int)-1;");
7034   verifyFormat("my_int a = (const my_int *)-1;");
7035   verifyFormat("my_int a = (my_int)(my_int)-1;");
7036   verifyFormat("my_int a = (ns::my_int)-2;");
7037   verifyFormat("case (my_int)ONE:");
7038   verifyFormat("auto x = (X)this;");
7039 
7040   // FIXME: single value wrapped with paren will be treated as cast.
7041   verifyFormat("void f(int i = (kValue)*kMask) {}");
7042 
7043   verifyFormat("{ (void)F; }");
7044 
7045   // Don't break after a cast's
7046   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7047                "    (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
7048                "                                   bbbbbbbbbbbbbbbbbbbbbb);");
7049 
7050   // These are not casts.
7051   verifyFormat("void f(int *) {}");
7052   verifyFormat("f(foo)->b;");
7053   verifyFormat("f(foo).b;");
7054   verifyFormat("f(foo)(b);");
7055   verifyFormat("f(foo)[b];");
7056   verifyFormat("[](foo) { return 4; }(bar);");
7057   verifyFormat("(*funptr)(foo)[4];");
7058   verifyFormat("funptrs[4](foo)[4];");
7059   verifyFormat("void f(int *);");
7060   verifyFormat("void f(int *) = 0;");
7061   verifyFormat("void f(SmallVector<int>) {}");
7062   verifyFormat("void f(SmallVector<int>);");
7063   verifyFormat("void f(SmallVector<int>) = 0;");
7064   verifyFormat("void f(int i = (kA * kB) & kMask) {}");
7065   verifyFormat("int a = sizeof(int) * b;");
7066   verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
7067   verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
7068   verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
7069   verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
7070 
7071   // These are not casts, but at some point were confused with casts.
7072   verifyFormat("virtual void foo(int *) override;");
7073   verifyFormat("virtual void foo(char &) const;");
7074   verifyFormat("virtual void foo(int *a, char *) const;");
7075   verifyFormat("int a = sizeof(int *) + b;");
7076   verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
7077   verifyFormat("bool b = f(g<int>) && c;");
7078   verifyFormat("typedef void (*f)(int i) func;");
7079 
7080   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
7081                "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
7082   // FIXME: The indentation here is not ideal.
7083   verifyFormat(
7084       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7085       "    [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
7086       "        [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
7087 }
7088 
7089 TEST_F(FormatTest, FormatsFunctionTypes) {
7090   verifyFormat("A<bool()> a;");
7091   verifyFormat("A<SomeType()> a;");
7092   verifyFormat("A<void (*)(int, std::string)> a;");
7093   verifyFormat("A<void *(int)>;");
7094   verifyFormat("void *(*a)(int *, SomeType *);");
7095   verifyFormat("int (*func)(void *);");
7096   verifyFormat("void f() { int (*func)(void *); }");
7097   verifyFormat("template <class CallbackClass>\n"
7098                "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
7099 
7100   verifyGoogleFormat("A<void*(int*, SomeType*)>;");
7101   verifyGoogleFormat("void* (*a)(int);");
7102   verifyGoogleFormat(
7103       "template <class CallbackClass>\n"
7104       "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
7105 
7106   // Other constructs can look somewhat like function types:
7107   verifyFormat("A<sizeof(*x)> a;");
7108   verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
7109   verifyFormat("some_var = function(*some_pointer_var)[0];");
7110   verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
7111   verifyFormat("int x = f(&h)();");
7112   verifyFormat("returnsFunction(&param1, &param2)(param);");
7113   verifyFormat("std::function<\n"
7114                "    LooooooooooongTemplatedType<\n"
7115                "        SomeType>*(\n"
7116                "        LooooooooooooooooongType type)>\n"
7117                "    function;",
7118                getGoogleStyleWithColumns(40));
7119 }
7120 
7121 TEST_F(FormatTest, FormatsPointersToArrayTypes) {
7122   verifyFormat("A (*foo_)[6];");
7123   verifyFormat("vector<int> (*foo_)[6];");
7124 }
7125 
7126 TEST_F(FormatTest, BreaksLongVariableDeclarations) {
7127   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
7128                "    LoooooooooooooooooooooooooooooooooooooooongVariable;");
7129   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
7130                "    LoooooooooooooooooooooooooooooooooooooooongVariable;");
7131   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
7132                "    *LoooooooooooooooooooooooooooooooooooooooongVariable;");
7133 
7134   // Different ways of ()-initializiation.
7135   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
7136                "    LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
7137   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
7138                "    LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
7139   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
7140                "    LoooooooooooooooooooooooooooooooooooooooongVariable({});");
7141   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
7142                "    LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
7143 
7144   // Lambdas should not confuse the variable declaration heuristic.
7145   verifyFormat("LooooooooooooooooongType\n"
7146                "    variable(nullptr, [](A *a) {});",
7147                getLLVMStyleWithColumns(40));
7148 }
7149 
7150 TEST_F(FormatTest, BreaksLongDeclarations) {
7151   verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
7152                "    AnotherNameForTheLongType;");
7153   verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
7154                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
7155   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
7156                "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
7157   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
7158                "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
7159   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
7160                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
7161   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
7162                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
7163   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
7164                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
7165   verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
7166                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
7167   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
7168                "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
7169   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
7170                "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
7171   FormatStyle Indented = getLLVMStyle();
7172   Indented.IndentWrappedFunctionNames = true;
7173   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
7174                "    LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
7175                Indented);
7176   verifyFormat(
7177       "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
7178       "    LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
7179       Indented);
7180   verifyFormat(
7181       "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
7182       "    LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
7183       Indented);
7184   verifyFormat(
7185       "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
7186       "    LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
7187       Indented);
7188 
7189   // FIXME: Without the comment, this breaks after "(".
7190   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType  // break\n"
7191                "    (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
7192                getGoogleStyle());
7193 
7194   verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
7195                "                  int LoooooooooooooooooooongParam2) {}");
7196   verifyFormat(
7197       "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
7198       "                                   SourceLocation L, IdentifierIn *II,\n"
7199       "                                   Type *T) {}");
7200   verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
7201                "ReallyReaaallyLongFunctionName(\n"
7202                "    const std::string &SomeParameter,\n"
7203                "    const SomeType<string, SomeOtherTemplateParameter>\n"
7204                "        &ReallyReallyLongParameterName,\n"
7205                "    const SomeType<string, SomeOtherTemplateParameter>\n"
7206                "        &AnotherLongParameterName) {}");
7207   verifyFormat("template <typename A>\n"
7208                "SomeLoooooooooooooooooooooongType<\n"
7209                "    typename some_namespace::SomeOtherType<A>::Type>\n"
7210                "Function() {}");
7211 
7212   verifyGoogleFormat(
7213       "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
7214       "    aaaaaaaaaaaaaaaaaaaaaaa;");
7215   verifyGoogleFormat(
7216       "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
7217       "                                   SourceLocation L) {}");
7218   verifyGoogleFormat(
7219       "some_namespace::LongReturnType\n"
7220       "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
7221       "    int first_long_parameter, int second_parameter) {}");
7222 
7223   verifyGoogleFormat("template <typename T>\n"
7224                      "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
7225                      "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
7226   verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7227                      "                   int aaaaaaaaaaaaaaaaaaaaaaa);");
7228 
7229   verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
7230                "    const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7231                "        *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
7232   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7233                "    vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
7234                "        aaaaaaaaaaaaaaaaaaaaaaaa);");
7235   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7236                "    vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
7237                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
7238                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
7239 
7240   verifyFormat("template <typename T> // Templates on own line.\n"
7241                "static int            // Some comment.\n"
7242                "MyFunction(int a);",
7243                getLLVMStyle());
7244 }
7245 
7246 TEST_F(FormatTest, FormatsArrays) {
7247   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
7248                "                         [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
7249   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
7250                "                         [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
7251   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
7252                "    aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
7253   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7254                "    [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
7255   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7256                "    [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
7257   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7258                "    [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
7259                "    [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
7260   verifyFormat(
7261       "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
7262       "             << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
7263       "                                  [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
7264   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
7265                "    .aaaaaaaaaaaaaaaaaaaaaa();");
7266 
7267   verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
7268                      "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
7269   verifyFormat(
7270       "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
7271       "                                  .aaaaaaa[0]\n"
7272       "                                  .aaaaaaaaaaaaaaaaaaaaaa();");
7273   verifyFormat("a[::b::c];");
7274 
7275   verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
7276 
7277   FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
7278   verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
7279 }
7280 
7281 TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
7282   verifyFormat("(a)->b();");
7283   verifyFormat("--a;");
7284 }
7285 
7286 TEST_F(FormatTest, HandlesIncludeDirectives) {
7287   verifyFormat("#include <string>\n"
7288                "#include <a/b/c.h>\n"
7289                "#include \"a/b/string\"\n"
7290                "#include \"string.h\"\n"
7291                "#include \"string.h\"\n"
7292                "#include <a-a>\n"
7293                "#include < path with space >\n"
7294                "#include_next <test.h>"
7295                "#include \"abc.h\" // this is included for ABC\n"
7296                "#include \"some long include\" // with a comment\n"
7297                "#include \"some very long include path\"\n"
7298                "#include <some/very/long/include/path>\n",
7299                getLLVMStyleWithColumns(35));
7300   EXPECT_EQ("#include \"a.h\"", format("#include  \"a.h\""));
7301   EXPECT_EQ("#include <a>", format("#include<a>"));
7302 
7303   verifyFormat("#import <string>");
7304   verifyFormat("#import <a/b/c.h>");
7305   verifyFormat("#import \"a/b/string\"");
7306   verifyFormat("#import \"string.h\"");
7307   verifyFormat("#import \"string.h\"");
7308   verifyFormat("#if __has_include(<strstream>)\n"
7309                "#include <strstream>\n"
7310                "#endif");
7311 
7312   verifyFormat("#define MY_IMPORT <a/b>");
7313 
7314   verifyFormat("#if __has_include(<a/b>)");
7315   verifyFormat("#if __has_include_next(<a/b>)");
7316   verifyFormat("#define F __has_include(<a/b>)");
7317   verifyFormat("#define F __has_include_next(<a/b>)");
7318 
7319   // Protocol buffer definition or missing "#".
7320   verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
7321                getLLVMStyleWithColumns(30));
7322 
7323   FormatStyle Style = getLLVMStyle();
7324   Style.AlwaysBreakBeforeMultilineStrings = true;
7325   Style.ColumnLimit = 0;
7326   verifyFormat("#import \"abc.h\"", Style);
7327 
7328   // But 'import' might also be a regular C++ namespace.
7329   verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7330                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
7331 }
7332 
7333 //===----------------------------------------------------------------------===//
7334 // Error recovery tests.
7335 //===----------------------------------------------------------------------===//
7336 
7337 TEST_F(FormatTest, IncompleteParameterLists) {
7338   FormatStyle NoBinPacking = getLLVMStyle();
7339   NoBinPacking.BinPackParameters = false;
7340   verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
7341                "                        double *min_x,\n"
7342                "                        double *max_x,\n"
7343                "                        double *min_y,\n"
7344                "                        double *max_y,\n"
7345                "                        double *min_z,\n"
7346                "                        double *max_z, ) {}",
7347                NoBinPacking);
7348 }
7349 
7350 TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
7351   verifyFormat("void f() { return; }\n42");
7352   verifyFormat("void f() {\n"
7353                "  if (0)\n"
7354                "    return;\n"
7355                "}\n"
7356                "42");
7357   verifyFormat("void f() { return }\n42");
7358   verifyFormat("void f() {\n"
7359                "  if (0)\n"
7360                "    return\n"
7361                "}\n"
7362                "42");
7363 }
7364 
7365 TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
7366   EXPECT_EQ("void f() { return }", format("void  f ( )  {  return  }"));
7367   EXPECT_EQ("void f() {\n"
7368             "  if (a)\n"
7369             "    return\n"
7370             "}",
7371             format("void  f  (  )  {  if  ( a )  return  }"));
7372   EXPECT_EQ("namespace N {\n"
7373             "void f()\n"
7374             "}",
7375             format("namespace  N  {  void f()  }"));
7376   EXPECT_EQ("namespace N {\n"
7377             "void f() {}\n"
7378             "void g()\n"
7379             "} // namespace N",
7380             format("namespace N  { void f( ) { } void g( ) }"));
7381 }
7382 
7383 TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
7384   verifyFormat("int aaaaaaaa =\n"
7385                "    // Overlylongcomment\n"
7386                "    b;",
7387                getLLVMStyleWithColumns(20));
7388   verifyFormat("function(\n"
7389                "    ShortArgument,\n"
7390                "    LoooooooooooongArgument);\n",
7391                getLLVMStyleWithColumns(20));
7392 }
7393 
7394 TEST_F(FormatTest, IncorrectAccessSpecifier) {
7395   verifyFormat("public:");
7396   verifyFormat("class A {\n"
7397                "public\n"
7398                "  void f() {}\n"
7399                "};");
7400   verifyFormat("public\n"
7401                "int qwerty;");
7402   verifyFormat("public\n"
7403                "B {}");
7404   verifyFormat("public\n"
7405                "{}");
7406   verifyFormat("public\n"
7407                "B { int x; }");
7408 }
7409 
7410 TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
7411   verifyFormat("{");
7412   verifyFormat("#})");
7413   verifyNoCrash("(/**/[:!] ?[).");
7414 }
7415 
7416 TEST_F(FormatTest, IncorrectUnbalancedBracesInMacrosWithUnicode) {
7417   // Found by oss-fuzz:
7418   // https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=8212
7419   FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp);
7420   Style.ColumnLimit = 60;
7421   verifyNoCrash(
7422       "\x23\x47\xff\x20\x28\xff\x3c\xff\x3f\xff\x20\x2f\x7b\x7a\xff\x20"
7423       "\xff\xff\xff\xca\xb5\xff\xff\xff\xff\x3a\x7b\x7d\xff\x20\xff\x20"
7424       "\xff\x74\xff\x20\x7d\x7d\xff\x7b\x3a\xff\x20\x71\xff\x20\xff\x0a",
7425       Style);
7426 }
7427 
7428 TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
7429   verifyFormat("do {\n}");
7430   verifyFormat("do {\n}\n"
7431                "f();");
7432   verifyFormat("do {\n}\n"
7433                "wheeee(fun);");
7434   verifyFormat("do {\n"
7435                "  f();\n"
7436                "}");
7437 }
7438 
7439 TEST_F(FormatTest, IncorrectCodeMissingParens) {
7440   verifyFormat("if {\n  foo;\n  foo();\n}");
7441   verifyFormat("switch {\n  foo;\n  foo();\n}");
7442   verifyIncompleteFormat("for {\n  foo;\n  foo();\n}");
7443   verifyFormat("while {\n  foo;\n  foo();\n}");
7444   verifyFormat("do {\n  foo;\n  foo();\n} while;");
7445 }
7446 
7447 TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
7448   verifyIncompleteFormat("namespace {\n"
7449                          "class Foo { Foo (\n"
7450                          "};\n"
7451                          "} // namespace");
7452 }
7453 
7454 TEST_F(FormatTest, IncorrectCodeErrorDetection) {
7455   EXPECT_EQ("{\n  {}\n", format("{\n{\n}\n"));
7456   EXPECT_EQ("{\n  {}\n", format("{\n  {\n}\n"));
7457   EXPECT_EQ("{\n  {}\n", format("{\n  {\n  }\n"));
7458   EXPECT_EQ("{\n  {}\n}\n}\n", format("{\n  {\n    }\n  }\n}\n"));
7459 
7460   EXPECT_EQ("{\n"
7461             "  {\n"
7462             "    breakme(\n"
7463             "        qwe);\n"
7464             "  }\n",
7465             format("{\n"
7466                    "    {\n"
7467                    " breakme(qwe);\n"
7468                    "}\n",
7469                    getLLVMStyleWithColumns(10)));
7470 }
7471 
7472 TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
7473   verifyFormat("int x = {\n"
7474                "    avariable,\n"
7475                "    b(alongervariable)};",
7476                getLLVMStyleWithColumns(25));
7477 }
7478 
7479 TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
7480   verifyFormat("return (a)(b){1, 2, 3};");
7481 }
7482 
7483 TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
7484   verifyFormat("vector<int> x{1, 2, 3, 4};");
7485   verifyFormat("vector<int> x{\n"
7486                "    1,\n"
7487                "    2,\n"
7488                "    3,\n"
7489                "    4,\n"
7490                "};");
7491   verifyFormat("vector<T> x{{}, {}, {}, {}};");
7492   verifyFormat("f({1, 2});");
7493   verifyFormat("auto v = Foo{-1};");
7494   verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
7495   verifyFormat("Class::Class : member{1, 2, 3} {}");
7496   verifyFormat("new vector<int>{1, 2, 3};");
7497   verifyFormat("new int[3]{1, 2, 3};");
7498   verifyFormat("new int{1};");
7499   verifyFormat("return {arg1, arg2};");
7500   verifyFormat("return {arg1, SomeType{parameter}};");
7501   verifyFormat("int count = set<int>{f(), g(), h()}.size();");
7502   verifyFormat("new T{arg1, arg2};");
7503   verifyFormat("f(MyMap[{composite, key}]);");
7504   verifyFormat("class Class {\n"
7505                "  T member = {arg1, arg2};\n"
7506                "};");
7507   verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
7508   verifyFormat("const struct A a = {.a = 1, .b = 2};");
7509   verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
7510   verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
7511   verifyFormat("int a = std::is_integral<int>{} + 0;");
7512 
7513   verifyFormat("int foo(int i) { return fo1{}(i); }");
7514   verifyFormat("int foo(int i) { return fo1{}(i); }");
7515   verifyFormat("auto i = decltype(x){};");
7516   verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
7517   verifyFormat("Node n{1, Node{1000}, //\n"
7518                "       2};");
7519   verifyFormat("Aaaa aaaaaaa{\n"
7520                "    {\n"
7521                "        aaaa,\n"
7522                "    },\n"
7523                "};");
7524   verifyFormat("class C : public D {\n"
7525                "  SomeClass SC{2};\n"
7526                "};");
7527   verifyFormat("class C : public A {\n"
7528                "  class D : public B {\n"
7529                "    void f() { int i{2}; }\n"
7530                "  };\n"
7531                "};");
7532   verifyFormat("#define A {a, a},");
7533 
7534   // Avoid breaking between equal sign and opening brace
7535   FormatStyle AvoidBreakingFirstArgument = getLLVMStyle();
7536   AvoidBreakingFirstArgument.PenaltyBreakBeforeFirstCallParameter = 200;
7537   verifyFormat("const std::unordered_map<std::string, int> MyHashTable =\n"
7538                "    {{\"aaaaaaaaaaaaaaaaaaaaa\", 0},\n"
7539                "     {\"bbbbbbbbbbbbbbbbbbbbb\", 1},\n"
7540                "     {\"ccccccccccccccccccccc\", 2}};",
7541                AvoidBreakingFirstArgument);
7542 
7543   // Binpacking only if there is no trailing comma
7544   verifyFormat("const Aaaaaa aaaaa = {aaaaaaaaaa, bbbbbbbbbb,\n"
7545                "                      cccccccccc, dddddddddd};",
7546 			   getLLVMStyleWithColumns(50));
7547   verifyFormat("const Aaaaaa aaaaa = {\n"
7548                "    aaaaaaaaaaa,\n"
7549                "    bbbbbbbbbbb,\n"
7550                "    ccccccccccc,\n"
7551                "    ddddddddddd,\n"
7552                "};", getLLVMStyleWithColumns(50));
7553 
7554   // Cases where distinguising braced lists and blocks is hard.
7555   verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
7556   verifyFormat("void f() {\n"
7557                "  return; // comment\n"
7558                "}\n"
7559                "SomeType t;");
7560   verifyFormat("void f() {\n"
7561                "  if (a) {\n"
7562                "    f();\n"
7563                "  }\n"
7564                "}\n"
7565                "SomeType t;");
7566 
7567   // In combination with BinPackArguments = false.
7568   FormatStyle NoBinPacking = getLLVMStyle();
7569   NoBinPacking.BinPackArguments = false;
7570   verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
7571                "                      bbbbb,\n"
7572                "                      ccccc,\n"
7573                "                      ddddd,\n"
7574                "                      eeeee,\n"
7575                "                      ffffff,\n"
7576                "                      ggggg,\n"
7577                "                      hhhhhh,\n"
7578                "                      iiiiii,\n"
7579                "                      jjjjjj,\n"
7580                "                      kkkkkk};",
7581                NoBinPacking);
7582   verifyFormat("const Aaaaaa aaaaa = {\n"
7583                "    aaaaa,\n"
7584                "    bbbbb,\n"
7585                "    ccccc,\n"
7586                "    ddddd,\n"
7587                "    eeeee,\n"
7588                "    ffffff,\n"
7589                "    ggggg,\n"
7590                "    hhhhhh,\n"
7591                "    iiiiii,\n"
7592                "    jjjjjj,\n"
7593                "    kkkkkk,\n"
7594                "};",
7595                NoBinPacking);
7596   verifyFormat(
7597       "const Aaaaaa aaaaa = {\n"
7598       "    aaaaa,  bbbbb,  ccccc,  ddddd,  eeeee,  ffffff, ggggg, hhhhhh,\n"
7599       "    iiiiii, jjjjjj, kkkkkk, aaaaa,  bbbbb,  ccccc,  ddddd, eeeee,\n"
7600       "    ffffff, ggggg,  hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
7601       "};",
7602       NoBinPacking);
7603 
7604   // FIXME: The alignment of these trailing comments might be bad. Then again,
7605   // this might be utterly useless in real code.
7606   verifyFormat("Constructor::Constructor()\n"
7607                "    : some_value{         //\n"
7608                "                 aaaaaaa, //\n"
7609                "                 bbbbbbb} {}");
7610 
7611   // In braced lists, the first comment is always assumed to belong to the
7612   // first element. Thus, it can be moved to the next or previous line as
7613   // appropriate.
7614   EXPECT_EQ("function({// First element:\n"
7615             "          1,\n"
7616             "          // Second element:\n"
7617             "          2});",
7618             format("function({\n"
7619                    "    // First element:\n"
7620                    "    1,\n"
7621                    "    // Second element:\n"
7622                    "    2});"));
7623   EXPECT_EQ("std::vector<int> MyNumbers{\n"
7624             "    // First element:\n"
7625             "    1,\n"
7626             "    // Second element:\n"
7627             "    2};",
7628             format("std::vector<int> MyNumbers{// First element:\n"
7629                    "                           1,\n"
7630                    "                           // Second element:\n"
7631                    "                           2};",
7632                    getLLVMStyleWithColumns(30)));
7633   // A trailing comma should still lead to an enforced line break and no
7634   // binpacking.
7635   EXPECT_EQ("vector<int> SomeVector = {\n"
7636             "    // aaa\n"
7637             "    1,\n"
7638             "    2,\n"
7639             "};",
7640             format("vector<int> SomeVector = { // aaa\n"
7641                    "    1, 2, };"));
7642 
7643   FormatStyle ExtraSpaces = getLLVMStyle();
7644   ExtraSpaces.Cpp11BracedListStyle = false;
7645   ExtraSpaces.ColumnLimit = 75;
7646   verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
7647   verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
7648   verifyFormat("f({ 1, 2 });", ExtraSpaces);
7649   verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
7650   verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
7651   verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
7652   verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
7653   verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
7654   verifyFormat("return { arg1, arg2 };", ExtraSpaces);
7655   verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
7656   verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
7657   verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
7658   verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
7659   verifyFormat("class Class {\n"
7660                "  T member = { arg1, arg2 };\n"
7661                "};",
7662                ExtraSpaces);
7663   verifyFormat(
7664       "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7665       "                                 aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
7666       "                  : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
7667       "                                 bbbbbbbbbbbbbbbbbbbb, bbbbb };",
7668       ExtraSpaces);
7669   verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
7670   verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
7671                ExtraSpaces);
7672   verifyFormat(
7673       "someFunction(OtherParam,\n"
7674       "             BracedList{ // comment 1 (Forcing interesting break)\n"
7675       "                         param1, param2,\n"
7676       "                         // comment 2\n"
7677       "                         param3, param4 });",
7678       ExtraSpaces);
7679   verifyFormat(
7680       "std::this_thread::sleep_for(\n"
7681       "    std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
7682       ExtraSpaces);
7683   verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n"
7684                "    aaaaaaa,\n"
7685                "    aaaaaaaaaa,\n"
7686                "    aaaaa,\n"
7687                "    aaaaaaaaaaaaaaa,\n"
7688                "    aaa,\n"
7689                "    aaaaaaaaaa,\n"
7690                "    a,\n"
7691                "    aaaaaaaaaaaaaaaaaaaaa,\n"
7692                "    aaaaaaaaaaaa,\n"
7693                "    aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
7694                "    aaaaaaa,\n"
7695                "    a};");
7696   verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
7697   verifyFormat("const struct A a = { .a = 1, .b = 2 };", ExtraSpaces);
7698   verifyFormat("const struct A a = { [0] = 1, [1] = 2 };", ExtraSpaces);
7699 
7700   // Avoid breaking between initializer/equal sign and opening brace
7701   ExtraSpaces.PenaltyBreakBeforeFirstCallParameter = 200;
7702   verifyFormat("const std::unordered_map<std::string, int> MyHashTable = {\n"
7703                "  { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n"
7704                "  { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n"
7705                "  { \"ccccccccccccccccccccc\", 2 }\n"
7706                "};",
7707                ExtraSpaces);
7708   verifyFormat("const std::unordered_map<std::string, int> MyHashTable{\n"
7709                "  { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n"
7710                "  { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n"
7711                "  { \"ccccccccccccccccccccc\", 2 }\n"
7712                "};",
7713                ExtraSpaces);
7714 
7715   FormatStyle SpaceBeforeBrace = getLLVMStyle();
7716   SpaceBeforeBrace.SpaceBeforeCpp11BracedList = true;
7717   verifyFormat("vector<int> x {1, 2, 3, 4};", SpaceBeforeBrace);
7718   verifyFormat("f({}, {{}, {}}, MyMap[{k, v}]);", SpaceBeforeBrace);
7719 }
7720 
7721 TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
7722   verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7723                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7724                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7725                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7726                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7727                "                 1, 22, 333, 4444, 55555, 666666, 7777777};");
7728   verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777, //\n"
7729                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7730                "                 1, 22, 333, 4444, 55555, //\n"
7731                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7732                "                 1, 22, 333, 4444, 55555, 666666, 7777777};");
7733   verifyFormat(
7734       "vector<int> x = {1,       22, 333, 4444, 55555, 666666, 7777777,\n"
7735       "                 1,       22, 333, 4444, 55555, 666666, 7777777,\n"
7736       "                 1,       22, 333, 4444, 55555, 666666, // comment\n"
7737       "                 7777777, 1,  22,  333,  4444,  55555,  666666,\n"
7738       "                 7777777, 1,  22,  333,  4444,  55555,  666666,\n"
7739       "                 7777777, 1,  22,  333,  4444,  55555,  666666,\n"
7740       "                 7777777};");
7741   verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
7742                "    X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7743                "    X86::R8,  X86::R9,  X86::R10, X86::R11, 0};");
7744   verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
7745                "    X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7746                "    // Separating comment.\n"
7747                "    X86::R8, X86::R9, X86::R10, X86::R11, 0};");
7748   verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
7749                "    // Leading comment\n"
7750                "    X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7751                "    X86::R8,  X86::R9,  X86::R10, X86::R11, 0};");
7752   verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7753                "                 1, 1, 1, 1};",
7754                getLLVMStyleWithColumns(39));
7755   verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7756                "                 1, 1, 1, 1};",
7757                getLLVMStyleWithColumns(38));
7758   verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
7759                "    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
7760                getLLVMStyleWithColumns(43));
7761   verifyFormat(
7762       "static unsigned SomeValues[10][3] = {\n"
7763       "    {1, 4, 0},  {4, 9, 0},  {4, 5, 9},  {8, 5, 4}, {1, 8, 4},\n"
7764       "    {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
7765   verifyFormat("static auto fields = new vector<string>{\n"
7766                "    \"aaaaaaaaaaaaa\",\n"
7767                "    \"aaaaaaaaaaaaa\",\n"
7768                "    \"aaaaaaaaaaaa\",\n"
7769                "    \"aaaaaaaaaaaaaa\",\n"
7770                "    \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
7771                "    \"aaaaaaaaaaaa\",\n"
7772                "    \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
7773                "};");
7774   verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
7775   verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
7776                "                 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
7777                "                 3, cccccccccccccccccccccc};",
7778                getLLVMStyleWithColumns(60));
7779 
7780   // Trailing commas.
7781   verifyFormat("vector<int> x = {\n"
7782                "    1, 1, 1, 1, 1, 1, 1, 1,\n"
7783                "};",
7784                getLLVMStyleWithColumns(39));
7785   verifyFormat("vector<int> x = {\n"
7786                "    1, 1, 1, 1, 1, 1, 1, 1, //\n"
7787                "};",
7788                getLLVMStyleWithColumns(39));
7789   verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7790                "                 1, 1, 1, 1,\n"
7791                "                 /**/ /**/};",
7792                getLLVMStyleWithColumns(39));
7793 
7794   // Trailing comment in the first line.
7795   verifyFormat("vector<int> iiiiiiiiiiiiiii = {                      //\n"
7796                "    1111111111, 2222222222, 33333333333, 4444444444, //\n"
7797                "    111111111,  222222222,  3333333333,  444444444,  //\n"
7798                "    11111111,   22222222,   333333333,   44444444};");
7799   // Trailing comment in the last line.
7800   verifyFormat("int aaaaa[] = {\n"
7801                "    1, 2, 3, // comment\n"
7802                "    4, 5, 6  // comment\n"
7803                "};");
7804 
7805   // With nested lists, we should either format one item per line or all nested
7806   // lists one on line.
7807   // FIXME: For some nested lists, we can do better.
7808   verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
7809                "        {aaaaaaaaaaaaaaaaaaa},\n"
7810                "        {aaaaaaaaaaaaaaaaaaaaa},\n"
7811                "        {aaaaaaaaaaaaaaaaa}};",
7812                getLLVMStyleWithColumns(60));
7813   verifyFormat(
7814       "SomeStruct my_struct_array = {\n"
7815       "    {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
7816       "     aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
7817       "    {aaa, aaa},\n"
7818       "    {aaa, aaa},\n"
7819       "    {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
7820       "    {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
7821       "     aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
7822 
7823   // No column layout should be used here.
7824   verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
7825                "                   bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
7826 
7827   verifyNoCrash("a<,");
7828 
7829   // No braced initializer here.
7830   verifyFormat("void f() {\n"
7831                "  struct Dummy {};\n"
7832                "  f(v);\n"
7833                "}");
7834 
7835   // Long lists should be formatted in columns even if they are nested.
7836   verifyFormat(
7837       "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7838       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7839       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7840       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7841       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7842       "                          1, 22, 333, 4444, 55555, 666666, 7777777});");
7843 
7844   // Allow "single-column" layout even if that violates the column limit. There
7845   // isn't going to be a better way.
7846   verifyFormat("std::vector<int> a = {\n"
7847                "    aaaaaaaa,\n"
7848                "    aaaaaaaa,\n"
7849                "    aaaaaaaa,\n"
7850                "    aaaaaaaa,\n"
7851                "    aaaaaaaaaa,\n"
7852                "    aaaaaaaa,\n"
7853                "    aaaaaaaaaaaaaaaaaaaaaaaaaaa};",
7854                getLLVMStyleWithColumns(30));
7855   verifyFormat("vector<int> aaaa = {\n"
7856                "    aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7857                "    aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7858                "    aaaaaa.aaaaaaa,\n"
7859                "    aaaaaa.aaaaaaa,\n"
7860                "    aaaaaa.aaaaaaa,\n"
7861                "    aaaaaa.aaaaaaa,\n"
7862                "};");
7863 
7864   // Don't create hanging lists.
7865   verifyFormat("someFunction(Param, {List1, List2,\n"
7866                "                     List3});",
7867                getLLVMStyleWithColumns(35));
7868   verifyFormat("someFunction(Param, Param,\n"
7869                "             {List1, List2,\n"
7870                "              List3});",
7871                getLLVMStyleWithColumns(35));
7872   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n"
7873                "                               aaaaaaaaaaaaaaaaaaaaaaa);");
7874 }
7875 
7876 TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
7877   FormatStyle DoNotMerge = getLLVMStyle();
7878   DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
7879 
7880   verifyFormat("void f() { return 42; }");
7881   verifyFormat("void f() {\n"
7882                "  return 42;\n"
7883                "}",
7884                DoNotMerge);
7885   verifyFormat("void f() {\n"
7886                "  // Comment\n"
7887                "}");
7888   verifyFormat("{\n"
7889                "#error {\n"
7890                "  int a;\n"
7891                "}");
7892   verifyFormat("{\n"
7893                "  int a;\n"
7894                "#error {\n"
7895                "}");
7896   verifyFormat("void f() {} // comment");
7897   verifyFormat("void f() { int a; } // comment");
7898   verifyFormat("void f() {\n"
7899                "} // comment",
7900                DoNotMerge);
7901   verifyFormat("void f() {\n"
7902                "  int a;\n"
7903                "} // comment",
7904                DoNotMerge);
7905   verifyFormat("void f() {\n"
7906                "} // comment",
7907                getLLVMStyleWithColumns(15));
7908 
7909   verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
7910   verifyFormat("void f() {\n  return 42;\n}", getLLVMStyleWithColumns(22));
7911 
7912   verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
7913   verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
7914   verifyFormat("class C {\n"
7915                "  C()\n"
7916                "      : iiiiiiii(nullptr),\n"
7917                "        kkkkkkk(nullptr),\n"
7918                "        mmmmmmm(nullptr),\n"
7919                "        nnnnnnn(nullptr) {}\n"
7920                "};",
7921                getGoogleStyle());
7922 
7923   FormatStyle NoColumnLimit = getLLVMStyle();
7924   NoColumnLimit.ColumnLimit = 0;
7925   EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
7926   EXPECT_EQ("class C {\n"
7927             "  A() : b(0) {}\n"
7928             "};",
7929             format("class C{A():b(0){}};", NoColumnLimit));
7930   EXPECT_EQ("A()\n"
7931             "    : b(0) {\n"
7932             "}",
7933             format("A()\n:b(0)\n{\n}", NoColumnLimit));
7934 
7935   FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
7936   DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
7937       FormatStyle::SFS_None;
7938   EXPECT_EQ("A()\n"
7939             "    : b(0) {\n"
7940             "}",
7941             format("A():b(0){}", DoNotMergeNoColumnLimit));
7942   EXPECT_EQ("A()\n"
7943             "    : b(0) {\n"
7944             "}",
7945             format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
7946 
7947   verifyFormat("#define A          \\\n"
7948                "  void f() {       \\\n"
7949                "    int i;         \\\n"
7950                "  }",
7951                getLLVMStyleWithColumns(20));
7952   verifyFormat("#define A           \\\n"
7953                "  void f() { int i; }",
7954                getLLVMStyleWithColumns(21));
7955   verifyFormat("#define A            \\\n"
7956                "  void f() {         \\\n"
7957                "    int i;           \\\n"
7958                "  }                  \\\n"
7959                "  int j;",
7960                getLLVMStyleWithColumns(22));
7961   verifyFormat("#define A             \\\n"
7962                "  void f() { int i; } \\\n"
7963                "  int j;",
7964                getLLVMStyleWithColumns(23));
7965 }
7966 
7967 TEST_F(FormatTest, PullEmptyFunctionDefinitionsIntoSingleLine) {
7968   FormatStyle MergeEmptyOnly = getLLVMStyle();
7969   MergeEmptyOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
7970   verifyFormat("class C {\n"
7971                "  int f() {}\n"
7972                "};",
7973                MergeEmptyOnly);
7974   verifyFormat("class C {\n"
7975                "  int f() {\n"
7976                "    return 42;\n"
7977                "  }\n"
7978                "};",
7979                MergeEmptyOnly);
7980   verifyFormat("int f() {}", MergeEmptyOnly);
7981   verifyFormat("int f() {\n"
7982                "  return 42;\n"
7983                "}",
7984                MergeEmptyOnly);
7985 
7986   // Also verify behavior when BraceWrapping.AfterFunction = true
7987   MergeEmptyOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
7988   MergeEmptyOnly.BraceWrapping.AfterFunction = true;
7989   verifyFormat("int f() {}", MergeEmptyOnly);
7990   verifyFormat("class C {\n"
7991                "  int f() {}\n"
7992                "};",
7993                MergeEmptyOnly);
7994 }
7995 
7996 TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
7997   FormatStyle MergeInlineOnly = getLLVMStyle();
7998   MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
7999   verifyFormat("class C {\n"
8000                "  int f() { return 42; }\n"
8001                "};",
8002                MergeInlineOnly);
8003   verifyFormat("int f() {\n"
8004                "  return 42;\n"
8005                "}",
8006                MergeInlineOnly);
8007 
8008   // SFS_Inline implies SFS_Empty
8009   verifyFormat("class C {\n"
8010                "  int f() {}\n"
8011                "};",
8012                MergeInlineOnly);
8013   verifyFormat("int f() {}", MergeInlineOnly);
8014 
8015   // Also verify behavior when BraceWrapping.AfterFunction = true
8016   MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
8017   MergeInlineOnly.BraceWrapping.AfterFunction = true;
8018   verifyFormat("class C {\n"
8019                "  int f() { return 42; }\n"
8020                "};",
8021                MergeInlineOnly);
8022   verifyFormat("int f()\n"
8023                "{\n"
8024                "  return 42;\n"
8025                "}",
8026                MergeInlineOnly);
8027 
8028   // SFS_Inline implies SFS_Empty
8029   verifyFormat("int f() {}", MergeInlineOnly);
8030   verifyFormat("class C {\n"
8031                "  int f() {}\n"
8032                "};",
8033                MergeInlineOnly);
8034 }
8035 
8036 TEST_F(FormatTest, PullInlineOnlyFunctionDefinitionsIntoSingleLine) {
8037   FormatStyle MergeInlineOnly = getLLVMStyle();
8038   MergeInlineOnly.AllowShortFunctionsOnASingleLine =
8039       FormatStyle::SFS_InlineOnly;
8040   verifyFormat("class C {\n"
8041                "  int f() { return 42; }\n"
8042                "};",
8043                MergeInlineOnly);
8044   verifyFormat("int f() {\n"
8045                "  return 42;\n"
8046                "}",
8047                MergeInlineOnly);
8048 
8049   // SFS_InlineOnly does not imply SFS_Empty
8050   verifyFormat("class C {\n"
8051                "  int f() {}\n"
8052                "};",
8053                MergeInlineOnly);
8054   verifyFormat("int f() {\n"
8055                "}",
8056                MergeInlineOnly);
8057 
8058   // Also verify behavior when BraceWrapping.AfterFunction = true
8059   MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
8060   MergeInlineOnly.BraceWrapping.AfterFunction = true;
8061   verifyFormat("class C {\n"
8062                "  int f() { return 42; }\n"
8063                "};",
8064                MergeInlineOnly);
8065   verifyFormat("int f()\n"
8066                "{\n"
8067                "  return 42;\n"
8068                "}",
8069                MergeInlineOnly);
8070 
8071   // SFS_InlineOnly does not imply SFS_Empty
8072   verifyFormat("int f()\n"
8073                "{\n"
8074                "}",
8075                MergeInlineOnly);
8076   verifyFormat("class C {\n"
8077                "  int f() {}\n"
8078                "};",
8079                MergeInlineOnly);
8080 }
8081 
8082 TEST_F(FormatTest, SplitEmptyFunction) {
8083   FormatStyle Style = getLLVMStyle();
8084   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
8085   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
8086   Style.BraceWrapping.AfterFunction = true;
8087   Style.BraceWrapping.SplitEmptyFunction = false;
8088   Style.ColumnLimit = 40;
8089 
8090   verifyFormat("int f()\n"
8091                "{}",
8092                Style);
8093   verifyFormat("int f()\n"
8094                "{\n"
8095                "  return 42;\n"
8096                "}",
8097                Style);
8098   verifyFormat("int f()\n"
8099                "{\n"
8100                "  // some comment\n"
8101                "}",
8102                Style);
8103 
8104   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
8105   verifyFormat("int f() {}", Style);
8106   verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
8107                "{}",
8108                Style);
8109   verifyFormat("int f()\n"
8110                "{\n"
8111                "  return 0;\n"
8112                "}",
8113                Style);
8114 
8115   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
8116   verifyFormat("class Foo {\n"
8117                "  int f() {}\n"
8118                "};\n",
8119                Style);
8120   verifyFormat("class Foo {\n"
8121                "  int f() { return 0; }\n"
8122                "};\n",
8123                Style);
8124   verifyFormat("class Foo {\n"
8125                "  int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
8126                "  {}\n"
8127                "};\n",
8128                Style);
8129   verifyFormat("class Foo {\n"
8130                "  int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
8131                "  {\n"
8132                "    return 0;\n"
8133                "  }\n"
8134                "};\n",
8135                Style);
8136 
8137   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
8138   verifyFormat("int f() {}", Style);
8139   verifyFormat("int f() { return 0; }", Style);
8140   verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
8141                "{}",
8142                Style);
8143   verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
8144                "{\n"
8145                "  return 0;\n"
8146                "}",
8147                Style);
8148 }
8149 TEST_F(FormatTest, KeepShortFunctionAfterPPElse) {
8150   FormatStyle Style = getLLVMStyle();
8151   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
8152   verifyFormat("#ifdef A\n"
8153                "int f() {}\n"
8154                "#else\n"
8155                "int g() {}\n"
8156                "#endif",
8157                Style);
8158 }
8159 
8160 TEST_F(FormatTest, SplitEmptyClass) {
8161   FormatStyle Style = getLLVMStyle();
8162   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
8163   Style.BraceWrapping.AfterClass = true;
8164   Style.BraceWrapping.SplitEmptyRecord = false;
8165 
8166   verifyFormat("class Foo\n"
8167                "{};",
8168                Style);
8169   verifyFormat("/* something */ class Foo\n"
8170                "{};",
8171                Style);
8172   verifyFormat("template <typename X> class Foo\n"
8173                "{};",
8174                Style);
8175   verifyFormat("class Foo\n"
8176                "{\n"
8177                "  Foo();\n"
8178                "};",
8179                Style);
8180   verifyFormat("typedef class Foo\n"
8181                "{\n"
8182                "} Foo_t;",
8183                Style);
8184 }
8185 
8186 TEST_F(FormatTest, SplitEmptyStruct) {
8187   FormatStyle Style = getLLVMStyle();
8188   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
8189   Style.BraceWrapping.AfterStruct = true;
8190   Style.BraceWrapping.SplitEmptyRecord = false;
8191 
8192   verifyFormat("struct Foo\n"
8193                "{};",
8194                Style);
8195   verifyFormat("/* something */ struct Foo\n"
8196                "{};",
8197                Style);
8198   verifyFormat("template <typename X> struct Foo\n"
8199                "{};",
8200                Style);
8201   verifyFormat("struct Foo\n"
8202                "{\n"
8203                "  Foo();\n"
8204                "};",
8205                Style);
8206   verifyFormat("typedef struct Foo\n"
8207                "{\n"
8208                "} Foo_t;",
8209                Style);
8210   //typedef struct Bar {} Bar_t;
8211 }
8212 
8213 TEST_F(FormatTest, SplitEmptyUnion) {
8214   FormatStyle Style = getLLVMStyle();
8215   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
8216   Style.BraceWrapping.AfterUnion = true;
8217   Style.BraceWrapping.SplitEmptyRecord = false;
8218 
8219   verifyFormat("union Foo\n"
8220                "{};",
8221                Style);
8222   verifyFormat("/* something */ union Foo\n"
8223                "{};",
8224                Style);
8225   verifyFormat("union Foo\n"
8226                "{\n"
8227                "  A,\n"
8228                "};",
8229                Style);
8230   verifyFormat("typedef union Foo\n"
8231                "{\n"
8232                "} Foo_t;",
8233                Style);
8234 }
8235 
8236 TEST_F(FormatTest, SplitEmptyNamespace) {
8237   FormatStyle Style = getLLVMStyle();
8238   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
8239   Style.BraceWrapping.AfterNamespace = true;
8240   Style.BraceWrapping.SplitEmptyNamespace = false;
8241 
8242   verifyFormat("namespace Foo\n"
8243                "{};",
8244                Style);
8245   verifyFormat("/* something */ namespace Foo\n"
8246                "{};",
8247                Style);
8248   verifyFormat("inline namespace Foo\n"
8249                "{};",
8250                Style);
8251   verifyFormat("/* something */ inline namespace Foo\n"
8252                "{};",
8253                Style);
8254   verifyFormat("export namespace Foo\n"
8255                "{};",
8256                Style);
8257   verifyFormat("namespace Foo\n"
8258                "{\n"
8259                "void Bar();\n"
8260                "};",
8261                Style);
8262 }
8263 
8264 TEST_F(FormatTest, NeverMergeShortRecords) {
8265   FormatStyle Style = getLLVMStyle();
8266 
8267   verifyFormat("class Foo {\n"
8268                "  Foo();\n"
8269                "};",
8270                Style);
8271   verifyFormat("typedef class Foo {\n"
8272                "  Foo();\n"
8273                "} Foo_t;",
8274                Style);
8275   verifyFormat("struct Foo {\n"
8276                "  Foo();\n"
8277                "};",
8278                Style);
8279   verifyFormat("typedef struct Foo {\n"
8280                "  Foo();\n"
8281                "} Foo_t;",
8282                Style);
8283   verifyFormat("union Foo {\n"
8284                "  A,\n"
8285                "};",
8286                Style);
8287   verifyFormat("typedef union Foo {\n"
8288                "  A,\n"
8289                "} Foo_t;",
8290                Style);
8291   verifyFormat("namespace Foo {\n"
8292                "void Bar();\n"
8293                "};",
8294                Style);
8295 
8296   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
8297   Style.BraceWrapping.AfterClass = true;
8298   Style.BraceWrapping.AfterStruct = true;
8299   Style.BraceWrapping.AfterUnion = true;
8300   Style.BraceWrapping.AfterNamespace = true;
8301   verifyFormat("class Foo\n"
8302                "{\n"
8303                "  Foo();\n"
8304                "};",
8305                Style);
8306   verifyFormat("typedef class Foo\n"
8307                "{\n"
8308                "  Foo();\n"
8309                "} Foo_t;",
8310                Style);
8311   verifyFormat("struct Foo\n"
8312                "{\n"
8313                "  Foo();\n"
8314                "};",
8315                Style);
8316   verifyFormat("typedef struct Foo\n"
8317                "{\n"
8318                "  Foo();\n"
8319                "} Foo_t;",
8320                Style);
8321   verifyFormat("union Foo\n"
8322                "{\n"
8323                "  A,\n"
8324                "};",
8325                Style);
8326   verifyFormat("typedef union Foo\n"
8327                "{\n"
8328                "  A,\n"
8329                "} Foo_t;",
8330                Style);
8331   verifyFormat("namespace Foo\n"
8332                "{\n"
8333                "void Bar();\n"
8334                "};",
8335                Style);
8336 }
8337 
8338 TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
8339   // Elaborate type variable declarations.
8340   verifyFormat("struct foo a = {bar};\nint n;");
8341   verifyFormat("class foo a = {bar};\nint n;");
8342   verifyFormat("union foo a = {bar};\nint n;");
8343 
8344   // Elaborate types inside function definitions.
8345   verifyFormat("struct foo f() {}\nint n;");
8346   verifyFormat("class foo f() {}\nint n;");
8347   verifyFormat("union foo f() {}\nint n;");
8348 
8349   // Templates.
8350   verifyFormat("template <class X> void f() {}\nint n;");
8351   verifyFormat("template <struct X> void f() {}\nint n;");
8352   verifyFormat("template <union X> void f() {}\nint n;");
8353 
8354   // Actual definitions...
8355   verifyFormat("struct {\n} n;");
8356   verifyFormat(
8357       "template <template <class T, class Y>, class Z> class X {\n} n;");
8358   verifyFormat("union Z {\n  int n;\n} x;");
8359   verifyFormat("class MACRO Z {\n} n;");
8360   verifyFormat("class MACRO(X) Z {\n} n;");
8361   verifyFormat("class __attribute__(X) Z {\n} n;");
8362   verifyFormat("class __declspec(X) Z {\n} n;");
8363   verifyFormat("class A##B##C {\n} n;");
8364   verifyFormat("class alignas(16) Z {\n} n;");
8365   verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
8366   verifyFormat("class MACROA MACRO(X) Z {\n} n;");
8367 
8368   // Redefinition from nested context:
8369   verifyFormat("class A::B::C {\n} n;");
8370 
8371   // Template definitions.
8372   verifyFormat(
8373       "template <typename F>\n"
8374       "Matcher(const Matcher<F> &Other,\n"
8375       "        typename enable_if_c<is_base_of<F, T>::value &&\n"
8376       "                             !is_same<F, T>::value>::type * = 0)\n"
8377       "    : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
8378 
8379   // FIXME: This is still incorrectly handled at the formatter side.
8380   verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
8381   verifyFormat("int i = SomeFunction(a<b, a> b);");
8382 
8383   // FIXME:
8384   // This now gets parsed incorrectly as class definition.
8385   // verifyFormat("class A<int> f() {\n}\nint n;");
8386 
8387   // Elaborate types where incorrectly parsing the structural element would
8388   // break the indent.
8389   verifyFormat("if (true)\n"
8390                "  class X x;\n"
8391                "else\n"
8392                "  f();\n");
8393 
8394   // This is simply incomplete. Formatting is not important, but must not crash.
8395   verifyFormat("class A:");
8396 }
8397 
8398 TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
8399   EXPECT_EQ("#error Leave     all         white!!!!! space* alone!\n",
8400             format("#error Leave     all         white!!!!! space* alone!\n"));
8401   EXPECT_EQ(
8402       "#warning Leave     all         white!!!!! space* alone!\n",
8403       format("#warning Leave     all         white!!!!! space* alone!\n"));
8404   EXPECT_EQ("#error 1", format("  #  error   1"));
8405   EXPECT_EQ("#warning 1", format("  #  warning 1"));
8406 }
8407 
8408 TEST_F(FormatTest, FormatHashIfExpressions) {
8409   verifyFormat("#if AAAA && BBBB");
8410   verifyFormat("#if (AAAA && BBBB)");
8411   verifyFormat("#elif (AAAA && BBBB)");
8412   // FIXME: Come up with a better indentation for #elif.
8413   verifyFormat(
8414       "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) &&  \\\n"
8415       "    defined(BBBBBBBB)\n"
8416       "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) &&  \\\n"
8417       "    defined(BBBBBBBB)\n"
8418       "#endif",
8419       getLLVMStyleWithColumns(65));
8420 }
8421 
8422 TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
8423   FormatStyle AllowsMergedIf = getGoogleStyle();
8424   AllowsMergedIf.AllowShortIfStatementsOnASingleLine =
8425       FormatStyle::SIS_WithoutElse;
8426   verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
8427   verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
8428   verifyFormat("if (true)\n#error E\n  return 42;", AllowsMergedIf);
8429   EXPECT_EQ("if (true) return 42;",
8430             format("if (true)\nreturn 42;", AllowsMergedIf));
8431   FormatStyle ShortMergedIf = AllowsMergedIf;
8432   ShortMergedIf.ColumnLimit = 25;
8433   verifyFormat("#define A \\\n"
8434                "  if (true) return 42;",
8435                ShortMergedIf);
8436   verifyFormat("#define A \\\n"
8437                "  f();    \\\n"
8438                "  if (true)\n"
8439                "#define B",
8440                ShortMergedIf);
8441   verifyFormat("#define A \\\n"
8442                "  f();    \\\n"
8443                "  if (true)\n"
8444                "g();",
8445                ShortMergedIf);
8446   verifyFormat("{\n"
8447                "#ifdef A\n"
8448                "  // Comment\n"
8449                "  if (true) continue;\n"
8450                "#endif\n"
8451                "  // Comment\n"
8452                "  if (true) continue;\n"
8453                "}",
8454                ShortMergedIf);
8455   ShortMergedIf.ColumnLimit = 33;
8456   verifyFormat("#define A \\\n"
8457                "  if constexpr (true) return 42;",
8458                ShortMergedIf);
8459   ShortMergedIf.ColumnLimit = 29;
8460   verifyFormat("#define A                   \\\n"
8461                "  if (aaaaaaaaaa) return 1; \\\n"
8462                "  return 2;",
8463                ShortMergedIf);
8464   ShortMergedIf.ColumnLimit = 28;
8465   verifyFormat("#define A         \\\n"
8466                "  if (aaaaaaaaaa) \\\n"
8467                "    return 1;     \\\n"
8468                "  return 2;",
8469                ShortMergedIf);
8470   verifyFormat("#define A                \\\n"
8471                "  if constexpr (aaaaaaa) \\\n"
8472                "    return 1;            \\\n"
8473                "  return 2;",
8474                ShortMergedIf);
8475 }
8476 
8477 TEST_F(FormatTest, FormatStarDependingOnContext) {
8478   verifyFormat("void f(int *a);");
8479   verifyFormat("void f() { f(fint * b); }");
8480   verifyFormat("class A {\n  void f(int *a);\n};");
8481   verifyFormat("class A {\n  int *a;\n};");
8482   verifyFormat("namespace a {\n"
8483                "namespace b {\n"
8484                "class A {\n"
8485                "  void f() {}\n"
8486                "  int *a;\n"
8487                "};\n"
8488                "} // namespace b\n"
8489                "} // namespace a");
8490 }
8491 
8492 TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
8493   verifyFormat("while");
8494   verifyFormat("operator");
8495 }
8496 
8497 TEST_F(FormatTest, SkipsDeeplyNestedLines) {
8498   // This code would be painfully slow to format if we didn't skip it.
8499   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
8500                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
8501                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
8502                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
8503                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
8504                    "A(1, 1)\n"
8505                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
8506                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8507                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8508                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8509                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8510                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8511                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8512                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8513                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8514                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1);\n");
8515   // Deeply nested part is untouched, rest is formatted.
8516   EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
8517             format(std::string("int    i;\n") + Code + "int    j;\n",
8518                    getLLVMStyle(), SC_ExpectIncomplete));
8519 }
8520 
8521 //===----------------------------------------------------------------------===//
8522 // Objective-C tests.
8523 //===----------------------------------------------------------------------===//
8524 
8525 TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
8526   verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
8527   EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
8528             format("-(NSUInteger)indexOfObject:(id)anObject;"));
8529   EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
8530   EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
8531   EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
8532             format("-(NSInteger)Method3:(id)anObject;"));
8533   EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
8534             format("-(NSInteger)Method4:(id)anObject;"));
8535   EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
8536             format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
8537   EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
8538             format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
8539   EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
8540             "forAllCells:(BOOL)flag;",
8541             format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
8542                    "forAllCells:(BOOL)flag;"));
8543 
8544   // Very long objectiveC method declaration.
8545   verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
8546                "    (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
8547   verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
8548                "                    inRange:(NSRange)range\n"
8549                "                   outRange:(NSRange)out_range\n"
8550                "                  outRange1:(NSRange)out_range1\n"
8551                "                  outRange2:(NSRange)out_range2\n"
8552                "                  outRange3:(NSRange)out_range3\n"
8553                "                  outRange4:(NSRange)out_range4\n"
8554                "                  outRange5:(NSRange)out_range5\n"
8555                "                  outRange6:(NSRange)out_range6\n"
8556                "                  outRange7:(NSRange)out_range7\n"
8557                "                  outRange8:(NSRange)out_range8\n"
8558                "                  outRange9:(NSRange)out_range9;");
8559 
8560   // When the function name has to be wrapped.
8561   FormatStyle Style = getLLVMStyle();
8562   // ObjC ignores IndentWrappedFunctionNames when wrapping methods
8563   // and always indents instead.
8564   Style.IndentWrappedFunctionNames = false;
8565   verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
8566                "    veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
8567                "               anotherName:(NSString)bbbbbbbbbbbbbb {\n"
8568                "}",
8569                Style);
8570   Style.IndentWrappedFunctionNames = true;
8571   verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
8572                "    veryLooooooooooongName:(NSString)cccccccccccccc\n"
8573                "               anotherName:(NSString)dddddddddddddd {\n"
8574                "}",
8575                Style);
8576 
8577   verifyFormat("- (int)sum:(vector<int>)numbers;");
8578   verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
8579   // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
8580   // protocol lists (but not for template classes):
8581   // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
8582 
8583   verifyFormat("- (int (*)())foo:(int (*)())f;");
8584   verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
8585 
8586   // If there's no return type (very rare in practice!), LLVM and Google style
8587   // agree.
8588   verifyFormat("- foo;");
8589   verifyFormat("- foo:(int)f;");
8590   verifyGoogleFormat("- foo:(int)foo;");
8591 }
8592 
8593 
8594 TEST_F(FormatTest, BreaksStringLiterals) {
8595   EXPECT_EQ("\"some text \"\n"
8596             "\"other\";",
8597             format("\"some text other\";", getLLVMStyleWithColumns(12)));
8598   EXPECT_EQ("\"some text \"\n"
8599             "\"other\";",
8600             format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
8601   EXPECT_EQ(
8602       "#define A  \\\n"
8603       "  \"some \"  \\\n"
8604       "  \"text \"  \\\n"
8605       "  \"other\";",
8606       format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
8607   EXPECT_EQ(
8608       "#define A  \\\n"
8609       "  \"so \"    \\\n"
8610       "  \"text \"  \\\n"
8611       "  \"other\";",
8612       format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
8613 
8614   EXPECT_EQ("\"some text\"",
8615             format("\"some text\"", getLLVMStyleWithColumns(1)));
8616   EXPECT_EQ("\"some text\"",
8617             format("\"some text\"", getLLVMStyleWithColumns(11)));
8618   EXPECT_EQ("\"some \"\n"
8619             "\"text\"",
8620             format("\"some text\"", getLLVMStyleWithColumns(10)));
8621   EXPECT_EQ("\"some \"\n"
8622             "\"text\"",
8623             format("\"some text\"", getLLVMStyleWithColumns(7)));
8624   EXPECT_EQ("\"some\"\n"
8625             "\" tex\"\n"
8626             "\"t\"",
8627             format("\"some text\"", getLLVMStyleWithColumns(6)));
8628   EXPECT_EQ("\"some\"\n"
8629             "\" tex\"\n"
8630             "\" and\"",
8631             format("\"some tex and\"", getLLVMStyleWithColumns(6)));
8632   EXPECT_EQ("\"some\"\n"
8633             "\"/tex\"\n"
8634             "\"/and\"",
8635             format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
8636 
8637   EXPECT_EQ("variable =\n"
8638             "    \"long string \"\n"
8639             "    \"literal\";",
8640             format("variable = \"long string literal\";",
8641                    getLLVMStyleWithColumns(20)));
8642 
8643   EXPECT_EQ("variable = f(\n"
8644             "    \"long string \"\n"
8645             "    \"literal\",\n"
8646             "    short,\n"
8647             "    loooooooooooooooooooong);",
8648             format("variable = f(\"long string literal\", short, "
8649                    "loooooooooooooooooooong);",
8650                    getLLVMStyleWithColumns(20)));
8651 
8652   EXPECT_EQ(
8653       "f(g(\"long string \"\n"
8654       "    \"literal\"),\n"
8655       "  b);",
8656       format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
8657   EXPECT_EQ("f(g(\"long string \"\n"
8658             "    \"literal\",\n"
8659             "    a),\n"
8660             "  b);",
8661             format("f(g(\"long string literal\", a), b);",
8662                    getLLVMStyleWithColumns(20)));
8663   EXPECT_EQ(
8664       "f(\"one two\".split(\n"
8665       "    variable));",
8666       format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
8667   EXPECT_EQ("f(\"one two three four five six \"\n"
8668             "  \"seven\".split(\n"
8669             "      really_looooong_variable));",
8670             format("f(\"one two three four five six seven\"."
8671                    "split(really_looooong_variable));",
8672                    getLLVMStyleWithColumns(33)));
8673 
8674   EXPECT_EQ("f(\"some \"\n"
8675             "  \"text\",\n"
8676             "  other);",
8677             format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
8678 
8679   // Only break as a last resort.
8680   verifyFormat(
8681       "aaaaaaaaaaaaaaaaaaaa(\n"
8682       "    aaaaaaaaaaaaaaaaaaaa,\n"
8683       "    aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
8684 
8685   EXPECT_EQ("\"splitmea\"\n"
8686             "\"trandomp\"\n"
8687             "\"oint\"",
8688             format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
8689 
8690   EXPECT_EQ("\"split/\"\n"
8691             "\"pathat/\"\n"
8692             "\"slashes\"",
8693             format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
8694 
8695   EXPECT_EQ("\"split/\"\n"
8696             "\"pathat/\"\n"
8697             "\"slashes\"",
8698             format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
8699   EXPECT_EQ("\"split at \"\n"
8700             "\"spaces/at/\"\n"
8701             "\"slashes.at.any$\"\n"
8702             "\"non-alphanumeric%\"\n"
8703             "\"1111111111characte\"\n"
8704             "\"rs\"",
8705             format("\"split at "
8706                    "spaces/at/"
8707                    "slashes.at."
8708                    "any$non-"
8709                    "alphanumeric%"
8710                    "1111111111characte"
8711                    "rs\"",
8712                    getLLVMStyleWithColumns(20)));
8713 
8714   // Verify that splitting the strings understands
8715   // Style::AlwaysBreakBeforeMultilineStrings.
8716   EXPECT_EQ(
8717       "aaaaaaaaaaaa(\n"
8718       "    \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
8719       "    \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
8720       format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
8721              "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
8722              "aaaaaaaaaaaaaaaaaaaaaa\");",
8723              getGoogleStyle()));
8724   EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8725             "       \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
8726             format("return \"aaaaaaaaaaaaaaaaaaaaaa "
8727                    "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
8728                    "aaaaaaaaaaaaaaaaaaaaaa\";",
8729                    getGoogleStyle()));
8730   EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8731             "                \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
8732             format("llvm::outs() << "
8733                    "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
8734                    "aaaaaaaaaaaaaaaaaaa\";"));
8735   EXPECT_EQ("ffff(\n"
8736             "    {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8737             "     \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
8738             format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
8739                    "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
8740                    getGoogleStyle()));
8741 
8742   FormatStyle Style = getLLVMStyleWithColumns(12);
8743   Style.BreakStringLiterals = false;
8744   EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
8745 
8746   FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
8747   AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
8748   EXPECT_EQ("#define A \\\n"
8749             "  \"some \" \\\n"
8750             "  \"text \" \\\n"
8751             "  \"other\";",
8752             format("#define A \"some text other\";", AlignLeft));
8753 }
8754 
8755 TEST_F(FormatTest, BreaksStringLiteralsAtColumnLimit) {
8756   EXPECT_EQ("C a = \"some more \"\n"
8757             "      \"text\";",
8758             format("C a = \"some more text\";", getLLVMStyleWithColumns(18)));
8759 }
8760 
8761 TEST_F(FormatTest, FullyRemoveEmptyLines) {
8762   FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
8763   NoEmptyLines.MaxEmptyLinesToKeep = 0;
8764   EXPECT_EQ("int i = a(b());",
8765             format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
8766 }
8767 
8768 TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
8769   EXPECT_EQ(
8770       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
8771       "(\n"
8772       "    \"x\t\");",
8773       format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
8774              "aaaaaaa("
8775              "\"x\t\");"));
8776 }
8777 
8778 TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
8779   EXPECT_EQ(
8780       "u8\"utf8 string \"\n"
8781       "u8\"literal\";",
8782       format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
8783   EXPECT_EQ(
8784       "u\"utf16 string \"\n"
8785       "u\"literal\";",
8786       format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
8787   EXPECT_EQ(
8788       "U\"utf32 string \"\n"
8789       "U\"literal\";",
8790       format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
8791   EXPECT_EQ("L\"wide string \"\n"
8792             "L\"literal\";",
8793             format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
8794   EXPECT_EQ("@\"NSString \"\n"
8795             "@\"literal\";",
8796             format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
8797   verifyFormat(R"(NSString *s = @"那那那那";)", getLLVMStyleWithColumns(26));
8798 
8799   // This input makes clang-format try to split the incomplete unicode escape
8800   // sequence, which used to lead to a crasher.
8801   verifyNoCrash(
8802       "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
8803       getLLVMStyleWithColumns(60));
8804 }
8805 
8806 TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
8807   FormatStyle Style = getGoogleStyleWithColumns(15);
8808   EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
8809   EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
8810   EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
8811   EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
8812   EXPECT_EQ("u8R\"x(raw literal)x\";",
8813             format("u8R\"x(raw literal)x\";", Style));
8814 }
8815 
8816 TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
8817   FormatStyle Style = getLLVMStyleWithColumns(20);
8818   EXPECT_EQ(
8819       "_T(\"aaaaaaaaaaaaaa\")\n"
8820       "_T(\"aaaaaaaaaaaaaa\")\n"
8821       "_T(\"aaaaaaaaaaaa\")",
8822       format("  _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
8823   EXPECT_EQ("f(x,\n"
8824             "  _T(\"aaaaaaaaaaaa\")\n"
8825             "  _T(\"aaa\"),\n"
8826             "  z);",
8827             format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
8828 
8829   // FIXME: Handle embedded spaces in one iteration.
8830   //  EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
8831   //            "_T(\"aaaaaaaaaaaaa\")\n"
8832   //            "_T(\"aaaaaaaaaaaaa\")\n"
8833   //            "_T(\"a\")",
8834   //            format("  _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
8835   //                   getLLVMStyleWithColumns(20)));
8836   EXPECT_EQ(
8837       "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
8838       format("  _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
8839   EXPECT_EQ("f(\n"
8840             "#if !TEST\n"
8841             "    _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
8842             "#endif\n"
8843             ");",
8844             format("f(\n"
8845                    "#if !TEST\n"
8846                    "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
8847                    "#endif\n"
8848                    ");"));
8849   EXPECT_EQ("f(\n"
8850             "\n"
8851             "    _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
8852             format("f(\n"
8853                    "\n"
8854                    "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
8855 }
8856 
8857 TEST_F(FormatTest, BreaksStringLiteralOperands) {
8858   // In a function call with two operands, the second can be broken with no line
8859   // break before it.
8860   EXPECT_EQ("func(a, \"long long \"\n"
8861             "        \"long long\");",
8862             format("func(a, \"long long long long\");",
8863                    getLLVMStyleWithColumns(24)));
8864   // In a function call with three operands, the second must be broken with a
8865   // line break before it.
8866   EXPECT_EQ("func(a,\n"
8867             "     \"long long long \"\n"
8868             "     \"long\",\n"
8869             "     c);",
8870             format("func(a, \"long long long long\", c);",
8871                    getLLVMStyleWithColumns(24)));
8872   // In a function call with three operands, the third must be broken with a
8873   // line break before it.
8874   EXPECT_EQ("func(a, b,\n"
8875             "     \"long long long \"\n"
8876             "     \"long\");",
8877             format("func(a, b, \"long long long long\");",
8878                    getLLVMStyleWithColumns(24)));
8879   // In a function call with three operands, both the second and the third must
8880   // be broken with a line break before them.
8881   EXPECT_EQ("func(a,\n"
8882             "     \"long long long \"\n"
8883             "     \"long\",\n"
8884             "     \"long long long \"\n"
8885             "     \"long\");",
8886             format("func(a, \"long long long long\", \"long long long long\");",
8887                    getLLVMStyleWithColumns(24)));
8888   // In a chain of << with two operands, the second can be broken with no line
8889   // break before it.
8890   EXPECT_EQ("a << \"line line \"\n"
8891             "     \"line\";",
8892             format("a << \"line line line\";",
8893                    getLLVMStyleWithColumns(20)));
8894   // In a chain of << with three operands, the second can be broken with no line
8895   // break before it.
8896   EXPECT_EQ("abcde << \"line \"\n"
8897             "         \"line line\"\n"
8898             "      << c;",
8899             format("abcde << \"line line line\" << c;",
8900                    getLLVMStyleWithColumns(20)));
8901   // In a chain of << with three operands, the third must be broken with a line
8902   // break before it.
8903   EXPECT_EQ("a << b\n"
8904             "  << \"line line \"\n"
8905             "     \"line\";",
8906             format("a << b << \"line line line\";",
8907                    getLLVMStyleWithColumns(20)));
8908   // In a chain of << with three operands, the second can be broken with no line
8909   // break before it and the third must be broken with a line break before it.
8910   EXPECT_EQ("abcd << \"line line \"\n"
8911             "        \"line\"\n"
8912             "     << \"line line \"\n"
8913             "        \"line\";",
8914             format("abcd << \"line line line\" << \"line line line\";",
8915                    getLLVMStyleWithColumns(20)));
8916   // In a chain of binary operators with two operands, the second can be broken
8917   // with no line break before it.
8918   EXPECT_EQ("abcd + \"line line \"\n"
8919             "       \"line line\";",
8920             format("abcd + \"line line line line\";",
8921                    getLLVMStyleWithColumns(20)));
8922   // In a chain of binary operators with three operands, the second must be
8923   // broken with a line break before it.
8924   EXPECT_EQ("abcd +\n"
8925             "    \"line line \"\n"
8926             "    \"line line\" +\n"
8927             "    e;",
8928             format("abcd + \"line line line line\" + e;",
8929                    getLLVMStyleWithColumns(20)));
8930   // In a function call with two operands, with AlignAfterOpenBracket enabled,
8931   // the first must be broken with a line break before it.
8932   FormatStyle Style = getLLVMStyleWithColumns(25);
8933   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
8934   EXPECT_EQ("someFunction(\n"
8935             "    \"long long long \"\n"
8936             "    \"long\",\n"
8937             "    a);",
8938             format("someFunction(\"long long long long\", a);", Style));
8939 }
8940 
8941 TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
8942   EXPECT_EQ(
8943       "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8944       "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8945       "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
8946       format("aaaaaaaaaaa  =  \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8947              "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8948              "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
8949 }
8950 
8951 TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
8952   EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
8953             format("f(g(R\"x(raw literal)x\",   a), b);", getGoogleStyle()));
8954   EXPECT_EQ("fffffffffff(g(R\"x(\n"
8955             "multiline raw string literal xxxxxxxxxxxxxx\n"
8956             ")x\",\n"
8957             "              a),\n"
8958             "            b);",
8959             format("fffffffffff(g(R\"x(\n"
8960                    "multiline raw string literal xxxxxxxxxxxxxx\n"
8961                    ")x\", a), b);",
8962                    getGoogleStyleWithColumns(20)));
8963   EXPECT_EQ("fffffffffff(\n"
8964             "    g(R\"x(qqq\n"
8965             "multiline raw string literal xxxxxxxxxxxxxx\n"
8966             ")x\",\n"
8967             "      a),\n"
8968             "    b);",
8969             format("fffffffffff(g(R\"x(qqq\n"
8970                    "multiline raw string literal xxxxxxxxxxxxxx\n"
8971                    ")x\", a), b);",
8972                    getGoogleStyleWithColumns(20)));
8973 
8974   EXPECT_EQ("fffffffffff(R\"x(\n"
8975             "multiline raw string literal xxxxxxxxxxxxxx\n"
8976             ")x\");",
8977             format("fffffffffff(R\"x(\n"
8978                    "multiline raw string literal xxxxxxxxxxxxxx\n"
8979                    ")x\");",
8980                    getGoogleStyleWithColumns(20)));
8981   EXPECT_EQ("fffffffffff(R\"x(\n"
8982             "multiline raw string literal xxxxxxxxxxxxxx\n"
8983             ")x\" + bbbbbb);",
8984             format("fffffffffff(R\"x(\n"
8985                    "multiline raw string literal xxxxxxxxxxxxxx\n"
8986                    ")x\" +   bbbbbb);",
8987                    getGoogleStyleWithColumns(20)));
8988   EXPECT_EQ("fffffffffff(\n"
8989             "    R\"x(\n"
8990             "multiline raw string literal xxxxxxxxxxxxxx\n"
8991             ")x\" +\n"
8992             "    bbbbbb);",
8993             format("fffffffffff(\n"
8994                    " R\"x(\n"
8995                    "multiline raw string literal xxxxxxxxxxxxxx\n"
8996                    ")x\" + bbbbbb);",
8997                    getGoogleStyleWithColumns(20)));
8998   EXPECT_EQ("fffffffffff(R\"(single line raw string)\" + bbbbbb);",
8999             format("fffffffffff(\n"
9000                    " R\"(single line raw string)\" + bbbbbb);"));
9001 }
9002 
9003 TEST_F(FormatTest, SkipsUnknownStringLiterals) {
9004   verifyFormat("string a = \"unterminated;");
9005   EXPECT_EQ("function(\"unterminated,\n"
9006             "         OtherParameter);",
9007             format("function(  \"unterminated,\n"
9008                    "    OtherParameter);"));
9009 }
9010 
9011 TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
9012   FormatStyle Style = getLLVMStyle();
9013   Style.Standard = FormatStyle::LS_Cpp03;
9014   EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
9015             format("#define x(_a) printf(\"foo\"_a);", Style));
9016 }
9017 
9018 TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
9019 
9020 TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
9021   EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
9022             "             \"ddeeefff\");",
9023             format("someFunction(\"aaabbbcccdddeeefff\");",
9024                    getLLVMStyleWithColumns(25)));
9025   EXPECT_EQ("someFunction1234567890(\n"
9026             "    \"aaabbbcccdddeeefff\");",
9027             format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
9028                    getLLVMStyleWithColumns(26)));
9029   EXPECT_EQ("someFunction1234567890(\n"
9030             "    \"aaabbbcccdddeeeff\"\n"
9031             "    \"f\");",
9032             format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
9033                    getLLVMStyleWithColumns(25)));
9034   EXPECT_EQ("someFunction1234567890(\n"
9035             "    \"aaabbbcccdddeeeff\"\n"
9036             "    \"f\");",
9037             format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
9038                    getLLVMStyleWithColumns(24)));
9039   EXPECT_EQ("someFunction(\n"
9040             "    \"aaabbbcc ddde \"\n"
9041             "    \"efff\");",
9042             format("someFunction(\"aaabbbcc ddde efff\");",
9043                    getLLVMStyleWithColumns(25)));
9044   EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
9045             "             \"ddeeefff\");",
9046             format("someFunction(\"aaabbbccc ddeeefff\");",
9047                    getLLVMStyleWithColumns(25)));
9048   EXPECT_EQ("someFunction1234567890(\n"
9049             "    \"aaabb \"\n"
9050             "    \"cccdddeeefff\");",
9051             format("someFunction1234567890(\"aaabb cccdddeeefff\");",
9052                    getLLVMStyleWithColumns(25)));
9053   EXPECT_EQ("#define A          \\\n"
9054             "  string s =       \\\n"
9055             "      \"123456789\"  \\\n"
9056             "      \"0\";         \\\n"
9057             "  int i;",
9058             format("#define A string s = \"1234567890\"; int i;",
9059                    getLLVMStyleWithColumns(20)));
9060   EXPECT_EQ("someFunction(\n"
9061             "    \"aaabbbcc \"\n"
9062             "    \"dddeeefff\");",
9063             format("someFunction(\"aaabbbcc dddeeefff\");",
9064                    getLLVMStyleWithColumns(25)));
9065 }
9066 
9067 TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
9068   EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
9069   EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
9070   EXPECT_EQ("\"test\"\n"
9071             "\"\\n\"",
9072             format("\"test\\n\"", getLLVMStyleWithColumns(7)));
9073   EXPECT_EQ("\"tes\\\\\"\n"
9074             "\"n\"",
9075             format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
9076   EXPECT_EQ("\"\\\\\\\\\"\n"
9077             "\"\\n\"",
9078             format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
9079   EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
9080   EXPECT_EQ("\"\\uff01\"\n"
9081             "\"test\"",
9082             format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
9083   EXPECT_EQ("\"\\Uff01ff02\"",
9084             format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
9085   EXPECT_EQ("\"\\x000000000001\"\n"
9086             "\"next\"",
9087             format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
9088   EXPECT_EQ("\"\\x000000000001next\"",
9089             format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
9090   EXPECT_EQ("\"\\x000000000001\"",
9091             format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
9092   EXPECT_EQ("\"test\"\n"
9093             "\"\\000000\"\n"
9094             "\"000001\"",
9095             format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
9096   EXPECT_EQ("\"test\\000\"\n"
9097             "\"00000000\"\n"
9098             "\"1\"",
9099             format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
9100 }
9101 
9102 TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
9103   verifyFormat("void f() {\n"
9104                "  return g() {}\n"
9105                "  void h() {}");
9106   verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
9107                "g();\n"
9108                "}");
9109 }
9110 
9111 TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
9112   verifyFormat(
9113       "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
9114 }
9115 
9116 TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
9117   verifyFormat("class X {\n"
9118                "  void f() {\n"
9119                "  }\n"
9120                "};",
9121                getLLVMStyleWithColumns(12));
9122 }
9123 
9124 TEST_F(FormatTest, ConfigurableIndentWidth) {
9125   FormatStyle EightIndent = getLLVMStyleWithColumns(18);
9126   EightIndent.IndentWidth = 8;
9127   EightIndent.ContinuationIndentWidth = 8;
9128   verifyFormat("void f() {\n"
9129                "        someFunction();\n"
9130                "        if (true) {\n"
9131                "                f();\n"
9132                "        }\n"
9133                "}",
9134                EightIndent);
9135   verifyFormat("class X {\n"
9136                "        void f() {\n"
9137                "        }\n"
9138                "};",
9139                EightIndent);
9140   verifyFormat("int x[] = {\n"
9141                "        call(),\n"
9142                "        call()};",
9143                EightIndent);
9144 }
9145 
9146 TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
9147   verifyFormat("double\n"
9148                "f();",
9149                getLLVMStyleWithColumns(8));
9150 }
9151 
9152 TEST_F(FormatTest, ConfigurableUseOfTab) {
9153   FormatStyle Tab = getLLVMStyleWithColumns(42);
9154   Tab.IndentWidth = 8;
9155   Tab.UseTab = FormatStyle::UT_Always;
9156   Tab.AlignEscapedNewlines = FormatStyle::ENAS_Left;
9157 
9158   EXPECT_EQ("if (aaaaaaaa && // q\n"
9159             "    bb)\t\t// w\n"
9160             "\t;",
9161             format("if (aaaaaaaa &&// q\n"
9162                    "bb)// w\n"
9163                    ";",
9164                    Tab));
9165   EXPECT_EQ("if (aaa && bbb) // w\n"
9166             "\t;",
9167             format("if(aaa&&bbb)// w\n"
9168                    ";",
9169                    Tab));
9170 
9171   verifyFormat("class X {\n"
9172                "\tvoid f() {\n"
9173                "\t\tsomeFunction(parameter1,\n"
9174                "\t\t\t     parameter2);\n"
9175                "\t}\n"
9176                "};",
9177                Tab);
9178   verifyFormat("#define A                        \\\n"
9179                "\tvoid f() {               \\\n"
9180                "\t\tsomeFunction(    \\\n"
9181                "\t\t    parameter1,  \\\n"
9182                "\t\t    parameter2); \\\n"
9183                "\t}",
9184                Tab);
9185   verifyFormat("int a;\t      // x\n"
9186                "int bbbbbbbb; // x\n",
9187                Tab);
9188 
9189   Tab.TabWidth = 4;
9190   Tab.IndentWidth = 8;
9191   verifyFormat("class TabWidth4Indent8 {\n"
9192                "\t\tvoid f() {\n"
9193                "\t\t\t\tsomeFunction(parameter1,\n"
9194                "\t\t\t\t\t\t\t parameter2);\n"
9195                "\t\t}\n"
9196                "};",
9197                Tab);
9198 
9199   Tab.TabWidth = 4;
9200   Tab.IndentWidth = 4;
9201   verifyFormat("class TabWidth4Indent4 {\n"
9202                "\tvoid f() {\n"
9203                "\t\tsomeFunction(parameter1,\n"
9204                "\t\t\t\t\t parameter2);\n"
9205                "\t}\n"
9206                "};",
9207                Tab);
9208 
9209   Tab.TabWidth = 8;
9210   Tab.IndentWidth = 4;
9211   verifyFormat("class TabWidth8Indent4 {\n"
9212                "    void f() {\n"
9213                "\tsomeFunction(parameter1,\n"
9214                "\t\t     parameter2);\n"
9215                "    }\n"
9216                "};",
9217                Tab);
9218 
9219   Tab.TabWidth = 8;
9220   Tab.IndentWidth = 8;
9221   EXPECT_EQ("/*\n"
9222             "\t      a\t\tcomment\n"
9223             "\t      in multiple lines\n"
9224             "       */",
9225             format("   /*\t \t \n"
9226                    " \t \t a\t\tcomment\t \t\n"
9227                    " \t \t in multiple lines\t\n"
9228                    " \t  */",
9229                    Tab));
9230 
9231   Tab.UseTab = FormatStyle::UT_ForIndentation;
9232   verifyFormat("{\n"
9233                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9234                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9235                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9236                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9237                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9238                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9239                "};",
9240                Tab);
9241   verifyFormat("enum AA {\n"
9242                "\ta1, // Force multiple lines\n"
9243                "\ta2,\n"
9244                "\ta3\n"
9245                "};",
9246                Tab);
9247   EXPECT_EQ("if (aaaaaaaa && // q\n"
9248             "    bb)         // w\n"
9249             "\t;",
9250             format("if (aaaaaaaa &&// q\n"
9251                    "bb)// w\n"
9252                    ";",
9253                    Tab));
9254   verifyFormat("class X {\n"
9255                "\tvoid f() {\n"
9256                "\t\tsomeFunction(parameter1,\n"
9257                "\t\t             parameter2);\n"
9258                "\t}\n"
9259                "};",
9260                Tab);
9261   verifyFormat("{\n"
9262                "\tQ(\n"
9263                "\t    {\n"
9264                "\t\t    int a;\n"
9265                "\t\t    someFunction(aaaaaaaa,\n"
9266                "\t\t                 bbbbbbb);\n"
9267                "\t    },\n"
9268                "\t    p);\n"
9269                "}",
9270                Tab);
9271   EXPECT_EQ("{\n"
9272             "\t/* aaaa\n"
9273             "\t   bbbb */\n"
9274             "}",
9275             format("{\n"
9276                    "/* aaaa\n"
9277                    "   bbbb */\n"
9278                    "}",
9279                    Tab));
9280   EXPECT_EQ("{\n"
9281             "\t/*\n"
9282             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
9283             "\t  bbbbbbbbbbbbb\n"
9284             "\t*/\n"
9285             "}",
9286             format("{\n"
9287                    "/*\n"
9288                    "  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
9289                    "*/\n"
9290                    "}",
9291                    Tab));
9292   EXPECT_EQ("{\n"
9293             "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
9294             "\t// bbbbbbbbbbbbb\n"
9295             "}",
9296             format("{\n"
9297                    "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
9298                    "}",
9299                    Tab));
9300   EXPECT_EQ("{\n"
9301             "\t/*\n"
9302             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
9303             "\t  bbbbbbbbbbbbb\n"
9304             "\t*/\n"
9305             "}",
9306             format("{\n"
9307                    "\t/*\n"
9308                    "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
9309                    "\t*/\n"
9310                    "}",
9311                    Tab));
9312   EXPECT_EQ("{\n"
9313             "\t/*\n"
9314             "\n"
9315             "\t*/\n"
9316             "}",
9317             format("{\n"
9318                    "\t/*\n"
9319                    "\n"
9320                    "\t*/\n"
9321                    "}",
9322                    Tab));
9323   EXPECT_EQ("{\n"
9324             "\t/*\n"
9325             " asdf\n"
9326             "\t*/\n"
9327             "}",
9328             format("{\n"
9329                    "\t/*\n"
9330                    " asdf\n"
9331                    "\t*/\n"
9332                    "}",
9333                    Tab));
9334 
9335   Tab.UseTab = FormatStyle::UT_Never;
9336   EXPECT_EQ("/*\n"
9337             "              a\t\tcomment\n"
9338             "              in multiple lines\n"
9339             "       */",
9340             format("   /*\t \t \n"
9341                    " \t \t a\t\tcomment\t \t\n"
9342                    " \t \t in multiple lines\t\n"
9343                    " \t  */",
9344                    Tab));
9345   EXPECT_EQ("/* some\n"
9346             "   comment */",
9347             format(" \t \t /* some\n"
9348                    " \t \t    comment */",
9349                    Tab));
9350   EXPECT_EQ("int a; /* some\n"
9351             "   comment */",
9352             format(" \t \t int a; /* some\n"
9353                    " \t \t    comment */",
9354                    Tab));
9355 
9356   EXPECT_EQ("int a; /* some\n"
9357             "comment */",
9358             format(" \t \t int\ta; /* some\n"
9359                    " \t \t    comment */",
9360                    Tab));
9361   EXPECT_EQ("f(\"\t\t\"); /* some\n"
9362             "    comment */",
9363             format(" \t \t f(\"\t\t\"); /* some\n"
9364                    " \t \t    comment */",
9365                    Tab));
9366   EXPECT_EQ("{\n"
9367             "  /*\n"
9368             "   * Comment\n"
9369             "   */\n"
9370             "  int i;\n"
9371             "}",
9372             format("{\n"
9373                    "\t/*\n"
9374                    "\t * Comment\n"
9375                    "\t */\n"
9376                    "\t int i;\n"
9377                    "}"));
9378 
9379   Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
9380   Tab.TabWidth = 8;
9381   Tab.IndentWidth = 8;
9382   EXPECT_EQ("if (aaaaaaaa && // q\n"
9383             "    bb)         // w\n"
9384             "\t;",
9385             format("if (aaaaaaaa &&// q\n"
9386                    "bb)// w\n"
9387                    ";",
9388                    Tab));
9389   EXPECT_EQ("if (aaa && bbb) // w\n"
9390             "\t;",
9391             format("if(aaa&&bbb)// w\n"
9392                    ";",
9393                    Tab));
9394   verifyFormat("class X {\n"
9395                "\tvoid f() {\n"
9396                "\t\tsomeFunction(parameter1,\n"
9397                "\t\t\t     parameter2);\n"
9398                "\t}\n"
9399                "};",
9400                Tab);
9401   verifyFormat("#define A                        \\\n"
9402                "\tvoid f() {               \\\n"
9403                "\t\tsomeFunction(    \\\n"
9404                "\t\t    parameter1,  \\\n"
9405                "\t\t    parameter2); \\\n"
9406                "\t}",
9407                Tab);
9408   Tab.TabWidth = 4;
9409   Tab.IndentWidth = 8;
9410   verifyFormat("class TabWidth4Indent8 {\n"
9411                "\t\tvoid f() {\n"
9412                "\t\t\t\tsomeFunction(parameter1,\n"
9413                "\t\t\t\t\t\t\t parameter2);\n"
9414                "\t\t}\n"
9415                "};",
9416                Tab);
9417   Tab.TabWidth = 4;
9418   Tab.IndentWidth = 4;
9419   verifyFormat("class TabWidth4Indent4 {\n"
9420                "\tvoid f() {\n"
9421                "\t\tsomeFunction(parameter1,\n"
9422                "\t\t\t\t\t parameter2);\n"
9423                "\t}\n"
9424                "};",
9425                Tab);
9426   Tab.TabWidth = 8;
9427   Tab.IndentWidth = 4;
9428   verifyFormat("class TabWidth8Indent4 {\n"
9429                "    void f() {\n"
9430                "\tsomeFunction(parameter1,\n"
9431                "\t\t     parameter2);\n"
9432                "    }\n"
9433                "};",
9434                Tab);
9435   Tab.TabWidth = 8;
9436   Tab.IndentWidth = 8;
9437   EXPECT_EQ("/*\n"
9438             "\t      a\t\tcomment\n"
9439             "\t      in multiple lines\n"
9440             "       */",
9441             format("   /*\t \t \n"
9442                    " \t \t a\t\tcomment\t \t\n"
9443                    " \t \t in multiple lines\t\n"
9444                    " \t  */",
9445                    Tab));
9446   verifyFormat("{\n"
9447                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9448                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9449                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9450                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9451                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9452                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9453                "};",
9454                Tab);
9455   verifyFormat("enum AA {\n"
9456                "\ta1, // Force multiple lines\n"
9457                "\ta2,\n"
9458                "\ta3\n"
9459                "};",
9460                Tab);
9461   EXPECT_EQ("if (aaaaaaaa && // q\n"
9462             "    bb)         // w\n"
9463             "\t;",
9464             format("if (aaaaaaaa &&// q\n"
9465                    "bb)// w\n"
9466                    ";",
9467                    Tab));
9468   verifyFormat("class X {\n"
9469                "\tvoid f() {\n"
9470                "\t\tsomeFunction(parameter1,\n"
9471                "\t\t\t     parameter2);\n"
9472                "\t}\n"
9473                "};",
9474                Tab);
9475   verifyFormat("{\n"
9476                "\tQ(\n"
9477                "\t    {\n"
9478                "\t\t    int a;\n"
9479                "\t\t    someFunction(aaaaaaaa,\n"
9480                "\t\t\t\t bbbbbbb);\n"
9481                "\t    },\n"
9482                "\t    p);\n"
9483                "}",
9484                Tab);
9485   EXPECT_EQ("{\n"
9486             "\t/* aaaa\n"
9487             "\t   bbbb */\n"
9488             "}",
9489             format("{\n"
9490                    "/* aaaa\n"
9491                    "   bbbb */\n"
9492                    "}",
9493                    Tab));
9494   EXPECT_EQ("{\n"
9495             "\t/*\n"
9496             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
9497             "\t  bbbbbbbbbbbbb\n"
9498             "\t*/\n"
9499             "}",
9500             format("{\n"
9501                    "/*\n"
9502                    "  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
9503                    "*/\n"
9504                    "}",
9505                    Tab));
9506   EXPECT_EQ("{\n"
9507             "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
9508             "\t// bbbbbbbbbbbbb\n"
9509             "}",
9510             format("{\n"
9511                    "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
9512                    "}",
9513                    Tab));
9514   EXPECT_EQ("{\n"
9515             "\t/*\n"
9516             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
9517             "\t  bbbbbbbbbbbbb\n"
9518             "\t*/\n"
9519             "}",
9520             format("{\n"
9521                    "\t/*\n"
9522                    "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
9523                    "\t*/\n"
9524                    "}",
9525                    Tab));
9526   EXPECT_EQ("{\n"
9527             "\t/*\n"
9528             "\n"
9529             "\t*/\n"
9530             "}",
9531             format("{\n"
9532                    "\t/*\n"
9533                    "\n"
9534                    "\t*/\n"
9535                    "}",
9536                    Tab));
9537   EXPECT_EQ("{\n"
9538             "\t/*\n"
9539             " asdf\n"
9540             "\t*/\n"
9541             "}",
9542             format("{\n"
9543                    "\t/*\n"
9544                    " asdf\n"
9545                    "\t*/\n"
9546                    "}",
9547                    Tab));
9548   EXPECT_EQ("/*\n"
9549             "\t      a\t\tcomment\n"
9550             "\t      in multiple lines\n"
9551             "       */",
9552             format("   /*\t \t \n"
9553                    " \t \t a\t\tcomment\t \t\n"
9554                    " \t \t in multiple lines\t\n"
9555                    " \t  */",
9556                    Tab));
9557   EXPECT_EQ("/* some\n"
9558             "   comment */",
9559             format(" \t \t /* some\n"
9560                    " \t \t    comment */",
9561                    Tab));
9562   EXPECT_EQ("int a; /* some\n"
9563             "   comment */",
9564             format(" \t \t int a; /* some\n"
9565                    " \t \t    comment */",
9566                    Tab));
9567   EXPECT_EQ("int a; /* some\n"
9568             "comment */",
9569             format(" \t \t int\ta; /* some\n"
9570                    " \t \t    comment */",
9571                    Tab));
9572   EXPECT_EQ("f(\"\t\t\"); /* some\n"
9573             "    comment */",
9574             format(" \t \t f(\"\t\t\"); /* some\n"
9575                    " \t \t    comment */",
9576                    Tab));
9577   EXPECT_EQ("{\n"
9578             "  /*\n"
9579             "   * Comment\n"
9580             "   */\n"
9581             "  int i;\n"
9582             "}",
9583             format("{\n"
9584                    "\t/*\n"
9585                    "\t * Comment\n"
9586                    "\t */\n"
9587                    "\t int i;\n"
9588                    "}"));
9589   Tab.AlignConsecutiveAssignments = true;
9590   Tab.AlignConsecutiveDeclarations = true;
9591   Tab.TabWidth = 4;
9592   Tab.IndentWidth = 4;
9593   verifyFormat("class Assign {\n"
9594                "\tvoid f() {\n"
9595                "\t\tint         x      = 123;\n"
9596                "\t\tint         random = 4;\n"
9597                "\t\tstd::string alphabet =\n"
9598                "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
9599                "\t}\n"
9600                "};",
9601                Tab);
9602 }
9603 
9604 TEST_F(FormatTest, CalculatesOriginalColumn) {
9605   EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9606             "q\"; /* some\n"
9607             "       comment */",
9608             format("  \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9609                    "q\"; /* some\n"
9610                    "       comment */",
9611                    getLLVMStyle()));
9612   EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
9613             "/* some\n"
9614             "   comment */",
9615             format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
9616                    " /* some\n"
9617                    "    comment */",
9618                    getLLVMStyle()));
9619   EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9620             "qqq\n"
9621             "/* some\n"
9622             "   comment */",
9623             format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9624                    "qqq\n"
9625                    " /* some\n"
9626                    "    comment */",
9627                    getLLVMStyle()));
9628   EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9629             "wwww; /* some\n"
9630             "         comment */",
9631             format("  inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9632                    "wwww; /* some\n"
9633                    "         comment */",
9634                    getLLVMStyle()));
9635 }
9636 
9637 TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
9638   FormatStyle NoSpace = getLLVMStyle();
9639   NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
9640 
9641   verifyFormat("while(true)\n"
9642                "  continue;",
9643                NoSpace);
9644   verifyFormat("for(;;)\n"
9645                "  continue;",
9646                NoSpace);
9647   verifyFormat("if(true)\n"
9648                "  f();\n"
9649                "else if(true)\n"
9650                "  f();",
9651                NoSpace);
9652   verifyFormat("do {\n"
9653                "  do_something();\n"
9654                "} while(something());",
9655                NoSpace);
9656   verifyFormat("switch(x) {\n"
9657                "default:\n"
9658                "  break;\n"
9659                "}",
9660                NoSpace);
9661   verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
9662   verifyFormat("size_t x = sizeof(x);", NoSpace);
9663   verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
9664   verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
9665   verifyFormat("alignas(128) char a[128];", NoSpace);
9666   verifyFormat("size_t x = alignof(MyType);", NoSpace);
9667   verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
9668   verifyFormat("int f() throw(Deprecated);", NoSpace);
9669   verifyFormat("typedef void (*cb)(int);", NoSpace);
9670   verifyFormat("T A::operator()();", NoSpace);
9671   verifyFormat("X A::operator++(T);", NoSpace);
9672   verifyFormat("auto lambda = []() { return 0; };", NoSpace);
9673 
9674   FormatStyle Space = getLLVMStyle();
9675   Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
9676 
9677   verifyFormat("int f ();", Space);
9678   verifyFormat("void f (int a, T b) {\n"
9679                "  while (true)\n"
9680                "    continue;\n"
9681                "}",
9682                Space);
9683   verifyFormat("if (true)\n"
9684                "  f ();\n"
9685                "else if (true)\n"
9686                "  f ();",
9687                Space);
9688   verifyFormat("do {\n"
9689                "  do_something ();\n"
9690                "} while (something ());",
9691                Space);
9692   verifyFormat("switch (x) {\n"
9693                "default:\n"
9694                "  break;\n"
9695                "}",
9696                Space);
9697   verifyFormat("A::A () : a (1) {}", Space);
9698   verifyFormat("void f () __attribute__ ((asdf));", Space);
9699   verifyFormat("*(&a + 1);\n"
9700                "&((&a)[1]);\n"
9701                "a[(b + c) * d];\n"
9702                "(((a + 1) * 2) + 3) * 4;",
9703                Space);
9704   verifyFormat("#define A(x) x", Space);
9705   verifyFormat("#define A (x) x", Space);
9706   verifyFormat("#if defined(x)\n"
9707                "#endif",
9708                Space);
9709   verifyFormat("auto i = std::make_unique<int> (5);", Space);
9710   verifyFormat("size_t x = sizeof (x);", Space);
9711   verifyFormat("auto f (int x) -> decltype (x);", Space);
9712   verifyFormat("int f (T x) noexcept (x.create ());", Space);
9713   verifyFormat("alignas (128) char a[128];", Space);
9714   verifyFormat("size_t x = alignof (MyType);", Space);
9715   verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
9716   verifyFormat("int f () throw (Deprecated);", Space);
9717   verifyFormat("typedef void (*cb) (int);", Space);
9718   verifyFormat("T A::operator() ();", Space);
9719   verifyFormat("X A::operator++ (T);", Space);
9720   verifyFormat("auto lambda = [] () { return 0; };", Space);
9721   verifyFormat("int x = int (y);", Space);
9722 
9723   FormatStyle SomeSpace = getLLVMStyle();
9724   SomeSpace.SpaceBeforeParens = FormatStyle::SBPO_NonEmptyParentheses;
9725 
9726   verifyFormat("[]() -> float {}", SomeSpace);
9727   verifyFormat("[] (auto foo) {}", SomeSpace);
9728   verifyFormat("[foo]() -> int {}", SomeSpace);
9729   verifyFormat("int f();", SomeSpace);
9730   verifyFormat("void f (int a, T b) {\n"
9731                "  while (true)\n"
9732                "    continue;\n"
9733                "}",
9734                SomeSpace);
9735   verifyFormat("if (true)\n"
9736                "  f();\n"
9737                "else if (true)\n"
9738                "  f();",
9739                SomeSpace);
9740   verifyFormat("do {\n"
9741                "  do_something();\n"
9742                "} while (something());",
9743                SomeSpace);
9744   verifyFormat("switch (x) {\n"
9745                "default:\n"
9746                "  break;\n"
9747                "}",
9748                SomeSpace);
9749   verifyFormat("A::A() : a (1) {}", SomeSpace);
9750   verifyFormat("void f() __attribute__ ((asdf));", SomeSpace);
9751   verifyFormat("*(&a + 1);\n"
9752                "&((&a)[1]);\n"
9753                "a[(b + c) * d];\n"
9754                "(((a + 1) * 2) + 3) * 4;",
9755                SomeSpace);
9756   verifyFormat("#define A(x) x", SomeSpace);
9757   verifyFormat("#define A (x) x", SomeSpace);
9758   verifyFormat("#if defined(x)\n"
9759                "#endif",
9760                SomeSpace);
9761   verifyFormat("auto i = std::make_unique<int> (5);", SomeSpace);
9762   verifyFormat("size_t x = sizeof (x);", SomeSpace);
9763   verifyFormat("auto f (int x) -> decltype (x);", SomeSpace);
9764   verifyFormat("int f (T x) noexcept (x.create());", SomeSpace);
9765   verifyFormat("alignas (128) char a[128];", SomeSpace);
9766   verifyFormat("size_t x = alignof (MyType);", SomeSpace);
9767   verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");",
9768                SomeSpace);
9769   verifyFormat("int f() throw (Deprecated);", SomeSpace);
9770   verifyFormat("typedef void (*cb) (int);", SomeSpace);
9771   verifyFormat("T A::operator()();", SomeSpace);
9772   verifyFormat("X A::operator++ (T);", SomeSpace);
9773   verifyFormat("int x = int (y);", SomeSpace);
9774   verifyFormat("auto lambda = []() { return 0; };", SomeSpace);
9775 }
9776 
9777 TEST_F(FormatTest, SpaceAfterLogicalNot) {
9778   FormatStyle Spaces = getLLVMStyle();
9779   Spaces.SpaceAfterLogicalNot = true;
9780 
9781   verifyFormat("bool x = ! y", Spaces);
9782   verifyFormat("if (! isFailure())", Spaces);
9783   verifyFormat("if (! (a && b))", Spaces);
9784   verifyFormat("\"Error!\"", Spaces);
9785   verifyFormat("! ! x", Spaces);
9786 }
9787 
9788 TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
9789   FormatStyle Spaces = getLLVMStyle();
9790 
9791   Spaces.SpacesInParentheses = true;
9792   verifyFormat("do_something( ::globalVar );", Spaces);
9793   verifyFormat("call( x, y, z );", Spaces);
9794   verifyFormat("call();", Spaces);
9795   verifyFormat("std::function<void( int, int )> callback;", Spaces);
9796   verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
9797                Spaces);
9798   verifyFormat("while ( (bool)1 )\n"
9799                "  continue;",
9800                Spaces);
9801   verifyFormat("for ( ;; )\n"
9802                "  continue;",
9803                Spaces);
9804   verifyFormat("if ( true )\n"
9805                "  f();\n"
9806                "else if ( true )\n"
9807                "  f();",
9808                Spaces);
9809   verifyFormat("do {\n"
9810                "  do_something( (int)i );\n"
9811                "} while ( something() );",
9812                Spaces);
9813   verifyFormat("switch ( x ) {\n"
9814                "default:\n"
9815                "  break;\n"
9816                "}",
9817                Spaces);
9818 
9819   Spaces.SpacesInParentheses = false;
9820   Spaces.SpacesInCStyleCastParentheses = true;
9821   verifyFormat("Type *A = ( Type * )P;", Spaces);
9822   verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
9823   verifyFormat("x = ( int32 )y;", Spaces);
9824   verifyFormat("int a = ( int )(2.0f);", Spaces);
9825   verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
9826   verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
9827   verifyFormat("#define x (( int )-1)", Spaces);
9828 
9829   // Run the first set of tests again with:
9830   Spaces.SpacesInParentheses = false;
9831   Spaces.SpaceInEmptyParentheses = true;
9832   Spaces.SpacesInCStyleCastParentheses = true;
9833   verifyFormat("call(x, y, z);", Spaces);
9834   verifyFormat("call( );", Spaces);
9835   verifyFormat("std::function<void(int, int)> callback;", Spaces);
9836   verifyFormat("while (( bool )1)\n"
9837                "  continue;",
9838                Spaces);
9839   verifyFormat("for (;;)\n"
9840                "  continue;",
9841                Spaces);
9842   verifyFormat("if (true)\n"
9843                "  f( );\n"
9844                "else if (true)\n"
9845                "  f( );",
9846                Spaces);
9847   verifyFormat("do {\n"
9848                "  do_something(( int )i);\n"
9849                "} while (something( ));",
9850                Spaces);
9851   verifyFormat("switch (x) {\n"
9852                "default:\n"
9853                "  break;\n"
9854                "}",
9855                Spaces);
9856 
9857   // Run the first set of tests again with:
9858   Spaces.SpaceAfterCStyleCast = true;
9859   verifyFormat("call(x, y, z);", Spaces);
9860   verifyFormat("call( );", Spaces);
9861   verifyFormat("std::function<void(int, int)> callback;", Spaces);
9862   verifyFormat("while (( bool ) 1)\n"
9863                "  continue;",
9864                Spaces);
9865   verifyFormat("for (;;)\n"
9866                "  continue;",
9867                Spaces);
9868   verifyFormat("if (true)\n"
9869                "  f( );\n"
9870                "else if (true)\n"
9871                "  f( );",
9872                Spaces);
9873   verifyFormat("do {\n"
9874                "  do_something(( int ) i);\n"
9875                "} while (something( ));",
9876                Spaces);
9877   verifyFormat("switch (x) {\n"
9878                "default:\n"
9879                "  break;\n"
9880                "}",
9881                Spaces);
9882 
9883   // Run subset of tests again with:
9884   Spaces.SpacesInCStyleCastParentheses = false;
9885   Spaces.SpaceAfterCStyleCast = true;
9886   verifyFormat("while ((bool) 1)\n"
9887                "  continue;",
9888                Spaces);
9889   verifyFormat("do {\n"
9890                "  do_something((int) i);\n"
9891                "} while (something( ));",
9892                Spaces);
9893 }
9894 
9895 TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
9896   verifyFormat("int a[5];");
9897   verifyFormat("a[3] += 42;");
9898 
9899   FormatStyle Spaces = getLLVMStyle();
9900   Spaces.SpacesInSquareBrackets = true;
9901   // Lambdas unchanged.
9902   verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
9903   verifyFormat("return [i, args...] {};", Spaces);
9904 
9905   // Not lambdas.
9906   verifyFormat("int a[ 5 ];", Spaces);
9907   verifyFormat("a[ 3 ] += 42;", Spaces);
9908   verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
9909   verifyFormat("double &operator[](int i) { return 0; }\n"
9910                "int i;",
9911                Spaces);
9912   verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
9913   verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
9914   verifyFormat("int i = (*b)[ a ]->f();", Spaces);
9915 }
9916 
9917 TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
9918   verifyFormat("int a = 5;");
9919   verifyFormat("a += 42;");
9920   verifyFormat("a or_eq 8;");
9921 
9922   FormatStyle Spaces = getLLVMStyle();
9923   Spaces.SpaceBeforeAssignmentOperators = false;
9924   verifyFormat("int a= 5;", Spaces);
9925   verifyFormat("a+= 42;", Spaces);
9926   verifyFormat("a or_eq 8;", Spaces);
9927 }
9928 
9929 TEST_F(FormatTest, ConfigurableSpaceBeforeColon) {
9930   verifyFormat("class Foo : public Bar {};");
9931   verifyFormat("Foo::Foo() : foo(1) {}");
9932   verifyFormat("for (auto a : b) {\n}");
9933   verifyFormat("int x = a ? b : c;");
9934   verifyFormat("{\n"
9935                "label0:\n"
9936                "  int x = 0;\n"
9937                "}");
9938   verifyFormat("switch (x) {\n"
9939                "case 1:\n"
9940                "default:\n"
9941                "}");
9942 
9943   FormatStyle CtorInitializerStyle = getLLVMStyleWithColumns(30);
9944   CtorInitializerStyle.SpaceBeforeCtorInitializerColon = false;
9945   verifyFormat("class Foo : public Bar {};", CtorInitializerStyle);
9946   verifyFormat("Foo::Foo(): foo(1) {}", CtorInitializerStyle);
9947   verifyFormat("for (auto a : b) {\n}", CtorInitializerStyle);
9948   verifyFormat("int x = a ? b : c;", CtorInitializerStyle);
9949   verifyFormat("{\n"
9950                "label1:\n"
9951                "  int x = 0;\n"
9952                "}",
9953                CtorInitializerStyle);
9954   verifyFormat("switch (x) {\n"
9955                "case 1:\n"
9956                "default:\n"
9957                "}",
9958                CtorInitializerStyle);
9959   CtorInitializerStyle.BreakConstructorInitializers =
9960       FormatStyle::BCIS_AfterColon;
9961   verifyFormat("Fooooooooooo::Fooooooooooo():\n"
9962                "    aaaaaaaaaaaaaaaa(1),\n"
9963                "    bbbbbbbbbbbbbbbb(2) {}",
9964                CtorInitializerStyle);
9965   CtorInitializerStyle.BreakConstructorInitializers =
9966       FormatStyle::BCIS_BeforeComma;
9967   verifyFormat("Fooooooooooo::Fooooooooooo()\n"
9968                "    : aaaaaaaaaaaaaaaa(1)\n"
9969                "    , bbbbbbbbbbbbbbbb(2) {}",
9970                CtorInitializerStyle);
9971   CtorInitializerStyle.BreakConstructorInitializers =
9972       FormatStyle::BCIS_BeforeColon;
9973   verifyFormat("Fooooooooooo::Fooooooooooo()\n"
9974                "    : aaaaaaaaaaaaaaaa(1),\n"
9975                "      bbbbbbbbbbbbbbbb(2) {}",
9976                CtorInitializerStyle);
9977   CtorInitializerStyle.ConstructorInitializerIndentWidth = 0;
9978   verifyFormat("Fooooooooooo::Fooooooooooo()\n"
9979                ": aaaaaaaaaaaaaaaa(1),\n"
9980                "  bbbbbbbbbbbbbbbb(2) {}",
9981                CtorInitializerStyle);
9982 
9983   FormatStyle InheritanceStyle = getLLVMStyleWithColumns(30);
9984   InheritanceStyle.SpaceBeforeInheritanceColon = false;
9985   verifyFormat("class Foo: public Bar {};", InheritanceStyle);
9986   verifyFormat("Foo::Foo() : foo(1) {}", InheritanceStyle);
9987   verifyFormat("for (auto a : b) {\n}", InheritanceStyle);
9988   verifyFormat("int x = a ? b : c;", InheritanceStyle);
9989   verifyFormat("{\n"
9990                "label2:\n"
9991                "  int x = 0;\n"
9992                "}",
9993                InheritanceStyle);
9994   verifyFormat("switch (x) {\n"
9995                "case 1:\n"
9996                "default:\n"
9997                "}",
9998                InheritanceStyle);
9999   InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_AfterColon;
10000   verifyFormat("class Foooooooooooooooooooooo:\n"
10001                "    public aaaaaaaaaaaaaaaaaa,\n"
10002                "    public bbbbbbbbbbbbbbbbbb {\n"
10003                "}",
10004                InheritanceStyle);
10005   InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeComma;
10006   verifyFormat("class Foooooooooooooooooooooo\n"
10007                "    : public aaaaaaaaaaaaaaaaaa\n"
10008                "    , public bbbbbbbbbbbbbbbbbb {\n"
10009                "}",
10010                InheritanceStyle);
10011   InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
10012   verifyFormat("class Foooooooooooooooooooooo\n"
10013                "    : public aaaaaaaaaaaaaaaaaa,\n"
10014                "      public bbbbbbbbbbbbbbbbbb {\n"
10015                "}",
10016                InheritanceStyle);
10017   InheritanceStyle.ConstructorInitializerIndentWidth = 0;
10018   verifyFormat("class Foooooooooooooooooooooo\n"
10019                ": public aaaaaaaaaaaaaaaaaa,\n"
10020                "  public bbbbbbbbbbbbbbbbbb {}",
10021                InheritanceStyle);
10022 
10023   FormatStyle ForLoopStyle = getLLVMStyle();
10024   ForLoopStyle.SpaceBeforeRangeBasedForLoopColon = false;
10025   verifyFormat("class Foo : public Bar {};", ForLoopStyle);
10026   verifyFormat("Foo::Foo() : foo(1) {}", ForLoopStyle);
10027   verifyFormat("for (auto a: b) {\n}", ForLoopStyle);
10028   verifyFormat("int x = a ? b : c;", ForLoopStyle);
10029   verifyFormat("{\n"
10030                "label2:\n"
10031                "  int x = 0;\n"
10032                "}",
10033                ForLoopStyle);
10034   verifyFormat("switch (x) {\n"
10035                "case 1:\n"
10036                "default:\n"
10037                "}",
10038                ForLoopStyle);
10039 
10040   FormatStyle NoSpaceStyle = getLLVMStyle();
10041   NoSpaceStyle.SpaceBeforeCtorInitializerColon = false;
10042   NoSpaceStyle.SpaceBeforeInheritanceColon = false;
10043   NoSpaceStyle.SpaceBeforeRangeBasedForLoopColon = false;
10044   verifyFormat("class Foo: public Bar {};", NoSpaceStyle);
10045   verifyFormat("Foo::Foo(): foo(1) {}", NoSpaceStyle);
10046   verifyFormat("for (auto a: b) {\n}", NoSpaceStyle);
10047   verifyFormat("int x = a ? b : c;", NoSpaceStyle);
10048   verifyFormat("{\n"
10049                "label3:\n"
10050                "  int x = 0;\n"
10051                "}",
10052                NoSpaceStyle);
10053   verifyFormat("switch (x) {\n"
10054                "case 1:\n"
10055                "default:\n"
10056                "}",
10057                NoSpaceStyle);
10058 }
10059 
10060 TEST_F(FormatTest, AlignConsecutiveAssignments) {
10061   FormatStyle Alignment = getLLVMStyle();
10062   Alignment.AlignConsecutiveAssignments = false;
10063   verifyFormat("int a = 5;\n"
10064                "int oneTwoThree = 123;",
10065                Alignment);
10066   verifyFormat("int a = 5;\n"
10067                "int oneTwoThree = 123;",
10068                Alignment);
10069 
10070   Alignment.AlignConsecutiveAssignments = true;
10071   verifyFormat("int a           = 5;\n"
10072                "int oneTwoThree = 123;",
10073                Alignment);
10074   verifyFormat("int a           = method();\n"
10075                "int oneTwoThree = 133;",
10076                Alignment);
10077   verifyFormat("a &= 5;\n"
10078                "bcd *= 5;\n"
10079                "ghtyf += 5;\n"
10080                "dvfvdb -= 5;\n"
10081                "a /= 5;\n"
10082                "vdsvsv %= 5;\n"
10083                "sfdbddfbdfbb ^= 5;\n"
10084                "dvsdsv |= 5;\n"
10085                "int dsvvdvsdvvv = 123;",
10086                Alignment);
10087   verifyFormat("int i = 1, j = 10;\n"
10088                "something = 2000;",
10089                Alignment);
10090   verifyFormat("something = 2000;\n"
10091                "int i = 1, j = 10;\n",
10092                Alignment);
10093   verifyFormat("something = 2000;\n"
10094                "another   = 911;\n"
10095                "int i = 1, j = 10;\n"
10096                "oneMore = 1;\n"
10097                "i       = 2;",
10098                Alignment);
10099   verifyFormat("int a   = 5;\n"
10100                "int one = 1;\n"
10101                "method();\n"
10102                "int oneTwoThree = 123;\n"
10103                "int oneTwo      = 12;",
10104                Alignment);
10105   verifyFormat("int oneTwoThree = 123;\n"
10106                "int oneTwo      = 12;\n"
10107                "method();\n",
10108                Alignment);
10109   verifyFormat("int oneTwoThree = 123; // comment\n"
10110                "int oneTwo      = 12;  // comment",
10111                Alignment);
10112   EXPECT_EQ("int a = 5;\n"
10113             "\n"
10114             "int oneTwoThree = 123;",
10115             format("int a       = 5;\n"
10116                    "\n"
10117                    "int oneTwoThree= 123;",
10118                    Alignment));
10119   EXPECT_EQ("int a   = 5;\n"
10120             "int one = 1;\n"
10121             "\n"
10122             "int oneTwoThree = 123;",
10123             format("int a = 5;\n"
10124                    "int one = 1;\n"
10125                    "\n"
10126                    "int oneTwoThree = 123;",
10127                    Alignment));
10128   EXPECT_EQ("int a   = 5;\n"
10129             "int one = 1;\n"
10130             "\n"
10131             "int oneTwoThree = 123;\n"
10132             "int oneTwo      = 12;",
10133             format("int a = 5;\n"
10134                    "int one = 1;\n"
10135                    "\n"
10136                    "int oneTwoThree = 123;\n"
10137                    "int oneTwo = 12;",
10138                    Alignment));
10139   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
10140   verifyFormat("#define A \\\n"
10141                "  int aaaa       = 12; \\\n"
10142                "  int b          = 23; \\\n"
10143                "  int ccc        = 234; \\\n"
10144                "  int dddddddddd = 2345;",
10145                Alignment);
10146   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
10147   verifyFormat("#define A               \\\n"
10148                "  int aaaa       = 12;  \\\n"
10149                "  int b          = 23;  \\\n"
10150                "  int ccc        = 234; \\\n"
10151                "  int dddddddddd = 2345;",
10152                Alignment);
10153   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
10154   verifyFormat("#define A                                                      "
10155                "                \\\n"
10156                "  int aaaa       = 12;                                         "
10157                "                \\\n"
10158                "  int b          = 23;                                         "
10159                "                \\\n"
10160                "  int ccc        = 234;                                        "
10161                "                \\\n"
10162                "  int dddddddddd = 2345;",
10163                Alignment);
10164   verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
10165                "k = 4, int l = 5,\n"
10166                "                  int m = 6) {\n"
10167                "  int j      = 10;\n"
10168                "  otherThing = 1;\n"
10169                "}",
10170                Alignment);
10171   verifyFormat("void SomeFunction(int parameter = 0) {\n"
10172                "  int i   = 1;\n"
10173                "  int j   = 2;\n"
10174                "  int big = 10000;\n"
10175                "}",
10176                Alignment);
10177   verifyFormat("class C {\n"
10178                "public:\n"
10179                "  int i            = 1;\n"
10180                "  virtual void f() = 0;\n"
10181                "};",
10182                Alignment);
10183   verifyFormat("int i = 1;\n"
10184                "if (SomeType t = getSomething()) {\n"
10185                "}\n"
10186                "int j   = 2;\n"
10187                "int big = 10000;",
10188                Alignment);
10189   verifyFormat("int j = 7;\n"
10190                "for (int k = 0; k < N; ++k) {\n"
10191                "}\n"
10192                "int j   = 2;\n"
10193                "int big = 10000;\n"
10194                "}",
10195                Alignment);
10196   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
10197   verifyFormat("int i = 1;\n"
10198                "LooooooooooongType loooooooooooooooooooooongVariable\n"
10199                "    = someLooooooooooooooooongFunction();\n"
10200                "int j = 2;",
10201                Alignment);
10202   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
10203   verifyFormat("int i = 1;\n"
10204                "LooooooooooongType loooooooooooooooooooooongVariable =\n"
10205                "    someLooooooooooooooooongFunction();\n"
10206                "int j = 2;",
10207                Alignment);
10208 
10209   verifyFormat("auto lambda = []() {\n"
10210                "  auto i = 0;\n"
10211                "  return 0;\n"
10212                "};\n"
10213                "int i  = 0;\n"
10214                "auto v = type{\n"
10215                "    i = 1,   //\n"
10216                "    (i = 2), //\n"
10217                "    i = 3    //\n"
10218                "};",
10219                Alignment);
10220 
10221   verifyFormat(
10222       "int i      = 1;\n"
10223       "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
10224       "                          loooooooooooooooooooooongParameterB);\n"
10225       "int j      = 2;",
10226       Alignment);
10227 
10228   verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
10229                "          typename B   = very_long_type_name_1,\n"
10230                "          typename T_2 = very_long_type_name_2>\n"
10231                "auto foo() {}\n",
10232                Alignment);
10233   verifyFormat("int a, b = 1;\n"
10234                "int c  = 2;\n"
10235                "int dd = 3;\n",
10236                Alignment);
10237   verifyFormat("int aa       = ((1 > 2) ? 3 : 4);\n"
10238                "float b[1][] = {{3.f}};\n",
10239                Alignment);
10240   verifyFormat("for (int i = 0; i < 1; i++)\n"
10241                "  int x = 1;\n",
10242                Alignment);
10243   verifyFormat("for (i = 0; i < 1; i++)\n"
10244                "  x = 1;\n"
10245                "y = 1;\n",
10246                Alignment);
10247 }
10248 
10249 TEST_F(FormatTest, AlignConsecutiveDeclarations) {
10250   FormatStyle Alignment = getLLVMStyle();
10251   Alignment.AlignConsecutiveDeclarations = false;
10252   verifyFormat("float const a = 5;\n"
10253                "int oneTwoThree = 123;",
10254                Alignment);
10255   verifyFormat("int a = 5;\n"
10256                "float const oneTwoThree = 123;",
10257                Alignment);
10258 
10259   Alignment.AlignConsecutiveDeclarations = true;
10260   verifyFormat("float const a = 5;\n"
10261                "int         oneTwoThree = 123;",
10262                Alignment);
10263   verifyFormat("int         a = method();\n"
10264                "float const oneTwoThree = 133;",
10265                Alignment);
10266   verifyFormat("int i = 1, j = 10;\n"
10267                "something = 2000;",
10268                Alignment);
10269   verifyFormat("something = 2000;\n"
10270                "int i = 1, j = 10;\n",
10271                Alignment);
10272   verifyFormat("float      something = 2000;\n"
10273                "double     another = 911;\n"
10274                "int        i = 1, j = 10;\n"
10275                "const int *oneMore = 1;\n"
10276                "unsigned   i = 2;",
10277                Alignment);
10278   verifyFormat("float a = 5;\n"
10279                "int   one = 1;\n"
10280                "method();\n"
10281                "const double       oneTwoThree = 123;\n"
10282                "const unsigned int oneTwo = 12;",
10283                Alignment);
10284   verifyFormat("int      oneTwoThree{0}; // comment\n"
10285                "unsigned oneTwo;         // comment",
10286                Alignment);
10287   EXPECT_EQ("float const a = 5;\n"
10288             "\n"
10289             "int oneTwoThree = 123;",
10290             format("float const   a = 5;\n"
10291                    "\n"
10292                    "int           oneTwoThree= 123;",
10293                    Alignment));
10294   EXPECT_EQ("float a = 5;\n"
10295             "int   one = 1;\n"
10296             "\n"
10297             "unsigned oneTwoThree = 123;",
10298             format("float    a = 5;\n"
10299                    "int      one = 1;\n"
10300                    "\n"
10301                    "unsigned oneTwoThree = 123;",
10302                    Alignment));
10303   EXPECT_EQ("float a = 5;\n"
10304             "int   one = 1;\n"
10305             "\n"
10306             "unsigned oneTwoThree = 123;\n"
10307             "int      oneTwo = 12;",
10308             format("float    a = 5;\n"
10309                    "int one = 1;\n"
10310                    "\n"
10311                    "unsigned oneTwoThree = 123;\n"
10312                    "int oneTwo = 12;",
10313                    Alignment));
10314   // Function prototype alignment
10315   verifyFormat("int    a();\n"
10316                "double b();",
10317                Alignment);
10318   verifyFormat("int    a(int x);\n"
10319                "double b();",
10320                Alignment);
10321   unsigned OldColumnLimit = Alignment.ColumnLimit;
10322   // We need to set ColumnLimit to zero, in order to stress nested alignments,
10323   // otherwise the function parameters will be re-flowed onto a single line.
10324   Alignment.ColumnLimit = 0;
10325   EXPECT_EQ("int    a(int   x,\n"
10326             "         float y);\n"
10327             "double b(int    x,\n"
10328             "         double y);",
10329             format("int a(int x,\n"
10330                    " float y);\n"
10331                    "double b(int x,\n"
10332                    " double y);",
10333                    Alignment));
10334   // This ensures that function parameters of function declarations are
10335   // correctly indented when their owning functions are indented.
10336   // The failure case here is for 'double y' to not be indented enough.
10337   EXPECT_EQ("double a(int x);\n"
10338             "int    b(int    y,\n"
10339             "         double z);",
10340             format("double a(int x);\n"
10341                    "int b(int y,\n"
10342                    " double z);",
10343                    Alignment));
10344   // Set ColumnLimit low so that we induce wrapping immediately after
10345   // the function name and opening paren.
10346   Alignment.ColumnLimit = 13;
10347   verifyFormat("int function(\n"
10348                "    int  x,\n"
10349                "    bool y);",
10350                Alignment);
10351   Alignment.ColumnLimit = OldColumnLimit;
10352   // Ensure function pointers don't screw up recursive alignment
10353   verifyFormat("int    a(int x, void (*fp)(int y));\n"
10354                "double b();",
10355                Alignment);
10356   Alignment.AlignConsecutiveAssignments = true;
10357   // Ensure recursive alignment is broken by function braces, so that the
10358   // "a = 1" does not align with subsequent assignments inside the function
10359   // body.
10360   verifyFormat("int func(int a = 1) {\n"
10361                "  int b  = 2;\n"
10362                "  int cc = 3;\n"
10363                "}",
10364                Alignment);
10365   verifyFormat("float      something = 2000;\n"
10366                "double     another   = 911;\n"
10367                "int        i = 1, j = 10;\n"
10368                "const int *oneMore = 1;\n"
10369                "unsigned   i       = 2;",
10370                Alignment);
10371   verifyFormat("int      oneTwoThree = {0}; // comment\n"
10372                "unsigned oneTwo      = 0;   // comment",
10373                Alignment);
10374   // Make sure that scope is correctly tracked, in the absence of braces
10375   verifyFormat("for (int i = 0; i < n; i++)\n"
10376                "  j = i;\n"
10377                "double x = 1;\n",
10378                Alignment);
10379   verifyFormat("if (int i = 0)\n"
10380                "  j = i;\n"
10381                "double x = 1;\n",
10382                Alignment);
10383   // Ensure operator[] and operator() are comprehended
10384   verifyFormat("struct test {\n"
10385                "  long long int foo();\n"
10386                "  int           operator[](int a);\n"
10387                "  double        bar();\n"
10388                "};\n",
10389                Alignment);
10390   verifyFormat("struct test {\n"
10391                "  long long int foo();\n"
10392                "  int           operator()(int a);\n"
10393                "  double        bar();\n"
10394                "};\n",
10395                Alignment);
10396   EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
10397             "  int const i   = 1;\n"
10398             "  int *     j   = 2;\n"
10399             "  int       big = 10000;\n"
10400             "\n"
10401             "  unsigned oneTwoThree = 123;\n"
10402             "  int      oneTwo      = 12;\n"
10403             "  method();\n"
10404             "  float k  = 2;\n"
10405             "  int   ll = 10000;\n"
10406             "}",
10407             format("void SomeFunction(int parameter= 0) {\n"
10408                    " int const  i= 1;\n"
10409                    "  int *j=2;\n"
10410                    " int big  =  10000;\n"
10411                    "\n"
10412                    "unsigned oneTwoThree  =123;\n"
10413                    "int oneTwo = 12;\n"
10414                    "  method();\n"
10415                    "float k= 2;\n"
10416                    "int ll=10000;\n"
10417                    "}",
10418                    Alignment));
10419   Alignment.AlignConsecutiveAssignments = false;
10420   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
10421   verifyFormat("#define A \\\n"
10422                "  int       aaaa = 12; \\\n"
10423                "  float     b = 23; \\\n"
10424                "  const int ccc = 234; \\\n"
10425                "  unsigned  dddddddddd = 2345;",
10426                Alignment);
10427   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
10428   verifyFormat("#define A              \\\n"
10429                "  int       aaaa = 12; \\\n"
10430                "  float     b = 23;    \\\n"
10431                "  const int ccc = 234; \\\n"
10432                "  unsigned  dddddddddd = 2345;",
10433                Alignment);
10434   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
10435   Alignment.ColumnLimit = 30;
10436   verifyFormat("#define A                    \\\n"
10437                "  int       aaaa = 12;       \\\n"
10438                "  float     b = 23;          \\\n"
10439                "  const int ccc = 234;       \\\n"
10440                "  int       dddddddddd = 2345;",
10441                Alignment);
10442   Alignment.ColumnLimit = 80;
10443   verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
10444                "k = 4, int l = 5,\n"
10445                "                  int m = 6) {\n"
10446                "  const int j = 10;\n"
10447                "  otherThing = 1;\n"
10448                "}",
10449                Alignment);
10450   verifyFormat("void SomeFunction(int parameter = 0) {\n"
10451                "  int const i = 1;\n"
10452                "  int *     j = 2;\n"
10453                "  int       big = 10000;\n"
10454                "}",
10455                Alignment);
10456   verifyFormat("class C {\n"
10457                "public:\n"
10458                "  int          i = 1;\n"
10459                "  virtual void f() = 0;\n"
10460                "};",
10461                Alignment);
10462   verifyFormat("float i = 1;\n"
10463                "if (SomeType t = getSomething()) {\n"
10464                "}\n"
10465                "const unsigned j = 2;\n"
10466                "int            big = 10000;",
10467                Alignment);
10468   verifyFormat("float j = 7;\n"
10469                "for (int k = 0; k < N; ++k) {\n"
10470                "}\n"
10471                "unsigned j = 2;\n"
10472                "int      big = 10000;\n"
10473                "}",
10474                Alignment);
10475   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
10476   verifyFormat("float              i = 1;\n"
10477                "LooooooooooongType loooooooooooooooooooooongVariable\n"
10478                "    = someLooooooooooooooooongFunction();\n"
10479                "int j = 2;",
10480                Alignment);
10481   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
10482   verifyFormat("int                i = 1;\n"
10483                "LooooooooooongType loooooooooooooooooooooongVariable =\n"
10484                "    someLooooooooooooooooongFunction();\n"
10485                "int j = 2;",
10486                Alignment);
10487 
10488   Alignment.AlignConsecutiveAssignments = true;
10489   verifyFormat("auto lambda = []() {\n"
10490                "  auto  ii = 0;\n"
10491                "  float j  = 0;\n"
10492                "  return 0;\n"
10493                "};\n"
10494                "int   i  = 0;\n"
10495                "float i2 = 0;\n"
10496                "auto  v  = type{\n"
10497                "    i = 1,   //\n"
10498                "    (i = 2), //\n"
10499                "    i = 3    //\n"
10500                "};",
10501                Alignment);
10502   Alignment.AlignConsecutiveAssignments = false;
10503 
10504   verifyFormat(
10505       "int      i = 1;\n"
10506       "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
10507       "                          loooooooooooooooooooooongParameterB);\n"
10508       "int      j = 2;",
10509       Alignment);
10510 
10511   // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
10512   // We expect declarations and assignments to align, as long as it doesn't
10513   // exceed the column limit, starting a new alignment sequence whenever it
10514   // happens.
10515   Alignment.AlignConsecutiveAssignments = true;
10516   Alignment.ColumnLimit = 30;
10517   verifyFormat("float    ii              = 1;\n"
10518                "unsigned j               = 2;\n"
10519                "int someVerylongVariable = 1;\n"
10520                "AnotherLongType  ll = 123456;\n"
10521                "VeryVeryLongType k  = 2;\n"
10522                "int              myvar = 1;",
10523                Alignment);
10524   Alignment.ColumnLimit = 80;
10525   Alignment.AlignConsecutiveAssignments = false;
10526 
10527   verifyFormat(
10528       "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
10529       "          typename LongType, typename B>\n"
10530       "auto foo() {}\n",
10531       Alignment);
10532   verifyFormat("float a, b = 1;\n"
10533                "int   c = 2;\n"
10534                "int   dd = 3;\n",
10535                Alignment);
10536   verifyFormat("int   aa = ((1 > 2) ? 3 : 4);\n"
10537                "float b[1][] = {{3.f}};\n",
10538                Alignment);
10539   Alignment.AlignConsecutiveAssignments = true;
10540   verifyFormat("float a, b = 1;\n"
10541                "int   c  = 2;\n"
10542                "int   dd = 3;\n",
10543                Alignment);
10544   verifyFormat("int   aa     = ((1 > 2) ? 3 : 4);\n"
10545                "float b[1][] = {{3.f}};\n",
10546                Alignment);
10547   Alignment.AlignConsecutiveAssignments = false;
10548 
10549   Alignment.ColumnLimit = 30;
10550   Alignment.BinPackParameters = false;
10551   verifyFormat("void foo(float     a,\n"
10552                "         float     b,\n"
10553                "         int       c,\n"
10554                "         uint32_t *d) {\n"
10555                "  int *  e = 0;\n"
10556                "  float  f = 0;\n"
10557                "  double g = 0;\n"
10558                "}\n"
10559                "void bar(ino_t     a,\n"
10560                "         int       b,\n"
10561                "         uint32_t *c,\n"
10562                "         bool      d) {}\n",
10563                Alignment);
10564   Alignment.BinPackParameters = true;
10565   Alignment.ColumnLimit = 80;
10566 
10567   // Bug 33507
10568   Alignment.PointerAlignment = FormatStyle::PAS_Middle;
10569   verifyFormat(
10570       "auto found = range::find_if(vsProducts, [&](auto * aProduct) {\n"
10571       "  static const Version verVs2017;\n"
10572       "  return true;\n"
10573       "});\n",
10574       Alignment);
10575   Alignment.PointerAlignment = FormatStyle::PAS_Right;
10576 
10577   // See llvm.org/PR35641
10578   Alignment.AlignConsecutiveDeclarations = true;
10579   verifyFormat("int func() { //\n"
10580                "  int      b;\n"
10581                "  unsigned c;\n"
10582                "}",
10583                Alignment);
10584 
10585   // See PR37175
10586   FormatStyle Style = getMozillaStyle();
10587   Style.AlignConsecutiveDeclarations = true;
10588   EXPECT_EQ("DECOR1 /**/ int8_t /**/ DECOR2 /**/\n"
10589             "foo(int a);",
10590             format("DECOR1 /**/ int8_t /**/ DECOR2 /**/ foo (int a);", Style));
10591 }
10592 
10593 TEST_F(FormatTest, LinuxBraceBreaking) {
10594   FormatStyle LinuxBraceStyle = getLLVMStyle();
10595   LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
10596   verifyFormat("namespace a\n"
10597                "{\n"
10598                "class A\n"
10599                "{\n"
10600                "  void f()\n"
10601                "  {\n"
10602                "    if (true) {\n"
10603                "      a();\n"
10604                "      b();\n"
10605                "    } else {\n"
10606                "      a();\n"
10607                "    }\n"
10608                "  }\n"
10609                "  void g() { return; }\n"
10610                "};\n"
10611                "struct B {\n"
10612                "  int x;\n"
10613                "};\n"
10614                "} // namespace a\n",
10615                LinuxBraceStyle);
10616   verifyFormat("enum X {\n"
10617                "  Y = 0,\n"
10618                "}\n",
10619                LinuxBraceStyle);
10620   verifyFormat("struct S {\n"
10621                "  int Type;\n"
10622                "  union {\n"
10623                "    int x;\n"
10624                "    double y;\n"
10625                "  } Value;\n"
10626                "  class C\n"
10627                "  {\n"
10628                "    MyFavoriteType Value;\n"
10629                "  } Class;\n"
10630                "}\n",
10631                LinuxBraceStyle);
10632 }
10633 
10634 TEST_F(FormatTest, MozillaBraceBreaking) {
10635   FormatStyle MozillaBraceStyle = getLLVMStyle();
10636   MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
10637   MozillaBraceStyle.FixNamespaceComments = false;
10638   verifyFormat("namespace a {\n"
10639                "class A\n"
10640                "{\n"
10641                "  void f()\n"
10642                "  {\n"
10643                "    if (true) {\n"
10644                "      a();\n"
10645                "      b();\n"
10646                "    }\n"
10647                "  }\n"
10648                "  void g() { return; }\n"
10649                "};\n"
10650                "enum E\n"
10651                "{\n"
10652                "  A,\n"
10653                "  // foo\n"
10654                "  B,\n"
10655                "  C\n"
10656                "};\n"
10657                "struct B\n"
10658                "{\n"
10659                "  int x;\n"
10660                "};\n"
10661                "}\n",
10662                MozillaBraceStyle);
10663   verifyFormat("struct S\n"
10664                "{\n"
10665                "  int Type;\n"
10666                "  union\n"
10667                "  {\n"
10668                "    int x;\n"
10669                "    double y;\n"
10670                "  } Value;\n"
10671                "  class C\n"
10672                "  {\n"
10673                "    MyFavoriteType Value;\n"
10674                "  } Class;\n"
10675                "}\n",
10676                MozillaBraceStyle);
10677 }
10678 
10679 TEST_F(FormatTest, StroustrupBraceBreaking) {
10680   FormatStyle StroustrupBraceStyle = getLLVMStyle();
10681   StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
10682   verifyFormat("namespace a {\n"
10683                "class A {\n"
10684                "  void f()\n"
10685                "  {\n"
10686                "    if (true) {\n"
10687                "      a();\n"
10688                "      b();\n"
10689                "    }\n"
10690                "  }\n"
10691                "  void g() { return; }\n"
10692                "};\n"
10693                "struct B {\n"
10694                "  int x;\n"
10695                "};\n"
10696                "} // namespace a\n",
10697                StroustrupBraceStyle);
10698 
10699   verifyFormat("void foo()\n"
10700                "{\n"
10701                "  if (a) {\n"
10702                "    a();\n"
10703                "  }\n"
10704                "  else {\n"
10705                "    b();\n"
10706                "  }\n"
10707                "}\n",
10708                StroustrupBraceStyle);
10709 
10710   verifyFormat("#ifdef _DEBUG\n"
10711                "int foo(int i = 0)\n"
10712                "#else\n"
10713                "int foo(int i = 5)\n"
10714                "#endif\n"
10715                "{\n"
10716                "  return i;\n"
10717                "}",
10718                StroustrupBraceStyle);
10719 
10720   verifyFormat("void foo() {}\n"
10721                "void bar()\n"
10722                "#ifdef _DEBUG\n"
10723                "{\n"
10724                "  foo();\n"
10725                "}\n"
10726                "#else\n"
10727                "{\n"
10728                "}\n"
10729                "#endif",
10730                StroustrupBraceStyle);
10731 
10732   verifyFormat("void foobar() { int i = 5; }\n"
10733                "#ifdef _DEBUG\n"
10734                "void bar() {}\n"
10735                "#else\n"
10736                "void bar() { foobar(); }\n"
10737                "#endif",
10738                StroustrupBraceStyle);
10739 }
10740 
10741 TEST_F(FormatTest, AllmanBraceBreaking) {
10742   FormatStyle AllmanBraceStyle = getLLVMStyle();
10743   AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
10744 
10745   EXPECT_EQ("namespace a\n"
10746             "{\n"
10747             "void f();\n"
10748             "void g();\n"
10749             "} // namespace a\n",
10750             format("namespace a\n"
10751                    "{\n"
10752                    "void f();\n"
10753                    "void g();\n"
10754                    "}\n",
10755                    AllmanBraceStyle));
10756 
10757   verifyFormat("namespace a\n"
10758                "{\n"
10759                "class A\n"
10760                "{\n"
10761                "  void f()\n"
10762                "  {\n"
10763                "    if (true)\n"
10764                "    {\n"
10765                "      a();\n"
10766                "      b();\n"
10767                "    }\n"
10768                "  }\n"
10769                "  void g() { return; }\n"
10770                "};\n"
10771                "struct B\n"
10772                "{\n"
10773                "  int x;\n"
10774                "};\n"
10775                "} // namespace a",
10776                AllmanBraceStyle);
10777 
10778   verifyFormat("void f()\n"
10779                "{\n"
10780                "  if (true)\n"
10781                "  {\n"
10782                "    a();\n"
10783                "  }\n"
10784                "  else if (false)\n"
10785                "  {\n"
10786                "    b();\n"
10787                "  }\n"
10788                "  else\n"
10789                "  {\n"
10790                "    c();\n"
10791                "  }\n"
10792                "}\n",
10793                AllmanBraceStyle);
10794 
10795   verifyFormat("void f()\n"
10796                "{\n"
10797                "  for (int i = 0; i < 10; ++i)\n"
10798                "  {\n"
10799                "    a();\n"
10800                "  }\n"
10801                "  while (false)\n"
10802                "  {\n"
10803                "    b();\n"
10804                "  }\n"
10805                "  do\n"
10806                "  {\n"
10807                "    c();\n"
10808                "  } while (false)\n"
10809                "}\n",
10810                AllmanBraceStyle);
10811 
10812   verifyFormat("void f(int a)\n"
10813                "{\n"
10814                "  switch (a)\n"
10815                "  {\n"
10816                "  case 0:\n"
10817                "    break;\n"
10818                "  case 1:\n"
10819                "  {\n"
10820                "    break;\n"
10821                "  }\n"
10822                "  case 2:\n"
10823                "  {\n"
10824                "  }\n"
10825                "  break;\n"
10826                "  default:\n"
10827                "    break;\n"
10828                "  }\n"
10829                "}\n",
10830                AllmanBraceStyle);
10831 
10832   verifyFormat("enum X\n"
10833                "{\n"
10834                "  Y = 0,\n"
10835                "}\n",
10836                AllmanBraceStyle);
10837   verifyFormat("enum X\n"
10838                "{\n"
10839                "  Y = 0\n"
10840                "}\n",
10841                AllmanBraceStyle);
10842 
10843   verifyFormat("@interface BSApplicationController ()\n"
10844                "{\n"
10845                "@private\n"
10846                "  id _extraIvar;\n"
10847                "}\n"
10848                "@end\n",
10849                AllmanBraceStyle);
10850 
10851   verifyFormat("#ifdef _DEBUG\n"
10852                "int foo(int i = 0)\n"
10853                "#else\n"
10854                "int foo(int i = 5)\n"
10855                "#endif\n"
10856                "{\n"
10857                "  return i;\n"
10858                "}",
10859                AllmanBraceStyle);
10860 
10861   verifyFormat("void foo() {}\n"
10862                "void bar()\n"
10863                "#ifdef _DEBUG\n"
10864                "{\n"
10865                "  foo();\n"
10866                "}\n"
10867                "#else\n"
10868                "{\n"
10869                "}\n"
10870                "#endif",
10871                AllmanBraceStyle);
10872 
10873   verifyFormat("void foobar() { int i = 5; }\n"
10874                "#ifdef _DEBUG\n"
10875                "void bar() {}\n"
10876                "#else\n"
10877                "void bar() { foobar(); }\n"
10878                "#endif",
10879                AllmanBraceStyle);
10880 
10881   // This shouldn't affect ObjC blocks..
10882   verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
10883                "  // ...\n"
10884                "  int i;\n"
10885                "}];",
10886                AllmanBraceStyle);
10887   verifyFormat("void (^block)(void) = ^{\n"
10888                "  // ...\n"
10889                "  int i;\n"
10890                "};",
10891                AllmanBraceStyle);
10892   // .. or dict literals.
10893   verifyFormat("void f()\n"
10894                "{\n"
10895                "  // ...\n"
10896                "  [object someMethod:@{@\"a\" : @\"b\"}];\n"
10897                "}",
10898                AllmanBraceStyle);
10899   verifyFormat("void f()\n"
10900                "{\n"
10901                "  // ...\n"
10902                "  [object someMethod:@{a : @\"b\"}];\n"
10903                "}",
10904                AllmanBraceStyle);
10905   verifyFormat("int f()\n"
10906                "{ // comment\n"
10907                "  return 42;\n"
10908                "}",
10909                AllmanBraceStyle);
10910 
10911   AllmanBraceStyle.ColumnLimit = 19;
10912   verifyFormat("void f() { int i; }", AllmanBraceStyle);
10913   AllmanBraceStyle.ColumnLimit = 18;
10914   verifyFormat("void f()\n"
10915                "{\n"
10916                "  int i;\n"
10917                "}",
10918                AllmanBraceStyle);
10919   AllmanBraceStyle.ColumnLimit = 80;
10920 
10921   FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
10922   BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine =
10923       FormatStyle::SIS_WithoutElse;
10924   BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
10925   verifyFormat("void f(bool b)\n"
10926                "{\n"
10927                "  if (b)\n"
10928                "  {\n"
10929                "    return;\n"
10930                "  }\n"
10931                "}\n",
10932                BreakBeforeBraceShortIfs);
10933   verifyFormat("void f(bool b)\n"
10934                "{\n"
10935                "  if constexpr (b)\n"
10936                "  {\n"
10937                "    return;\n"
10938                "  }\n"
10939                "}\n",
10940                BreakBeforeBraceShortIfs);
10941   verifyFormat("void f(bool b)\n"
10942                "{\n"
10943                "  if (b) return;\n"
10944                "}\n",
10945                BreakBeforeBraceShortIfs);
10946   verifyFormat("void f(bool b)\n"
10947                "{\n"
10948                "  if constexpr (b) return;\n"
10949                "}\n",
10950                BreakBeforeBraceShortIfs);
10951   verifyFormat("void f(bool b)\n"
10952                "{\n"
10953                "  while (b)\n"
10954                "  {\n"
10955                "    return;\n"
10956                "  }\n"
10957                "}\n",
10958                BreakBeforeBraceShortIfs);
10959 }
10960 
10961 TEST_F(FormatTest, GNUBraceBreaking) {
10962   FormatStyle GNUBraceStyle = getLLVMStyle();
10963   GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
10964   verifyFormat("namespace a\n"
10965                "{\n"
10966                "class A\n"
10967                "{\n"
10968                "  void f()\n"
10969                "  {\n"
10970                "    int a;\n"
10971                "    {\n"
10972                "      int b;\n"
10973                "    }\n"
10974                "    if (true)\n"
10975                "      {\n"
10976                "        a();\n"
10977                "        b();\n"
10978                "      }\n"
10979                "  }\n"
10980                "  void g() { return; }\n"
10981                "}\n"
10982                "} // namespace a",
10983                GNUBraceStyle);
10984 
10985   verifyFormat("void f()\n"
10986                "{\n"
10987                "  if (true)\n"
10988                "    {\n"
10989                "      a();\n"
10990                "    }\n"
10991                "  else if (false)\n"
10992                "    {\n"
10993                "      b();\n"
10994                "    }\n"
10995                "  else\n"
10996                "    {\n"
10997                "      c();\n"
10998                "    }\n"
10999                "}\n",
11000                GNUBraceStyle);
11001 
11002   verifyFormat("void f()\n"
11003                "{\n"
11004                "  for (int i = 0; i < 10; ++i)\n"
11005                "    {\n"
11006                "      a();\n"
11007                "    }\n"
11008                "  while (false)\n"
11009                "    {\n"
11010                "      b();\n"
11011                "    }\n"
11012                "  do\n"
11013                "    {\n"
11014                "      c();\n"
11015                "    }\n"
11016                "  while (false);\n"
11017                "}\n",
11018                GNUBraceStyle);
11019 
11020   verifyFormat("void f(int a)\n"
11021                "{\n"
11022                "  switch (a)\n"
11023                "    {\n"
11024                "    case 0:\n"
11025                "      break;\n"
11026                "    case 1:\n"
11027                "      {\n"
11028                "        break;\n"
11029                "      }\n"
11030                "    case 2:\n"
11031                "      {\n"
11032                "      }\n"
11033                "      break;\n"
11034                "    default:\n"
11035                "      break;\n"
11036                "    }\n"
11037                "}\n",
11038                GNUBraceStyle);
11039 
11040   verifyFormat("enum X\n"
11041                "{\n"
11042                "  Y = 0,\n"
11043                "}\n",
11044                GNUBraceStyle);
11045 
11046   verifyFormat("@interface BSApplicationController ()\n"
11047                "{\n"
11048                "@private\n"
11049                "  id _extraIvar;\n"
11050                "}\n"
11051                "@end\n",
11052                GNUBraceStyle);
11053 
11054   verifyFormat("#ifdef _DEBUG\n"
11055                "int foo(int i = 0)\n"
11056                "#else\n"
11057                "int foo(int i = 5)\n"
11058                "#endif\n"
11059                "{\n"
11060                "  return i;\n"
11061                "}",
11062                GNUBraceStyle);
11063 
11064   verifyFormat("void foo() {}\n"
11065                "void bar()\n"
11066                "#ifdef _DEBUG\n"
11067                "{\n"
11068                "  foo();\n"
11069                "}\n"
11070                "#else\n"
11071                "{\n"
11072                "}\n"
11073                "#endif",
11074                GNUBraceStyle);
11075 
11076   verifyFormat("void foobar() { int i = 5; }\n"
11077                "#ifdef _DEBUG\n"
11078                "void bar() {}\n"
11079                "#else\n"
11080                "void bar() { foobar(); }\n"
11081                "#endif",
11082                GNUBraceStyle);
11083 }
11084 
11085 TEST_F(FormatTest, WebKitBraceBreaking) {
11086   FormatStyle WebKitBraceStyle = getLLVMStyle();
11087   WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
11088   WebKitBraceStyle.FixNamespaceComments = false;
11089   verifyFormat("namespace a {\n"
11090                "class A {\n"
11091                "  void f()\n"
11092                "  {\n"
11093                "    if (true) {\n"
11094                "      a();\n"
11095                "      b();\n"
11096                "    }\n"
11097                "  }\n"
11098                "  void g() { return; }\n"
11099                "};\n"
11100                "enum E {\n"
11101                "  A,\n"
11102                "  // foo\n"
11103                "  B,\n"
11104                "  C\n"
11105                "};\n"
11106                "struct B {\n"
11107                "  int x;\n"
11108                "};\n"
11109                "}\n",
11110                WebKitBraceStyle);
11111   verifyFormat("struct S {\n"
11112                "  int Type;\n"
11113                "  union {\n"
11114                "    int x;\n"
11115                "    double y;\n"
11116                "  } Value;\n"
11117                "  class C {\n"
11118                "    MyFavoriteType Value;\n"
11119                "  } Class;\n"
11120                "};\n",
11121                WebKitBraceStyle);
11122 }
11123 
11124 TEST_F(FormatTest, CatchExceptionReferenceBinding) {
11125   verifyFormat("void f() {\n"
11126                "  try {\n"
11127                "  } catch (const Exception &e) {\n"
11128                "  }\n"
11129                "}\n",
11130                getLLVMStyle());
11131 }
11132 
11133 TEST_F(FormatTest, UnderstandsPragmas) {
11134   verifyFormat("#pragma omp reduction(| : var)");
11135   verifyFormat("#pragma omp reduction(+ : var)");
11136 
11137   EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
11138             "(including parentheses).",
11139             format("#pragma    mark   Any non-hyphenated or hyphenated string "
11140                    "(including parentheses)."));
11141 }
11142 
11143 TEST_F(FormatTest, UnderstandPragmaOption) {
11144   verifyFormat("#pragma option -C -A");
11145 
11146   EXPECT_EQ("#pragma option -C -A", format("#pragma    option   -C   -A"));
11147 }
11148 
11149 TEST_F(FormatTest, OptimizeBreakPenaltyVsExcess) {
11150   FormatStyle Style = getLLVMStyle();
11151   Style.ColumnLimit = 20;
11152 
11153   // See PR41213
11154   EXPECT_EQ("/*\n"
11155             " *\t9012345\n"
11156             " * /8901\n"
11157             " */",
11158             format("/*\n"
11159                    " *\t9012345 /8901\n"
11160                    " */",
11161                    Style));
11162   EXPECT_EQ("/*\n"
11163             " *345678\n"
11164             " *\t/8901\n"
11165             " */",
11166             format("/*\n"
11167                    " *345678\t/8901\n"
11168                    " */",
11169                    Style));
11170 
11171   verifyFormat("int a; // the\n"
11172                "       // comment", Style);
11173   EXPECT_EQ("int a; /* first line\n"
11174             "        * second\n"
11175             "        * line third\n"
11176             "        * line\n"
11177             "        */",
11178             format("int a; /* first line\n"
11179                    "        * second\n"
11180                    "        * line third\n"
11181                    "        * line\n"
11182                    "        */",
11183                    Style));
11184   EXPECT_EQ("int a; // first line\n"
11185             "       // second\n"
11186             "       // line third\n"
11187             "       // line",
11188             format("int a; // first line\n"
11189                    "       // second line\n"
11190                    "       // third line",
11191                    Style));
11192 
11193   Style.PenaltyExcessCharacter = 90;
11194   verifyFormat("int a; // the comment", Style);
11195   EXPECT_EQ("int a; // the comment\n"
11196             "       // aaa",
11197             format("int a; // the comment aaa", Style));
11198   EXPECT_EQ("int a; /* first line\n"
11199             "        * second line\n"
11200             "        * third line\n"
11201             "        */",
11202             format("int a; /* first line\n"
11203                    "        * second line\n"
11204                    "        * third line\n"
11205                    "        */",
11206                    Style));
11207   EXPECT_EQ("int a; // first line\n"
11208             "       // second line\n"
11209             "       // third line",
11210             format("int a; // first line\n"
11211                    "       // second line\n"
11212                    "       // third line",
11213                    Style));
11214   // FIXME: Investigate why this is not getting the same layout as the test
11215   // above.
11216   EXPECT_EQ("int a; /* first line\n"
11217             "        * second line\n"
11218             "        * third line\n"
11219             "        */",
11220             format("int a; /* first line second line third line"
11221                    "\n*/",
11222                    Style));
11223 
11224   EXPECT_EQ("// foo bar baz bazfoo\n"
11225             "// foo bar foo bar\n",
11226             format("// foo bar baz bazfoo\n"
11227                    "// foo bar foo           bar\n",
11228                    Style));
11229   EXPECT_EQ("// foo bar baz bazfoo\n"
11230             "// foo bar foo bar\n",
11231             format("// foo bar baz      bazfoo\n"
11232                    "// foo            bar foo bar\n",
11233                    Style));
11234 
11235   // FIXME: Optimally, we'd keep bazfoo on the first line and reflow bar to the
11236   // next one.
11237   EXPECT_EQ("// foo bar baz bazfoo\n"
11238             "// bar foo bar\n",
11239             format("// foo bar baz      bazfoo bar\n"
11240                    "// foo            bar\n",
11241                    Style));
11242 
11243   EXPECT_EQ("// foo bar baz bazfoo\n"
11244             "// foo bar baz bazfoo\n"
11245             "// bar foo bar\n",
11246             format("// foo bar baz      bazfoo\n"
11247                    "// foo bar baz      bazfoo bar\n"
11248                    "// foo bar\n",
11249                    Style));
11250 
11251   EXPECT_EQ("// foo bar baz bazfoo\n"
11252             "// foo bar baz bazfoo\n"
11253             "// bar foo bar\n",
11254             format("// foo bar baz      bazfoo\n"
11255                    "// foo bar baz      bazfoo bar\n"
11256                    "// foo           bar\n",
11257                    Style));
11258 
11259   // Make sure we do not keep protruding characters if strict mode reflow is
11260   // cheaper than keeping protruding characters.
11261   Style.ColumnLimit = 21;
11262   EXPECT_EQ("// foo foo foo foo\n"
11263             "// foo foo foo foo\n"
11264             "// foo foo foo foo\n",
11265             format("// foo foo foo foo foo foo foo foo foo foo foo foo\n",
11266                            Style));
11267 
11268   EXPECT_EQ("int a = /* long block\n"
11269             "           comment */\n"
11270             "    42;",
11271             format("int a = /* long block comment */ 42;", Style));
11272 }
11273 
11274 #define EXPECT_ALL_STYLES_EQUAL(Styles)                                        \
11275   for (size_t i = 1; i < Styles.size(); ++i)                                   \
11276   EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \
11277                                   << " differs from Style #0"
11278 
11279 TEST_F(FormatTest, GetsPredefinedStyleByName) {
11280   SmallVector<FormatStyle, 3> Styles;
11281   Styles.resize(3);
11282 
11283   Styles[0] = getLLVMStyle();
11284   EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
11285   EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
11286   EXPECT_ALL_STYLES_EQUAL(Styles);
11287 
11288   Styles[0] = getGoogleStyle();
11289   EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
11290   EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
11291   EXPECT_ALL_STYLES_EQUAL(Styles);
11292 
11293   Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
11294   EXPECT_TRUE(
11295       getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
11296   EXPECT_TRUE(
11297       getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
11298   EXPECT_ALL_STYLES_EQUAL(Styles);
11299 
11300   Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
11301   EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
11302   EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
11303   EXPECT_ALL_STYLES_EQUAL(Styles);
11304 
11305   Styles[0] = getMozillaStyle();
11306   EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
11307   EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
11308   EXPECT_ALL_STYLES_EQUAL(Styles);
11309 
11310   Styles[0] = getWebKitStyle();
11311   EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
11312   EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
11313   EXPECT_ALL_STYLES_EQUAL(Styles);
11314 
11315   Styles[0] = getGNUStyle();
11316   EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
11317   EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
11318   EXPECT_ALL_STYLES_EQUAL(Styles);
11319 
11320   EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
11321 }
11322 
11323 TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
11324   SmallVector<FormatStyle, 8> Styles;
11325   Styles.resize(2);
11326 
11327   Styles[0] = getGoogleStyle();
11328   Styles[1] = getLLVMStyle();
11329   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
11330   EXPECT_ALL_STYLES_EQUAL(Styles);
11331 
11332   Styles.resize(5);
11333   Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
11334   Styles[1] = getLLVMStyle();
11335   Styles[1].Language = FormatStyle::LK_JavaScript;
11336   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
11337 
11338   Styles[2] = getLLVMStyle();
11339   Styles[2].Language = FormatStyle::LK_JavaScript;
11340   EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
11341                                   "BasedOnStyle: Google",
11342                                   &Styles[2])
11343                    .value());
11344 
11345   Styles[3] = getLLVMStyle();
11346   Styles[3].Language = FormatStyle::LK_JavaScript;
11347   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
11348                                   "Language: JavaScript",
11349                                   &Styles[3])
11350                    .value());
11351 
11352   Styles[4] = getLLVMStyle();
11353   Styles[4].Language = FormatStyle::LK_JavaScript;
11354   EXPECT_EQ(0, parseConfiguration("---\n"
11355                                   "BasedOnStyle: LLVM\n"
11356                                   "IndentWidth: 123\n"
11357                                   "---\n"
11358                                   "BasedOnStyle: Google\n"
11359                                   "Language: JavaScript",
11360                                   &Styles[4])
11361                    .value());
11362   EXPECT_ALL_STYLES_EQUAL(Styles);
11363 }
11364 
11365 #define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME)                             \
11366   Style.FIELD = false;                                                         \
11367   EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value());      \
11368   EXPECT_TRUE(Style.FIELD);                                                    \
11369   EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value());     \
11370   EXPECT_FALSE(Style.FIELD);
11371 
11372 #define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
11373 
11374 #define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME)              \
11375   Style.STRUCT.FIELD = false;                                                  \
11376   EXPECT_EQ(0,                                                                 \
11377             parseConfiguration(#STRUCT ":\n  " CONFIG_NAME ": true", &Style)   \
11378                 .value());                                                     \
11379   EXPECT_TRUE(Style.STRUCT.FIELD);                                             \
11380   EXPECT_EQ(0,                                                                 \
11381             parseConfiguration(#STRUCT ":\n  " CONFIG_NAME ": false", &Style)  \
11382                 .value());                                                     \
11383   EXPECT_FALSE(Style.STRUCT.FIELD);
11384 
11385 #define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD)                                 \
11386   CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
11387 
11388 #define CHECK_PARSE(TEXT, FIELD, VALUE)                                        \
11389   EXPECT_NE(VALUE, Style.FIELD);                                               \
11390   EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value());                      \
11391   EXPECT_EQ(VALUE, Style.FIELD)
11392 
11393 TEST_F(FormatTest, ParsesConfigurationBools) {
11394   FormatStyle Style = {};
11395   Style.Language = FormatStyle::LK_Cpp;
11396   CHECK_PARSE_BOOL(AlignOperands);
11397   CHECK_PARSE_BOOL(AlignTrailingComments);
11398   CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
11399   CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
11400   CHECK_PARSE_BOOL(AllowAllArgumentsOnNextLine);
11401   CHECK_PARSE_BOOL(AllowAllConstructorInitializersOnNextLine);
11402   CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
11403   CHECK_PARSE_BOOL(AllowShortBlocksOnASingleLine);
11404   CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
11405   CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
11406   CHECK_PARSE_BOOL(BinPackArguments);
11407   CHECK_PARSE_BOOL(BinPackParameters);
11408   CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
11409   CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
11410   CHECK_PARSE_BOOL(BreakStringLiterals);
11411   CHECK_PARSE_BOOL(CompactNamespaces);
11412   CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
11413   CHECK_PARSE_BOOL(DerivePointerAlignment);
11414   CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
11415   CHECK_PARSE_BOOL(DisableFormat);
11416   CHECK_PARSE_BOOL(IndentCaseLabels);
11417   CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
11418   CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
11419   CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
11420   CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
11421   CHECK_PARSE_BOOL(Cpp11BracedListStyle);
11422   CHECK_PARSE_BOOL(ReflowComments);
11423   CHECK_PARSE_BOOL(SortIncludes);
11424   CHECK_PARSE_BOOL(SortUsingDeclarations);
11425   CHECK_PARSE_BOOL(SpacesInParentheses);
11426   CHECK_PARSE_BOOL(SpacesInSquareBrackets);
11427   CHECK_PARSE_BOOL(SpacesInAngles);
11428   CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
11429   CHECK_PARSE_BOOL(SpacesInContainerLiterals);
11430   CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
11431   CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
11432   CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
11433   CHECK_PARSE_BOOL(SpaceAfterLogicalNot);
11434   CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
11435   CHECK_PARSE_BOOL(SpaceBeforeCpp11BracedList);
11436   CHECK_PARSE_BOOL(SpaceBeforeCtorInitializerColon);
11437   CHECK_PARSE_BOOL(SpaceBeforeInheritanceColon);
11438   CHECK_PARSE_BOOL(SpaceBeforeRangeBasedForLoopColon);
11439 
11440   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterCaseLabel);
11441   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
11442   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement);
11443   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
11444   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
11445   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
11446   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
11447   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
11448   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
11449   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterExternBlock);
11450   CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
11451   CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
11452   CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
11453   CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunction);
11454   CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyRecord);
11455   CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyNamespace);
11456 }
11457 
11458 #undef CHECK_PARSE_BOOL
11459 
11460 TEST_F(FormatTest, ParsesConfiguration) {
11461   FormatStyle Style = {};
11462   Style.Language = FormatStyle::LK_Cpp;
11463   CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
11464   CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
11465               ConstructorInitializerIndentWidth, 1234u);
11466   CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
11467   CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
11468   CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
11469   CHECK_PARSE("PenaltyBreakAssignment: 1234",
11470               PenaltyBreakAssignment, 1234u);
11471   CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
11472               PenaltyBreakBeforeFirstCallParameter, 1234u);
11473   CHECK_PARSE("PenaltyBreakTemplateDeclaration: 1234",
11474               PenaltyBreakTemplateDeclaration, 1234u);
11475   CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
11476   CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
11477               PenaltyReturnTypeOnItsOwnLine, 1234u);
11478   CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
11479               SpacesBeforeTrailingComments, 1234u);
11480   CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
11481   CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
11482   CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
11483 
11484   Style.PointerAlignment = FormatStyle::PAS_Middle;
11485   CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
11486               FormatStyle::PAS_Left);
11487   CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
11488               FormatStyle::PAS_Right);
11489   CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
11490               FormatStyle::PAS_Middle);
11491   // For backward compatibility:
11492   CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
11493               FormatStyle::PAS_Left);
11494   CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
11495               FormatStyle::PAS_Right);
11496   CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
11497               FormatStyle::PAS_Middle);
11498 
11499   Style.Standard = FormatStyle::LS_Auto;
11500   CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
11501   CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11);
11502   CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
11503   CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
11504   CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
11505 
11506   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
11507   CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
11508               BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
11509   CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
11510               FormatStyle::BOS_None);
11511   CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
11512               FormatStyle::BOS_All);
11513   // For backward compatibility:
11514   CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
11515               FormatStyle::BOS_None);
11516   CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
11517               FormatStyle::BOS_All);
11518 
11519   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
11520   CHECK_PARSE("BreakConstructorInitializers: BeforeComma",
11521               BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
11522   CHECK_PARSE("BreakConstructorInitializers: AfterColon",
11523               BreakConstructorInitializers, FormatStyle::BCIS_AfterColon);
11524   CHECK_PARSE("BreakConstructorInitializers: BeforeColon",
11525               BreakConstructorInitializers, FormatStyle::BCIS_BeforeColon);
11526   // For backward compatibility:
11527   CHECK_PARSE("BreakConstructorInitializersBeforeComma: true",
11528               BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
11529 
11530   Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
11531   CHECK_PARSE("BreakInheritanceList: BeforeComma",
11532               BreakInheritanceList, FormatStyle::BILS_BeforeComma);
11533   CHECK_PARSE("BreakInheritanceList: AfterColon",
11534               BreakInheritanceList, FormatStyle::BILS_AfterColon);
11535   CHECK_PARSE("BreakInheritanceList: BeforeColon",
11536               BreakInheritanceList, FormatStyle::BILS_BeforeColon);
11537   // For backward compatibility:
11538   CHECK_PARSE("BreakBeforeInheritanceComma: true",
11539               BreakInheritanceList, FormatStyle::BILS_BeforeComma);
11540 
11541   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
11542   CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
11543               FormatStyle::BAS_Align);
11544   CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
11545               FormatStyle::BAS_DontAlign);
11546   CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
11547               FormatStyle::BAS_AlwaysBreak);
11548   // For backward compatibility:
11549   CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
11550               FormatStyle::BAS_DontAlign);
11551   CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
11552               FormatStyle::BAS_Align);
11553 
11554   Style.AlignEscapedNewlines = FormatStyle::ENAS_Left;
11555   CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines,
11556               FormatStyle::ENAS_DontAlign);
11557   CHECK_PARSE("AlignEscapedNewlines: Left", AlignEscapedNewlines,
11558               FormatStyle::ENAS_Left);
11559   CHECK_PARSE("AlignEscapedNewlines: Right", AlignEscapedNewlines,
11560               FormatStyle::ENAS_Right);
11561   // For backward compatibility:
11562   CHECK_PARSE("AlignEscapedNewlinesLeft: true", AlignEscapedNewlines,
11563               FormatStyle::ENAS_Left);
11564   CHECK_PARSE("AlignEscapedNewlinesLeft: false", AlignEscapedNewlines,
11565               FormatStyle::ENAS_Right);
11566 
11567   Style.UseTab = FormatStyle::UT_ForIndentation;
11568   CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
11569   CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
11570   CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
11571   CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
11572               FormatStyle::UT_ForContinuationAndIndentation);
11573   // For backward compatibility:
11574   CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
11575   CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
11576 
11577   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
11578   CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
11579               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
11580   CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
11581               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
11582   CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
11583               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
11584   CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
11585               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
11586   // For backward compatibility:
11587   CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
11588               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
11589   CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
11590               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
11591 
11592   Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
11593   CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
11594               FormatStyle::SBPO_Never);
11595   CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
11596               FormatStyle::SBPO_Always);
11597   CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
11598               FormatStyle::SBPO_ControlStatements);
11599   CHECK_PARSE("SpaceBeforeParens: NonEmptyParentheses", SpaceBeforeParens,
11600               FormatStyle::SBPO_NonEmptyParentheses);
11601   // For backward compatibility:
11602   CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
11603               FormatStyle::SBPO_Never);
11604   CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
11605               FormatStyle::SBPO_ControlStatements);
11606 
11607   Style.ColumnLimit = 123;
11608   FormatStyle BaseStyle = getLLVMStyle();
11609   CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
11610   CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
11611 
11612   Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
11613   CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
11614               FormatStyle::BS_Attach);
11615   CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
11616               FormatStyle::BS_Linux);
11617   CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
11618               FormatStyle::BS_Mozilla);
11619   CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
11620               FormatStyle::BS_Stroustrup);
11621   CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
11622               FormatStyle::BS_Allman);
11623   CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
11624   CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
11625               FormatStyle::BS_WebKit);
11626   CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
11627               FormatStyle::BS_Custom);
11628 
11629   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
11630   CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
11631               FormatStyle::RTBS_None);
11632   CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
11633               FormatStyle::RTBS_All);
11634   CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
11635               AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
11636   CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
11637               AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
11638   CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
11639               AlwaysBreakAfterReturnType,
11640               FormatStyle::RTBS_TopLevelDefinitions);
11641 
11642   Style.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes;
11643   CHECK_PARSE("AlwaysBreakTemplateDeclarations: No", AlwaysBreakTemplateDeclarations,
11644               FormatStyle::BTDS_No);
11645   CHECK_PARSE("AlwaysBreakTemplateDeclarations: MultiLine", AlwaysBreakTemplateDeclarations,
11646               FormatStyle::BTDS_MultiLine);
11647   CHECK_PARSE("AlwaysBreakTemplateDeclarations: Yes", AlwaysBreakTemplateDeclarations,
11648               FormatStyle::BTDS_Yes);
11649   CHECK_PARSE("AlwaysBreakTemplateDeclarations: false", AlwaysBreakTemplateDeclarations,
11650               FormatStyle::BTDS_MultiLine);
11651   CHECK_PARSE("AlwaysBreakTemplateDeclarations: true", AlwaysBreakTemplateDeclarations,
11652               FormatStyle::BTDS_Yes);
11653 
11654   Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
11655   CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
11656               AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
11657   CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
11658               AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
11659   CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
11660               AlwaysBreakAfterDefinitionReturnType,
11661               FormatStyle::DRTBS_TopLevel);
11662 
11663   Style.NamespaceIndentation = FormatStyle::NI_All;
11664   CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
11665               FormatStyle::NI_None);
11666   CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
11667               FormatStyle::NI_Inner);
11668   CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
11669               FormatStyle::NI_All);
11670 
11671   Style.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_Always;
11672   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Never",
11673               AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never);
11674   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: WithoutElse",
11675               AllowShortIfStatementsOnASingleLine,
11676               FormatStyle::SIS_WithoutElse);
11677   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Always",
11678               AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Always);
11679   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: false",
11680               AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never);
11681   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: true",
11682               AllowShortIfStatementsOnASingleLine,
11683               FormatStyle::SIS_WithoutElse);
11684 
11685   // FIXME: This is required because parsing a configuration simply overwrites
11686   // the first N elements of the list instead of resetting it.
11687   Style.ForEachMacros.clear();
11688   std::vector<std::string> BoostForeach;
11689   BoostForeach.push_back("BOOST_FOREACH");
11690   CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
11691   std::vector<std::string> BoostAndQForeach;
11692   BoostAndQForeach.push_back("BOOST_FOREACH");
11693   BoostAndQForeach.push_back("Q_FOREACH");
11694   CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
11695               BoostAndQForeach);
11696 
11697   Style.StatementMacros.clear();
11698   CHECK_PARSE("StatementMacros: [QUNUSED]", StatementMacros,
11699               std::vector<std::string>{"QUNUSED"});
11700   CHECK_PARSE("StatementMacros: [QUNUSED, QT_REQUIRE_VERSION]", StatementMacros,
11701               std::vector<std::string>({"QUNUSED", "QT_REQUIRE_VERSION"}));
11702 
11703   Style.IncludeStyle.IncludeCategories.clear();
11704   std::vector<tooling::IncludeStyle::IncludeCategory> ExpectedCategories = {
11705       {"abc/.*", 2}, {".*", 1}};
11706   CHECK_PARSE("IncludeCategories:\n"
11707               "  - Regex: abc/.*\n"
11708               "    Priority: 2\n"
11709               "  - Regex: .*\n"
11710               "    Priority: 1",
11711               IncludeStyle.IncludeCategories, ExpectedCategories);
11712   CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeStyle.IncludeIsMainRegex,
11713               "abc$");
11714 
11715   Style.RawStringFormats.clear();
11716   std::vector<FormatStyle::RawStringFormat> ExpectedRawStringFormats = {
11717       {
11718           FormatStyle::LK_TextProto,
11719           {"pb", "proto"},
11720           {"PARSE_TEXT_PROTO"},
11721           /*CanonicalDelimiter=*/"",
11722           "llvm",
11723       },
11724       {
11725           FormatStyle::LK_Cpp,
11726           {"cc", "cpp"},
11727           {"C_CODEBLOCK", "CPPEVAL"},
11728           /*CanonicalDelimiter=*/"cc",
11729           /*BasedOnStyle=*/"",
11730       },
11731   };
11732 
11733   CHECK_PARSE("RawStringFormats:\n"
11734               "  - Language: TextProto\n"
11735               "    Delimiters:\n"
11736               "      - 'pb'\n"
11737               "      - 'proto'\n"
11738               "    EnclosingFunctions:\n"
11739               "      - 'PARSE_TEXT_PROTO'\n"
11740               "    BasedOnStyle: llvm\n"
11741               "  - Language: Cpp\n"
11742               "    Delimiters:\n"
11743               "      - 'cc'\n"
11744               "      - 'cpp'\n"
11745               "    EnclosingFunctions:\n"
11746               "      - 'C_CODEBLOCK'\n"
11747               "      - 'CPPEVAL'\n"
11748               "    CanonicalDelimiter: 'cc'",
11749               RawStringFormats, ExpectedRawStringFormats);
11750 }
11751 
11752 TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
11753   FormatStyle Style = {};
11754   Style.Language = FormatStyle::LK_Cpp;
11755   CHECK_PARSE("Language: Cpp\n"
11756               "IndentWidth: 12",
11757               IndentWidth, 12u);
11758   EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
11759                                "IndentWidth: 34",
11760                                &Style),
11761             ParseError::Unsuitable);
11762   EXPECT_EQ(12u, Style.IndentWidth);
11763   CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
11764   EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
11765 
11766   Style.Language = FormatStyle::LK_JavaScript;
11767   CHECK_PARSE("Language: JavaScript\n"
11768               "IndentWidth: 12",
11769               IndentWidth, 12u);
11770   CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
11771   EXPECT_EQ(parseConfiguration("Language: Cpp\n"
11772                                "IndentWidth: 34",
11773                                &Style),
11774             ParseError::Unsuitable);
11775   EXPECT_EQ(23u, Style.IndentWidth);
11776   CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
11777   EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
11778 
11779   CHECK_PARSE("BasedOnStyle: LLVM\n"
11780               "IndentWidth: 67",
11781               IndentWidth, 67u);
11782 
11783   CHECK_PARSE("---\n"
11784               "Language: JavaScript\n"
11785               "IndentWidth: 12\n"
11786               "---\n"
11787               "Language: Cpp\n"
11788               "IndentWidth: 34\n"
11789               "...\n",
11790               IndentWidth, 12u);
11791 
11792   Style.Language = FormatStyle::LK_Cpp;
11793   CHECK_PARSE("---\n"
11794               "Language: JavaScript\n"
11795               "IndentWidth: 12\n"
11796               "---\n"
11797               "Language: Cpp\n"
11798               "IndentWidth: 34\n"
11799               "...\n",
11800               IndentWidth, 34u);
11801   CHECK_PARSE("---\n"
11802               "IndentWidth: 78\n"
11803               "---\n"
11804               "Language: JavaScript\n"
11805               "IndentWidth: 56\n"
11806               "...\n",
11807               IndentWidth, 78u);
11808 
11809   Style.ColumnLimit = 123;
11810   Style.IndentWidth = 234;
11811   Style.BreakBeforeBraces = FormatStyle::BS_Linux;
11812   Style.TabWidth = 345;
11813   EXPECT_FALSE(parseConfiguration("---\n"
11814                                   "IndentWidth: 456\n"
11815                                   "BreakBeforeBraces: Allman\n"
11816                                   "---\n"
11817                                   "Language: JavaScript\n"
11818                                   "IndentWidth: 111\n"
11819                                   "TabWidth: 111\n"
11820                                   "---\n"
11821                                   "Language: Cpp\n"
11822                                   "BreakBeforeBraces: Stroustrup\n"
11823                                   "TabWidth: 789\n"
11824                                   "...\n",
11825                                   &Style));
11826   EXPECT_EQ(123u, Style.ColumnLimit);
11827   EXPECT_EQ(456u, Style.IndentWidth);
11828   EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
11829   EXPECT_EQ(789u, Style.TabWidth);
11830 
11831   EXPECT_EQ(parseConfiguration("---\n"
11832                                "Language: JavaScript\n"
11833                                "IndentWidth: 56\n"
11834                                "---\n"
11835                                "IndentWidth: 78\n"
11836                                "...\n",
11837                                &Style),
11838             ParseError::Error);
11839   EXPECT_EQ(parseConfiguration("---\n"
11840                                "Language: JavaScript\n"
11841                                "IndentWidth: 56\n"
11842                                "---\n"
11843                                "Language: JavaScript\n"
11844                                "IndentWidth: 78\n"
11845                                "...\n",
11846                                &Style),
11847             ParseError::Error);
11848 
11849   EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
11850 }
11851 
11852 #undef CHECK_PARSE
11853 
11854 TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
11855   FormatStyle Style = {};
11856   Style.Language = FormatStyle::LK_JavaScript;
11857   Style.BreakBeforeTernaryOperators = true;
11858   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
11859   EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
11860 
11861   Style.BreakBeforeTernaryOperators = true;
11862   EXPECT_EQ(0, parseConfiguration("---\n"
11863                                   "BasedOnStyle: Google\n"
11864                                   "---\n"
11865                                   "Language: JavaScript\n"
11866                                   "IndentWidth: 76\n"
11867                                   "...\n",
11868                                   &Style)
11869                    .value());
11870   EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
11871   EXPECT_EQ(76u, Style.IndentWidth);
11872   EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
11873 }
11874 
11875 TEST_F(FormatTest, ConfigurationRoundTripTest) {
11876   FormatStyle Style = getLLVMStyle();
11877   std::string YAML = configurationAsText(Style);
11878   FormatStyle ParsedStyle = {};
11879   ParsedStyle.Language = FormatStyle::LK_Cpp;
11880   EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
11881   EXPECT_EQ(Style, ParsedStyle);
11882 }
11883 
11884 TEST_F(FormatTest, WorksFor8bitEncodings) {
11885   EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
11886             "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
11887             "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
11888             "\"\xef\xee\xf0\xf3...\"",
11889             format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
11890                    "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
11891                    "\xef\xee\xf0\xf3...\"",
11892                    getLLVMStyleWithColumns(12)));
11893 }
11894 
11895 TEST_F(FormatTest, HandlesUTF8BOM) {
11896   EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
11897   EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
11898             format("\xef\xbb\xbf#include <iostream>"));
11899   EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
11900             format("\xef\xbb\xbf\n#include <iostream>"));
11901 }
11902 
11903 // FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
11904 #if !defined(_MSC_VER)
11905 
11906 TEST_F(FormatTest, CountsUTF8CharactersProperly) {
11907   verifyFormat("\"Однажды в студёную зимнюю пору...\"",
11908                getLLVMStyleWithColumns(35));
11909   verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
11910                getLLVMStyleWithColumns(31));
11911   verifyFormat("// Однажды в студёную зимнюю пору...",
11912                getLLVMStyleWithColumns(36));
11913   verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
11914   verifyFormat("/* Однажды в студёную зимнюю пору... */",
11915                getLLVMStyleWithColumns(39));
11916   verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
11917                getLLVMStyleWithColumns(35));
11918 }
11919 
11920 TEST_F(FormatTest, SplitsUTF8Strings) {
11921   // Non-printable characters' width is currently considered to be the length in
11922   // bytes in UTF8. The characters can be displayed in very different manner
11923   // (zero-width, single width with a substitution glyph, expanded to their code
11924   // (e.g. "<8d>"), so there's no single correct way to handle them.
11925   EXPECT_EQ("\"aaaaÄ\"\n"
11926             "\"\xc2\x8d\";",
11927             format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
11928   EXPECT_EQ("\"aaaaaaaÄ\"\n"
11929             "\"\xc2\x8d\";",
11930             format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
11931   EXPECT_EQ("\"Однажды, в \"\n"
11932             "\"студёную \"\n"
11933             "\"зимнюю \"\n"
11934             "\"пору,\"",
11935             format("\"Однажды, в студёную зимнюю пору,\"",
11936                    getLLVMStyleWithColumns(13)));
11937   EXPECT_EQ(
11938       "\"一 二 三 \"\n"
11939       "\"四 五六 \"\n"
11940       "\"七 八 九 \"\n"
11941       "\"十\"",
11942       format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
11943   EXPECT_EQ("\"一\t\"\n"
11944             "\"二 \t\"\n"
11945             "\"三 四 \"\n"
11946             "\"五\t\"\n"
11947             "\"六 \t\"\n"
11948             "\"七 \"\n"
11949             "\"八九十\tqq\"",
11950             format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
11951                    getLLVMStyleWithColumns(11)));
11952 
11953   // UTF8 character in an escape sequence.
11954   EXPECT_EQ("\"aaaaaa\"\n"
11955             "\"\\\xC2\x8D\"",
11956             format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
11957 }
11958 
11959 TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
11960   EXPECT_EQ("const char *sssss =\n"
11961             "    \"一二三四五六七八\\\n"
11962             " 九 十\";",
11963             format("const char *sssss = \"一二三四五六七八\\\n"
11964                    " 九 十\";",
11965                    getLLVMStyleWithColumns(30)));
11966 }
11967 
11968 TEST_F(FormatTest, SplitsUTF8LineComments) {
11969   EXPECT_EQ("// aaaaÄ\xc2\x8d",
11970             format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
11971   EXPECT_EQ("// Я из лесу\n"
11972             "// вышел; был\n"
11973             "// сильный\n"
11974             "// мороз.",
11975             format("// Я из лесу вышел; был сильный мороз.",
11976                    getLLVMStyleWithColumns(13)));
11977   EXPECT_EQ("// 一二三\n"
11978             "// 四五六七\n"
11979             "// 八  九\n"
11980             "// 十",
11981             format("// 一二三 四五六七 八  九 十", getLLVMStyleWithColumns(9)));
11982 }
11983 
11984 TEST_F(FormatTest, SplitsUTF8BlockComments) {
11985   EXPECT_EQ("/* Гляжу,\n"
11986             " * поднимается\n"
11987             " * медленно в\n"
11988             " * гору\n"
11989             " * Лошадка,\n"
11990             " * везущая\n"
11991             " * хворосту\n"
11992             " * воз. */",
11993             format("/* Гляжу, поднимается медленно в гору\n"
11994                    " * Лошадка, везущая хворосту воз. */",
11995                    getLLVMStyleWithColumns(13)));
11996   EXPECT_EQ(
11997       "/* 一二三\n"
11998       " * 四五六七\n"
11999       " * 八  九\n"
12000       " * 十  */",
12001       format("/* 一二三 四五六七 八  九 十  */", getLLVMStyleWithColumns(9)));
12002   EXPECT_EQ("/* �������� ��������\n"
12003             " * ��������\n"
12004             " * ������-�� */",
12005             format("/* �������� �������� �������� ������-�� */", getLLVMStyleWithColumns(12)));
12006 }
12007 
12008 #endif // _MSC_VER
12009 
12010 TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
12011   FormatStyle Style = getLLVMStyle();
12012 
12013   Style.ConstructorInitializerIndentWidth = 4;
12014   verifyFormat(
12015       "SomeClass::Constructor()\n"
12016       "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
12017       "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
12018       Style);
12019 
12020   Style.ConstructorInitializerIndentWidth = 2;
12021   verifyFormat(
12022       "SomeClass::Constructor()\n"
12023       "  : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
12024       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
12025       Style);
12026 
12027   Style.ConstructorInitializerIndentWidth = 0;
12028   verifyFormat(
12029       "SomeClass::Constructor()\n"
12030       ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
12031       "  aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
12032       Style);
12033   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
12034   verifyFormat(
12035       "SomeLongTemplateVariableName<\n"
12036       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
12037       Style);
12038   verifyFormat(
12039       "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
12040       "                       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
12041       Style);
12042 
12043   Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
12044   verifyFormat(
12045       "SomeClass::Constructor() :\n"
12046       "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa),\n"
12047       "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa) {}",
12048       Style);
12049 }
12050 
12051 TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
12052   FormatStyle Style = getLLVMStyle();
12053   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
12054   Style.ConstructorInitializerIndentWidth = 4;
12055   verifyFormat("SomeClass::Constructor()\n"
12056                "    : a(a)\n"
12057                "    , b(b)\n"
12058                "    , c(c) {}",
12059                Style);
12060   verifyFormat("SomeClass::Constructor()\n"
12061                "    : a(a) {}",
12062                Style);
12063 
12064   Style.ColumnLimit = 0;
12065   verifyFormat("SomeClass::Constructor()\n"
12066                "    : a(a) {}",
12067                Style);
12068   verifyFormat("SomeClass::Constructor() noexcept\n"
12069                "    : a(a) {}",
12070                Style);
12071   verifyFormat("SomeClass::Constructor()\n"
12072                "    : a(a)\n"
12073                "    , b(b)\n"
12074                "    , c(c) {}",
12075                Style);
12076   verifyFormat("SomeClass::Constructor()\n"
12077                "    : a(a) {\n"
12078                "  foo();\n"
12079                "  bar();\n"
12080                "}",
12081                Style);
12082 
12083   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
12084   verifyFormat("SomeClass::Constructor()\n"
12085                "    : a(a)\n"
12086                "    , b(b)\n"
12087                "    , c(c) {\n}",
12088                Style);
12089   verifyFormat("SomeClass::Constructor()\n"
12090                "    : a(a) {\n}",
12091                Style);
12092 
12093   Style.ColumnLimit = 80;
12094   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
12095   Style.ConstructorInitializerIndentWidth = 2;
12096   verifyFormat("SomeClass::Constructor()\n"
12097                "  : a(a)\n"
12098                "  , b(b)\n"
12099                "  , c(c) {}",
12100                Style);
12101 
12102   Style.ConstructorInitializerIndentWidth = 0;
12103   verifyFormat("SomeClass::Constructor()\n"
12104                ": a(a)\n"
12105                ", b(b)\n"
12106                ", c(c) {}",
12107                Style);
12108 
12109   Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
12110   Style.ConstructorInitializerIndentWidth = 4;
12111   verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
12112   verifyFormat(
12113       "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
12114       Style);
12115   verifyFormat(
12116       "SomeClass::Constructor()\n"
12117       "    : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
12118       Style);
12119   Style.ConstructorInitializerIndentWidth = 4;
12120   Style.ColumnLimit = 60;
12121   verifyFormat("SomeClass::Constructor()\n"
12122                "    : aaaaaaaa(aaaaaaaa)\n"
12123                "    , aaaaaaaa(aaaaaaaa)\n"
12124                "    , aaaaaaaa(aaaaaaaa) {}",
12125                Style);
12126 }
12127 
12128 TEST_F(FormatTest, Destructors) {
12129   verifyFormat("void F(int &i) { i.~int(); }");
12130   verifyFormat("void F(int &i) { i->~int(); }");
12131 }
12132 
12133 TEST_F(FormatTest, FormatsWithWebKitStyle) {
12134   FormatStyle Style = getWebKitStyle();
12135 
12136   // Don't indent in outer namespaces.
12137   verifyFormat("namespace outer {\n"
12138                "int i;\n"
12139                "namespace inner {\n"
12140                "    int i;\n"
12141                "} // namespace inner\n"
12142                "} // namespace outer\n"
12143                "namespace other_outer {\n"
12144                "int i;\n"
12145                "}",
12146                Style);
12147 
12148   // Don't indent case labels.
12149   verifyFormat("switch (variable) {\n"
12150                "case 1:\n"
12151                "case 2:\n"
12152                "    doSomething();\n"
12153                "    break;\n"
12154                "default:\n"
12155                "    ++variable;\n"
12156                "}",
12157                Style);
12158 
12159   // Wrap before binary operators.
12160   EXPECT_EQ("void f()\n"
12161             "{\n"
12162             "    if (aaaaaaaaaaaaaaaa\n"
12163             "        && bbbbbbbbbbbbbbbbbbbbbbbb\n"
12164             "        && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
12165             "        return;\n"
12166             "}",
12167             format("void f() {\n"
12168                    "if (aaaaaaaaaaaaaaaa\n"
12169                    "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
12170                    "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
12171                    "return;\n"
12172                    "}",
12173                    Style));
12174 
12175   // Allow functions on a single line.
12176   verifyFormat("void f() { return; }", Style);
12177 
12178   // Constructor initializers are formatted one per line with the "," on the
12179   // new line.
12180   verifyFormat("Constructor()\n"
12181                "    : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
12182                "    , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
12183                "          aaaaaaaaaaaaaa)\n"
12184                "    , aaaaaaaaaaaaaaaaaaaaaaa()\n"
12185                "{\n"
12186                "}",
12187                Style);
12188   verifyFormat("SomeClass::Constructor()\n"
12189                "    : a(a)\n"
12190                "{\n"
12191                "}",
12192                Style);
12193   EXPECT_EQ("SomeClass::Constructor()\n"
12194             "    : a(a)\n"
12195             "{\n"
12196             "}",
12197             format("SomeClass::Constructor():a(a){}", Style));
12198   verifyFormat("SomeClass::Constructor()\n"
12199                "    : a(a)\n"
12200                "    , b(b)\n"
12201                "    , c(c)\n"
12202                "{\n"
12203                "}",
12204                Style);
12205   verifyFormat("SomeClass::Constructor()\n"
12206                "    : a(a)\n"
12207                "{\n"
12208                "    foo();\n"
12209                "    bar();\n"
12210                "}",
12211                Style);
12212 
12213   // Access specifiers should be aligned left.
12214   verifyFormat("class C {\n"
12215                "public:\n"
12216                "    int i;\n"
12217                "};",
12218                Style);
12219 
12220   // Do not align comments.
12221   verifyFormat("int a; // Do not\n"
12222                "double b; // align comments.",
12223                Style);
12224 
12225   // Do not align operands.
12226   EXPECT_EQ("ASSERT(aaaa\n"
12227             "    || bbbb);",
12228             format("ASSERT ( aaaa\n||bbbb);", Style));
12229 
12230   // Accept input's line breaks.
12231   EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
12232             "    || bbbbbbbbbbbbbbb) {\n"
12233             "    i++;\n"
12234             "}",
12235             format("if (aaaaaaaaaaaaaaa\n"
12236                    "|| bbbbbbbbbbbbbbb) { i++; }",
12237                    Style));
12238   EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
12239             "    i++;\n"
12240             "}",
12241             format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
12242 
12243   // Don't automatically break all macro definitions (llvm.org/PR17842).
12244   verifyFormat("#define aNumber 10", Style);
12245   // However, generally keep the line breaks that the user authored.
12246   EXPECT_EQ("#define aNumber \\\n"
12247             "    10",
12248             format("#define aNumber \\\n"
12249                    " 10",
12250                    Style));
12251 
12252   // Keep empty and one-element array literals on a single line.
12253   EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
12254             "                                  copyItems:YES];",
12255             format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
12256                    "copyItems:YES];",
12257                    Style));
12258   EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
12259             "                                  copyItems:YES];",
12260             format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
12261                    "             copyItems:YES];",
12262                    Style));
12263   // FIXME: This does not seem right, there should be more indentation before
12264   // the array literal's entries. Nested blocks have the same problem.
12265   EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
12266             "    @\"a\",\n"
12267             "    @\"a\"\n"
12268             "]\n"
12269             "                                  copyItems:YES];",
12270             format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
12271                    "     @\"a\",\n"
12272                    "     @\"a\"\n"
12273                    "     ]\n"
12274                    "       copyItems:YES];",
12275                    Style));
12276   EXPECT_EQ(
12277       "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
12278       "                                  copyItems:YES];",
12279       format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
12280              "   copyItems:YES];",
12281              Style));
12282 
12283   verifyFormat("[self.a b:c c:d];", Style);
12284   EXPECT_EQ("[self.a b:c\n"
12285             "        c:d];",
12286             format("[self.a b:c\n"
12287                    "c:d];",
12288                    Style));
12289 }
12290 
12291 TEST_F(FormatTest, FormatsLambdas) {
12292   verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
12293   verifyFormat(
12294       "int c = [b]() mutable noexcept { return [&b] { return b++; }(); }();\n");
12295   verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
12296   verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
12297   verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
12298   verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
12299   verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
12300   verifyFormat("auto c = [a = [b = 42] {}] {};\n");
12301   verifyFormat("auto c = [a = &i + 10, b = [] {}] {};\n");
12302   verifyFormat("int x = f(*+[] {});");
12303   verifyFormat("void f() {\n"
12304                "  other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
12305                "}\n");
12306   verifyFormat("void f() {\n"
12307                "  other(x.begin(), //\n"
12308                "        x.end(),   //\n"
12309                "        [&](int, int) { return 1; });\n"
12310                "}\n");
12311   verifyFormat("void f() {\n"
12312                "  other.other.other.other.other(\n"
12313                "      x.begin(), x.end(),\n"
12314                "      [something, rather](int, int, int, int, int, int, int) { return 1; });\n"
12315                "}\n");
12316   verifyFormat("void f() {\n"
12317                "  other.other.other.other.other(\n"
12318                "      x.begin(), x.end(),\n"
12319                "      [something, rather](int, int, int, int, int, int, int) {\n"
12320                "        //\n"
12321                "      });\n"
12322                "}\n");
12323   verifyFormat("SomeFunction([]() { // A cool function...\n"
12324                "  return 43;\n"
12325                "});");
12326   EXPECT_EQ("SomeFunction([]() {\n"
12327             "#define A a\n"
12328             "  return 43;\n"
12329             "});",
12330             format("SomeFunction([](){\n"
12331                    "#define A a\n"
12332                    "return 43;\n"
12333                    "});"));
12334   verifyFormat("void f() {\n"
12335                "  SomeFunction([](decltype(x), A *a) {});\n"
12336                "}");
12337   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
12338                "    [](const aaaaaaaaaa &a) { return a; });");
12339   verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
12340                "  SomeOtherFunctioooooooooooooooooooooooooon();\n"
12341                "});");
12342   verifyFormat("Constructor()\n"
12343                "    : Field([] { // comment\n"
12344                "        int i;\n"
12345                "      }) {}");
12346   verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
12347                "  return some_parameter.size();\n"
12348                "};");
12349   verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
12350                "    [](const string &s) { return s; };");
12351   verifyFormat("int i = aaaaaa ? 1 //\n"
12352                "               : [] {\n"
12353                "                   return 2; //\n"
12354                "                 }();");
12355   verifyFormat("llvm::errs() << \"number of twos is \"\n"
12356                "             << std::count_if(v.begin(), v.end(), [](int x) {\n"
12357                "                  return x == 2; // force break\n"
12358                "                });");
12359   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
12360                "    [=](int iiiiiiiiiiii) {\n"
12361                "      return aaaaaaaaaaaaaaaaaaaaaaa !=\n"
12362                "             aaaaaaaaaaaaaaaaaaaaaaa;\n"
12363                "    });",
12364                getLLVMStyleWithColumns(60));
12365   verifyFormat("SomeFunction({[&] {\n"
12366                "                // comment\n"
12367                "              },\n"
12368                "              [&] {\n"
12369                "                // comment\n"
12370                "              }});");
12371   verifyFormat("SomeFunction({[&] {\n"
12372                "  // comment\n"
12373                "}});");
12374   verifyFormat("virtual aaaaaaaaaaaaaaaa(\n"
12375                "    std::function<bool()> bbbbbbbbbbbb = [&]() { return true; },\n"
12376                "    aaaaa aaaaaaaaa);");
12377 
12378   // Lambdas with return types.
12379   verifyFormat("int c = []() -> int { return 2; }();\n");
12380   verifyFormat("int c = []() -> int * { return 2; }();\n");
12381   verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
12382   verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
12383   verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
12384   verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
12385   verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
12386   verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
12387   verifyFormat("[a, a]() -> a<1> {};");
12388   verifyFormat("[]() -> foo<5 + 2> { return {}; };");
12389   verifyFormat("[]() -> foo<5 - 2> { return {}; };");
12390   verifyFormat("[]() -> foo<5 / 2> { return {}; };");
12391   verifyFormat("[]() -> foo<5 * 2> { return {}; };");
12392   verifyFormat("[]() -> foo<5 % 2> { return {}; };");
12393   verifyFormat("[]() -> foo<5 << 2> { return {}; };");
12394   verifyFormat("[]() -> foo<!5> { return {}; };");
12395   verifyFormat("[]() -> foo<~5> { return {}; };");
12396   verifyFormat("[]() -> foo<5 | 2> { return {}; };");
12397   verifyFormat("[]() -> foo<5 || 2> { return {}; };");
12398   verifyFormat("[]() -> foo<5 & 2> { return {}; };");
12399   verifyFormat("[]() -> foo<5 && 2> { return {}; };");
12400   verifyFormat("[]() -> foo<5 == 2> { return {}; };");
12401   verifyFormat("[]() -> foo<5 != 2> { return {}; };");
12402   verifyFormat("[]() -> foo<5 >= 2> { return {}; };");
12403   verifyFormat("[]() -> foo<5 <= 2> { return {}; };");
12404   verifyFormat("[]() -> foo<5 < 2> { return {}; };");
12405   verifyFormat("[]() -> foo<2 ? 1 : 0> { return {}; };");
12406   verifyFormat("namespace bar {\n"
12407               "// broken:\n"
12408               "auto foo{[]() -> foo<5 + 2> { return {}; }};\n"
12409               "} // namespace bar");
12410   verifyFormat("namespace bar {\n"
12411               "// broken:\n"
12412               "auto foo{[]() -> foo<5 - 2> { return {}; }};\n"
12413               "} // namespace bar");
12414   verifyFormat("namespace bar {\n"
12415               "// broken:\n"
12416               "auto foo{[]() -> foo<5 / 2> { return {}; }};\n"
12417               "} // namespace bar");
12418   verifyFormat("namespace bar {\n"
12419               "// broken:\n"
12420               "auto foo{[]() -> foo<5 * 2> { return {}; }};\n"
12421               "} // namespace bar");
12422   verifyFormat("namespace bar {\n"
12423               "// broken:\n"
12424               "auto foo{[]() -> foo<5 % 2> { return {}; }};\n"
12425               "} // namespace bar");
12426   verifyFormat("namespace bar {\n"
12427               "// broken:\n"
12428               "auto foo{[]() -> foo<5 << 2> { return {}; }};\n"
12429               "} // namespace bar");
12430   verifyFormat("namespace bar {\n"
12431               "// broken:\n"
12432               "auto foo{[]() -> foo<!5> { return {}; }};\n"
12433               "} // namespace bar");
12434   verifyFormat("namespace bar {\n"
12435               "// broken:\n"
12436               "auto foo{[]() -> foo<~5> { return {}; }};\n"
12437               "} // namespace bar");
12438   verifyFormat("namespace bar {\n"
12439               "// broken:\n"
12440               "auto foo{[]() -> foo<5 | 2> { return {}; }};\n"
12441               "} // namespace bar");
12442   verifyFormat("namespace bar {\n"
12443               "// broken:\n"
12444               "auto foo{[]() -> foo<5 || 2> { return {}; }};\n"
12445               "} // namespace bar");
12446   verifyFormat("namespace bar {\n"
12447               "// broken:\n"
12448               "auto foo{[]() -> foo<5 & 2> { return {}; }};\n"
12449               "} // namespace bar");
12450   verifyFormat("namespace bar {\n"
12451               "// broken:\n"
12452               "auto foo{[]() -> foo<5 && 2> { return {}; }};\n"
12453               "} // namespace bar");
12454   verifyFormat("namespace bar {\n"
12455               "// broken:\n"
12456               "auto foo{[]() -> foo<5 == 2> { return {}; }};\n"
12457               "} // namespace bar");
12458   verifyFormat("namespace bar {\n"
12459               "// broken:\n"
12460               "auto foo{[]() -> foo<5 != 2> { return {}; }};\n"
12461               "} // namespace bar");
12462   verifyFormat("namespace bar {\n"
12463               "// broken:\n"
12464               "auto foo{[]() -> foo<5 >= 2> { return {}; }};\n"
12465               "} // namespace bar");
12466   verifyFormat("namespace bar {\n"
12467               "// broken:\n"
12468               "auto foo{[]() -> foo<5 <= 2> { return {}; }};\n"
12469               "} // namespace bar");
12470   verifyFormat("namespace bar {\n"
12471               "// broken:\n"
12472               "auto foo{[]() -> foo<5 < 2> { return {}; }};\n"
12473               "} // namespace bar");
12474   verifyFormat("namespace bar {\n"
12475               "// broken:\n"
12476               "auto foo{[]() -> foo<2 ? 1 : 0> { return {}; }};\n"
12477               "} // namespace bar");
12478   verifyFormat("[]() -> a<1> {};");
12479   verifyFormat("[]() -> a<1> { ; };");
12480   verifyFormat("[]() -> a<1> { ; }();");
12481   verifyFormat("[a, a]() -> a<true> {};");
12482   verifyFormat("[]() -> a<true> {};");
12483   verifyFormat("[]() -> a<true> { ; };");
12484   verifyFormat("[]() -> a<true> { ; }();");
12485   verifyFormat("[a, a]() -> a<false> {};");
12486   verifyFormat("[]() -> a<false> {};");
12487   verifyFormat("[]() -> a<false> { ; };");
12488   verifyFormat("[]() -> a<false> { ; }();");
12489   verifyFormat("auto foo{[]() -> foo<false> { ; }};");
12490   verifyFormat("namespace bar {\n"
12491                "auto foo{[]() -> foo<false> { ; }};\n"
12492                "} // namespace bar");
12493   verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
12494                "                   int j) -> int {\n"
12495                "  return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
12496                "};");
12497   verifyFormat(
12498       "aaaaaaaaaaaaaaaaaaaaaa(\n"
12499       "    [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
12500       "      return aaaaaaaaaaaaaaaaa;\n"
12501       "    });",
12502       getLLVMStyleWithColumns(70));
12503   verifyFormat("[]() //\n"
12504                "    -> int {\n"
12505                "  return 1; //\n"
12506                "};");
12507 
12508   // Multiple lambdas in the same parentheses change indentation rules. These
12509   // lambdas are forced to start on new lines.
12510   verifyFormat("SomeFunction(\n"
12511                "    []() {\n"
12512                "      //\n"
12513                "    },\n"
12514                "    []() {\n"
12515                "      //\n"
12516                "    });");
12517 
12518   // A lambda passed as arg0 is always pushed to the next line.
12519   verifyFormat("SomeFunction(\n"
12520                "    [this] {\n"
12521                "      //\n"
12522                "    },\n"
12523                "    1);\n");
12524 
12525   // A multi-line lambda passed as arg1 forces arg0 to be pushed out, just like the arg0
12526   // case above.
12527   auto Style = getGoogleStyle();
12528   Style.BinPackArguments = false;
12529   verifyFormat("SomeFunction(\n"
12530                "    a,\n"
12531                "    [this] {\n"
12532                "      //\n"
12533                "    },\n"
12534                "    b);\n",
12535                Style);
12536   verifyFormat("SomeFunction(\n"
12537                "    a,\n"
12538                "    [this] {\n"
12539                "      //\n"
12540                "    },\n"
12541                "    b);\n");
12542 
12543   // A lambda with a very long line forces arg0 to be pushed out irrespective of
12544   // the BinPackArguments value (as long as the code is wide enough).
12545   verifyFormat("something->SomeFunction(\n"
12546                "    a,\n"
12547                "    [this] {\n"
12548                "      D0000000000000000000000000000000000000000000000000000000000001();\n"
12549                "    },\n"
12550                "    b);\n");
12551 
12552   // A multi-line lambda is pulled up as long as the introducer fits on the previous
12553   // line and there are no further args.
12554   verifyFormat("function(1, [this, that] {\n"
12555                "  //\n"
12556                "});\n");
12557   verifyFormat("function([this, that] {\n"
12558                "  //\n"
12559                "});\n");
12560   // FIXME: this format is not ideal and we should consider forcing the first arg
12561   // onto its own line.
12562   verifyFormat("function(a, b, c, //\n"
12563                "         d, [this, that] {\n"
12564                "           //\n"
12565                "         });\n");
12566 
12567   // Multiple lambdas are treated correctly even when there is a short arg0.
12568   verifyFormat("SomeFunction(\n"
12569                "    1,\n"
12570                "    [this] {\n"
12571                "      //\n"
12572                "    },\n"
12573                "    [this] {\n"
12574                "      //\n"
12575                "    },\n"
12576                "    1);\n");
12577 
12578   // More complex introducers.
12579   verifyFormat("return [i, args...] {};");
12580 
12581   // Not lambdas.
12582   verifyFormat("constexpr char hello[]{\"hello\"};");
12583   verifyFormat("double &operator[](int i) { return 0; }\n"
12584                "int i;");
12585   verifyFormat("std::unique_ptr<int[]> foo() {}");
12586   verifyFormat("int i = a[a][a]->f();");
12587   verifyFormat("int i = (*b)[a]->f();");
12588 
12589   // Other corner cases.
12590   verifyFormat("void f() {\n"
12591                "  bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
12592                "  );\n"
12593                "}");
12594 
12595   // Lambdas created through weird macros.
12596   verifyFormat("void f() {\n"
12597                "  MACRO((const AA &a) { return 1; });\n"
12598                "  MACRO((AA &a) { return 1; });\n"
12599                "}");
12600 
12601   verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
12602                "      doo_dah();\n"
12603                "      doo_dah();\n"
12604                "    })) {\n"
12605                "}");
12606   verifyFormat("if constexpr (blah_blah(whatever, whatever, [] {\n"
12607                "                doo_dah();\n"
12608                "                doo_dah();\n"
12609                "              })) {\n"
12610                "}");
12611   verifyFormat("auto lambda = []() {\n"
12612                "  int a = 2\n"
12613                "#if A\n"
12614                "          + 2\n"
12615                "#endif\n"
12616                "      ;\n"
12617                "};");
12618 
12619   // Lambdas with complex multiline introducers.
12620   verifyFormat(
12621       "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
12622       "    [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n"
12623       "        -> ::std::unordered_set<\n"
12624       "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n"
12625       "      //\n"
12626       "    });");
12627 
12628   FormatStyle DoNotMerge = getLLVMStyle();
12629   DoNotMerge.AllowShortLambdasOnASingleLine = FormatStyle::SLS_None;
12630   verifyFormat("auto c = []() {\n"
12631                "  return b;\n"
12632                "};",
12633                "auto c = []() { return b; };", DoNotMerge);
12634   verifyFormat("auto c = []() {\n"
12635                "};",
12636                " auto c = []() {};", DoNotMerge);
12637 
12638   FormatStyle MergeEmptyOnly = getLLVMStyle();
12639   MergeEmptyOnly.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Empty;
12640   verifyFormat("auto c = []() {\n"
12641                "  return b;\n"
12642                "};",
12643                "auto c = []() {\n"
12644                "  return b;\n"
12645                " };",
12646                MergeEmptyOnly);
12647   verifyFormat("auto c = []() {};",
12648                "auto c = []() {\n"
12649                "};",
12650                MergeEmptyOnly);
12651 
12652   FormatStyle MergeInline = getLLVMStyle();
12653   MergeInline.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Inline;
12654   verifyFormat("auto c = []() {\n"
12655                "  return b;\n"
12656                "};",
12657                "auto c = []() { return b; };", MergeInline);
12658   verifyFormat("function([]() { return b; })", "function([]() { return b; })",
12659                MergeInline);
12660   verifyFormat("function([]() { return b; }, a)",
12661                "function([]() { return b; }, a)", MergeInline);
12662   verifyFormat("function(a, []() { return b; })",
12663                "function(a, []() { return b; })", MergeInline);
12664 }
12665 
12666 TEST_F(FormatTest, EmptyLinesInLambdas) {
12667   verifyFormat("auto lambda = []() {\n"
12668                "  x(); //\n"
12669                "};",
12670                "auto lambda = []() {\n"
12671                "\n"
12672                "  x(); //\n"
12673                "\n"
12674                "};");
12675 }
12676 
12677 TEST_F(FormatTest, FormatsBlocks) {
12678   FormatStyle ShortBlocks = getLLVMStyle();
12679   ShortBlocks.AllowShortBlocksOnASingleLine = true;
12680   verifyFormat("int (^Block)(int, int);", ShortBlocks);
12681   verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
12682   verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
12683   verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
12684   verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
12685   verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
12686 
12687   verifyFormat("foo(^{ bar(); });", ShortBlocks);
12688   verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
12689   verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
12690 
12691   verifyFormat("[operation setCompletionBlock:^{\n"
12692                "  [self onOperationDone];\n"
12693                "}];");
12694   verifyFormat("int i = {[operation setCompletionBlock:^{\n"
12695                "  [self onOperationDone];\n"
12696                "}]};");
12697   verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
12698                "  f();\n"
12699                "}];");
12700   verifyFormat("int a = [operation block:^int(int *i) {\n"
12701                "  return 1;\n"
12702                "}];");
12703   verifyFormat("[myObject doSomethingWith:arg1\n"
12704                "                      aaa:^int(int *a) {\n"
12705                "                        return 1;\n"
12706                "                      }\n"
12707                "                      bbb:f(a * bbbbbbbb)];");
12708 
12709   verifyFormat("[operation setCompletionBlock:^{\n"
12710                "  [self.delegate newDataAvailable];\n"
12711                "}];",
12712                getLLVMStyleWithColumns(60));
12713   verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
12714                "  NSString *path = [self sessionFilePath];\n"
12715                "  if (path) {\n"
12716                "    // ...\n"
12717                "  }\n"
12718                "});");
12719   verifyFormat("[[SessionService sharedService]\n"
12720                "    loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
12721                "      if (window) {\n"
12722                "        [self windowDidLoad:window];\n"
12723                "      } else {\n"
12724                "        [self errorLoadingWindow];\n"
12725                "      }\n"
12726                "    }];");
12727   verifyFormat("void (^largeBlock)(void) = ^{\n"
12728                "  // ...\n"
12729                "};\n",
12730                getLLVMStyleWithColumns(40));
12731   verifyFormat("[[SessionService sharedService]\n"
12732                "    loadWindowWithCompletionBlock: //\n"
12733                "        ^(SessionWindow *window) {\n"
12734                "          if (window) {\n"
12735                "            [self windowDidLoad:window];\n"
12736                "          } else {\n"
12737                "            [self errorLoadingWindow];\n"
12738                "          }\n"
12739                "        }];",
12740                getLLVMStyleWithColumns(60));
12741   verifyFormat("[myObject doSomethingWith:arg1\n"
12742                "    firstBlock:^(Foo *a) {\n"
12743                "      // ...\n"
12744                "      int i;\n"
12745                "    }\n"
12746                "    secondBlock:^(Bar *b) {\n"
12747                "      // ...\n"
12748                "      int i;\n"
12749                "    }\n"
12750                "    thirdBlock:^Foo(Bar *b) {\n"
12751                "      // ...\n"
12752                "      int i;\n"
12753                "    }];");
12754   verifyFormat("[myObject doSomethingWith:arg1\n"
12755                "               firstBlock:-1\n"
12756                "              secondBlock:^(Bar *b) {\n"
12757                "                // ...\n"
12758                "                int i;\n"
12759                "              }];");
12760 
12761   verifyFormat("f(^{\n"
12762                "  @autoreleasepool {\n"
12763                "    if (a) {\n"
12764                "      g();\n"
12765                "    }\n"
12766                "  }\n"
12767                "});");
12768   verifyFormat("Block b = ^int *(A *a, B *b) {}");
12769   verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
12770                "};");
12771 
12772   FormatStyle FourIndent = getLLVMStyle();
12773   FourIndent.ObjCBlockIndentWidth = 4;
12774   verifyFormat("[operation setCompletionBlock:^{\n"
12775                "    [self onOperationDone];\n"
12776                "}];",
12777                FourIndent);
12778 }
12779 
12780 TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
12781   FormatStyle ZeroColumn = getLLVMStyle();
12782   ZeroColumn.ColumnLimit = 0;
12783 
12784   verifyFormat("[[SessionService sharedService] "
12785                "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
12786                "  if (window) {\n"
12787                "    [self windowDidLoad:window];\n"
12788                "  } else {\n"
12789                "    [self errorLoadingWindow];\n"
12790                "  }\n"
12791                "}];",
12792                ZeroColumn);
12793   EXPECT_EQ("[[SessionService sharedService]\n"
12794             "    loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
12795             "      if (window) {\n"
12796             "        [self windowDidLoad:window];\n"
12797             "      } else {\n"
12798             "        [self errorLoadingWindow];\n"
12799             "      }\n"
12800             "    }];",
12801             format("[[SessionService sharedService]\n"
12802                    "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
12803                    "                if (window) {\n"
12804                    "    [self windowDidLoad:window];\n"
12805                    "  } else {\n"
12806                    "    [self errorLoadingWindow];\n"
12807                    "  }\n"
12808                    "}];",
12809                    ZeroColumn));
12810   verifyFormat("[myObject doSomethingWith:arg1\n"
12811                "    firstBlock:^(Foo *a) {\n"
12812                "      // ...\n"
12813                "      int i;\n"
12814                "    }\n"
12815                "    secondBlock:^(Bar *b) {\n"
12816                "      // ...\n"
12817                "      int i;\n"
12818                "    }\n"
12819                "    thirdBlock:^Foo(Bar *b) {\n"
12820                "      // ...\n"
12821                "      int i;\n"
12822                "    }];",
12823                ZeroColumn);
12824   verifyFormat("f(^{\n"
12825                "  @autoreleasepool {\n"
12826                "    if (a) {\n"
12827                "      g();\n"
12828                "    }\n"
12829                "  }\n"
12830                "});",
12831                ZeroColumn);
12832   verifyFormat("void (^largeBlock)(void) = ^{\n"
12833                "  // ...\n"
12834                "};",
12835                ZeroColumn);
12836 
12837   ZeroColumn.AllowShortBlocksOnASingleLine = true;
12838   EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
12839             format("void   (^largeBlock)(void) = ^{ int   i; };", ZeroColumn));
12840   ZeroColumn.AllowShortBlocksOnASingleLine = false;
12841   EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
12842             "  int i;\n"
12843             "};",
12844             format("void   (^largeBlock)(void) = ^{ int   i; };", ZeroColumn));
12845 }
12846 
12847 TEST_F(FormatTest, SupportsCRLF) {
12848   EXPECT_EQ("int a;\r\n"
12849             "int b;\r\n"
12850             "int c;\r\n",
12851             format("int a;\r\n"
12852                    "  int b;\r\n"
12853                    "    int c;\r\n",
12854                    getLLVMStyle()));
12855   EXPECT_EQ("int a;\r\n"
12856             "int b;\r\n"
12857             "int c;\r\n",
12858             format("int a;\r\n"
12859                    "  int b;\n"
12860                    "    int c;\r\n",
12861                    getLLVMStyle()));
12862   EXPECT_EQ("int a;\n"
12863             "int b;\n"
12864             "int c;\n",
12865             format("int a;\r\n"
12866                    "  int b;\n"
12867                    "    int c;\n",
12868                    getLLVMStyle()));
12869   EXPECT_EQ("\"aaaaaaa \"\r\n"
12870             "\"bbbbbbb\";\r\n",
12871             format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
12872   EXPECT_EQ("#define A \\\r\n"
12873             "  b;      \\\r\n"
12874             "  c;      \\\r\n"
12875             "  d;\r\n",
12876             format("#define A \\\r\n"
12877                    "  b; \\\r\n"
12878                    "  c; d; \r\n",
12879                    getGoogleStyle()));
12880 
12881   EXPECT_EQ("/*\r\n"
12882             "multi line block comments\r\n"
12883             "should not introduce\r\n"
12884             "an extra carriage return\r\n"
12885             "*/\r\n",
12886             format("/*\r\n"
12887                    "multi line block comments\r\n"
12888                    "should not introduce\r\n"
12889                    "an extra carriage return\r\n"
12890                    "*/\r\n"));
12891   EXPECT_EQ("/*\r\n"
12892             "\r\n"
12893             "*/",
12894             format("/*\r\n"
12895                    "    \r\r\r\n"
12896                    "*/"));
12897 }
12898 
12899 TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
12900   verifyFormat("MY_CLASS(C) {\n"
12901                "  int i;\n"
12902                "  int j;\n"
12903                "};");
12904 }
12905 
12906 TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
12907   FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
12908   TwoIndent.ContinuationIndentWidth = 2;
12909 
12910   EXPECT_EQ("int i =\n"
12911             "  longFunction(\n"
12912             "    arg);",
12913             format("int i = longFunction(arg);", TwoIndent));
12914 
12915   FormatStyle SixIndent = getLLVMStyleWithColumns(20);
12916   SixIndent.ContinuationIndentWidth = 6;
12917 
12918   EXPECT_EQ("int i =\n"
12919             "      longFunction(\n"
12920             "            arg);",
12921             format("int i = longFunction(arg);", SixIndent));
12922 }
12923 
12924 TEST_F(FormatTest, WrappedClosingParenthesisIndent) {
12925   FormatStyle Style = getLLVMStyle();
12926   verifyFormat("int Foo::getter(\n"
12927                "    //\n"
12928                ") const {\n"
12929                "  return foo;\n"
12930                "}",
12931                Style);
12932   verifyFormat("void Foo::setter(\n"
12933                "    //\n"
12934                ") {\n"
12935                "  foo = 1;\n"
12936                "}",
12937                Style);
12938 }
12939 
12940 TEST_F(FormatTest, SpacesInAngles) {
12941   FormatStyle Spaces = getLLVMStyle();
12942   Spaces.SpacesInAngles = true;
12943 
12944   verifyFormat("static_cast< int >(arg);", Spaces);
12945   verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
12946   verifyFormat("f< int, float >();", Spaces);
12947   verifyFormat("template <> g() {}", Spaces);
12948   verifyFormat("template < std::vector< int > > f() {}", Spaces);
12949   verifyFormat("std::function< void(int, int) > fct;", Spaces);
12950   verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
12951                Spaces);
12952 
12953   Spaces.Standard = FormatStyle::LS_Cpp03;
12954   Spaces.SpacesInAngles = true;
12955   verifyFormat("A< A< int > >();", Spaces);
12956 
12957   Spaces.SpacesInAngles = false;
12958   verifyFormat("A<A<int> >();", Spaces);
12959 
12960   Spaces.Standard = FormatStyle::LS_Cpp11;
12961   Spaces.SpacesInAngles = true;
12962   verifyFormat("A< A< int > >();", Spaces);
12963 
12964   Spaces.SpacesInAngles = false;
12965   verifyFormat("A<A<int>>();", Spaces);
12966 }
12967 
12968 TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
12969   FormatStyle Style = getLLVMStyle();
12970   Style.SpaceAfterTemplateKeyword = false;
12971   verifyFormat("template<int> void foo();", Style);
12972 }
12973 
12974 TEST_F(FormatTest, TripleAngleBrackets) {
12975   verifyFormat("f<<<1, 1>>>();");
12976   verifyFormat("f<<<1, 1, 1, s>>>();");
12977   verifyFormat("f<<<a, b, c, d>>>();");
12978   EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
12979   verifyFormat("f<param><<<1, 1>>>();");
12980   verifyFormat("f<1><<<1, 1>>>();");
12981   EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
12982   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
12983                "aaaaaaaaaaa<<<\n    1, 1>>>();");
12984   verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
12985                "    <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
12986 }
12987 
12988 TEST_F(FormatTest, MergeLessLessAtEnd) {
12989   verifyFormat("<<");
12990   EXPECT_EQ("< < <", format("\\\n<<<"));
12991   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
12992                "aaallvm::outs() <<");
12993   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
12994                "aaaallvm::outs()\n    <<");
12995 }
12996 
12997 TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
12998   std::string code = "#if A\n"
12999                      "#if B\n"
13000                      "a.\n"
13001                      "#endif\n"
13002                      "    a = 1;\n"
13003                      "#else\n"
13004                      "#endif\n"
13005                      "#if C\n"
13006                      "#else\n"
13007                      "#endif\n";
13008   EXPECT_EQ(code, format(code));
13009 }
13010 
13011 TEST_F(FormatTest, HandleConflictMarkers) {
13012   // Git/SVN conflict markers.
13013   EXPECT_EQ("int a;\n"
13014             "void f() {\n"
13015             "  callme(some(parameter1,\n"
13016             "<<<<<<< text by the vcs\n"
13017             "              parameter2),\n"
13018             "||||||| text by the vcs\n"
13019             "              parameter2),\n"
13020             "         parameter3,\n"
13021             "======= text by the vcs\n"
13022             "              parameter2, parameter3),\n"
13023             ">>>>>>> text by the vcs\n"
13024             "         otherparameter);\n",
13025             format("int a;\n"
13026                    "void f() {\n"
13027                    "  callme(some(parameter1,\n"
13028                    "<<<<<<< text by the vcs\n"
13029                    "  parameter2),\n"
13030                    "||||||| text by the vcs\n"
13031                    "  parameter2),\n"
13032                    "  parameter3,\n"
13033                    "======= text by the vcs\n"
13034                    "  parameter2,\n"
13035                    "  parameter3),\n"
13036                    ">>>>>>> text by the vcs\n"
13037                    "  otherparameter);\n"));
13038 
13039   // Perforce markers.
13040   EXPECT_EQ("void f() {\n"
13041             "  function(\n"
13042             ">>>> text by the vcs\n"
13043             "      parameter,\n"
13044             "==== text by the vcs\n"
13045             "      parameter,\n"
13046             "==== text by the vcs\n"
13047             "      parameter,\n"
13048             "<<<< text by the vcs\n"
13049             "      parameter);\n",
13050             format("void f() {\n"
13051                    "  function(\n"
13052                    ">>>> text by the vcs\n"
13053                    "  parameter,\n"
13054                    "==== text by the vcs\n"
13055                    "  parameter,\n"
13056                    "==== text by the vcs\n"
13057                    "  parameter,\n"
13058                    "<<<< text by the vcs\n"
13059                    "  parameter);\n"));
13060 
13061   EXPECT_EQ("<<<<<<<\n"
13062             "|||||||\n"
13063             "=======\n"
13064             ">>>>>>>",
13065             format("<<<<<<<\n"
13066                    "|||||||\n"
13067                    "=======\n"
13068                    ">>>>>>>"));
13069 
13070   EXPECT_EQ("<<<<<<<\n"
13071             "|||||||\n"
13072             "int i;\n"
13073             "=======\n"
13074             ">>>>>>>",
13075             format("<<<<<<<\n"
13076                    "|||||||\n"
13077                    "int i;\n"
13078                    "=======\n"
13079                    ">>>>>>>"));
13080 
13081   // FIXME: Handle parsing of macros around conflict markers correctly:
13082   EXPECT_EQ("#define Macro \\\n"
13083             "<<<<<<<\n"
13084             "Something \\\n"
13085             "|||||||\n"
13086             "Else \\\n"
13087             "=======\n"
13088             "Other \\\n"
13089             ">>>>>>>\n"
13090             "    End int i;\n",
13091             format("#define Macro \\\n"
13092                    "<<<<<<<\n"
13093                    "  Something \\\n"
13094                    "|||||||\n"
13095                    "  Else \\\n"
13096                    "=======\n"
13097                    "  Other \\\n"
13098                    ">>>>>>>\n"
13099                    "  End\n"
13100                    "int i;\n"));
13101 }
13102 
13103 TEST_F(FormatTest, DisableRegions) {
13104   EXPECT_EQ("int i;\n"
13105             "// clang-format off\n"
13106             "  int j;\n"
13107             "// clang-format on\n"
13108             "int k;",
13109             format(" int  i;\n"
13110                    "   // clang-format off\n"
13111                    "  int j;\n"
13112                    " // clang-format on\n"
13113                    "   int   k;"));
13114   EXPECT_EQ("int i;\n"
13115             "/* clang-format off */\n"
13116             "  int j;\n"
13117             "/* clang-format on */\n"
13118             "int k;",
13119             format(" int  i;\n"
13120                    "   /* clang-format off */\n"
13121                    "  int j;\n"
13122                    " /* clang-format on */\n"
13123                    "   int   k;"));
13124 
13125   // Don't reflow comments within disabled regions.
13126   EXPECT_EQ(
13127       "// clang-format off\n"
13128       "// long long long long long long line\n"
13129       "/* clang-format on */\n"
13130       "/* long long long\n"
13131       " * long long long\n"
13132       " * line */\n"
13133       "int i;\n"
13134       "/* clang-format off */\n"
13135       "/* long long long long long long line */\n",
13136       format("// clang-format off\n"
13137              "// long long long long long long line\n"
13138              "/* clang-format on */\n"
13139              "/* long long long long long long line */\n"
13140              "int i;\n"
13141              "/* clang-format off */\n"
13142              "/* long long long long long long line */\n",
13143              getLLVMStyleWithColumns(20)));
13144 }
13145 
13146 TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
13147   format("? ) =");
13148   verifyNoCrash("#define a\\\n /**/}");
13149 }
13150 
13151 TEST_F(FormatTest, FormatsTableGenCode) {
13152   FormatStyle Style = getLLVMStyle();
13153   Style.Language = FormatStyle::LK_TableGen;
13154   verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
13155 }
13156 
13157 TEST_F(FormatTest, ArrayOfTemplates) {
13158   EXPECT_EQ("auto a = new unique_ptr<int>[10];",
13159             format("auto a = new unique_ptr<int > [ 10];"));
13160 
13161   FormatStyle Spaces = getLLVMStyle();
13162   Spaces.SpacesInSquareBrackets = true;
13163   EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
13164             format("auto a = new unique_ptr<int > [10];", Spaces));
13165 }
13166 
13167 TEST_F(FormatTest, ArrayAsTemplateType) {
13168   EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
13169             format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
13170 
13171   FormatStyle Spaces = getLLVMStyle();
13172   Spaces.SpacesInSquareBrackets = true;
13173   EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
13174             format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
13175 }
13176 
13177 TEST_F(FormatTest, NoSpaceAfterSuper) {
13178     verifyFormat("__super::FooBar();");
13179 }
13180 
13181 TEST(FormatStyle, GetStyleWithEmptyFileName) {
13182   llvm::vfs::InMemoryFileSystem FS;
13183   auto Style1 = getStyle("file", "", "Google", "", &FS);
13184   ASSERT_TRUE((bool)Style1);
13185   ASSERT_EQ(*Style1, getGoogleStyle());
13186 }
13187 
13188 TEST(FormatStyle, GetStyleOfFile) {
13189   llvm::vfs::InMemoryFileSystem FS;
13190   // Test 1: format file in the same directory.
13191   ASSERT_TRUE(
13192       FS.addFile("/a/.clang-format", 0,
13193                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
13194   ASSERT_TRUE(
13195       FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
13196   auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
13197   ASSERT_TRUE((bool)Style1);
13198   ASSERT_EQ(*Style1, getLLVMStyle());
13199 
13200   // Test 2.1: fallback to default.
13201   ASSERT_TRUE(
13202       FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
13203   auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
13204   ASSERT_TRUE((bool)Style2);
13205   ASSERT_EQ(*Style2, getMozillaStyle());
13206 
13207   // Test 2.2: no format on 'none' fallback style.
13208   Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
13209   ASSERT_TRUE((bool)Style2);
13210   ASSERT_EQ(*Style2, getNoStyle());
13211 
13212   // Test 2.3: format if config is found with no based style while fallback is
13213   // 'none'.
13214   ASSERT_TRUE(FS.addFile("/b/.clang-format", 0,
13215                          llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2")));
13216   Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
13217   ASSERT_TRUE((bool)Style2);
13218   ASSERT_EQ(*Style2, getLLVMStyle());
13219 
13220   // Test 2.4: format if yaml with no based style, while fallback is 'none'.
13221   Style2 = getStyle("{}", "a.h", "none", "", &FS);
13222   ASSERT_TRUE((bool)Style2);
13223   ASSERT_EQ(*Style2, getLLVMStyle());
13224 
13225   // Test 3: format file in parent directory.
13226   ASSERT_TRUE(
13227       FS.addFile("/c/.clang-format", 0,
13228                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
13229   ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
13230                          llvm::MemoryBuffer::getMemBuffer("int i;")));
13231   auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
13232   ASSERT_TRUE((bool)Style3);
13233   ASSERT_EQ(*Style3, getGoogleStyle());
13234 
13235   // Test 4: error on invalid fallback style
13236   auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS);
13237   ASSERT_FALSE((bool)Style4);
13238   llvm::consumeError(Style4.takeError());
13239 
13240   // Test 5: error on invalid yaml on command line
13241   auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS);
13242   ASSERT_FALSE((bool)Style5);
13243   llvm::consumeError(Style5.takeError());
13244 
13245   // Test 6: error on invalid style
13246   auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS);
13247   ASSERT_FALSE((bool)Style6);
13248   llvm::consumeError(Style6.takeError());
13249 
13250   // Test 7: found config file, error on parsing it
13251   ASSERT_TRUE(
13252       FS.addFile("/d/.clang-format", 0,
13253                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n"
13254                                                   "InvalidKey: InvalidValue")));
13255   ASSERT_TRUE(
13256       FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
13257   auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS);
13258   ASSERT_FALSE((bool)Style7);
13259   llvm::consumeError(Style7.takeError());
13260 
13261   // Test 8: inferred per-language defaults apply.
13262   auto StyleTd = getStyle("file", "x.td", "llvm", "", &FS);
13263   ASSERT_TRUE((bool)StyleTd);
13264   ASSERT_EQ(*StyleTd, getLLVMStyle(FormatStyle::LK_TableGen));
13265 }
13266 
13267 TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
13268   // Column limit is 20.
13269   std::string Code = "Type *a =\n"
13270                      "    new Type();\n"
13271                      "g(iiiii, 0, jjjjj,\n"
13272                      "  0, kkkkk, 0, mm);\n"
13273                      "int  bad     = format   ;";
13274   std::string Expected = "auto a = new Type();\n"
13275                          "g(iiiii, nullptr,\n"
13276                          "  jjjjj, nullptr,\n"
13277                          "  kkkkk, nullptr,\n"
13278                          "  mm);\n"
13279                          "int  bad     = format   ;";
13280   FileID ID = Context.createInMemoryFile("format.cpp", Code);
13281   tooling::Replacements Replaces = toReplacements(
13282       {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
13283                             "auto "),
13284        tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
13285                             "nullptr"),
13286        tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
13287                             "nullptr"),
13288        tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
13289                             "nullptr")});
13290 
13291   format::FormatStyle Style = format::getLLVMStyle();
13292   Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
13293   auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
13294   EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
13295       << llvm::toString(FormattedReplaces.takeError()) << "\n";
13296   auto Result = applyAllReplacements(Code, *FormattedReplaces);
13297   EXPECT_TRUE(static_cast<bool>(Result));
13298   EXPECT_EQ(Expected, *Result);
13299 }
13300 
13301 TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
13302   std::string Code = "#include \"a.h\"\n"
13303                      "#include \"c.h\"\n"
13304                      "\n"
13305                      "int main() {\n"
13306                      "  return 0;\n"
13307                      "}";
13308   std::string Expected = "#include \"a.h\"\n"
13309                          "#include \"b.h\"\n"
13310                          "#include \"c.h\"\n"
13311                          "\n"
13312                          "int main() {\n"
13313                          "  return 0;\n"
13314                          "}";
13315   FileID ID = Context.createInMemoryFile("fix.cpp", Code);
13316   tooling::Replacements Replaces = toReplacements(
13317       {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
13318                             "#include \"b.h\"\n")});
13319 
13320   format::FormatStyle Style = format::getLLVMStyle();
13321   Style.SortIncludes = true;
13322   auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
13323   EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
13324       << llvm::toString(FormattedReplaces.takeError()) << "\n";
13325   auto Result = applyAllReplacements(Code, *FormattedReplaces);
13326   EXPECT_TRUE(static_cast<bool>(Result));
13327   EXPECT_EQ(Expected, *Result);
13328 }
13329 
13330 TEST_F(FormatTest, FormatSortsUsingDeclarations) {
13331   EXPECT_EQ("using std::cin;\n"
13332             "using std::cout;",
13333             format("using std::cout;\n"
13334                    "using std::cin;", getGoogleStyle()));
13335 }
13336 
13337 TEST_F(FormatTest, UTF8CharacterLiteralCpp03) {
13338   format::FormatStyle Style = format::getLLVMStyle();
13339   Style.Standard = FormatStyle::LS_Cpp03;
13340   // cpp03 recognize this string as identifier u8 and literal character 'a'
13341   EXPECT_EQ("auto c = u8 'a';", format("auto c = u8'a';", Style));
13342 }
13343 
13344 TEST_F(FormatTest, UTF8CharacterLiteralCpp11) {
13345   // u8'a' is a C++17 feature, utf8 literal character, LS_Cpp11 covers
13346   // all modes, including C++11, C++14 and C++17
13347   EXPECT_EQ("auto c = u8'a';", format("auto c = u8'a';"));
13348 }
13349 
13350 TEST_F(FormatTest, DoNotFormatLikelyXml) {
13351   EXPECT_EQ("<!-- ;> -->",
13352             format("<!-- ;> -->", getGoogleStyle()));
13353   EXPECT_EQ(" <!-- >; -->",
13354             format(" <!-- >; -->", getGoogleStyle()));
13355 }
13356 
13357 TEST_F(FormatTest, StructuredBindings) {
13358   // Structured bindings is a C++17 feature.
13359   // all modes, including C++11, C++14 and C++17
13360   verifyFormat("auto [a, b] = f();");
13361   EXPECT_EQ("auto [a, b] = f();", format("auto[a, b] = f();"));
13362   EXPECT_EQ("const auto [a, b] = f();", format("const   auto[a, b] = f();"));
13363   EXPECT_EQ("auto const [a, b] = f();", format("auto  const[a, b] = f();"));
13364   EXPECT_EQ("auto const volatile [a, b] = f();",
13365             format("auto  const   volatile[a, b] = f();"));
13366   EXPECT_EQ("auto [a, b, c] = f();", format("auto   [  a  ,  b,c   ] = f();"));
13367   EXPECT_EQ("auto &[a, b, c] = f();",
13368             format("auto   &[  a  ,  b,c   ] = f();"));
13369   EXPECT_EQ("auto &&[a, b, c] = f();",
13370             format("auto   &&[  a  ,  b,c   ] = f();"));
13371   EXPECT_EQ("auto const &[a, b] = f();", format("auto  const&[a, b] = f();"));
13372   EXPECT_EQ("auto const volatile &&[a, b] = f();",
13373             format("auto  const  volatile  &&[a, b] = f();"));
13374   EXPECT_EQ("auto const &&[a, b] = f();", format("auto  const   &&  [a, b] = f();"));
13375   EXPECT_EQ("const auto &[a, b] = f();", format("const  auto  &  [a, b] = f();"));
13376   EXPECT_EQ("const auto volatile &&[a, b] = f();",
13377             format("const  auto   volatile  &&[a, b] = f();"));
13378   EXPECT_EQ("volatile const auto &&[a, b] = f();",
13379             format("volatile  const  auto   &&[a, b] = f();"));
13380   EXPECT_EQ("const auto &&[a, b] = f();", format("const  auto  &&  [a, b] = f();"));
13381 
13382   // Make sure we don't mistake structured bindings for lambdas.
13383   FormatStyle PointerMiddle = getLLVMStyle();
13384   PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
13385   verifyFormat("auto [a1, b]{A * i};", getGoogleStyle());
13386   verifyFormat("auto [a2, b]{A * i};", getLLVMStyle());
13387   verifyFormat("auto [a3, b]{A * i};", PointerMiddle);
13388   verifyFormat("auto const [a1, b]{A * i};", getGoogleStyle());
13389   verifyFormat("auto const [a2, b]{A * i};", getLLVMStyle());
13390   verifyFormat("auto const [a3, b]{A * i};", PointerMiddle);
13391   verifyFormat("auto const& [a1, b]{A * i};", getGoogleStyle());
13392   verifyFormat("auto const &[a2, b]{A * i};", getLLVMStyle());
13393   verifyFormat("auto const & [a3, b]{A * i};", PointerMiddle);
13394   verifyFormat("auto const&& [a1, b]{A * i};", getGoogleStyle());
13395   verifyFormat("auto const &&[a2, b]{A * i};", getLLVMStyle());
13396   verifyFormat("auto const && [a3, b]{A * i};", PointerMiddle);
13397 
13398   EXPECT_EQ("for (const auto &&[a, b] : some_range) {\n}",
13399             format("for (const auto   &&   [a, b] : some_range) {\n}"));
13400   EXPECT_EQ("for (const auto &[a, b] : some_range) {\n}",
13401             format("for (const auto   &   [a, b] : some_range) {\n}"));
13402   EXPECT_EQ("for (const auto [a, b] : some_range) {\n}",
13403             format("for (const auto[a, b] : some_range) {\n}"));
13404   EXPECT_EQ("auto [x, y](expr);", format("auto[x,y]  (expr);"));
13405   EXPECT_EQ("auto &[x, y](expr);", format("auto  &  [x,y]  (expr);"));
13406   EXPECT_EQ("auto &&[x, y](expr);", format("auto  &&  [x,y]  (expr);"));
13407   EXPECT_EQ("auto const &[x, y](expr);", format("auto  const  &  [x,y]  (expr);"));
13408   EXPECT_EQ("auto const &&[x, y](expr);", format("auto  const  &&  [x,y]  (expr);"));
13409   EXPECT_EQ("auto [x, y]{expr};", format("auto[x,y]     {expr};"));
13410   EXPECT_EQ("auto const &[x, y]{expr};", format("auto  const  &  [x,y]  {expr};"));
13411   EXPECT_EQ("auto const &&[x, y]{expr};", format("auto  const  &&  [x,y]  {expr};"));
13412 
13413   format::FormatStyle Spaces = format::getLLVMStyle();
13414   Spaces.SpacesInSquareBrackets = true;
13415   verifyFormat("auto [ a, b ] = f();", Spaces);
13416   verifyFormat("auto &&[ a, b ] = f();", Spaces);
13417   verifyFormat("auto &[ a, b ] = f();", Spaces);
13418   verifyFormat("auto const &&[ a, b ] = f();", Spaces);
13419   verifyFormat("auto const &[ a, b ] = f();", Spaces);
13420 }
13421 
13422 TEST_F(FormatTest, FileAndCode) {
13423   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.cc", ""));
13424   EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.m", ""));
13425   EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.mm", ""));
13426   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", ""));
13427   EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@interface Foo\n@end\n"));
13428   EXPECT_EQ(
13429       FormatStyle::LK_ObjC,
13430       guessLanguage("foo.h", "#define TRY(x, y) @try { x; } @finally { y; }"));
13431   EXPECT_EQ(FormatStyle::LK_ObjC,
13432             guessLanguage("foo.h", "#define AVAIL(x) @available(x, *))"));
13433   EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@class Foo;"));
13434   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo", ""));
13435   EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo", "@interface Foo\n@end\n"));
13436   EXPECT_EQ(FormatStyle::LK_ObjC,
13437             guessLanguage("foo.h", "int DoStuff(CGRect rect);\n"));
13438   EXPECT_EQ(
13439       FormatStyle::LK_ObjC,
13440       guessLanguage("foo.h",
13441                     "#define MY_POINT_MAKE(x, y) CGPointMake((x), (y));\n"));
13442   EXPECT_EQ(
13443       FormatStyle::LK_Cpp,
13444       guessLanguage("foo.h", "#define FOO(...) auto bar = [] __VA_ARGS__;"));
13445 }
13446 
13447 TEST_F(FormatTest, GuessLanguageWithCpp11AttributeSpecifiers) {
13448   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[noreturn]];"));
13449   EXPECT_EQ(FormatStyle::LK_ObjC,
13450             guessLanguage("foo.h", "array[[calculator getIndex]];"));
13451   EXPECT_EQ(FormatStyle::LK_Cpp,
13452             guessLanguage("foo.h", "[[noreturn, deprecated(\"so sorry\")]];"));
13453   EXPECT_EQ(
13454       FormatStyle::LK_Cpp,
13455       guessLanguage("foo.h", "[[noreturn, deprecated(\"gone, sorry\")]];"));
13456   EXPECT_EQ(FormatStyle::LK_ObjC,
13457             guessLanguage("foo.h", "[[noreturn foo] bar];"));
13458   EXPECT_EQ(FormatStyle::LK_Cpp,
13459             guessLanguage("foo.h", "[[clang::fallthrough]];"));
13460   EXPECT_EQ(FormatStyle::LK_ObjC,
13461             guessLanguage("foo.h", "[[clang:fallthrough] foo];"));
13462   EXPECT_EQ(FormatStyle::LK_Cpp,
13463             guessLanguage("foo.h", "[[gsl::suppress(\"type\")]];"));
13464   EXPECT_EQ(FormatStyle::LK_Cpp,
13465             guessLanguage("foo.h", "[[using clang: fallthrough]];"));
13466   EXPECT_EQ(FormatStyle::LK_ObjC,
13467             guessLanguage("foo.h", "[[abusing clang:fallthrough] bar];"));
13468   EXPECT_EQ(FormatStyle::LK_Cpp,
13469             guessLanguage("foo.h", "[[using gsl: suppress(\"type\")]];"));
13470   EXPECT_EQ(
13471       FormatStyle::LK_Cpp,
13472       guessLanguage("foo.h", "for (auto &&[endpoint, stream] : streams_)"));
13473   EXPECT_EQ(
13474       FormatStyle::LK_Cpp,
13475       guessLanguage("foo.h",
13476                     "[[clang::callable_when(\"unconsumed\", \"unknown\")]]"));
13477   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[foo::bar, ...]]"));
13478 }
13479 
13480 TEST_F(FormatTest, GuessLanguageWithCaret) {
13481   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^);"));
13482   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^, Bar);"));
13483   EXPECT_EQ(FormatStyle::LK_ObjC,
13484             guessLanguage("foo.h", "int(^)(char, float);"));
13485   EXPECT_EQ(FormatStyle::LK_ObjC,
13486             guessLanguage("foo.h", "int(^foo)(char, float);"));
13487   EXPECT_EQ(FormatStyle::LK_ObjC,
13488             guessLanguage("foo.h", "int(^foo[10])(char, float);"));
13489   EXPECT_EQ(FormatStyle::LK_ObjC,
13490             guessLanguage("foo.h", "int(^foo[kNumEntries])(char, float);"));
13491   EXPECT_EQ(
13492       FormatStyle::LK_ObjC,
13493       guessLanguage("foo.h", "int(^foo[(kNumEntries + 10)])(char, float);"));
13494 }
13495 
13496 TEST_F(FormatTest, GuessedLanguageWithInlineAsmClobbers) {
13497   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h",
13498                                                "void f() {\n"
13499                                                "  asm (\"mov %[e], %[d]\"\n"
13500                                                "     : [d] \"=rm\" (d)\n"
13501                                                "       [e] \"rm\" (*e));\n"
13502                                                "}"));
13503   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h",
13504                                                "void f() {\n"
13505                                                "  _asm (\"mov %[e], %[d]\"\n"
13506                                                "     : [d] \"=rm\" (d)\n"
13507                                                "       [e] \"rm\" (*e));\n"
13508                                                "}"));
13509   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h",
13510                                                "void f() {\n"
13511                                                "  __asm (\"mov %[e], %[d]\"\n"
13512                                                "     : [d] \"=rm\" (d)\n"
13513                                                "       [e] \"rm\" (*e));\n"
13514                                                "}"));
13515   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h",
13516                                                "void f() {\n"
13517                                                "  __asm__ (\"mov %[e], %[d]\"\n"
13518                                                "     : [d] \"=rm\" (d)\n"
13519                                                "       [e] \"rm\" (*e));\n"
13520                                                "}"));
13521   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h",
13522                                                "void f() {\n"
13523                                                "  asm (\"mov %[e], %[d]\"\n"
13524                                                "     : [d] \"=rm\" (d),\n"
13525                                                "       [e] \"rm\" (*e));\n"
13526                                                "}"));
13527   EXPECT_EQ(FormatStyle::LK_Cpp,
13528             guessLanguage("foo.h", "void f() {\n"
13529                                    "  asm volatile (\"mov %[e], %[d]\"\n"
13530                                    "     : [d] \"=rm\" (d)\n"
13531                                    "       [e] \"rm\" (*e));\n"
13532                                    "}"));
13533 }
13534 
13535 TEST_F(FormatTest, GuessLanguageWithChildLines) {
13536   EXPECT_EQ(FormatStyle::LK_Cpp,
13537             guessLanguage("foo.h", "#define FOO ({ std::string s; })"));
13538   EXPECT_EQ(FormatStyle::LK_ObjC,
13539             guessLanguage("foo.h", "#define FOO ({ NSString *s; })"));
13540   EXPECT_EQ(
13541       FormatStyle::LK_Cpp,
13542       guessLanguage("foo.h", "#define FOO ({ foo(); ({ std::string s; }) })"));
13543   EXPECT_EQ(
13544       FormatStyle::LK_ObjC,
13545       guessLanguage("foo.h", "#define FOO ({ foo(); ({ NSString *s; }) })"));
13546 }
13547 
13548 } // end namespace
13549 } // end namespace format
13550 } // end namespace clang
13551