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 
2589 TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) {
2590   EXPECT_EQ("INITIALIZE_PASS_BEGIN(ScopDetection, \"polly-detect\")\n"
2591             "INITIALIZE_AG_DEPENDENCY(AliasAnalysis)\n"
2592             "INITIALIZE_PASS_DEPENDENCY(DominatorTree)\n"
2593             "class X {};\n"
2594             "INITIALIZE_PASS_END(ScopDetection, \"polly-detect\")\n"
2595             "int *createScopDetectionPass() { return 0; }",
2596             format("  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   // FIXME: We could probably treat IPC_BEGIN_MESSAGE_MAP/IPC_END_MESSAGE_MAP as
2603   // braces, so that inner block is indented one level more.
2604   EXPECT_EQ("int q() {\n"
2605             "  IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2606             "  IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2607             "  IPC_END_MESSAGE_MAP()\n"
2608             "}",
2609             format("int q() {\n"
2610                    "  IPC_BEGIN_MESSAGE_MAP(WebKitTestController, message)\n"
2611                    "    IPC_MESSAGE_HANDLER(xxx, qqq)\n"
2612                    "  IPC_END_MESSAGE_MAP()\n"
2613                    "}"));
2614 
2615   // Same inside macros.
2616   EXPECT_EQ("#define LIST(L) \\\n"
2617             "  L(A)          \\\n"
2618             "  L(B)          \\\n"
2619             "  L(C)",
2620             format("#define LIST(L) \\\n"
2621                    "  L(A) \\\n"
2622                    "  L(B) \\\n"
2623                    "  L(C)",
2624                    getGoogleStyle()));
2625 
2626   // These must not be recognized as macros.
2627   EXPECT_EQ("int q() {\n"
2628             "  f(x);\n"
2629             "  f(x) {}\n"
2630             "  f(x)->g();\n"
2631             "  f(x)->*g();\n"
2632             "  f(x).g();\n"
2633             "  f(x) = x;\n"
2634             "  f(x) += x;\n"
2635             "  f(x) -= x;\n"
2636             "  f(x) *= x;\n"
2637             "  f(x) /= x;\n"
2638             "  f(x) %= x;\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)[y].z();\n"
2645             "  LOG(INFO) << x;\n"
2646             "  ifstream(x) >> x;\n"
2647             "}\n",
2648             format("int q() {\n"
2649                    "  f(x)\n;\n"
2650                    "  f(x)\n {}\n"
2651                    "  f(x)\n->g();\n"
2652                    "  f(x)\n->*g();\n"
2653                    "  f(x)\n.g();\n"
2654                    "  f(x)\n = x;\n"
2655                    "  f(x)\n += x;\n"
2656                    "  f(x)\n -= x;\n"
2657                    "  f(x)\n *= x;\n"
2658                    "  f(x)\n /= x;\n"
2659                    "  f(x)\n %= x;\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[y].z();\n"
2666                    "  LOG(INFO)\n << x;\n"
2667                    "  ifstream(x)\n >> x;\n"
2668                    "}\n"));
2669   EXPECT_EQ("int q() {\n"
2670             "  F(x)\n"
2671             "  if (1) {\n"
2672             "  }\n"
2673             "  F(x)\n"
2674             "  while (1) {\n"
2675             "  }\n"
2676             "  F(x)\n"
2677             "  G(x);\n"
2678             "  F(x)\n"
2679             "  try {\n"
2680             "    Q();\n"
2681             "  } catch (...) {\n"
2682             "  }\n"
2683             "}\n",
2684             format("int q() {\n"
2685                    "F(x)\n"
2686                    "if (1) {}\n"
2687                    "F(x)\n"
2688                    "while (1) {}\n"
2689                    "F(x)\n"
2690                    "G(x);\n"
2691                    "F(x)\n"
2692                    "try { Q(); } catch (...) {}\n"
2693                    "}\n"));
2694   EXPECT_EQ("class A {\n"
2695             "  A() : t(0) {}\n"
2696             "  A(int i) noexcept() : {}\n"
2697             "  A(X x)\n" // FIXME: function-level try blocks are broken.
2698             "  try : t(0) {\n"
2699             "  } catch (...) {\n"
2700             "  }\n"
2701             "};",
2702             format("class A {\n"
2703                    "  A()\n : t(0) {}\n"
2704                    "  A(int i)\n noexcept() : {}\n"
2705                    "  A(X x)\n"
2706                    "  try : t(0) {} catch (...) {}\n"
2707                    "};"));
2708   FormatStyle Style = getLLVMStyle();
2709   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
2710   Style.BraceWrapping.AfterControlStatement = true;
2711   Style.BraceWrapping.AfterFunction = true;
2712   EXPECT_EQ("void f()\n"
2713             "try\n"
2714             "{\n"
2715             "}",
2716             format("void f() try {\n"
2717                    "}", Style));
2718   EXPECT_EQ("class SomeClass {\n"
2719             "public:\n"
2720             "  SomeClass() EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2721             "};",
2722             format("class SomeClass {\n"
2723                    "public:\n"
2724                    "  SomeClass()\n"
2725                    "  EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2726                    "};"));
2727   EXPECT_EQ("class SomeClass {\n"
2728             "public:\n"
2729             "  SomeClass()\n"
2730             "      EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2731             "};",
2732             format("class SomeClass {\n"
2733                    "public:\n"
2734                    "  SomeClass()\n"
2735                    "  EXCLUSIVE_LOCK_FUNCTION(mu_);\n"
2736                    "};",
2737                    getLLVMStyleWithColumns(40)));
2738 
2739   verifyFormat("MACRO(>)");
2740 
2741   // Some macros contain an implicit semicolon.
2742   Style = getLLVMStyle();
2743   Style.StatementMacros.push_back("FOO");
2744   verifyFormat("FOO(a) int b = 0;");
2745   verifyFormat("FOO(a)\n"
2746                "int b = 0;",
2747                Style);
2748   verifyFormat("FOO(a);\n"
2749                "int b = 0;",
2750                Style);
2751   verifyFormat("FOO(argc, argv, \"4.0.2\")\n"
2752                "int b = 0;",
2753                Style);
2754   verifyFormat("FOO()\n"
2755                "int b = 0;",
2756                Style);
2757   verifyFormat("FOO\n"
2758                "int b = 0;",
2759                Style);
2760   verifyFormat("void f() {\n"
2761                "  FOO(a)\n"
2762                "  return a;\n"
2763                "}",
2764                Style);
2765   verifyFormat("FOO(a)\n"
2766                "FOO(b)",
2767                Style);
2768   verifyFormat("int a = 0;\n"
2769                "FOO(b)\n"
2770                "int c = 0;",
2771                Style);
2772   verifyFormat("int a = 0;\n"
2773                "int x = FOO(a)\n"
2774                "int b = 0;",
2775                Style);
2776   verifyFormat("void foo(int a) { FOO(a) }\n"
2777                "uint32_t bar() {}",
2778                Style);
2779 }
2780 
2781 TEST_F(FormatTest, LayoutMacroDefinitionsStatementsSpanningBlocks) {
2782   verifyFormat("#define A \\\n"
2783                "  f({     \\\n"
2784                "    g();  \\\n"
2785                "  });",
2786                getLLVMStyleWithColumns(11));
2787 }
2788 
2789 TEST_F(FormatTest, IndentPreprocessorDirectives) {
2790   FormatStyle Style = getLLVMStyle();
2791   Style.IndentPPDirectives = FormatStyle::PPDIS_None;
2792   Style.ColumnLimit = 40;
2793   verifyFormat("#ifdef _WIN32\n"
2794                "#define A 0\n"
2795                "#ifdef VAR2\n"
2796                "#define B 1\n"
2797                "#include <someheader.h>\n"
2798                "#define MACRO                          \\\n"
2799                "  some_very_long_func_aaaaaaaaaa();\n"
2800                "#endif\n"
2801                "#else\n"
2802                "#define A 1\n"
2803                "#endif",
2804                Style);
2805   Style.IndentPPDirectives = FormatStyle::PPDIS_AfterHash;
2806   verifyFormat("#ifdef _WIN32\n"
2807                "#  define A 0\n"
2808                "#  ifdef VAR2\n"
2809                "#    define B 1\n"
2810                "#    include <someheader.h>\n"
2811                "#    define MACRO                      \\\n"
2812                "      some_very_long_func_aaaaaaaaaa();\n"
2813                "#  endif\n"
2814                "#else\n"
2815                "#  define A 1\n"
2816                "#endif",
2817                Style);
2818   verifyFormat("#if A\n"
2819                "#  define MACRO                        \\\n"
2820                "    void a(int x) {                    \\\n"
2821                "      b();                             \\\n"
2822                "      c();                             \\\n"
2823                "      d();                             \\\n"
2824                "      e();                             \\\n"
2825                "      f();                             \\\n"
2826                "    }\n"
2827                "#endif",
2828                Style);
2829   // Comments before include guard.
2830   verifyFormat("// file comment\n"
2831                "// file comment\n"
2832                "#ifndef HEADER_H\n"
2833                "#define HEADER_H\n"
2834                "code();\n"
2835                "#endif",
2836                Style);
2837   // Test with include guards.
2838   verifyFormat("#ifndef HEADER_H\n"
2839                "#define HEADER_H\n"
2840                "code();\n"
2841                "#endif",
2842                Style);
2843   // Include guards must have a #define with the same variable immediately
2844   // after #ifndef.
2845   verifyFormat("#ifndef NOT_GUARD\n"
2846                "#  define FOO\n"
2847                "code();\n"
2848                "#endif",
2849                Style);
2850 
2851   // Include guards must cover the entire file.
2852   verifyFormat("code();\n"
2853                "code();\n"
2854                "#ifndef NOT_GUARD\n"
2855                "#  define NOT_GUARD\n"
2856                "code();\n"
2857                "#endif",
2858                Style);
2859   verifyFormat("#ifndef NOT_GUARD\n"
2860                "#  define NOT_GUARD\n"
2861                "code();\n"
2862                "#endif\n"
2863                "code();",
2864                Style);
2865   // Test with trailing blank lines.
2866   verifyFormat("#ifndef HEADER_H\n"
2867                "#define HEADER_H\n"
2868                "code();\n"
2869                "#endif\n",
2870                Style);
2871   // Include guards don't have #else.
2872   verifyFormat("#ifndef NOT_GUARD\n"
2873                "#  define NOT_GUARD\n"
2874                "code();\n"
2875                "#else\n"
2876                "#endif",
2877                Style);
2878   verifyFormat("#ifndef NOT_GUARD\n"
2879                "#  define NOT_GUARD\n"
2880                "code();\n"
2881                "#elif FOO\n"
2882                "#endif",
2883                Style);
2884   // Non-identifier #define after potential include guard.
2885   verifyFormat("#ifndef FOO\n"
2886                "#  define 1\n"
2887                "#endif\n",
2888                Style);
2889   // #if closes past last non-preprocessor line.
2890   verifyFormat("#ifndef FOO\n"
2891                "#define FOO\n"
2892                "#if 1\n"
2893                "int i;\n"
2894                "#  define A 0\n"
2895                "#endif\n"
2896                "#endif\n",
2897                Style);
2898   // FIXME: This doesn't handle the case where there's code between the
2899   // #ifndef and #define but all other conditions hold. This is because when
2900   // the #define line is parsed, UnwrappedLineParser::Lines doesn't hold the
2901   // previous code line yet, so we can't detect it.
2902   EXPECT_EQ("#ifndef NOT_GUARD\n"
2903             "code();\n"
2904             "#define NOT_GUARD\n"
2905             "code();\n"
2906             "#endif",
2907             format("#ifndef NOT_GUARD\n"
2908                    "code();\n"
2909                    "#  define NOT_GUARD\n"
2910                    "code();\n"
2911                    "#endif",
2912                    Style));
2913   // FIXME: This doesn't handle cases where legitimate preprocessor lines may
2914   // be outside an include guard. Examples are #pragma once and
2915   // #pragma GCC diagnostic, or anything else that does not change the meaning
2916   // of the file if it's included multiple times.
2917   EXPECT_EQ("#ifdef WIN32\n"
2918             "#  pragma once\n"
2919             "#endif\n"
2920             "#ifndef HEADER_H\n"
2921             "#  define HEADER_H\n"
2922             "code();\n"
2923             "#endif",
2924             format("#ifdef WIN32\n"
2925                    "#  pragma once\n"
2926                    "#endif\n"
2927                    "#ifndef HEADER_H\n"
2928                    "#define HEADER_H\n"
2929                    "code();\n"
2930                    "#endif",
2931                    Style));
2932   // FIXME: This does not detect when there is a single non-preprocessor line
2933   // in front of an include-guard-like structure where other conditions hold
2934   // because ScopedLineState hides the line.
2935   EXPECT_EQ("code();\n"
2936             "#ifndef HEADER_H\n"
2937             "#define HEADER_H\n"
2938             "code();\n"
2939             "#endif",
2940             format("code();\n"
2941                    "#ifndef HEADER_H\n"
2942                    "#  define HEADER_H\n"
2943                    "code();\n"
2944                    "#endif",
2945                    Style));
2946   // Keep comments aligned with #, otherwise indent comments normally. These
2947   // tests cannot use verifyFormat because messUp manipulates leading
2948   // whitespace.
2949   {
2950     const char *Expected = ""
2951                            "void f() {\n"
2952                            "#if 1\n"
2953                            "// Preprocessor aligned.\n"
2954                            "#  define A 0\n"
2955                            "  // Code. Separated by blank line.\n"
2956                            "\n"
2957                            "#  define B 0\n"
2958                            "  // Code. Not aligned with #\n"
2959                            "#  define C 0\n"
2960                            "#endif";
2961     const char *ToFormat = ""
2962                            "void f() {\n"
2963                            "#if 1\n"
2964                            "// Preprocessor aligned.\n"
2965                            "#  define A 0\n"
2966                            "// Code. Separated by blank line.\n"
2967                            "\n"
2968                            "#  define B 0\n"
2969                            "   // Code. Not aligned with #\n"
2970                            "#  define C 0\n"
2971                            "#endif";
2972     EXPECT_EQ(Expected, format(ToFormat, Style));
2973     EXPECT_EQ(Expected, format(Expected, Style));
2974   }
2975   // Keep block quotes aligned.
2976   {
2977     const char *Expected = ""
2978                            "void f() {\n"
2979                            "#if 1\n"
2980                            "/* Preprocessor aligned. */\n"
2981                            "#  define A 0\n"
2982                            "  /* Code. Separated by blank line. */\n"
2983                            "\n"
2984                            "#  define B 0\n"
2985                            "  /* Code. Not aligned with # */\n"
2986                            "#  define C 0\n"
2987                            "#endif";
2988     const char *ToFormat = ""
2989                            "void f() {\n"
2990                            "#if 1\n"
2991                            "/* Preprocessor aligned. */\n"
2992                            "#  define A 0\n"
2993                            "/* Code. Separated by blank line. */\n"
2994                            "\n"
2995                            "#  define B 0\n"
2996                            "   /* Code. Not aligned with # */\n"
2997                            "#  define C 0\n"
2998                            "#endif";
2999     EXPECT_EQ(Expected, format(ToFormat, Style));
3000     EXPECT_EQ(Expected, format(Expected, Style));
3001   }
3002   // Keep comments aligned with un-indented directives.
3003   {
3004     const char *Expected = ""
3005                            "void f() {\n"
3006                            "// Preprocessor aligned.\n"
3007                            "#define A 0\n"
3008                            "  // Code. Separated by blank line.\n"
3009                            "\n"
3010                            "#define B 0\n"
3011                            "  // Code. Not aligned with #\n"
3012                            "#define C 0\n";
3013     const char *ToFormat = ""
3014                            "void f() {\n"
3015                            "// Preprocessor aligned.\n"
3016                            "#define A 0\n"
3017                            "// Code. Separated by blank line.\n"
3018                            "\n"
3019                            "#define B 0\n"
3020                            "   // Code. Not aligned with #\n"
3021                            "#define C 0\n";
3022     EXPECT_EQ(Expected, format(ToFormat, Style));
3023     EXPECT_EQ(Expected, format(Expected, Style));
3024   }
3025   // Test AfterHash with tabs.
3026   {
3027     FormatStyle Tabbed = Style;
3028     Tabbed.UseTab = FormatStyle::UT_Always;
3029     Tabbed.IndentWidth = 8;
3030     Tabbed.TabWidth = 8;
3031     verifyFormat("#ifdef _WIN32\n"
3032                  "#\tdefine A 0\n"
3033                  "#\tifdef VAR2\n"
3034                  "#\t\tdefine B 1\n"
3035                  "#\t\tinclude <someheader.h>\n"
3036                  "#\t\tdefine MACRO          \\\n"
3037                  "\t\t\tsome_very_long_func_aaaaaaaaaa();\n"
3038                  "#\tendif\n"
3039                  "#else\n"
3040                  "#\tdefine A 1\n"
3041                  "#endif",
3042                  Tabbed);
3043   }
3044 
3045   // Regression test: Multiline-macro inside include guards.
3046   verifyFormat("#ifndef HEADER_H\n"
3047                "#define HEADER_H\n"
3048                "#define A()        \\\n"
3049                "  int i;           \\\n"
3050                "  int j;\n"
3051                "#endif // HEADER_H",
3052                getLLVMStyleWithColumns(20));
3053 
3054   Style.IndentPPDirectives = FormatStyle::PPDIS_BeforeHash;
3055   // Basic before hash indent tests
3056   verifyFormat("#ifdef _WIN32\n"
3057                "  #define A 0\n"
3058                "  #ifdef VAR2\n"
3059                "    #define B 1\n"
3060                "    #include <someheader.h>\n"
3061                "    #define MACRO                      \\\n"
3062                "      some_very_long_func_aaaaaaaaaa();\n"
3063                "  #endif\n"
3064                "#else\n"
3065                "  #define A 1\n"
3066                "#endif",
3067                Style);
3068   verifyFormat("#if A\n"
3069                "  #define MACRO                        \\\n"
3070                "    void a(int x) {                    \\\n"
3071                "      b();                             \\\n"
3072                "      c();                             \\\n"
3073                "      d();                             \\\n"
3074                "      e();                             \\\n"
3075                "      f();                             \\\n"
3076                "    }\n"
3077                "#endif",
3078                Style);
3079   // Keep comments aligned with indented directives. These
3080   // tests cannot use verifyFormat because messUp manipulates leading
3081   // whitespace.
3082   {
3083     const char *Expected = "void f() {\n"
3084                            "// Aligned to preprocessor.\n"
3085                            "#if 1\n"
3086                            "  // Aligned to code.\n"
3087                            "  int a;\n"
3088                            "  #if 1\n"
3089                            "    // Aligned to preprocessor.\n"
3090                            "    #define A 0\n"
3091                            "  // Aligned to code.\n"
3092                            "  int b;\n"
3093                            "  #endif\n"
3094                            "#endif\n"
3095                            "}";
3096     const char *ToFormat = "void f() {\n"
3097                            "// Aligned to preprocessor.\n"
3098                            "#if 1\n"
3099                            "// Aligned to code.\n"
3100                            "int a;\n"
3101                            "#if 1\n"
3102                            "// Aligned to preprocessor.\n"
3103                            "#define A 0\n"
3104                            "// Aligned to code.\n"
3105                            "int b;\n"
3106                            "#endif\n"
3107                            "#endif\n"
3108                            "}";
3109     EXPECT_EQ(Expected, format(ToFormat, Style));
3110     EXPECT_EQ(Expected, format(Expected, Style));
3111   }
3112   {
3113     const char *Expected = "void f() {\n"
3114                            "/* Aligned to preprocessor. */\n"
3115                            "#if 1\n"
3116                            "  /* Aligned to code. */\n"
3117                            "  int a;\n"
3118                            "  #if 1\n"
3119                            "    /* Aligned to preprocessor. */\n"
3120                            "    #define A 0\n"
3121                            "  /* Aligned to code. */\n"
3122                            "  int b;\n"
3123                            "  #endif\n"
3124                            "#endif\n"
3125                            "}";
3126     const char *ToFormat = "void f() {\n"
3127                            "/* Aligned to preprocessor. */\n"
3128                            "#if 1\n"
3129                            "/* Aligned to code. */\n"
3130                            "int a;\n"
3131                            "#if 1\n"
3132                            "/* Aligned to preprocessor. */\n"
3133                            "#define A 0\n"
3134                            "/* Aligned to code. */\n"
3135                            "int b;\n"
3136                            "#endif\n"
3137                            "#endif\n"
3138                            "}";
3139     EXPECT_EQ(Expected, format(ToFormat, Style));
3140     EXPECT_EQ(Expected, format(Expected, Style));
3141   }
3142 
3143   // Test single comment before preprocessor
3144   verifyFormat("// Comment\n"
3145                "\n"
3146                "#if 1\n"
3147                "#endif",
3148                Style);
3149 }
3150 
3151 TEST_F(FormatTest, FormatHashIfNotAtStartOfLine) {
3152   verifyFormat("{\n  { a #c; }\n}");
3153 }
3154 
3155 TEST_F(FormatTest, FormatUnbalancedStructuralElements) {
3156   EXPECT_EQ("#define A \\\n  {       \\\n    {\nint i;",
3157             format("#define A { {\nint i;", getLLVMStyleWithColumns(11)));
3158   EXPECT_EQ("#define A \\\n  }       \\\n  }\nint i;",
3159             format("#define A } }\nint i;", getLLVMStyleWithColumns(11)));
3160 }
3161 
3162 TEST_F(FormatTest, EscapedNewlines) {
3163   FormatStyle Narrow = getLLVMStyleWithColumns(11);
3164   EXPECT_EQ("#define A \\\n  int i;  \\\n  int j;",
3165             format("#define A \\\nint i;\\\n  int j;", Narrow));
3166   EXPECT_EQ("#define A\n\nint i;", format("#define A \\\n\n int i;"));
3167   EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
3168   EXPECT_EQ("/* \\  \\  \\\n */", format("\\\n/* \\  \\  \\\n */"));
3169   EXPECT_EQ("<a\n\\\\\n>", format("<a\n\\\\\n>"));
3170 
3171   FormatStyle AlignLeft = getLLVMStyle();
3172   AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
3173   EXPECT_EQ("#define MACRO(x) \\\n"
3174             "private:         \\\n"
3175             "  int x(int a);\n",
3176             format("#define MACRO(x) \\\n"
3177                    "private:         \\\n"
3178                    "  int x(int a);\n",
3179                    AlignLeft));
3180 
3181   // CRLF line endings
3182   EXPECT_EQ("#define A \\\r\n  int i;  \\\r\n  int j;",
3183             format("#define A \\\r\nint i;\\\r\n  int j;", Narrow));
3184   EXPECT_EQ("#define A\r\n\r\nint i;", format("#define A \\\r\n\r\n int i;"));
3185   EXPECT_EQ("template <class T> f();", format("\\\ntemplate <class T> f();"));
3186   EXPECT_EQ("/* \\  \\  \\\r\n */", format("\\\r\n/* \\  \\  \\\r\n */"));
3187   EXPECT_EQ("<a\r\n\\\\\r\n>", format("<a\r\n\\\\\r\n>"));
3188   EXPECT_EQ("#define MACRO(x) \\\r\n"
3189             "private:         \\\r\n"
3190             "  int x(int a);\r\n",
3191             format("#define MACRO(x) \\\r\n"
3192                    "private:         \\\r\n"
3193                    "  int x(int a);\r\n",
3194                    AlignLeft));
3195 
3196   FormatStyle DontAlign = getLLVMStyle();
3197   DontAlign.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
3198   DontAlign.MaxEmptyLinesToKeep = 3;
3199   // FIXME: can't use verifyFormat here because the newline before
3200   // "public:" is not inserted the first time it's reformatted
3201   EXPECT_EQ("#define A \\\n"
3202             "  class Foo { \\\n"
3203             "    void bar(); \\\n"
3204             "\\\n"
3205             "\\\n"
3206             "\\\n"
3207             "  public: \\\n"
3208             "    void baz(); \\\n"
3209             "  };",
3210             format("#define A \\\n"
3211                    "  class Foo { \\\n"
3212                    "    void bar(); \\\n"
3213                    "\\\n"
3214                    "\\\n"
3215                    "\\\n"
3216                    "  public: \\\n"
3217                    "    void baz(); \\\n"
3218                    "  };",
3219                    DontAlign));
3220 }
3221 
3222 TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) {
3223   verifyFormat("#define A \\\n"
3224                "  int v(  \\\n"
3225                "      a); \\\n"
3226                "  int i;",
3227                getLLVMStyleWithColumns(11));
3228 }
3229 
3230 TEST_F(FormatTest, MixingPreprocessorDirectivesAndNormalCode) {
3231   EXPECT_EQ(
3232       "#define ALooooooooooooooooooooooooooooooooooooooongMacro("
3233       "                      \\\n"
3234       "    aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
3235       "\n"
3236       "AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
3237       "    aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n",
3238       format("  #define   ALooooooooooooooooooooooooooooooooooooooongMacro("
3239              "\\\n"
3240              "aLoooooooooooooooooooooooongFuuuuuuuuuuuuuunctiooooooooo)\n"
3241              "  \n"
3242              "   AlooooooooooooooooooooooooooooooooooooooongCaaaaaaaaaal(\n"
3243              "  aLooooooooooooooooooooooonPaaaaaaaaaaaaaaaaaaaaarmmmm);\n"));
3244 }
3245 
3246 TEST_F(FormatTest, LayoutStatementsAroundPreprocessorDirectives) {
3247   EXPECT_EQ("int\n"
3248             "#define A\n"
3249             "    a;",
3250             format("int\n#define A\na;"));
3251   verifyFormat("functionCallTo(\n"
3252                "    someOtherFunction(\n"
3253                "        withSomeParameters, whichInSequence,\n"
3254                "        areLongerThanALine(andAnotherCall,\n"
3255                "#define A B\n"
3256                "                           withMoreParamters,\n"
3257                "                           whichStronglyInfluenceTheLayout),\n"
3258                "        andMoreParameters),\n"
3259                "    trailing);",
3260                getLLVMStyleWithColumns(69));
3261   verifyFormat("Foo::Foo()\n"
3262                "#ifdef BAR\n"
3263                "    : baz(0)\n"
3264                "#endif\n"
3265                "{\n"
3266                "}");
3267   verifyFormat("void f() {\n"
3268                "  if (true)\n"
3269                "#ifdef A\n"
3270                "    f(42);\n"
3271                "  x();\n"
3272                "#else\n"
3273                "    g();\n"
3274                "  x();\n"
3275                "#endif\n"
3276                "}");
3277   verifyFormat("void f(param1, param2,\n"
3278                "       param3,\n"
3279                "#ifdef A\n"
3280                "       param4(param5,\n"
3281                "#ifdef A1\n"
3282                "              param6,\n"
3283                "#ifdef A2\n"
3284                "              param7),\n"
3285                "#else\n"
3286                "              param8),\n"
3287                "       param9,\n"
3288                "#endif\n"
3289                "       param10,\n"
3290                "#endif\n"
3291                "       param11)\n"
3292                "#else\n"
3293                "       param12)\n"
3294                "#endif\n"
3295                "{\n"
3296                "  x();\n"
3297                "}",
3298                getLLVMStyleWithColumns(28));
3299   verifyFormat("#if 1\n"
3300                "int i;");
3301   verifyFormat("#if 1\n"
3302                "#endif\n"
3303                "#if 1\n"
3304                "#else\n"
3305                "#endif\n");
3306   verifyFormat("DEBUG({\n"
3307                "  return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3308                "         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;\n"
3309                "});\n"
3310                "#if a\n"
3311                "#else\n"
3312                "#endif");
3313 
3314   verifyIncompleteFormat("void f(\n"
3315                          "#if A\n"
3316                          ");\n"
3317                          "#else\n"
3318                          "#endif");
3319 }
3320 
3321 TEST_F(FormatTest, GraciouslyHandleIncorrectPreprocessorConditions) {
3322   verifyFormat("#endif\n"
3323                "#if B");
3324 }
3325 
3326 TEST_F(FormatTest, FormatsJoinedLinesOnSubsequentRuns) {
3327   FormatStyle SingleLine = getLLVMStyle();
3328   SingleLine.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_WithoutElse;
3329   verifyFormat("#if 0\n"
3330                "#elif 1\n"
3331                "#endif\n"
3332                "void foo() {\n"
3333                "  if (test) foo2();\n"
3334                "}",
3335                SingleLine);
3336 }
3337 
3338 TEST_F(FormatTest, LayoutBlockInsideParens) {
3339   verifyFormat("functionCall({ int i; });");
3340   verifyFormat("functionCall({\n"
3341                "  int i;\n"
3342                "  int j;\n"
3343                "});");
3344   verifyFormat("functionCall(\n"
3345                "    {\n"
3346                "      int i;\n"
3347                "      int j;\n"
3348                "    },\n"
3349                "    aaaa, bbbb, cccc);");
3350   verifyFormat("functionA(functionB({\n"
3351                "            int i;\n"
3352                "            int j;\n"
3353                "          }),\n"
3354                "          aaaa, bbbb, cccc);");
3355   verifyFormat("functionCall(\n"
3356                "    {\n"
3357                "      int i;\n"
3358                "      int j;\n"
3359                "    },\n"
3360                "    aaaa, bbbb, // comment\n"
3361                "    cccc);");
3362   verifyFormat("functionA(functionB({\n"
3363                "            int i;\n"
3364                "            int j;\n"
3365                "          }),\n"
3366                "          aaaa, bbbb, // comment\n"
3367                "          cccc);");
3368   verifyFormat("functionCall(aaaa, bbbb, { int i; });");
3369   verifyFormat("functionCall(aaaa, bbbb, {\n"
3370                "  int i;\n"
3371                "  int j;\n"
3372                "});");
3373   verifyFormat(
3374       "Aaa(\n" // FIXME: There shouldn't be a linebreak here.
3375       "    {\n"
3376       "      int i; // break\n"
3377       "    },\n"
3378       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
3379       "                                     ccccccccccccccccc));");
3380   verifyFormat("DEBUG({\n"
3381                "  if (a)\n"
3382                "    f();\n"
3383                "});");
3384 }
3385 
3386 TEST_F(FormatTest, LayoutBlockInsideStatement) {
3387   EXPECT_EQ("SOME_MACRO { int i; }\n"
3388             "int i;",
3389             format("  SOME_MACRO  {int i;}  int i;"));
3390 }
3391 
3392 TEST_F(FormatTest, LayoutNestedBlocks) {
3393   verifyFormat("void AddOsStrings(unsigned bitmask) {\n"
3394                "  struct s {\n"
3395                "    int i;\n"
3396                "  };\n"
3397                "  s kBitsToOs[] = {{10}};\n"
3398                "  for (int i = 0; i < 10; ++i)\n"
3399                "    return;\n"
3400                "}");
3401   verifyFormat("call(parameter, {\n"
3402                "  something();\n"
3403                "  // Comment using all columns.\n"
3404                "  somethingelse();\n"
3405                "});",
3406                getLLVMStyleWithColumns(40));
3407   verifyFormat("DEBUG( //\n"
3408                "    { f(); }, a);");
3409   verifyFormat("DEBUG( //\n"
3410                "    {\n"
3411                "      f(); //\n"
3412                "    },\n"
3413                "    a);");
3414 
3415   EXPECT_EQ("call(parameter, {\n"
3416             "  something();\n"
3417             "  // Comment too\n"
3418             "  // looooooooooong.\n"
3419             "  somethingElse();\n"
3420             "});",
3421             format("call(parameter, {\n"
3422                    "  something();\n"
3423                    "  // Comment too looooooooooong.\n"
3424                    "  somethingElse();\n"
3425                    "});",
3426                    getLLVMStyleWithColumns(29)));
3427   EXPECT_EQ("DEBUG({ int i; });", format("DEBUG({ int   i; });"));
3428   EXPECT_EQ("DEBUG({ // comment\n"
3429             "  int i;\n"
3430             "});",
3431             format("DEBUG({ // comment\n"
3432                    "int  i;\n"
3433                    "});"));
3434   EXPECT_EQ("DEBUG({\n"
3435             "  int i;\n"
3436             "\n"
3437             "  // comment\n"
3438             "  int j;\n"
3439             "});",
3440             format("DEBUG({\n"
3441                    "  int  i;\n"
3442                    "\n"
3443                    "  // comment\n"
3444                    "  int  j;\n"
3445                    "});"));
3446 
3447   verifyFormat("DEBUG({\n"
3448                "  if (a)\n"
3449                "    return;\n"
3450                "});");
3451   verifyGoogleFormat("DEBUG({\n"
3452                      "  if (a) return;\n"
3453                      "});");
3454   FormatStyle Style = getGoogleStyle();
3455   Style.ColumnLimit = 45;
3456   verifyFormat("Debug(\n"
3457                "    aaaaa,\n"
3458                "    {\n"
3459                "      if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n"
3460                "    },\n"
3461                "    a);",
3462                Style);
3463 
3464   verifyFormat("SomeFunction({MACRO({ return output; }), b});");
3465 
3466   verifyNoCrash("^{v^{a}}");
3467 }
3468 
3469 TEST_F(FormatTest, FormatNestedBlocksInMacros) {
3470   EXPECT_EQ("#define MACRO()                     \\\n"
3471             "  Debug(aaa, /* force line break */ \\\n"
3472             "        {                           \\\n"
3473             "          int i;                    \\\n"
3474             "          int j;                    \\\n"
3475             "        })",
3476             format("#define   MACRO()   Debug(aaa,  /* force line break */ \\\n"
3477                    "          {  int   i;  int  j;   })",
3478                    getGoogleStyle()));
3479 
3480   EXPECT_EQ("#define A                                       \\\n"
3481             "  [] {                                          \\\n"
3482             "    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx(        \\\n"
3483             "        xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); \\\n"
3484             "  }",
3485             format("#define A [] { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx( \\\n"
3486                    "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx); }",
3487                    getGoogleStyle()));
3488 }
3489 
3490 TEST_F(FormatTest, PutEmptyBlocksIntoOneLine) {
3491   EXPECT_EQ("{}", format("{}"));
3492   verifyFormat("enum E {};");
3493   verifyFormat("enum E {}");
3494 }
3495 
3496 TEST_F(FormatTest, FormatBeginBlockEndMacros) {
3497   FormatStyle Style = getLLVMStyle();
3498   Style.MacroBlockBegin = "^[A-Z_]+_BEGIN$";
3499   Style.MacroBlockEnd = "^[A-Z_]+_END$";
3500   verifyFormat("FOO_BEGIN\n"
3501                "  FOO_ENTRY\n"
3502                "FOO_END", Style);
3503   verifyFormat("FOO_BEGIN\n"
3504                "  NESTED_FOO_BEGIN\n"
3505                "    NESTED_FOO_ENTRY\n"
3506                "  NESTED_FOO_END\n"
3507                "FOO_END", Style);
3508   verifyFormat("FOO_BEGIN(Foo, Bar)\n"
3509                "  int x;\n"
3510                "  x = 1;\n"
3511                "FOO_END(Baz)", Style);
3512 }
3513 
3514 //===----------------------------------------------------------------------===//
3515 // Line break tests.
3516 //===----------------------------------------------------------------------===//
3517 
3518 TEST_F(FormatTest, PreventConfusingIndents) {
3519   verifyFormat(
3520       "void f() {\n"
3521       "  SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n"
3522       "                         parameter, parameter, parameter)),\n"
3523       "                     SecondLongCall(parameter));\n"
3524       "}");
3525   verifyFormat(
3526       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3527       "    aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3528       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3529       "    aaaaaaaaaaaaaaaaaaaaaaaa);");
3530   verifyFormat(
3531       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3532       "    [aaaaaaaaaaaaaaaaaaaaaaaa\n"
3533       "         [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
3534       "         [aaaaaaaaaaaaaaaaaaaaaaaa]];");
3535   verifyFormat(
3536       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
3537       "    aaaaaaaaaaaaaaaaaaaaaaaa<\n"
3538       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>,\n"
3539       "    aaaaaaaaaaaaaaaaaaaaaaaa>;");
3540   verifyFormat("int a = bbbb && ccc &&\n"
3541                "        fffff(\n"
3542                "#define A Just forcing a new line\n"
3543                "            ddd);");
3544 }
3545 
3546 TEST_F(FormatTest, LineBreakingInBinaryExpressions) {
3547   verifyFormat(
3548       "bool aaaaaaa =\n"
3549       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() ||\n"
3550       "    bbbbbbbb();");
3551   verifyFormat(
3552       "bool aaaaaaa =\n"
3553       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaa).aaaaaaaaaaaaaaaaaaa() or\n"
3554       "    bbbbbbbb();");
3555 
3556   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3557                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb &&\n"
3558                "    ccccccccc == ddddddddddd;");
3559   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaa =\n"
3560                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa != bbbbbbbbbbbbbbbbbb and\n"
3561                "    ccccccccc == ddddddddddd;");
3562   verifyFormat(
3563       "bool aaaaaaaaaaaaaaaaaaaaa =\n"
3564       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa not_eq bbbbbbbbbbbbbbbbbb and\n"
3565       "    ccccccccc == ddddddddddd;");
3566 
3567   verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3568                "                 aaaaaa) &&\n"
3569                "         bbbbbb && cccccc;");
3570   verifyFormat("aaaaaa = aaaaaaa(aaaaaaa, // break\n"
3571                "                 aaaaaa) >>\n"
3572                "         bbbbbb;");
3573   verifyFormat("aa = Whitespaces.addUntouchableComment(\n"
3574                "    SourceMgr.getSpellingColumnNumber(\n"
3575                "        TheLine.Last->FormatTok.Tok.getLocation()) -\n"
3576                "    1);");
3577 
3578   verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3579                "     bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n"
3580                "    cccccc) {\n}");
3581   verifyFormat("if constexpr ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3582                "               bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaa\n"
3583                "              cccccc) {\n}");
3584   verifyFormat("b = a &&\n"
3585                "    // Comment\n"
3586                "    b.c && d;");
3587 
3588   // If the LHS of a comparison is not a binary expression itself, the
3589   // additional linebreak confuses many people.
3590   verifyFormat(
3591       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3592       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) > 5) {\n"
3593       "}");
3594   verifyFormat(
3595       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3596       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3597       "}");
3598   verifyFormat(
3599       "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n"
3600       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3601       "}");
3602   verifyFormat(
3603       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3604       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) <=> 5) {\n"
3605       "}");
3606   // Even explicit parentheses stress the precedence enough to make the
3607   // additional break unnecessary.
3608   verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3609                "     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
3610                "}");
3611   // This cases is borderline, but with the indentation it is still readable.
3612   verifyFormat(
3613       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3614       "        aaaaaaaaaaaaaaa) > aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3615       "                               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
3616       "}",
3617       getLLVMStyleWithColumns(75));
3618 
3619   // If the LHS is a binary expression, we should still use the additional break
3620   // as otherwise the formatting hides the operator precedence.
3621   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3622                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3623                "    5) {\n"
3624                "}");
3625   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3626                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa <=>\n"
3627                "    5) {\n"
3628                "}");
3629 
3630   FormatStyle OnePerLine = getLLVMStyle();
3631   OnePerLine.BinPackParameters = false;
3632   verifyFormat(
3633       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3634       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
3635       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}",
3636       OnePerLine);
3637 
3638   verifyFormat("int i = someFunction(aaaaaaa, 0)\n"
3639                "                .aaa(aaaaaaaaaaaaa) *\n"
3640                "            aaaaaaa +\n"
3641                "        aaaaaaa;",
3642                getLLVMStyleWithColumns(40));
3643 }
3644 
3645 TEST_F(FormatTest, ExpressionIndentation) {
3646   verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3647                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3648                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3649                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3650                "                         bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
3651                "                     bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb &&\n"
3652                "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3653                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >\n"
3654                "                 ccccccccccccccccccccccccccccccccccccccccc;");
3655   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3656                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3657                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3658                "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3659   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3660                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3661                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3662                "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3663   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ==\n"
3664                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n"
3665                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3666                "        bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}");
3667   verifyFormat("if () {\n"
3668                "} else if (aaaaa && bbbbb > // break\n"
3669                "                        ccccc) {\n"
3670                "}");
3671   verifyFormat("if () {\n"
3672                "} else if (aaaaa &&\n"
3673                "           bbbbb > // break\n"
3674                "               ccccc &&\n"
3675                "           ddddd) {\n"
3676                "}");
3677 
3678   // Presence of a trailing comment used to change indentation of b.
3679   verifyFormat("return aaaaaaaaaaaaaaaaaaa +\n"
3680                "       b;\n"
3681                "return aaaaaaaaaaaaaaaaaaa +\n"
3682                "       b; //",
3683                getLLVMStyleWithColumns(30));
3684 }
3685 
3686 TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) {
3687   // Not sure what the best system is here. Like this, the LHS can be found
3688   // immediately above an operator (everything with the same or a higher
3689   // indent). The RHS is aligned right of the operator and so compasses
3690   // everything until something with the same indent as the operator is found.
3691   // FIXME: Is this a good system?
3692   FormatStyle Style = getLLVMStyle();
3693   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
3694   verifyFormat(
3695       "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3696       "                     + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3697       "                     + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3698       "                 == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3699       "                            * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3700       "                        + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3701       "             && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3702       "                        * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3703       "                    > ccccccccccccccccccccccccccccccccccccccccc;",
3704       Style);
3705   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3706                "            * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3707                "        + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3708                "    == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3709                Style);
3710   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3711                "        + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3712                "              * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3713                "    == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3714                Style);
3715   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3716                "    == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3717                "               * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3718                "           + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}",
3719                Style);
3720   verifyFormat("if () {\n"
3721                "} else if (aaaaa\n"
3722                "           && bbbbb // break\n"
3723                "                  > ccccc) {\n"
3724                "}",
3725                Style);
3726   verifyFormat("return (a)\n"
3727                "       // comment\n"
3728                "       + b;",
3729                Style);
3730   verifyFormat(
3731       "int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3732       "                 * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3733       "             + cc;",
3734       Style);
3735 
3736   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3737                "    = aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
3738                Style);
3739 
3740   // Forced by comments.
3741   verifyFormat(
3742       "unsigned ContentSize =\n"
3743       "    sizeof(int16_t)   // DWARF ARange version number\n"
3744       "    + sizeof(int32_t) // Offset of CU in the .debug_info section\n"
3745       "    + sizeof(int8_t)  // Pointer Size (in bytes)\n"
3746       "    + sizeof(int8_t); // Segment Size (in bytes)");
3747 
3748   verifyFormat("return boost::fusion::at_c<0>(iiii).second\n"
3749                "       == boost::fusion::at_c<1>(iiii).second;",
3750                Style);
3751 
3752   Style.ColumnLimit = 60;
3753   verifyFormat("zzzzzzzzzz\n"
3754                "    = bbbbbbbbbbbbbbbbb\n"
3755                "      >> aaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa);",
3756                Style);
3757 
3758   Style.ColumnLimit = 80;
3759   Style.IndentWidth = 4;
3760   Style.TabWidth = 4;
3761   Style.UseTab = FormatStyle::UT_Always;
3762   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
3763   Style.AlignOperands = false;
3764   EXPECT_EQ("return someVeryVeryLongConditionThatBarelyFitsOnALine\n"
3765             "\t&& (someOtherLongishConditionPart1\n"
3766             "\t\t|| someOtherEvenLongerNestedConditionPart2);",
3767             format("return someVeryVeryLongConditionThatBarelyFitsOnALine && (someOtherLongishConditionPart1 || someOtherEvenLongerNestedConditionPart2);",
3768                    Style));
3769 }
3770 
3771 TEST_F(FormatTest, EnforcedOperatorWraps) {
3772   // Here we'd like to wrap after the || operators, but a comment is forcing an
3773   // earlier wrap.
3774   verifyFormat("bool x = aaaaa //\n"
3775                "         || bbbbb\n"
3776                "         //\n"
3777                "         || cccc;");
3778 }
3779 
3780 TEST_F(FormatTest, NoOperandAlignment) {
3781   FormatStyle Style = getLLVMStyle();
3782   Style.AlignOperands = false;
3783   verifyFormat("aaaaaaaaaaaaaa(aaaaaaaaaaaa,\n"
3784                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
3785                "                   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
3786                Style);
3787   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
3788   verifyFormat("bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3789                "            + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3790                "            + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3791                "        == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3792                "                * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3793                "            + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3794                "    && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3795                "            * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3796                "        > ccccccccccccccccccccccccccccccccccccccccc;",
3797                Style);
3798 
3799   verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3800                "        * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3801                "    + cc;",
3802                Style);
3803   verifyFormat("int a = aa\n"
3804                "    + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
3805                "        * cccccccccccccccccccccccccccccccccccc;\n",
3806                Style);
3807 
3808   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
3809   verifyFormat("return (a > b\n"
3810                "    // comment1\n"
3811                "    // comment2\n"
3812                "    || c);",
3813                Style);
3814 }
3815 
3816 TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) {
3817   FormatStyle Style = getLLVMStyle();
3818   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
3819   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
3820                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
3821                "    + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
3822                Style);
3823 }
3824 
3825 TEST_F(FormatTest, AllowBinPackingInsideArguments) {
3826   FormatStyle Style = getLLVMStyle();
3827   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
3828   Style.BinPackArguments = false;
3829   Style.ColumnLimit = 40;
3830   verifyFormat("void test() {\n"
3831                "  someFunction(\n"
3832                "      this + argument + is + quite\n"
3833                "      + long + so + it + gets + wrapped\n"
3834                "      + but + remains + bin - packed);\n"
3835                "}",
3836                Style);
3837   verifyFormat("void test() {\n"
3838                "  someFunction(arg1,\n"
3839                "               this + argument + is\n"
3840                "                   + quite + long + so\n"
3841                "                   + it + gets + wrapped\n"
3842                "                   + but + remains + bin\n"
3843                "                   - packed,\n"
3844                "               arg3);\n"
3845                "}",
3846                Style);
3847   verifyFormat("void test() {\n"
3848                "  someFunction(\n"
3849                "      arg1,\n"
3850                "      this + argument + has\n"
3851                "          + anotherFunc(nested,\n"
3852                "                        calls + whose\n"
3853                "                            + arguments\n"
3854                "                            + are + also\n"
3855                "                            + wrapped,\n"
3856                "                        in + addition)\n"
3857                "          + to + being + bin - packed,\n"
3858                "      arg3);\n"
3859                "}",
3860                Style);
3861 
3862   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
3863   verifyFormat("void test() {\n"
3864                "  someFunction(\n"
3865                "      arg1,\n"
3866                "      this + argument + has +\n"
3867                "          anotherFunc(nested,\n"
3868                "                      calls + whose +\n"
3869                "                          arguments +\n"
3870                "                          are + also +\n"
3871                "                          wrapped,\n"
3872                "                      in + addition) +\n"
3873                "          to + being + bin - packed,\n"
3874                "      arg3);\n"
3875                "}",
3876                Style);
3877 }
3878 
3879 TEST_F(FormatTest, ConstructorInitializers) {
3880   verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
3881   verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}",
3882                getLLVMStyleWithColumns(45));
3883   verifyFormat("Constructor()\n"
3884                "    : Inttializer(FitsOnTheLine) {}",
3885                getLLVMStyleWithColumns(44));
3886   verifyFormat("Constructor()\n"
3887                "    : Inttializer(FitsOnTheLine) {}",
3888                getLLVMStyleWithColumns(43));
3889 
3890   verifyFormat("template <typename T>\n"
3891                "Constructor() : Initializer(FitsOnTheLine) {}",
3892                getLLVMStyleWithColumns(45));
3893 
3894   verifyFormat(
3895       "SomeClass::Constructor()\n"
3896       "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
3897 
3898   verifyFormat(
3899       "SomeClass::Constructor()\n"
3900       "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3901       "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}");
3902   verifyFormat(
3903       "SomeClass::Constructor()\n"
3904       "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3905       "      aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}");
3906   verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3907                "            aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
3908                "    : aaaaaaaaaa(aaaaaa) {}");
3909 
3910   verifyFormat("Constructor()\n"
3911                "    : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3912                "      aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
3913                "                               aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
3914                "      aaaaaaaaaaaaaaaaaaaaaaa() {}");
3915 
3916   verifyFormat("Constructor()\n"
3917                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3918                "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
3919 
3920   verifyFormat("Constructor(int Parameter = 0)\n"
3921                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
3922                "      aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}");
3923   verifyFormat("Constructor()\n"
3924                "    : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
3925                "}",
3926                getLLVMStyleWithColumns(60));
3927   verifyFormat("Constructor()\n"
3928                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
3929                "          aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}");
3930 
3931   // Here a line could be saved by splitting the second initializer onto two
3932   // lines, but that is not desirable.
3933   verifyFormat("Constructor()\n"
3934                "    : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
3935                "      aaaaaaaaaaa(aaaaaaaaaaa),\n"
3936                "      aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
3937 
3938   FormatStyle OnePerLine = getLLVMStyle();
3939   OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
3940   OnePerLine.AllowAllParametersOfDeclarationOnNextLine = false;
3941   verifyFormat("SomeClass::Constructor()\n"
3942                "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3943                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3944                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3945                OnePerLine);
3946   verifyFormat("SomeClass::Constructor()\n"
3947                "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
3948                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
3949                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
3950                OnePerLine);
3951   verifyFormat("MyClass::MyClass(int var)\n"
3952                "    : some_var_(var),            // 4 space indent\n"
3953                "      some_other_var_(var + 1) { // lined up\n"
3954                "}",
3955                OnePerLine);
3956   verifyFormat("Constructor()\n"
3957                "    : aaaaa(aaaaaa),\n"
3958                "      aaaaa(aaaaaa),\n"
3959                "      aaaaa(aaaaaa),\n"
3960                "      aaaaa(aaaaaa),\n"
3961                "      aaaaa(aaaaaa) {}",
3962                OnePerLine);
3963   verifyFormat("Constructor()\n"
3964                "    : aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
3965                "            aaaaaaaaaaaaaaaaaaaaaa) {}",
3966                OnePerLine);
3967   OnePerLine.BinPackParameters = false;
3968   verifyFormat(
3969       "Constructor()\n"
3970       "    : aaaaaaaaaaaaaaaaaaaaaaaa(\n"
3971       "          aaaaaaaaaaa().aaa(),\n"
3972       "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
3973       OnePerLine);
3974   OnePerLine.ColumnLimit = 60;
3975   verifyFormat("Constructor()\n"
3976                "    : aaaaaaaaaaaaaaaaaaaa(a),\n"
3977                "      bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
3978                OnePerLine);
3979 
3980   EXPECT_EQ("Constructor()\n"
3981             "    : // Comment forcing unwanted break.\n"
3982             "      aaaa(aaaa) {}",
3983             format("Constructor() :\n"
3984                    "    // Comment forcing unwanted break.\n"
3985                    "    aaaa(aaaa) {}"));
3986 }
3987 
3988 TEST_F(FormatTest, AllowAllConstructorInitializersOnNextLine) {
3989   FormatStyle Style = getLLVMStyle();
3990   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
3991   Style.ColumnLimit = 60;
3992   Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
3993   Style.AllowAllConstructorInitializersOnNextLine = true;
3994   Style.BinPackParameters = false;
3995 
3996   for (int i = 0; i < 4; ++i) {
3997     // Test all combinations of parameters that should not have an effect.
3998     Style.AllowAllParametersOfDeclarationOnNextLine = i & 1;
3999     Style.AllowAllArgumentsOnNextLine = i & 2;
4000 
4001     Style.AllowAllConstructorInitializersOnNextLine = true;
4002     Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
4003     verifyFormat("Constructor()\n"
4004                  "    : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4005                  Style);
4006     verifyFormat("Constructor() : a(a), b(b) {}", Style);
4007 
4008     Style.AllowAllConstructorInitializersOnNextLine = false;
4009     verifyFormat("Constructor()\n"
4010                  "    : aaaaaaaaaaaaaaaaaaaa(a)\n"
4011                  "    , bbbbbbbbbbbbbbbbbbbbb(b) {}",
4012                  Style);
4013     verifyFormat("Constructor() : a(a), b(b) {}", Style);
4014 
4015     Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
4016     Style.AllowAllConstructorInitializersOnNextLine = true;
4017     verifyFormat("Constructor()\n"
4018                  "    : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4019                  Style);
4020 
4021     Style.AllowAllConstructorInitializersOnNextLine = false;
4022     verifyFormat("Constructor()\n"
4023                  "    : aaaaaaaaaaaaaaaaaaaa(a),\n"
4024                  "      bbbbbbbbbbbbbbbbbbbbb(b) {}",
4025                  Style);
4026 
4027     Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
4028     Style.AllowAllConstructorInitializersOnNextLine = true;
4029     verifyFormat("Constructor() :\n"
4030                  "    aaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4031                  Style);
4032 
4033     Style.AllowAllConstructorInitializersOnNextLine = false;
4034     verifyFormat("Constructor() :\n"
4035                  "    aaaaaaaaaaaaaaaaaa(a),\n"
4036                  "    bbbbbbbbbbbbbbbbbbbbb(b) {}",
4037                  Style);
4038   }
4039 
4040   // Test interactions between AllowAllParametersOfDeclarationOnNextLine and
4041   // AllowAllConstructorInitializersOnNextLine in all
4042   // BreakConstructorInitializers modes
4043   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
4044   Style.AllowAllParametersOfDeclarationOnNextLine = true;
4045   Style.AllowAllConstructorInitializersOnNextLine = false;
4046   verifyFormat("SomeClassWithALongName::Constructor(\n"
4047                "    int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb)\n"
4048                "    : aaaaaaaaaaaaaaaaaaaa(a)\n"
4049                "    , bbbbbbbbbbbbbbbbbbbbb(b) {}",
4050                Style);
4051 
4052   Style.AllowAllConstructorInitializersOnNextLine = true;
4053   verifyFormat("SomeClassWithALongName::Constructor(\n"
4054                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4055                "    int bbbbbbbbbbbbb,\n"
4056                "    int cccccccccccccccc)\n"
4057                "    : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4058                Style);
4059 
4060   Style.AllowAllParametersOfDeclarationOnNextLine = false;
4061   Style.AllowAllConstructorInitializersOnNextLine = false;
4062   verifyFormat("SomeClassWithALongName::Constructor(\n"
4063                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4064                "    int bbbbbbbbbbbbb)\n"
4065                "    : aaaaaaaaaaaaaaaaaaaa(a)\n"
4066                "    , bbbbbbbbbbbbbbbbbbbbb(b) {}",
4067                Style);
4068 
4069   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
4070 
4071   Style.AllowAllParametersOfDeclarationOnNextLine = true;
4072   verifyFormat("SomeClassWithALongName::Constructor(\n"
4073                "    int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb)\n"
4074                "    : aaaaaaaaaaaaaaaaaaaa(a),\n"
4075                "      bbbbbbbbbbbbbbbbbbbbb(b) {}",
4076                Style);
4077 
4078   Style.AllowAllConstructorInitializersOnNextLine = true;
4079   verifyFormat("SomeClassWithALongName::Constructor(\n"
4080                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4081                "    int bbbbbbbbbbbbb,\n"
4082                "    int cccccccccccccccc)\n"
4083                "    : aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4084                Style);
4085 
4086   Style.AllowAllParametersOfDeclarationOnNextLine = false;
4087   Style.AllowAllConstructorInitializersOnNextLine = false;
4088   verifyFormat("SomeClassWithALongName::Constructor(\n"
4089                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4090                "    int bbbbbbbbbbbbb)\n"
4091                "    : aaaaaaaaaaaaaaaaaaaa(a),\n"
4092                "      bbbbbbbbbbbbbbbbbbbbb(b) {}",
4093                Style);
4094 
4095   Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
4096   Style.AllowAllParametersOfDeclarationOnNextLine = true;
4097   verifyFormat("SomeClassWithALongName::Constructor(\n"
4098                "    int aaaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbbb) :\n"
4099                "    aaaaaaaaaaaaaaaaaaaa(a),\n"
4100                "    bbbbbbbbbbbbbbbbbbbbb(b) {}",
4101                Style);
4102 
4103   Style.AllowAllConstructorInitializersOnNextLine = true;
4104   verifyFormat("SomeClassWithALongName::Constructor(\n"
4105                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4106                "    int bbbbbbbbbbbbb,\n"
4107                "    int cccccccccccccccc) :\n"
4108                "    aaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbb(b) {}",
4109                Style);
4110 
4111   Style.AllowAllParametersOfDeclarationOnNextLine = false;
4112   Style.AllowAllConstructorInitializersOnNextLine = false;
4113   verifyFormat("SomeClassWithALongName::Constructor(\n"
4114                "    int aaaaaaaaaaaaaaaaaaaaaaaa,\n"
4115                "    int bbbbbbbbbbbbb) :\n"
4116                "    aaaaaaaaaaaaaaaaaaaa(a),\n"
4117                "    bbbbbbbbbbbbbbbbbbbbb(b) {}",
4118                Style);
4119 }
4120 
4121 TEST_F(FormatTest, AllowAllArgumentsOnNextLine) {
4122   FormatStyle Style = getLLVMStyle();
4123   Style.ColumnLimit = 60;
4124   Style.BinPackArguments = false;
4125   for (int i = 0; i < 4; ++i) {
4126     // Test all combinations of parameters that should not have an effect.
4127     Style.AllowAllParametersOfDeclarationOnNextLine = i & 1;
4128     Style.AllowAllConstructorInitializersOnNextLine = i & 2;
4129 
4130     Style.AllowAllArgumentsOnNextLine = true;
4131     verifyFormat("void foo() {\n"
4132                  "  FunctionCallWithReallyLongName(\n"
4133                  "      aaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbb);\n"
4134                  "}",
4135                  Style);
4136     Style.AllowAllArgumentsOnNextLine = false;
4137     verifyFormat("void foo() {\n"
4138                  "  FunctionCallWithReallyLongName(\n"
4139                  "      aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4140                  "      bbbbbbbbbbbb);\n"
4141                  "}",
4142                  Style);
4143 
4144     Style.AllowAllArgumentsOnNextLine = true;
4145     verifyFormat("void foo() {\n"
4146                  "  auto VariableWithReallyLongName = {\n"
4147                  "      aaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbb};\n"
4148                  "}",
4149                  Style);
4150     Style.AllowAllArgumentsOnNextLine = false;
4151     verifyFormat("void foo() {\n"
4152                  "  auto VariableWithReallyLongName = {\n"
4153                  "      aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4154                  "      bbbbbbbbbbbb};\n"
4155                  "}",
4156                  Style);
4157   }
4158 
4159   // This parameter should not affect declarations.
4160   Style.BinPackParameters = false;
4161   Style.AllowAllArgumentsOnNextLine = false;
4162   Style.AllowAllParametersOfDeclarationOnNextLine = true;
4163   verifyFormat("void FunctionCallWithReallyLongName(\n"
4164                "    int aaaaaaaaaaaaaaaaaaaaaaa, int bbbbbbbbbbbb);",
4165                Style);
4166   Style.AllowAllParametersOfDeclarationOnNextLine = false;
4167   verifyFormat("void FunctionCallWithReallyLongName(\n"
4168                "    int aaaaaaaaaaaaaaaaaaaaaaa,\n"
4169                "    int bbbbbbbbbbbb);",
4170                Style);
4171 }
4172 
4173 TEST_F(FormatTest, BreakConstructorInitializersAfterColon) {
4174   FormatStyle Style = getLLVMStyle();
4175   Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
4176 
4177   verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}");
4178   verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}",
4179                getStyleWithColumns(Style, 45));
4180   verifyFormat("Constructor() :\n"
4181                "    Initializer(FitsOnTheLine) {}",
4182                getStyleWithColumns(Style, 44));
4183   verifyFormat("Constructor() :\n"
4184                "    Initializer(FitsOnTheLine) {}",
4185                getStyleWithColumns(Style, 43));
4186 
4187   verifyFormat("template <typename T>\n"
4188                "Constructor() : Initializer(FitsOnTheLine) {}",
4189                getStyleWithColumns(Style, 50));
4190   Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
4191   verifyFormat(
4192       "SomeClass::Constructor() :\n"
4193       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
4194       Style);
4195 
4196   Style.ConstructorInitializerAllOnOneLineOrOnePerLine = false;
4197   verifyFormat(
4198       "SomeClass::Constructor() :\n"
4199       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
4200       Style);
4201 
4202   verifyFormat(
4203       "SomeClass::Constructor() :\n"
4204       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4205       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
4206       Style);
4207   verifyFormat(
4208       "SomeClass::Constructor() :\n"
4209       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4210       "    aaaaaaaaaaaaaaa(aaaaaaaaaaaa) {}",
4211 	  Style);
4212   verifyFormat("Constructor(aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4213                "            aaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
4214                "    aaaaaaaaaa(aaaaaa) {}",
4215 			   Style);
4216 
4217   verifyFormat("Constructor() :\n"
4218                "    aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4219                "    aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4220                "                             aaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4221                "    aaaaaaaaaaaaaaaaaaaaaaa() {}",
4222 			   Style);
4223 
4224   verifyFormat("Constructor() :\n"
4225                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4226                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4227 			   Style);
4228 
4229   verifyFormat("Constructor(int Parameter = 0) :\n"
4230                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa),\n"
4231                "    aaaaaaaaaaaa(aaaaaaaaaaaaaaaaa) {}",
4232 			   Style);
4233   verifyFormat("Constructor() :\n"
4234                "    aaaaaaaaaaaaaaaaaaaaaa(a), bbbbbbbbbbbbbbbbbbbbbbbb(b) {\n"
4235                "}",
4236                getStyleWithColumns(Style, 60));
4237   verifyFormat("Constructor() :\n"
4238                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4239                "        aaaaaaaaaaaaaaaaaaaaaaaaa(aaaa, aaaa)) {}",
4240 			   Style);
4241 
4242   // Here a line could be saved by splitting the second initializer onto two
4243   // lines, but that is not desirable.
4244   verifyFormat("Constructor() :\n"
4245                "    aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaa),\n"
4246                "    aaaaaaaaaaa(aaaaaaaaaaa),\n"
4247                "    aaaaaaaaaaaaaaaaaaaaat(aaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4248 			   Style);
4249 
4250   FormatStyle OnePerLine = Style;
4251   OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
4252   OnePerLine.AllowAllConstructorInitializersOnNextLine = false;
4253   verifyFormat("SomeClass::Constructor() :\n"
4254                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4255                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4256                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
4257                OnePerLine);
4258   verifyFormat("SomeClass::Constructor() :\n"
4259                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa), // Some comment\n"
4260                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
4261                "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
4262                OnePerLine);
4263   verifyFormat("MyClass::MyClass(int var) :\n"
4264                "    some_var_(var),            // 4 space indent\n"
4265                "    some_other_var_(var + 1) { // lined up\n"
4266                "}",
4267                OnePerLine);
4268   verifyFormat("Constructor() :\n"
4269                "    aaaaa(aaaaaa),\n"
4270                "    aaaaa(aaaaaa),\n"
4271                "    aaaaa(aaaaaa),\n"
4272                "    aaaaa(aaaaaa),\n"
4273                "    aaaaa(aaaaaa) {}",
4274                OnePerLine);
4275   verifyFormat("Constructor() :\n"
4276                "    aaaaa(aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
4277                "          aaaaaaaaaaaaaaaaaaaaaa) {}",
4278                OnePerLine);
4279   OnePerLine.BinPackParameters = false;
4280   verifyFormat(
4281       "Constructor() :\n"
4282       "    aaaaaaaaaaaaaaaaaaaaaaaa(\n"
4283       "        aaaaaaaaaaa().aaa(),\n"
4284       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4285       OnePerLine);
4286   OnePerLine.ColumnLimit = 60;
4287   verifyFormat("Constructor() :\n"
4288                "    aaaaaaaaaaaaaaaaaaaa(a),\n"
4289                "    bbbbbbbbbbbbbbbbbbbbbbbb(b) {}",
4290                OnePerLine);
4291 
4292   EXPECT_EQ("Constructor() :\n"
4293             "    // Comment forcing unwanted break.\n"
4294             "    aaaa(aaaa) {}",
4295             format("Constructor() :\n"
4296                    "    // Comment forcing unwanted break.\n"
4297                    "    aaaa(aaaa) {}",
4298 				   Style));
4299 
4300   Style.ColumnLimit = 0;
4301   verifyFormat("SomeClass::Constructor() :\n"
4302                "    a(a) {}",
4303                Style);
4304   verifyFormat("SomeClass::Constructor() noexcept :\n"
4305                "    a(a) {}",
4306                Style);
4307   verifyFormat("SomeClass::Constructor() :\n"
4308 			   "    a(a), b(b), c(c) {}",
4309                Style);
4310   verifyFormat("SomeClass::Constructor() :\n"
4311                "    a(a) {\n"
4312                "  foo();\n"
4313                "  bar();\n"
4314                "}",
4315                Style);
4316 
4317   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
4318   verifyFormat("SomeClass::Constructor() :\n"
4319 			   "    a(a), b(b), c(c) {\n"
4320 			   "}",
4321                Style);
4322   verifyFormat("SomeClass::Constructor() :\n"
4323                "    a(a) {\n"
4324 			   "}",
4325                Style);
4326 
4327   Style.ColumnLimit = 80;
4328   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
4329   Style.ConstructorInitializerIndentWidth = 2;
4330   verifyFormat("SomeClass::Constructor() : a(a), b(b), c(c) {}",
4331                Style);
4332   verifyFormat("SomeClass::Constructor() :\n"
4333                "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4334                "  bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {}",
4335                Style);
4336 
4337   // `ConstructorInitializerIndentWidth` actually applies to InheritanceList as well
4338   Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
4339   verifyFormat("class SomeClass\n"
4340                "  : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4341                "    public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};",
4342                Style);
4343   Style.BreakInheritanceList = FormatStyle::BILS_BeforeComma;
4344   verifyFormat("class SomeClass\n"
4345                "  : public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4346                "  , public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};",
4347                Style);
4348   Style.BreakInheritanceList = FormatStyle::BILS_AfterColon;
4349   verifyFormat("class SomeClass :\n"
4350                "  public aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4351                "  public bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {};",
4352                Style);
4353 }
4354 
4355 #ifndef EXPENSIVE_CHECKS
4356 // Expensive checks enables libstdc++ checking which includes validating the
4357 // state of ranges used in std::priority_queue - this blows out the
4358 // runtime/scalability of the function and makes this test unacceptably slow.
4359 TEST_F(FormatTest, MemoizationTests) {
4360   // This breaks if the memoization lookup does not take \c Indent and
4361   // \c LastSpace into account.
4362   verifyFormat(
4363       "extern CFRunLoopTimerRef\n"
4364       "CFRunLoopTimerCreate(CFAllocatorRef allocato, CFAbsoluteTime fireDate,\n"
4365       "                     CFTimeInterval interval, CFOptionFlags flags,\n"
4366       "                     CFIndex order, CFRunLoopTimerCallBack callout,\n"
4367       "                     CFRunLoopTimerContext *context) {}");
4368 
4369   // Deep nesting somewhat works around our memoization.
4370   verifyFormat(
4371       "aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4372       "    aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4373       "        aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4374       "            aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(aaaaa(\n"
4375       "                aaaaa())))))))))))))))))))))))))))))))))))))));",
4376       getLLVMStyleWithColumns(65));
4377   verifyFormat(
4378       "aaaaa(\n"
4379       "    aaaaa,\n"
4380       "    aaaaa(\n"
4381       "        aaaaa,\n"
4382       "        aaaaa(\n"
4383       "            aaaaa,\n"
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))))))))))));",
4403       getLLVMStyleWithColumns(65));
4404   verifyFormat(
4405       "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"
4406       "                                  a),\n"
4407       "                                a),\n"
4408       "                              a),\n"
4409       "                            a),\n"
4410       "                          a),\n"
4411       "                        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)",
4423       getLLVMStyleWithColumns(65));
4424 
4425   // This test takes VERY long when memoization is broken.
4426   FormatStyle OnePerLine = getLLVMStyle();
4427   OnePerLine.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
4428   OnePerLine.BinPackParameters = false;
4429   std::string input = "Constructor()\n"
4430                       "    : aaaa(a,\n";
4431   for (unsigned i = 0, e = 80; i != e; ++i) {
4432     input += "           a,\n";
4433   }
4434   input += "           a) {}";
4435   verifyFormat(input, OnePerLine);
4436 }
4437 #endif
4438 
4439 TEST_F(FormatTest, BreaksAsHighAsPossible) {
4440   verifyFormat(
4441       "void f() {\n"
4442       "  if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n"
4443       "      (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n"
4444       "    f();\n"
4445       "}");
4446   verifyFormat("if (Intervals[i].getRange().getFirst() <\n"
4447                "    Intervals[i - 1].getRange().getLast()) {\n}");
4448 }
4449 
4450 TEST_F(FormatTest, BreaksFunctionDeclarations) {
4451   // Principially, we break function declarations in a certain order:
4452   // 1) break amongst arguments.
4453   verifyFormat("Aaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccc,\n"
4454                "                              Cccccccccccccc cccccccccccccc);");
4455   verifyFormat("template <class TemplateIt>\n"
4456                "SomeReturnType SomeFunction(TemplateIt begin, TemplateIt end,\n"
4457                "                            TemplateIt *stop) {}");
4458 
4459   // 2) break after return type.
4460   verifyFormat(
4461       "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4462       "bbbbbbbbbbbbbb(Cccccccccccccc cccccccccccccccccccccccccc);",
4463       getGoogleStyle());
4464 
4465   // 3) break after (.
4466   verifyFormat(
4467       "Aaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb(\n"
4468       "    Cccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccc);",
4469       getGoogleStyle());
4470 
4471   // 4) break before after nested name specifiers.
4472   verifyFormat(
4473       "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4474       "SomeClasssssssssssssssssssssssssssssssssssssss::\n"
4475       "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc);",
4476       getGoogleStyle());
4477 
4478   // However, there are exceptions, if a sufficient amount of lines can be
4479   // saved.
4480   // FIXME: The precise cut-offs wrt. the number of saved lines might need some
4481   // more adjusting.
4482   verifyFormat("Aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
4483                "                                  Cccccccccccccc cccccccccc,\n"
4484                "                                  Cccccccccccccc cccccccccc,\n"
4485                "                                  Cccccccccccccc cccccccccc,\n"
4486                "                                  Cccccccccccccc cccccccccc);");
4487   verifyFormat(
4488       "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4489       "bbbbbbbbbbb(Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4490       "            Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4491       "            Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);",
4492       getGoogleStyle());
4493   verifyFormat(
4494       "Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(Cccccccccccccc cccccccccc,\n"
4495       "                                          Cccccccccccccc cccccccccc,\n"
4496       "                                          Cccccccccccccc cccccccccc,\n"
4497       "                                          Cccccccccccccc cccccccccc,\n"
4498       "                                          Cccccccccccccc cccccccccc,\n"
4499       "                                          Cccccccccccccc cccccccccc,\n"
4500       "                                          Cccccccccccccc cccccccccc);");
4501   verifyFormat("Aaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4502                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4503                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4504                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc,\n"
4505                "    Cccccccccccccc cccccccccc, Cccccccccccccc cccccccccc);");
4506 
4507   // Break after multi-line parameters.
4508   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4509                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4510                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4511                "    bbbb bbbb);");
4512   verifyFormat("void SomeLoooooooooooongFunction(\n"
4513                "    std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
4514                "        aaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4515                "    int bbbbbbbbbbbbb);");
4516 
4517   // Treat overloaded operators like other functions.
4518   verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
4519                "operator>(const SomeLoooooooooooooooooooooooooogType &other);");
4520   verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
4521                "operator>>(const SomeLooooooooooooooooooooooooogType &other);");
4522   verifyFormat("SomeLoooooooooooooooooooooooooogType\n"
4523                "operator<<(const SomeLooooooooooooooooooooooooogType &other);");
4524   verifyGoogleFormat(
4525       "SomeLoooooooooooooooooooooooooooooogType operator>>(\n"
4526       "    const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
4527   verifyGoogleFormat(
4528       "SomeLoooooooooooooooooooooooooooooogType operator<<(\n"
4529       "    const SomeLooooooooogType &a, const SomeLooooooooogType &b);");
4530   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4531                "    int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);");
4532   verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n"
4533                "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);");
4534   verifyGoogleFormat(
4535       "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n"
4536       "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4537       "    bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}");
4538   verifyGoogleFormat(
4539       "template <typename T>\n"
4540       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4541       "aaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaaaaa(\n"
4542       "    aaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaa);");
4543 
4544   FormatStyle Style = getLLVMStyle();
4545   Style.PointerAlignment = FormatStyle::PAS_Left;
4546   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4547                "    aaaaaaaaaaaaaaaaaaaaaaaaa* const aaaaaaaaaaaa) {}",
4548                Style);
4549   verifyFormat("void aaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n"
4550                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4551                Style);
4552 }
4553 
4554 TEST_F(FormatTest, DontBreakBeforeQualifiedOperator) {
4555   // Regression test for https://bugs.llvm.org/show_bug.cgi?id=40516:
4556   // Prefer keeping `::` followed by `operator` together.
4557   EXPECT_EQ("const aaaa::bbbbbbb &\n"
4558             "ccccccccc::operator++() {\n"
4559             "  stuff();\n"
4560             "}",
4561             format("const aaaa::bbbbbbb\n"
4562                    "&ccccccccc::operator++() { stuff(); }",
4563                    getLLVMStyleWithColumns(40)));
4564 }
4565 
4566 TEST_F(FormatTest, TrailingReturnType) {
4567   verifyFormat("auto foo() -> int;\n");
4568   verifyFormat("struct S {\n"
4569                "  auto bar() const -> int;\n"
4570                "};");
4571   verifyFormat("template <size_t Order, typename T>\n"
4572                "auto load_img(const std::string &filename)\n"
4573                "    -> alias::tensor<Order, T, mem::tag::cpu> {}");
4574   verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n"
4575                "    -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}");
4576   verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}");
4577   verifyFormat("template <typename T>\n"
4578                "auto aaaaaaaaaaaaaaaaaaaaaa(T t)\n"
4579                "    -> decltype(eaaaaaaaaaaaaaaa<T>(t.a).aaaaaaaa());");
4580 
4581   // Not trailing return types.
4582   verifyFormat("void f() { auto a = b->c(); }");
4583 }
4584 
4585 TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) {
4586   // Avoid breaking before trailing 'const' or other trailing annotations, if
4587   // they are not function-like.
4588   FormatStyle Style = getGoogleStyle();
4589   Style.ColumnLimit = 47;
4590   verifyFormat("void someLongFunction(\n"
4591                "    int someLoooooooooooooongParameter) const {\n}",
4592                getLLVMStyleWithColumns(47));
4593   verifyFormat("LoooooongReturnType\n"
4594                "someLoooooooongFunction() const {}",
4595                getLLVMStyleWithColumns(47));
4596   verifyFormat("LoooooongReturnType someLoooooooongFunction()\n"
4597                "    const {}",
4598                Style);
4599   verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
4600                "                  aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE;");
4601   verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
4602                "                  aaaaa aaaaaaaaaaaaaaaaaaaa) OVERRIDE FINAL;");
4603   verifyFormat("void SomeFunction(aaaaa aaaaaaaaaaaaaaaaaaaa,\n"
4604                "                  aaaaa aaaaaaaaaaaaaaaaaaaa) override final;");
4605   verifyFormat("virtual void aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa,\n"
4606                "                   aaaaaaaaaaa aaaaa) const override;");
4607   verifyGoogleFormat(
4608       "virtual void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4609       "    const override;");
4610 
4611   // Even if the first parameter has to be wrapped.
4612   verifyFormat("void someLongFunction(\n"
4613                "    int someLongParameter) const {}",
4614                getLLVMStyleWithColumns(46));
4615   verifyFormat("void someLongFunction(\n"
4616                "    int someLongParameter) const {}",
4617                Style);
4618   verifyFormat("void someLongFunction(\n"
4619                "    int someLongParameter) override {}",
4620                Style);
4621   verifyFormat("void someLongFunction(\n"
4622                "    int someLongParameter) OVERRIDE {}",
4623                Style);
4624   verifyFormat("void someLongFunction(\n"
4625                "    int someLongParameter) final {}",
4626                Style);
4627   verifyFormat("void someLongFunction(\n"
4628                "    int someLongParameter) FINAL {}",
4629                Style);
4630   verifyFormat("void someLongFunction(\n"
4631                "    int parameter) const override {}",
4632                Style);
4633 
4634   Style.BreakBeforeBraces = FormatStyle::BS_Allman;
4635   verifyFormat("void someLongFunction(\n"
4636                "    int someLongParameter) const\n"
4637                "{\n"
4638                "}",
4639                Style);
4640 
4641   // Unless these are unknown annotations.
4642   verifyFormat("void SomeFunction(aaaaaaaaaa aaaaaaaaaaaaaaa,\n"
4643                "                  aaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4644                "    LONG_AND_UGLY_ANNOTATION;");
4645 
4646   // Breaking before function-like trailing annotations is fine to keep them
4647   // close to their arguments.
4648   verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4649                "    LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
4650   verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
4651                "    LOCKS_EXCLUDED(aaaaaaaaaaaaa);");
4652   verifyFormat("void aaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) const\n"
4653                "    LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}");
4654   verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n"
4655                      "    AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);");
4656   verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});");
4657 
4658   verifyFormat(
4659       "void aaaaaaaaaaaaaaaaaa()\n"
4660       "    __attribute__((aaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaa,\n"
4661       "                   aaaaaaaaaaaaaaaaaaaaaaaaa));");
4662   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4663                "    __attribute__((unused));");
4664   verifyGoogleFormat(
4665       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4666       "    GUARDED_BY(aaaaaaaaaaaa);");
4667   verifyGoogleFormat(
4668       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4669       "    GUARDED_BY(aaaaaaaaaaaa);");
4670   verifyGoogleFormat(
4671       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4672       "    aaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
4673   verifyGoogleFormat(
4674       "bool aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa GUARDED_BY(aaaaaaaaaaaa) =\n"
4675       "    aaaaaaaaaaaaaaaaaaaaaaaaa;");
4676 }
4677 
4678 TEST_F(FormatTest, FunctionAnnotations) {
4679   verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
4680                "int OldFunction(const string &parameter) {}");
4681   verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
4682                "string OldFunction(const string &parameter) {}");
4683   verifyFormat("template <typename T>\n"
4684                "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
4685                "string OldFunction(const string &parameter) {}");
4686 
4687   // Not function annotations.
4688   verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
4689                "                << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
4690   verifyFormat("TEST_F(ThisIsATestFixtureeeeeeeeeeeee,\n"
4691                "       ThisIsATestWithAReallyReallyReallyReallyLongName) {}");
4692   verifyFormat("MACRO(abc).function() // wrap\n"
4693                "    << abc;");
4694   verifyFormat("MACRO(abc)->function() // wrap\n"
4695                "    << abc;");
4696   verifyFormat("MACRO(abc)::function() // wrap\n"
4697                "    << abc;");
4698 }
4699 
4700 TEST_F(FormatTest, BreaksDesireably) {
4701   verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
4702                "    aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
4703                "    aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
4704   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4705                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)) {\n"
4706                "}");
4707 
4708   verifyFormat(
4709       "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4710       "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}");
4711 
4712   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4713                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4714                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4715 
4716   verifyFormat(
4717       "aaaaaaaa(aaaaaaaaaaaaa,\n"
4718       "         aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4719       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
4720       "         aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4721       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
4722 
4723   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
4724                "    (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4725 
4726   verifyFormat(
4727       "void f() {\n"
4728       "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&\n"
4729       "                                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4730       "}");
4731   verifyFormat(
4732       "aaaaaa(new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4733       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4734   verifyFormat(
4735       "aaaaaa(aaa, new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4736       "                aaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
4737   verifyFormat(
4738       "aaaaaa(aaa,\n"
4739       "       new Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4740       "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
4741       "       aaaa);");
4742   verifyFormat("aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +\n"
4743                "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4744                "                  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4745 
4746   // Indent consistently independent of call expression and unary operator.
4747   verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4748                "    dddddddddddddddddddddddddddddd));");
4749   verifyFormat("aaaaaaaaaaa(!bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
4750                "    dddddddddddddddddddddddddddddd));");
4751   verifyFormat("aaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccc(\n"
4752                "    dddddddddddddddddddddddddddddd));");
4753 
4754   // This test case breaks on an incorrect memoization, i.e. an optimization not
4755   // taking into account the StopAt value.
4756   verifyFormat(
4757       "return aaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4758       "       aaaaaaaaaaa(aaaaaaaaa) || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4759       "       aaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaa ||\n"
4760       "       (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
4761 
4762   verifyFormat("{\n  {\n    {\n"
4763                "      Annotation.SpaceRequiredBefore =\n"
4764                "          Line.Tokens[i - 1].Tok.isNot(tok::l_paren) &&\n"
4765                "          Line.Tokens[i - 1].Tok.isNot(tok::l_square);\n"
4766                "    }\n  }\n}");
4767 
4768   // Break on an outer level if there was a break on an inner level.
4769   EXPECT_EQ("f(g(h(a, // comment\n"
4770             "      b, c),\n"
4771             "    d, e),\n"
4772             "  x, y);",
4773             format("f(g(h(a, // comment\n"
4774                    "    b, c), d, e), x, y);"));
4775 
4776   // Prefer breaking similar line breaks.
4777   verifyFormat(
4778       "const int kTrackingOptions = NSTrackingMouseMoved |\n"
4779       "                             NSTrackingMouseEnteredAndExited |\n"
4780       "                             NSTrackingActiveAlways;");
4781 }
4782 
4783 TEST_F(FormatTest, FormatsDeclarationsOnePerLine) {
4784   FormatStyle NoBinPacking = getGoogleStyle();
4785   NoBinPacking.BinPackParameters = false;
4786   NoBinPacking.BinPackArguments = true;
4787   verifyFormat("void f() {\n"
4788                "  f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n"
4789                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
4790                "}",
4791                NoBinPacking);
4792   verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n"
4793                "       int aaaaaaaaaaaaaaaaaaaa,\n"
4794                "       int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
4795                NoBinPacking);
4796 
4797   NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
4798   verifyFormat("void aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4799                "                        vector<int> bbbbbbbbbbbbbbb);",
4800                NoBinPacking);
4801   // FIXME: This behavior difference is probably not wanted. However, currently
4802   // we cannot distinguish BreakBeforeParameter being set because of the wrapped
4803   // template arguments from BreakBeforeParameter being set because of the
4804   // one-per-line formatting.
4805   verifyFormat(
4806       "void fffffffffff(aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4807       "                                             aaaaaaaaaa> aaaaaaaaaa);",
4808       NoBinPacking);
4809   verifyFormat(
4810       "void fffffffffff(\n"
4811       "    aaaaaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaa>\n"
4812       "        aaaaaaaaaa);");
4813 }
4814 
4815 TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) {
4816   FormatStyle NoBinPacking = getGoogleStyle();
4817   NoBinPacking.BinPackParameters = false;
4818   NoBinPacking.BinPackArguments = false;
4819   verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n"
4820                "  aaaaaaaaaaaaaaaaaaaa,\n"
4821                "  aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);",
4822                NoBinPacking);
4823   verifyFormat("aaaaaaa(aaaaaaaaaaaaa,\n"
4824                "        aaaaaaaaaaaaa,\n"
4825                "        aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));",
4826                NoBinPacking);
4827   verifyFormat(
4828       "aaaaaaaa(aaaaaaaaaaaaa,\n"
4829       "         aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4830       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
4831       "         aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4832       "             aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));",
4833       NoBinPacking);
4834   verifyFormat("aaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4835                "    .aaaaaaaaaaaaaaaaaa();",
4836                NoBinPacking);
4837   verifyFormat("void f() {\n"
4838                "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4839                "      aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaa);\n"
4840                "}",
4841                NoBinPacking);
4842 
4843   verifyFormat(
4844       "aaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
4845       "             aaaaaaaaaaaa,\n"
4846       "             aaaaaaaaaaaa);",
4847       NoBinPacking);
4848   verifyFormat(
4849       "somefunction(someotherFunction(ddddddddddddddddddddddddddddddddddd,\n"
4850       "                               ddddddddddddddddddddddddddddd),\n"
4851       "             test);",
4852       NoBinPacking);
4853 
4854   verifyFormat("std::vector<aaaaaaaaaaaaaaaaaaaaaaa,\n"
4855                "            aaaaaaaaaaaaaaaaaaaaaaa,\n"
4856                "            aaaaaaaaaaaaaaaaaaaaaaa>\n"
4857                "    aaaaaaaaaaaaaaaaaa;",
4858                NoBinPacking);
4859   verifyFormat("a(\"a\"\n"
4860                "  \"a\",\n"
4861                "  a);");
4862 
4863   NoBinPacking.AllowAllParametersOfDeclarationOnNextLine = false;
4864   verifyFormat("void aaaaaaaaaa(aaaaaaaaa,\n"
4865                "                aaaaaaaaa,\n"
4866                "                aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
4867                NoBinPacking);
4868   verifyFormat(
4869       "void f() {\n"
4870       "  aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaa, aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa)\n"
4871       "      .aaaaaaa();\n"
4872       "}",
4873       NoBinPacking);
4874   verifyFormat(
4875       "template <class SomeType, class SomeOtherType>\n"
4876       "SomeType SomeFunction(SomeType Type, SomeOtherType OtherType) {}",
4877       NoBinPacking);
4878 }
4879 
4880 TEST_F(FormatTest, AdaptiveOnePerLineFormatting) {
4881   FormatStyle Style = getLLVMStyleWithColumns(15);
4882   Style.ExperimentalAutoDetectBinPacking = true;
4883   EXPECT_EQ("aaa(aaaa,\n"
4884             "    aaaa,\n"
4885             "    aaaa);\n"
4886             "aaa(aaaa,\n"
4887             "    aaaa,\n"
4888             "    aaaa);",
4889             format("aaa(aaaa,\n" // one-per-line
4890                    "  aaaa,\n"
4891                    "    aaaa  );\n"
4892                    "aaa(aaaa,  aaaa,  aaaa);", // inconclusive
4893                    Style));
4894   EXPECT_EQ("aaa(aaaa, aaaa,\n"
4895             "    aaaa);\n"
4896             "aaa(aaaa, aaaa,\n"
4897             "    aaaa);",
4898             format("aaa(aaaa,  aaaa,\n" // bin-packed
4899                    "    aaaa  );\n"
4900                    "aaa(aaaa,  aaaa,  aaaa);", // inconclusive
4901                    Style));
4902 }
4903 
4904 TEST_F(FormatTest, FormatsBuilderPattern) {
4905   verifyFormat("return llvm::StringSwitch<Reference::Kind>(name)\n"
4906                "    .StartsWith(\".eh_frame_hdr\", ORDER_EH_FRAMEHDR)\n"
4907                "    .StartsWith(\".eh_frame\", ORDER_EH_FRAME)\n"
4908                "    .StartsWith(\".init\", ORDER_INIT)\n"
4909                "    .StartsWith(\".fini\", ORDER_FINI)\n"
4910                "    .StartsWith(\".hash\", ORDER_HASH)\n"
4911                "    .Default(ORDER_TEXT);\n");
4912 
4913   verifyFormat("return aaaaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa() <\n"
4914                "       aaaaaaaaaaaaaaa->aaaaa().aaaaaaaaaaaaa().aaaaaa();");
4915   verifyFormat(
4916       "aaaaaaa->aaaaaaa\n"
4917       "    ->aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
4918       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4919       "    ->aaaaaaaa(aaaaaaaaaaaaaaa);");
4920   verifyFormat(
4921       "aaaaaaa->aaaaaaa\n"
4922       "    ->aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4923       "    ->aaaaaaaa(aaaaaaaaaaaaaaa);");
4924   verifyFormat(
4925       "aaaaaaaaaaaaaaaaaaa()->aaaaaa(bbbbb)->aaaaaaaaaaaaaaaaaaa( // break\n"
4926       "    aaaaaaaaaaaaaa);");
4927   verifyFormat(
4928       "aaaaaaaaaaaaaaaaaaaaaaa *aaaaaaaaa =\n"
4929       "    aaaaaa->aaaaaaaaaaaa()\n"
4930       "        ->aaaaaaaaaaaaaaaa(\n"
4931       "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4932       "        ->aaaaaaaaaaaaaaaaa();");
4933   verifyGoogleFormat(
4934       "void f() {\n"
4935       "  someo->Add((new util::filetools::Handler(dir))\n"
4936       "                 ->OnEvent1(NewPermanentCallback(\n"
4937       "                     this, &HandlerHolderClass::EventHandlerCBA))\n"
4938       "                 ->OnEvent2(NewPermanentCallback(\n"
4939       "                     this, &HandlerHolderClass::EventHandlerCBB))\n"
4940       "                 ->OnEvent3(NewPermanentCallback(\n"
4941       "                     this, &HandlerHolderClass::EventHandlerCBC))\n"
4942       "                 ->OnEvent5(NewPermanentCallback(\n"
4943       "                     this, &HandlerHolderClass::EventHandlerCBD))\n"
4944       "                 ->OnEvent6(NewPermanentCallback(\n"
4945       "                     this, &HandlerHolderClass::EventHandlerCBE)));\n"
4946       "}");
4947 
4948   verifyFormat(
4949       "aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa().aaaaaaaaaaa();");
4950   verifyFormat("aaaaaaaaaaaaaaa()\n"
4951                "    .aaaaaaaaaaaaaaa()\n"
4952                "    .aaaaaaaaaaaaaaa()\n"
4953                "    .aaaaaaaaaaaaaaa()\n"
4954                "    .aaaaaaaaaaaaaaa();");
4955   verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4956                "    .aaaaaaaaaaaaaaa()\n"
4957                "    .aaaaaaaaaaaaaaa()\n"
4958                "    .aaaaaaaaaaaaaaa();");
4959   verifyFormat("aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4960                "    .aaaaaaaaaaaaaaa.aaaaaaaaaaaaaaa()\n"
4961                "    .aaaaaaaaaaaaaaa();");
4962   verifyFormat("aaaaaaaaaaaaa->aaaaaaaaaaaaaaaaaaaaaaaa()\n"
4963                "    ->aaaaaaaaaaaaaae(0)\n"
4964                "    ->aaaaaaaaaaaaaaa();");
4965 
4966   // Don't linewrap after very short segments.
4967   verifyFormat("a().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4968                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4969                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4970   verifyFormat("aa().aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4971                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4972                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4973   verifyFormat("aaa()\n"
4974                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4975                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4976                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
4977 
4978   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4979                "    .aaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
4980                "    .has<bbbbbbbbbbbbbbbbbbbbb>();");
4981   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaa()\n"
4982                "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
4983                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>();");
4984 
4985   // Prefer not to break after empty parentheses.
4986   verifyFormat("FirstToken->WhitespaceRange.getBegin().getLocWithOffset(\n"
4987                "    First->LastNewlineOffset);");
4988 
4989   // Prefer not to create "hanging" indents.
4990   verifyFormat(
4991       "return !soooooooooooooome_map\n"
4992       "            .insert(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
4993       "            .second;");
4994   verifyFormat(
4995       "return aaaaaaaaaaaaaaaa\n"
4996       "    .aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa)\n"
4997       "    .aaaa(aaaaaaaaaaaaaa);");
4998   // No hanging indent here.
4999   verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa.aaaaaaaaaaaaaaa(\n"
5000                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5001   verifyFormat("aaaaaaaaaaaaaaaa.aaaaaaaaaaaaaa().aaaaaaaaaaaaaaa(\n"
5002                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5003   verifyFormat("aaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
5004                "    .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5005                getLLVMStyleWithColumns(60));
5006   verifyFormat("aaaaaaaaaaaaaaaaaa\n"
5007                "    .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa)\n"
5008                "    .aaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5009                getLLVMStyleWithColumns(59));
5010   verifyFormat("aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5011                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5012                "    .aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5013 
5014   // Dont break if only closing statements before member call
5015   verifyFormat("test() {\n"
5016                "  ([]() -> {\n"
5017                "    int b = 32;\n"
5018                "    return 3;\n"
5019                "  }).foo();\n"
5020                "}");
5021   verifyFormat("test() {\n"
5022                "  (\n"
5023                "      []() -> {\n"
5024                "        int b = 32;\n"
5025                "        return 3;\n"
5026                "      },\n"
5027                "      foo, bar)\n"
5028                "      .foo();\n"
5029                "}");
5030   verifyFormat("test() {\n"
5031                "  ([]() -> {\n"
5032                "    int b = 32;\n"
5033                "    return 3;\n"
5034                "  })\n"
5035                "      .foo()\n"
5036                "      .bar();\n"
5037                "}");
5038   verifyFormat("test() {\n"
5039                "  ([]() -> {\n"
5040                "    int b = 32;\n"
5041                "    return 3;\n"
5042                "  })\n"
5043                "      .foo(\"aaaaaaaaaaaaaaaaa\"\n"
5044                "           \"bbbb\");\n"
5045                "}",
5046                getLLVMStyleWithColumns(30));
5047 }
5048 
5049 TEST_F(FormatTest, BreaksAccordingToOperatorPrecedence) {
5050   verifyFormat(
5051       "if (aaaaaaaaaaaaaaaaaaaaaaaaa ||\n"
5052       "    bbbbbbbbbbbbbbbbbbbbbbbbb && ccccccccccccccccccccccccc) {\n}");
5053   verifyFormat(
5054       "if (aaaaaaaaaaaaaaaaaaaaaaaaa or\n"
5055       "    bbbbbbbbbbbbbbbbbbbbbbbbb and cccccccccccccccccccccccc) {\n}");
5056 
5057   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa && bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
5058                "    ccccccccccccccccccccccccc) {\n}");
5059   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa and bbbbbbbbbbbbbbbbbbbbbbbb or\n"
5060                "    ccccccccccccccccccccccccc) {\n}");
5061 
5062   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb ||\n"
5063                "    ccccccccccccccccccccccccc) {\n}");
5064   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb or\n"
5065                "    ccccccccccccccccccccccccc) {\n}");
5066 
5067   verifyFormat(
5068       "if ((aaaaaaaaaaaaaaaaaaaaaaaaa || bbbbbbbbbbbbbbbbbbbbbbbbb) &&\n"
5069       "    ccccccccccccccccccccccccc) {\n}");
5070   verifyFormat(
5071       "if ((aaaaaaaaaaaaaaaaaaaaaaaaa or bbbbbbbbbbbbbbbbbbbbbbbbb) and\n"
5072       "    ccccccccccccccccccccccccc) {\n}");
5073 
5074   verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ||\n"
5075                "       bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB ||\n"
5076                "       cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC ||\n"
5077                "       dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
5078   verifyFormat("return aaaa & AAAAAAAAAAAAAAAAAAAAAAAAAAAAA or\n"
5079                "       bbbb & BBBBBBBBBBBBBBBBBBBBBBBBBBBBB or\n"
5080                "       cccc & CCCCCCCCCCCCCCCCCCCCCCCCCC or\n"
5081                "       dddd & DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;");
5082 
5083   verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa ||\n"
5084                "     aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) &&\n"
5085                "    aaaaaaaaaaaaaaa != aa) {\n}");
5086   verifyFormat("if ((aaaaaaaaaa != aaaaaaaaaaaaaaa or\n"
5087                "     aaaaaaaaaaaaaaaaaaaaaaaa() >= aaaaaaaaaaaaaaaaaaaa) and\n"
5088                "    aaaaaaaaaaaaaaa != aa) {\n}");
5089 }
5090 
5091 TEST_F(FormatTest, BreaksAfterAssignments) {
5092   verifyFormat(
5093       "unsigned Cost =\n"
5094       "    TTI.getMemoryOpCost(I->getOpcode(), VectorTy, SI->getAlignment(),\n"
5095       "                        SI->getPointerAddressSpaceee());\n");
5096   verifyFormat(
5097       "CharSourceRange LineRange = CharSourceRange::getTokenRange(\n"
5098       "    Line.Tokens.front().Tok.getLo(), Line.Tokens.back().Tok.getLoc());");
5099 
5100   verifyFormat(
5101       "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaa = aaaaaaaaaaaaaa(0).aaaa().aaaaaaaaa(\n"
5102       "    aaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaa);");
5103   verifyFormat("unsigned OriginalStartColumn =\n"
5104                "    SourceMgr.getSpellingColumnNumber(\n"
5105                "        Current.FormatTok.getStartOfNonWhitespace()) -\n"
5106                "    1;");
5107 }
5108 
5109 TEST_F(FormatTest, ConfigurableBreakAssignmentPenalty) {
5110   FormatStyle Style = getLLVMStyle();
5111   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5112                "    bbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccccccccccccc;",
5113                Style);
5114 
5115   Style.PenaltyBreakAssignment = 20;
5116   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbbbbbbbbbbbbb +\n"
5117                "                                 cccccccccccccccccccccccccc;",
5118                Style);
5119 }
5120 
5121 TEST_F(FormatTest, AlignsAfterAssignments) {
5122   verifyFormat(
5123       "int Result = aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5124       "             aaaaaaaaaaaaaaaaaaaaaaaaa;");
5125   verifyFormat(
5126       "Result += aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5127       "          aaaaaaaaaaaaaaaaaaaaaaaaa;");
5128   verifyFormat(
5129       "Result >>= aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5130       "           aaaaaaaaaaaaaaaaaaaaaaaaa;");
5131   verifyFormat(
5132       "int Result = (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5133       "              aaaaaaaaaaaaaaaaaaaaaaaaa);");
5134   verifyFormat(
5135       "double LooooooooooooooooooooooooongResult = aaaaaaaaaaaaaaaaaaaaaaaa +\n"
5136       "                                            aaaaaaaaaaaaaaaaaaaaaaaa +\n"
5137       "                                            aaaaaaaaaaaaaaaaaaaaaaaa;");
5138 }
5139 
5140 TEST_F(FormatTest, AlignsAfterReturn) {
5141   verifyFormat(
5142       "return aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5143       "       aaaaaaaaaaaaaaaaaaaaaaaaa;");
5144   verifyFormat(
5145       "return (aaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5146       "        aaaaaaaaaaaaaaaaaaaaaaaaa);");
5147   verifyFormat(
5148       "return aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
5149       "       aaaaaaaaaaaaaaaaaaaaaa();");
5150   verifyFormat(
5151       "return (aaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >=\n"
5152       "        aaaaaaaaaaaaaaaaaaaaaa());");
5153   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5154                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5155   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5156                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) &&\n"
5157                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5158   verifyFormat("return\n"
5159                "    // true if code is one of a or b.\n"
5160                "    code == a || code == b;");
5161 }
5162 
5163 TEST_F(FormatTest, AlignsAfterOpenBracket) {
5164   verifyFormat(
5165       "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
5166       "                                                aaaaaaaaa aaaaaaa) {}");
5167   verifyFormat(
5168       "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
5169       "                                               aaaaaaaaaaa aaaaaaaaa);");
5170   verifyFormat(
5171       "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
5172       "                                             aaaaaaaaaaaaaaaaaaaaa));");
5173   FormatStyle Style = getLLVMStyle();
5174   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5175   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5176                "    aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}",
5177                Style);
5178   verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
5179                "    aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);",
5180                Style);
5181   verifyFormat("SomeLongVariableName->someFunction(\n"
5182                "    foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));",
5183                Style);
5184   verifyFormat(
5185       "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n"
5186       "    aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
5187       Style);
5188   verifyFormat(
5189       "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n"
5190       "    aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5191       Style);
5192   verifyFormat(
5193       "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n"
5194       "    aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
5195       Style);
5196 
5197   verifyFormat("bbbbbbbbbbbb(aaaaaaaaaaaaaaaaaaaaaaaa, //\n"
5198                "    ccccccc(aaaaaaaaaaaaaaaaa,         //\n"
5199                "        b));",
5200                Style);
5201 
5202   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
5203   Style.BinPackArguments = false;
5204   Style.BinPackParameters = false;
5205   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5206                "    aaaaaaaaaaa aaaaaaaa,\n"
5207                "    aaaaaaaaa aaaaaaa,\n"
5208                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}",
5209                Style);
5210   verifyFormat("SomeLongVariableName->someVeryLongFunctionName(\n"
5211                "    aaaaaaaaaaa aaaaaaaaa,\n"
5212                "    aaaaaaaaaaa aaaaaaaaa,\n"
5213                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5214                Style);
5215   verifyFormat("SomeLongVariableName->someFunction(foooooooo(\n"
5216                "    aaaaaaaaaaaaaaa,\n"
5217                "    aaaaaaaaaaaaaaaaaaaaa,\n"
5218                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));",
5219                Style);
5220   verifyFormat(
5221       "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa(\n"
5222       "    aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
5223       Style);
5224   verifyFormat(
5225       "aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaa.aaaaaaaaaa(\n"
5226       "    aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)));",
5227       Style);
5228   verifyFormat(
5229       "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
5230       "    aaaaaaaaaaaaaaaaaaaaa(\n"
5231       "        aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)),\n"
5232       "    aaaaaaaaaaaaaaaa);",
5233       Style);
5234   verifyFormat(
5235       "aaaaaaaaaaaaaaaaaaaaaaaa(\n"
5236       "    aaaaaaaaaaaaaaaaaaaaa(\n"
5237       "        aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa)) &&\n"
5238       "    aaaaaaaaaaaaaaaa);",
5239       Style);
5240 }
5241 
5242 TEST_F(FormatTest, ParenthesesAndOperandAlignment) {
5243   FormatStyle Style = getLLVMStyleWithColumns(40);
5244   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5245                "          bbbbbbbbbbbbbbbbbbbbbb);",
5246                Style);
5247   Style.AlignAfterOpenBracket = FormatStyle::BAS_Align;
5248   Style.AlignOperands = false;
5249   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5250                "          bbbbbbbbbbbbbbbbbbbbbb);",
5251                Style);
5252   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5253   Style.AlignOperands = true;
5254   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5255                "          bbbbbbbbbbbbbbbbbbbbbb);",
5256                Style);
5257   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
5258   Style.AlignOperands = false;
5259   verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n"
5260                "    bbbbbbbbbbbbbbbbbbbbbb);",
5261                Style);
5262 }
5263 
5264 TEST_F(FormatTest, BreaksConditionalExpressions) {
5265   verifyFormat(
5266       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5267       "                               ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5268       "                               : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5269   verifyFormat(
5270       "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
5271       "     aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5272       "                                : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5273   verifyFormat(
5274       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5275       "                                   : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5276   verifyFormat(
5277       "aaaa(aaaaaaaaa, aaaaaaaaa,\n"
5278       "     aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5279       "             : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5280   verifyFormat(
5281       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa)\n"
5282       "                                                    : aaaaaaaaaaaaa);");
5283   verifyFormat(
5284       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5285       "                   aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5286       "                                    : aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5287       "                   aaaaaaaaaaaaa);");
5288   verifyFormat(
5289       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5290       "                   aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5291       "                   aaaaaaaaaaaaa);");
5292   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5293                "    ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5294                "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5295                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5296                "          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5297   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5298                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5299                "           ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5300                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5301                "           : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5302                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5303                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5304   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5305                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5306                "           ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5307                "                  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5308                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5309   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5310                "    ? aaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5311                "    : aaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5312   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
5313                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5314                "        ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5315                "        : aaaaaaaaaaaaaaaa;");
5316   verifyFormat(
5317       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5318       "    ? aaaaaaaaaaaaaaa\n"
5319       "    : aaaaaaaaaaaaaaa;");
5320   verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
5321                "          aaaaaaaaa\n"
5322                "      ? b\n"
5323                "      : c);");
5324   verifyFormat("return aaaa == bbbb\n"
5325                "           // comment\n"
5326                "           ? aaaa\n"
5327                "           : bbbb;");
5328   verifyFormat("unsigned Indent =\n"
5329                "    format(TheLine.First,\n"
5330                "           IndentForLevel[TheLine.Level] >= 0\n"
5331                "               ? IndentForLevel[TheLine.Level]\n"
5332                "               : TheLine * 2,\n"
5333                "           TheLine.InPPDirective, PreviousEndOfLineColumn);",
5334                getLLVMStyleWithColumns(60));
5335   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
5336                "                  ? aaaaaaaaaaaaaaa\n"
5337                "                  : bbbbbbbbbbbbbbb //\n"
5338                "                        ? ccccccccccccccc\n"
5339                "                        : ddddddddddddddd;");
5340   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa //\n"
5341                "                  ? aaaaaaaaaaaaaaa\n"
5342                "                  : (bbbbbbbbbbbbbbb //\n"
5343                "                         ? ccccccccccccccc\n"
5344                "                         : ddddddddddddddd);");
5345   verifyFormat(
5346       "int aaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5347       "                                      ? aaaaaaaaaaaaaaaaaaaaaaaaa +\n"
5348       "                                            aaaaaaaaaaaaaaaaaaaaa +\n"
5349       "                                            aaaaaaaaaaaaaaaaaaaaa\n"
5350       "                                      : aaaaaaaaaa;");
5351   verifyFormat(
5352       "aaaaaa = aaaaaaaaaaaa ? aaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5353       "                                   : aaaaaaaaaaaaaaaaaaaaaa\n"
5354       "                      : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5355 
5356   FormatStyle NoBinPacking = getLLVMStyle();
5357   NoBinPacking.BinPackArguments = false;
5358   verifyFormat(
5359       "void f() {\n"
5360       "  g(aaa,\n"
5361       "    aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
5362       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5363       "        ? aaaaaaaaaaaaaaa\n"
5364       "        : aaaaaaaaaaaaaaa);\n"
5365       "}",
5366       NoBinPacking);
5367   verifyFormat(
5368       "void f() {\n"
5369       "  g(aaa,\n"
5370       "    aaaaaaaaaa == aaaaaaaaaa ? aaaa : aaaaa,\n"
5371       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5372       "        ?: aaaaaaaaaaaaaaa);\n"
5373       "}",
5374       NoBinPacking);
5375 
5376   verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n"
5377                "             // comment.\n"
5378                "             ccccccccccccccccccccccccccccccccccccccc\n"
5379                "                 ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5380                "                 : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);");
5381 
5382   // Assignments in conditional expressions. Apparently not uncommon :-(.
5383   verifyFormat("return a != b\n"
5384                "           // comment\n"
5385                "           ? a = b\n"
5386                "           : a = b;");
5387   verifyFormat("return a != b\n"
5388                "           // comment\n"
5389                "           ? a = a != b\n"
5390                "                     // comment\n"
5391                "                     ? a = b\n"
5392                "                     : a\n"
5393                "           : a;\n");
5394   verifyFormat("return a != b\n"
5395                "           // comment\n"
5396                "           ? a\n"
5397                "           : a = a != b\n"
5398                "                     // comment\n"
5399                "                     ? a = b\n"
5400                "                     : a;");
5401 }
5402 
5403 TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) {
5404   FormatStyle Style = getLLVMStyle();
5405   Style.BreakBeforeTernaryOperators = false;
5406   Style.ColumnLimit = 70;
5407   verifyFormat(
5408       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5409       "                               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5410       "                               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5411       Style);
5412   verifyFormat(
5413       "aaaa(aaaaaaaaaa, aaaaaaaa,\n"
5414       "     aaaaaaaaaaaaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5415       "                                  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5416       Style);
5417   verifyFormat(
5418       "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5419       "                                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5420       Style);
5421   verifyFormat(
5422       "aaaa(aaaaaaaa, aaaaaaaaaa,\n"
5423       "     aaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5424       "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5425       Style);
5426   verifyFormat(
5427       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa ? aaaa(aaaaaa) :\n"
5428       "                                                      aaaaaaaaaaaaa);",
5429       Style);
5430   verifyFormat(
5431       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5432       "                   aaaaaaaaaaaaaaaa ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5433       "                                      aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5434       "                   aaaaaaaaaaaaa);",
5435       Style);
5436   verifyFormat(
5437       "aaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5438       "                   aaaaaaaaaaaaaaaa ?: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5439       "                   aaaaaaaaaaaaa);",
5440       Style);
5441   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5442                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5443                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
5444                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5445                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5446                Style);
5447   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5448                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5449                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5450                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) :\n"
5451                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5452                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5453                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5454                Style);
5455   verifyFormat("aaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5456                "       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?:\n"
5457                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5458                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),\n"
5459                "       aaaaaaaaaaaaaaaaaaaaaaaaaaa);",
5460                Style);
5461   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5462                "    aaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5463                "    aaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5464                Style);
5465   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaa =\n"
5466                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5467                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa :\n"
5468                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5469                Style);
5470   verifyFormat(
5471       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5472       "    aaaaaaaaaaaaaaa :\n"
5473       "    aaaaaaaaaaaaaaa;",
5474       Style);
5475   verifyFormat("f(aaaaaaaaaaaaaaaa == // force break\n"
5476                "          aaaaaaaaa ?\n"
5477                "      b :\n"
5478                "      c);",
5479                Style);
5480   verifyFormat("unsigned Indent =\n"
5481                "    format(TheLine.First,\n"
5482                "           IndentForLevel[TheLine.Level] >= 0 ?\n"
5483                "               IndentForLevel[TheLine.Level] :\n"
5484                "               TheLine * 2,\n"
5485                "           TheLine.InPPDirective, PreviousEndOfLineColumn);",
5486                Style);
5487   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
5488                "                  aaaaaaaaaaaaaaa :\n"
5489                "                  bbbbbbbbbbbbbbb ? //\n"
5490                "                      ccccccccccccccc :\n"
5491                "                      ddddddddddddddd;",
5492                Style);
5493   verifyFormat("bool aaaaaa = aaaaaaaaaaaaa ? //\n"
5494                "                  aaaaaaaaaaaaaaa :\n"
5495                "                  (bbbbbbbbbbbbbbb ? //\n"
5496                "                       ccccccccccccccc :\n"
5497                "                       ddddddddddddddd);",
5498                Style);
5499   verifyFormat("int i = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5500                "            /*bbbbbbbbbbbbbbb=*/bbbbbbbbbbbbbbbbbbbbbbbbb :\n"
5501                "            ccccccccccccccccccccccccccc;",
5502                Style);
5503   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ?\n"
5504                "           aaaaa :\n"
5505                "           bbbbbbbbbbbbbbb + cccccccccccccccc;",
5506                Style);
5507 }
5508 
5509 TEST_F(FormatTest, DeclarationsOfMultipleVariables) {
5510   verifyFormat("bool aaaaaaaaaaaaaaaaa = aaaaaa->aaaaaaaaaaaaaaaaa(),\n"
5511                "     aaaaaaaaaaa = aaaaaa->aaaaaaaaaaa();");
5512   verifyFormat("bool a = true, b = false;");
5513 
5514   verifyFormat("bool aaaaaaaaaaaaaaaaaaaaaaaaa =\n"
5515                "         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaa),\n"
5516                "     bbbbbbbbbbbbbbbbbbbbbbbbb =\n"
5517                "         bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(bbbbbbbbbbbbbbbb);");
5518   verifyFormat(
5519       "bool aaaaaaaaaaaaaaaaaaaaa =\n"
5520       "         bbbbbbbbbbbbbbbbbbbbbbbbbbbb && cccccccccccccccccccccccccccc,\n"
5521       "     d = e && f;");
5522   verifyFormat("aaaaaaaaa a = aaaaaaaaaaaaaaaaaaaa, b = bbbbbbbbbbbbbbbbbbbb,\n"
5523                "          c = cccccccccccccccccccc, d = dddddddddddddddddddd;");
5524   verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
5525                "          *c = ccccccccccccccccccc, *d = ddddddddddddddddddd;");
5526   verifyFormat("aaaaaaaaa ***a = aaaaaaaaaaaaaaaaaaa, ***b = bbbbbbbbbbbbbbb,\n"
5527                "          ***c = ccccccccccccccccccc, ***d = ddddddddddddddd;");
5528 
5529   FormatStyle Style = getGoogleStyle();
5530   Style.PointerAlignment = FormatStyle::PAS_Left;
5531   Style.DerivePointerAlignment = false;
5532   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5533                "    *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n"
5534                "    *b = bbbbbbbbbbbbbbbbbbb;",
5535                Style);
5536   verifyFormat("aaaaaaaaa *a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n"
5537                "          *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;",
5538                Style);
5539   verifyFormat("vector<int*> a, b;", Style);
5540   verifyFormat("for (int *p, *q; p != q; p = p->next) {\n}", Style);
5541 }
5542 
5543 TEST_F(FormatTest, ConditionalExpressionsInBrackets) {
5544   verifyFormat("arr[foo ? bar : baz];");
5545   verifyFormat("f()[foo ? bar : baz];");
5546   verifyFormat("(a + b)[foo ? bar : baz];");
5547   verifyFormat("arr[foo ? (4 > 5 ? 4 : 5) : 5 < 5 ? 5 : 7];");
5548 }
5549 
5550 TEST_F(FormatTest, AlignsStringLiterals) {
5551   verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
5552                "                                      \"short literal\");");
5553   verifyFormat(
5554       "looooooooooooooooooooooooongFunction(\n"
5555       "    \"short literal\"\n"
5556       "    \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
5557   verifyFormat("someFunction(\"Always break between multi-line\"\n"
5558                "             \" string literals\",\n"
5559                "             and, other, parameters);");
5560   EXPECT_EQ("fun + \"1243\" /* comment */\n"
5561             "      \"5678\";",
5562             format("fun + \"1243\" /* comment */\n"
5563                    "    \"5678\";",
5564                    getLLVMStyleWithColumns(28)));
5565   EXPECT_EQ(
5566       "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
5567       "         \"aaaaaaaaaaaaaaaaaaaaa\"\n"
5568       "         \"aaaaaaaaaaaaaaaa\";",
5569       format("aaaaaa ="
5570              "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa "
5571              "aaaaaaaaaaaaaaaaaaaaa\" "
5572              "\"aaaaaaaaaaaaaaaa\";"));
5573   verifyFormat("a = a + \"a\"\n"
5574                "        \"a\"\n"
5575                "        \"a\";");
5576   verifyFormat("f(\"a\", \"b\"\n"
5577                "       \"c\");");
5578 
5579   verifyFormat(
5580       "#define LL_FORMAT \"ll\"\n"
5581       "printf(\"aaaaa: %d, bbbbbb: %\" LL_FORMAT \"d, cccccccc: %\" LL_FORMAT\n"
5582       "       \"d, ddddddddd: %\" LL_FORMAT \"d\");");
5583 
5584   verifyFormat("#define A(X)          \\\n"
5585                "  \"aaaaa\" #X \"bbbbbb\" \\\n"
5586                "  \"ccccc\"",
5587                getLLVMStyleWithColumns(23));
5588   verifyFormat("#define A \"def\"\n"
5589                "f(\"abc\" A \"ghi\"\n"
5590                "  \"jkl\");");
5591 
5592   verifyFormat("f(L\"a\"\n"
5593                "  L\"b\");");
5594   verifyFormat("#define A(X)            \\\n"
5595                "  L\"aaaaa\" #X L\"bbbbbb\" \\\n"
5596                "  L\"ccccc\"",
5597                getLLVMStyleWithColumns(25));
5598 
5599   verifyFormat("f(@\"a\"\n"
5600                "  @\"b\");");
5601   verifyFormat("NSString s = @\"a\"\n"
5602                "             @\"b\"\n"
5603                "             @\"c\";");
5604   verifyFormat("NSString s = @\"a\"\n"
5605                "              \"b\"\n"
5606                "              \"c\";");
5607 }
5608 
5609 TEST_F(FormatTest, ReturnTypeBreakingStyle) {
5610   FormatStyle Style = getLLVMStyle();
5611   // No declarations or definitions should be moved to own line.
5612   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;
5613   verifyFormat("class A {\n"
5614                "  int f() { return 1; }\n"
5615                "  int g();\n"
5616                "};\n"
5617                "int f() { return 1; }\n"
5618                "int g();\n",
5619                Style);
5620 
5621   // All declarations and definitions should have the return type moved to its
5622   // own
5623   // line.
5624   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
5625   verifyFormat("class E {\n"
5626                "  int\n"
5627                "  f() {\n"
5628                "    return 1;\n"
5629                "  }\n"
5630                "  int\n"
5631                "  g();\n"
5632                "};\n"
5633                "int\n"
5634                "f() {\n"
5635                "  return 1;\n"
5636                "}\n"
5637                "int\n"
5638                "g();\n",
5639                Style);
5640 
5641   // Top-level definitions, and no kinds of declarations should have the
5642   // return type moved to its own line.
5643   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevelDefinitions;
5644   verifyFormat("class B {\n"
5645                "  int f() { return 1; }\n"
5646                "  int g();\n"
5647                "};\n"
5648                "int\n"
5649                "f() {\n"
5650                "  return 1;\n"
5651                "}\n"
5652                "int g();\n",
5653                Style);
5654 
5655   // Top-level definitions and declarations should have the return type moved
5656   // to its own line.
5657   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_TopLevel;
5658   verifyFormat("class C {\n"
5659                "  int f() { return 1; }\n"
5660                "  int g();\n"
5661                "};\n"
5662                "int\n"
5663                "f() {\n"
5664                "  return 1;\n"
5665                "}\n"
5666                "int\n"
5667                "g();\n",
5668                Style);
5669 
5670   // All definitions should have the return type moved to its own line, but no
5671   // kinds of declarations.
5672   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
5673   verifyFormat("class D {\n"
5674                "  int\n"
5675                "  f() {\n"
5676                "    return 1;\n"
5677                "  }\n"
5678                "  int g();\n"
5679                "};\n"
5680                "int\n"
5681                "f() {\n"
5682                "  return 1;\n"
5683                "}\n"
5684                "int g();\n",
5685                Style);
5686   verifyFormat("const char *\n"
5687                "f(void) {\n" // Break here.
5688                "  return \"\";\n"
5689                "}\n"
5690                "const char *bar(void);\n", // No break here.
5691                Style);
5692   verifyFormat("template <class T>\n"
5693                "T *\n"
5694                "f(T &c) {\n" // Break here.
5695                "  return NULL;\n"
5696                "}\n"
5697                "template <class T> T *f(T &c);\n", // No break here.
5698                Style);
5699   verifyFormat("class C {\n"
5700                "  int\n"
5701                "  operator+() {\n"
5702                "    return 1;\n"
5703                "  }\n"
5704                "  int\n"
5705                "  operator()() {\n"
5706                "    return 1;\n"
5707                "  }\n"
5708                "};\n",
5709                Style);
5710   verifyFormat("void\n"
5711                "A::operator()() {}\n"
5712                "void\n"
5713                "A::operator>>() {}\n"
5714                "void\n"
5715                "A::operator+() {}\n",
5716                Style);
5717   verifyFormat("void *operator new(std::size_t s);", // No break here.
5718                Style);
5719   verifyFormat("void *\n"
5720                "operator new(std::size_t s) {}",
5721                Style);
5722   verifyFormat("void *\n"
5723                "operator delete[](void *ptr) {}",
5724                Style);
5725   Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
5726   verifyFormat("const char *\n"
5727                "f(void)\n" // Break here.
5728                "{\n"
5729                "  return \"\";\n"
5730                "}\n"
5731                "const char *bar(void);\n", // No break here.
5732                Style);
5733   verifyFormat("template <class T>\n"
5734                "T *\n"     // Problem here: no line break
5735                "f(T &c)\n" // Break here.
5736                "{\n"
5737                "  return NULL;\n"
5738                "}\n"
5739                "template <class T> T *f(T &c);\n", // No break here.
5740                Style);
5741   verifyFormat("int\n"
5742                "foo(A<bool> a)\n"
5743                "{\n"
5744                "  return a;\n"
5745                "}\n",
5746                Style);
5747   verifyFormat("int\n"
5748                "foo(A<8> a)\n"
5749                "{\n"
5750                "  return a;\n"
5751                "}\n",
5752                Style);
5753   verifyFormat("int\n"
5754                "foo(A<B<bool>, 8> a)\n"
5755                "{\n"
5756                "  return a;\n"
5757                "}\n",
5758                Style);
5759   verifyFormat("int\n"
5760                "foo(A<B<8>, bool> a)\n"
5761                "{\n"
5762                "  return a;\n"
5763                "}\n",
5764                Style);
5765   verifyFormat("int\n"
5766                "foo(A<B<bool>, bool> a)\n"
5767                "{\n"
5768                "  return a;\n"
5769                "}\n",
5770                Style);
5771   verifyFormat("int\n"
5772                "foo(A<B<8>, 8> a)\n"
5773                "{\n"
5774                "  return a;\n"
5775                "}\n",
5776                Style);
5777 
5778   Style = getGNUStyle();
5779 
5780   // Test for comments at the end of function declarations.
5781   verifyFormat("void\n"
5782                "foo (int a, /*abc*/ int b) // def\n"
5783                "{\n"
5784                "}\n",
5785                Style);
5786 
5787   verifyFormat("void\n"
5788                "foo (int a, /* abc */ int b) /* def */\n"
5789                "{\n"
5790                "}\n",
5791                Style);
5792 
5793   // Definitions that should not break after return type
5794   verifyFormat("void foo (int a, int b); // def\n", Style);
5795   verifyFormat("void foo (int a, int b); /* def */\n", Style);
5796   verifyFormat("void foo (int a, int b);\n", Style);
5797 }
5798 
5799 TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) {
5800   FormatStyle NoBreak = getLLVMStyle();
5801   NoBreak.AlwaysBreakBeforeMultilineStrings = false;
5802   FormatStyle Break = getLLVMStyle();
5803   Break.AlwaysBreakBeforeMultilineStrings = true;
5804   verifyFormat("aaaa = \"bbbb\"\n"
5805                "       \"cccc\";",
5806                NoBreak);
5807   verifyFormat("aaaa =\n"
5808                "    \"bbbb\"\n"
5809                "    \"cccc\";",
5810                Break);
5811   verifyFormat("aaaa(\"bbbb\"\n"
5812                "     \"cccc\");",
5813                NoBreak);
5814   verifyFormat("aaaa(\n"
5815                "    \"bbbb\"\n"
5816                "    \"cccc\");",
5817                Break);
5818   verifyFormat("aaaa(qqq, \"bbbb\"\n"
5819                "          \"cccc\");",
5820                NoBreak);
5821   verifyFormat("aaaa(qqq,\n"
5822                "     \"bbbb\"\n"
5823                "     \"cccc\");",
5824                Break);
5825   verifyFormat("aaaa(qqq,\n"
5826                "     L\"bbbb\"\n"
5827                "     L\"cccc\");",
5828                Break);
5829   verifyFormat("aaaaa(aaaaaa, aaaaaaa(\"aaaa\"\n"
5830                "                      \"bbbb\"));",
5831                Break);
5832   verifyFormat("string s = someFunction(\n"
5833                "    \"abc\"\n"
5834                "    \"abc\");",
5835                Break);
5836 
5837   // As we break before unary operators, breaking right after them is bad.
5838   verifyFormat("string foo = abc ? \"x\"\n"
5839                "                   \"blah blah blah blah blah blah\"\n"
5840                "                 : \"y\";",
5841                Break);
5842 
5843   // Don't break if there is no column gain.
5844   verifyFormat("f(\"aaaa\"\n"
5845                "  \"bbbb\");",
5846                Break);
5847 
5848   // Treat literals with escaped newlines like multi-line string literals.
5849   EXPECT_EQ("x = \"a\\\n"
5850             "b\\\n"
5851             "c\";",
5852             format("x = \"a\\\n"
5853                    "b\\\n"
5854                    "c\";",
5855                    NoBreak));
5856   EXPECT_EQ("xxxx =\n"
5857             "    \"a\\\n"
5858             "b\\\n"
5859             "c\";",
5860             format("xxxx = \"a\\\n"
5861                    "b\\\n"
5862                    "c\";",
5863                    Break));
5864 
5865   EXPECT_EQ("NSString *const kString =\n"
5866             "    @\"aaaa\"\n"
5867             "    @\"bbbb\";",
5868             format("NSString *const kString = @\"aaaa\"\n"
5869                    "@\"bbbb\";",
5870                    Break));
5871 
5872   Break.ColumnLimit = 0;
5873   verifyFormat("const char *hello = \"hello llvm\";", Break);
5874 }
5875 
5876 TEST_F(FormatTest, AlignsPipes) {
5877   verifyFormat(
5878       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5879       "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5880       "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5881   verifyFormat(
5882       "aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaa\n"
5883       "                     << aaaaaaaaaaaaaaaaaaaa;");
5884   verifyFormat(
5885       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5886       "                                 << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5887   verifyFormat(
5888       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()\n"
5889       "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5890   verifyFormat(
5891       "llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"\n"
5892       "                \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\"\n"
5893       "             << \"ccccccccccccccccccccccccccccccccccccccccccccccccc\";");
5894   verifyFormat(
5895       "aaaaaaaa << (aaaaaaaaaaaaaaaaaaa << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5896       "                                 << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5897       "         << aaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5898   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5899                "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5900                "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5901                "             << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
5902   verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaaaaaa: \"\n"
5903                "             << aaaaaaaaaaaaaaaaa(aaaaaaaa, aaaaaaaaaaa);");
5904   verifyFormat(
5905       "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5906       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5907   verifyFormat(
5908       "auto Diag = diag() << aaaaaaaaaaaaaaaa(aaaaaaaaaaaa, aaaaaaaaaaaaa,\n"
5909       "                                       aaaaaaaaaaaaaaaaaaaaaaaaaa);");
5910 
5911   verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \"\n"
5912                "             << aaaaaaaa.aaaaaaaaaaaa(aaa)->aaaaaaaaaaaaaa();");
5913   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5914                "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
5915                "                    aaaaaaaaaaaaaaaaaaaaa)\n"
5916                "             << aaaaaaaaaaaaaaaaaaaaaaaaaa;");
5917   verifyFormat("LOG_IF(aaa == //\n"
5918                "       bbb)\n"
5919                "    << a << b;");
5920 
5921   // But sometimes, breaking before the first "<<" is desirable.
5922   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5923                "    << aaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaa);");
5924   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbb)\n"
5925                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5926                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
5927   verifyFormat("SemaRef.Diag(Loc, diag::note_for_range_begin_end)\n"
5928                "    << BEF << IsTemplate << Description << E->getType();");
5929   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5930                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5931                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
5932   verifyFormat("Diag(aaaaaaaaaaaaaaaaaaaa, aaaaaaaa)\n"
5933                "    << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
5934                "           aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
5935                "    << aaa;");
5936 
5937   verifyFormat(
5938       "llvm::errs() << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5939       "                    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
5940 
5941   // Incomplete string literal.
5942   EXPECT_EQ("llvm::errs() << \"\n"
5943             "             << a;",
5944             format("llvm::errs() << \"\n<<a;"));
5945 
5946   verifyFormat("void f() {\n"
5947                "  CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n"
5948                "      << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n"
5949                "}");
5950 
5951   // Handle 'endl'.
5952   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << endl\n"
5953                "             << bbbbbbbbbbbbbbbbbbbbbb << endl;");
5954   verifyFormat("llvm::errs() << endl << bbbbbbbbbbbbbbbbbbbbbb << endl;");
5955 
5956   // Handle '\n'.
5957   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \"\\n\"\n"
5958                "             << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
5959   verifyFormat("llvm::errs() << aaaaaaaaaaaaaaaaaaaaaa << \'\\n\'\n"
5960                "             << bbbbbbbbbbbbbbbbbbbbbb << \'\\n\';");
5961   verifyFormat("llvm::errs() << aaaa << \"aaaaaaaaaaaaaaaaaa\\n\"\n"
5962                "             << bbbb << \"bbbbbbbbbbbbbbbbbb\\n\";");
5963   verifyFormat("llvm::errs() << \"\\n\" << bbbbbbbbbbbbbbbbbbbbbb << \"\\n\";");
5964 }
5965 
5966 TEST_F(FormatTest, KeepStringLabelValuePairsOnALine) {
5967   verifyFormat("return out << \"somepacket = {\\n\"\n"
5968                "           << \" aaaaaa = \" << pkt.aaaaaa << \"\\n\"\n"
5969                "           << \" bbbb = \" << pkt.bbbb << \"\\n\"\n"
5970                "           << \" cccccc = \" << pkt.cccccc << \"\\n\"\n"
5971                "           << \" ddd = [\" << pkt.ddd << \"]\\n\"\n"
5972                "           << \"}\";");
5973 
5974   verifyFormat("llvm::outs() << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5975                "             << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa\n"
5976                "             << \"aaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaa;");
5977   verifyFormat(
5978       "llvm::outs() << \"aaaaaaaaaaaaaaaaa = \" << aaaaaaaaaaaaaaaaa\n"
5979       "             << \"bbbbbbbbbbbbbbbbb = \" << bbbbbbbbbbbbbbbbb\n"
5980       "             << \"ccccccccccccccccc = \" << ccccccccccccccccc\n"
5981       "             << \"ddddddddddddddddd = \" << ddddddddddddddddd\n"
5982       "             << \"eeeeeeeeeeeeeeeee = \" << eeeeeeeeeeeeeeeee;");
5983   verifyFormat("llvm::outs() << aaaaaaaaaaaaaaaaaaaaaaaa << \"=\"\n"
5984                "             << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
5985   verifyFormat(
5986       "void f() {\n"
5987       "  llvm::outs() << \"aaaaaaaaaaaaaaaaaaaa: \"\n"
5988       "               << aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n"
5989       "}");
5990 
5991   // Breaking before the first "<<" is generally not desirable.
5992   verifyFormat(
5993       "llvm::errs()\n"
5994       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5995       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5996       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
5997       "    << \"aaaaaaaaaaaaaaaaaaa: \" << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
5998       getLLVMStyleWithColumns(70));
5999   verifyFormat("llvm::errs() << \"aaaaaaaaaaaaaaaaaaa: \"\n"
6000                "             << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6001                "             << \"aaaaaaaaaaaaaaaaaaa: \"\n"
6002                "             << aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6003                "             << \"aaaaaaaaaaaaaaaaaaa: \"\n"
6004                "             << aaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
6005                getLLVMStyleWithColumns(70));
6006 
6007   verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
6008                "           \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa +\n"
6009                "           \"aaaaaaaaaaaaaaaa: \" + aaaaaaaaaaaaaaaa;");
6010   verifyFormat("string v = StrCat(\"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
6011                "                  \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa,\n"
6012                "                  \"aaaaaaaaaaaaaaaa: \", aaaaaaaaaaaaaaaa);");
6013   verifyFormat("string v = \"aaaaaaaaaaaaaaaa: \" +\n"
6014                "           (aaaa + aaaa);",
6015                getLLVMStyleWithColumns(40));
6016   verifyFormat("string v = StrCat(\"aaaaaaaaaaaa: \" +\n"
6017                "                  (aaaaaaa + aaaaa));",
6018                getLLVMStyleWithColumns(40));
6019   verifyFormat(
6020       "string v = StrCat(\"aaaaaaaaaaaaaaaaaaaaaaaaaaa: \",\n"
6021       "                  SomeFunction(aaaaaaaaaaaa, aaaaaaaa.aaaaaaa),\n"
6022       "                  bbbbbbbbbbbbbbbbbbbbbbb);");
6023 }
6024 
6025 TEST_F(FormatTest, UnderstandsEquals) {
6026   verifyFormat(
6027       "aaaaaaaaaaaaaaaaa =\n"
6028       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
6029   verifyFormat(
6030       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6031       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
6032   verifyFormat(
6033       "if (a) {\n"
6034       "  f();\n"
6035       "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6036       "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
6037       "}");
6038 
6039   verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6040                "        100000000 + 10000000) {\n}");
6041 }
6042 
6043 TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
6044   verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
6045                "    .looooooooooooooooooooooooooooooooooooooongFunction();");
6046 
6047   verifyFormat("LoooooooooooooooooooooooooooooooooooooongObject\n"
6048                "    ->looooooooooooooooooooooooooooooooooooooongFunction();");
6049 
6050   verifyFormat(
6051       "LooooooooooooooooooooooooooooooooongObject->shortFunction(Parameter1,\n"
6052       "                                                          Parameter2);");
6053 
6054   verifyFormat(
6055       "ShortObject->shortFunction(\n"
6056       "    LooooooooooooooooooooooooooooooooooooooooooooooongParameter1,\n"
6057       "    LooooooooooooooooooooooooooooooooooooooooooooooongParameter2);");
6058 
6059   verifyFormat("loooooooooooooongFunction(\n"
6060                "    LoooooooooooooongObject->looooooooooooooooongFunction());");
6061 
6062   verifyFormat(
6063       "function(LoooooooooooooooooooooooooooooooooooongObject\n"
6064       "             ->loooooooooooooooooooooooooooooooooooooooongFunction());");
6065 
6066   verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
6067                "    .WillRepeatedly(Return(SomeValue));");
6068   verifyFormat("void f() {\n"
6069                "  EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n"
6070                "      .Times(2)\n"
6071                "      .WillRepeatedly(Return(SomeValue));\n"
6072                "}");
6073   verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n"
6074                "    ccccccccccccccccccccccc);");
6075   verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6076                "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6077                "          .aaaaa(aaaaa),\n"
6078                "      aaaaaaaaaaaaaaaaaaaaa);");
6079   verifyFormat("void f() {\n"
6080                "  aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6081                "      aaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa)->aaaaaaaaa());\n"
6082                "}");
6083   verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6084                "      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6085                "    .aaaaaaaaaaaaaaa(aa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6086                "                        aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6087                "                        aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
6088   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6089                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6090                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6091                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()) {\n"
6092                "}");
6093 
6094   // Here, it is not necessary to wrap at "." or "->".
6095   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n"
6096                "    aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
6097   verifyFormat(
6098       "aaaaaaaaaaa->aaaaaaaaa(\n"
6099       "    aaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6100       "    aaaaaaaaaaaaaaaaaa->aaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaa));\n");
6101 
6102   verifyFormat(
6103       "aaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6104       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa().aaaaaaaaaaaaaaaaa());");
6105   verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() *\n"
6106                "                         aaaaaaaaa()->aaaaaa()->aaaaa());");
6107   verifyFormat("a->aaaaaa()->aaaaaaaaaaa(aaaaaaaa()->aaaaaa()->aaaaa() ||\n"
6108                "                         aaaaaaaaa()->aaaaaa()->aaaaa());");
6109 
6110   verifyFormat("aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6111                "      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6112                "    .a();");
6113 
6114   FormatStyle NoBinPacking = getLLVMStyle();
6115   NoBinPacking.BinPackParameters = false;
6116   verifyFormat("aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
6117                "    .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
6118                "    .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n"
6119                "                         aaaaaaaaaaaaaaaaaaa,\n"
6120                "                         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
6121                NoBinPacking);
6122 
6123   // If there is a subsequent call, change to hanging indentation.
6124   verifyFormat(
6125       "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6126       "                         aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa))\n"
6127       "    .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
6128   verifyFormat(
6129       "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6130       "    aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa));");
6131   verifyFormat("aaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6132                "                 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6133                "                 .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
6134   verifyFormat("aaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6135                "               aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
6136                "               .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
6137 }
6138 
6139 TEST_F(FormatTest, WrapsTemplateDeclarations) {
6140   verifyFormat("template <typename T>\n"
6141                "virtual void loooooooooooongFunction(int Param1, int Param2);");
6142   verifyFormat("template <typename T>\n"
6143                "// T should be one of {A, B}.\n"
6144                "virtual void loooooooooooongFunction(int Param1, int Param2);");
6145   verifyFormat(
6146       "template <typename T>\n"
6147       "using comment_to_xml_conversion = comment_to_xml_conversion<T, int>;");
6148   verifyFormat("template <typename T>\n"
6149                "void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
6150                "       int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
6151   verifyFormat(
6152       "template <typename T>\n"
6153       "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
6154       "                                      int Paaaaaaaaaaaaaaaaaaaaram2);");
6155   verifyFormat(
6156       "template <typename T>\n"
6157       "aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaa,\n"
6158       "                    aaaaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaaaaa,\n"
6159       "                    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6160   verifyFormat("template <typename T>\n"
6161                "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6162                "    int aaaaaaaaaaaaaaaaaaaaaa);");
6163   verifyFormat(
6164       "template <typename T1, typename T2 = char, typename T3 = char,\n"
6165       "          typename T4 = char>\n"
6166       "void f();");
6167   verifyFormat("template <typename aaaaaaaaaaa, typename bbbbbbbbbbbbb,\n"
6168                "          template <typename> class cccccccccccccccccccccc,\n"
6169                "          typename ddddddddddddd>\n"
6170                "class C {};");
6171   verifyFormat(
6172       "aaaaaaaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>(\n"
6173       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6174 
6175   verifyFormat("void f() {\n"
6176                "  a<aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa>(\n"
6177                "      a(aaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaa));\n"
6178                "}");
6179 
6180   verifyFormat("template <typename T> class C {};");
6181   verifyFormat("template <typename T> void f();");
6182   verifyFormat("template <typename T> void f() {}");
6183   verifyFormat(
6184       "aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
6185       "              aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6186       "              aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> *aaaa =\n"
6187       "    new aaaaaaaaaaaaa<aaaaaaaaaa, aaaaaaaaaaa,\n"
6188       "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6189       "                      aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>(\n"
6190       "        bbbbbbbbbbbbbbbbbbbbbbbb);",
6191       getLLVMStyleWithColumns(72));
6192   EXPECT_EQ("static_cast<A< //\n"
6193             "    B> *>(\n"
6194             "\n"
6195             ");",
6196             format("static_cast<A<//\n"
6197                    "    B>*>(\n"
6198                    "\n"
6199                    "    );"));
6200   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6201                "    const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);");
6202 
6203   FormatStyle AlwaysBreak = getLLVMStyle();
6204   AlwaysBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes;
6205   verifyFormat("template <typename T>\nclass C {};", AlwaysBreak);
6206   verifyFormat("template <typename T>\nvoid f();", AlwaysBreak);
6207   verifyFormat("template <typename T>\nvoid f() {}", AlwaysBreak);
6208   verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6209                "                         bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
6210                "    ccccccccccccccccccccccccccccccccccccccccccccccc);");
6211   verifyFormat("template <template <typename> class Fooooooo,\n"
6212                "          template <typename> class Baaaaaaar>\n"
6213                "struct C {};",
6214                AlwaysBreak);
6215   verifyFormat("template <typename T> // T can be A, B or C.\n"
6216                "struct C {};",
6217                AlwaysBreak);
6218   verifyFormat("template <enum E> class A {\n"
6219                "public:\n"
6220                "  E *f();\n"
6221                "};");
6222 
6223   FormatStyle NeverBreak = getLLVMStyle();
6224   NeverBreak.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_No;
6225   verifyFormat("template <typename T> class C {};", NeverBreak);
6226   verifyFormat("template <typename T> void f();", NeverBreak);
6227   verifyFormat("template <typename T> void f() {}", NeverBreak);
6228   verifyFormat("template <typename T>\nvoid foo(aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbb) {}",
6229                NeverBreak);
6230   verifyFormat("void aaaaaaaaaaaaaaaaaaa<aaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6231                "                         bbbbbbbbbbbbbbbbbbbbbbbbbbbb>(\n"
6232                "    ccccccccccccccccccccccccccccccccccccccccccccccc);",
6233                NeverBreak);
6234   verifyFormat("template <template <typename> class Fooooooo,\n"
6235                "          template <typename> class Baaaaaaar>\n"
6236                "struct C {};",
6237                NeverBreak);
6238   verifyFormat("template <typename T> // T can be A, B or C.\n"
6239                "struct C {};",
6240                NeverBreak);
6241   verifyFormat("template <enum E> class A {\n"
6242                "public:\n"
6243                "  E *f();\n"
6244                "};", NeverBreak);
6245   NeverBreak.PenaltyBreakTemplateDeclaration = 100;
6246   verifyFormat("template <typename T> void\nfoo(aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbb) {}",
6247                NeverBreak);
6248 }
6249 
6250 TEST_F(FormatTest, WrapsTemplateDeclarationsWithComments) {
6251   FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp);
6252   Style.ColumnLimit = 60;
6253   EXPECT_EQ("// Baseline - no comments.\n"
6254             "template <\n"
6255             "    typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n"
6256             "void f() {}",
6257             format("// Baseline - no comments.\n"
6258                    "template <\n"
6259                    "    typename aaaaaaaaaaaaaaaaaaaaaa<bbbbbbbbbbbb>::value>\n"
6260                    "void f() {}",
6261                    Style));
6262 
6263   EXPECT_EQ("template <\n"
6264             "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value>  // trailing\n"
6265             "void f() {}",
6266             format("template <\n"
6267                    "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n"
6268                    "void f() {}",
6269                    Style));
6270 
6271   EXPECT_EQ(
6272       "template <\n"
6273       "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value> /* line */\n"
6274       "void f() {}",
6275       format("template <typename aaaaaaaaaa<bbbbbbbbbbbb>::value>  /* line */\n"
6276              "void f() {}",
6277              Style));
6278 
6279   EXPECT_EQ(
6280       "template <\n"
6281       "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value>  // trailing\n"
6282       "                                               // multiline\n"
6283       "void f() {}",
6284       format("template <\n"
6285              "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing\n"
6286              "                                              // multiline\n"
6287              "void f() {}",
6288              Style));
6289 
6290   EXPECT_EQ(
6291       "template <typename aaaaaaaaaa<\n"
6292       "    bbbbbbbbbbbb>::value>  // trailing loooong\n"
6293       "void f() {}",
6294       format(
6295           "template <\n"
6296           "    typename aaaaaaaaaa<bbbbbbbbbbbb>::value> // trailing loooong\n"
6297           "void f() {}",
6298           Style));
6299 }
6300 
6301 TEST_F(FormatTest, WrapsTemplateParameters) {
6302   FormatStyle Style = getLLVMStyle();
6303   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
6304   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
6305   verifyFormat(
6306       "template <typename... a> struct q {};\n"
6307       "extern q<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
6308       "    aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
6309       "    y;",
6310       Style);
6311   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
6312   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
6313   verifyFormat(
6314       "template <typename... a> struct r {};\n"
6315       "extern r<aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa,\n"
6316       "    aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa>\n"
6317       "    y;",
6318       Style);
6319   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
6320   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
6321   verifyFormat(
6322       "template <typename... a> struct s {};\n"
6323       "extern s<\n"
6324       "    aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
6325       "    aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
6326       "    y;",
6327       Style);
6328   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
6329   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
6330   verifyFormat(
6331       "template <typename... a> struct t {};\n"
6332       "extern t<\n"
6333       "    aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa,\n"
6334       "    aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaa>\n"
6335       "    y;",
6336       Style);
6337 }
6338 
6339 TEST_F(FormatTest, WrapsAtNestedNameSpecifiers) {
6340   verifyFormat(
6341       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6342       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
6343   verifyFormat(
6344       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6345       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6346       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa());");
6347 
6348   // FIXME: Should we have the extra indent after the second break?
6349   verifyFormat(
6350       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6351       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6352       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
6353 
6354   verifyFormat(
6355       "aaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb::\n"
6356       "                    cccccccccccccccccccccccccccccccccccccccccccccc());");
6357 
6358   // Breaking at nested name specifiers is generally not desirable.
6359   verifyFormat(
6360       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6361       "    aaaaaaaaaaaaaaaaaaaaaaa);");
6362 
6363   verifyFormat(
6364       "aaaaaaaaaaaaaaaaaa(aaaaaaaa,\n"
6365       "                   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6366       "                       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
6367       "                   aaaaaaaaaaaaaaaaaaaaa);",
6368       getLLVMStyleWithColumns(74));
6369 
6370   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa::\n"
6371                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6372                "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
6373 }
6374 
6375 TEST_F(FormatTest, UnderstandsTemplateParameters) {
6376   verifyFormat("A<int> a;");
6377   verifyFormat("A<A<A<int>>> a;");
6378   verifyFormat("A<A<A<int, 2>, 3>, 4> a;");
6379   verifyFormat("bool x = a < 1 || 2 > a;");
6380   verifyFormat("bool x = 5 < f<int>();");
6381   verifyFormat("bool x = f<int>() > 5;");
6382   verifyFormat("bool x = 5 < a<int>::x;");
6383   verifyFormat("bool x = a < 4 ? a > 2 : false;");
6384   verifyFormat("bool x = f() ? a < 2 : a > 2;");
6385 
6386   verifyGoogleFormat("A<A<int>> a;");
6387   verifyGoogleFormat("A<A<A<int>>> a;");
6388   verifyGoogleFormat("A<A<A<A<int>>>> a;");
6389   verifyGoogleFormat("A<A<int> > a;");
6390   verifyGoogleFormat("A<A<A<int> > > a;");
6391   verifyGoogleFormat("A<A<A<A<int> > > > a;");
6392   verifyGoogleFormat("A<::A<int>> a;");
6393   verifyGoogleFormat("A<::A> a;");
6394   verifyGoogleFormat("A< ::A> a;");
6395   verifyGoogleFormat("A< ::A<int> > a;");
6396   EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A> >> a;", getGoogleStyle()));
6397   EXPECT_EQ("A<A<A<A>>> a;", format("A<A<A<A>> > a;", getGoogleStyle()));
6398   EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle()));
6399   EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle()));
6400   EXPECT_EQ("auto x = [] { A<A<A<A>>> a; };",
6401             format("auto x=[]{A<A<A<A> >> a;};", getGoogleStyle()));
6402 
6403   verifyFormat("A<A>> a;", getChromiumStyle(FormatStyle::LK_Cpp));
6404 
6405   verifyFormat("test >> a >> b;");
6406   verifyFormat("test << a >> b;");
6407 
6408   verifyFormat("f<int>();");
6409   verifyFormat("template <typename T> void f() {}");
6410   verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;");
6411   verifyFormat("struct A<std::enable_if<sizeof(T2) ? sizeof(int32) : "
6412                "sizeof(char)>::type>;");
6413   verifyFormat("template <class T> struct S<std::is_arithmetic<T>{}> {};");
6414   verifyFormat("f(a.operator()<A>());");
6415   verifyFormat("f(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6416                "      .template operator()<A>());",
6417                getLLVMStyleWithColumns(35));
6418 
6419   // Not template parameters.
6420   verifyFormat("return a < b && c > d;");
6421   verifyFormat("void f() {\n"
6422                "  while (a < b && c > d) {\n"
6423                "  }\n"
6424                "}");
6425   verifyFormat("template <typename... Types>\n"
6426                "typename enable_if<0 < sizeof...(Types)>::type Foo() {}");
6427 
6428   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6429                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);",
6430                getLLVMStyleWithColumns(60));
6431   verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");");
6432   verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}");
6433   verifyFormat("< < < < < < < < < < < < < < < < < < < < < < < < < < < < < <");
6434 }
6435 
6436 TEST_F(FormatTest, BitshiftOperatorWidth) {
6437   EXPECT_EQ("int a = 1 << 2; /* foo\n"
6438             "                   bar */",
6439             format("int    a=1<<2;  /* foo\n"
6440                    "                   bar */"));
6441 
6442   EXPECT_EQ("int b = 256 >> 1; /* foo\n"
6443             "                     bar */",
6444             format("int  b  =256>>1 ;  /* foo\n"
6445                    "                      bar */"));
6446 }
6447 
6448 TEST_F(FormatTest, UnderstandsBinaryOperators) {
6449   verifyFormat("COMPARE(a, ==, b);");
6450   verifyFormat("auto s = sizeof...(Ts) - 1;");
6451 }
6452 
6453 TEST_F(FormatTest, UnderstandsPointersToMembers) {
6454   verifyFormat("int A::*x;");
6455   verifyFormat("int (S::*func)(void *);");
6456   verifyFormat("void f() { int (S::*func)(void *); }");
6457   verifyFormat("typedef bool *(Class::*Member)() const;");
6458   verifyFormat("void f() {\n"
6459                "  (a->*f)();\n"
6460                "  a->*x;\n"
6461                "  (a.*f)();\n"
6462                "  ((*a).*f)();\n"
6463                "  a.*x;\n"
6464                "}");
6465   verifyFormat("void f() {\n"
6466                "  (a->*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
6467                "      aaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);\n"
6468                "}");
6469   verifyFormat(
6470       "(aaaaaaaaaa->*bbbbbbb)(\n"
6471       "    aaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa));");
6472   FormatStyle Style = getLLVMStyle();
6473   Style.PointerAlignment = FormatStyle::PAS_Left;
6474   verifyFormat("typedef bool* (Class::*Member)() const;", Style);
6475 }
6476 
6477 TEST_F(FormatTest, UnderstandsUnaryOperators) {
6478   verifyFormat("int a = -2;");
6479   verifyFormat("f(-1, -2, -3);");
6480   verifyFormat("a[-1] = 5;");
6481   verifyFormat("int a = 5 + -2;");
6482   verifyFormat("if (i == -1) {\n}");
6483   verifyFormat("if (i != -1) {\n}");
6484   verifyFormat("if (i > -1) {\n}");
6485   verifyFormat("if (i < -1) {\n}");
6486   verifyFormat("++(a->f());");
6487   verifyFormat("--(a->f());");
6488   verifyFormat("(a->f())++;");
6489   verifyFormat("a[42]++;");
6490   verifyFormat("if (!(a->f())) {\n}");
6491   verifyFormat("if (!+i) {\n}");
6492   verifyFormat("~&a;");
6493 
6494   verifyFormat("a-- > b;");
6495   verifyFormat("b ? -a : c;");
6496   verifyFormat("n * sizeof char16;");
6497   verifyFormat("n * alignof char16;", getGoogleStyle());
6498   verifyFormat("sizeof(char);");
6499   verifyFormat("alignof(char);", getGoogleStyle());
6500 
6501   verifyFormat("return -1;");
6502   verifyFormat("switch (a) {\n"
6503                "case -1:\n"
6504                "  break;\n"
6505                "}");
6506   verifyFormat("#define X -1");
6507   verifyFormat("#define X -kConstant");
6508 
6509   verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {-5, +3};");
6510   verifyFormat("const NSPoint kBrowserFrameViewPatternOffset = {+5, -3};");
6511 
6512   verifyFormat("int a = /* confusing comment */ -1;");
6513   // FIXME: The space after 'i' is wrong, but hopefully, this is a rare case.
6514   verifyFormat("int a = i /* confusing comment */++;");
6515 }
6516 
6517 TEST_F(FormatTest, DoesNotIndentRelativeToUnaryOperators) {
6518   verifyFormat("if (!aaaaaaaaaa( // break\n"
6519                "        aaaaa)) {\n"
6520                "}");
6521   verifyFormat("aaaaaaaaaa(!aaaaaaaaaa( // break\n"
6522                "    aaaaa));");
6523   verifyFormat("*aaa = aaaaaaa( // break\n"
6524                "    bbbbbb);");
6525 }
6526 
6527 TEST_F(FormatTest, UnderstandsOverloadedOperators) {
6528   verifyFormat("bool operator<();");
6529   verifyFormat("bool operator>();");
6530   verifyFormat("bool operator=();");
6531   verifyFormat("bool operator==();");
6532   verifyFormat("bool operator!=();");
6533   verifyFormat("int operator+();");
6534   verifyFormat("int operator++();");
6535   verifyFormat("int operator++(int) volatile noexcept;");
6536   verifyFormat("bool operator,();");
6537   verifyFormat("bool operator();");
6538   verifyFormat("bool operator()();");
6539   verifyFormat("bool operator[]();");
6540   verifyFormat("operator bool();");
6541   verifyFormat("operator int();");
6542   verifyFormat("operator void *();");
6543   verifyFormat("operator SomeType<int>();");
6544   verifyFormat("operator SomeType<int, int>();");
6545   verifyFormat("operator SomeType<SomeType<int>>();");
6546   verifyFormat("void *operator new(std::size_t size);");
6547   verifyFormat("void *operator new[](std::size_t size);");
6548   verifyFormat("void operator delete(void *ptr);");
6549   verifyFormat("void operator delete[](void *ptr);");
6550   verifyFormat("template <typename AAAAAAA, typename BBBBBBB>\n"
6551                "AAAAAAA operator/(const AAAAAAA &a, BBBBBBB &b);");
6552   verifyFormat("aaaaaaaaaaaaaaaaaaaaaa operator,(\n"
6553                "    aaaaaaaaaaaaaaaaaaaaa &aaaaaaaaaaaaaaaaaaaaaaaaaa) const;");
6554 
6555   verifyFormat(
6556       "ostream &operator<<(ostream &OutputStream,\n"
6557       "                    SomeReallyLongType WithSomeReallyLongValue);");
6558   verifyFormat("bool operator<(const aaaaaaaaaaaaaaaaaaaaa &left,\n"
6559                "               const aaaaaaaaaaaaaaaaaaaaa &right) {\n"
6560                "  return left.group < right.group;\n"
6561                "}");
6562   verifyFormat("SomeType &operator=(const SomeType &S);");
6563   verifyFormat("f.template operator()<int>();");
6564 
6565   verifyGoogleFormat("operator void*();");
6566   verifyGoogleFormat("operator SomeType<SomeType<int>>();");
6567   verifyGoogleFormat("operator ::A();");
6568 
6569   verifyFormat("using A::operator+;");
6570   verifyFormat("inline A operator^(const A &lhs, const A &rhs) {}\n"
6571                "int i;");
6572 }
6573 
6574 TEST_F(FormatTest, UnderstandsFunctionRefQualification) {
6575   verifyFormat("Deleted &operator=(const Deleted &) & = default;");
6576   verifyFormat("Deleted &operator=(const Deleted &) && = delete;");
6577   verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;");
6578   verifyFormat("SomeType MemberFunction(const Deleted &) && = delete;");
6579   verifyFormat("Deleted &operator=(const Deleted &) &;");
6580   verifyFormat("Deleted &operator=(const Deleted &) &&;");
6581   verifyFormat("SomeType MemberFunction(const Deleted &) &;");
6582   verifyFormat("SomeType MemberFunction(const Deleted &) &&;");
6583   verifyFormat("SomeType MemberFunction(const Deleted &) && {}");
6584   verifyFormat("SomeType MemberFunction(const Deleted &) && final {}");
6585   verifyFormat("SomeType MemberFunction(const Deleted &) && override {}");
6586   verifyFormat("void Fn(T const &) const &;");
6587   verifyFormat("void Fn(T const volatile &&) const volatile &&;");
6588   verifyFormat("template <typename T>\n"
6589                "void F(T) && = delete;",
6590                getGoogleStyle());
6591 
6592   FormatStyle AlignLeft = getLLVMStyle();
6593   AlignLeft.PointerAlignment = FormatStyle::PAS_Left;
6594   verifyFormat("void A::b() && {}", AlignLeft);
6595   verifyFormat("Deleted& operator=(const Deleted&) & = default;", AlignLeft);
6596   verifyFormat("SomeType MemberFunction(const Deleted&) & = delete;",
6597                AlignLeft);
6598   verifyFormat("Deleted& operator=(const Deleted&) &;", AlignLeft);
6599   verifyFormat("SomeType MemberFunction(const Deleted&) &;", AlignLeft);
6600   verifyFormat("auto Function(T t) & -> void {}", AlignLeft);
6601   verifyFormat("auto Function(T... t) & -> void {}", AlignLeft);
6602   verifyFormat("auto Function(T) & -> void {}", AlignLeft);
6603   verifyFormat("auto Function(T) & -> void;", AlignLeft);
6604   verifyFormat("void Fn(T const&) const&;", AlignLeft);
6605   verifyFormat("void Fn(T const volatile&&) const volatile&&;", AlignLeft);
6606 
6607   FormatStyle Spaces = getLLVMStyle();
6608   Spaces.SpacesInCStyleCastParentheses = true;
6609   verifyFormat("Deleted &operator=(const Deleted &) & = default;", Spaces);
6610   verifyFormat("SomeType MemberFunction(const Deleted &) & = delete;", Spaces);
6611   verifyFormat("Deleted &operator=(const Deleted &) &;", Spaces);
6612   verifyFormat("SomeType MemberFunction(const Deleted &) &;", Spaces);
6613 
6614   Spaces.SpacesInCStyleCastParentheses = false;
6615   Spaces.SpacesInParentheses = true;
6616   verifyFormat("Deleted &operator=( const Deleted & ) & = default;", Spaces);
6617   verifyFormat("SomeType MemberFunction( const Deleted & ) & = delete;", Spaces);
6618   verifyFormat("Deleted &operator=( const Deleted & ) &;", Spaces);
6619   verifyFormat("SomeType MemberFunction( const Deleted & ) &;", Spaces);
6620 }
6621 
6622 TEST_F(FormatTest, UnderstandsNewAndDelete) {
6623   verifyFormat("void f() {\n"
6624                "  A *a = new A;\n"
6625                "  A *a = new (placement) A;\n"
6626                "  delete a;\n"
6627                "  delete (A *)a;\n"
6628                "}");
6629   verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
6630                "    typename aaaaaaaaaaaaaaaaaaaaaaaa();");
6631   verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
6632                "    new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n"
6633                "        typename aaaaaaaaaaaaaaaaaaaaaaaa();");
6634   verifyFormat("delete[] h->p;");
6635 }
6636 
6637 TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) {
6638   verifyFormat("int *f(int *a) {}");
6639   verifyFormat("int main(int argc, char **argv) {}");
6640   verifyFormat("Test::Test(int b) : a(b * b) {}");
6641   verifyIndependentOfContext("f(a, *a);");
6642   verifyFormat("void g() { f(*a); }");
6643   verifyIndependentOfContext("int a = b * 10;");
6644   verifyIndependentOfContext("int a = 10 * b;");
6645   verifyIndependentOfContext("int a = b * c;");
6646   verifyIndependentOfContext("int a += b * c;");
6647   verifyIndependentOfContext("int a -= b * c;");
6648   verifyIndependentOfContext("int a *= b * c;");
6649   verifyIndependentOfContext("int a /= b * c;");
6650   verifyIndependentOfContext("int a = *b;");
6651   verifyIndependentOfContext("int a = *b * c;");
6652   verifyIndependentOfContext("int a = b * *c;");
6653   verifyIndependentOfContext("int a = b * (10);");
6654   verifyIndependentOfContext("S << b * (10);");
6655   verifyIndependentOfContext("return 10 * b;");
6656   verifyIndependentOfContext("return *b * *c;");
6657   verifyIndependentOfContext("return a & ~b;");
6658   verifyIndependentOfContext("f(b ? *c : *d);");
6659   verifyIndependentOfContext("int a = b ? *c : *d;");
6660   verifyIndependentOfContext("*b = a;");
6661   verifyIndependentOfContext("a * ~b;");
6662   verifyIndependentOfContext("a * !b;");
6663   verifyIndependentOfContext("a * +b;");
6664   verifyIndependentOfContext("a * -b;");
6665   verifyIndependentOfContext("a * ++b;");
6666   verifyIndependentOfContext("a * --b;");
6667   verifyIndependentOfContext("a[4] * b;");
6668   verifyIndependentOfContext("a[a * a] = 1;");
6669   verifyIndependentOfContext("f() * b;");
6670   verifyIndependentOfContext("a * [self dostuff];");
6671   verifyIndependentOfContext("int x = a * (a + b);");
6672   verifyIndependentOfContext("(a *)(a + b);");
6673   verifyIndependentOfContext("*(int *)(p & ~3UL) = 0;");
6674   verifyIndependentOfContext("int *pa = (int *)&a;");
6675   verifyIndependentOfContext("return sizeof(int **);");
6676   verifyIndependentOfContext("return sizeof(int ******);");
6677   verifyIndependentOfContext("return (int **&)a;");
6678   verifyIndependentOfContext("f((*PointerToArray)[10]);");
6679   verifyFormat("void f(Type (*parameter)[10]) {}");
6680   verifyFormat("void f(Type (&parameter)[10]) {}");
6681   verifyGoogleFormat("return sizeof(int**);");
6682   verifyIndependentOfContext("Type **A = static_cast<Type **>(P);");
6683   verifyGoogleFormat("Type** A = static_cast<Type**>(P);");
6684   verifyFormat("auto a = [](int **&, int ***) {};");
6685   verifyFormat("auto PointerBinding = [](const char *S) {};");
6686   verifyFormat("typedef typeof(int(int, int)) *MyFunc;");
6687   verifyFormat("[](const decltype(*a) &value) {}");
6688   verifyFormat("decltype(a * b) F();");
6689   verifyFormat("#define MACRO() [](A *a) { return 1; }");
6690   verifyFormat("Constructor() : member([](A *a, B *b) {}) {}");
6691   verifyIndependentOfContext("typedef void (*f)(int *a);");
6692   verifyIndependentOfContext("int i{a * b};");
6693   verifyIndependentOfContext("aaa && aaa->f();");
6694   verifyIndependentOfContext("int x = ~*p;");
6695   verifyFormat("Constructor() : a(a), area(width * height) {}");
6696   verifyFormat("Constructor() : a(a), area(a, width * height) {}");
6697   verifyGoogleFormat("MACRO Constructor(const int& i) : a(a), b(b) {}");
6698   verifyFormat("void f() { f(a, c * d); }");
6699   verifyFormat("void f() { f(new a(), c * d); }");
6700   verifyFormat("void f(const MyOverride &override);");
6701   verifyFormat("void f(const MyFinal &final);");
6702   verifyIndependentOfContext("bool a = f() && override.f();");
6703   verifyIndependentOfContext("bool a = f() && final.f();");
6704 
6705   verifyIndependentOfContext("InvalidRegions[*R] = 0;");
6706 
6707   verifyIndependentOfContext("A<int *> a;");
6708   verifyIndependentOfContext("A<int **> a;");
6709   verifyIndependentOfContext("A<int *, int *> a;");
6710   verifyIndependentOfContext("A<int *[]> a;");
6711   verifyIndependentOfContext(
6712       "const char *const p = reinterpret_cast<const char *const>(q);");
6713   verifyIndependentOfContext("A<int **, int **> a;");
6714   verifyIndependentOfContext("void f(int *a = d * e, int *b = c * d);");
6715   verifyFormat("for (char **a = b; *a; ++a) {\n}");
6716   verifyFormat("for (; a && b;) {\n}");
6717   verifyFormat("bool foo = true && [] { return false; }();");
6718 
6719   verifyFormat(
6720       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
6721       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
6722 
6723   verifyGoogleFormat("int const* a = &b;");
6724   verifyGoogleFormat("**outparam = 1;");
6725   verifyGoogleFormat("*outparam = a * b;");
6726   verifyGoogleFormat("int main(int argc, char** argv) {}");
6727   verifyGoogleFormat("A<int*> a;");
6728   verifyGoogleFormat("A<int**> a;");
6729   verifyGoogleFormat("A<int*, int*> a;");
6730   verifyGoogleFormat("A<int**, int**> a;");
6731   verifyGoogleFormat("f(b ? *c : *d);");
6732   verifyGoogleFormat("int a = b ? *c : *d;");
6733   verifyGoogleFormat("Type* t = **x;");
6734   verifyGoogleFormat("Type* t = *++*x;");
6735   verifyGoogleFormat("*++*x;");
6736   verifyGoogleFormat("Type* t = const_cast<T*>(&*x);");
6737   verifyGoogleFormat("Type* t = x++ * y;");
6738   verifyGoogleFormat(
6739       "const char* const p = reinterpret_cast<const char* const>(q);");
6740   verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);");
6741   verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);");
6742   verifyGoogleFormat("template <typename T>\n"
6743                      "void f(int i = 0, SomeType** temps = NULL);");
6744 
6745   FormatStyle Left = getLLVMStyle();
6746   Left.PointerAlignment = FormatStyle::PAS_Left;
6747   verifyFormat("x = *a(x) = *a(y);", Left);
6748   verifyFormat("for (;; *a = b) {\n}", Left);
6749   verifyFormat("return *this += 1;", Left);
6750   verifyFormat("throw *x;", Left);
6751   verifyFormat("delete *x;", Left);
6752   verifyFormat("typedef typeof(int(int, int))* MyFuncPtr;", Left);
6753   verifyFormat("[](const decltype(*a)* ptr) {}", Left);
6754   verifyFormat("typedef typeof /*comment*/ (int(int, int))* MyFuncPtr;", Left);
6755 
6756   verifyIndependentOfContext("a = *(x + y);");
6757   verifyIndependentOfContext("a = &(x + y);");
6758   verifyIndependentOfContext("*(x + y).call();");
6759   verifyIndependentOfContext("&(x + y)->call();");
6760   verifyFormat("void f() { &(*I).first; }");
6761 
6762   verifyIndependentOfContext("f(b * /* confusing comment */ ++c);");
6763   verifyFormat(
6764       "int *MyValues = {\n"
6765       "    *A, // Operator detection might be confused by the '{'\n"
6766       "    *BB // Operator detection might be confused by previous comment\n"
6767       "};");
6768 
6769   verifyIndependentOfContext("if (int *a = &b)");
6770   verifyIndependentOfContext("if (int &a = *b)");
6771   verifyIndependentOfContext("if (a & b[i])");
6772   verifyIndependentOfContext("if (a::b::c::d & b[i])");
6773   verifyIndependentOfContext("if (*b[i])");
6774   verifyIndependentOfContext("if (int *a = (&b))");
6775   verifyIndependentOfContext("while (int *a = &b)");
6776   verifyIndependentOfContext("size = sizeof *a;");
6777   verifyIndependentOfContext("if (a && (b = c))");
6778   verifyFormat("void f() {\n"
6779                "  for (const int &v : Values) {\n"
6780                "  }\n"
6781                "}");
6782   verifyFormat("for (int i = a * a; i < 10; ++i) {\n}");
6783   verifyFormat("for (int i = 0; i < a * a; ++i) {\n}");
6784   verifyGoogleFormat("for (int i = 0; i * 2 < z; i *= 2) {\n}");
6785 
6786   verifyFormat("#define A (!a * b)");
6787   verifyFormat("#define MACRO     \\\n"
6788                "  int *i = a * b; \\\n"
6789                "  void f(a *b);",
6790                getLLVMStyleWithColumns(19));
6791 
6792   verifyIndependentOfContext("A = new SomeType *[Length];");
6793   verifyIndependentOfContext("A = new SomeType *[Length]();");
6794   verifyIndependentOfContext("T **t = new T *;");
6795   verifyIndependentOfContext("T **t = new T *();");
6796   verifyGoogleFormat("A = new SomeType*[Length]();");
6797   verifyGoogleFormat("A = new SomeType*[Length];");
6798   verifyGoogleFormat("T** t = new T*;");
6799   verifyGoogleFormat("T** t = new T*();");
6800 
6801   verifyFormat("STATIC_ASSERT((a & b) == 0);");
6802   verifyFormat("STATIC_ASSERT(0 == (a & b));");
6803   verifyFormat("template <bool a, bool b> "
6804                "typename t::if<x && y>::type f() {}");
6805   verifyFormat("template <int *y> f() {}");
6806   verifyFormat("vector<int *> v;");
6807   verifyFormat("vector<int *const> v;");
6808   verifyFormat("vector<int *const **const *> v;");
6809   verifyFormat("vector<int *volatile> v;");
6810   verifyFormat("vector<a * b> v;");
6811   verifyFormat("foo<b && false>();");
6812   verifyFormat("foo<b & 1>();");
6813   verifyFormat("decltype(*::std::declval<const T &>()) void F();");
6814   verifyFormat(
6815       "template <class T, class = typename std::enable_if<\n"
6816       "                       std::is_integral<T>::value &&\n"
6817       "                       (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n"
6818       "void F();",
6819       getLLVMStyleWithColumns(70));
6820   verifyFormat(
6821       "template <class T,\n"
6822       "          class = typename std::enable_if<\n"
6823       "              std::is_integral<T>::value &&\n"
6824       "              (sizeof(T) > 1 || sizeof(T) < 8)>::type,\n"
6825       "          class U>\n"
6826       "void F();",
6827       getLLVMStyleWithColumns(70));
6828   verifyFormat(
6829       "template <class T,\n"
6830       "          class = typename ::std::enable_if<\n"
6831       "              ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n"
6832       "void F();",
6833       getGoogleStyleWithColumns(68));
6834 
6835   verifyIndependentOfContext("MACRO(int *i);");
6836   verifyIndependentOfContext("MACRO(auto *a);");
6837   verifyIndependentOfContext("MACRO(const A *a);");
6838   verifyIndependentOfContext("MACRO(A *const a);");
6839   verifyIndependentOfContext("MACRO('0' <= c && c <= '9');");
6840   verifyFormat("void f() { f(float{1}, a * a); }");
6841   // FIXME: Is there a way to make this work?
6842   // verifyIndependentOfContext("MACRO(A *a);");
6843 
6844   verifyFormat("DatumHandle const *operator->() const { return input_; }");
6845   verifyFormat("return options != nullptr && operator==(*options);");
6846 
6847   EXPECT_EQ("#define OP(x)                                    \\\n"
6848             "  ostream &operator<<(ostream &s, const A &a) {  \\\n"
6849             "    return s << a.DebugString();                 \\\n"
6850             "  }",
6851             format("#define OP(x) \\\n"
6852                    "  ostream &operator<<(ostream &s, const A &a) { \\\n"
6853                    "    return s << a.DebugString(); \\\n"
6854                    "  }",
6855                    getLLVMStyleWithColumns(50)));
6856 
6857   // FIXME: We cannot handle this case yet; we might be able to figure out that
6858   // foo<x> d > v; doesn't make sense.
6859   verifyFormat("foo<a<b && c> d> v;");
6860 
6861   FormatStyle PointerMiddle = getLLVMStyle();
6862   PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
6863   verifyFormat("delete *x;", PointerMiddle);
6864   verifyFormat("int * x;", PointerMiddle);
6865   verifyFormat("int *[] x;", PointerMiddle);
6866   verifyFormat("template <int * y> f() {}", PointerMiddle);
6867   verifyFormat("int * f(int * a) {}", PointerMiddle);
6868   verifyFormat("int main(int argc, char ** argv) {}", PointerMiddle);
6869   verifyFormat("Test::Test(int b) : a(b * b) {}", PointerMiddle);
6870   verifyFormat("A<int *> a;", PointerMiddle);
6871   verifyFormat("A<int **> a;", PointerMiddle);
6872   verifyFormat("A<int *, int *> a;", PointerMiddle);
6873   verifyFormat("A<int *[]> a;", PointerMiddle);
6874   verifyFormat("A = new SomeType *[Length]();", PointerMiddle);
6875   verifyFormat("A = new SomeType *[Length];", PointerMiddle);
6876   verifyFormat("T ** t = new T *;", PointerMiddle);
6877 
6878   // Member function reference qualifiers aren't binary operators.
6879   verifyFormat("string // break\n"
6880                "operator()() & {}");
6881   verifyFormat("string // break\n"
6882                "operator()() && {}");
6883   verifyGoogleFormat("template <typename T>\n"
6884                      "auto x() & -> int {}");
6885 }
6886 
6887 TEST_F(FormatTest, UnderstandsAttributes) {
6888   verifyFormat("SomeType s __attribute__((unused)) (InitValue);");
6889   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n"
6890                "aaaaaaaaaaaaaaaaaaaaaaa(int i);");
6891   FormatStyle AfterType = getLLVMStyle();
6892   AfterType.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
6893   verifyFormat("__attribute__((nodebug)) void\n"
6894                "foo() {}\n",
6895                AfterType);
6896 }
6897 
6898 TEST_F(FormatTest, UnderstandsSquareAttributes) {
6899   verifyFormat("SomeType s [[unused]] (InitValue);");
6900   verifyFormat("SomeType s [[gnu::unused]] (InitValue);");
6901   verifyFormat("SomeType s [[using gnu: unused]] (InitValue);");
6902   verifyFormat("[[gsl::suppress(\"clang-tidy-check-name\")]] void f() {}");
6903   verifyFormat("void f() [[deprecated(\"so sorry\")]];");
6904   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
6905                "    [[unused]] aaaaaaaaaaaaaaaaaaaaaaa(int i);");
6906 
6907   // Make sure we do not mistake attributes for array subscripts.
6908   verifyFormat("int a() {}\n"
6909                "[[unused]] int b() {}\n");
6910   verifyFormat("NSArray *arr;\n"
6911                "arr[[Foo() bar]];");
6912 
6913   // On the other hand, we still need to correctly find array subscripts.
6914   verifyFormat("int a = std::vector<int>{1, 2, 3}[0];");
6915 
6916   // Make sure we do not parse attributes as lambda introducers.
6917   FormatStyle MultiLineFunctions = getLLVMStyle();
6918   MultiLineFunctions.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
6919   verifyFormat("[[unused]] int b() {\n"
6920                "  return 42;\n"
6921                "}\n",
6922                MultiLineFunctions);
6923 }
6924 
6925 TEST_F(FormatTest, UnderstandsEllipsis) {
6926   verifyFormat("int printf(const char *fmt, ...);");
6927   verifyFormat("template <class... Ts> void Foo(Ts... ts) { Foo(ts...); }");
6928   verifyFormat("template <class... Ts> void Foo(Ts *... ts) {}");
6929 
6930   FormatStyle PointersLeft = getLLVMStyle();
6931   PointersLeft.PointerAlignment = FormatStyle::PAS_Left;
6932   verifyFormat("template <class... Ts> void Foo(Ts*... ts) {}", PointersLeft);
6933 }
6934 
6935 TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) {
6936   EXPECT_EQ("int *a;\n"
6937             "int *a;\n"
6938             "int *a;",
6939             format("int *a;\n"
6940                    "int* a;\n"
6941                    "int *a;",
6942                    getGoogleStyle()));
6943   EXPECT_EQ("int* a;\n"
6944             "int* a;\n"
6945             "int* a;",
6946             format("int* a;\n"
6947                    "int* a;\n"
6948                    "int *a;",
6949                    getGoogleStyle()));
6950   EXPECT_EQ("int *a;\n"
6951             "int *a;\n"
6952             "int *a;",
6953             format("int *a;\n"
6954                    "int * a;\n"
6955                    "int *  a;",
6956                    getGoogleStyle()));
6957   EXPECT_EQ("auto x = [] {\n"
6958             "  int *a;\n"
6959             "  int *a;\n"
6960             "  int *a;\n"
6961             "};",
6962             format("auto x=[]{int *a;\n"
6963                    "int * a;\n"
6964                    "int *  a;};",
6965                    getGoogleStyle()));
6966 }
6967 
6968 TEST_F(FormatTest, UnderstandsRvalueReferences) {
6969   verifyFormat("int f(int &&a) {}");
6970   verifyFormat("int f(int a, char &&b) {}");
6971   verifyFormat("void f() { int &&a = b; }");
6972   verifyGoogleFormat("int f(int a, char&& b) {}");
6973   verifyGoogleFormat("void f() { int&& a = b; }");
6974 
6975   verifyIndependentOfContext("A<int &&> a;");
6976   verifyIndependentOfContext("A<int &&, int &&> a;");
6977   verifyGoogleFormat("A<int&&> a;");
6978   verifyGoogleFormat("A<int&&, int&&> a;");
6979 
6980   // Not rvalue references:
6981   verifyFormat("template <bool B, bool C> class A {\n"
6982                "  static_assert(B && C, \"Something is wrong\");\n"
6983                "};");
6984   verifyGoogleFormat("#define IF(a, b, c) if (a && (b == c))");
6985   verifyGoogleFormat("#define WHILE(a, b, c) while (a && (b == c))");
6986   verifyFormat("#define A(a, b) (a && b)");
6987 }
6988 
6989 TEST_F(FormatTest, FormatsBinaryOperatorsPrecedingEquals) {
6990   verifyFormat("void f() {\n"
6991                "  x[aaaaaaaaa -\n"
6992                "    b] = 23;\n"
6993                "}",
6994                getLLVMStyleWithColumns(15));
6995 }
6996 
6997 TEST_F(FormatTest, FormatsCasts) {
6998   verifyFormat("Type *A = static_cast<Type *>(P);");
6999   verifyFormat("Type *A = (Type *)P;");
7000   verifyFormat("Type *A = (vector<Type *, int *>)P;");
7001   verifyFormat("int a = (int)(2.0f);");
7002   verifyFormat("int a = (int)2.0f;");
7003   verifyFormat("x[(int32)y];");
7004   verifyFormat("x = (int32)y;");
7005   verifyFormat("#define AA(X) sizeof(((X *)NULL)->a)");
7006   verifyFormat("int a = (int)*b;");
7007   verifyFormat("int a = (int)2.0f;");
7008   verifyFormat("int a = (int)~0;");
7009   verifyFormat("int a = (int)++a;");
7010   verifyFormat("int a = (int)sizeof(int);");
7011   verifyFormat("int a = (int)+2;");
7012   verifyFormat("my_int a = (my_int)2.0f;");
7013   verifyFormat("my_int a = (my_int)sizeof(int);");
7014   verifyFormat("return (my_int)aaa;");
7015   verifyFormat("#define x ((int)-1)");
7016   verifyFormat("#define LENGTH(x, y) (x) - (y) + 1");
7017   verifyFormat("#define p(q) ((int *)&q)");
7018   verifyFormat("fn(a)(b) + 1;");
7019 
7020   verifyFormat("void f() { my_int a = (my_int)*b; }");
7021   verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }");
7022   verifyFormat("my_int a = (my_int)~0;");
7023   verifyFormat("my_int a = (my_int)++a;");
7024   verifyFormat("my_int a = (my_int)-2;");
7025   verifyFormat("my_int a = (my_int)1;");
7026   verifyFormat("my_int a = (my_int *)1;");
7027   verifyFormat("my_int a = (const my_int)-1;");
7028   verifyFormat("my_int a = (const my_int *)-1;");
7029   verifyFormat("my_int a = (my_int)(my_int)-1;");
7030   verifyFormat("my_int a = (ns::my_int)-2;");
7031   verifyFormat("case (my_int)ONE:");
7032   verifyFormat("auto x = (X)this;");
7033 
7034   // FIXME: single value wrapped with paren will be treated as cast.
7035   verifyFormat("void f(int i = (kValue)*kMask) {}");
7036 
7037   verifyFormat("{ (void)F; }");
7038 
7039   // Don't break after a cast's
7040   verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
7041                "    (aaaaaaaaaaaaaaaaaaaaaaaaaa *)(aaaaaaaaaaaaaaaaaaaaaa +\n"
7042                "                                   bbbbbbbbbbbbbbbbbbbbbb);");
7043 
7044   // These are not casts.
7045   verifyFormat("void f(int *) {}");
7046   verifyFormat("f(foo)->b;");
7047   verifyFormat("f(foo).b;");
7048   verifyFormat("f(foo)(b);");
7049   verifyFormat("f(foo)[b];");
7050   verifyFormat("[](foo) { return 4; }(bar);");
7051   verifyFormat("(*funptr)(foo)[4];");
7052   verifyFormat("funptrs[4](foo)[4];");
7053   verifyFormat("void f(int *);");
7054   verifyFormat("void f(int *) = 0;");
7055   verifyFormat("void f(SmallVector<int>) {}");
7056   verifyFormat("void f(SmallVector<int>);");
7057   verifyFormat("void f(SmallVector<int>) = 0;");
7058   verifyFormat("void f(int i = (kA * kB) & kMask) {}");
7059   verifyFormat("int a = sizeof(int) * b;");
7060   verifyFormat("int a = alignof(int) * b;", getGoogleStyle());
7061   verifyFormat("template <> void f<int>(int i) SOME_ANNOTATION;");
7062   verifyFormat("f(\"%\" SOME_MACRO(ll) \"d\");");
7063   verifyFormat("aaaaa &operator=(const aaaaa &) LLVM_DELETED_FUNCTION;");
7064 
7065   // These are not casts, but at some point were confused with casts.
7066   verifyFormat("virtual void foo(int *) override;");
7067   verifyFormat("virtual void foo(char &) const;");
7068   verifyFormat("virtual void foo(int *a, char *) const;");
7069   verifyFormat("int a = sizeof(int *) + b;");
7070   verifyFormat("int a = alignof(int *) + b;", getGoogleStyle());
7071   verifyFormat("bool b = f(g<int>) && c;");
7072   verifyFormat("typedef void (*f)(int i) func;");
7073 
7074   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *foo = (aaaaaaaaaaaaaaaaa *)\n"
7075                "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;");
7076   // FIXME: The indentation here is not ideal.
7077   verifyFormat(
7078       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7079       "    [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = (*cccccccccccccccc)\n"
7080       "        [dddddddddddddddddddddddddddddddddddddddddddddddddddddddd];");
7081 }
7082 
7083 TEST_F(FormatTest, FormatsFunctionTypes) {
7084   verifyFormat("A<bool()> a;");
7085   verifyFormat("A<SomeType()> a;");
7086   verifyFormat("A<void (*)(int, std::string)> a;");
7087   verifyFormat("A<void *(int)>;");
7088   verifyFormat("void *(*a)(int *, SomeType *);");
7089   verifyFormat("int (*func)(void *);");
7090   verifyFormat("void f() { int (*func)(void *); }");
7091   verifyFormat("template <class CallbackClass>\n"
7092                "using MyCallback = void (CallbackClass::*)(SomeObject *Data);");
7093 
7094   verifyGoogleFormat("A<void*(int*, SomeType*)>;");
7095   verifyGoogleFormat("void* (*a)(int);");
7096   verifyGoogleFormat(
7097       "template <class CallbackClass>\n"
7098       "using MyCallback = void (CallbackClass::*)(SomeObject* Data);");
7099 
7100   // Other constructs can look somewhat like function types:
7101   verifyFormat("A<sizeof(*x)> a;");
7102   verifyFormat("#define DEREF_AND_CALL_F(x) f(*x)");
7103   verifyFormat("some_var = function(*some_pointer_var)[0];");
7104   verifyFormat("void f() { function(*some_pointer_var)[0] = 10; }");
7105   verifyFormat("int x = f(&h)();");
7106   verifyFormat("returnsFunction(&param1, &param2)(param);");
7107   verifyFormat("std::function<\n"
7108                "    LooooooooooongTemplatedType<\n"
7109                "        SomeType>*(\n"
7110                "        LooooooooooooooooongType type)>\n"
7111                "    function;",
7112                getGoogleStyleWithColumns(40));
7113 }
7114 
7115 TEST_F(FormatTest, FormatsPointersToArrayTypes) {
7116   verifyFormat("A (*foo_)[6];");
7117   verifyFormat("vector<int> (*foo_)[6];");
7118 }
7119 
7120 TEST_F(FormatTest, BreaksLongVariableDeclarations) {
7121   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
7122                "    LoooooooooooooooooooooooooooooooooooooooongVariable;");
7123   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
7124                "    LoooooooooooooooooooooooooooooooooooooooongVariable;");
7125   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
7126                "    *LoooooooooooooooooooooooooooooooooooooooongVariable;");
7127 
7128   // Different ways of ()-initializiation.
7129   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
7130                "    LoooooooooooooooooooooooooooooooooooooooongVariable(1);");
7131   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
7132                "    LoooooooooooooooooooooooooooooooooooooooongVariable(a);");
7133   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
7134                "    LoooooooooooooooooooooooooooooooooooooooongVariable({});");
7135   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
7136                "    LoooooooooooooooooooooooooooooooooooooongVariable([A a]);");
7137 
7138   // Lambdas should not confuse the variable declaration heuristic.
7139   verifyFormat("LooooooooooooooooongType\n"
7140                "    variable(nullptr, [](A *a) {});",
7141                getLLVMStyleWithColumns(40));
7142 }
7143 
7144 TEST_F(FormatTest, BreaksLongDeclarations) {
7145   verifyFormat("typedef LoooooooooooooooooooooooooooooooooooooooongType\n"
7146                "    AnotherNameForTheLongType;");
7147   verifyFormat("typedef LongTemplateType<aaaaaaaaaaaaaaaaaaa()>\n"
7148                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
7149   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
7150                "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
7151   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType *\n"
7152                "LoooooooooooooooooooooooooooooooongFunctionDeclaration();");
7153   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
7154                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
7155   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n"
7156                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
7157   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
7158                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
7159   verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
7160                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
7161   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
7162                "LooooooooooooooooooooooooooongFunctionDeclaration(T... t);");
7163   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
7164                "LooooooooooooooooooooooooooongFunctionDeclaration(T /*t*/) {}");
7165   FormatStyle Indented = getLLVMStyle();
7166   Indented.IndentWrappedFunctionNames = true;
7167   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
7168                "    LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
7169                Indented);
7170   verifyFormat(
7171       "LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
7172       "    LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
7173       Indented);
7174   verifyFormat(
7175       "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
7176       "    LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
7177       Indented);
7178   verifyFormat(
7179       "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n"
7180       "    LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}",
7181       Indented);
7182 
7183   // FIXME: Without the comment, this breaks after "(".
7184   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType  // break\n"
7185                "    (*LoooooooooooooooooooooooooooongFunctionTypeVarialbe)();",
7186                getGoogleStyle());
7187 
7188   verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
7189                "                  int LoooooooooooooooooooongParam2) {}");
7190   verifyFormat(
7191       "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
7192       "                                   SourceLocation L, IdentifierIn *II,\n"
7193       "                                   Type *T) {}");
7194   verifyFormat("ReallyLongReturnType<TemplateParam1, TemplateParam2>\n"
7195                "ReallyReaaallyLongFunctionName(\n"
7196                "    const std::string &SomeParameter,\n"
7197                "    const SomeType<string, SomeOtherTemplateParameter>\n"
7198                "        &ReallyReallyLongParameterName,\n"
7199                "    const SomeType<string, SomeOtherTemplateParameter>\n"
7200                "        &AnotherLongParameterName) {}");
7201   verifyFormat("template <typename A>\n"
7202                "SomeLoooooooooooooooooooooongType<\n"
7203                "    typename some_namespace::SomeOtherType<A>::Type>\n"
7204                "Function() {}");
7205 
7206   verifyGoogleFormat(
7207       "aaaaaaaaaaaaaaaa::aaaaaaaaaaaaaaaa<aaaaaaaaaaaaa, aaaaaaaaaaaa>\n"
7208       "    aaaaaaaaaaaaaaaaaaaaaaa;");
7209   verifyGoogleFormat(
7210       "TypeSpecDecl* TypeSpecDecl::Create(ASTContext& C, DeclContext* DC,\n"
7211       "                                   SourceLocation L) {}");
7212   verifyGoogleFormat(
7213       "some_namespace::LongReturnType\n"
7214       "long_namespace::SomeVeryLongClass::SomeVeryLongFunction(\n"
7215       "    int first_long_parameter, int second_parameter) {}");
7216 
7217   verifyGoogleFormat("template <typename T>\n"
7218                      "aaaaaaaa::aaaaa::aaaaaa<T, aaaaaaaaaaaaaaaaaaaaaaaaa>\n"
7219                      "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}");
7220   verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7221                      "                   int aaaaaaaaaaaaaaaaaaaaaaa);");
7222 
7223   verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n"
7224                "    const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7225                "        *aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
7226   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7227                "    vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n"
7228                "        aaaaaaaaaaaaaaaaaaaaaaaa);");
7229   verifyFormat("void aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
7230                "    vector<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<\n"
7231                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>>\n"
7232                "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
7233 
7234   verifyFormat("template <typename T> // Templates on own line.\n"
7235                "static int            // Some comment.\n"
7236                "MyFunction(int a);",
7237                getLLVMStyle());
7238 }
7239 
7240 TEST_F(FormatTest, FormatsArrays) {
7241   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
7242                "                         [bbbbbbbbbbbbbbbbbbbbbbbbb] = c;");
7243   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa(aaaaaaaaaaaa)]\n"
7244                "                         [bbbbbbbbbbb(bbbbbbbbbbbb)] = c;");
7245   verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaa &&\n"
7246                "    aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaa][aaaaaaaaaaaaa]) {\n}");
7247   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7248                "    [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
7249   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7250                "    [a][bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = cccccccc;");
7251   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
7252                "    [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]\n"
7253                "    [bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb] = ccccccccccc;");
7254   verifyFormat(
7255       "llvm::outs() << \"aaaaaaaaaaaa: \"\n"
7256       "             << (*aaaaaaaiaaaaaaa)[aaaaaaaaaaaaaaaaaaaaaaaaa]\n"
7257       "                                  [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa];");
7258   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaaaaaaa][a]\n"
7259                "    .aaaaaaaaaaaaaaaaaaaaaa();");
7260 
7261   verifyGoogleFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<int>\n"
7262                      "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[aaaaaaaaaaaa];");
7263   verifyFormat(
7264       "aaaaaaaaaaa aaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaa->aaaaaaaaa[0]\n"
7265       "                                  .aaaaaaa[0]\n"
7266       "                                  .aaaaaaaaaaaaaaaaaaaaaa();");
7267   verifyFormat("a[::b::c];");
7268 
7269   verifyNoCrash("a[,Y?)]", getLLVMStyleWithColumns(10));
7270 
7271   FormatStyle NoColumnLimit = getLLVMStyleWithColumns(0);
7272   verifyFormat("aaaaa[bbbbbb].cccccc()", NoColumnLimit);
7273 }
7274 
7275 TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
7276   verifyFormat("(a)->b();");
7277   verifyFormat("--a;");
7278 }
7279 
7280 TEST_F(FormatTest, HandlesIncludeDirectives) {
7281   verifyFormat("#include <string>\n"
7282                "#include <a/b/c.h>\n"
7283                "#include \"a/b/string\"\n"
7284                "#include \"string.h\"\n"
7285                "#include \"string.h\"\n"
7286                "#include <a-a>\n"
7287                "#include < path with space >\n"
7288                "#include_next <test.h>"
7289                "#include \"abc.h\" // this is included for ABC\n"
7290                "#include \"some long include\" // with a comment\n"
7291                "#include \"some very long include path\"\n"
7292                "#include <some/very/long/include/path>\n",
7293                getLLVMStyleWithColumns(35));
7294   EXPECT_EQ("#include \"a.h\"", format("#include  \"a.h\""));
7295   EXPECT_EQ("#include <a>", format("#include<a>"));
7296 
7297   verifyFormat("#import <string>");
7298   verifyFormat("#import <a/b/c.h>");
7299   verifyFormat("#import \"a/b/string\"");
7300   verifyFormat("#import \"string.h\"");
7301   verifyFormat("#import \"string.h\"");
7302   verifyFormat("#if __has_include(<strstream>)\n"
7303                "#include <strstream>\n"
7304                "#endif");
7305 
7306   verifyFormat("#define MY_IMPORT <a/b>");
7307 
7308   verifyFormat("#if __has_include(<a/b>)");
7309   verifyFormat("#if __has_include_next(<a/b>)");
7310   verifyFormat("#define F __has_include(<a/b>)");
7311   verifyFormat("#define F __has_include_next(<a/b>)");
7312 
7313   // Protocol buffer definition or missing "#".
7314   verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";",
7315                getLLVMStyleWithColumns(30));
7316 
7317   FormatStyle Style = getLLVMStyle();
7318   Style.AlwaysBreakBeforeMultilineStrings = true;
7319   Style.ColumnLimit = 0;
7320   verifyFormat("#import \"abc.h\"", Style);
7321 
7322   // But 'import' might also be a regular C++ namespace.
7323   verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7324                "                     aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);");
7325 }
7326 
7327 //===----------------------------------------------------------------------===//
7328 // Error recovery tests.
7329 //===----------------------------------------------------------------------===//
7330 
7331 TEST_F(FormatTest, IncompleteParameterLists) {
7332   FormatStyle NoBinPacking = getLLVMStyle();
7333   NoBinPacking.BinPackParameters = false;
7334   verifyFormat("void aaaaaaaaaaaaaaaaaa(int level,\n"
7335                "                        double *min_x,\n"
7336                "                        double *max_x,\n"
7337                "                        double *min_y,\n"
7338                "                        double *max_y,\n"
7339                "                        double *min_z,\n"
7340                "                        double *max_z, ) {}",
7341                NoBinPacking);
7342 }
7343 
7344 TEST_F(FormatTest, IncorrectCodeTrailingStuff) {
7345   verifyFormat("void f() { return; }\n42");
7346   verifyFormat("void f() {\n"
7347                "  if (0)\n"
7348                "    return;\n"
7349                "}\n"
7350                "42");
7351   verifyFormat("void f() { return }\n42");
7352   verifyFormat("void f() {\n"
7353                "  if (0)\n"
7354                "    return\n"
7355                "}\n"
7356                "42");
7357 }
7358 
7359 TEST_F(FormatTest, IncorrectCodeMissingSemicolon) {
7360   EXPECT_EQ("void f() { return }", format("void  f ( )  {  return  }"));
7361   EXPECT_EQ("void f() {\n"
7362             "  if (a)\n"
7363             "    return\n"
7364             "}",
7365             format("void  f  (  )  {  if  ( a )  return  }"));
7366   EXPECT_EQ("namespace N {\n"
7367             "void f()\n"
7368             "}",
7369             format("namespace  N  {  void f()  }"));
7370   EXPECT_EQ("namespace N {\n"
7371             "void f() {}\n"
7372             "void g()\n"
7373             "} // namespace N",
7374             format("namespace N  { void f( ) { } void g( ) }"));
7375 }
7376 
7377 TEST_F(FormatTest, IndentationWithinColumnLimitNotPossible) {
7378   verifyFormat("int aaaaaaaa =\n"
7379                "    // Overlylongcomment\n"
7380                "    b;",
7381                getLLVMStyleWithColumns(20));
7382   verifyFormat("function(\n"
7383                "    ShortArgument,\n"
7384                "    LoooooooooooongArgument);\n",
7385                getLLVMStyleWithColumns(20));
7386 }
7387 
7388 TEST_F(FormatTest, IncorrectAccessSpecifier) {
7389   verifyFormat("public:");
7390   verifyFormat("class A {\n"
7391                "public\n"
7392                "  void f() {}\n"
7393                "};");
7394   verifyFormat("public\n"
7395                "int qwerty;");
7396   verifyFormat("public\n"
7397                "B {}");
7398   verifyFormat("public\n"
7399                "{}");
7400   verifyFormat("public\n"
7401                "B { int x; }");
7402 }
7403 
7404 TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
7405   verifyFormat("{");
7406   verifyFormat("#})");
7407   verifyNoCrash("(/**/[:!] ?[).");
7408 }
7409 
7410 TEST_F(FormatTest, IncorrectUnbalancedBracesInMacrosWithUnicode) {
7411   // Found by oss-fuzz:
7412   // https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=8212
7413   FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp);
7414   Style.ColumnLimit = 60;
7415   verifyNoCrash(
7416       "\x23\x47\xff\x20\x28\xff\x3c\xff\x3f\xff\x20\x2f\x7b\x7a\xff\x20"
7417       "\xff\xff\xff\xca\xb5\xff\xff\xff\xff\x3a\x7b\x7d\xff\x20\xff\x20"
7418       "\xff\x74\xff\x20\x7d\x7d\xff\x7b\x3a\xff\x20\x71\xff\x20\xff\x0a",
7419       Style);
7420 }
7421 
7422 TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
7423   verifyFormat("do {\n}");
7424   verifyFormat("do {\n}\n"
7425                "f();");
7426   verifyFormat("do {\n}\n"
7427                "wheeee(fun);");
7428   verifyFormat("do {\n"
7429                "  f();\n"
7430                "}");
7431 }
7432 
7433 TEST_F(FormatTest, IncorrectCodeMissingParens) {
7434   verifyFormat("if {\n  foo;\n  foo();\n}");
7435   verifyFormat("switch {\n  foo;\n  foo();\n}");
7436   verifyIncompleteFormat("for {\n  foo;\n  foo();\n}");
7437   verifyFormat("while {\n  foo;\n  foo();\n}");
7438   verifyFormat("do {\n  foo;\n  foo();\n} while;");
7439 }
7440 
7441 TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
7442   verifyIncompleteFormat("namespace {\n"
7443                          "class Foo { Foo (\n"
7444                          "};\n"
7445                          "} // namespace");
7446 }
7447 
7448 TEST_F(FormatTest, IncorrectCodeErrorDetection) {
7449   EXPECT_EQ("{\n  {}\n", format("{\n{\n}\n"));
7450   EXPECT_EQ("{\n  {}\n", format("{\n  {\n}\n"));
7451   EXPECT_EQ("{\n  {}\n", format("{\n  {\n  }\n"));
7452   EXPECT_EQ("{\n  {}\n}\n}\n", format("{\n  {\n    }\n  }\n}\n"));
7453 
7454   EXPECT_EQ("{\n"
7455             "  {\n"
7456             "    breakme(\n"
7457             "        qwe);\n"
7458             "  }\n",
7459             format("{\n"
7460                    "    {\n"
7461                    " breakme(qwe);\n"
7462                    "}\n",
7463                    getLLVMStyleWithColumns(10)));
7464 }
7465 
7466 TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {
7467   verifyFormat("int x = {\n"
7468                "    avariable,\n"
7469                "    b(alongervariable)};",
7470                getLLVMStyleWithColumns(25));
7471 }
7472 
7473 TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
7474   verifyFormat("return (a)(b){1, 2, 3};");
7475 }
7476 
7477 TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
7478   verifyFormat("vector<int> x{1, 2, 3, 4};");
7479   verifyFormat("vector<int> x{\n"
7480                "    1,\n"
7481                "    2,\n"
7482                "    3,\n"
7483                "    4,\n"
7484                "};");
7485   verifyFormat("vector<T> x{{}, {}, {}, {}};");
7486   verifyFormat("f({1, 2});");
7487   verifyFormat("auto v = Foo{-1};");
7488   verifyFormat("f({1, 2}, {{2, 3}, {4, 5}}, c, {d});");
7489   verifyFormat("Class::Class : member{1, 2, 3} {}");
7490   verifyFormat("new vector<int>{1, 2, 3};");
7491   verifyFormat("new int[3]{1, 2, 3};");
7492   verifyFormat("new int{1};");
7493   verifyFormat("return {arg1, arg2};");
7494   verifyFormat("return {arg1, SomeType{parameter}};");
7495   verifyFormat("int count = set<int>{f(), g(), h()}.size();");
7496   verifyFormat("new T{arg1, arg2};");
7497   verifyFormat("f(MyMap[{composite, key}]);");
7498   verifyFormat("class Class {\n"
7499                "  T member = {arg1, arg2};\n"
7500                "};");
7501   verifyFormat("vector<int> foo = {::SomeGlobalFunction()};");
7502   verifyFormat("const struct A a = {.a = 1, .b = 2};");
7503   verifyFormat("const struct A a = {[0] = 1, [1] = 2};");
7504   verifyFormat("static_assert(std::is_integral<int>{} + 0, \"\");");
7505   verifyFormat("int a = std::is_integral<int>{} + 0;");
7506 
7507   verifyFormat("int foo(int i) { return fo1{}(i); }");
7508   verifyFormat("int foo(int i) { return fo1{}(i); }");
7509   verifyFormat("auto i = decltype(x){};");
7510   verifyFormat("std::vector<int> v = {1, 0 /* comment */};");
7511   verifyFormat("Node n{1, Node{1000}, //\n"
7512                "       2};");
7513   verifyFormat("Aaaa aaaaaaa{\n"
7514                "    {\n"
7515                "        aaaa,\n"
7516                "    },\n"
7517                "};");
7518   verifyFormat("class C : public D {\n"
7519                "  SomeClass SC{2};\n"
7520                "};");
7521   verifyFormat("class C : public A {\n"
7522                "  class D : public B {\n"
7523                "    void f() { int i{2}; }\n"
7524                "  };\n"
7525                "};");
7526   verifyFormat("#define A {a, a},");
7527 
7528   // Avoid breaking between equal sign and opening brace
7529   FormatStyle AvoidBreakingFirstArgument = getLLVMStyle();
7530   AvoidBreakingFirstArgument.PenaltyBreakBeforeFirstCallParameter = 200;
7531   verifyFormat("const std::unordered_map<std::string, int> MyHashTable =\n"
7532                "    {{\"aaaaaaaaaaaaaaaaaaaaa\", 0},\n"
7533                "     {\"bbbbbbbbbbbbbbbbbbbbb\", 1},\n"
7534                "     {\"ccccccccccccccccccccc\", 2}};",
7535                AvoidBreakingFirstArgument);
7536 
7537   // Binpacking only if there is no trailing comma
7538   verifyFormat("const Aaaaaa aaaaa = {aaaaaaaaaa, bbbbbbbbbb,\n"
7539                "                      cccccccccc, dddddddddd};",
7540 			   getLLVMStyleWithColumns(50));
7541   verifyFormat("const Aaaaaa aaaaa = {\n"
7542                "    aaaaaaaaaaa,\n"
7543                "    bbbbbbbbbbb,\n"
7544                "    ccccccccccc,\n"
7545                "    ddddddddddd,\n"
7546                "};", getLLVMStyleWithColumns(50));
7547 
7548   // Cases where distinguising braced lists and blocks is hard.
7549   verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
7550   verifyFormat("void f() {\n"
7551                "  return; // comment\n"
7552                "}\n"
7553                "SomeType t;");
7554   verifyFormat("void f() {\n"
7555                "  if (a) {\n"
7556                "    f();\n"
7557                "  }\n"
7558                "}\n"
7559                "SomeType t;");
7560 
7561   // In combination with BinPackArguments = false.
7562   FormatStyle NoBinPacking = getLLVMStyle();
7563   NoBinPacking.BinPackArguments = false;
7564   verifyFormat("const Aaaaaa aaaaa = {aaaaa,\n"
7565                "                      bbbbb,\n"
7566                "                      ccccc,\n"
7567                "                      ddddd,\n"
7568                "                      eeeee,\n"
7569                "                      ffffff,\n"
7570                "                      ggggg,\n"
7571                "                      hhhhhh,\n"
7572                "                      iiiiii,\n"
7573                "                      jjjjjj,\n"
7574                "                      kkkkkk};",
7575                NoBinPacking);
7576   verifyFormat("const Aaaaaa aaaaa = {\n"
7577                "    aaaaa,\n"
7578                "    bbbbb,\n"
7579                "    ccccc,\n"
7580                "    ddddd,\n"
7581                "    eeeee,\n"
7582                "    ffffff,\n"
7583                "    ggggg,\n"
7584                "    hhhhhh,\n"
7585                "    iiiiii,\n"
7586                "    jjjjjj,\n"
7587                "    kkkkkk,\n"
7588                "};",
7589                NoBinPacking);
7590   verifyFormat(
7591       "const Aaaaaa aaaaa = {\n"
7592       "    aaaaa,  bbbbb,  ccccc,  ddddd,  eeeee,  ffffff, ggggg, hhhhhh,\n"
7593       "    iiiiii, jjjjjj, kkkkkk, aaaaa,  bbbbb,  ccccc,  ddddd, eeeee,\n"
7594       "    ffffff, ggggg,  hhhhhh, iiiiii, jjjjjj, kkkkkk,\n"
7595       "};",
7596       NoBinPacking);
7597 
7598   // FIXME: The alignment of these trailing comments might be bad. Then again,
7599   // this might be utterly useless in real code.
7600   verifyFormat("Constructor::Constructor()\n"
7601                "    : some_value{         //\n"
7602                "                 aaaaaaa, //\n"
7603                "                 bbbbbbb} {}");
7604 
7605   // In braced lists, the first comment is always assumed to belong to the
7606   // first element. Thus, it can be moved to the next or previous line as
7607   // appropriate.
7608   EXPECT_EQ("function({// First element:\n"
7609             "          1,\n"
7610             "          // Second element:\n"
7611             "          2});",
7612             format("function({\n"
7613                    "    // First element:\n"
7614                    "    1,\n"
7615                    "    // Second element:\n"
7616                    "    2});"));
7617   EXPECT_EQ("std::vector<int> MyNumbers{\n"
7618             "    // First element:\n"
7619             "    1,\n"
7620             "    // Second element:\n"
7621             "    2};",
7622             format("std::vector<int> MyNumbers{// First element:\n"
7623                    "                           1,\n"
7624                    "                           // Second element:\n"
7625                    "                           2};",
7626                    getLLVMStyleWithColumns(30)));
7627   // A trailing comma should still lead to an enforced line break and no
7628   // binpacking.
7629   EXPECT_EQ("vector<int> SomeVector = {\n"
7630             "    // aaa\n"
7631             "    1,\n"
7632             "    2,\n"
7633             "};",
7634             format("vector<int> SomeVector = { // aaa\n"
7635                    "    1, 2, };"));
7636 
7637   FormatStyle ExtraSpaces = getLLVMStyle();
7638   ExtraSpaces.Cpp11BracedListStyle = false;
7639   ExtraSpaces.ColumnLimit = 75;
7640   verifyFormat("vector<int> x{ 1, 2, 3, 4 };", ExtraSpaces);
7641   verifyFormat("vector<T> x{ {}, {}, {}, {} };", ExtraSpaces);
7642   verifyFormat("f({ 1, 2 });", ExtraSpaces);
7643   verifyFormat("auto v = Foo{ 1 };", ExtraSpaces);
7644   verifyFormat("f({ 1, 2 }, { { 2, 3 }, { 4, 5 } }, c, { d });", ExtraSpaces);
7645   verifyFormat("Class::Class : member{ 1, 2, 3 } {}", ExtraSpaces);
7646   verifyFormat("new vector<int>{ 1, 2, 3 };", ExtraSpaces);
7647   verifyFormat("new int[3]{ 1, 2, 3 };", ExtraSpaces);
7648   verifyFormat("return { arg1, arg2 };", ExtraSpaces);
7649   verifyFormat("return { arg1, SomeType{ parameter } };", ExtraSpaces);
7650   verifyFormat("int count = set<int>{ f(), g(), h() }.size();", ExtraSpaces);
7651   verifyFormat("new T{ arg1, arg2 };", ExtraSpaces);
7652   verifyFormat("f(MyMap[{ composite, key }]);", ExtraSpaces);
7653   verifyFormat("class Class {\n"
7654                "  T member = { arg1, arg2 };\n"
7655                "};",
7656                ExtraSpaces);
7657   verifyFormat(
7658       "foo = aaaaaaaaaaa ? vector<int>{ aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7659       "                                 aaaaaaaaaaaaaaaaaaaa, aaaaa }\n"
7660       "                  : vector<int>{ bbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
7661       "                                 bbbbbbbbbbbbbbbbbbbb, bbbbb };",
7662       ExtraSpaces);
7663   verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces);
7664   verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });",
7665                ExtraSpaces);
7666   verifyFormat(
7667       "someFunction(OtherParam,\n"
7668       "             BracedList{ // comment 1 (Forcing interesting break)\n"
7669       "                         param1, param2,\n"
7670       "                         // comment 2\n"
7671       "                         param3, param4 });",
7672       ExtraSpaces);
7673   verifyFormat(
7674       "std::this_thread::sleep_for(\n"
7675       "    std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);",
7676       ExtraSpaces);
7677   verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{\n"
7678                "    aaaaaaa,\n"
7679                "    aaaaaaaaaa,\n"
7680                "    aaaaa,\n"
7681                "    aaaaaaaaaaaaaaa,\n"
7682                "    aaa,\n"
7683                "    aaaaaaaaaa,\n"
7684                "    a,\n"
7685                "    aaaaaaaaaaaaaaaaaaaaa,\n"
7686                "    aaaaaaaaaaaa,\n"
7687                "    aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n"
7688                "    aaaaaaa,\n"
7689                "    a};");
7690   verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces);
7691   verifyFormat("const struct A a = { .a = 1, .b = 2 };", ExtraSpaces);
7692   verifyFormat("const struct A a = { [0] = 1, [1] = 2 };", ExtraSpaces);
7693 
7694   // Avoid breaking between initializer/equal sign and opening brace
7695   ExtraSpaces.PenaltyBreakBeforeFirstCallParameter = 200;
7696   verifyFormat("const std::unordered_map<std::string, int> MyHashTable = {\n"
7697                "  { \"aaaaaaaaaaaaaaaaaaaaa\", 0 },\n"
7698                "  { \"bbbbbbbbbbbbbbbbbbbbb\", 1 },\n"
7699                "  { \"ccccccccccccccccccccc\", 2 }\n"
7700                "};",
7701                ExtraSpaces);
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 
7709   FormatStyle SpaceBeforeBrace = getLLVMStyle();
7710   SpaceBeforeBrace.SpaceBeforeCpp11BracedList = true;
7711   verifyFormat("vector<int> x {1, 2, 3, 4};", SpaceBeforeBrace);
7712   verifyFormat("f({}, {{}, {}}, MyMap[{k, v}]);", SpaceBeforeBrace);
7713 }
7714 
7715 TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
7716   verifyFormat("vector<int> x = {1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7717                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7718                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7719                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7720                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7721                "                 1, 22, 333, 4444, 55555, 666666, 7777777};");
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, //\n"
7725                "                 1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7726                "                 1, 22, 333, 4444, 55555, 666666, 7777777};");
7727   verifyFormat(
7728       "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, 666666, // comment\n"
7731       "                 7777777, 1,  22,  333,  4444,  55555,  666666,\n"
7732       "                 7777777, 1,  22,  333,  4444,  55555,  666666,\n"
7733       "                 7777777, 1,  22,  333,  4444,  55555,  666666,\n"
7734       "                 7777777};");
7735   verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
7736                "    X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7737                "    X86::R8,  X86::R9,  X86::R10, X86::R11, 0};");
7738   verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
7739                "    X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7740                "    // Separating comment.\n"
7741                "    X86::R8, X86::R9, X86::R10, X86::R11, 0};");
7742   verifyFormat("static const uint16_t CallerSavedRegs64Bittttt[] = {\n"
7743                "    // Leading comment\n"
7744                "    X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,\n"
7745                "    X86::R8,  X86::R9,  X86::R10, X86::R11, 0};");
7746   verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7747                "                 1, 1, 1, 1};",
7748                getLLVMStyleWithColumns(39));
7749   verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7750                "                 1, 1, 1, 1};",
7751                getLLVMStyleWithColumns(38));
7752   verifyFormat("vector<int> aaaaaaaaaaaaaaaaaaaaaa = {\n"
7753                "    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};",
7754                getLLVMStyleWithColumns(43));
7755   verifyFormat(
7756       "static unsigned SomeValues[10][3] = {\n"
7757       "    {1, 4, 0},  {4, 9, 0},  {4, 5, 9},  {8, 5, 4}, {1, 8, 4},\n"
7758       "    {10, 1, 6}, {11, 0, 9}, {2, 11, 9}, {5, 2, 9}, {11, 2, 7}};");
7759   verifyFormat("static auto fields = new vector<string>{\n"
7760                "    \"aaaaaaaaaaaaa\",\n"
7761                "    \"aaaaaaaaaaaaa\",\n"
7762                "    \"aaaaaaaaaaaa\",\n"
7763                "    \"aaaaaaaaaaaaaa\",\n"
7764                "    \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
7765                "    \"aaaaaaaaaaaa\",\n"
7766                "    \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n"
7767                "};");
7768   verifyFormat("vector<int> x = {1, 2, 3, 4, aaaaaaaaaaaaaaaaa, 6};");
7769   verifyFormat("vector<int> x = {1, aaaaaaaaaaaaaaaaaaaaaa,\n"
7770                "                 2, bbbbbbbbbbbbbbbbbbbbbb,\n"
7771                "                 3, cccccccccccccccccccccc};",
7772                getLLVMStyleWithColumns(60));
7773 
7774   // Trailing commas.
7775   verifyFormat("vector<int> x = {\n"
7776                "    1, 1, 1, 1, 1, 1, 1, 1,\n"
7777                "};",
7778                getLLVMStyleWithColumns(39));
7779   verifyFormat("vector<int> x = {\n"
7780                "    1, 1, 1, 1, 1, 1, 1, 1, //\n"
7781                "};",
7782                getLLVMStyleWithColumns(39));
7783   verifyFormat("vector<int> x = {1, 1, 1, 1,\n"
7784                "                 1, 1, 1, 1,\n"
7785                "                 /**/ /**/};",
7786                getLLVMStyleWithColumns(39));
7787 
7788   // Trailing comment in the first line.
7789   verifyFormat("vector<int> iiiiiiiiiiiiiii = {                      //\n"
7790                "    1111111111, 2222222222, 33333333333, 4444444444, //\n"
7791                "    111111111,  222222222,  3333333333,  444444444,  //\n"
7792                "    11111111,   22222222,   333333333,   44444444};");
7793   // Trailing comment in the last line.
7794   verifyFormat("int aaaaa[] = {\n"
7795                "    1, 2, 3, // comment\n"
7796                "    4, 5, 6  // comment\n"
7797                "};");
7798 
7799   // With nested lists, we should either format one item per line or all nested
7800   // lists one on line.
7801   // FIXME: For some nested lists, we can do better.
7802   verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n"
7803                "        {aaaaaaaaaaaaaaaaaaa},\n"
7804                "        {aaaaaaaaaaaaaaaaaaaaa},\n"
7805                "        {aaaaaaaaaaaaaaaaa}};",
7806                getLLVMStyleWithColumns(60));
7807   verifyFormat(
7808       "SomeStruct my_struct_array = {\n"
7809       "    {aaaaaa, aaaaaaaa, aaaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa,\n"
7810       "     aaaaaaaaaaaaa, aaaaaaa, aaa},\n"
7811       "    {aaa, aaa},\n"
7812       "    {aaa, aaa},\n"
7813       "    {aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaa},\n"
7814       "    {aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaa,\n"
7815       "     aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
7816 
7817   // No column layout should be used here.
7818   verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
7819                "                   bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
7820 
7821   verifyNoCrash("a<,");
7822 
7823   // No braced initializer here.
7824   verifyFormat("void f() {\n"
7825                "  struct Dummy {};\n"
7826                "  f(v);\n"
7827                "}");
7828 
7829   // Long lists should be formatted in columns even if they are nested.
7830   verifyFormat(
7831       "vector<int> x = function({1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7832       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7833       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7834       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7835       "                          1, 22, 333, 4444, 55555, 666666, 7777777,\n"
7836       "                          1, 22, 333, 4444, 55555, 666666, 7777777});");
7837 
7838   // Allow "single-column" layout even if that violates the column limit. There
7839   // isn't going to be a better way.
7840   verifyFormat("std::vector<int> a = {\n"
7841                "    aaaaaaaa,\n"
7842                "    aaaaaaaa,\n"
7843                "    aaaaaaaa,\n"
7844                "    aaaaaaaa,\n"
7845                "    aaaaaaaaaa,\n"
7846                "    aaaaaaaa,\n"
7847                "    aaaaaaaaaaaaaaaaaaaaaaaaaaa};",
7848                getLLVMStyleWithColumns(30));
7849   verifyFormat("vector<int> aaaa = {\n"
7850                "    aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7851                "    aaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
7852                "    aaaaaa.aaaaaaa,\n"
7853                "    aaaaaa.aaaaaaa,\n"
7854                "    aaaaaa.aaaaaaa,\n"
7855                "    aaaaaa.aaaaaaa,\n"
7856                "};");
7857 
7858   // Don't create hanging lists.
7859   verifyFormat("someFunction(Param, {List1, List2,\n"
7860                "                     List3});",
7861                getLLVMStyleWithColumns(35));
7862   verifyFormat("someFunction(Param, Param,\n"
7863                "             {List1, List2,\n"
7864                "              List3});",
7865                getLLVMStyleWithColumns(35));
7866   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, {},\n"
7867                "                               aaaaaaaaaaaaaaaaaaaaaaa);");
7868 }
7869 
7870 TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
7871   FormatStyle DoNotMerge = getLLVMStyle();
7872   DoNotMerge.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
7873 
7874   verifyFormat("void f() { return 42; }");
7875   verifyFormat("void f() {\n"
7876                "  return 42;\n"
7877                "}",
7878                DoNotMerge);
7879   verifyFormat("void f() {\n"
7880                "  // Comment\n"
7881                "}");
7882   verifyFormat("{\n"
7883                "#error {\n"
7884                "  int a;\n"
7885                "}");
7886   verifyFormat("{\n"
7887                "  int a;\n"
7888                "#error {\n"
7889                "}");
7890   verifyFormat("void f() {} // comment");
7891   verifyFormat("void f() { int a; } // comment");
7892   verifyFormat("void f() {\n"
7893                "} // comment",
7894                DoNotMerge);
7895   verifyFormat("void f() {\n"
7896                "  int a;\n"
7897                "} // comment",
7898                DoNotMerge);
7899   verifyFormat("void f() {\n"
7900                "} // comment",
7901                getLLVMStyleWithColumns(15));
7902 
7903   verifyFormat("void f() { return 42; }", getLLVMStyleWithColumns(23));
7904   verifyFormat("void f() {\n  return 42;\n}", getLLVMStyleWithColumns(22));
7905 
7906   verifyFormat("void f() {}", getLLVMStyleWithColumns(11));
7907   verifyFormat("void f() {\n}", getLLVMStyleWithColumns(10));
7908   verifyFormat("class C {\n"
7909                "  C()\n"
7910                "      : iiiiiiii(nullptr),\n"
7911                "        kkkkkkk(nullptr),\n"
7912                "        mmmmmmm(nullptr),\n"
7913                "        nnnnnnn(nullptr) {}\n"
7914                "};",
7915                getGoogleStyle());
7916 
7917   FormatStyle NoColumnLimit = getLLVMStyle();
7918   NoColumnLimit.ColumnLimit = 0;
7919   EXPECT_EQ("A() : b(0) {}", format("A():b(0){}", NoColumnLimit));
7920   EXPECT_EQ("class C {\n"
7921             "  A() : b(0) {}\n"
7922             "};",
7923             format("class C{A():b(0){}};", NoColumnLimit));
7924   EXPECT_EQ("A()\n"
7925             "    : b(0) {\n"
7926             "}",
7927             format("A()\n:b(0)\n{\n}", NoColumnLimit));
7928 
7929   FormatStyle DoNotMergeNoColumnLimit = NoColumnLimit;
7930   DoNotMergeNoColumnLimit.AllowShortFunctionsOnASingleLine =
7931       FormatStyle::SFS_None;
7932   EXPECT_EQ("A()\n"
7933             "    : b(0) {\n"
7934             "}",
7935             format("A():b(0){}", DoNotMergeNoColumnLimit));
7936   EXPECT_EQ("A()\n"
7937             "    : b(0) {\n"
7938             "}",
7939             format("A()\n:b(0)\n{\n}", DoNotMergeNoColumnLimit));
7940 
7941   verifyFormat("#define A          \\\n"
7942                "  void f() {       \\\n"
7943                "    int i;         \\\n"
7944                "  }",
7945                getLLVMStyleWithColumns(20));
7946   verifyFormat("#define A           \\\n"
7947                "  void f() { int i; }",
7948                getLLVMStyleWithColumns(21));
7949   verifyFormat("#define A            \\\n"
7950                "  void f() {         \\\n"
7951                "    int i;           \\\n"
7952                "  }                  \\\n"
7953                "  int j;",
7954                getLLVMStyleWithColumns(22));
7955   verifyFormat("#define A             \\\n"
7956                "  void f() { int i; } \\\n"
7957                "  int j;",
7958                getLLVMStyleWithColumns(23));
7959 }
7960 
7961 TEST_F(FormatTest, PullEmptyFunctionDefinitionsIntoSingleLine) {
7962   FormatStyle MergeEmptyOnly = getLLVMStyle();
7963   MergeEmptyOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
7964   verifyFormat("class C {\n"
7965                "  int f() {}\n"
7966                "};",
7967                MergeEmptyOnly);
7968   verifyFormat("class C {\n"
7969                "  int f() {\n"
7970                "    return 42;\n"
7971                "  }\n"
7972                "};",
7973                MergeEmptyOnly);
7974   verifyFormat("int f() {}", MergeEmptyOnly);
7975   verifyFormat("int f() {\n"
7976                "  return 42;\n"
7977                "}",
7978                MergeEmptyOnly);
7979 
7980   // Also verify behavior when BraceWrapping.AfterFunction = true
7981   MergeEmptyOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
7982   MergeEmptyOnly.BraceWrapping.AfterFunction = true;
7983   verifyFormat("int f() {}", MergeEmptyOnly);
7984   verifyFormat("class C {\n"
7985                "  int f() {}\n"
7986                "};",
7987                MergeEmptyOnly);
7988 }
7989 
7990 TEST_F(FormatTest, PullInlineFunctionDefinitionsIntoSingleLine) {
7991   FormatStyle MergeInlineOnly = getLLVMStyle();
7992   MergeInlineOnly.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
7993   verifyFormat("class C {\n"
7994                "  int f() { return 42; }\n"
7995                "};",
7996                MergeInlineOnly);
7997   verifyFormat("int f() {\n"
7998                "  return 42;\n"
7999                "}",
8000                MergeInlineOnly);
8001 
8002   // SFS_Inline implies SFS_Empty
8003   verifyFormat("class C {\n"
8004                "  int f() {}\n"
8005                "};",
8006                MergeInlineOnly);
8007   verifyFormat("int f() {}", MergeInlineOnly);
8008 
8009   // Also verify behavior when BraceWrapping.AfterFunction = true
8010   MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
8011   MergeInlineOnly.BraceWrapping.AfterFunction = true;
8012   verifyFormat("class C {\n"
8013                "  int f() { return 42; }\n"
8014                "};",
8015                MergeInlineOnly);
8016   verifyFormat("int f()\n"
8017                "{\n"
8018                "  return 42;\n"
8019                "}",
8020                MergeInlineOnly);
8021 
8022   // SFS_Inline implies SFS_Empty
8023   verifyFormat("int f() {}", MergeInlineOnly);
8024   verifyFormat("class C {\n"
8025                "  int f() {}\n"
8026                "};",
8027                MergeInlineOnly);
8028 }
8029 
8030 TEST_F(FormatTest, PullInlineOnlyFunctionDefinitionsIntoSingleLine) {
8031   FormatStyle MergeInlineOnly = getLLVMStyle();
8032   MergeInlineOnly.AllowShortFunctionsOnASingleLine =
8033       FormatStyle::SFS_InlineOnly;
8034   verifyFormat("class C {\n"
8035                "  int f() { return 42; }\n"
8036                "};",
8037                MergeInlineOnly);
8038   verifyFormat("int f() {\n"
8039                "  return 42;\n"
8040                "}",
8041                MergeInlineOnly);
8042 
8043   // SFS_InlineOnly does not imply SFS_Empty
8044   verifyFormat("class C {\n"
8045                "  int f() {}\n"
8046                "};",
8047                MergeInlineOnly);
8048   verifyFormat("int f() {\n"
8049                "}",
8050                MergeInlineOnly);
8051 
8052   // Also verify behavior when BraceWrapping.AfterFunction = true
8053   MergeInlineOnly.BreakBeforeBraces = FormatStyle::BS_Custom;
8054   MergeInlineOnly.BraceWrapping.AfterFunction = true;
8055   verifyFormat("class C {\n"
8056                "  int f() { return 42; }\n"
8057                "};",
8058                MergeInlineOnly);
8059   verifyFormat("int f()\n"
8060                "{\n"
8061                "  return 42;\n"
8062                "}",
8063                MergeInlineOnly);
8064 
8065   // SFS_InlineOnly does not imply SFS_Empty
8066   verifyFormat("int f()\n"
8067                "{\n"
8068                "}",
8069                MergeInlineOnly);
8070   verifyFormat("class C {\n"
8071                "  int f() {}\n"
8072                "};",
8073                MergeInlineOnly);
8074 }
8075 
8076 TEST_F(FormatTest, SplitEmptyFunction) {
8077   FormatStyle Style = getLLVMStyle();
8078   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
8079   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
8080   Style.BraceWrapping.AfterFunction = true;
8081   Style.BraceWrapping.SplitEmptyFunction = false;
8082   Style.ColumnLimit = 40;
8083 
8084   verifyFormat("int f()\n"
8085                "{}",
8086                Style);
8087   verifyFormat("int f()\n"
8088                "{\n"
8089                "  return 42;\n"
8090                "}",
8091                Style);
8092   verifyFormat("int f()\n"
8093                "{\n"
8094                "  // some comment\n"
8095                "}",
8096                Style);
8097 
8098   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
8099   verifyFormat("int f() {}", Style);
8100   verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
8101                "{}",
8102                Style);
8103   verifyFormat("int f()\n"
8104                "{\n"
8105                "  return 0;\n"
8106                "}",
8107                Style);
8108 
8109   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
8110   verifyFormat("class Foo {\n"
8111                "  int f() {}\n"
8112                "};\n",
8113                Style);
8114   verifyFormat("class Foo {\n"
8115                "  int f() { return 0; }\n"
8116                "};\n",
8117                Style);
8118   verifyFormat("class Foo {\n"
8119                "  int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
8120                "  {}\n"
8121                "};\n",
8122                Style);
8123   verifyFormat("class Foo {\n"
8124                "  int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
8125                "  {\n"
8126                "    return 0;\n"
8127                "  }\n"
8128                "};\n",
8129                Style);
8130 
8131   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
8132   verifyFormat("int f() {}", Style);
8133   verifyFormat("int f() { return 0; }", Style);
8134   verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
8135                "{}",
8136                Style);
8137   verifyFormat("int aaaaaaaaaaaaaa(int bbbbbbbbbbbbbb)\n"
8138                "{\n"
8139                "  return 0;\n"
8140                "}",
8141                Style);
8142 }
8143 TEST_F(FormatTest, KeepShortFunctionAfterPPElse) {
8144   FormatStyle Style = getLLVMStyle();
8145   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
8146   verifyFormat("#ifdef A\n"
8147                "int f() {}\n"
8148                "#else\n"
8149                "int g() {}\n"
8150                "#endif",
8151                Style);
8152 }
8153 
8154 TEST_F(FormatTest, SplitEmptyClass) {
8155   FormatStyle Style = getLLVMStyle();
8156   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
8157   Style.BraceWrapping.AfterClass = true;
8158   Style.BraceWrapping.SplitEmptyRecord = false;
8159 
8160   verifyFormat("class Foo\n"
8161                "{};",
8162                Style);
8163   verifyFormat("/* something */ class Foo\n"
8164                "{};",
8165                Style);
8166   verifyFormat("template <typename X> class Foo\n"
8167                "{};",
8168                Style);
8169   verifyFormat("class Foo\n"
8170                "{\n"
8171                "  Foo();\n"
8172                "};",
8173                Style);
8174   verifyFormat("typedef class Foo\n"
8175                "{\n"
8176                "} Foo_t;",
8177                Style);
8178 }
8179 
8180 TEST_F(FormatTest, SplitEmptyStruct) {
8181   FormatStyle Style = getLLVMStyle();
8182   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
8183   Style.BraceWrapping.AfterStruct = true;
8184   Style.BraceWrapping.SplitEmptyRecord = false;
8185 
8186   verifyFormat("struct Foo\n"
8187                "{};",
8188                Style);
8189   verifyFormat("/* something */ struct Foo\n"
8190                "{};",
8191                Style);
8192   verifyFormat("template <typename X> struct Foo\n"
8193                "{};",
8194                Style);
8195   verifyFormat("struct Foo\n"
8196                "{\n"
8197                "  Foo();\n"
8198                "};",
8199                Style);
8200   verifyFormat("typedef struct Foo\n"
8201                "{\n"
8202                "} Foo_t;",
8203                Style);
8204   //typedef struct Bar {} Bar_t;
8205 }
8206 
8207 TEST_F(FormatTest, SplitEmptyUnion) {
8208   FormatStyle Style = getLLVMStyle();
8209   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
8210   Style.BraceWrapping.AfterUnion = true;
8211   Style.BraceWrapping.SplitEmptyRecord = false;
8212 
8213   verifyFormat("union Foo\n"
8214                "{};",
8215                Style);
8216   verifyFormat("/* something */ union Foo\n"
8217                "{};",
8218                Style);
8219   verifyFormat("union Foo\n"
8220                "{\n"
8221                "  A,\n"
8222                "};",
8223                Style);
8224   verifyFormat("typedef union Foo\n"
8225                "{\n"
8226                "} Foo_t;",
8227                Style);
8228 }
8229 
8230 TEST_F(FormatTest, SplitEmptyNamespace) {
8231   FormatStyle Style = getLLVMStyle();
8232   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
8233   Style.BraceWrapping.AfterNamespace = true;
8234   Style.BraceWrapping.SplitEmptyNamespace = false;
8235 
8236   verifyFormat("namespace Foo\n"
8237                "{};",
8238                Style);
8239   verifyFormat("/* something */ namespace Foo\n"
8240                "{};",
8241                Style);
8242   verifyFormat("inline namespace Foo\n"
8243                "{};",
8244                Style);
8245   verifyFormat("/* something */ inline namespace Foo\n"
8246                "{};",
8247                Style);
8248   verifyFormat("export namespace Foo\n"
8249                "{};",
8250                Style);
8251   verifyFormat("namespace Foo\n"
8252                "{\n"
8253                "void Bar();\n"
8254                "};",
8255                Style);
8256 }
8257 
8258 TEST_F(FormatTest, NeverMergeShortRecords) {
8259   FormatStyle Style = getLLVMStyle();
8260 
8261   verifyFormat("class Foo {\n"
8262                "  Foo();\n"
8263                "};",
8264                Style);
8265   verifyFormat("typedef class Foo {\n"
8266                "  Foo();\n"
8267                "} Foo_t;",
8268                Style);
8269   verifyFormat("struct Foo {\n"
8270                "  Foo();\n"
8271                "};",
8272                Style);
8273   verifyFormat("typedef struct Foo {\n"
8274                "  Foo();\n"
8275                "} Foo_t;",
8276                Style);
8277   verifyFormat("union Foo {\n"
8278                "  A,\n"
8279                "};",
8280                Style);
8281   verifyFormat("typedef union Foo {\n"
8282                "  A,\n"
8283                "} Foo_t;",
8284                Style);
8285   verifyFormat("namespace Foo {\n"
8286                "void Bar();\n"
8287                "};",
8288                Style);
8289 
8290   Style.BreakBeforeBraces = FormatStyle::BS_Custom;
8291   Style.BraceWrapping.AfterClass = true;
8292   Style.BraceWrapping.AfterStruct = true;
8293   Style.BraceWrapping.AfterUnion = true;
8294   Style.BraceWrapping.AfterNamespace = true;
8295   verifyFormat("class Foo\n"
8296                "{\n"
8297                "  Foo();\n"
8298                "};",
8299                Style);
8300   verifyFormat("typedef class Foo\n"
8301                "{\n"
8302                "  Foo();\n"
8303                "} Foo_t;",
8304                Style);
8305   verifyFormat("struct Foo\n"
8306                "{\n"
8307                "  Foo();\n"
8308                "};",
8309                Style);
8310   verifyFormat("typedef struct Foo\n"
8311                "{\n"
8312                "  Foo();\n"
8313                "} Foo_t;",
8314                Style);
8315   verifyFormat("union Foo\n"
8316                "{\n"
8317                "  A,\n"
8318                "};",
8319                Style);
8320   verifyFormat("typedef union Foo\n"
8321                "{\n"
8322                "  A,\n"
8323                "} Foo_t;",
8324                Style);
8325   verifyFormat("namespace Foo\n"
8326                "{\n"
8327                "void Bar();\n"
8328                "};",
8329                Style);
8330 }
8331 
8332 TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
8333   // Elaborate type variable declarations.
8334   verifyFormat("struct foo a = {bar};\nint n;");
8335   verifyFormat("class foo a = {bar};\nint n;");
8336   verifyFormat("union foo a = {bar};\nint n;");
8337 
8338   // Elaborate types inside function definitions.
8339   verifyFormat("struct foo f() {}\nint n;");
8340   verifyFormat("class foo f() {}\nint n;");
8341   verifyFormat("union foo f() {}\nint n;");
8342 
8343   // Templates.
8344   verifyFormat("template <class X> void f() {}\nint n;");
8345   verifyFormat("template <struct X> void f() {}\nint n;");
8346   verifyFormat("template <union X> void f() {}\nint n;");
8347 
8348   // Actual definitions...
8349   verifyFormat("struct {\n} n;");
8350   verifyFormat(
8351       "template <template <class T, class Y>, class Z> class X {\n} n;");
8352   verifyFormat("union Z {\n  int n;\n} x;");
8353   verifyFormat("class MACRO Z {\n} n;");
8354   verifyFormat("class MACRO(X) Z {\n} n;");
8355   verifyFormat("class __attribute__(X) Z {\n} n;");
8356   verifyFormat("class __declspec(X) Z {\n} n;");
8357   verifyFormat("class A##B##C {\n} n;");
8358   verifyFormat("class alignas(16) Z {\n} n;");
8359   verifyFormat("class MACRO(X) alignas(16) Z {\n} n;");
8360   verifyFormat("class MACROA MACRO(X) Z {\n} n;");
8361 
8362   // Redefinition from nested context:
8363   verifyFormat("class A::B::C {\n} n;");
8364 
8365   // Template definitions.
8366   verifyFormat(
8367       "template <typename F>\n"
8368       "Matcher(const Matcher<F> &Other,\n"
8369       "        typename enable_if_c<is_base_of<F, T>::value &&\n"
8370       "                             !is_same<F, T>::value>::type * = 0)\n"
8371       "    : Implementation(new ImplicitCastMatcher<F>(Other)) {}");
8372 
8373   // FIXME: This is still incorrectly handled at the formatter side.
8374   verifyFormat("template <> struct X < 15, i<3 && 42 < 50 && 33 < 28> {};");
8375   verifyFormat("int i = SomeFunction(a<b, a> b);");
8376 
8377   // FIXME:
8378   // This now gets parsed incorrectly as class definition.
8379   // verifyFormat("class A<int> f() {\n}\nint n;");
8380 
8381   // Elaborate types where incorrectly parsing the structural element would
8382   // break the indent.
8383   verifyFormat("if (true)\n"
8384                "  class X x;\n"
8385                "else\n"
8386                "  f();\n");
8387 
8388   // This is simply incomplete. Formatting is not important, but must not crash.
8389   verifyFormat("class A:");
8390 }
8391 
8392 TEST_F(FormatTest, DoNotInterfereWithErrorAndWarning) {
8393   EXPECT_EQ("#error Leave     all         white!!!!! space* alone!\n",
8394             format("#error Leave     all         white!!!!! space* alone!\n"));
8395   EXPECT_EQ(
8396       "#warning Leave     all         white!!!!! space* alone!\n",
8397       format("#warning Leave     all         white!!!!! space* alone!\n"));
8398   EXPECT_EQ("#error 1", format("  #  error   1"));
8399   EXPECT_EQ("#warning 1", format("  #  warning 1"));
8400 }
8401 
8402 TEST_F(FormatTest, FormatHashIfExpressions) {
8403   verifyFormat("#if AAAA && BBBB");
8404   verifyFormat("#if (AAAA && BBBB)");
8405   verifyFormat("#elif (AAAA && BBBB)");
8406   // FIXME: Come up with a better indentation for #elif.
8407   verifyFormat(
8408       "#if !defined(AAAAAAA) && (defined CCCCCC || defined DDDDDD) &&  \\\n"
8409       "    defined(BBBBBBBB)\n"
8410       "#elif !defined(AAAAAA) && (defined CCCCC || defined DDDDDD) &&  \\\n"
8411       "    defined(BBBBBBBB)\n"
8412       "#endif",
8413       getLLVMStyleWithColumns(65));
8414 }
8415 
8416 TEST_F(FormatTest, MergeHandlingInTheFaceOfPreprocessorDirectives) {
8417   FormatStyle AllowsMergedIf = getGoogleStyle();
8418   AllowsMergedIf.AllowShortIfStatementsOnASingleLine =
8419       FormatStyle::SIS_WithoutElse;
8420   verifyFormat("void f() { f(); }\n#error E", AllowsMergedIf);
8421   verifyFormat("if (true) return 42;\n#error E", AllowsMergedIf);
8422   verifyFormat("if (true)\n#error E\n  return 42;", AllowsMergedIf);
8423   EXPECT_EQ("if (true) return 42;",
8424             format("if (true)\nreturn 42;", AllowsMergedIf));
8425   FormatStyle ShortMergedIf = AllowsMergedIf;
8426   ShortMergedIf.ColumnLimit = 25;
8427   verifyFormat("#define A \\\n"
8428                "  if (true) return 42;",
8429                ShortMergedIf);
8430   verifyFormat("#define A \\\n"
8431                "  f();    \\\n"
8432                "  if (true)\n"
8433                "#define B",
8434                ShortMergedIf);
8435   verifyFormat("#define A \\\n"
8436                "  f();    \\\n"
8437                "  if (true)\n"
8438                "g();",
8439                ShortMergedIf);
8440   verifyFormat("{\n"
8441                "#ifdef A\n"
8442                "  // Comment\n"
8443                "  if (true) continue;\n"
8444                "#endif\n"
8445                "  // Comment\n"
8446                "  if (true) continue;\n"
8447                "}",
8448                ShortMergedIf);
8449   ShortMergedIf.ColumnLimit = 33;
8450   verifyFormat("#define A \\\n"
8451                "  if constexpr (true) return 42;",
8452                ShortMergedIf);
8453   ShortMergedIf.ColumnLimit = 29;
8454   verifyFormat("#define A                   \\\n"
8455                "  if (aaaaaaaaaa) return 1; \\\n"
8456                "  return 2;",
8457                ShortMergedIf);
8458   ShortMergedIf.ColumnLimit = 28;
8459   verifyFormat("#define A         \\\n"
8460                "  if (aaaaaaaaaa) \\\n"
8461                "    return 1;     \\\n"
8462                "  return 2;",
8463                ShortMergedIf);
8464   verifyFormat("#define A                \\\n"
8465                "  if constexpr (aaaaaaa) \\\n"
8466                "    return 1;            \\\n"
8467                "  return 2;",
8468                ShortMergedIf);
8469 }
8470 
8471 TEST_F(FormatTest, FormatStarDependingOnContext) {
8472   verifyFormat("void f(int *a);");
8473   verifyFormat("void f() { f(fint * b); }");
8474   verifyFormat("class A {\n  void f(int *a);\n};");
8475   verifyFormat("class A {\n  int *a;\n};");
8476   verifyFormat("namespace a {\n"
8477                "namespace b {\n"
8478                "class A {\n"
8479                "  void f() {}\n"
8480                "  int *a;\n"
8481                "};\n"
8482                "} // namespace b\n"
8483                "} // namespace a");
8484 }
8485 
8486 TEST_F(FormatTest, SpecialTokensAtEndOfLine) {
8487   verifyFormat("while");
8488   verifyFormat("operator");
8489 }
8490 
8491 TEST_F(FormatTest, SkipsDeeplyNestedLines) {
8492   // This code would be painfully slow to format if we didn't skip it.
8493   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
8494                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
8495                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
8496                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
8497                    "A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(A(\n"
8498                    "A(1, 1)\n"
8499                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n" // 10x
8500                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8501                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8502                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8503                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8504                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
8505                    ", 1), 1), 1), 1), 1), 1), 1), 1), 1), 1)\n"
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   // Deeply nested part is untouched, rest is formatted.
8510   EXPECT_EQ(std::string("int i;\n") + Code + "int j;\n",
8511             format(std::string("int    i;\n") + Code + "int    j;\n",
8512                    getLLVMStyle(), SC_ExpectIncomplete));
8513 }
8514 
8515 //===----------------------------------------------------------------------===//
8516 // Objective-C tests.
8517 //===----------------------------------------------------------------------===//
8518 
8519 TEST_F(FormatTest, FormatForObjectiveCMethodDecls) {
8520   verifyFormat("- (void)sendAction:(SEL)aSelector to:(BOOL)anObject;");
8521   EXPECT_EQ("- (NSUInteger)indexOfObject:(id)anObject;",
8522             format("-(NSUInteger)indexOfObject:(id)anObject;"));
8523   EXPECT_EQ("- (NSInteger)Mthod1;", format("-(NSInteger)Mthod1;"));
8524   EXPECT_EQ("+ (id)Mthod2;", format("+(id)Mthod2;"));
8525   EXPECT_EQ("- (NSInteger)Method3:(id)anObject;",
8526             format("-(NSInteger)Method3:(id)anObject;"));
8527   EXPECT_EQ("- (NSInteger)Method4:(id)anObject;",
8528             format("-(NSInteger)Method4:(id)anObject;"));
8529   EXPECT_EQ("- (NSInteger)Method5:(id)anObject:(id)AnotherObject;",
8530             format("-(NSInteger)Method5:(id)anObject:(id)AnotherObject;"));
8531   EXPECT_EQ("- (id)Method6:(id)A:(id)B:(id)C:(id)D;",
8532             format("- (id)Method6:(id)A:(id)B:(id)C:(id)D;"));
8533   EXPECT_EQ("- (void)sendAction:(SEL)aSelector to:(id)anObject "
8534             "forAllCells:(BOOL)flag;",
8535             format("- (void)sendAction:(SEL)aSelector to:(id)anObject "
8536                    "forAllCells:(BOOL)flag;"));
8537 
8538   // Very long objectiveC method declaration.
8539   verifyFormat("- (void)aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:\n"
8540                "    (SoooooooooooooooooooooomeType *)bbbbbbbbbb;");
8541   verifyFormat("- (NSUInteger)indexOfObject:(id)anObject\n"
8542                "                    inRange:(NSRange)range\n"
8543                "                   outRange:(NSRange)out_range\n"
8544                "                  outRange1:(NSRange)out_range1\n"
8545                "                  outRange2:(NSRange)out_range2\n"
8546                "                  outRange3:(NSRange)out_range3\n"
8547                "                  outRange4:(NSRange)out_range4\n"
8548                "                  outRange5:(NSRange)out_range5\n"
8549                "                  outRange6:(NSRange)out_range6\n"
8550                "                  outRange7:(NSRange)out_range7\n"
8551                "                  outRange8:(NSRange)out_range8\n"
8552                "                  outRange9:(NSRange)out_range9;");
8553 
8554   // When the function name has to be wrapped.
8555   FormatStyle Style = getLLVMStyle();
8556   // ObjC ignores IndentWrappedFunctionNames when wrapping methods
8557   // and always indents instead.
8558   Style.IndentWrappedFunctionNames = false;
8559   verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
8560                "    veryLooooooooooongName:(NSString)aaaaaaaaaaaaaa\n"
8561                "               anotherName:(NSString)bbbbbbbbbbbbbb {\n"
8562                "}",
8563                Style);
8564   Style.IndentWrappedFunctionNames = true;
8565   verifyFormat("- (SomeLooooooooooooooooooooongType *)\n"
8566                "    veryLooooooooooongName:(NSString)cccccccccccccc\n"
8567                "               anotherName:(NSString)dddddddddddddd {\n"
8568                "}",
8569                Style);
8570 
8571   verifyFormat("- (int)sum:(vector<int>)numbers;");
8572   verifyGoogleFormat("- (void)setDelegate:(id<Protocol>)delegate;");
8573   // FIXME: In LLVM style, there should be a space in front of a '<' for ObjC
8574   // protocol lists (but not for template classes):
8575   // verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;");
8576 
8577   verifyFormat("- (int (*)())foo:(int (*)())f;");
8578   verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;");
8579 
8580   // If there's no return type (very rare in practice!), LLVM and Google style
8581   // agree.
8582   verifyFormat("- foo;");
8583   verifyFormat("- foo:(int)f;");
8584   verifyGoogleFormat("- foo:(int)foo;");
8585 }
8586 
8587 
8588 TEST_F(FormatTest, BreaksStringLiterals) {
8589   EXPECT_EQ("\"some text \"\n"
8590             "\"other\";",
8591             format("\"some text other\";", getLLVMStyleWithColumns(12)));
8592   EXPECT_EQ("\"some text \"\n"
8593             "\"other\";",
8594             format("\\\n\"some text other\";", getLLVMStyleWithColumns(12)));
8595   EXPECT_EQ(
8596       "#define A  \\\n"
8597       "  \"some \"  \\\n"
8598       "  \"text \"  \\\n"
8599       "  \"other\";",
8600       format("#define A \"some text other\";", getLLVMStyleWithColumns(12)));
8601   EXPECT_EQ(
8602       "#define A  \\\n"
8603       "  \"so \"    \\\n"
8604       "  \"text \"  \\\n"
8605       "  \"other\";",
8606       format("#define A \"so text other\";", getLLVMStyleWithColumns(12)));
8607 
8608   EXPECT_EQ("\"some text\"",
8609             format("\"some text\"", getLLVMStyleWithColumns(1)));
8610   EXPECT_EQ("\"some text\"",
8611             format("\"some text\"", getLLVMStyleWithColumns(11)));
8612   EXPECT_EQ("\"some \"\n"
8613             "\"text\"",
8614             format("\"some text\"", getLLVMStyleWithColumns(10)));
8615   EXPECT_EQ("\"some \"\n"
8616             "\"text\"",
8617             format("\"some text\"", getLLVMStyleWithColumns(7)));
8618   EXPECT_EQ("\"some\"\n"
8619             "\" tex\"\n"
8620             "\"t\"",
8621             format("\"some text\"", getLLVMStyleWithColumns(6)));
8622   EXPECT_EQ("\"some\"\n"
8623             "\" tex\"\n"
8624             "\" and\"",
8625             format("\"some tex and\"", getLLVMStyleWithColumns(6)));
8626   EXPECT_EQ("\"some\"\n"
8627             "\"/tex\"\n"
8628             "\"/and\"",
8629             format("\"some/tex/and\"", getLLVMStyleWithColumns(6)));
8630 
8631   EXPECT_EQ("variable =\n"
8632             "    \"long string \"\n"
8633             "    \"literal\";",
8634             format("variable = \"long string literal\";",
8635                    getLLVMStyleWithColumns(20)));
8636 
8637   EXPECT_EQ("variable = f(\n"
8638             "    \"long string \"\n"
8639             "    \"literal\",\n"
8640             "    short,\n"
8641             "    loooooooooooooooooooong);",
8642             format("variable = f(\"long string literal\", short, "
8643                    "loooooooooooooooooooong);",
8644                    getLLVMStyleWithColumns(20)));
8645 
8646   EXPECT_EQ(
8647       "f(g(\"long string \"\n"
8648       "    \"literal\"),\n"
8649       "  b);",
8650       format("f(g(\"long string literal\"), b);", getLLVMStyleWithColumns(20)));
8651   EXPECT_EQ("f(g(\"long string \"\n"
8652             "    \"literal\",\n"
8653             "    a),\n"
8654             "  b);",
8655             format("f(g(\"long string literal\", a), b);",
8656                    getLLVMStyleWithColumns(20)));
8657   EXPECT_EQ(
8658       "f(\"one two\".split(\n"
8659       "    variable));",
8660       format("f(\"one two\".split(variable));", getLLVMStyleWithColumns(20)));
8661   EXPECT_EQ("f(\"one two three four five six \"\n"
8662             "  \"seven\".split(\n"
8663             "      really_looooong_variable));",
8664             format("f(\"one two three four five six seven\"."
8665                    "split(really_looooong_variable));",
8666                    getLLVMStyleWithColumns(33)));
8667 
8668   EXPECT_EQ("f(\"some \"\n"
8669             "  \"text\",\n"
8670             "  other);",
8671             format("f(\"some text\", other);", getLLVMStyleWithColumns(10)));
8672 
8673   // Only break as a last resort.
8674   verifyFormat(
8675       "aaaaaaaaaaaaaaaaaaaa(\n"
8676       "    aaaaaaaaaaaaaaaaaaaa,\n"
8677       "    aaaaaa(\"aaa aaaaa aaa aaa aaaaa aaa aaaaa aaa aaa aaaaaa\"));");
8678 
8679   EXPECT_EQ("\"splitmea\"\n"
8680             "\"trandomp\"\n"
8681             "\"oint\"",
8682             format("\"splitmeatrandompoint\"", getLLVMStyleWithColumns(10)));
8683 
8684   EXPECT_EQ("\"split/\"\n"
8685             "\"pathat/\"\n"
8686             "\"slashes\"",
8687             format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
8688 
8689   EXPECT_EQ("\"split/\"\n"
8690             "\"pathat/\"\n"
8691             "\"slashes\"",
8692             format("\"split/pathat/slashes\"", getLLVMStyleWithColumns(10)));
8693   EXPECT_EQ("\"split at \"\n"
8694             "\"spaces/at/\"\n"
8695             "\"slashes.at.any$\"\n"
8696             "\"non-alphanumeric%\"\n"
8697             "\"1111111111characte\"\n"
8698             "\"rs\"",
8699             format("\"split at "
8700                    "spaces/at/"
8701                    "slashes.at."
8702                    "any$non-"
8703                    "alphanumeric%"
8704                    "1111111111characte"
8705                    "rs\"",
8706                    getLLVMStyleWithColumns(20)));
8707 
8708   // Verify that splitting the strings understands
8709   // Style::AlwaysBreakBeforeMultilineStrings.
8710   EXPECT_EQ(
8711       "aaaaaaaaaaaa(\n"
8712       "    \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa \"\n"
8713       "    \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\");",
8714       format("aaaaaaaaaaaa(\"aaaaaaaaaaaaaaaaaaaaaaaaaa "
8715              "aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
8716              "aaaaaaaaaaaaaaaaaaaaaa\");",
8717              getGoogleStyle()));
8718   EXPECT_EQ("return \"aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8719             "       \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaa\";",
8720             format("return \"aaaaaaaaaaaaaaaaaaaaaa "
8721                    "aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa "
8722                    "aaaaaaaaaaaaaaaaaaaaaa\";",
8723                    getGoogleStyle()));
8724   EXPECT_EQ("llvm::outs() << \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8725             "                \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
8726             format("llvm::outs() << "
8727                    "\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaa"
8728                    "aaaaaaaaaaaaaaaaaaa\";"));
8729   EXPECT_EQ("ffff(\n"
8730             "    {\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n"
8731             "     \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
8732             format("ffff({\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "
8733                    "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"});",
8734                    getGoogleStyle()));
8735 
8736   FormatStyle Style = getLLVMStyleWithColumns(12);
8737   Style.BreakStringLiterals = false;
8738   EXPECT_EQ("\"some text other\";", format("\"some text other\";", Style));
8739 
8740   FormatStyle AlignLeft = getLLVMStyleWithColumns(12);
8741   AlignLeft.AlignEscapedNewlines = FormatStyle::ENAS_Left;
8742   EXPECT_EQ("#define A \\\n"
8743             "  \"some \" \\\n"
8744             "  \"text \" \\\n"
8745             "  \"other\";",
8746             format("#define A \"some text other\";", AlignLeft));
8747 }
8748 
8749 TEST_F(FormatTest, BreaksStringLiteralsAtColumnLimit) {
8750   EXPECT_EQ("C a = \"some more \"\n"
8751             "      \"text\";",
8752             format("C a = \"some more text\";", getLLVMStyleWithColumns(18)));
8753 }
8754 
8755 TEST_F(FormatTest, FullyRemoveEmptyLines) {
8756   FormatStyle NoEmptyLines = getLLVMStyleWithColumns(80);
8757   NoEmptyLines.MaxEmptyLinesToKeep = 0;
8758   EXPECT_EQ("int i = a(b());",
8759             format("int i=a(\n\n b(\n\n\n )\n\n);", NoEmptyLines));
8760 }
8761 
8762 TEST_F(FormatTest, BreaksStringLiteralsWithTabs) {
8763   EXPECT_EQ(
8764       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
8765       "(\n"
8766       "    \"x\t\");",
8767       format("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
8768              "aaaaaaa("
8769              "\"x\t\");"));
8770 }
8771 
8772 TEST_F(FormatTest, BreaksWideAndNSStringLiterals) {
8773   EXPECT_EQ(
8774       "u8\"utf8 string \"\n"
8775       "u8\"literal\";",
8776       format("u8\"utf8 string literal\";", getGoogleStyleWithColumns(16)));
8777   EXPECT_EQ(
8778       "u\"utf16 string \"\n"
8779       "u\"literal\";",
8780       format("u\"utf16 string literal\";", getGoogleStyleWithColumns(16)));
8781   EXPECT_EQ(
8782       "U\"utf32 string \"\n"
8783       "U\"literal\";",
8784       format("U\"utf32 string literal\";", getGoogleStyleWithColumns(16)));
8785   EXPECT_EQ("L\"wide string \"\n"
8786             "L\"literal\";",
8787             format("L\"wide string literal\";", getGoogleStyleWithColumns(16)));
8788   EXPECT_EQ("@\"NSString \"\n"
8789             "@\"literal\";",
8790             format("@\"NSString literal\";", getGoogleStyleWithColumns(19)));
8791   verifyFormat(R"(NSString *s = @"那那那那";)", getLLVMStyleWithColumns(26));
8792 
8793   // This input makes clang-format try to split the incomplete unicode escape
8794   // sequence, which used to lead to a crasher.
8795   verifyNoCrash(
8796       "aaaaaaaaaaaaaaaaaaaa = L\"\\udff\"'; // aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
8797       getLLVMStyleWithColumns(60));
8798 }
8799 
8800 TEST_F(FormatTest, DoesNotBreakRawStringLiterals) {
8801   FormatStyle Style = getGoogleStyleWithColumns(15);
8802   EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style));
8803   EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style));
8804   EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style));
8805   EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style));
8806   EXPECT_EQ("u8R\"x(raw literal)x\";",
8807             format("u8R\"x(raw literal)x\";", Style));
8808 }
8809 
8810 TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) {
8811   FormatStyle Style = getLLVMStyleWithColumns(20);
8812   EXPECT_EQ(
8813       "_T(\"aaaaaaaaaaaaaa\")\n"
8814       "_T(\"aaaaaaaaaaaaaa\")\n"
8815       "_T(\"aaaaaaaaaaaa\")",
8816       format("  _T(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")", Style));
8817   EXPECT_EQ("f(x,\n"
8818             "  _T(\"aaaaaaaaaaaa\")\n"
8819             "  _T(\"aaa\"),\n"
8820             "  z);",
8821             format("f(x, _T(\"aaaaaaaaaaaaaaa\"), z);", Style));
8822 
8823   // FIXME: Handle embedded spaces in one iteration.
8824   //  EXPECT_EQ("_T(\"aaaaaaaaaaaaa\")\n"
8825   //            "_T(\"aaaaaaaaaaaaa\")\n"
8826   //            "_T(\"aaaaaaaaaaaaa\")\n"
8827   //            "_T(\"a\")",
8828   //            format("  _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
8829   //                   getLLVMStyleWithColumns(20)));
8830   EXPECT_EQ(
8831       "_T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )",
8832       format("  _T ( \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" )", Style));
8833   EXPECT_EQ("f(\n"
8834             "#if !TEST\n"
8835             "    _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
8836             "#endif\n"
8837             ");",
8838             format("f(\n"
8839                    "#if !TEST\n"
8840                    "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\")\n"
8841                    "#endif\n"
8842                    ");"));
8843   EXPECT_EQ("f(\n"
8844             "\n"
8845             "    _T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));",
8846             format("f(\n"
8847                    "\n"
8848                    "_T(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXn\"));"));
8849 }
8850 
8851 TEST_F(FormatTest, BreaksStringLiteralOperands) {
8852   // In a function call with two operands, the second can be broken with no line
8853   // break before it.
8854   EXPECT_EQ("func(a, \"long long \"\n"
8855             "        \"long long\");",
8856             format("func(a, \"long long long long\");",
8857                    getLLVMStyleWithColumns(24)));
8858   // In a function call with three operands, the second must be broken with a
8859   // line break before it.
8860   EXPECT_EQ("func(a,\n"
8861             "     \"long long long \"\n"
8862             "     \"long\",\n"
8863             "     c);",
8864             format("func(a, \"long long long long\", c);",
8865                    getLLVMStyleWithColumns(24)));
8866   // In a function call with three operands, the third must be broken with a
8867   // line break before it.
8868   EXPECT_EQ("func(a, b,\n"
8869             "     \"long long long \"\n"
8870             "     \"long\");",
8871             format("func(a, b, \"long long long long\");",
8872                    getLLVMStyleWithColumns(24)));
8873   // In a function call with three operands, both the second and the third must
8874   // be broken with a line break before them.
8875   EXPECT_EQ("func(a,\n"
8876             "     \"long long long \"\n"
8877             "     \"long\",\n"
8878             "     \"long long long \"\n"
8879             "     \"long\");",
8880             format("func(a, \"long long long long\", \"long long long long\");",
8881                    getLLVMStyleWithColumns(24)));
8882   // In a chain of << with two operands, the second can be broken with no line
8883   // break before it.
8884   EXPECT_EQ("a << \"line line \"\n"
8885             "     \"line\";",
8886             format("a << \"line line line\";",
8887                    getLLVMStyleWithColumns(20)));
8888   // In a chain of << with three operands, the second can be broken with no line
8889   // break before it.
8890   EXPECT_EQ("abcde << \"line \"\n"
8891             "         \"line line\"\n"
8892             "      << c;",
8893             format("abcde << \"line line line\" << c;",
8894                    getLLVMStyleWithColumns(20)));
8895   // In a chain of << with three operands, the third must be broken with a line
8896   // break before it.
8897   EXPECT_EQ("a << b\n"
8898             "  << \"line line \"\n"
8899             "     \"line\";",
8900             format("a << b << \"line line line\";",
8901                    getLLVMStyleWithColumns(20)));
8902   // In a chain of << with three operands, the second can be broken with no line
8903   // break before it and the third must be broken with a line break before it.
8904   EXPECT_EQ("abcd << \"line line \"\n"
8905             "        \"line\"\n"
8906             "     << \"line line \"\n"
8907             "        \"line\";",
8908             format("abcd << \"line line line\" << \"line line line\";",
8909                    getLLVMStyleWithColumns(20)));
8910   // In a chain of binary operators with two operands, the second can be broken
8911   // with no line break before it.
8912   EXPECT_EQ("abcd + \"line line \"\n"
8913             "       \"line line\";",
8914             format("abcd + \"line line line line\";",
8915                    getLLVMStyleWithColumns(20)));
8916   // In a chain of binary operators with three operands, the second must be
8917   // broken with a line break before it.
8918   EXPECT_EQ("abcd +\n"
8919             "    \"line line \"\n"
8920             "    \"line line\" +\n"
8921             "    e;",
8922             format("abcd + \"line line line line\" + e;",
8923                    getLLVMStyleWithColumns(20)));
8924   // In a function call with two operands, with AlignAfterOpenBracket enabled,
8925   // the first must be broken with a line break before it.
8926   FormatStyle Style = getLLVMStyleWithColumns(25);
8927   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
8928   EXPECT_EQ("someFunction(\n"
8929             "    \"long long long \"\n"
8930             "    \"long\",\n"
8931             "    a);",
8932             format("someFunction(\"long long long long\", a);", Style));
8933 }
8934 
8935 TEST_F(FormatTest, DontSplitStringLiteralsWithEscapedNewlines) {
8936   EXPECT_EQ(
8937       "aaaaaaaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8938       "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8939       "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";",
8940       format("aaaaaaaaaaa  =  \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8941              "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\n"
8942              "  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\";"));
8943 }
8944 
8945 TEST_F(FormatTest, CountsCharactersInMultilineRawStringLiterals) {
8946   EXPECT_EQ("f(g(R\"x(raw literal)x\", a), b);",
8947             format("f(g(R\"x(raw literal)x\",   a), b);", getGoogleStyle()));
8948   EXPECT_EQ("fffffffffff(g(R\"x(\n"
8949             "multiline raw string literal xxxxxxxxxxxxxx\n"
8950             ")x\",\n"
8951             "              a),\n"
8952             "            b);",
8953             format("fffffffffff(g(R\"x(\n"
8954                    "multiline raw string literal xxxxxxxxxxxxxx\n"
8955                    ")x\", a), b);",
8956                    getGoogleStyleWithColumns(20)));
8957   EXPECT_EQ("fffffffffff(\n"
8958             "    g(R\"x(qqq\n"
8959             "multiline raw string literal xxxxxxxxxxxxxx\n"
8960             ")x\",\n"
8961             "      a),\n"
8962             "    b);",
8963             format("fffffffffff(g(R\"x(qqq\n"
8964                    "multiline raw string literal xxxxxxxxxxxxxx\n"
8965                    ")x\", a), b);",
8966                    getGoogleStyleWithColumns(20)));
8967 
8968   EXPECT_EQ("fffffffffff(R\"x(\n"
8969             "multiline raw string literal xxxxxxxxxxxxxx\n"
8970             ")x\");",
8971             format("fffffffffff(R\"x(\n"
8972                    "multiline raw string literal xxxxxxxxxxxxxx\n"
8973                    ")x\");",
8974                    getGoogleStyleWithColumns(20)));
8975   EXPECT_EQ("fffffffffff(R\"x(\n"
8976             "multiline raw string literal xxxxxxxxxxxxxx\n"
8977             ")x\" + bbbbbb);",
8978             format("fffffffffff(R\"x(\n"
8979                    "multiline raw string literal xxxxxxxxxxxxxx\n"
8980                    ")x\" +   bbbbbb);",
8981                    getGoogleStyleWithColumns(20)));
8982   EXPECT_EQ("fffffffffff(\n"
8983             "    R\"x(\n"
8984             "multiline raw string literal xxxxxxxxxxxxxx\n"
8985             ")x\" +\n"
8986             "    bbbbbb);",
8987             format("fffffffffff(\n"
8988                    " R\"x(\n"
8989                    "multiline raw string literal xxxxxxxxxxxxxx\n"
8990                    ")x\" + bbbbbb);",
8991                    getGoogleStyleWithColumns(20)));
8992   EXPECT_EQ("fffffffffff(R\"(single line raw string)\" + bbbbbb);",
8993             format("fffffffffff(\n"
8994                    " R\"(single line raw string)\" + bbbbbb);"));
8995 }
8996 
8997 TEST_F(FormatTest, SkipsUnknownStringLiterals) {
8998   verifyFormat("string a = \"unterminated;");
8999   EXPECT_EQ("function(\"unterminated,\n"
9000             "         OtherParameter);",
9001             format("function(  \"unterminated,\n"
9002                    "    OtherParameter);"));
9003 }
9004 
9005 TEST_F(FormatTest, DoesNotTryToParseUDLiteralsInPreCpp11Code) {
9006   FormatStyle Style = getLLVMStyle();
9007   Style.Standard = FormatStyle::LS_Cpp03;
9008   EXPECT_EQ("#define x(_a) printf(\"foo\" _a);",
9009             format("#define x(_a) printf(\"foo\"_a);", Style));
9010 }
9011 
9012 TEST_F(FormatTest, UnderstandsCpp1y) { verifyFormat("int bi{1'000'000};"); }
9013 
9014 TEST_F(FormatTest, BreakStringLiteralsBeforeUnbreakableTokenSequence) {
9015   EXPECT_EQ("someFunction(\"aaabbbcccd\"\n"
9016             "             \"ddeeefff\");",
9017             format("someFunction(\"aaabbbcccdddeeefff\");",
9018                    getLLVMStyleWithColumns(25)));
9019   EXPECT_EQ("someFunction1234567890(\n"
9020             "    \"aaabbbcccdddeeefff\");",
9021             format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
9022                    getLLVMStyleWithColumns(26)));
9023   EXPECT_EQ("someFunction1234567890(\n"
9024             "    \"aaabbbcccdddeeeff\"\n"
9025             "    \"f\");",
9026             format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
9027                    getLLVMStyleWithColumns(25)));
9028   EXPECT_EQ("someFunction1234567890(\n"
9029             "    \"aaabbbcccdddeeeff\"\n"
9030             "    \"f\");",
9031             format("someFunction1234567890(\"aaabbbcccdddeeefff\");",
9032                    getLLVMStyleWithColumns(24)));
9033   EXPECT_EQ("someFunction(\n"
9034             "    \"aaabbbcc ddde \"\n"
9035             "    \"efff\");",
9036             format("someFunction(\"aaabbbcc ddde efff\");",
9037                    getLLVMStyleWithColumns(25)));
9038   EXPECT_EQ("someFunction(\"aaabbbccc \"\n"
9039             "             \"ddeeefff\");",
9040             format("someFunction(\"aaabbbccc ddeeefff\");",
9041                    getLLVMStyleWithColumns(25)));
9042   EXPECT_EQ("someFunction1234567890(\n"
9043             "    \"aaabb \"\n"
9044             "    \"cccdddeeefff\");",
9045             format("someFunction1234567890(\"aaabb cccdddeeefff\");",
9046                    getLLVMStyleWithColumns(25)));
9047   EXPECT_EQ("#define A          \\\n"
9048             "  string s =       \\\n"
9049             "      \"123456789\"  \\\n"
9050             "      \"0\";         \\\n"
9051             "  int i;",
9052             format("#define A string s = \"1234567890\"; int i;",
9053                    getLLVMStyleWithColumns(20)));
9054   EXPECT_EQ("someFunction(\n"
9055             "    \"aaabbbcc \"\n"
9056             "    \"dddeeefff\");",
9057             format("someFunction(\"aaabbbcc dddeeefff\");",
9058                    getLLVMStyleWithColumns(25)));
9059 }
9060 
9061 TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) {
9062   EXPECT_EQ("\"\\a\"", format("\"\\a\"", getLLVMStyleWithColumns(3)));
9063   EXPECT_EQ("\"\\\"", format("\"\\\"", getLLVMStyleWithColumns(2)));
9064   EXPECT_EQ("\"test\"\n"
9065             "\"\\n\"",
9066             format("\"test\\n\"", getLLVMStyleWithColumns(7)));
9067   EXPECT_EQ("\"tes\\\\\"\n"
9068             "\"n\"",
9069             format("\"tes\\\\n\"", getLLVMStyleWithColumns(7)));
9070   EXPECT_EQ("\"\\\\\\\\\"\n"
9071             "\"\\n\"",
9072             format("\"\\\\\\\\\\n\"", getLLVMStyleWithColumns(7)));
9073   EXPECT_EQ("\"\\uff01\"", format("\"\\uff01\"", getLLVMStyleWithColumns(7)));
9074   EXPECT_EQ("\"\\uff01\"\n"
9075             "\"test\"",
9076             format("\"\\uff01test\"", getLLVMStyleWithColumns(8)));
9077   EXPECT_EQ("\"\\Uff01ff02\"",
9078             format("\"\\Uff01ff02\"", getLLVMStyleWithColumns(11)));
9079   EXPECT_EQ("\"\\x000000000001\"\n"
9080             "\"next\"",
9081             format("\"\\x000000000001next\"", getLLVMStyleWithColumns(16)));
9082   EXPECT_EQ("\"\\x000000000001next\"",
9083             format("\"\\x000000000001next\"", getLLVMStyleWithColumns(15)));
9084   EXPECT_EQ("\"\\x000000000001\"",
9085             format("\"\\x000000000001\"", getLLVMStyleWithColumns(7)));
9086   EXPECT_EQ("\"test\"\n"
9087             "\"\\000000\"\n"
9088             "\"000001\"",
9089             format("\"test\\000000000001\"", getLLVMStyleWithColumns(9)));
9090   EXPECT_EQ("\"test\\000\"\n"
9091             "\"00000000\"\n"
9092             "\"1\"",
9093             format("\"test\\000000000001\"", getLLVMStyleWithColumns(10)));
9094 }
9095 
9096 TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) {
9097   verifyFormat("void f() {\n"
9098                "  return g() {}\n"
9099                "  void h() {}");
9100   verifyFormat("int a[] = {void forgot_closing_brace(){f();\n"
9101                "g();\n"
9102                "}");
9103 }
9104 
9105 TEST_F(FormatTest, DoNotPrematurelyEndUnwrappedLineForReturnStatements) {
9106   verifyFormat(
9107       "void f() { return C{param1, param2}.SomeCall(param1, param2); }");
9108 }
9109 
9110 TEST_F(FormatTest, FormatsClosingBracesInEmptyNestedBlocks) {
9111   verifyFormat("class X {\n"
9112                "  void f() {\n"
9113                "  }\n"
9114                "};",
9115                getLLVMStyleWithColumns(12));
9116 }
9117 
9118 TEST_F(FormatTest, ConfigurableIndentWidth) {
9119   FormatStyle EightIndent = getLLVMStyleWithColumns(18);
9120   EightIndent.IndentWidth = 8;
9121   EightIndent.ContinuationIndentWidth = 8;
9122   verifyFormat("void f() {\n"
9123                "        someFunction();\n"
9124                "        if (true) {\n"
9125                "                f();\n"
9126                "        }\n"
9127                "}",
9128                EightIndent);
9129   verifyFormat("class X {\n"
9130                "        void f() {\n"
9131                "        }\n"
9132                "};",
9133                EightIndent);
9134   verifyFormat("int x[] = {\n"
9135                "        call(),\n"
9136                "        call()};",
9137                EightIndent);
9138 }
9139 
9140 TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) {
9141   verifyFormat("double\n"
9142                "f();",
9143                getLLVMStyleWithColumns(8));
9144 }
9145 
9146 TEST_F(FormatTest, ConfigurableUseOfTab) {
9147   FormatStyle Tab = getLLVMStyleWithColumns(42);
9148   Tab.IndentWidth = 8;
9149   Tab.UseTab = FormatStyle::UT_Always;
9150   Tab.AlignEscapedNewlines = FormatStyle::ENAS_Left;
9151 
9152   EXPECT_EQ("if (aaaaaaaa && // q\n"
9153             "    bb)\t\t// w\n"
9154             "\t;",
9155             format("if (aaaaaaaa &&// q\n"
9156                    "bb)// w\n"
9157                    ";",
9158                    Tab));
9159   EXPECT_EQ("if (aaa && bbb) // w\n"
9160             "\t;",
9161             format("if(aaa&&bbb)// w\n"
9162                    ";",
9163                    Tab));
9164 
9165   verifyFormat("class X {\n"
9166                "\tvoid f() {\n"
9167                "\t\tsomeFunction(parameter1,\n"
9168                "\t\t\t     parameter2);\n"
9169                "\t}\n"
9170                "};",
9171                Tab);
9172   verifyFormat("#define A                        \\\n"
9173                "\tvoid f() {               \\\n"
9174                "\t\tsomeFunction(    \\\n"
9175                "\t\t    parameter1,  \\\n"
9176                "\t\t    parameter2); \\\n"
9177                "\t}",
9178                Tab);
9179   verifyFormat("int a;\t      // x\n"
9180                "int bbbbbbbb; // x\n",
9181                Tab);
9182 
9183   Tab.TabWidth = 4;
9184   Tab.IndentWidth = 8;
9185   verifyFormat("class TabWidth4Indent8 {\n"
9186                "\t\tvoid f() {\n"
9187                "\t\t\t\tsomeFunction(parameter1,\n"
9188                "\t\t\t\t\t\t\t parameter2);\n"
9189                "\t\t}\n"
9190                "};",
9191                Tab);
9192 
9193   Tab.TabWidth = 4;
9194   Tab.IndentWidth = 4;
9195   verifyFormat("class TabWidth4Indent4 {\n"
9196                "\tvoid f() {\n"
9197                "\t\tsomeFunction(parameter1,\n"
9198                "\t\t\t\t\t parameter2);\n"
9199                "\t}\n"
9200                "};",
9201                Tab);
9202 
9203   Tab.TabWidth = 8;
9204   Tab.IndentWidth = 4;
9205   verifyFormat("class TabWidth8Indent4 {\n"
9206                "    void f() {\n"
9207                "\tsomeFunction(parameter1,\n"
9208                "\t\t     parameter2);\n"
9209                "    }\n"
9210                "};",
9211                Tab);
9212 
9213   Tab.TabWidth = 8;
9214   Tab.IndentWidth = 8;
9215   EXPECT_EQ("/*\n"
9216             "\t      a\t\tcomment\n"
9217             "\t      in multiple lines\n"
9218             "       */",
9219             format("   /*\t \t \n"
9220                    " \t \t a\t\tcomment\t \t\n"
9221                    " \t \t in multiple lines\t\n"
9222                    " \t  */",
9223                    Tab));
9224 
9225   Tab.UseTab = FormatStyle::UT_ForIndentation;
9226   verifyFormat("{\n"
9227                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9228                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9229                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9230                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9231                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9232                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9233                "};",
9234                Tab);
9235   verifyFormat("enum AA {\n"
9236                "\ta1, // Force multiple lines\n"
9237                "\ta2,\n"
9238                "\ta3\n"
9239                "};",
9240                Tab);
9241   EXPECT_EQ("if (aaaaaaaa && // q\n"
9242             "    bb)         // w\n"
9243             "\t;",
9244             format("if (aaaaaaaa &&// q\n"
9245                    "bb)// w\n"
9246                    ";",
9247                    Tab));
9248   verifyFormat("class X {\n"
9249                "\tvoid f() {\n"
9250                "\t\tsomeFunction(parameter1,\n"
9251                "\t\t             parameter2);\n"
9252                "\t}\n"
9253                "};",
9254                Tab);
9255   verifyFormat("{\n"
9256                "\tQ(\n"
9257                "\t    {\n"
9258                "\t\t    int a;\n"
9259                "\t\t    someFunction(aaaaaaaa,\n"
9260                "\t\t                 bbbbbbb);\n"
9261                "\t    },\n"
9262                "\t    p);\n"
9263                "}",
9264                Tab);
9265   EXPECT_EQ("{\n"
9266             "\t/* aaaa\n"
9267             "\t   bbbb */\n"
9268             "}",
9269             format("{\n"
9270                    "/* aaaa\n"
9271                    "   bbbb */\n"
9272                    "}",
9273                    Tab));
9274   EXPECT_EQ("{\n"
9275             "\t/*\n"
9276             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
9277             "\t  bbbbbbbbbbbbb\n"
9278             "\t*/\n"
9279             "}",
9280             format("{\n"
9281                    "/*\n"
9282                    "  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
9283                    "*/\n"
9284                    "}",
9285                    Tab));
9286   EXPECT_EQ("{\n"
9287             "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
9288             "\t// bbbbbbbbbbbbb\n"
9289             "}",
9290             format("{\n"
9291                    "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
9292                    "}",
9293                    Tab));
9294   EXPECT_EQ("{\n"
9295             "\t/*\n"
9296             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
9297             "\t  bbbbbbbbbbbbb\n"
9298             "\t*/\n"
9299             "}",
9300             format("{\n"
9301                    "\t/*\n"
9302                    "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
9303                    "\t*/\n"
9304                    "}",
9305                    Tab));
9306   EXPECT_EQ("{\n"
9307             "\t/*\n"
9308             "\n"
9309             "\t*/\n"
9310             "}",
9311             format("{\n"
9312                    "\t/*\n"
9313                    "\n"
9314                    "\t*/\n"
9315                    "}",
9316                    Tab));
9317   EXPECT_EQ("{\n"
9318             "\t/*\n"
9319             " asdf\n"
9320             "\t*/\n"
9321             "}",
9322             format("{\n"
9323                    "\t/*\n"
9324                    " asdf\n"
9325                    "\t*/\n"
9326                    "}",
9327                    Tab));
9328 
9329   Tab.UseTab = FormatStyle::UT_Never;
9330   EXPECT_EQ("/*\n"
9331             "              a\t\tcomment\n"
9332             "              in multiple lines\n"
9333             "       */",
9334             format("   /*\t \t \n"
9335                    " \t \t a\t\tcomment\t \t\n"
9336                    " \t \t in multiple lines\t\n"
9337                    " \t  */",
9338                    Tab));
9339   EXPECT_EQ("/* some\n"
9340             "   comment */",
9341             format(" \t \t /* some\n"
9342                    " \t \t    comment */",
9343                    Tab));
9344   EXPECT_EQ("int a; /* some\n"
9345             "   comment */",
9346             format(" \t \t int a; /* some\n"
9347                    " \t \t    comment */",
9348                    Tab));
9349 
9350   EXPECT_EQ("int a; /* some\n"
9351             "comment */",
9352             format(" \t \t int\ta; /* some\n"
9353                    " \t \t    comment */",
9354                    Tab));
9355   EXPECT_EQ("f(\"\t\t\"); /* some\n"
9356             "    comment */",
9357             format(" \t \t f(\"\t\t\"); /* some\n"
9358                    " \t \t    comment */",
9359                    Tab));
9360   EXPECT_EQ("{\n"
9361             "  /*\n"
9362             "   * Comment\n"
9363             "   */\n"
9364             "  int i;\n"
9365             "}",
9366             format("{\n"
9367                    "\t/*\n"
9368                    "\t * Comment\n"
9369                    "\t */\n"
9370                    "\t int i;\n"
9371                    "}"));
9372 
9373   Tab.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
9374   Tab.TabWidth = 8;
9375   Tab.IndentWidth = 8;
9376   EXPECT_EQ("if (aaaaaaaa && // q\n"
9377             "    bb)         // w\n"
9378             "\t;",
9379             format("if (aaaaaaaa &&// q\n"
9380                    "bb)// w\n"
9381                    ";",
9382                    Tab));
9383   EXPECT_EQ("if (aaa && bbb) // w\n"
9384             "\t;",
9385             format("if(aaa&&bbb)// w\n"
9386                    ";",
9387                    Tab));
9388   verifyFormat("class X {\n"
9389                "\tvoid f() {\n"
9390                "\t\tsomeFunction(parameter1,\n"
9391                "\t\t\t     parameter2);\n"
9392                "\t}\n"
9393                "};",
9394                Tab);
9395   verifyFormat("#define A                        \\\n"
9396                "\tvoid f() {               \\\n"
9397                "\t\tsomeFunction(    \\\n"
9398                "\t\t    parameter1,  \\\n"
9399                "\t\t    parameter2); \\\n"
9400                "\t}",
9401                Tab);
9402   Tab.TabWidth = 4;
9403   Tab.IndentWidth = 8;
9404   verifyFormat("class TabWidth4Indent8 {\n"
9405                "\t\tvoid f() {\n"
9406                "\t\t\t\tsomeFunction(parameter1,\n"
9407                "\t\t\t\t\t\t\t parameter2);\n"
9408                "\t\t}\n"
9409                "};",
9410                Tab);
9411   Tab.TabWidth = 4;
9412   Tab.IndentWidth = 4;
9413   verifyFormat("class TabWidth4Indent4 {\n"
9414                "\tvoid f() {\n"
9415                "\t\tsomeFunction(parameter1,\n"
9416                "\t\t\t\t\t parameter2);\n"
9417                "\t}\n"
9418                "};",
9419                Tab);
9420   Tab.TabWidth = 8;
9421   Tab.IndentWidth = 4;
9422   verifyFormat("class TabWidth8Indent4 {\n"
9423                "    void f() {\n"
9424                "\tsomeFunction(parameter1,\n"
9425                "\t\t     parameter2);\n"
9426                "    }\n"
9427                "};",
9428                Tab);
9429   Tab.TabWidth = 8;
9430   Tab.IndentWidth = 8;
9431   EXPECT_EQ("/*\n"
9432             "\t      a\t\tcomment\n"
9433             "\t      in multiple lines\n"
9434             "       */",
9435             format("   /*\t \t \n"
9436                    " \t \t a\t\tcomment\t \t\n"
9437                    " \t \t in multiple lines\t\n"
9438                    " \t  */",
9439                    Tab));
9440   verifyFormat("{\n"
9441                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9442                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9443                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9444                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9445                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9446                "\taaaaaaaaaaaaaaaaaaaaaaaaaaaa();\n"
9447                "};",
9448                Tab);
9449   verifyFormat("enum AA {\n"
9450                "\ta1, // Force multiple lines\n"
9451                "\ta2,\n"
9452                "\ta3\n"
9453                "};",
9454                Tab);
9455   EXPECT_EQ("if (aaaaaaaa && // q\n"
9456             "    bb)         // w\n"
9457             "\t;",
9458             format("if (aaaaaaaa &&// q\n"
9459                    "bb)// w\n"
9460                    ";",
9461                    Tab));
9462   verifyFormat("class X {\n"
9463                "\tvoid f() {\n"
9464                "\t\tsomeFunction(parameter1,\n"
9465                "\t\t\t     parameter2);\n"
9466                "\t}\n"
9467                "};",
9468                Tab);
9469   verifyFormat("{\n"
9470                "\tQ(\n"
9471                "\t    {\n"
9472                "\t\t    int a;\n"
9473                "\t\t    someFunction(aaaaaaaa,\n"
9474                "\t\t\t\t bbbbbbb);\n"
9475                "\t    },\n"
9476                "\t    p);\n"
9477                "}",
9478                Tab);
9479   EXPECT_EQ("{\n"
9480             "\t/* aaaa\n"
9481             "\t   bbbb */\n"
9482             "}",
9483             format("{\n"
9484                    "/* aaaa\n"
9485                    "   bbbb */\n"
9486                    "}",
9487                    Tab));
9488   EXPECT_EQ("{\n"
9489             "\t/*\n"
9490             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
9491             "\t  bbbbbbbbbbbbb\n"
9492             "\t*/\n"
9493             "}",
9494             format("{\n"
9495                    "/*\n"
9496                    "  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
9497                    "*/\n"
9498                    "}",
9499                    Tab));
9500   EXPECT_EQ("{\n"
9501             "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
9502             "\t// bbbbbbbbbbbbb\n"
9503             "}",
9504             format("{\n"
9505                    "\t// aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
9506                    "}",
9507                    Tab));
9508   EXPECT_EQ("{\n"
9509             "\t/*\n"
9510             "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa\n"
9511             "\t  bbbbbbbbbbbbb\n"
9512             "\t*/\n"
9513             "}",
9514             format("{\n"
9515                    "\t/*\n"
9516                    "\t  aaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb\n"
9517                    "\t*/\n"
9518                    "}",
9519                    Tab));
9520   EXPECT_EQ("{\n"
9521             "\t/*\n"
9522             "\n"
9523             "\t*/\n"
9524             "}",
9525             format("{\n"
9526                    "\t/*\n"
9527                    "\n"
9528                    "\t*/\n"
9529                    "}",
9530                    Tab));
9531   EXPECT_EQ("{\n"
9532             "\t/*\n"
9533             " asdf\n"
9534             "\t*/\n"
9535             "}",
9536             format("{\n"
9537                    "\t/*\n"
9538                    " asdf\n"
9539                    "\t*/\n"
9540                    "}",
9541                    Tab));
9542   EXPECT_EQ("/*\n"
9543             "\t      a\t\tcomment\n"
9544             "\t      in multiple lines\n"
9545             "       */",
9546             format("   /*\t \t \n"
9547                    " \t \t a\t\tcomment\t \t\n"
9548                    " \t \t in multiple lines\t\n"
9549                    " \t  */",
9550                    Tab));
9551   EXPECT_EQ("/* some\n"
9552             "   comment */",
9553             format(" \t \t /* some\n"
9554                    " \t \t    comment */",
9555                    Tab));
9556   EXPECT_EQ("int a; /* some\n"
9557             "   comment */",
9558             format(" \t \t int a; /* some\n"
9559                    " \t \t    comment */",
9560                    Tab));
9561   EXPECT_EQ("int a; /* some\n"
9562             "comment */",
9563             format(" \t \t int\ta; /* some\n"
9564                    " \t \t    comment */",
9565                    Tab));
9566   EXPECT_EQ("f(\"\t\t\"); /* some\n"
9567             "    comment */",
9568             format(" \t \t f(\"\t\t\"); /* some\n"
9569                    " \t \t    comment */",
9570                    Tab));
9571   EXPECT_EQ("{\n"
9572             "  /*\n"
9573             "   * Comment\n"
9574             "   */\n"
9575             "  int i;\n"
9576             "}",
9577             format("{\n"
9578                    "\t/*\n"
9579                    "\t * Comment\n"
9580                    "\t */\n"
9581                    "\t int i;\n"
9582                    "}"));
9583   Tab.AlignConsecutiveAssignments = true;
9584   Tab.AlignConsecutiveDeclarations = true;
9585   Tab.TabWidth = 4;
9586   Tab.IndentWidth = 4;
9587   verifyFormat("class Assign {\n"
9588                "\tvoid f() {\n"
9589                "\t\tint         x      = 123;\n"
9590                "\t\tint         random = 4;\n"
9591                "\t\tstd::string alphabet =\n"
9592                "\t\t\t\"abcdefghijklmnopqrstuvwxyz\";\n"
9593                "\t}\n"
9594                "};",
9595                Tab);
9596 }
9597 
9598 TEST_F(FormatTest, CalculatesOriginalColumn) {
9599   EXPECT_EQ("\"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9600             "q\"; /* some\n"
9601             "       comment */",
9602             format("  \"qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9603                    "q\"; /* some\n"
9604                    "       comment */",
9605                    getLLVMStyle()));
9606   EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
9607             "/* some\n"
9608             "   comment */",
9609             format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\n"
9610                    " /* some\n"
9611                    "    comment */",
9612                    getLLVMStyle()));
9613   EXPECT_EQ("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9614             "qqq\n"
9615             "/* some\n"
9616             "   comment */",
9617             format("// qqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9618                    "qqq\n"
9619                    " /* some\n"
9620                    "    comment */",
9621                    getLLVMStyle()));
9622   EXPECT_EQ("inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9623             "wwww; /* some\n"
9624             "         comment */",
9625             format("  inttt qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\\\n"
9626                    "wwww; /* some\n"
9627                    "         comment */",
9628                    getLLVMStyle()));
9629 }
9630 
9631 TEST_F(FormatTest, ConfigurableSpaceBeforeParens) {
9632   FormatStyle NoSpace = getLLVMStyle();
9633   NoSpace.SpaceBeforeParens = FormatStyle::SBPO_Never;
9634 
9635   verifyFormat("while(true)\n"
9636                "  continue;",
9637                NoSpace);
9638   verifyFormat("for(;;)\n"
9639                "  continue;",
9640                NoSpace);
9641   verifyFormat("if(true)\n"
9642                "  f();\n"
9643                "else if(true)\n"
9644                "  f();",
9645                NoSpace);
9646   verifyFormat("do {\n"
9647                "  do_something();\n"
9648                "} while(something());",
9649                NoSpace);
9650   verifyFormat("switch(x) {\n"
9651                "default:\n"
9652                "  break;\n"
9653                "}",
9654                NoSpace);
9655   verifyFormat("auto i = std::make_unique<int>(5);", NoSpace);
9656   verifyFormat("size_t x = sizeof(x);", NoSpace);
9657   verifyFormat("auto f(int x) -> decltype(x);", NoSpace);
9658   verifyFormat("int f(T x) noexcept(x.create());", NoSpace);
9659   verifyFormat("alignas(128) char a[128];", NoSpace);
9660   verifyFormat("size_t x = alignof(MyType);", NoSpace);
9661   verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace);
9662   verifyFormat("int f() throw(Deprecated);", NoSpace);
9663   verifyFormat("typedef void (*cb)(int);", NoSpace);
9664   verifyFormat("T A::operator()();", NoSpace);
9665   verifyFormat("X A::operator++(T);", NoSpace);
9666   verifyFormat("auto lambda = []() { return 0; };", NoSpace);
9667 
9668   FormatStyle Space = getLLVMStyle();
9669   Space.SpaceBeforeParens = FormatStyle::SBPO_Always;
9670 
9671   verifyFormat("int f ();", Space);
9672   verifyFormat("void f (int a, T b) {\n"
9673                "  while (true)\n"
9674                "    continue;\n"
9675                "}",
9676                Space);
9677   verifyFormat("if (true)\n"
9678                "  f ();\n"
9679                "else if (true)\n"
9680                "  f ();",
9681                Space);
9682   verifyFormat("do {\n"
9683                "  do_something ();\n"
9684                "} while (something ());",
9685                Space);
9686   verifyFormat("switch (x) {\n"
9687                "default:\n"
9688                "  break;\n"
9689                "}",
9690                Space);
9691   verifyFormat("A::A () : a (1) {}", Space);
9692   verifyFormat("void f () __attribute__ ((asdf));", Space);
9693   verifyFormat("*(&a + 1);\n"
9694                "&((&a)[1]);\n"
9695                "a[(b + c) * d];\n"
9696                "(((a + 1) * 2) + 3) * 4;",
9697                Space);
9698   verifyFormat("#define A(x) x", Space);
9699   verifyFormat("#define A (x) x", Space);
9700   verifyFormat("#if defined(x)\n"
9701                "#endif",
9702                Space);
9703   verifyFormat("auto i = std::make_unique<int> (5);", Space);
9704   verifyFormat("size_t x = sizeof (x);", Space);
9705   verifyFormat("auto f (int x) -> decltype (x);", Space);
9706   verifyFormat("int f (T x) noexcept (x.create ());", Space);
9707   verifyFormat("alignas (128) char a[128];", Space);
9708   verifyFormat("size_t x = alignof (MyType);", Space);
9709   verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space);
9710   verifyFormat("int f () throw (Deprecated);", Space);
9711   verifyFormat("typedef void (*cb) (int);", Space);
9712   verifyFormat("T A::operator() ();", Space);
9713   verifyFormat("X A::operator++ (T);", Space);
9714   verifyFormat("auto lambda = [] () { return 0; };", Space);
9715   verifyFormat("int x = int (y);", Space);
9716 
9717   FormatStyle SomeSpace = getLLVMStyle();
9718   SomeSpace.SpaceBeforeParens = FormatStyle::SBPO_NonEmptyParentheses;
9719 
9720   verifyFormat("[]() -> float {}", SomeSpace);
9721   verifyFormat("[] (auto foo) {}", SomeSpace);
9722   verifyFormat("[foo]() -> int {}", SomeSpace);
9723   verifyFormat("int f();", SomeSpace);
9724   verifyFormat("void f (int a, T b) {\n"
9725                "  while (true)\n"
9726                "    continue;\n"
9727                "}",
9728                SomeSpace);
9729   verifyFormat("if (true)\n"
9730                "  f();\n"
9731                "else if (true)\n"
9732                "  f();",
9733                SomeSpace);
9734   verifyFormat("do {\n"
9735                "  do_something();\n"
9736                "} while (something());",
9737                SomeSpace);
9738   verifyFormat("switch (x) {\n"
9739                "default:\n"
9740                "  break;\n"
9741                "}",
9742                SomeSpace);
9743   verifyFormat("A::A() : a (1) {}", SomeSpace);
9744   verifyFormat("void f() __attribute__ ((asdf));", SomeSpace);
9745   verifyFormat("*(&a + 1);\n"
9746                "&((&a)[1]);\n"
9747                "a[(b + c) * d];\n"
9748                "(((a + 1) * 2) + 3) * 4;",
9749                SomeSpace);
9750   verifyFormat("#define A(x) x", SomeSpace);
9751   verifyFormat("#define A (x) x", SomeSpace);
9752   verifyFormat("#if defined(x)\n"
9753                "#endif",
9754                SomeSpace);
9755   verifyFormat("auto i = std::make_unique<int> (5);", SomeSpace);
9756   verifyFormat("size_t x = sizeof (x);", SomeSpace);
9757   verifyFormat("auto f (int x) -> decltype (x);", SomeSpace);
9758   verifyFormat("int f (T x) noexcept (x.create());", SomeSpace);
9759   verifyFormat("alignas (128) char a[128];", SomeSpace);
9760   verifyFormat("size_t x = alignof (MyType);", SomeSpace);
9761   verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");",
9762                SomeSpace);
9763   verifyFormat("int f() throw (Deprecated);", SomeSpace);
9764   verifyFormat("typedef void (*cb) (int);", SomeSpace);
9765   verifyFormat("T A::operator()();", SomeSpace);
9766   verifyFormat("X A::operator++ (T);", SomeSpace);
9767   verifyFormat("int x = int (y);", SomeSpace);
9768   verifyFormat("auto lambda = []() { return 0; };", SomeSpace);
9769 }
9770 
9771 TEST_F(FormatTest, SpaceAfterLogicalNot) {
9772   FormatStyle Spaces = getLLVMStyle();
9773   Spaces.SpaceAfterLogicalNot = true;
9774 
9775   verifyFormat("bool x = ! y", Spaces);
9776   verifyFormat("if (! isFailure())", Spaces);
9777   verifyFormat("if (! (a && b))", Spaces);
9778   verifyFormat("\"Error!\"", Spaces);
9779   verifyFormat("! ! x", Spaces);
9780 }
9781 
9782 TEST_F(FormatTest, ConfigurableSpacesInParentheses) {
9783   FormatStyle Spaces = getLLVMStyle();
9784 
9785   Spaces.SpacesInParentheses = true;
9786   verifyFormat("do_something( ::globalVar );", Spaces);
9787   verifyFormat("call( x, y, z );", Spaces);
9788   verifyFormat("call();", Spaces);
9789   verifyFormat("std::function<void( int, int )> callback;", Spaces);
9790   verifyFormat("void inFunction() { std::function<void( int, int )> fct; }",
9791                Spaces);
9792   verifyFormat("while ( (bool)1 )\n"
9793                "  continue;",
9794                Spaces);
9795   verifyFormat("for ( ;; )\n"
9796                "  continue;",
9797                Spaces);
9798   verifyFormat("if ( true )\n"
9799                "  f();\n"
9800                "else if ( true )\n"
9801                "  f();",
9802                Spaces);
9803   verifyFormat("do {\n"
9804                "  do_something( (int)i );\n"
9805                "} while ( something() );",
9806                Spaces);
9807   verifyFormat("switch ( x ) {\n"
9808                "default:\n"
9809                "  break;\n"
9810                "}",
9811                Spaces);
9812 
9813   Spaces.SpacesInParentheses = false;
9814   Spaces.SpacesInCStyleCastParentheses = true;
9815   verifyFormat("Type *A = ( Type * )P;", Spaces);
9816   verifyFormat("Type *A = ( vector<Type *, int *> )P;", Spaces);
9817   verifyFormat("x = ( int32 )y;", Spaces);
9818   verifyFormat("int a = ( int )(2.0f);", Spaces);
9819   verifyFormat("#define AA(X) sizeof((( X * )NULL)->a)", Spaces);
9820   verifyFormat("my_int a = ( my_int )sizeof(int);", Spaces);
9821   verifyFormat("#define x (( int )-1)", Spaces);
9822 
9823   // Run the first set of tests again with:
9824   Spaces.SpacesInParentheses = false;
9825   Spaces.SpaceInEmptyParentheses = true;
9826   Spaces.SpacesInCStyleCastParentheses = true;
9827   verifyFormat("call(x, y, z);", Spaces);
9828   verifyFormat("call( );", Spaces);
9829   verifyFormat("std::function<void(int, int)> callback;", Spaces);
9830   verifyFormat("while (( bool )1)\n"
9831                "  continue;",
9832                Spaces);
9833   verifyFormat("for (;;)\n"
9834                "  continue;",
9835                Spaces);
9836   verifyFormat("if (true)\n"
9837                "  f( );\n"
9838                "else if (true)\n"
9839                "  f( );",
9840                Spaces);
9841   verifyFormat("do {\n"
9842                "  do_something(( int )i);\n"
9843                "} while (something( ));",
9844                Spaces);
9845   verifyFormat("switch (x) {\n"
9846                "default:\n"
9847                "  break;\n"
9848                "}",
9849                Spaces);
9850 
9851   // Run the first set of tests again with:
9852   Spaces.SpaceAfterCStyleCast = true;
9853   verifyFormat("call(x, y, z);", Spaces);
9854   verifyFormat("call( );", Spaces);
9855   verifyFormat("std::function<void(int, int)> callback;", Spaces);
9856   verifyFormat("while (( bool ) 1)\n"
9857                "  continue;",
9858                Spaces);
9859   verifyFormat("for (;;)\n"
9860                "  continue;",
9861                Spaces);
9862   verifyFormat("if (true)\n"
9863                "  f( );\n"
9864                "else if (true)\n"
9865                "  f( );",
9866                Spaces);
9867   verifyFormat("do {\n"
9868                "  do_something(( int ) i);\n"
9869                "} while (something( ));",
9870                Spaces);
9871   verifyFormat("switch (x) {\n"
9872                "default:\n"
9873                "  break;\n"
9874                "}",
9875                Spaces);
9876 
9877   // Run subset of tests again with:
9878   Spaces.SpacesInCStyleCastParentheses = false;
9879   Spaces.SpaceAfterCStyleCast = true;
9880   verifyFormat("while ((bool) 1)\n"
9881                "  continue;",
9882                Spaces);
9883   verifyFormat("do {\n"
9884                "  do_something((int) i);\n"
9885                "} while (something( ));",
9886                Spaces);
9887 }
9888 
9889 TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) {
9890   verifyFormat("int a[5];");
9891   verifyFormat("a[3] += 42;");
9892 
9893   FormatStyle Spaces = getLLVMStyle();
9894   Spaces.SpacesInSquareBrackets = true;
9895   // Lambdas unchanged.
9896   verifyFormat("int c = []() -> int { return 2; }();\n", Spaces);
9897   verifyFormat("return [i, args...] {};", Spaces);
9898 
9899   // Not lambdas.
9900   verifyFormat("int a[ 5 ];", Spaces);
9901   verifyFormat("a[ 3 ] += 42;", Spaces);
9902   verifyFormat("constexpr char hello[]{\"hello\"};", Spaces);
9903   verifyFormat("double &operator[](int i) { return 0; }\n"
9904                "int i;",
9905                Spaces);
9906   verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces);
9907   verifyFormat("int i = a[ a ][ a ]->f();", Spaces);
9908   verifyFormat("int i = (*b)[ a ]->f();", Spaces);
9909 }
9910 
9911 TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) {
9912   verifyFormat("int a = 5;");
9913   verifyFormat("a += 42;");
9914   verifyFormat("a or_eq 8;");
9915 
9916   FormatStyle Spaces = getLLVMStyle();
9917   Spaces.SpaceBeforeAssignmentOperators = false;
9918   verifyFormat("int a= 5;", Spaces);
9919   verifyFormat("a+= 42;", Spaces);
9920   verifyFormat("a or_eq 8;", Spaces);
9921 }
9922 
9923 TEST_F(FormatTest, ConfigurableSpaceBeforeColon) {
9924   verifyFormat("class Foo : public Bar {};");
9925   verifyFormat("Foo::Foo() : foo(1) {}");
9926   verifyFormat("for (auto a : b) {\n}");
9927   verifyFormat("int x = a ? b : c;");
9928   verifyFormat("{\n"
9929                "label0:\n"
9930                "  int x = 0;\n"
9931                "}");
9932   verifyFormat("switch (x) {\n"
9933                "case 1:\n"
9934                "default:\n"
9935                "}");
9936 
9937   FormatStyle CtorInitializerStyle = getLLVMStyleWithColumns(30);
9938   CtorInitializerStyle.SpaceBeforeCtorInitializerColon = false;
9939   verifyFormat("class Foo : public Bar {};", CtorInitializerStyle);
9940   verifyFormat("Foo::Foo(): foo(1) {}", CtorInitializerStyle);
9941   verifyFormat("for (auto a : b) {\n}", CtorInitializerStyle);
9942   verifyFormat("int x = a ? b : c;", CtorInitializerStyle);
9943   verifyFormat("{\n"
9944                "label1:\n"
9945                "  int x = 0;\n"
9946                "}",
9947                CtorInitializerStyle);
9948   verifyFormat("switch (x) {\n"
9949                "case 1:\n"
9950                "default:\n"
9951                "}",
9952                CtorInitializerStyle);
9953   CtorInitializerStyle.BreakConstructorInitializers =
9954       FormatStyle::BCIS_AfterColon;
9955   verifyFormat("Fooooooooooo::Fooooooooooo():\n"
9956                "    aaaaaaaaaaaaaaaa(1),\n"
9957                "    bbbbbbbbbbbbbbbb(2) {}",
9958                CtorInitializerStyle);
9959   CtorInitializerStyle.BreakConstructorInitializers =
9960       FormatStyle::BCIS_BeforeComma;
9961   verifyFormat("Fooooooooooo::Fooooooooooo()\n"
9962                "    : aaaaaaaaaaaaaaaa(1)\n"
9963                "    , bbbbbbbbbbbbbbbb(2) {}",
9964                CtorInitializerStyle);
9965   CtorInitializerStyle.BreakConstructorInitializers =
9966       FormatStyle::BCIS_BeforeColon;
9967   verifyFormat("Fooooooooooo::Fooooooooooo()\n"
9968                "    : aaaaaaaaaaaaaaaa(1),\n"
9969                "      bbbbbbbbbbbbbbbb(2) {}",
9970                CtorInitializerStyle);
9971   CtorInitializerStyle.ConstructorInitializerIndentWidth = 0;
9972   verifyFormat("Fooooooooooo::Fooooooooooo()\n"
9973                ": aaaaaaaaaaaaaaaa(1),\n"
9974                "  bbbbbbbbbbbbbbbb(2) {}",
9975                CtorInitializerStyle);
9976 
9977   FormatStyle InheritanceStyle = getLLVMStyleWithColumns(30);
9978   InheritanceStyle.SpaceBeforeInheritanceColon = false;
9979   verifyFormat("class Foo: public Bar {};", InheritanceStyle);
9980   verifyFormat("Foo::Foo() : foo(1) {}", InheritanceStyle);
9981   verifyFormat("for (auto a : b) {\n}", InheritanceStyle);
9982   verifyFormat("int x = a ? b : c;", InheritanceStyle);
9983   verifyFormat("{\n"
9984                "label2:\n"
9985                "  int x = 0;\n"
9986                "}",
9987                InheritanceStyle);
9988   verifyFormat("switch (x) {\n"
9989                "case 1:\n"
9990                "default:\n"
9991                "}",
9992                InheritanceStyle);
9993   InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_AfterColon;
9994   verifyFormat("class Foooooooooooooooooooooo:\n"
9995                "    public aaaaaaaaaaaaaaaaaa,\n"
9996                "    public bbbbbbbbbbbbbbbbbb {\n"
9997                "}",
9998                InheritanceStyle);
9999   InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeComma;
10000   verifyFormat("class Foooooooooooooooooooooo\n"
10001                "    : public aaaaaaaaaaaaaaaaaa\n"
10002                "    , public bbbbbbbbbbbbbbbbbb {\n"
10003                "}",
10004                InheritanceStyle);
10005   InheritanceStyle.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
10006   verifyFormat("class Foooooooooooooooooooooo\n"
10007                "    : public aaaaaaaaaaaaaaaaaa,\n"
10008                "      public bbbbbbbbbbbbbbbbbb {\n"
10009                "}",
10010                InheritanceStyle);
10011   InheritanceStyle.ConstructorInitializerIndentWidth = 0;
10012   verifyFormat("class Foooooooooooooooooooooo\n"
10013                ": public aaaaaaaaaaaaaaaaaa,\n"
10014                "  public bbbbbbbbbbbbbbbbbb {}",
10015                InheritanceStyle);
10016 
10017   FormatStyle ForLoopStyle = getLLVMStyle();
10018   ForLoopStyle.SpaceBeforeRangeBasedForLoopColon = false;
10019   verifyFormat("class Foo : public Bar {};", ForLoopStyle);
10020   verifyFormat("Foo::Foo() : foo(1) {}", ForLoopStyle);
10021   verifyFormat("for (auto a: b) {\n}", ForLoopStyle);
10022   verifyFormat("int x = a ? b : c;", ForLoopStyle);
10023   verifyFormat("{\n"
10024                "label2:\n"
10025                "  int x = 0;\n"
10026                "}",
10027                ForLoopStyle);
10028   verifyFormat("switch (x) {\n"
10029                "case 1:\n"
10030                "default:\n"
10031                "}",
10032                ForLoopStyle);
10033 
10034   FormatStyle NoSpaceStyle = getLLVMStyle();
10035   NoSpaceStyle.SpaceBeforeCtorInitializerColon = false;
10036   NoSpaceStyle.SpaceBeforeInheritanceColon = false;
10037   NoSpaceStyle.SpaceBeforeRangeBasedForLoopColon = false;
10038   verifyFormat("class Foo: public Bar {};", NoSpaceStyle);
10039   verifyFormat("Foo::Foo(): foo(1) {}", NoSpaceStyle);
10040   verifyFormat("for (auto a: b) {\n}", NoSpaceStyle);
10041   verifyFormat("int x = a ? b : c;", NoSpaceStyle);
10042   verifyFormat("{\n"
10043                "label3:\n"
10044                "  int x = 0;\n"
10045                "}",
10046                NoSpaceStyle);
10047   verifyFormat("switch (x) {\n"
10048                "case 1:\n"
10049                "default:\n"
10050                "}",
10051                NoSpaceStyle);
10052 }
10053 
10054 TEST_F(FormatTest, AlignConsecutiveAssignments) {
10055   FormatStyle Alignment = getLLVMStyle();
10056   Alignment.AlignConsecutiveAssignments = false;
10057   verifyFormat("int a = 5;\n"
10058                "int oneTwoThree = 123;",
10059                Alignment);
10060   verifyFormat("int a = 5;\n"
10061                "int oneTwoThree = 123;",
10062                Alignment);
10063 
10064   Alignment.AlignConsecutiveAssignments = true;
10065   verifyFormat("int a           = 5;\n"
10066                "int oneTwoThree = 123;",
10067                Alignment);
10068   verifyFormat("int a           = method();\n"
10069                "int oneTwoThree = 133;",
10070                Alignment);
10071   verifyFormat("a &= 5;\n"
10072                "bcd *= 5;\n"
10073                "ghtyf += 5;\n"
10074                "dvfvdb -= 5;\n"
10075                "a /= 5;\n"
10076                "vdsvsv %= 5;\n"
10077                "sfdbddfbdfbb ^= 5;\n"
10078                "dvsdsv |= 5;\n"
10079                "int dsvvdvsdvvv = 123;",
10080                Alignment);
10081   verifyFormat("int i = 1, j = 10;\n"
10082                "something = 2000;",
10083                Alignment);
10084   verifyFormat("something = 2000;\n"
10085                "int i = 1, j = 10;\n",
10086                Alignment);
10087   verifyFormat("something = 2000;\n"
10088                "another   = 911;\n"
10089                "int i = 1, j = 10;\n"
10090                "oneMore = 1;\n"
10091                "i       = 2;",
10092                Alignment);
10093   verifyFormat("int a   = 5;\n"
10094                "int one = 1;\n"
10095                "method();\n"
10096                "int oneTwoThree = 123;\n"
10097                "int oneTwo      = 12;",
10098                Alignment);
10099   verifyFormat("int oneTwoThree = 123;\n"
10100                "int oneTwo      = 12;\n"
10101                "method();\n",
10102                Alignment);
10103   verifyFormat("int oneTwoThree = 123; // comment\n"
10104                "int oneTwo      = 12;  // comment",
10105                Alignment);
10106   EXPECT_EQ("int a = 5;\n"
10107             "\n"
10108             "int oneTwoThree = 123;",
10109             format("int a       = 5;\n"
10110                    "\n"
10111                    "int oneTwoThree= 123;",
10112                    Alignment));
10113   EXPECT_EQ("int a   = 5;\n"
10114             "int one = 1;\n"
10115             "\n"
10116             "int oneTwoThree = 123;",
10117             format("int a = 5;\n"
10118                    "int one = 1;\n"
10119                    "\n"
10120                    "int oneTwoThree = 123;",
10121                    Alignment));
10122   EXPECT_EQ("int a   = 5;\n"
10123             "int one = 1;\n"
10124             "\n"
10125             "int oneTwoThree = 123;\n"
10126             "int oneTwo      = 12;",
10127             format("int a = 5;\n"
10128                    "int one = 1;\n"
10129                    "\n"
10130                    "int oneTwoThree = 123;\n"
10131                    "int oneTwo = 12;",
10132                    Alignment));
10133   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
10134   verifyFormat("#define A \\\n"
10135                "  int aaaa       = 12; \\\n"
10136                "  int b          = 23; \\\n"
10137                "  int ccc        = 234; \\\n"
10138                "  int dddddddddd = 2345;",
10139                Alignment);
10140   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
10141   verifyFormat("#define A               \\\n"
10142                "  int aaaa       = 12;  \\\n"
10143                "  int b          = 23;  \\\n"
10144                "  int ccc        = 234; \\\n"
10145                "  int dddddddddd = 2345;",
10146                Alignment);
10147   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
10148   verifyFormat("#define A                                                      "
10149                "                \\\n"
10150                "  int aaaa       = 12;                                         "
10151                "                \\\n"
10152                "  int b          = 23;                                         "
10153                "                \\\n"
10154                "  int ccc        = 234;                                        "
10155                "                \\\n"
10156                "  int dddddddddd = 2345;",
10157                Alignment);
10158   verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
10159                "k = 4, int l = 5,\n"
10160                "                  int m = 6) {\n"
10161                "  int j      = 10;\n"
10162                "  otherThing = 1;\n"
10163                "}",
10164                Alignment);
10165   verifyFormat("void SomeFunction(int parameter = 0) {\n"
10166                "  int i   = 1;\n"
10167                "  int j   = 2;\n"
10168                "  int big = 10000;\n"
10169                "}",
10170                Alignment);
10171   verifyFormat("class C {\n"
10172                "public:\n"
10173                "  int i            = 1;\n"
10174                "  virtual void f() = 0;\n"
10175                "};",
10176                Alignment);
10177   verifyFormat("int i = 1;\n"
10178                "if (SomeType t = getSomething()) {\n"
10179                "}\n"
10180                "int j   = 2;\n"
10181                "int big = 10000;",
10182                Alignment);
10183   verifyFormat("int j = 7;\n"
10184                "for (int k = 0; k < N; ++k) {\n"
10185                "}\n"
10186                "int j   = 2;\n"
10187                "int big = 10000;\n"
10188                "}",
10189                Alignment);
10190   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
10191   verifyFormat("int i = 1;\n"
10192                "LooooooooooongType loooooooooooooooooooooongVariable\n"
10193                "    = someLooooooooooooooooongFunction();\n"
10194                "int j = 2;",
10195                Alignment);
10196   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
10197   verifyFormat("int i = 1;\n"
10198                "LooooooooooongType loooooooooooooooooooooongVariable =\n"
10199                "    someLooooooooooooooooongFunction();\n"
10200                "int j = 2;",
10201                Alignment);
10202 
10203   verifyFormat("auto lambda = []() {\n"
10204                "  auto i = 0;\n"
10205                "  return 0;\n"
10206                "};\n"
10207                "int i  = 0;\n"
10208                "auto v = type{\n"
10209                "    i = 1,   //\n"
10210                "    (i = 2), //\n"
10211                "    i = 3    //\n"
10212                "};",
10213                Alignment);
10214 
10215   verifyFormat(
10216       "int i      = 1;\n"
10217       "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
10218       "                          loooooooooooooooooooooongParameterB);\n"
10219       "int j      = 2;",
10220       Alignment);
10221 
10222   verifyFormat("template <typename T, typename T_0 = very_long_type_name_0,\n"
10223                "          typename B   = very_long_type_name_1,\n"
10224                "          typename T_2 = very_long_type_name_2>\n"
10225                "auto foo() {}\n",
10226                Alignment);
10227   verifyFormat("int a, b = 1;\n"
10228                "int c  = 2;\n"
10229                "int dd = 3;\n",
10230                Alignment);
10231   verifyFormat("int aa       = ((1 > 2) ? 3 : 4);\n"
10232                "float b[1][] = {{3.f}};\n",
10233                Alignment);
10234   verifyFormat("for (int i = 0; i < 1; i++)\n"
10235                "  int x = 1;\n",
10236                Alignment);
10237   verifyFormat("for (i = 0; i < 1; i++)\n"
10238                "  x = 1;\n"
10239                "y = 1;\n",
10240                Alignment);
10241 }
10242 
10243 TEST_F(FormatTest, AlignConsecutiveDeclarations) {
10244   FormatStyle Alignment = getLLVMStyle();
10245   Alignment.AlignConsecutiveDeclarations = false;
10246   verifyFormat("float const a = 5;\n"
10247                "int oneTwoThree = 123;",
10248                Alignment);
10249   verifyFormat("int a = 5;\n"
10250                "float const oneTwoThree = 123;",
10251                Alignment);
10252 
10253   Alignment.AlignConsecutiveDeclarations = true;
10254   verifyFormat("float const a = 5;\n"
10255                "int         oneTwoThree = 123;",
10256                Alignment);
10257   verifyFormat("int         a = method();\n"
10258                "float const oneTwoThree = 133;",
10259                Alignment);
10260   verifyFormat("int i = 1, j = 10;\n"
10261                "something = 2000;",
10262                Alignment);
10263   verifyFormat("something = 2000;\n"
10264                "int i = 1, j = 10;\n",
10265                Alignment);
10266   verifyFormat("float      something = 2000;\n"
10267                "double     another = 911;\n"
10268                "int        i = 1, j = 10;\n"
10269                "const int *oneMore = 1;\n"
10270                "unsigned   i = 2;",
10271                Alignment);
10272   verifyFormat("float a = 5;\n"
10273                "int   one = 1;\n"
10274                "method();\n"
10275                "const double       oneTwoThree = 123;\n"
10276                "const unsigned int oneTwo = 12;",
10277                Alignment);
10278   verifyFormat("int      oneTwoThree{0}; // comment\n"
10279                "unsigned oneTwo;         // comment",
10280                Alignment);
10281   EXPECT_EQ("float const a = 5;\n"
10282             "\n"
10283             "int oneTwoThree = 123;",
10284             format("float const   a = 5;\n"
10285                    "\n"
10286                    "int           oneTwoThree= 123;",
10287                    Alignment));
10288   EXPECT_EQ("float a = 5;\n"
10289             "int   one = 1;\n"
10290             "\n"
10291             "unsigned oneTwoThree = 123;",
10292             format("float    a = 5;\n"
10293                    "int      one = 1;\n"
10294                    "\n"
10295                    "unsigned oneTwoThree = 123;",
10296                    Alignment));
10297   EXPECT_EQ("float a = 5;\n"
10298             "int   one = 1;\n"
10299             "\n"
10300             "unsigned oneTwoThree = 123;\n"
10301             "int      oneTwo = 12;",
10302             format("float    a = 5;\n"
10303                    "int one = 1;\n"
10304                    "\n"
10305                    "unsigned oneTwoThree = 123;\n"
10306                    "int oneTwo = 12;",
10307                    Alignment));
10308   // Function prototype alignment
10309   verifyFormat("int    a();\n"
10310                "double b();",
10311                Alignment);
10312   verifyFormat("int    a(int x);\n"
10313                "double b();",
10314                Alignment);
10315   unsigned OldColumnLimit = Alignment.ColumnLimit;
10316   // We need to set ColumnLimit to zero, in order to stress nested alignments,
10317   // otherwise the function parameters will be re-flowed onto a single line.
10318   Alignment.ColumnLimit = 0;
10319   EXPECT_EQ("int    a(int   x,\n"
10320             "         float y);\n"
10321             "double b(int    x,\n"
10322             "         double y);",
10323             format("int a(int x,\n"
10324                    " float y);\n"
10325                    "double b(int x,\n"
10326                    " double y);",
10327                    Alignment));
10328   // This ensures that function parameters of function declarations are
10329   // correctly indented when their owning functions are indented.
10330   // The failure case here is for 'double y' to not be indented enough.
10331   EXPECT_EQ("double a(int x);\n"
10332             "int    b(int    y,\n"
10333             "         double z);",
10334             format("double a(int x);\n"
10335                    "int b(int y,\n"
10336                    " double z);",
10337                    Alignment));
10338   // Set ColumnLimit low so that we induce wrapping immediately after
10339   // the function name and opening paren.
10340   Alignment.ColumnLimit = 13;
10341   verifyFormat("int function(\n"
10342                "    int  x,\n"
10343                "    bool y);",
10344                Alignment);
10345   Alignment.ColumnLimit = OldColumnLimit;
10346   // Ensure function pointers don't screw up recursive alignment
10347   verifyFormat("int    a(int x, void (*fp)(int y));\n"
10348                "double b();",
10349                Alignment);
10350   Alignment.AlignConsecutiveAssignments = true;
10351   // Ensure recursive alignment is broken by function braces, so that the
10352   // "a = 1" does not align with subsequent assignments inside the function
10353   // body.
10354   verifyFormat("int func(int a = 1) {\n"
10355                "  int b  = 2;\n"
10356                "  int cc = 3;\n"
10357                "}",
10358                Alignment);
10359   verifyFormat("float      something = 2000;\n"
10360                "double     another   = 911;\n"
10361                "int        i = 1, j = 10;\n"
10362                "const int *oneMore = 1;\n"
10363                "unsigned   i       = 2;",
10364                Alignment);
10365   verifyFormat("int      oneTwoThree = {0}; // comment\n"
10366                "unsigned oneTwo      = 0;   // comment",
10367                Alignment);
10368   // Make sure that scope is correctly tracked, in the absence of braces
10369   verifyFormat("for (int i = 0; i < n; i++)\n"
10370                "  j = i;\n"
10371                "double x = 1;\n",
10372                Alignment);
10373   verifyFormat("if (int i = 0)\n"
10374                "  j = i;\n"
10375                "double x = 1;\n",
10376                Alignment);
10377   // Ensure operator[] and operator() are comprehended
10378   verifyFormat("struct test {\n"
10379                "  long long int foo();\n"
10380                "  int           operator[](int a);\n"
10381                "  double        bar();\n"
10382                "};\n",
10383                Alignment);
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   EXPECT_EQ("void SomeFunction(int parameter = 0) {\n"
10391             "  int const i   = 1;\n"
10392             "  int *     j   = 2;\n"
10393             "  int       big = 10000;\n"
10394             "\n"
10395             "  unsigned oneTwoThree = 123;\n"
10396             "  int      oneTwo      = 12;\n"
10397             "  method();\n"
10398             "  float k  = 2;\n"
10399             "  int   ll = 10000;\n"
10400             "}",
10401             format("void SomeFunction(int parameter= 0) {\n"
10402                    " int const  i= 1;\n"
10403                    "  int *j=2;\n"
10404                    " int big  =  10000;\n"
10405                    "\n"
10406                    "unsigned oneTwoThree  =123;\n"
10407                    "int oneTwo = 12;\n"
10408                    "  method();\n"
10409                    "float k= 2;\n"
10410                    "int ll=10000;\n"
10411                    "}",
10412                    Alignment));
10413   Alignment.AlignConsecutiveAssignments = false;
10414   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_DontAlign;
10415   verifyFormat("#define A \\\n"
10416                "  int       aaaa = 12; \\\n"
10417                "  float     b = 23; \\\n"
10418                "  const int ccc = 234; \\\n"
10419                "  unsigned  dddddddddd = 2345;",
10420                Alignment);
10421   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Left;
10422   verifyFormat("#define A              \\\n"
10423                "  int       aaaa = 12; \\\n"
10424                "  float     b = 23;    \\\n"
10425                "  const int ccc = 234; \\\n"
10426                "  unsigned  dddddddddd = 2345;",
10427                Alignment);
10428   Alignment.AlignEscapedNewlines = FormatStyle::ENAS_Right;
10429   Alignment.ColumnLimit = 30;
10430   verifyFormat("#define A                    \\\n"
10431                "  int       aaaa = 12;       \\\n"
10432                "  float     b = 23;          \\\n"
10433                "  const int ccc = 234;       \\\n"
10434                "  int       dddddddddd = 2345;",
10435                Alignment);
10436   Alignment.ColumnLimit = 80;
10437   verifyFormat("void SomeFunction(int parameter = 1, int i = 2, int j = 3, int "
10438                "k = 4, int l = 5,\n"
10439                "                  int m = 6) {\n"
10440                "  const int j = 10;\n"
10441                "  otherThing = 1;\n"
10442                "}",
10443                Alignment);
10444   verifyFormat("void SomeFunction(int parameter = 0) {\n"
10445                "  int const i = 1;\n"
10446                "  int *     j = 2;\n"
10447                "  int       big = 10000;\n"
10448                "}",
10449                Alignment);
10450   verifyFormat("class C {\n"
10451                "public:\n"
10452                "  int          i = 1;\n"
10453                "  virtual void f() = 0;\n"
10454                "};",
10455                Alignment);
10456   verifyFormat("float i = 1;\n"
10457                "if (SomeType t = getSomething()) {\n"
10458                "}\n"
10459                "const unsigned j = 2;\n"
10460                "int            big = 10000;",
10461                Alignment);
10462   verifyFormat("float j = 7;\n"
10463                "for (int k = 0; k < N; ++k) {\n"
10464                "}\n"
10465                "unsigned j = 2;\n"
10466                "int      big = 10000;\n"
10467                "}",
10468                Alignment);
10469   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
10470   verifyFormat("float              i = 1;\n"
10471                "LooooooooooongType loooooooooooooooooooooongVariable\n"
10472                "    = someLooooooooooooooooongFunction();\n"
10473                "int j = 2;",
10474                Alignment);
10475   Alignment.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
10476   verifyFormat("int                i = 1;\n"
10477                "LooooooooooongType loooooooooooooooooooooongVariable =\n"
10478                "    someLooooooooooooooooongFunction();\n"
10479                "int j = 2;",
10480                Alignment);
10481 
10482   Alignment.AlignConsecutiveAssignments = true;
10483   verifyFormat("auto lambda = []() {\n"
10484                "  auto  ii = 0;\n"
10485                "  float j  = 0;\n"
10486                "  return 0;\n"
10487                "};\n"
10488                "int   i  = 0;\n"
10489                "float i2 = 0;\n"
10490                "auto  v  = type{\n"
10491                "    i = 1,   //\n"
10492                "    (i = 2), //\n"
10493                "    i = 3    //\n"
10494                "};",
10495                Alignment);
10496   Alignment.AlignConsecutiveAssignments = false;
10497 
10498   verifyFormat(
10499       "int      i = 1;\n"
10500       "SomeType a = SomeFunction(looooooooooooooooooooooongParameterA,\n"
10501       "                          loooooooooooooooooooooongParameterB);\n"
10502       "int      j = 2;",
10503       Alignment);
10504 
10505   // Test interactions with ColumnLimit and AlignConsecutiveAssignments:
10506   // We expect declarations and assignments to align, as long as it doesn't
10507   // exceed the column limit, starting a new alignment sequence whenever it
10508   // happens.
10509   Alignment.AlignConsecutiveAssignments = true;
10510   Alignment.ColumnLimit = 30;
10511   verifyFormat("float    ii              = 1;\n"
10512                "unsigned j               = 2;\n"
10513                "int someVerylongVariable = 1;\n"
10514                "AnotherLongType  ll = 123456;\n"
10515                "VeryVeryLongType k  = 2;\n"
10516                "int              myvar = 1;",
10517                Alignment);
10518   Alignment.ColumnLimit = 80;
10519   Alignment.AlignConsecutiveAssignments = false;
10520 
10521   verifyFormat(
10522       "template <typename LongTemplate, typename VeryLongTemplateTypeName,\n"
10523       "          typename LongType, typename B>\n"
10524       "auto foo() {}\n",
10525       Alignment);
10526   verifyFormat("float a, b = 1;\n"
10527                "int   c = 2;\n"
10528                "int   dd = 3;\n",
10529                Alignment);
10530   verifyFormat("int   aa = ((1 > 2) ? 3 : 4);\n"
10531                "float b[1][] = {{3.f}};\n",
10532                Alignment);
10533   Alignment.AlignConsecutiveAssignments = true;
10534   verifyFormat("float a, b = 1;\n"
10535                "int   c  = 2;\n"
10536                "int   dd = 3;\n",
10537                Alignment);
10538   verifyFormat("int   aa     = ((1 > 2) ? 3 : 4);\n"
10539                "float b[1][] = {{3.f}};\n",
10540                Alignment);
10541   Alignment.AlignConsecutiveAssignments = false;
10542 
10543   Alignment.ColumnLimit = 30;
10544   Alignment.BinPackParameters = false;
10545   verifyFormat("void foo(float     a,\n"
10546                "         float     b,\n"
10547                "         int       c,\n"
10548                "         uint32_t *d) {\n"
10549                "  int *  e = 0;\n"
10550                "  float  f = 0;\n"
10551                "  double g = 0;\n"
10552                "}\n"
10553                "void bar(ino_t     a,\n"
10554                "         int       b,\n"
10555                "         uint32_t *c,\n"
10556                "         bool      d) {}\n",
10557                Alignment);
10558   Alignment.BinPackParameters = true;
10559   Alignment.ColumnLimit = 80;
10560 
10561   // Bug 33507
10562   Alignment.PointerAlignment = FormatStyle::PAS_Middle;
10563   verifyFormat(
10564       "auto found = range::find_if(vsProducts, [&](auto * aProduct) {\n"
10565       "  static const Version verVs2017;\n"
10566       "  return true;\n"
10567       "});\n",
10568       Alignment);
10569   Alignment.PointerAlignment = FormatStyle::PAS_Right;
10570 
10571   // See llvm.org/PR35641
10572   Alignment.AlignConsecutiveDeclarations = true;
10573   verifyFormat("int func() { //\n"
10574                "  int      b;\n"
10575                "  unsigned c;\n"
10576                "}",
10577                Alignment);
10578 }
10579 
10580 TEST_F(FormatTest, LinuxBraceBreaking) {
10581   FormatStyle LinuxBraceStyle = getLLVMStyle();
10582   LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux;
10583   verifyFormat("namespace a\n"
10584                "{\n"
10585                "class A\n"
10586                "{\n"
10587                "  void f()\n"
10588                "  {\n"
10589                "    if (true) {\n"
10590                "      a();\n"
10591                "      b();\n"
10592                "    } else {\n"
10593                "      a();\n"
10594                "    }\n"
10595                "  }\n"
10596                "  void g() { return; }\n"
10597                "};\n"
10598                "struct B {\n"
10599                "  int x;\n"
10600                "};\n"
10601                "} // namespace a\n",
10602                LinuxBraceStyle);
10603   verifyFormat("enum X {\n"
10604                "  Y = 0,\n"
10605                "}\n",
10606                LinuxBraceStyle);
10607   verifyFormat("struct S {\n"
10608                "  int Type;\n"
10609                "  union {\n"
10610                "    int x;\n"
10611                "    double y;\n"
10612                "  } Value;\n"
10613                "  class C\n"
10614                "  {\n"
10615                "    MyFavoriteType Value;\n"
10616                "  } Class;\n"
10617                "}\n",
10618                LinuxBraceStyle);
10619 }
10620 
10621 TEST_F(FormatTest, MozillaBraceBreaking) {
10622   FormatStyle MozillaBraceStyle = getLLVMStyle();
10623   MozillaBraceStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
10624   MozillaBraceStyle.FixNamespaceComments = false;
10625   verifyFormat("namespace a {\n"
10626                "class A\n"
10627                "{\n"
10628                "  void f()\n"
10629                "  {\n"
10630                "    if (true) {\n"
10631                "      a();\n"
10632                "      b();\n"
10633                "    }\n"
10634                "  }\n"
10635                "  void g() { return; }\n"
10636                "};\n"
10637                "enum E\n"
10638                "{\n"
10639                "  A,\n"
10640                "  // foo\n"
10641                "  B,\n"
10642                "  C\n"
10643                "};\n"
10644                "struct B\n"
10645                "{\n"
10646                "  int x;\n"
10647                "};\n"
10648                "}\n",
10649                MozillaBraceStyle);
10650   verifyFormat("struct S\n"
10651                "{\n"
10652                "  int Type;\n"
10653                "  union\n"
10654                "  {\n"
10655                "    int x;\n"
10656                "    double y;\n"
10657                "  } Value;\n"
10658                "  class C\n"
10659                "  {\n"
10660                "    MyFavoriteType Value;\n"
10661                "  } Class;\n"
10662                "}\n",
10663                MozillaBraceStyle);
10664 }
10665 
10666 TEST_F(FormatTest, StroustrupBraceBreaking) {
10667   FormatStyle StroustrupBraceStyle = getLLVMStyle();
10668   StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
10669   verifyFormat("namespace a {\n"
10670                "class A {\n"
10671                "  void f()\n"
10672                "  {\n"
10673                "    if (true) {\n"
10674                "      a();\n"
10675                "      b();\n"
10676                "    }\n"
10677                "  }\n"
10678                "  void g() { return; }\n"
10679                "};\n"
10680                "struct B {\n"
10681                "  int x;\n"
10682                "};\n"
10683                "} // namespace a\n",
10684                StroustrupBraceStyle);
10685 
10686   verifyFormat("void foo()\n"
10687                "{\n"
10688                "  if (a) {\n"
10689                "    a();\n"
10690                "  }\n"
10691                "  else {\n"
10692                "    b();\n"
10693                "  }\n"
10694                "}\n",
10695                StroustrupBraceStyle);
10696 
10697   verifyFormat("#ifdef _DEBUG\n"
10698                "int foo(int i = 0)\n"
10699                "#else\n"
10700                "int foo(int i = 5)\n"
10701                "#endif\n"
10702                "{\n"
10703                "  return i;\n"
10704                "}",
10705                StroustrupBraceStyle);
10706 
10707   verifyFormat("void foo() {}\n"
10708                "void bar()\n"
10709                "#ifdef _DEBUG\n"
10710                "{\n"
10711                "  foo();\n"
10712                "}\n"
10713                "#else\n"
10714                "{\n"
10715                "}\n"
10716                "#endif",
10717                StroustrupBraceStyle);
10718 
10719   verifyFormat("void foobar() { int i = 5; }\n"
10720                "#ifdef _DEBUG\n"
10721                "void bar() {}\n"
10722                "#else\n"
10723                "void bar() { foobar(); }\n"
10724                "#endif",
10725                StroustrupBraceStyle);
10726 }
10727 
10728 TEST_F(FormatTest, AllmanBraceBreaking) {
10729   FormatStyle AllmanBraceStyle = getLLVMStyle();
10730   AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman;
10731 
10732   EXPECT_EQ("namespace a\n"
10733             "{\n"
10734             "void f();\n"
10735             "void g();\n"
10736             "} // namespace a\n",
10737             format("namespace a\n"
10738                    "{\n"
10739                    "void f();\n"
10740                    "void g();\n"
10741                    "}\n",
10742                    AllmanBraceStyle));
10743 
10744   verifyFormat("namespace a\n"
10745                "{\n"
10746                "class A\n"
10747                "{\n"
10748                "  void f()\n"
10749                "  {\n"
10750                "    if (true)\n"
10751                "    {\n"
10752                "      a();\n"
10753                "      b();\n"
10754                "    }\n"
10755                "  }\n"
10756                "  void g() { return; }\n"
10757                "};\n"
10758                "struct B\n"
10759                "{\n"
10760                "  int x;\n"
10761                "};\n"
10762                "} // namespace a",
10763                AllmanBraceStyle);
10764 
10765   verifyFormat("void f()\n"
10766                "{\n"
10767                "  if (true)\n"
10768                "  {\n"
10769                "    a();\n"
10770                "  }\n"
10771                "  else if (false)\n"
10772                "  {\n"
10773                "    b();\n"
10774                "  }\n"
10775                "  else\n"
10776                "  {\n"
10777                "    c();\n"
10778                "  }\n"
10779                "}\n",
10780                AllmanBraceStyle);
10781 
10782   verifyFormat("void f()\n"
10783                "{\n"
10784                "  for (int i = 0; i < 10; ++i)\n"
10785                "  {\n"
10786                "    a();\n"
10787                "  }\n"
10788                "  while (false)\n"
10789                "  {\n"
10790                "    b();\n"
10791                "  }\n"
10792                "  do\n"
10793                "  {\n"
10794                "    c();\n"
10795                "  } while (false)\n"
10796                "}\n",
10797                AllmanBraceStyle);
10798 
10799   verifyFormat("void f(int a)\n"
10800                "{\n"
10801                "  switch (a)\n"
10802                "  {\n"
10803                "  case 0:\n"
10804                "    break;\n"
10805                "  case 1:\n"
10806                "  {\n"
10807                "    break;\n"
10808                "  }\n"
10809                "  case 2:\n"
10810                "  {\n"
10811                "  }\n"
10812                "  break;\n"
10813                "  default:\n"
10814                "    break;\n"
10815                "  }\n"
10816                "}\n",
10817                AllmanBraceStyle);
10818 
10819   verifyFormat("enum X\n"
10820                "{\n"
10821                "  Y = 0,\n"
10822                "}\n",
10823                AllmanBraceStyle);
10824   verifyFormat("enum X\n"
10825                "{\n"
10826                "  Y = 0\n"
10827                "}\n",
10828                AllmanBraceStyle);
10829 
10830   verifyFormat("@interface BSApplicationController ()\n"
10831                "{\n"
10832                "@private\n"
10833                "  id _extraIvar;\n"
10834                "}\n"
10835                "@end\n",
10836                AllmanBraceStyle);
10837 
10838   verifyFormat("#ifdef _DEBUG\n"
10839                "int foo(int i = 0)\n"
10840                "#else\n"
10841                "int foo(int i = 5)\n"
10842                "#endif\n"
10843                "{\n"
10844                "  return i;\n"
10845                "}",
10846                AllmanBraceStyle);
10847 
10848   verifyFormat("void foo() {}\n"
10849                "void bar()\n"
10850                "#ifdef _DEBUG\n"
10851                "{\n"
10852                "  foo();\n"
10853                "}\n"
10854                "#else\n"
10855                "{\n"
10856                "}\n"
10857                "#endif",
10858                AllmanBraceStyle);
10859 
10860   verifyFormat("void foobar() { int i = 5; }\n"
10861                "#ifdef _DEBUG\n"
10862                "void bar() {}\n"
10863                "#else\n"
10864                "void bar() { foobar(); }\n"
10865                "#endif",
10866                AllmanBraceStyle);
10867 
10868   // This shouldn't affect ObjC blocks..
10869   verifyFormat("[self doSomeThingWithACompletionHandler:^{\n"
10870                "  // ...\n"
10871                "  int i;\n"
10872                "}];",
10873                AllmanBraceStyle);
10874   verifyFormat("void (^block)(void) = ^{\n"
10875                "  // ...\n"
10876                "  int i;\n"
10877                "};",
10878                AllmanBraceStyle);
10879   // .. or dict literals.
10880   verifyFormat("void f()\n"
10881                "{\n"
10882                "  // ...\n"
10883                "  [object someMethod:@{@\"a\" : @\"b\"}];\n"
10884                "}",
10885                AllmanBraceStyle);
10886   verifyFormat("void f()\n"
10887                "{\n"
10888                "  // ...\n"
10889                "  [object someMethod:@{a : @\"b\"}];\n"
10890                "}",
10891                AllmanBraceStyle);
10892   verifyFormat("int f()\n"
10893                "{ // comment\n"
10894                "  return 42;\n"
10895                "}",
10896                AllmanBraceStyle);
10897 
10898   AllmanBraceStyle.ColumnLimit = 19;
10899   verifyFormat("void f() { int i; }", AllmanBraceStyle);
10900   AllmanBraceStyle.ColumnLimit = 18;
10901   verifyFormat("void f()\n"
10902                "{\n"
10903                "  int i;\n"
10904                "}",
10905                AllmanBraceStyle);
10906   AllmanBraceStyle.ColumnLimit = 80;
10907 
10908   FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle;
10909   BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine =
10910       FormatStyle::SIS_WithoutElse;
10911   BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true;
10912   verifyFormat("void f(bool b)\n"
10913                "{\n"
10914                "  if (b)\n"
10915                "  {\n"
10916                "    return;\n"
10917                "  }\n"
10918                "}\n",
10919                BreakBeforeBraceShortIfs);
10920   verifyFormat("void f(bool b)\n"
10921                "{\n"
10922                "  if constexpr (b)\n"
10923                "  {\n"
10924                "    return;\n"
10925                "  }\n"
10926                "}\n",
10927                BreakBeforeBraceShortIfs);
10928   verifyFormat("void f(bool b)\n"
10929                "{\n"
10930                "  if (b) return;\n"
10931                "}\n",
10932                BreakBeforeBraceShortIfs);
10933   verifyFormat("void f(bool b)\n"
10934                "{\n"
10935                "  if constexpr (b) return;\n"
10936                "}\n",
10937                BreakBeforeBraceShortIfs);
10938   verifyFormat("void f(bool b)\n"
10939                "{\n"
10940                "  while (b)\n"
10941                "  {\n"
10942                "    return;\n"
10943                "  }\n"
10944                "}\n",
10945                BreakBeforeBraceShortIfs);
10946 }
10947 
10948 TEST_F(FormatTest, GNUBraceBreaking) {
10949   FormatStyle GNUBraceStyle = getLLVMStyle();
10950   GNUBraceStyle.BreakBeforeBraces = FormatStyle::BS_GNU;
10951   verifyFormat("namespace a\n"
10952                "{\n"
10953                "class A\n"
10954                "{\n"
10955                "  void f()\n"
10956                "  {\n"
10957                "    int a;\n"
10958                "    {\n"
10959                "      int b;\n"
10960                "    }\n"
10961                "    if (true)\n"
10962                "      {\n"
10963                "        a();\n"
10964                "        b();\n"
10965                "      }\n"
10966                "  }\n"
10967                "  void g() { return; }\n"
10968                "}\n"
10969                "} // namespace a",
10970                GNUBraceStyle);
10971 
10972   verifyFormat("void f()\n"
10973                "{\n"
10974                "  if (true)\n"
10975                "    {\n"
10976                "      a();\n"
10977                "    }\n"
10978                "  else if (false)\n"
10979                "    {\n"
10980                "      b();\n"
10981                "    }\n"
10982                "  else\n"
10983                "    {\n"
10984                "      c();\n"
10985                "    }\n"
10986                "}\n",
10987                GNUBraceStyle);
10988 
10989   verifyFormat("void f()\n"
10990                "{\n"
10991                "  for (int i = 0; i < 10; ++i)\n"
10992                "    {\n"
10993                "      a();\n"
10994                "    }\n"
10995                "  while (false)\n"
10996                "    {\n"
10997                "      b();\n"
10998                "    }\n"
10999                "  do\n"
11000                "    {\n"
11001                "      c();\n"
11002                "    }\n"
11003                "  while (false);\n"
11004                "}\n",
11005                GNUBraceStyle);
11006 
11007   verifyFormat("void f(int a)\n"
11008                "{\n"
11009                "  switch (a)\n"
11010                "    {\n"
11011                "    case 0:\n"
11012                "      break;\n"
11013                "    case 1:\n"
11014                "      {\n"
11015                "        break;\n"
11016                "      }\n"
11017                "    case 2:\n"
11018                "      {\n"
11019                "      }\n"
11020                "      break;\n"
11021                "    default:\n"
11022                "      break;\n"
11023                "    }\n"
11024                "}\n",
11025                GNUBraceStyle);
11026 
11027   verifyFormat("enum X\n"
11028                "{\n"
11029                "  Y = 0,\n"
11030                "}\n",
11031                GNUBraceStyle);
11032 
11033   verifyFormat("@interface BSApplicationController ()\n"
11034                "{\n"
11035                "@private\n"
11036                "  id _extraIvar;\n"
11037                "}\n"
11038                "@end\n",
11039                GNUBraceStyle);
11040 
11041   verifyFormat("#ifdef _DEBUG\n"
11042                "int foo(int i = 0)\n"
11043                "#else\n"
11044                "int foo(int i = 5)\n"
11045                "#endif\n"
11046                "{\n"
11047                "  return i;\n"
11048                "}",
11049                GNUBraceStyle);
11050 
11051   verifyFormat("void foo() {}\n"
11052                "void bar()\n"
11053                "#ifdef _DEBUG\n"
11054                "{\n"
11055                "  foo();\n"
11056                "}\n"
11057                "#else\n"
11058                "{\n"
11059                "}\n"
11060                "#endif",
11061                GNUBraceStyle);
11062 
11063   verifyFormat("void foobar() { int i = 5; }\n"
11064                "#ifdef _DEBUG\n"
11065                "void bar() {}\n"
11066                "#else\n"
11067                "void bar() { foobar(); }\n"
11068                "#endif",
11069                GNUBraceStyle);
11070 }
11071 
11072 TEST_F(FormatTest, WebKitBraceBreaking) {
11073   FormatStyle WebKitBraceStyle = getLLVMStyle();
11074   WebKitBraceStyle.BreakBeforeBraces = FormatStyle::BS_WebKit;
11075   WebKitBraceStyle.FixNamespaceComments = false;
11076   verifyFormat("namespace a {\n"
11077                "class A {\n"
11078                "  void f()\n"
11079                "  {\n"
11080                "    if (true) {\n"
11081                "      a();\n"
11082                "      b();\n"
11083                "    }\n"
11084                "  }\n"
11085                "  void g() { return; }\n"
11086                "};\n"
11087                "enum E {\n"
11088                "  A,\n"
11089                "  // foo\n"
11090                "  B,\n"
11091                "  C\n"
11092                "};\n"
11093                "struct B {\n"
11094                "  int x;\n"
11095                "};\n"
11096                "}\n",
11097                WebKitBraceStyle);
11098   verifyFormat("struct S {\n"
11099                "  int Type;\n"
11100                "  union {\n"
11101                "    int x;\n"
11102                "    double y;\n"
11103                "  } Value;\n"
11104                "  class C {\n"
11105                "    MyFavoriteType Value;\n"
11106                "  } Class;\n"
11107                "};\n",
11108                WebKitBraceStyle);
11109 }
11110 
11111 TEST_F(FormatTest, CatchExceptionReferenceBinding) {
11112   verifyFormat("void f() {\n"
11113                "  try {\n"
11114                "  } catch (const Exception &e) {\n"
11115                "  }\n"
11116                "}\n",
11117                getLLVMStyle());
11118 }
11119 
11120 TEST_F(FormatTest, UnderstandsPragmas) {
11121   verifyFormat("#pragma omp reduction(| : var)");
11122   verifyFormat("#pragma omp reduction(+ : var)");
11123 
11124   EXPECT_EQ("#pragma mark Any non-hyphenated or hyphenated string "
11125             "(including parentheses).",
11126             format("#pragma    mark   Any non-hyphenated or hyphenated string "
11127                    "(including parentheses)."));
11128 }
11129 
11130 TEST_F(FormatTest, UnderstandPragmaOption) {
11131   verifyFormat("#pragma option -C -A");
11132 
11133   EXPECT_EQ("#pragma option -C -A", format("#pragma    option   -C   -A"));
11134 }
11135 
11136 TEST_F(FormatTest, OptimizeBreakPenaltyVsExcess) {
11137   FormatStyle Style = getLLVMStyle();
11138   Style.ColumnLimit = 20;
11139 
11140   verifyFormat("int a; // the\n"
11141                "       // comment", Style);
11142   EXPECT_EQ("int a; /* first line\n"
11143             "        * second\n"
11144             "        * line third\n"
11145             "        * line\n"
11146             "        */",
11147             format("int a; /* first line\n"
11148                    "        * second\n"
11149                    "        * line third\n"
11150                    "        * line\n"
11151                    "        */",
11152                    Style));
11153   EXPECT_EQ("int a; // first line\n"
11154             "       // second\n"
11155             "       // line third\n"
11156             "       // line",
11157             format("int a; // first line\n"
11158                    "       // second line\n"
11159                    "       // third line",
11160                    Style));
11161 
11162   Style.PenaltyExcessCharacter = 90;
11163   verifyFormat("int a; // the comment", Style);
11164   EXPECT_EQ("int a; // the comment\n"
11165             "       // aaa",
11166             format("int a; // the comment aaa", Style));
11167   EXPECT_EQ("int a; /* first line\n"
11168             "        * second line\n"
11169             "        * third line\n"
11170             "        */",
11171             format("int a; /* first line\n"
11172                    "        * second line\n"
11173                    "        * third line\n"
11174                    "        */",
11175                    Style));
11176   EXPECT_EQ("int a; // first line\n"
11177             "       // second line\n"
11178             "       // third line",
11179             format("int a; // first line\n"
11180                    "       // second line\n"
11181                    "       // third line",
11182                    Style));
11183   // FIXME: Investigate why this is not getting the same layout as the test
11184   // above.
11185   EXPECT_EQ("int a; /* first line\n"
11186             "        * second line\n"
11187             "        * third line\n"
11188             "        */",
11189             format("int a; /* first line second line third line"
11190                    "\n*/",
11191                    Style));
11192 
11193   EXPECT_EQ("// foo bar baz bazfoo\n"
11194             "// foo bar foo bar\n",
11195             format("// foo bar baz bazfoo\n"
11196                    "// foo bar foo           bar\n",
11197                    Style));
11198   EXPECT_EQ("// foo bar baz bazfoo\n"
11199             "// foo bar foo bar\n",
11200             format("// foo bar baz      bazfoo\n"
11201                    "// foo            bar foo bar\n",
11202                    Style));
11203 
11204   // FIXME: Optimally, we'd keep bazfoo on the first line and reflow bar to the
11205   // next one.
11206   EXPECT_EQ("// foo bar baz bazfoo\n"
11207             "// bar foo bar\n",
11208             format("// foo bar baz      bazfoo bar\n"
11209                    "// foo            bar\n",
11210                    Style));
11211 
11212   EXPECT_EQ("// foo bar baz bazfoo\n"
11213             "// foo bar baz bazfoo\n"
11214             "// bar foo bar\n",
11215             format("// foo bar baz      bazfoo\n"
11216                    "// foo bar baz      bazfoo bar\n"
11217                    "// foo bar\n",
11218                    Style));
11219 
11220   EXPECT_EQ("// foo bar baz bazfoo\n"
11221             "// foo bar baz bazfoo\n"
11222             "// bar foo bar\n",
11223             format("// foo bar baz      bazfoo\n"
11224                    "// foo bar baz      bazfoo bar\n"
11225                    "// foo           bar\n",
11226                    Style));
11227 
11228   // Make sure we do not keep protruding characters if strict mode reflow is
11229   // cheaper than keeping protruding characters.
11230   Style.ColumnLimit = 21;
11231   EXPECT_EQ("// foo foo foo foo\n"
11232             "// foo foo foo foo\n"
11233             "// foo foo foo foo\n",
11234             format("// foo foo foo foo foo foo foo foo foo foo foo foo\n",
11235                            Style));
11236 
11237   EXPECT_EQ("int a = /* long block\n"
11238             "           comment */\n"
11239             "    42;",
11240             format("int a = /* long block comment */ 42;", Style));
11241 }
11242 
11243 #define EXPECT_ALL_STYLES_EQUAL(Styles)                                        \
11244   for (size_t i = 1; i < Styles.size(); ++i)                                   \
11245   EXPECT_EQ(Styles[0], Styles[i]) << "Style #" << i << " of " << Styles.size() \
11246                                   << " differs from Style #0"
11247 
11248 TEST_F(FormatTest, GetsPredefinedStyleByName) {
11249   SmallVector<FormatStyle, 3> Styles;
11250   Styles.resize(3);
11251 
11252   Styles[0] = getLLVMStyle();
11253   EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
11254   EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
11255   EXPECT_ALL_STYLES_EQUAL(Styles);
11256 
11257   Styles[0] = getGoogleStyle();
11258   EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
11259   EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
11260   EXPECT_ALL_STYLES_EQUAL(Styles);
11261 
11262   Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
11263   EXPECT_TRUE(
11264       getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
11265   EXPECT_TRUE(
11266       getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
11267   EXPECT_ALL_STYLES_EQUAL(Styles);
11268 
11269   Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
11270   EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
11271   EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
11272   EXPECT_ALL_STYLES_EQUAL(Styles);
11273 
11274   Styles[0] = getMozillaStyle();
11275   EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
11276   EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
11277   EXPECT_ALL_STYLES_EQUAL(Styles);
11278 
11279   Styles[0] = getWebKitStyle();
11280   EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
11281   EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
11282   EXPECT_ALL_STYLES_EQUAL(Styles);
11283 
11284   Styles[0] = getGNUStyle();
11285   EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
11286   EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
11287   EXPECT_ALL_STYLES_EQUAL(Styles);
11288 
11289   EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
11290 }
11291 
11292 TEST_F(FormatTest, GetsCorrectBasedOnStyle) {
11293   SmallVector<FormatStyle, 8> Styles;
11294   Styles.resize(2);
11295 
11296   Styles[0] = getGoogleStyle();
11297   Styles[1] = getLLVMStyle();
11298   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
11299   EXPECT_ALL_STYLES_EQUAL(Styles);
11300 
11301   Styles.resize(5);
11302   Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
11303   Styles[1] = getLLVMStyle();
11304   Styles[1].Language = FormatStyle::LK_JavaScript;
11305   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
11306 
11307   Styles[2] = getLLVMStyle();
11308   Styles[2].Language = FormatStyle::LK_JavaScript;
11309   EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
11310                                   "BasedOnStyle: Google",
11311                                   &Styles[2])
11312                    .value());
11313 
11314   Styles[3] = getLLVMStyle();
11315   Styles[3].Language = FormatStyle::LK_JavaScript;
11316   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
11317                                   "Language: JavaScript",
11318                                   &Styles[3])
11319                    .value());
11320 
11321   Styles[4] = getLLVMStyle();
11322   Styles[4].Language = FormatStyle::LK_JavaScript;
11323   EXPECT_EQ(0, parseConfiguration("---\n"
11324                                   "BasedOnStyle: LLVM\n"
11325                                   "IndentWidth: 123\n"
11326                                   "---\n"
11327                                   "BasedOnStyle: Google\n"
11328                                   "Language: JavaScript",
11329                                   &Styles[4])
11330                    .value());
11331   EXPECT_ALL_STYLES_EQUAL(Styles);
11332 }
11333 
11334 #define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME)                             \
11335   Style.FIELD = false;                                                         \
11336   EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value());      \
11337   EXPECT_TRUE(Style.FIELD);                                                    \
11338   EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value());     \
11339   EXPECT_FALSE(Style.FIELD);
11340 
11341 #define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
11342 
11343 #define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME)              \
11344   Style.STRUCT.FIELD = false;                                                  \
11345   EXPECT_EQ(0,                                                                 \
11346             parseConfiguration(#STRUCT ":\n  " CONFIG_NAME ": true", &Style)   \
11347                 .value());                                                     \
11348   EXPECT_TRUE(Style.STRUCT.FIELD);                                             \
11349   EXPECT_EQ(0,                                                                 \
11350             parseConfiguration(#STRUCT ":\n  " CONFIG_NAME ": false", &Style)  \
11351                 .value());                                                     \
11352   EXPECT_FALSE(Style.STRUCT.FIELD);
11353 
11354 #define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD)                                 \
11355   CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
11356 
11357 #define CHECK_PARSE(TEXT, FIELD, VALUE)                                        \
11358   EXPECT_NE(VALUE, Style.FIELD);                                               \
11359   EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value());                      \
11360   EXPECT_EQ(VALUE, Style.FIELD)
11361 
11362 TEST_F(FormatTest, ParsesConfigurationBools) {
11363   FormatStyle Style = {};
11364   Style.Language = FormatStyle::LK_Cpp;
11365   CHECK_PARSE_BOOL(AlignOperands);
11366   CHECK_PARSE_BOOL(AlignTrailingComments);
11367   CHECK_PARSE_BOOL(AlignConsecutiveAssignments);
11368   CHECK_PARSE_BOOL(AlignConsecutiveDeclarations);
11369   CHECK_PARSE_BOOL(AllowAllArgumentsOnNextLine);
11370   CHECK_PARSE_BOOL(AllowAllConstructorInitializersOnNextLine);
11371   CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
11372   CHECK_PARSE_BOOL(AllowShortBlocksOnASingleLine);
11373   CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
11374   CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
11375   CHECK_PARSE_BOOL(BinPackArguments);
11376   CHECK_PARSE_BOOL(BinPackParameters);
11377   CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
11378   CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
11379   CHECK_PARSE_BOOL(BreakStringLiterals);
11380   CHECK_PARSE_BOOL(CompactNamespaces);
11381   CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine);
11382   CHECK_PARSE_BOOL(DerivePointerAlignment);
11383   CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
11384   CHECK_PARSE_BOOL(DisableFormat);
11385   CHECK_PARSE_BOOL(IndentCaseLabels);
11386   CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
11387   CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
11388   CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
11389   CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
11390   CHECK_PARSE_BOOL(Cpp11BracedListStyle);
11391   CHECK_PARSE_BOOL(ReflowComments);
11392   CHECK_PARSE_BOOL(SortIncludes);
11393   CHECK_PARSE_BOOL(SortUsingDeclarations);
11394   CHECK_PARSE_BOOL(SpacesInParentheses);
11395   CHECK_PARSE_BOOL(SpacesInSquareBrackets);
11396   CHECK_PARSE_BOOL(SpacesInAngles);
11397   CHECK_PARSE_BOOL(SpaceInEmptyParentheses);
11398   CHECK_PARSE_BOOL(SpacesInContainerLiterals);
11399   CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses);
11400   CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
11401   CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
11402   CHECK_PARSE_BOOL(SpaceAfterLogicalNot);
11403   CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
11404   CHECK_PARSE_BOOL(SpaceBeforeCpp11BracedList);
11405   CHECK_PARSE_BOOL(SpaceBeforeCtorInitializerColon);
11406   CHECK_PARSE_BOOL(SpaceBeforeInheritanceColon);
11407   CHECK_PARSE_BOOL(SpaceBeforeRangeBasedForLoopColon);
11408 
11409   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterCaseLabel);
11410   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
11411   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterControlStatement);
11412   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
11413   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
11414   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
11415   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
11416   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
11417   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
11418   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterExternBlock);
11419   CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
11420   CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
11421   CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
11422   CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunction);
11423   CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyRecord);
11424   CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyNamespace);
11425 }
11426 
11427 #undef CHECK_PARSE_BOOL
11428 
11429 TEST_F(FormatTest, ParsesConfiguration) {
11430   FormatStyle Style = {};
11431   Style.Language = FormatStyle::LK_Cpp;
11432   CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
11433   CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
11434               ConstructorInitializerIndentWidth, 1234u);
11435   CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
11436   CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
11437   CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
11438   CHECK_PARSE("PenaltyBreakAssignment: 1234",
11439               PenaltyBreakAssignment, 1234u);
11440   CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
11441               PenaltyBreakBeforeFirstCallParameter, 1234u);
11442   CHECK_PARSE("PenaltyBreakTemplateDeclaration: 1234",
11443               PenaltyBreakTemplateDeclaration, 1234u);
11444   CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
11445   CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
11446               PenaltyReturnTypeOnItsOwnLine, 1234u);
11447   CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
11448               SpacesBeforeTrailingComments, 1234u);
11449   CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
11450   CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
11451   CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
11452 
11453   Style.PointerAlignment = FormatStyle::PAS_Middle;
11454   CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
11455               FormatStyle::PAS_Left);
11456   CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
11457               FormatStyle::PAS_Right);
11458   CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
11459               FormatStyle::PAS_Middle);
11460   // For backward compatibility:
11461   CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
11462               FormatStyle::PAS_Left);
11463   CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
11464               FormatStyle::PAS_Right);
11465   CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
11466               FormatStyle::PAS_Middle);
11467 
11468   Style.Standard = FormatStyle::LS_Auto;
11469   CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
11470   CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Cpp11);
11471   CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
11472   CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
11473   CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
11474 
11475   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
11476   CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
11477               BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
11478   CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
11479               FormatStyle::BOS_None);
11480   CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
11481               FormatStyle::BOS_All);
11482   // For backward compatibility:
11483   CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
11484               FormatStyle::BOS_None);
11485   CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
11486               FormatStyle::BOS_All);
11487 
11488   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
11489   CHECK_PARSE("BreakConstructorInitializers: BeforeComma",
11490               BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
11491   CHECK_PARSE("BreakConstructorInitializers: AfterColon",
11492               BreakConstructorInitializers, FormatStyle::BCIS_AfterColon);
11493   CHECK_PARSE("BreakConstructorInitializers: BeforeColon",
11494               BreakConstructorInitializers, FormatStyle::BCIS_BeforeColon);
11495   // For backward compatibility:
11496   CHECK_PARSE("BreakConstructorInitializersBeforeComma: true",
11497               BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
11498 
11499   Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
11500   CHECK_PARSE("BreakInheritanceList: BeforeComma",
11501               BreakInheritanceList, FormatStyle::BILS_BeforeComma);
11502   CHECK_PARSE("BreakInheritanceList: AfterColon",
11503               BreakInheritanceList, FormatStyle::BILS_AfterColon);
11504   CHECK_PARSE("BreakInheritanceList: BeforeColon",
11505               BreakInheritanceList, FormatStyle::BILS_BeforeColon);
11506   // For backward compatibility:
11507   CHECK_PARSE("BreakBeforeInheritanceComma: true",
11508               BreakInheritanceList, FormatStyle::BILS_BeforeComma);
11509 
11510   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
11511   CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
11512               FormatStyle::BAS_Align);
11513   CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
11514               FormatStyle::BAS_DontAlign);
11515   CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
11516               FormatStyle::BAS_AlwaysBreak);
11517   // For backward compatibility:
11518   CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
11519               FormatStyle::BAS_DontAlign);
11520   CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
11521               FormatStyle::BAS_Align);
11522 
11523   Style.AlignEscapedNewlines = FormatStyle::ENAS_Left;
11524   CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines,
11525               FormatStyle::ENAS_DontAlign);
11526   CHECK_PARSE("AlignEscapedNewlines: Left", AlignEscapedNewlines,
11527               FormatStyle::ENAS_Left);
11528   CHECK_PARSE("AlignEscapedNewlines: Right", AlignEscapedNewlines,
11529               FormatStyle::ENAS_Right);
11530   // For backward compatibility:
11531   CHECK_PARSE("AlignEscapedNewlinesLeft: true", AlignEscapedNewlines,
11532               FormatStyle::ENAS_Left);
11533   CHECK_PARSE("AlignEscapedNewlinesLeft: false", AlignEscapedNewlines,
11534               FormatStyle::ENAS_Right);
11535 
11536   Style.UseTab = FormatStyle::UT_ForIndentation;
11537   CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
11538   CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
11539   CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
11540   CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
11541               FormatStyle::UT_ForContinuationAndIndentation);
11542   // For backward compatibility:
11543   CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
11544   CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
11545 
11546   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
11547   CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
11548               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
11549   CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
11550               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
11551   CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
11552               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
11553   CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
11554               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
11555   // For backward compatibility:
11556   CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
11557               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
11558   CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
11559               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
11560 
11561   Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
11562   CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
11563               FormatStyle::SBPO_Never);
11564   CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
11565               FormatStyle::SBPO_Always);
11566   CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
11567               FormatStyle::SBPO_ControlStatements);
11568   CHECK_PARSE("SpaceBeforeParens: NonEmptyParentheses", SpaceBeforeParens,
11569               FormatStyle::SBPO_NonEmptyParentheses);
11570   // For backward compatibility:
11571   CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
11572               FormatStyle::SBPO_Never);
11573   CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
11574               FormatStyle::SBPO_ControlStatements);
11575 
11576   Style.ColumnLimit = 123;
11577   FormatStyle BaseStyle = getLLVMStyle();
11578   CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
11579   CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
11580 
11581   Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
11582   CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
11583               FormatStyle::BS_Attach);
11584   CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
11585               FormatStyle::BS_Linux);
11586   CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
11587               FormatStyle::BS_Mozilla);
11588   CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
11589               FormatStyle::BS_Stroustrup);
11590   CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
11591               FormatStyle::BS_Allman);
11592   CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
11593   CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
11594               FormatStyle::BS_WebKit);
11595   CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
11596               FormatStyle::BS_Custom);
11597 
11598   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
11599   CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
11600               FormatStyle::RTBS_None);
11601   CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
11602               FormatStyle::RTBS_All);
11603   CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
11604               AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
11605   CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
11606               AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
11607   CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
11608               AlwaysBreakAfterReturnType,
11609               FormatStyle::RTBS_TopLevelDefinitions);
11610 
11611   Style.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes;
11612   CHECK_PARSE("AlwaysBreakTemplateDeclarations: No", AlwaysBreakTemplateDeclarations,
11613               FormatStyle::BTDS_No);
11614   CHECK_PARSE("AlwaysBreakTemplateDeclarations: MultiLine", AlwaysBreakTemplateDeclarations,
11615               FormatStyle::BTDS_MultiLine);
11616   CHECK_PARSE("AlwaysBreakTemplateDeclarations: Yes", AlwaysBreakTemplateDeclarations,
11617               FormatStyle::BTDS_Yes);
11618   CHECK_PARSE("AlwaysBreakTemplateDeclarations: false", AlwaysBreakTemplateDeclarations,
11619               FormatStyle::BTDS_MultiLine);
11620   CHECK_PARSE("AlwaysBreakTemplateDeclarations: true", AlwaysBreakTemplateDeclarations,
11621               FormatStyle::BTDS_Yes);
11622 
11623   Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
11624   CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
11625               AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
11626   CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
11627               AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
11628   CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
11629               AlwaysBreakAfterDefinitionReturnType,
11630               FormatStyle::DRTBS_TopLevel);
11631 
11632   Style.NamespaceIndentation = FormatStyle::NI_All;
11633   CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
11634               FormatStyle::NI_None);
11635   CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
11636               FormatStyle::NI_Inner);
11637   CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
11638               FormatStyle::NI_All);
11639 
11640   Style.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_Always;
11641   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Never",
11642               AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never);
11643   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: WithoutElse",
11644               AllowShortIfStatementsOnASingleLine,
11645               FormatStyle::SIS_WithoutElse);
11646   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Always",
11647               AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Always);
11648   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: false",
11649               AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never);
11650   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: true",
11651               AllowShortIfStatementsOnASingleLine,
11652               FormatStyle::SIS_WithoutElse);
11653 
11654   // FIXME: This is required because parsing a configuration simply overwrites
11655   // the first N elements of the list instead of resetting it.
11656   Style.ForEachMacros.clear();
11657   std::vector<std::string> BoostForeach;
11658   BoostForeach.push_back("BOOST_FOREACH");
11659   CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
11660   std::vector<std::string> BoostAndQForeach;
11661   BoostAndQForeach.push_back("BOOST_FOREACH");
11662   BoostAndQForeach.push_back("Q_FOREACH");
11663   CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
11664               BoostAndQForeach);
11665 
11666   Style.StatementMacros.clear();
11667   CHECK_PARSE("StatementMacros: [QUNUSED]", StatementMacros,
11668               std::vector<std::string>{"QUNUSED"});
11669   CHECK_PARSE("StatementMacros: [QUNUSED, QT_REQUIRE_VERSION]", StatementMacros,
11670               std::vector<std::string>({"QUNUSED", "QT_REQUIRE_VERSION"}));
11671 
11672   Style.IncludeStyle.IncludeCategories.clear();
11673   std::vector<tooling::IncludeStyle::IncludeCategory> ExpectedCategories = {
11674       {"abc/.*", 2}, {".*", 1}};
11675   CHECK_PARSE("IncludeCategories:\n"
11676               "  - Regex: abc/.*\n"
11677               "    Priority: 2\n"
11678               "  - Regex: .*\n"
11679               "    Priority: 1",
11680               IncludeStyle.IncludeCategories, ExpectedCategories);
11681   CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeStyle.IncludeIsMainRegex,
11682               "abc$");
11683 
11684   Style.RawStringFormats.clear();
11685   std::vector<FormatStyle::RawStringFormat> ExpectedRawStringFormats = {
11686       {
11687           FormatStyle::LK_TextProto,
11688           {"pb", "proto"},
11689           {"PARSE_TEXT_PROTO"},
11690           /*CanonicalDelimiter=*/"",
11691           "llvm",
11692       },
11693       {
11694           FormatStyle::LK_Cpp,
11695           {"cc", "cpp"},
11696           {"C_CODEBLOCK", "CPPEVAL"},
11697           /*CanonicalDelimiter=*/"cc",
11698           /*BasedOnStyle=*/"",
11699       },
11700   };
11701 
11702   CHECK_PARSE("RawStringFormats:\n"
11703               "  - Language: TextProto\n"
11704               "    Delimiters:\n"
11705               "      - 'pb'\n"
11706               "      - 'proto'\n"
11707               "    EnclosingFunctions:\n"
11708               "      - 'PARSE_TEXT_PROTO'\n"
11709               "    BasedOnStyle: llvm\n"
11710               "  - Language: Cpp\n"
11711               "    Delimiters:\n"
11712               "      - 'cc'\n"
11713               "      - 'cpp'\n"
11714               "    EnclosingFunctions:\n"
11715               "      - 'C_CODEBLOCK'\n"
11716               "      - 'CPPEVAL'\n"
11717               "    CanonicalDelimiter: 'cc'",
11718               RawStringFormats, ExpectedRawStringFormats);
11719 }
11720 
11721 TEST_F(FormatTest, ParsesConfigurationWithLanguages) {
11722   FormatStyle Style = {};
11723   Style.Language = FormatStyle::LK_Cpp;
11724   CHECK_PARSE("Language: Cpp\n"
11725               "IndentWidth: 12",
11726               IndentWidth, 12u);
11727   EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
11728                                "IndentWidth: 34",
11729                                &Style),
11730             ParseError::Unsuitable);
11731   EXPECT_EQ(12u, Style.IndentWidth);
11732   CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
11733   EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
11734 
11735   Style.Language = FormatStyle::LK_JavaScript;
11736   CHECK_PARSE("Language: JavaScript\n"
11737               "IndentWidth: 12",
11738               IndentWidth, 12u);
11739   CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
11740   EXPECT_EQ(parseConfiguration("Language: Cpp\n"
11741                                "IndentWidth: 34",
11742                                &Style),
11743             ParseError::Unsuitable);
11744   EXPECT_EQ(23u, Style.IndentWidth);
11745   CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
11746   EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
11747 
11748   CHECK_PARSE("BasedOnStyle: LLVM\n"
11749               "IndentWidth: 67",
11750               IndentWidth, 67u);
11751 
11752   CHECK_PARSE("---\n"
11753               "Language: JavaScript\n"
11754               "IndentWidth: 12\n"
11755               "---\n"
11756               "Language: Cpp\n"
11757               "IndentWidth: 34\n"
11758               "...\n",
11759               IndentWidth, 12u);
11760 
11761   Style.Language = FormatStyle::LK_Cpp;
11762   CHECK_PARSE("---\n"
11763               "Language: JavaScript\n"
11764               "IndentWidth: 12\n"
11765               "---\n"
11766               "Language: Cpp\n"
11767               "IndentWidth: 34\n"
11768               "...\n",
11769               IndentWidth, 34u);
11770   CHECK_PARSE("---\n"
11771               "IndentWidth: 78\n"
11772               "---\n"
11773               "Language: JavaScript\n"
11774               "IndentWidth: 56\n"
11775               "...\n",
11776               IndentWidth, 78u);
11777 
11778   Style.ColumnLimit = 123;
11779   Style.IndentWidth = 234;
11780   Style.BreakBeforeBraces = FormatStyle::BS_Linux;
11781   Style.TabWidth = 345;
11782   EXPECT_FALSE(parseConfiguration("---\n"
11783                                   "IndentWidth: 456\n"
11784                                   "BreakBeforeBraces: Allman\n"
11785                                   "---\n"
11786                                   "Language: JavaScript\n"
11787                                   "IndentWidth: 111\n"
11788                                   "TabWidth: 111\n"
11789                                   "---\n"
11790                                   "Language: Cpp\n"
11791                                   "BreakBeforeBraces: Stroustrup\n"
11792                                   "TabWidth: 789\n"
11793                                   "...\n",
11794                                   &Style));
11795   EXPECT_EQ(123u, Style.ColumnLimit);
11796   EXPECT_EQ(456u, Style.IndentWidth);
11797   EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
11798   EXPECT_EQ(789u, Style.TabWidth);
11799 
11800   EXPECT_EQ(parseConfiguration("---\n"
11801                                "Language: JavaScript\n"
11802                                "IndentWidth: 56\n"
11803                                "---\n"
11804                                "IndentWidth: 78\n"
11805                                "...\n",
11806                                &Style),
11807             ParseError::Error);
11808   EXPECT_EQ(parseConfiguration("---\n"
11809                                "Language: JavaScript\n"
11810                                "IndentWidth: 56\n"
11811                                "---\n"
11812                                "Language: JavaScript\n"
11813                                "IndentWidth: 78\n"
11814                                "...\n",
11815                                &Style),
11816             ParseError::Error);
11817 
11818   EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
11819 }
11820 
11821 #undef CHECK_PARSE
11822 
11823 TEST_F(FormatTest, UsesLanguageForBasedOnStyle) {
11824   FormatStyle Style = {};
11825   Style.Language = FormatStyle::LK_JavaScript;
11826   Style.BreakBeforeTernaryOperators = true;
11827   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
11828   EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
11829 
11830   Style.BreakBeforeTernaryOperators = true;
11831   EXPECT_EQ(0, parseConfiguration("---\n"
11832                                   "BasedOnStyle: Google\n"
11833                                   "---\n"
11834                                   "Language: JavaScript\n"
11835                                   "IndentWidth: 76\n"
11836                                   "...\n",
11837                                   &Style)
11838                    .value());
11839   EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
11840   EXPECT_EQ(76u, Style.IndentWidth);
11841   EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
11842 }
11843 
11844 TEST_F(FormatTest, ConfigurationRoundTripTest) {
11845   FormatStyle Style = getLLVMStyle();
11846   std::string YAML = configurationAsText(Style);
11847   FormatStyle ParsedStyle = {};
11848   ParsedStyle.Language = FormatStyle::LK_Cpp;
11849   EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
11850   EXPECT_EQ(Style, ParsedStyle);
11851 }
11852 
11853 TEST_F(FormatTest, WorksFor8bitEncodings) {
11854   EXPECT_EQ("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 \"\n"
11855             "\"\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \"\n"
11856             "\"\xe7\xe8\xec\xed\xfe\xfe \"\n"
11857             "\"\xef\xee\xf0\xf3...\"",
11858             format("\"\xce\xe4\xed\xe0\xe6\xe4\xfb \xe2 "
11859                    "\xf1\xf2\xf3\xe4\xb8\xed\xf3\xfe \xe7\xe8\xec\xed\xfe\xfe "
11860                    "\xef\xee\xf0\xf3...\"",
11861                    getLLVMStyleWithColumns(12)));
11862 }
11863 
11864 TEST_F(FormatTest, HandlesUTF8BOM) {
11865   EXPECT_EQ("\xef\xbb\xbf", format("\xef\xbb\xbf"));
11866   EXPECT_EQ("\xef\xbb\xbf#include <iostream>",
11867             format("\xef\xbb\xbf#include <iostream>"));
11868   EXPECT_EQ("\xef\xbb\xbf\n#include <iostream>",
11869             format("\xef\xbb\xbf\n#include <iostream>"));
11870 }
11871 
11872 // FIXME: Encode Cyrillic and CJK characters below to appease MS compilers.
11873 #if !defined(_MSC_VER)
11874 
11875 TEST_F(FormatTest, CountsUTF8CharactersProperly) {
11876   verifyFormat("\"Однажды в студёную зимнюю пору...\"",
11877                getLLVMStyleWithColumns(35));
11878   verifyFormat("\"一 二 三 四 五 六 七 八 九 十\"",
11879                getLLVMStyleWithColumns(31));
11880   verifyFormat("// Однажды в студёную зимнюю пору...",
11881                getLLVMStyleWithColumns(36));
11882   verifyFormat("// 一 二 三 四 五 六 七 八 九 十", getLLVMStyleWithColumns(32));
11883   verifyFormat("/* Однажды в студёную зимнюю пору... */",
11884                getLLVMStyleWithColumns(39));
11885   verifyFormat("/* 一 二 三 四 五 六 七 八 九 十 */",
11886                getLLVMStyleWithColumns(35));
11887 }
11888 
11889 TEST_F(FormatTest, SplitsUTF8Strings) {
11890   // Non-printable characters' width is currently considered to be the length in
11891   // bytes in UTF8. The characters can be displayed in very different manner
11892   // (zero-width, single width with a substitution glyph, expanded to their code
11893   // (e.g. "<8d>"), so there's no single correct way to handle them.
11894   EXPECT_EQ("\"aaaaÄ\"\n"
11895             "\"\xc2\x8d\";",
11896             format("\"aaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
11897   EXPECT_EQ("\"aaaaaaaÄ\"\n"
11898             "\"\xc2\x8d\";",
11899             format("\"aaaaaaaÄ\xc2\x8d\";", getLLVMStyleWithColumns(10)));
11900   EXPECT_EQ("\"Однажды, в \"\n"
11901             "\"студёную \"\n"
11902             "\"зимнюю \"\n"
11903             "\"пору,\"",
11904             format("\"Однажды, в студёную зимнюю пору,\"",
11905                    getLLVMStyleWithColumns(13)));
11906   EXPECT_EQ(
11907       "\"一 二 三 \"\n"
11908       "\"四 五六 \"\n"
11909       "\"七 八 九 \"\n"
11910       "\"十\"",
11911       format("\"一 二 三 四 五六 七 八 九 十\"", getLLVMStyleWithColumns(11)));
11912   EXPECT_EQ("\"一\t\"\n"
11913             "\"二 \t\"\n"
11914             "\"三 四 \"\n"
11915             "\"五\t\"\n"
11916             "\"六 \t\"\n"
11917             "\"七 \"\n"
11918             "\"八九十\tqq\"",
11919             format("\"一\t二 \t三 四 五\t六 \t七 八九十\tqq\"",
11920                    getLLVMStyleWithColumns(11)));
11921 
11922   // UTF8 character in an escape sequence.
11923   EXPECT_EQ("\"aaaaaa\"\n"
11924             "\"\\\xC2\x8D\"",
11925             format("\"aaaaaa\\\xC2\x8D\"", getLLVMStyleWithColumns(10)));
11926 }
11927 
11928 TEST_F(FormatTest, HandlesDoubleWidthCharsInMultiLineStrings) {
11929   EXPECT_EQ("const char *sssss =\n"
11930             "    \"一二三四五六七八\\\n"
11931             " 九 十\";",
11932             format("const char *sssss = \"一二三四五六七八\\\n"
11933                    " 九 十\";",
11934                    getLLVMStyleWithColumns(30)));
11935 }
11936 
11937 TEST_F(FormatTest, SplitsUTF8LineComments) {
11938   EXPECT_EQ("// aaaaÄ\xc2\x8d",
11939             format("// aaaaÄ\xc2\x8d", getLLVMStyleWithColumns(10)));
11940   EXPECT_EQ("// Я из лесу\n"
11941             "// вышел; был\n"
11942             "// сильный\n"
11943             "// мороз.",
11944             format("// Я из лесу вышел; был сильный мороз.",
11945                    getLLVMStyleWithColumns(13)));
11946   EXPECT_EQ("// 一二三\n"
11947             "// 四五六七\n"
11948             "// 八  九\n"
11949             "// 十",
11950             format("// 一二三 四五六七 八  九 十", getLLVMStyleWithColumns(9)));
11951 }
11952 
11953 TEST_F(FormatTest, SplitsUTF8BlockComments) {
11954   EXPECT_EQ("/* Гляжу,\n"
11955             " * поднимается\n"
11956             " * медленно в\n"
11957             " * гору\n"
11958             " * Лошадка,\n"
11959             " * везущая\n"
11960             " * хворосту\n"
11961             " * воз. */",
11962             format("/* Гляжу, поднимается медленно в гору\n"
11963                    " * Лошадка, везущая хворосту воз. */",
11964                    getLLVMStyleWithColumns(13)));
11965   EXPECT_EQ(
11966       "/* 一二三\n"
11967       " * 四五六七\n"
11968       " * 八  九\n"
11969       " * 十  */",
11970       format("/* 一二三 四五六七 八  九 十  */", getLLVMStyleWithColumns(9)));
11971   EXPECT_EQ("/* �������� ��������\n"
11972             " * ��������\n"
11973             " * ������-�� */",
11974             format("/* �������� �������� �������� ������-�� */", getLLVMStyleWithColumns(12)));
11975 }
11976 
11977 #endif // _MSC_VER
11978 
11979 TEST_F(FormatTest, ConstructorInitializerIndentWidth) {
11980   FormatStyle Style = getLLVMStyle();
11981 
11982   Style.ConstructorInitializerIndentWidth = 4;
11983   verifyFormat(
11984       "SomeClass::Constructor()\n"
11985       "    : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
11986       "      aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
11987       Style);
11988 
11989   Style.ConstructorInitializerIndentWidth = 2;
11990   verifyFormat(
11991       "SomeClass::Constructor()\n"
11992       "  : aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
11993       "    aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
11994       Style);
11995 
11996   Style.ConstructorInitializerIndentWidth = 0;
11997   verifyFormat(
11998       "SomeClass::Constructor()\n"
11999       ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n"
12000       "  aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}",
12001       Style);
12002   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
12003   verifyFormat(
12004       "SomeLongTemplateVariableName<\n"
12005       "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>",
12006       Style);
12007   verifyFormat(
12008       "bool smaller = 1 < bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(\n"
12009       "                       aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);",
12010       Style);
12011 
12012   Style.BreakConstructorInitializers = FormatStyle::BCIS_AfterColon;
12013   verifyFormat(
12014       "SomeClass::Constructor() :\n"
12015       "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa),\n"
12016       "aaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaa) {}",
12017       Style);
12018 }
12019 
12020 TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) {
12021   FormatStyle Style = getLLVMStyle();
12022   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
12023   Style.ConstructorInitializerIndentWidth = 4;
12024   verifyFormat("SomeClass::Constructor()\n"
12025                "    : a(a)\n"
12026                "    , b(b)\n"
12027                "    , c(c) {}",
12028                Style);
12029   verifyFormat("SomeClass::Constructor()\n"
12030                "    : a(a) {}",
12031                Style);
12032 
12033   Style.ColumnLimit = 0;
12034   verifyFormat("SomeClass::Constructor()\n"
12035                "    : a(a) {}",
12036                Style);
12037   verifyFormat("SomeClass::Constructor() noexcept\n"
12038                "    : a(a) {}",
12039                Style);
12040   verifyFormat("SomeClass::Constructor()\n"
12041                "    : a(a)\n"
12042                "    , b(b)\n"
12043                "    , c(c) {}",
12044                Style);
12045   verifyFormat("SomeClass::Constructor()\n"
12046                "    : a(a) {\n"
12047                "  foo();\n"
12048                "  bar();\n"
12049                "}",
12050                Style);
12051 
12052   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
12053   verifyFormat("SomeClass::Constructor()\n"
12054                "    : a(a)\n"
12055                "    , b(b)\n"
12056                "    , c(c) {\n}",
12057                Style);
12058   verifyFormat("SomeClass::Constructor()\n"
12059                "    : a(a) {\n}",
12060                Style);
12061 
12062   Style.ColumnLimit = 80;
12063   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
12064   Style.ConstructorInitializerIndentWidth = 2;
12065   verifyFormat("SomeClass::Constructor()\n"
12066                "  : a(a)\n"
12067                "  , b(b)\n"
12068                "  , c(c) {}",
12069                Style);
12070 
12071   Style.ConstructorInitializerIndentWidth = 0;
12072   verifyFormat("SomeClass::Constructor()\n"
12073                ": a(a)\n"
12074                ", b(b)\n"
12075                ", c(c) {}",
12076                Style);
12077 
12078   Style.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
12079   Style.ConstructorInitializerIndentWidth = 4;
12080   verifyFormat("SomeClass::Constructor() : aaaaaaaa(aaaaaaaa) {}", Style);
12081   verifyFormat(
12082       "SomeClass::Constructor() : aaaaa(aaaaa), aaaaa(aaaaa), aaaaa(aaaaa)\n",
12083       Style);
12084   verifyFormat(
12085       "SomeClass::Constructor()\n"
12086       "    : aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa), aaaaaaaa(aaaaaaaa) {}",
12087       Style);
12088   Style.ConstructorInitializerIndentWidth = 4;
12089   Style.ColumnLimit = 60;
12090   verifyFormat("SomeClass::Constructor()\n"
12091                "    : aaaaaaaa(aaaaaaaa)\n"
12092                "    , aaaaaaaa(aaaaaaaa)\n"
12093                "    , aaaaaaaa(aaaaaaaa) {}",
12094                Style);
12095 }
12096 
12097 TEST_F(FormatTest, Destructors) {
12098   verifyFormat("void F(int &i) { i.~int(); }");
12099   verifyFormat("void F(int &i) { i->~int(); }");
12100 }
12101 
12102 TEST_F(FormatTest, FormatsWithWebKitStyle) {
12103   FormatStyle Style = getWebKitStyle();
12104 
12105   // Don't indent in outer namespaces.
12106   verifyFormat("namespace outer {\n"
12107                "int i;\n"
12108                "namespace inner {\n"
12109                "    int i;\n"
12110                "} // namespace inner\n"
12111                "} // namespace outer\n"
12112                "namespace other_outer {\n"
12113                "int i;\n"
12114                "}",
12115                Style);
12116 
12117   // Don't indent case labels.
12118   verifyFormat("switch (variable) {\n"
12119                "case 1:\n"
12120                "case 2:\n"
12121                "    doSomething();\n"
12122                "    break;\n"
12123                "default:\n"
12124                "    ++variable;\n"
12125                "}",
12126                Style);
12127 
12128   // Wrap before binary operators.
12129   EXPECT_EQ("void f()\n"
12130             "{\n"
12131             "    if (aaaaaaaaaaaaaaaa\n"
12132             "        && bbbbbbbbbbbbbbbbbbbbbbbb\n"
12133             "        && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
12134             "        return;\n"
12135             "}",
12136             format("void f() {\n"
12137                    "if (aaaaaaaaaaaaaaaa\n"
12138                    "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
12139                    "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
12140                    "return;\n"
12141                    "}",
12142                    Style));
12143 
12144   // Allow functions on a single line.
12145   verifyFormat("void f() { return; }", Style);
12146 
12147   // Constructor initializers are formatted one per line with the "," on the
12148   // new line.
12149   verifyFormat("Constructor()\n"
12150                "    : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
12151                "    , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n"
12152                "          aaaaaaaaaaaaaa)\n"
12153                "    , aaaaaaaaaaaaaaaaaaaaaaa()\n"
12154                "{\n"
12155                "}",
12156                Style);
12157   verifyFormat("SomeClass::Constructor()\n"
12158                "    : a(a)\n"
12159                "{\n"
12160                "}",
12161                Style);
12162   EXPECT_EQ("SomeClass::Constructor()\n"
12163             "    : a(a)\n"
12164             "{\n"
12165             "}",
12166             format("SomeClass::Constructor():a(a){}", Style));
12167   verifyFormat("SomeClass::Constructor()\n"
12168                "    : a(a)\n"
12169                "    , b(b)\n"
12170                "    , c(c)\n"
12171                "{\n"
12172                "}",
12173                Style);
12174   verifyFormat("SomeClass::Constructor()\n"
12175                "    : a(a)\n"
12176                "{\n"
12177                "    foo();\n"
12178                "    bar();\n"
12179                "}",
12180                Style);
12181 
12182   // Access specifiers should be aligned left.
12183   verifyFormat("class C {\n"
12184                "public:\n"
12185                "    int i;\n"
12186                "};",
12187                Style);
12188 
12189   // Do not align comments.
12190   verifyFormat("int a; // Do not\n"
12191                "double b; // align comments.",
12192                Style);
12193 
12194   // Do not align operands.
12195   EXPECT_EQ("ASSERT(aaaa\n"
12196             "    || bbbb);",
12197             format("ASSERT ( aaaa\n||bbbb);", Style));
12198 
12199   // Accept input's line breaks.
12200   EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
12201             "    || bbbbbbbbbbbbbbb) {\n"
12202             "    i++;\n"
12203             "}",
12204             format("if (aaaaaaaaaaaaaaa\n"
12205                    "|| bbbbbbbbbbbbbbb) { i++; }",
12206                    Style));
12207   EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
12208             "    i++;\n"
12209             "}",
12210             format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
12211 
12212   // Don't automatically break all macro definitions (llvm.org/PR17842).
12213   verifyFormat("#define aNumber 10", Style);
12214   // However, generally keep the line breaks that the user authored.
12215   EXPECT_EQ("#define aNumber \\\n"
12216             "    10",
12217             format("#define aNumber \\\n"
12218                    " 10",
12219                    Style));
12220 
12221   // Keep empty and one-element array literals on a single line.
12222   EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[]\n"
12223             "                                  copyItems:YES];",
12224             format("NSArray*a=[[NSArray alloc] initWithArray:@[]\n"
12225                    "copyItems:YES];",
12226                    Style));
12227   EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\" ]\n"
12228             "                                  copyItems:YES];",
12229             format("NSArray*a=[[NSArray alloc]initWithArray:@[ @\"a\" ]\n"
12230                    "             copyItems:YES];",
12231                    Style));
12232   // FIXME: This does not seem right, there should be more indentation before
12233   // the array literal's entries. Nested blocks have the same problem.
12234   EXPECT_EQ("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
12235             "    @\"a\",\n"
12236             "    @\"a\"\n"
12237             "]\n"
12238             "                                  copyItems:YES];",
12239             format("NSArray* a = [[NSArray alloc] initWithArray:@[\n"
12240                    "     @\"a\",\n"
12241                    "     @\"a\"\n"
12242                    "     ]\n"
12243                    "       copyItems:YES];",
12244                    Style));
12245   EXPECT_EQ(
12246       "NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
12247       "                                  copyItems:YES];",
12248       format("NSArray* a = [[NSArray alloc] initWithArray:@[ @\"a\", @\"a\" ]\n"
12249              "   copyItems:YES];",
12250              Style));
12251 
12252   verifyFormat("[self.a b:c c:d];", Style);
12253   EXPECT_EQ("[self.a b:c\n"
12254             "        c:d];",
12255             format("[self.a b:c\n"
12256                    "c:d];",
12257                    Style));
12258 }
12259 
12260 TEST_F(FormatTest, FormatsLambdas) {
12261   verifyFormat("int c = [b]() mutable { return [&b] { return b++; }(); }();\n");
12262   verifyFormat(
12263       "int c = [b]() mutable noexcept { return [&b] { return b++; }(); }();\n");
12264   verifyFormat("int c = [&] { [=] { return b++; }(); }();\n");
12265   verifyFormat("int c = [&, &a, a] { [=, c, &d] { return b++; }(); }();\n");
12266   verifyFormat("int c = [&a, &a, a] { [=, a, b, &c] { return b++; }(); }();\n");
12267   verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] { return b++; }(); }}\n");
12268   verifyFormat("auto c = {[&a, &a, a] { [=, a, b, &c] {}(); }}\n");
12269   verifyFormat("auto c = [a = [b = 42] {}] {};\n");
12270   verifyFormat("auto c = [a = &i + 10, b = [] {}] {};\n");
12271   verifyFormat("int x = f(*+[] {});");
12272   verifyFormat("void f() {\n"
12273                "  other(x.begin(), x.end(), [&](int, int) { return 1; });\n"
12274                "}\n");
12275   verifyFormat("void f() {\n"
12276                "  other(x.begin(), //\n"
12277                "        x.end(),   //\n"
12278                "        [&](int, int) { return 1; });\n"
12279                "}\n");
12280   verifyFormat("void f() {\n"
12281                "  other.other.other.other.other(\n"
12282                "      x.begin(), x.end(),\n"
12283                "      [something, rather](int, int, int, int, int, int, int) { return 1; });\n"
12284                "}\n");
12285   verifyFormat("void f() {\n"
12286                "  other.other.other.other.other(\n"
12287                "      x.begin(), x.end(),\n"
12288                "      [something, rather](int, int, int, int, int, int, int) {\n"
12289                "        //\n"
12290                "      });\n"
12291                "}\n");
12292   verifyFormat("SomeFunction([]() { // A cool function...\n"
12293                "  return 43;\n"
12294                "});");
12295   EXPECT_EQ("SomeFunction([]() {\n"
12296             "#define A a\n"
12297             "  return 43;\n"
12298             "});",
12299             format("SomeFunction([](){\n"
12300                    "#define A a\n"
12301                    "return 43;\n"
12302                    "});"));
12303   verifyFormat("void f() {\n"
12304                "  SomeFunction([](decltype(x), A *a) {});\n"
12305                "}");
12306   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
12307                "    [](const aaaaaaaaaa &a) { return a; });");
12308   verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n"
12309                "  SomeOtherFunctioooooooooooooooooooooooooon();\n"
12310                "});");
12311   verifyFormat("Constructor()\n"
12312                "    : Field([] { // comment\n"
12313                "        int i;\n"
12314                "      }) {}");
12315   verifyFormat("auto my_lambda = [](const string &some_parameter) {\n"
12316                "  return some_parameter.size();\n"
12317                "};");
12318   verifyFormat("std::function<std::string(const std::string &)> my_lambda =\n"
12319                "    [](const string &s) { return s; };");
12320   verifyFormat("int i = aaaaaa ? 1 //\n"
12321                "               : [] {\n"
12322                "                   return 2; //\n"
12323                "                 }();");
12324   verifyFormat("llvm::errs() << \"number of twos is \"\n"
12325                "             << std::count_if(v.begin(), v.end(), [](int x) {\n"
12326                "                  return x == 2; // force break\n"
12327                "                });");
12328   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
12329                "    [=](int iiiiiiiiiiii) {\n"
12330                "      return aaaaaaaaaaaaaaaaaaaaaaa !=\n"
12331                "             aaaaaaaaaaaaaaaaaaaaaaa;\n"
12332                "    });",
12333                getLLVMStyleWithColumns(60));
12334   verifyFormat("SomeFunction({[&] {\n"
12335                "                // comment\n"
12336                "              },\n"
12337                "              [&] {\n"
12338                "                // comment\n"
12339                "              }});");
12340   verifyFormat("SomeFunction({[&] {\n"
12341                "  // comment\n"
12342                "}});");
12343   verifyFormat("virtual aaaaaaaaaaaaaaaa(\n"
12344                "    std::function<bool()> bbbbbbbbbbbb = [&]() { return true; },\n"
12345                "    aaaaa aaaaaaaaa);");
12346 
12347   // Lambdas with return types.
12348   verifyFormat("int c = []() -> int { return 2; }();\n");
12349   verifyFormat("int c = []() -> int * { return 2; }();\n");
12350   verifyFormat("int c = []() -> vector<int> { return {2}; }();\n");
12351   verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());");
12352   verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};");
12353   verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};");
12354   verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};");
12355   verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};");
12356   verifyFormat("[a, a]() -> a<1> {};");
12357   verifyFormat("[]() -> foo<5 + 2> { return {}; };");
12358   verifyFormat("[]() -> foo<5 - 2> { return {}; };");
12359   verifyFormat("[]() -> foo<5 / 2> { return {}; };");
12360   verifyFormat("[]() -> foo<5 * 2> { return {}; };");
12361   verifyFormat("[]() -> foo<5 % 2> { return {}; };");
12362   verifyFormat("[]() -> foo<5 << 2> { return {}; };");
12363   verifyFormat("[]() -> foo<!5> { return {}; };");
12364   verifyFormat("[]() -> foo<~5> { return {}; };");
12365   verifyFormat("[]() -> foo<5 | 2> { return {}; };");
12366   verifyFormat("[]() -> foo<5 || 2> { return {}; };");
12367   verifyFormat("[]() -> foo<5 & 2> { return {}; };");
12368   verifyFormat("[]() -> foo<5 && 2> { return {}; };");
12369   verifyFormat("[]() -> foo<5 == 2> { return {}; };");
12370   verifyFormat("[]() -> foo<5 != 2> { return {}; };");
12371   verifyFormat("[]() -> foo<5 >= 2> { return {}; };");
12372   verifyFormat("[]() -> foo<5 <= 2> { return {}; };");
12373   verifyFormat("[]() -> foo<5 < 2> { return {}; };");
12374   verifyFormat("[]() -> foo<2 ? 1 : 0> { return {}; };");
12375   verifyFormat("namespace bar {\n"
12376               "// broken:\n"
12377               "auto foo{[]() -> foo<5 + 2> { return {}; }};\n"
12378               "} // namespace bar");
12379   verifyFormat("namespace bar {\n"
12380               "// broken:\n"
12381               "auto foo{[]() -> foo<5 - 2> { return {}; }};\n"
12382               "} // namespace bar");
12383   verifyFormat("namespace bar {\n"
12384               "// broken:\n"
12385               "auto foo{[]() -> foo<5 / 2> { return {}; }};\n"
12386               "} // namespace bar");
12387   verifyFormat("namespace bar {\n"
12388               "// broken:\n"
12389               "auto foo{[]() -> foo<5 * 2> { return {}; }};\n"
12390               "} // namespace bar");
12391   verifyFormat("namespace bar {\n"
12392               "// broken:\n"
12393               "auto foo{[]() -> foo<5 % 2> { return {}; }};\n"
12394               "} // namespace bar");
12395   verifyFormat("namespace bar {\n"
12396               "// broken:\n"
12397               "auto foo{[]() -> foo<5 << 2> { return {}; }};\n"
12398               "} // namespace bar");
12399   verifyFormat("namespace bar {\n"
12400               "// broken:\n"
12401               "auto foo{[]() -> foo<!5> { return {}; }};\n"
12402               "} // namespace bar");
12403   verifyFormat("namespace bar {\n"
12404               "// broken:\n"
12405               "auto foo{[]() -> foo<~5> { return {}; }};\n"
12406               "} // namespace bar");
12407   verifyFormat("namespace bar {\n"
12408               "// broken:\n"
12409               "auto foo{[]() -> foo<5 | 2> { return {}; }};\n"
12410               "} // namespace bar");
12411   verifyFormat("namespace bar {\n"
12412               "// broken:\n"
12413               "auto foo{[]() -> foo<5 || 2> { return {}; }};\n"
12414               "} // namespace bar");
12415   verifyFormat("namespace bar {\n"
12416               "// broken:\n"
12417               "auto foo{[]() -> foo<5 & 2> { return {}; }};\n"
12418               "} // namespace bar");
12419   verifyFormat("namespace bar {\n"
12420               "// broken:\n"
12421               "auto foo{[]() -> foo<5 && 2> { return {}; }};\n"
12422               "} // namespace bar");
12423   verifyFormat("namespace bar {\n"
12424               "// broken:\n"
12425               "auto foo{[]() -> foo<5 == 2> { return {}; }};\n"
12426               "} // namespace bar");
12427   verifyFormat("namespace bar {\n"
12428               "// broken:\n"
12429               "auto foo{[]() -> foo<5 != 2> { return {}; }};\n"
12430               "} // namespace bar");
12431   verifyFormat("namespace bar {\n"
12432               "// broken:\n"
12433               "auto foo{[]() -> foo<5 >= 2> { return {}; }};\n"
12434               "} // namespace bar");
12435   verifyFormat("namespace bar {\n"
12436               "// broken:\n"
12437               "auto foo{[]() -> foo<5 <= 2> { return {}; }};\n"
12438               "} // namespace bar");
12439   verifyFormat("namespace bar {\n"
12440               "// broken:\n"
12441               "auto foo{[]() -> foo<5 < 2> { return {}; }};\n"
12442               "} // namespace bar");
12443   verifyFormat("namespace bar {\n"
12444               "// broken:\n"
12445               "auto foo{[]() -> foo<2 ? 1 : 0> { return {}; }};\n"
12446               "} // namespace bar");
12447   verifyFormat("[]() -> a<1> {};");
12448   verifyFormat("[]() -> a<1> { ; };");
12449   verifyFormat("[]() -> a<1> { ; }();");
12450   verifyFormat("[a, a]() -> a<true> {};");
12451   verifyFormat("[]() -> a<true> {};");
12452   verifyFormat("[]() -> a<true> { ; };");
12453   verifyFormat("[]() -> a<true> { ; }();");
12454   verifyFormat("[a, a]() -> a<false> {};");
12455   verifyFormat("[]() -> a<false> {};");
12456   verifyFormat("[]() -> a<false> { ; };");
12457   verifyFormat("[]() -> a<false> { ; }();");
12458   verifyFormat("auto foo{[]() -> foo<false> { ; }};");
12459   verifyFormat("namespace bar {\n"
12460                "auto foo{[]() -> foo<false> { ; }};\n"
12461                "} // namespace bar");
12462   verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n"
12463                "                   int j) -> int {\n"
12464                "  return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n"
12465                "};");
12466   verifyFormat(
12467       "aaaaaaaaaaaaaaaaaaaaaa(\n"
12468       "    [](aaaaaaaaaaaaaaaaaaaaaaaaaaa &aaa) -> aaaaaaaaaaaaaaaa {\n"
12469       "      return aaaaaaaaaaaaaaaaa;\n"
12470       "    });",
12471       getLLVMStyleWithColumns(70));
12472   verifyFormat("[]() //\n"
12473                "    -> int {\n"
12474                "  return 1; //\n"
12475                "};");
12476 
12477   // Multiple lambdas in the same parentheses change indentation rules. These
12478   // lambdas are forced to start on new lines.
12479   verifyFormat("SomeFunction(\n"
12480                "    []() {\n"
12481                "      //\n"
12482                "    },\n"
12483                "    []() {\n"
12484                "      //\n"
12485                "    });");
12486 
12487   // A lambda passed as arg0 is always pushed to the next line.
12488   verifyFormat("SomeFunction(\n"
12489                "    [this] {\n"
12490                "      //\n"
12491                "    },\n"
12492                "    1);\n");
12493 
12494   // A multi-line lambda passed as arg1 forces arg0 to be pushed out, just like the arg0
12495   // case above.
12496   auto Style = getGoogleStyle();
12497   Style.BinPackArguments = false;
12498   verifyFormat("SomeFunction(\n"
12499                "    a,\n"
12500                "    [this] {\n"
12501                "      //\n"
12502                "    },\n"
12503                "    b);\n",
12504                Style);
12505   verifyFormat("SomeFunction(\n"
12506                "    a,\n"
12507                "    [this] {\n"
12508                "      //\n"
12509                "    },\n"
12510                "    b);\n");
12511 
12512   // A lambda with a very long line forces arg0 to be pushed out irrespective of
12513   // the BinPackArguments value (as long as the code is wide enough).
12514   verifyFormat("something->SomeFunction(\n"
12515                "    a,\n"
12516                "    [this] {\n"
12517                "      D0000000000000000000000000000000000000000000000000000000000001();\n"
12518                "    },\n"
12519                "    b);\n");
12520 
12521   // A multi-line lambda is pulled up as long as the introducer fits on the previous
12522   // line and there are no further args.
12523   verifyFormat("function(1, [this, that] {\n"
12524                "  //\n"
12525                "});\n");
12526   verifyFormat("function([this, that] {\n"
12527                "  //\n"
12528                "});\n");
12529   // FIXME: this format is not ideal and we should consider forcing the first arg
12530   // onto its own line.
12531   verifyFormat("function(a, b, c, //\n"
12532                "         d, [this, that] {\n"
12533                "           //\n"
12534                "         });\n");
12535 
12536   // Multiple lambdas are treated correctly even when there is a short arg0.
12537   verifyFormat("SomeFunction(\n"
12538                "    1,\n"
12539                "    [this] {\n"
12540                "      //\n"
12541                "    },\n"
12542                "    [this] {\n"
12543                "      //\n"
12544                "    },\n"
12545                "    1);\n");
12546 
12547   // More complex introducers.
12548   verifyFormat("return [i, args...] {};");
12549 
12550   // Not lambdas.
12551   verifyFormat("constexpr char hello[]{\"hello\"};");
12552   verifyFormat("double &operator[](int i) { return 0; }\n"
12553                "int i;");
12554   verifyFormat("std::unique_ptr<int[]> foo() {}");
12555   verifyFormat("int i = a[a][a]->f();");
12556   verifyFormat("int i = (*b)[a]->f();");
12557 
12558   // Other corner cases.
12559   verifyFormat("void f() {\n"
12560                "  bar([]() {} // Did not respect SpacesBeforeTrailingComments\n"
12561                "  );\n"
12562                "}");
12563 
12564   // Lambdas created through weird macros.
12565   verifyFormat("void f() {\n"
12566                "  MACRO((const AA &a) { return 1; });\n"
12567                "  MACRO((AA &a) { return 1; });\n"
12568                "}");
12569 
12570   verifyFormat("if (blah_blah(whatever, whatever, [] {\n"
12571                "      doo_dah();\n"
12572                "      doo_dah();\n"
12573                "    })) {\n"
12574                "}");
12575   verifyFormat("if constexpr (blah_blah(whatever, whatever, [] {\n"
12576                "                doo_dah();\n"
12577                "                doo_dah();\n"
12578                "              })) {\n"
12579                "}");
12580   verifyFormat("auto lambda = []() {\n"
12581                "  int a = 2\n"
12582                "#if A\n"
12583                "          + 2\n"
12584                "#endif\n"
12585                "      ;\n"
12586                "};");
12587 
12588   // Lambdas with complex multiline introducers.
12589   verifyFormat(
12590       "aaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
12591       "    [aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]()\n"
12592       "        -> ::std::unordered_set<\n"
12593       "            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa> {\n"
12594       "      //\n"
12595       "    });");
12596 
12597   FormatStyle DoNotMerge = getLLVMStyle();
12598   DoNotMerge.AllowShortLambdasOnASingleLine = FormatStyle::SLS_None;
12599   verifyFormat("auto c = []() {\n"
12600                "  return b;\n"
12601                "};",
12602                "auto c = []() { return b; };", DoNotMerge);
12603   verifyFormat("auto c = []() {\n"
12604                "};",
12605                " auto c = []() {};", DoNotMerge);
12606 
12607   FormatStyle MergeEmptyOnly = getLLVMStyle();
12608   MergeEmptyOnly.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Empty;
12609   verifyFormat("auto c = []() {\n"
12610                "  return b;\n"
12611                "};",
12612                "auto c = []() {\n"
12613                "  return b;\n"
12614                " };",
12615                MergeEmptyOnly);
12616   verifyFormat("auto c = []() {};",
12617                "auto c = []() {\n"
12618                "};",
12619                MergeEmptyOnly);
12620 
12621   FormatStyle MergeInline = getLLVMStyle();
12622   MergeInline.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Inline;
12623   verifyFormat("auto c = []() {\n"
12624                "  return b;\n"
12625                "};",
12626                "auto c = []() { return b; };", MergeInline);
12627   verifyFormat("function([]() { return b; })", "function([]() { return b; })",
12628                MergeInline);
12629   verifyFormat("function([]() { return b; }, a)",
12630                "function([]() { return b; }, a)", MergeInline);
12631   verifyFormat("function(a, []() { return b; })",
12632                "function(a, []() { return b; })", MergeInline);
12633 }
12634 
12635 TEST_F(FormatTest, EmptyLinesInLambdas) {
12636   verifyFormat("auto lambda = []() {\n"
12637                "  x(); //\n"
12638                "};",
12639                "auto lambda = []() {\n"
12640                "\n"
12641                "  x(); //\n"
12642                "\n"
12643                "};");
12644 }
12645 
12646 TEST_F(FormatTest, FormatsBlocks) {
12647   FormatStyle ShortBlocks = getLLVMStyle();
12648   ShortBlocks.AllowShortBlocksOnASingleLine = true;
12649   verifyFormat("int (^Block)(int, int);", ShortBlocks);
12650   verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks);
12651   verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks);
12652   verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks);
12653   verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks);
12654   verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks);
12655 
12656   verifyFormat("foo(^{ bar(); });", ShortBlocks);
12657   verifyFormat("foo(a, ^{ bar(); });", ShortBlocks);
12658   verifyFormat("{ void (^block)(Object *x); }", ShortBlocks);
12659 
12660   verifyFormat("[operation setCompletionBlock:^{\n"
12661                "  [self onOperationDone];\n"
12662                "}];");
12663   verifyFormat("int i = {[operation setCompletionBlock:^{\n"
12664                "  [self onOperationDone];\n"
12665                "}]};");
12666   verifyFormat("[operation setCompletionBlock:^(int *i) {\n"
12667                "  f();\n"
12668                "}];");
12669   verifyFormat("int a = [operation block:^int(int *i) {\n"
12670                "  return 1;\n"
12671                "}];");
12672   verifyFormat("[myObject doSomethingWith:arg1\n"
12673                "                      aaa:^int(int *a) {\n"
12674                "                        return 1;\n"
12675                "                      }\n"
12676                "                      bbb:f(a * bbbbbbbb)];");
12677 
12678   verifyFormat("[operation setCompletionBlock:^{\n"
12679                "  [self.delegate newDataAvailable];\n"
12680                "}];",
12681                getLLVMStyleWithColumns(60));
12682   verifyFormat("dispatch_async(_fileIOQueue, ^{\n"
12683                "  NSString *path = [self sessionFilePath];\n"
12684                "  if (path) {\n"
12685                "    // ...\n"
12686                "  }\n"
12687                "});");
12688   verifyFormat("[[SessionService sharedService]\n"
12689                "    loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
12690                "      if (window) {\n"
12691                "        [self windowDidLoad:window];\n"
12692                "      } else {\n"
12693                "        [self errorLoadingWindow];\n"
12694                "      }\n"
12695                "    }];");
12696   verifyFormat("void (^largeBlock)(void) = ^{\n"
12697                "  // ...\n"
12698                "};\n",
12699                getLLVMStyleWithColumns(40));
12700   verifyFormat("[[SessionService sharedService]\n"
12701                "    loadWindowWithCompletionBlock: //\n"
12702                "        ^(SessionWindow *window) {\n"
12703                "          if (window) {\n"
12704                "            [self windowDidLoad:window];\n"
12705                "          } else {\n"
12706                "            [self errorLoadingWindow];\n"
12707                "          }\n"
12708                "        }];",
12709                getLLVMStyleWithColumns(60));
12710   verifyFormat("[myObject doSomethingWith:arg1\n"
12711                "    firstBlock:^(Foo *a) {\n"
12712                "      // ...\n"
12713                "      int i;\n"
12714                "    }\n"
12715                "    secondBlock:^(Bar *b) {\n"
12716                "      // ...\n"
12717                "      int i;\n"
12718                "    }\n"
12719                "    thirdBlock:^Foo(Bar *b) {\n"
12720                "      // ...\n"
12721                "      int i;\n"
12722                "    }];");
12723   verifyFormat("[myObject doSomethingWith:arg1\n"
12724                "               firstBlock:-1\n"
12725                "              secondBlock:^(Bar *b) {\n"
12726                "                // ...\n"
12727                "                int i;\n"
12728                "              }];");
12729 
12730   verifyFormat("f(^{\n"
12731                "  @autoreleasepool {\n"
12732                "    if (a) {\n"
12733                "      g();\n"
12734                "    }\n"
12735                "  }\n"
12736                "});");
12737   verifyFormat("Block b = ^int *(A *a, B *b) {}");
12738   verifyFormat("BOOL (^aaa)(void) = ^BOOL {\n"
12739                "};");
12740 
12741   FormatStyle FourIndent = getLLVMStyle();
12742   FourIndent.ObjCBlockIndentWidth = 4;
12743   verifyFormat("[operation setCompletionBlock:^{\n"
12744                "    [self onOperationDone];\n"
12745                "}];",
12746                FourIndent);
12747 }
12748 
12749 TEST_F(FormatTest, FormatsBlocksWithZeroColumnWidth) {
12750   FormatStyle ZeroColumn = getLLVMStyle();
12751   ZeroColumn.ColumnLimit = 0;
12752 
12753   verifyFormat("[[SessionService sharedService] "
12754                "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
12755                "  if (window) {\n"
12756                "    [self windowDidLoad:window];\n"
12757                "  } else {\n"
12758                "    [self errorLoadingWindow];\n"
12759                "  }\n"
12760                "}];",
12761                ZeroColumn);
12762   EXPECT_EQ("[[SessionService sharedService]\n"
12763             "    loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
12764             "      if (window) {\n"
12765             "        [self windowDidLoad:window];\n"
12766             "      } else {\n"
12767             "        [self errorLoadingWindow];\n"
12768             "      }\n"
12769             "    }];",
12770             format("[[SessionService sharedService]\n"
12771                    "loadWindowWithCompletionBlock:^(SessionWindow *window) {\n"
12772                    "                if (window) {\n"
12773                    "    [self windowDidLoad:window];\n"
12774                    "  } else {\n"
12775                    "    [self errorLoadingWindow];\n"
12776                    "  }\n"
12777                    "}];",
12778                    ZeroColumn));
12779   verifyFormat("[myObject doSomethingWith:arg1\n"
12780                "    firstBlock:^(Foo *a) {\n"
12781                "      // ...\n"
12782                "      int i;\n"
12783                "    }\n"
12784                "    secondBlock:^(Bar *b) {\n"
12785                "      // ...\n"
12786                "      int i;\n"
12787                "    }\n"
12788                "    thirdBlock:^Foo(Bar *b) {\n"
12789                "      // ...\n"
12790                "      int i;\n"
12791                "    }];",
12792                ZeroColumn);
12793   verifyFormat("f(^{\n"
12794                "  @autoreleasepool {\n"
12795                "    if (a) {\n"
12796                "      g();\n"
12797                "    }\n"
12798                "  }\n"
12799                "});",
12800                ZeroColumn);
12801   verifyFormat("void (^largeBlock)(void) = ^{\n"
12802                "  // ...\n"
12803                "};",
12804                ZeroColumn);
12805 
12806   ZeroColumn.AllowShortBlocksOnASingleLine = true;
12807   EXPECT_EQ("void (^largeBlock)(void) = ^{ int i; };",
12808             format("void   (^largeBlock)(void) = ^{ int   i; };", ZeroColumn));
12809   ZeroColumn.AllowShortBlocksOnASingleLine = false;
12810   EXPECT_EQ("void (^largeBlock)(void) = ^{\n"
12811             "  int i;\n"
12812             "};",
12813             format("void   (^largeBlock)(void) = ^{ int   i; };", ZeroColumn));
12814 }
12815 
12816 TEST_F(FormatTest, SupportsCRLF) {
12817   EXPECT_EQ("int a;\r\n"
12818             "int b;\r\n"
12819             "int c;\r\n",
12820             format("int a;\r\n"
12821                    "  int b;\r\n"
12822                    "    int c;\r\n",
12823                    getLLVMStyle()));
12824   EXPECT_EQ("int a;\r\n"
12825             "int b;\r\n"
12826             "int c;\r\n",
12827             format("int a;\r\n"
12828                    "  int b;\n"
12829                    "    int c;\r\n",
12830                    getLLVMStyle()));
12831   EXPECT_EQ("int a;\n"
12832             "int b;\n"
12833             "int c;\n",
12834             format("int a;\r\n"
12835                    "  int b;\n"
12836                    "    int c;\n",
12837                    getLLVMStyle()));
12838   EXPECT_EQ("\"aaaaaaa \"\r\n"
12839             "\"bbbbbbb\";\r\n",
12840             format("\"aaaaaaa bbbbbbb\";\r\n", getLLVMStyleWithColumns(10)));
12841   EXPECT_EQ("#define A \\\r\n"
12842             "  b;      \\\r\n"
12843             "  c;      \\\r\n"
12844             "  d;\r\n",
12845             format("#define A \\\r\n"
12846                    "  b; \\\r\n"
12847                    "  c; d; \r\n",
12848                    getGoogleStyle()));
12849 
12850   EXPECT_EQ("/*\r\n"
12851             "multi line block comments\r\n"
12852             "should not introduce\r\n"
12853             "an extra carriage return\r\n"
12854             "*/\r\n",
12855             format("/*\r\n"
12856                    "multi line block comments\r\n"
12857                    "should not introduce\r\n"
12858                    "an extra carriage return\r\n"
12859                    "*/\r\n"));
12860   EXPECT_EQ("/*\r\n"
12861             "\r\n"
12862             "*/",
12863             format("/*\r\n"
12864                    "    \r\r\r\n"
12865                    "*/"));
12866 }
12867 
12868 TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
12869   verifyFormat("MY_CLASS(C) {\n"
12870                "  int i;\n"
12871                "  int j;\n"
12872                "};");
12873 }
12874 
12875 TEST_F(FormatTest, ConfigurableContinuationIndentWidth) {
12876   FormatStyle TwoIndent = getLLVMStyleWithColumns(15);
12877   TwoIndent.ContinuationIndentWidth = 2;
12878 
12879   EXPECT_EQ("int i =\n"
12880             "  longFunction(\n"
12881             "    arg);",
12882             format("int i = longFunction(arg);", TwoIndent));
12883 
12884   FormatStyle SixIndent = getLLVMStyleWithColumns(20);
12885   SixIndent.ContinuationIndentWidth = 6;
12886 
12887   EXPECT_EQ("int i =\n"
12888             "      longFunction(\n"
12889             "            arg);",
12890             format("int i = longFunction(arg);", SixIndent));
12891 }
12892 
12893 TEST_F(FormatTest, WrappedClosingParenthesisIndent) {
12894   FormatStyle Style = getLLVMStyle();
12895   verifyFormat("int Foo::getter(\n"
12896                "    //\n"
12897                ") const {\n"
12898                "  return foo;\n"
12899                "}",
12900                Style);
12901   verifyFormat("void Foo::setter(\n"
12902                "    //\n"
12903                ") {\n"
12904                "  foo = 1;\n"
12905                "}",
12906                Style);
12907 }
12908 
12909 TEST_F(FormatTest, SpacesInAngles) {
12910   FormatStyle Spaces = getLLVMStyle();
12911   Spaces.SpacesInAngles = true;
12912 
12913   verifyFormat("static_cast< int >(arg);", Spaces);
12914   verifyFormat("template < typename T0, typename T1 > void f() {}", Spaces);
12915   verifyFormat("f< int, float >();", Spaces);
12916   verifyFormat("template <> g() {}", Spaces);
12917   verifyFormat("template < std::vector< int > > f() {}", Spaces);
12918   verifyFormat("std::function< void(int, int) > fct;", Spaces);
12919   verifyFormat("void inFunction() { std::function< void(int, int) > fct; }",
12920                Spaces);
12921 
12922   Spaces.Standard = FormatStyle::LS_Cpp03;
12923   Spaces.SpacesInAngles = true;
12924   verifyFormat("A< A< int > >();", Spaces);
12925 
12926   Spaces.SpacesInAngles = false;
12927   verifyFormat("A<A<int> >();", Spaces);
12928 
12929   Spaces.Standard = FormatStyle::LS_Cpp11;
12930   Spaces.SpacesInAngles = true;
12931   verifyFormat("A< A< int > >();", Spaces);
12932 
12933   Spaces.SpacesInAngles = false;
12934   verifyFormat("A<A<int>>();", Spaces);
12935 }
12936 
12937 TEST_F(FormatTest, SpaceAfterTemplateKeyword) {
12938   FormatStyle Style = getLLVMStyle();
12939   Style.SpaceAfterTemplateKeyword = false;
12940   verifyFormat("template<int> void foo();", Style);
12941 }
12942 
12943 TEST_F(FormatTest, TripleAngleBrackets) {
12944   verifyFormat("f<<<1, 1>>>();");
12945   verifyFormat("f<<<1, 1, 1, s>>>();");
12946   verifyFormat("f<<<a, b, c, d>>>();");
12947   EXPECT_EQ("f<<<1, 1>>>();", format("f <<< 1, 1 >>> ();"));
12948   verifyFormat("f<param><<<1, 1>>>();");
12949   verifyFormat("f<1><<<1, 1>>>();");
12950   EXPECT_EQ("f<param><<<1, 1>>>();", format("f< param > <<< 1, 1 >>> ();"));
12951   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
12952                "aaaaaaaaaaa<<<\n    1, 1>>>();");
12953   verifyFormat("aaaaaaaaaaaaaaa<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaa>\n"
12954                "    <<<aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaaaaaaaaaa>>>();");
12955 }
12956 
12957 TEST_F(FormatTest, MergeLessLessAtEnd) {
12958   verifyFormat("<<");
12959   EXPECT_EQ("< < <", format("\\\n<<<"));
12960   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
12961                "aaallvm::outs() <<");
12962   verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
12963                "aaaallvm::outs()\n    <<");
12964 }
12965 
12966 TEST_F(FormatTest, HandleUnbalancedImplicitBracesAcrossPPBranches) {
12967   std::string code = "#if A\n"
12968                      "#if B\n"
12969                      "a.\n"
12970                      "#endif\n"
12971                      "    a = 1;\n"
12972                      "#else\n"
12973                      "#endif\n"
12974                      "#if C\n"
12975                      "#else\n"
12976                      "#endif\n";
12977   EXPECT_EQ(code, format(code));
12978 }
12979 
12980 TEST_F(FormatTest, HandleConflictMarkers) {
12981   // Git/SVN conflict markers.
12982   EXPECT_EQ("int a;\n"
12983             "void f() {\n"
12984             "  callme(some(parameter1,\n"
12985             "<<<<<<< text by the vcs\n"
12986             "              parameter2),\n"
12987             "||||||| text by the vcs\n"
12988             "              parameter2),\n"
12989             "         parameter3,\n"
12990             "======= text by the vcs\n"
12991             "              parameter2, parameter3),\n"
12992             ">>>>>>> text by the vcs\n"
12993             "         otherparameter);\n",
12994             format("int a;\n"
12995                    "void f() {\n"
12996                    "  callme(some(parameter1,\n"
12997                    "<<<<<<< text by the vcs\n"
12998                    "  parameter2),\n"
12999                    "||||||| text by the vcs\n"
13000                    "  parameter2),\n"
13001                    "  parameter3,\n"
13002                    "======= text by the vcs\n"
13003                    "  parameter2,\n"
13004                    "  parameter3),\n"
13005                    ">>>>>>> text by the vcs\n"
13006                    "  otherparameter);\n"));
13007 
13008   // Perforce markers.
13009   EXPECT_EQ("void f() {\n"
13010             "  function(\n"
13011             ">>>> text by the vcs\n"
13012             "      parameter,\n"
13013             "==== text by the vcs\n"
13014             "      parameter,\n"
13015             "==== text by the vcs\n"
13016             "      parameter,\n"
13017             "<<<< text by the vcs\n"
13018             "      parameter);\n",
13019             format("void f() {\n"
13020                    "  function(\n"
13021                    ">>>> text by the vcs\n"
13022                    "  parameter,\n"
13023                    "==== text by the vcs\n"
13024                    "  parameter,\n"
13025                    "==== text by the vcs\n"
13026                    "  parameter,\n"
13027                    "<<<< text by the vcs\n"
13028                    "  parameter);\n"));
13029 
13030   EXPECT_EQ("<<<<<<<\n"
13031             "|||||||\n"
13032             "=======\n"
13033             ">>>>>>>",
13034             format("<<<<<<<\n"
13035                    "|||||||\n"
13036                    "=======\n"
13037                    ">>>>>>>"));
13038 
13039   EXPECT_EQ("<<<<<<<\n"
13040             "|||||||\n"
13041             "int i;\n"
13042             "=======\n"
13043             ">>>>>>>",
13044             format("<<<<<<<\n"
13045                    "|||||||\n"
13046                    "int i;\n"
13047                    "=======\n"
13048                    ">>>>>>>"));
13049 
13050   // FIXME: Handle parsing of macros around conflict markers correctly:
13051   EXPECT_EQ("#define Macro \\\n"
13052             "<<<<<<<\n"
13053             "Something \\\n"
13054             "|||||||\n"
13055             "Else \\\n"
13056             "=======\n"
13057             "Other \\\n"
13058             ">>>>>>>\n"
13059             "    End int i;\n",
13060             format("#define Macro \\\n"
13061                    "<<<<<<<\n"
13062                    "  Something \\\n"
13063                    "|||||||\n"
13064                    "  Else \\\n"
13065                    "=======\n"
13066                    "  Other \\\n"
13067                    ">>>>>>>\n"
13068                    "  End\n"
13069                    "int i;\n"));
13070 }
13071 
13072 TEST_F(FormatTest, DisableRegions) {
13073   EXPECT_EQ("int i;\n"
13074             "// clang-format off\n"
13075             "  int j;\n"
13076             "// clang-format on\n"
13077             "int k;",
13078             format(" int  i;\n"
13079                    "   // clang-format off\n"
13080                    "  int j;\n"
13081                    " // clang-format on\n"
13082                    "   int   k;"));
13083   EXPECT_EQ("int i;\n"
13084             "/* clang-format off */\n"
13085             "  int j;\n"
13086             "/* clang-format on */\n"
13087             "int k;",
13088             format(" int  i;\n"
13089                    "   /* clang-format off */\n"
13090                    "  int j;\n"
13091                    " /* clang-format on */\n"
13092                    "   int   k;"));
13093 
13094   // Don't reflow comments within disabled regions.
13095   EXPECT_EQ(
13096       "// clang-format off\n"
13097       "// long long long long long long line\n"
13098       "/* clang-format on */\n"
13099       "/* long long long\n"
13100       " * long long long\n"
13101       " * line */\n"
13102       "int i;\n"
13103       "/* clang-format off */\n"
13104       "/* long long long long long long line */\n",
13105       format("// clang-format off\n"
13106              "// long long long long long long line\n"
13107              "/* clang-format on */\n"
13108              "/* long long long long long long line */\n"
13109              "int i;\n"
13110              "/* clang-format off */\n"
13111              "/* long long long long long long line */\n",
13112              getLLVMStyleWithColumns(20)));
13113 }
13114 
13115 TEST_F(FormatTest, DoNotCrashOnInvalidInput) {
13116   format("? ) =");
13117   verifyNoCrash("#define a\\\n /**/}");
13118 }
13119 
13120 TEST_F(FormatTest, FormatsTableGenCode) {
13121   FormatStyle Style = getLLVMStyle();
13122   Style.Language = FormatStyle::LK_TableGen;
13123   verifyFormat("include \"a.td\"\ninclude \"b.td\"", Style);
13124 }
13125 
13126 TEST_F(FormatTest, ArrayOfTemplates) {
13127   EXPECT_EQ("auto a = new unique_ptr<int>[10];",
13128             format("auto a = new unique_ptr<int > [ 10];"));
13129 
13130   FormatStyle Spaces = getLLVMStyle();
13131   Spaces.SpacesInSquareBrackets = true;
13132   EXPECT_EQ("auto a = new unique_ptr<int>[ 10 ];",
13133             format("auto a = new unique_ptr<int > [10];", Spaces));
13134 }
13135 
13136 TEST_F(FormatTest, ArrayAsTemplateType) {
13137   EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[10]>;",
13138             format("auto a = unique_ptr < Foo < Bar>[ 10]> ;"));
13139 
13140   FormatStyle Spaces = getLLVMStyle();
13141   Spaces.SpacesInSquareBrackets = true;
13142   EXPECT_EQ("auto a = unique_ptr<Foo<Bar>[ 10 ]>;",
13143             format("auto a = unique_ptr < Foo < Bar>[10]> ;", Spaces));
13144 }
13145 
13146 TEST_F(FormatTest, NoSpaceAfterSuper) {
13147     verifyFormat("__super::FooBar();");
13148 }
13149 
13150 TEST(FormatStyle, GetStyleWithEmptyFileName) {
13151   llvm::vfs::InMemoryFileSystem FS;
13152   auto Style1 = getStyle("file", "", "Google", "", &FS);
13153   ASSERT_TRUE((bool)Style1);
13154   ASSERT_EQ(*Style1, getGoogleStyle());
13155 }
13156 
13157 TEST(FormatStyle, GetStyleOfFile) {
13158   llvm::vfs::InMemoryFileSystem FS;
13159   // Test 1: format file in the same directory.
13160   ASSERT_TRUE(
13161       FS.addFile("/a/.clang-format", 0,
13162                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
13163   ASSERT_TRUE(
13164       FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
13165   auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
13166   ASSERT_TRUE((bool)Style1);
13167   ASSERT_EQ(*Style1, getLLVMStyle());
13168 
13169   // Test 2.1: fallback to default.
13170   ASSERT_TRUE(
13171       FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
13172   auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
13173   ASSERT_TRUE((bool)Style2);
13174   ASSERT_EQ(*Style2, getMozillaStyle());
13175 
13176   // Test 2.2: no format on 'none' fallback style.
13177   Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
13178   ASSERT_TRUE((bool)Style2);
13179   ASSERT_EQ(*Style2, getNoStyle());
13180 
13181   // Test 2.3: format if config is found with no based style while fallback is
13182   // 'none'.
13183   ASSERT_TRUE(FS.addFile("/b/.clang-format", 0,
13184                          llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2")));
13185   Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
13186   ASSERT_TRUE((bool)Style2);
13187   ASSERT_EQ(*Style2, getLLVMStyle());
13188 
13189   // Test 2.4: format if yaml with no based style, while fallback is 'none'.
13190   Style2 = getStyle("{}", "a.h", "none", "", &FS);
13191   ASSERT_TRUE((bool)Style2);
13192   ASSERT_EQ(*Style2, getLLVMStyle());
13193 
13194   // Test 3: format file in parent directory.
13195   ASSERT_TRUE(
13196       FS.addFile("/c/.clang-format", 0,
13197                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
13198   ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
13199                          llvm::MemoryBuffer::getMemBuffer("int i;")));
13200   auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
13201   ASSERT_TRUE((bool)Style3);
13202   ASSERT_EQ(*Style3, getGoogleStyle());
13203 
13204   // Test 4: error on invalid fallback style
13205   auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS);
13206   ASSERT_FALSE((bool)Style4);
13207   llvm::consumeError(Style4.takeError());
13208 
13209   // Test 5: error on invalid yaml on command line
13210   auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS);
13211   ASSERT_FALSE((bool)Style5);
13212   llvm::consumeError(Style5.takeError());
13213 
13214   // Test 6: error on invalid style
13215   auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS);
13216   ASSERT_FALSE((bool)Style6);
13217   llvm::consumeError(Style6.takeError());
13218 
13219   // Test 7: found config file, error on parsing it
13220   ASSERT_TRUE(
13221       FS.addFile("/d/.clang-format", 0,
13222                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n"
13223                                                   "InvalidKey: InvalidValue")));
13224   ASSERT_TRUE(
13225       FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
13226   auto Style7 = getStyle("file", "/d/.clang-format", "LLVM", "", &FS);
13227   ASSERT_FALSE((bool)Style7);
13228   llvm::consumeError(Style7.takeError());
13229 
13230   // Test 8: inferred per-language defaults apply.
13231   auto StyleTd = getStyle("file", "x.td", "llvm", "", &FS);
13232   ASSERT_TRUE((bool)StyleTd);
13233   ASSERT_EQ(*StyleTd, getLLVMStyle(FormatStyle::LK_TableGen));
13234 }
13235 
13236 TEST_F(ReplacementTest, FormatCodeAfterReplacements) {
13237   // Column limit is 20.
13238   std::string Code = "Type *a =\n"
13239                      "    new Type();\n"
13240                      "g(iiiii, 0, jjjjj,\n"
13241                      "  0, kkkkk, 0, mm);\n"
13242                      "int  bad     = format   ;";
13243   std::string Expected = "auto a = new Type();\n"
13244                          "g(iiiii, nullptr,\n"
13245                          "  jjjjj, nullptr,\n"
13246                          "  kkkkk, nullptr,\n"
13247                          "  mm);\n"
13248                          "int  bad     = format   ;";
13249   FileID ID = Context.createInMemoryFile("format.cpp", Code);
13250   tooling::Replacements Replaces = toReplacements(
13251       {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 6,
13252                             "auto "),
13253        tooling::Replacement(Context.Sources, Context.getLocation(ID, 3, 10), 1,
13254                             "nullptr"),
13255        tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 3), 1,
13256                             "nullptr"),
13257        tooling::Replacement(Context.Sources, Context.getLocation(ID, 4, 13), 1,
13258                             "nullptr")});
13259 
13260   format::FormatStyle Style = format::getLLVMStyle();
13261   Style.ColumnLimit = 20; // Set column limit to 20 to increase readibility.
13262   auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
13263   EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
13264       << llvm::toString(FormattedReplaces.takeError()) << "\n";
13265   auto Result = applyAllReplacements(Code, *FormattedReplaces);
13266   EXPECT_TRUE(static_cast<bool>(Result));
13267   EXPECT_EQ(Expected, *Result);
13268 }
13269 
13270 TEST_F(ReplacementTest, SortIncludesAfterReplacement) {
13271   std::string Code = "#include \"a.h\"\n"
13272                      "#include \"c.h\"\n"
13273                      "\n"
13274                      "int main() {\n"
13275                      "  return 0;\n"
13276                      "}";
13277   std::string Expected = "#include \"a.h\"\n"
13278                          "#include \"b.h\"\n"
13279                          "#include \"c.h\"\n"
13280                          "\n"
13281                          "int main() {\n"
13282                          "  return 0;\n"
13283                          "}";
13284   FileID ID = Context.createInMemoryFile("fix.cpp", Code);
13285   tooling::Replacements Replaces = toReplacements(
13286       {tooling::Replacement(Context.Sources, Context.getLocation(ID, 1, 1), 0,
13287                             "#include \"b.h\"\n")});
13288 
13289   format::FormatStyle Style = format::getLLVMStyle();
13290   Style.SortIncludes = true;
13291   auto FormattedReplaces = formatReplacements(Code, Replaces, Style);
13292   EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
13293       << llvm::toString(FormattedReplaces.takeError()) << "\n";
13294   auto Result = applyAllReplacements(Code, *FormattedReplaces);
13295   EXPECT_TRUE(static_cast<bool>(Result));
13296   EXPECT_EQ(Expected, *Result);
13297 }
13298 
13299 TEST_F(FormatTest, FormatSortsUsingDeclarations) {
13300   EXPECT_EQ("using std::cin;\n"
13301             "using std::cout;",
13302             format("using std::cout;\n"
13303                    "using std::cin;", getGoogleStyle()));
13304 }
13305 
13306 TEST_F(FormatTest, UTF8CharacterLiteralCpp03) {
13307   format::FormatStyle Style = format::getLLVMStyle();
13308   Style.Standard = FormatStyle::LS_Cpp03;
13309   // cpp03 recognize this string as identifier u8 and literal character 'a'
13310   EXPECT_EQ("auto c = u8 'a';", format("auto c = u8'a';", Style));
13311 }
13312 
13313 TEST_F(FormatTest, UTF8CharacterLiteralCpp11) {
13314   // u8'a' is a C++17 feature, utf8 literal character, LS_Cpp11 covers
13315   // all modes, including C++11, C++14 and C++17
13316   EXPECT_EQ("auto c = u8'a';", format("auto c = u8'a';"));
13317 }
13318 
13319 TEST_F(FormatTest, DoNotFormatLikelyXml) {
13320   EXPECT_EQ("<!-- ;> -->",
13321             format("<!-- ;> -->", getGoogleStyle()));
13322   EXPECT_EQ(" <!-- >; -->",
13323             format(" <!-- >; -->", getGoogleStyle()));
13324 }
13325 
13326 TEST_F(FormatTest, StructuredBindings) {
13327   // Structured bindings is a C++17 feature.
13328   // all modes, including C++11, C++14 and C++17
13329   verifyFormat("auto [a, b] = f();");
13330   EXPECT_EQ("auto [a, b] = f();", format("auto[a, b] = f();"));
13331   EXPECT_EQ("const auto [a, b] = f();", format("const   auto[a, b] = f();"));
13332   EXPECT_EQ("auto const [a, b] = f();", format("auto  const[a, b] = f();"));
13333   EXPECT_EQ("auto const volatile [a, b] = f();",
13334             format("auto  const   volatile[a, b] = f();"));
13335   EXPECT_EQ("auto [a, b, c] = f();", format("auto   [  a  ,  b,c   ] = f();"));
13336   EXPECT_EQ("auto &[a, b, c] = f();",
13337             format("auto   &[  a  ,  b,c   ] = f();"));
13338   EXPECT_EQ("auto &&[a, b, c] = f();",
13339             format("auto   &&[  a  ,  b,c   ] = f();"));
13340   EXPECT_EQ("auto const &[a, b] = f();", format("auto  const&[a, b] = f();"));
13341   EXPECT_EQ("auto const volatile &&[a, b] = f();",
13342             format("auto  const  volatile  &&[a, b] = f();"));
13343   EXPECT_EQ("auto const &&[a, b] = f();", format("auto  const   &&  [a, b] = f();"));
13344   EXPECT_EQ("const auto &[a, b] = f();", format("const  auto  &  [a, b] = f();"));
13345   EXPECT_EQ("const auto volatile &&[a, b] = f();",
13346             format("const  auto   volatile  &&[a, b] = f();"));
13347   EXPECT_EQ("volatile const auto &&[a, b] = f();",
13348             format("volatile  const  auto   &&[a, b] = f();"));
13349   EXPECT_EQ("const auto &&[a, b] = f();", format("const  auto  &&  [a, b] = f();"));
13350 
13351   // Make sure we don't mistake structured bindings for lambdas.
13352   FormatStyle PointerMiddle = getLLVMStyle();
13353   PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle;
13354   verifyFormat("auto [a1, b]{A * i};", getGoogleStyle());
13355   verifyFormat("auto [a2, b]{A * i};", getLLVMStyle());
13356   verifyFormat("auto [a3, b]{A * i};", PointerMiddle);
13357   verifyFormat("auto const [a1, b]{A * i};", getGoogleStyle());
13358   verifyFormat("auto const [a2, b]{A * i};", getLLVMStyle());
13359   verifyFormat("auto const [a3, b]{A * i};", PointerMiddle);
13360   verifyFormat("auto const& [a1, b]{A * i};", getGoogleStyle());
13361   verifyFormat("auto const &[a2, b]{A * i};", getLLVMStyle());
13362   verifyFormat("auto const & [a3, b]{A * i};", PointerMiddle);
13363   verifyFormat("auto const&& [a1, b]{A * i};", getGoogleStyle());
13364   verifyFormat("auto const &&[a2, b]{A * i};", getLLVMStyle());
13365   verifyFormat("auto const && [a3, b]{A * i};", PointerMiddle);
13366 
13367   EXPECT_EQ("for (const auto &&[a, b] : some_range) {\n}",
13368             format("for (const auto   &&   [a, b] : some_range) {\n}"));
13369   EXPECT_EQ("for (const auto &[a, b] : some_range) {\n}",
13370             format("for (const auto   &   [a, b] : some_range) {\n}"));
13371   EXPECT_EQ("for (const auto [a, b] : some_range) {\n}",
13372             format("for (const auto[a, b] : some_range) {\n}"));
13373   EXPECT_EQ("auto [x, y](expr);", format("auto[x,y]  (expr);"));
13374   EXPECT_EQ("auto &[x, y](expr);", format("auto  &  [x,y]  (expr);"));
13375   EXPECT_EQ("auto &&[x, y](expr);", format("auto  &&  [x,y]  (expr);"));
13376   EXPECT_EQ("auto const &[x, y](expr);", format("auto  const  &  [x,y]  (expr);"));
13377   EXPECT_EQ("auto const &&[x, y](expr);", format("auto  const  &&  [x,y]  (expr);"));
13378   EXPECT_EQ("auto [x, y]{expr};", format("auto[x,y]     {expr};"));
13379   EXPECT_EQ("auto const &[x, y]{expr};", format("auto  const  &  [x,y]  {expr};"));
13380   EXPECT_EQ("auto const &&[x, y]{expr};", format("auto  const  &&  [x,y]  {expr};"));
13381 
13382   format::FormatStyle Spaces = format::getLLVMStyle();
13383   Spaces.SpacesInSquareBrackets = true;
13384   verifyFormat("auto [ a, b ] = f();", Spaces);
13385   verifyFormat("auto &&[ a, b ] = f();", Spaces);
13386   verifyFormat("auto &[ a, b ] = f();", Spaces);
13387   verifyFormat("auto const &&[ a, b ] = f();", Spaces);
13388   verifyFormat("auto const &[ a, b ] = f();", Spaces);
13389 }
13390 
13391 TEST_F(FormatTest, FileAndCode) {
13392   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.cc", ""));
13393   EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.m", ""));
13394   EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.mm", ""));
13395   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", ""));
13396   EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@interface Foo\n@end\n"));
13397   EXPECT_EQ(
13398       FormatStyle::LK_ObjC,
13399       guessLanguage("foo.h", "#define TRY(x, y) @try { x; } @finally { y; }"));
13400   EXPECT_EQ(FormatStyle::LK_ObjC,
13401             guessLanguage("foo.h", "#define AVAIL(x) @available(x, *))"));
13402   EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@class Foo;"));
13403   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo", ""));
13404   EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo", "@interface Foo\n@end\n"));
13405   EXPECT_EQ(FormatStyle::LK_ObjC,
13406             guessLanguage("foo.h", "int DoStuff(CGRect rect);\n"));
13407   EXPECT_EQ(
13408       FormatStyle::LK_ObjC,
13409       guessLanguage("foo.h",
13410                     "#define MY_POINT_MAKE(x, y) CGPointMake((x), (y));\n"));
13411   EXPECT_EQ(
13412       FormatStyle::LK_Cpp,
13413       guessLanguage("foo.h", "#define FOO(...) auto bar = [] __VA_ARGS__;"));
13414 }
13415 
13416 TEST_F(FormatTest, GuessLanguageWithCpp11AttributeSpecifiers) {
13417   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[noreturn]];"));
13418   EXPECT_EQ(FormatStyle::LK_ObjC,
13419             guessLanguage("foo.h", "array[[calculator getIndex]];"));
13420   EXPECT_EQ(FormatStyle::LK_Cpp,
13421             guessLanguage("foo.h", "[[noreturn, deprecated(\"so sorry\")]];"));
13422   EXPECT_EQ(
13423       FormatStyle::LK_Cpp,
13424       guessLanguage("foo.h", "[[noreturn, deprecated(\"gone, sorry\")]];"));
13425   EXPECT_EQ(FormatStyle::LK_ObjC,
13426             guessLanguage("foo.h", "[[noreturn foo] bar];"));
13427   EXPECT_EQ(FormatStyle::LK_Cpp,
13428             guessLanguage("foo.h", "[[clang::fallthrough]];"));
13429   EXPECT_EQ(FormatStyle::LK_ObjC,
13430             guessLanguage("foo.h", "[[clang:fallthrough] foo];"));
13431   EXPECT_EQ(FormatStyle::LK_Cpp,
13432             guessLanguage("foo.h", "[[gsl::suppress(\"type\")]];"));
13433   EXPECT_EQ(FormatStyle::LK_Cpp,
13434             guessLanguage("foo.h", "[[using clang: fallthrough]];"));
13435   EXPECT_EQ(FormatStyle::LK_ObjC,
13436             guessLanguage("foo.h", "[[abusing clang:fallthrough] bar];"));
13437   EXPECT_EQ(FormatStyle::LK_Cpp,
13438             guessLanguage("foo.h", "[[using gsl: suppress(\"type\")]];"));
13439   EXPECT_EQ(
13440       FormatStyle::LK_Cpp,
13441       guessLanguage("foo.h", "for (auto &&[endpoint, stream] : streams_)"));
13442   EXPECT_EQ(
13443       FormatStyle::LK_Cpp,
13444       guessLanguage("foo.h",
13445                     "[[clang::callable_when(\"unconsumed\", \"unknown\")]]"));
13446   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "[[foo::bar, ...]]"));
13447 }
13448 
13449 TEST_F(FormatTest, GuessLanguageWithCaret) {
13450   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^);"));
13451   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", "FOO(^, Bar);"));
13452   EXPECT_EQ(FormatStyle::LK_ObjC,
13453             guessLanguage("foo.h", "int(^)(char, float);"));
13454   EXPECT_EQ(FormatStyle::LK_ObjC,
13455             guessLanguage("foo.h", "int(^foo)(char, float);"));
13456   EXPECT_EQ(FormatStyle::LK_ObjC,
13457             guessLanguage("foo.h", "int(^foo[10])(char, float);"));
13458   EXPECT_EQ(FormatStyle::LK_ObjC,
13459             guessLanguage("foo.h", "int(^foo[kNumEntries])(char, float);"));
13460   EXPECT_EQ(
13461       FormatStyle::LK_ObjC,
13462       guessLanguage("foo.h", "int(^foo[(kNumEntries + 10)])(char, float);"));
13463 }
13464 
13465 TEST_F(FormatTest, GuessedLanguageWithInlineAsmClobbers) {
13466   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h",
13467                                                "void f() {\n"
13468                                                "  asm (\"mov %[e], %[d]\"\n"
13469                                                "     : [d] \"=rm\" (d)\n"
13470                                                "       [e] \"rm\" (*e));\n"
13471                                                "}"));
13472   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h",
13473                                                "void f() {\n"
13474                                                "  _asm (\"mov %[e], %[d]\"\n"
13475                                                "     : [d] \"=rm\" (d)\n"
13476                                                "       [e] \"rm\" (*e));\n"
13477                                                "}"));
13478   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h",
13479                                                "void f() {\n"
13480                                                "  __asm (\"mov %[e], %[d]\"\n"
13481                                                "     : [d] \"=rm\" (d)\n"
13482                                                "       [e] \"rm\" (*e));\n"
13483                                                "}"));
13484   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h",
13485                                                "void f() {\n"
13486                                                "  __asm__ (\"mov %[e], %[d]\"\n"
13487                                                "     : [d] \"=rm\" (d)\n"
13488                                                "       [e] \"rm\" (*e));\n"
13489                                                "}"));
13490   EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h",
13491                                                "void f() {\n"
13492                                                "  asm (\"mov %[e], %[d]\"\n"
13493                                                "     : [d] \"=rm\" (d),\n"
13494                                                "       [e] \"rm\" (*e));\n"
13495                                                "}"));
13496   EXPECT_EQ(FormatStyle::LK_Cpp,
13497             guessLanguage("foo.h", "void f() {\n"
13498                                    "  asm volatile (\"mov %[e], %[d]\"\n"
13499                                    "     : [d] \"=rm\" (d)\n"
13500                                    "       [e] \"rm\" (*e));\n"
13501                                    "}"));
13502 }
13503 
13504 TEST_F(FormatTest, GuessLanguageWithChildLines) {
13505   EXPECT_EQ(FormatStyle::LK_Cpp,
13506             guessLanguage("foo.h", "#define FOO ({ std::string s; })"));
13507   EXPECT_EQ(FormatStyle::LK_ObjC,
13508             guessLanguage("foo.h", "#define FOO ({ NSString *s; })"));
13509   EXPECT_EQ(
13510       FormatStyle::LK_Cpp,
13511       guessLanguage("foo.h", "#define FOO ({ foo(); ({ std::string s; }) })"));
13512   EXPECT_EQ(
13513       FormatStyle::LK_ObjC,
13514       guessLanguage("foo.h", "#define FOO ({ foo(); ({ NSString *s; }) })"));
13515 }
13516 
13517 } // end namespace
13518 } // end namespace format
13519 } // end namespace clang
13520